From a3f861758561975efa28c6f96e56ae1604b7d683 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Jul 2019 17:06:48 +0200 Subject: [PATCH 0001/1765] PlatformUserFunctions: add retval for logon() --- core/include/PlatformUserFunctions.h | 2 +- plugins/platform/linux/LinuxUserFunctions.cpp | 4 +++- plugins/platform/linux/LinuxUserFunctions.h | 2 +- plugins/platform/windows/WindowsUserFunctions.cpp | 4 +++- plugins/platform/windows/WindowsUserFunctions.h | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/core/include/PlatformUserFunctions.h b/core/include/PlatformUserFunctions.h index f7898fc5e..ac59de2f9 100644 --- a/core/include/PlatformUserFunctions.h +++ b/core/include/PlatformUserFunctions.h @@ -41,7 +41,7 @@ class PlatformUserFunctions virtual bool isAnyUserLoggedOn() = 0; virtual QString currentUser() = 0; - virtual void logon( const QString& username, const QString& password ) = 0; + virtual bool logon( const QString& username, const QString& password ) = 0; virtual void logoff() = 0; virtual bool authenticate( const QString& username, const QString& password ) = 0; diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index a5e774410..27408f4f7 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -266,12 +266,14 @@ QString LinuxUserFunctions::currentUser() -void LinuxUserFunctions::logon( const QString& username, const QString& password ) +bool LinuxUserFunctions::logon( const QString& username, const QString& password ) { Q_UNUSED(username); Q_UNUSED(password); // TODO + + return false; } diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index f5c098440..02d3d1b53 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -41,7 +41,7 @@ class LinuxUserFunctions : public PlatformUserFunctions bool isAnyUserLoggedOn() override; QString currentUser() override; - void logon( const QString& username, const QString& password ) override; + bool logon( const QString& username, const QString& password ) override; void logoff() override; bool authenticate( const QString& username, const QString& password ) override; diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 235977752..6b911c259 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -150,12 +150,14 @@ QString WindowsUserFunctions::currentUser() -void WindowsUserFunctions::logon( const QString& username, const QString& password ) +bool WindowsUserFunctions::logon( const QString& username, const QString& password ) { Q_UNUSED(username); Q_UNUSED(password); // TODO + + return false; } diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index d4969cd73..dcffeff0f 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -39,7 +39,7 @@ class WindowsUserFunctions : public PlatformUserFunctions bool isAnyUserLoggedOn() override; QString currentUser() override; - void logon( const QString& username, const QString& password ) override; + bool logon( const QString& username, const QString& password ) override; void logoff() override; bool authenticate( const QString& username, const QString& password ) override; From 298b3c704227a577d25656bb2203518e5c02fe35 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Jul 2019 17:12:56 +0200 Subject: [PATCH 0002/1765] WindowsUserFunctions: prepare logon() support --- .../platform/windows/WindowsUserFunctions.cpp | 195 +++++++++++++++++- 1 file changed, 191 insertions(+), 4 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 6b911c259..4b94054f8 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "VeyonConfiguration.h" #include "WindowsCoreFunctions.h" @@ -35,6 +36,169 @@ #include "authSSP.h" +static bool storePassword( const QString& password ) +{ + LSA_OBJECT_ATTRIBUTES loa; + loa.Length = sizeof(loa); + loa.RootDirectory = nullptr; + loa.ObjectName = nullptr; + loa.Attributes = 0; + loa.SecurityDescriptor = nullptr; + loa.SecurityQualityOfService = nullptr; + + LSA_HANDLE lh; + + auto status = LsaOpenPolicy( nullptr, &loa, POLICY_CREATE_SECRET, &lh ); + + if( status ) + { + vCritical() << "Error opening LSA policy:" << LsaNtStatusToWinError( status ); + return false; + } + + const auto nameWide = WindowsCoreFunctions::toWCharArray( QStringLiteral("DefaultPassword") ); + + LSA_UNICODE_STRING name; + name.Buffer = nameWide.data(); + name.MaximumLength = name.Length = static_cast( wcslen(name.Buffer) - 2 ); + + if( password.isEmpty() ) + { + status = LsaStorePrivateData( lh, &name, nullptr ); + if( status ) + { + vCritical() << "Error clearing stored password:" << LsaNtStatusToWinError( status ); + return false; + } + return true; + } + + const auto passwordWide = WindowsCoreFunctions::toWCharArray( password ); + + LSA_UNICODE_STRING data; + data.Buffer = passwordWide.data(); + data.MaximumLength = data.Length = static_cast( wcslen(data.Buffer) * sizeof(*data.Buffer) ); + + status = LsaStorePrivateData( lh, &name, &data ); + + LsaClose(lh); + + if( status ) + { + vCritical() << "Error storing password:" << LsaNtStatusToWinError( status ); + return false; + } + + return true; +} + + + +static bool setAutologon( const QString& username, const QString& password, const QString& domainName ) +{ + HKEY h; + + auto err = RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", + 0, KEY_WOW64_64KEY | KEY_SET_VALUE, &h ); + if( err != ERROR_SUCCESS ) + { + vCritical() << "Unable to open Winlogon subkey:" << err; + return false; + } + + if( storePassword( password ) == false ) + { + return false; + } + + const auto usernameWide = WindowsCoreFunctions::toWCharArray( username ); + const auto domainNameWide = WindowsCoreFunctions::toWCharArray( domainName ); + + err = RegSetValueEx( h, L"DefaultUserName", 0, REG_SZ, reinterpret_cast( usernameWide.data() ), + static_cast( ( username.length() + 1 ) * 2 ) ); + if( err != ERROR_SUCCESS ) + { + vCritical() << "Unable to set default logon user name:" << err; + return false; + } + + err = RegSetValueEx( h, L"DefaultDomainName", 0, REG_SZ, reinterpret_cast( domainNameWide.data() ), + static_cast( ( domainName.length() + 1 ) * 2 ) ); + if( err != ERROR_SUCCESS ) + { + vCritical() << "Unable to set default domain name:" << err; + return false; + } + + err = RegSetValueEx( h, L"AutoAdminLogon", 0, REG_SZ, reinterpret_cast( L"1" ), 2 ); + if( err != ERROR_SUCCESS ) + { + vCritical() << "Unable to set automatic logon flag" << err; + return false; + } + + err = RegSetValueEx( h, L"ForceAutoLogon", 0, REG_SZ, reinterpret_cast( L"1" ), 2 ); + if( err != ERROR_SUCCESS ) + { + vCritical() << "Unable to set forced automatic logon flag:" << err; + return false; + } + + return true; +} + + + +static bool clearAutologon() +{ + HKEY h; + + auto i = RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", + 0, KEY_WOW64_64KEY | KEY_SET_VALUE, &h ); + if( i != ERROR_SUCCESS ) + { + vCritical() << "Unable to open Winlogon subkey" << i; + return false; + } + + i = RegSetValueEx(h, L"DefaultUserName", 0, REG_SZ, reinterpret_cast( L"" ), 1 ); + if( i != ERROR_SUCCESS ) + { + vCritical() << "Unable to set default logon user name" << i; + return false; + } + + if( storePassword( {} ) == false ) + { + return false; + } + + i = RegDeleteValue( h, L"DefaultPassword" ); + if( i != ERROR_SUCCESS && i != ERROR_FILE_NOT_FOUND ) + { + vCritical() << "Unable to remove default logon password" << i; + return false; + } + + i = RegDeleteValue( h, L"ForceAutoLogon" ); + if( i != ERROR_SUCCESS && i != ERROR_FILE_NOT_FOUND ) + { + vCritical() << "Unable to remove force logon flag" << i; + return false; + } + + i = RegSetValueEx( h, L"AutoAdminLogon", 0, REG_SZ, reinterpret_cast( L"0" ), 2 ); + if( i != ERROR_SUCCESS ) + { + vCritical() << "Unable to clear automatic logon flag" << i; + return false; + } + + return true; +} + + + QString WindowsUserFunctions::fullName( const QString& username ) { QString fullName; @@ -152,12 +316,35 @@ QString WindowsUserFunctions::currentUser() bool WindowsUserFunctions::logon( const QString& username, const QString& password ) { - Q_UNUSED(username); - Q_UNUSED(password); + if( isAnyUserLoggedOn() ) + { + vInfo() << "Skipping user logon as a user is already logged on"; + return false; + } + + QString domain; + QString user; + + const auto userNameParts = username.split( QLatin1Char('\\') ); + if( userNameParts.count() == 2 ) + { + domain = userNameParts[0]; + user = userNameParts[1]; + } + else + { + user = username; + } + + if( setAutologon( user, domain, password ) == false ) + { + vCritical() << "Failed to logon user"; + return false; + } - // TODO + VeyonCore::platform().coreFunctions().reboot(); - return false; + return true; } From 9137782280342af4b66d2b12dc2f7b434744c8ba Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 11:55:07 +0200 Subject: [PATCH 0003/1765] Refactor authentication methods into plugins --- configurator/src/GeneralConfigurationPage.cpp | 50 +---- configurator/src/GeneralConfigurationPage.h | 7 - configurator/src/GeneralConfigurationPage.ui | 15 +- core/include/AuthenticationCredentials.h | 62 ------ ...RfbVeyonAuth.h => AuthenticationManager.h} | 50 ++--- core/include/AuthenticationPluginInterface.h | 67 ++++++ core/include/DummyAuthentication.h | 70 +++++++ core/include/PasswordDialog.h | 6 +- core/include/PlatformUserFunctions.h | 3 +- core/include/VeyonConfigurationProperties.h | 1 + core/include/VeyonConnection.h | 13 -- core/include/VeyonCore.h | 19 +- core/include/VncServerClient.h | 16 +- core/include/VncServerProtocol.h | 7 +- core/src/AuthenticationCredentials.cpp | 86 -------- core/src/AuthenticationManager.cpp | 77 +++++++ core/src/AuthenticationPluginInterface.cpp | 32 +++ core/src/PasswordDialog.cpp | 16 +- core/src/VeyonConnection.cpp | 129 ++---------- core/src/VeyonCore.cpp | 77 +------ core/src/VncServerProtocol.cpp | 21 +- core/src/VncView.cpp | 1 - master/src/MainWindow.cpp | 9 +- plugins/authkeys/AuthKeysManager.cpp | 15 +- plugins/authkeys/AuthKeysManager.h | 2 + plugins/authkeys/AuthKeysPlugin.cpp | 174 +++++++++++++++- plugins/authkeys/AuthKeysPlugin.h | 26 ++- plugins/authlogon/AuthLogonPlugin.cpp | 154 ++++++++++++++ plugins/authlogon/AuthLogonPlugin.h | 94 +++++++++ plugins/authlogon/CMakeLists.txt | 6 + plugins/demo/CMakeLists.txt | 2 + plugins/demo/DemoAuthentication.cpp | 99 +++++++++ plugins/demo/DemoAuthentication.h | 76 +++++++ plugins/demo/DemoFeaturePlugin.cpp | 65 +++++- plugins/demo/DemoFeaturePlugin.h | 28 ++- plugins/demo/DemoServer.cpp | 6 +- plugins/demo/DemoServer.h | 4 +- plugins/demo/DemoServerConnection.cpp | 4 +- plugins/demo/DemoServerConnection.h | 2 +- plugins/demo/DemoServerProtocol.cpp | 17 +- plugins/demo/DemoServerProtocol.h | 8 +- plugins/platform/linux/LinuxUserFunctions.cpp | 8 +- plugins/platform/linux/LinuxUserFunctions.h | 2 +- .../linux/auth-helper/VeyonAuthHelper.cpp | 16 +- server/src/ComputerControlServer.h | 1 - server/src/ServerAccessControlManager.cpp | 35 ++-- server/src/ServerAccessControlManager.h | 1 - server/src/ServerAuthenticationManager.cpp | 197 +----------------- server/src/ServerAuthenticationManager.h | 8 +- server/src/VeyonServerProtocol.cpp | 8 +- server/src/VeyonServerProtocol.h | 2 +- 51 files changed, 1140 insertions(+), 754 deletions(-) rename core/include/{RfbVeyonAuth.h => AuthenticationManager.h} (51%) create mode 100644 core/include/AuthenticationPluginInterface.h create mode 100644 core/include/DummyAuthentication.h delete mode 100644 core/src/AuthenticationCredentials.cpp create mode 100644 core/src/AuthenticationManager.cpp create mode 100644 core/src/AuthenticationPluginInterface.cpp create mode 100644 plugins/authlogon/AuthLogonPlugin.cpp create mode 100644 plugins/authlogon/AuthLogonPlugin.h create mode 100644 plugins/authlogon/CMakeLists.txt create mode 100644 plugins/demo/DemoAuthentication.cpp create mode 100644 plugins/demo/DemoAuthentication.h diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index 5cf5bdf21..3a9a7f3bd 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -26,6 +26,7 @@ #include #include "Configuration/UiMapping.h" +#include "AuthenticationManager.h" #include "GeneralConfigurationPage.h" #include "Filesystem.h" #include "FileSystemBrowser.h" @@ -74,6 +75,12 @@ GeneralConfigurationPage::GeneralConfigurationPage() : ui->uiLanguage->addItems( languages ); + const auto authenticationPlugin = VeyonCore::authenticationManager().availableTypes(); + for( auto it = authenticationPlugin.constBegin(), end = authenticationPlugin.constEnd(); it != end; ++it ) + { + ui->authenticationPlugin->addItem( it.value(), it.key() ); + } + connect( ui->testAuthenticationButton, &QPushButton::clicked, this, &GeneralConfigurationPage::testAuthentication ); connect( ui->openLogFileDirectory, &QPushButton::clicked, this, &GeneralConfigurationPage::openLogFileDirectory ); connect( ui->clearLogFiles, &QPushButton::clicked, this, &GeneralConfigurationPage::clearLogFiles ); @@ -118,52 +125,17 @@ void GeneralConfigurationPage::applyConfiguration() void GeneralConfigurationPage::testAuthentication() { - switch( VeyonCore::config().authenticationMethod() ) - { - case VeyonCore::AuthenticationMethod::LogonAuthentication: - if( testLogonAuthentication() == false ) - { - return; - } - break; - case VeyonCore::AuthenticationMethod::KeyFileAuthentication: - if( testKeyFileAuthentication() == false ) - { - return; - } - break; - } + VeyonCore::authenticationManager().reloadConfiguration(); - QMessageBox::information( this, authenticationTestTitle(), - tr( "Authentication is set up properly on this computer." ) ); -} - - - -bool GeneralConfigurationPage::testLogonAuthentication() -{ - return VeyonCore::instance()->initAuthentication() && - VeyonCore::platform().userFunctions().authenticate( VeyonCore::authenticationCredentials().logonUsername(), - VeyonCore::authenticationCredentials().logonPassword() ); -} - - - -bool GeneralConfigurationPage::testKeyFileAuthentication() -{ - if( VeyonCore::instance()->initAuthentication() == false ) + if( VeyonCore::authenticationManager().configuredPlugin()->testConfiguration() ) { - QMessageBox::critical( this, authenticationTestTitle(), - tr( "Authentication keys are not set up properly on this computer." ) ); - return false; + QMessageBox::information( this, AuthenticationPluginInterface::authenticationTestTitle(), + tr( "Authentication is set up properly on this computer." ) ); } - - return true; } - void GeneralConfigurationPage::openLogFileDirectory() { FileSystemBrowser( FileSystemBrowser::ExistingDirectory ). diff --git a/configurator/src/GeneralConfigurationPage.h b/configurator/src/GeneralConfigurationPage.h index f4147e6bc..9f224deaf 100644 --- a/configurator/src/GeneralConfigurationPage.h +++ b/configurator/src/GeneralConfigurationPage.h @@ -41,19 +41,12 @@ class GeneralConfigurationPage : public ConfigurationPage private: void testAuthentication(); - bool testLogonAuthentication(); - bool testKeyFileAuthentication(); void openLogFileDirectory(); void clearLogFiles(); void populateNetworkObjectDirectories(); - static QString authenticationTestTitle() - { - return tr( "Authentication test"); - } - Ui::GeneralConfigurationPage* ui; } ; diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index c68aa5b67..140feec48 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -64,18 +64,7 @@ - - - - Logon authentication - - - - - Key file authentication - - - + @@ -343,7 +332,7 @@ applicationName uiLanguage - authenticationMethod + authenticationPlugin testAuthenticationButton networkObjectDirectoryPlugin networkObjectDirectoryUpdateInterval diff --git a/core/include/AuthenticationCredentials.h b/core/include/AuthenticationCredentials.h index 51097880d..eb33db753 100644 --- a/core/include/AuthenticationCredentials.h +++ b/core/include/AuthenticationCredentials.h @@ -24,7 +24,6 @@ #pragma once -#include "CryptoCore.h" #include "VeyonCore.h" // clazy:excludeall=rule-of-three @@ -32,60 +31,6 @@ class VEYON_CORE_EXPORT AuthenticationCredentials { public: - enum class Type - { - None = 0x00, - PrivateKey = 0x01, - UserLogon = 0x02, - Token = 0x04, - AllTypes = PrivateKey | UserLogon | Token - } ; - - Q_DECLARE_FLAGS(TypeFlags, Type) - - AuthenticationCredentials(); - AuthenticationCredentials( const AuthenticationCredentials &other ); - - bool hasCredentials( Type credentialType ) const; - - // private key auth - bool loadPrivateKey( const QString& privateKeyFile ); - const CryptoCore::PrivateKey& privateKey() const - { - return m_privateKey; - } - - // user logon auth - void setLogonUsername( const QString &username ) - { - m_logonUsername = username; - } - - void setLogonPassword( const QString &password ) - { - m_logonPassword = password; - } - - const QString &logonUsername() const - { - return m_logonUsername; - } - - const QString &logonPassword() const - { - return m_logonPassword; - } - - void setToken( const QString &token ) - { - m_token = token; - } - - const QString &token() const - { - return m_token; - } - void setInternalVncServerPassword( const QString& password ) { m_internalVncServerPassword = password; @@ -97,13 +42,6 @@ class VEYON_CORE_EXPORT AuthenticationCredentials } private: - CryptoCore::PrivateKey m_privateKey; - - QString m_logonUsername; - QString m_logonPassword; - - QString m_token; - QString m_internalVncServerPassword; } ; diff --git a/core/include/RfbVeyonAuth.h b/core/include/AuthenticationManager.h similarity index 51% rename from core/include/RfbVeyonAuth.h rename to core/include/AuthenticationManager.h index 45509b910..559cb5c28 100644 --- a/core/include/RfbVeyonAuth.h +++ b/core/include/AuthenticationManager.h @@ -1,8 +1,7 @@ /* - * RfbVeyonAuth.h - types and names related to veyon-specific RFB - * authentication type + * AuthenticationManager.h - header file for AuthenticationManager * - * Copyright (c) 2017-2019 Tobias Junghans + * Copyright (c) 2019 Tobias Junghans * * This file is part of Veyon - https://veyon.io * @@ -25,38 +24,35 @@ #pragma once -#include "VeyonCore.h" +#include "AuthenticationPluginInterface.h" +#include "DummyAuthentication.h" -static constexpr char rfbSecTypeVeyon = 40; - -class VEYON_CORE_EXPORT RfbVeyonAuth +class VEYON_CORE_EXPORT AuthenticationManager : public QObject { - Q_GADGET + Q_OBJECT public: - enum Type - { - // invalid/null authentication type - Invalid, - - // no authentication needed - None, + using Plugins = QMap; + using Types = QMap; - // only hosts in an internal whitelist list are allowed - HostWhiteListLegacy, // TODO: drop in VEYON5 + explicit AuthenticationManager( QObject* parent = nullptr ); - // client has to sign some data to verify it's authority - KeyFile, - - // authentication is performed using given username and password - Logon, + const Plugins& plugins() const + { + return m_plugins; + } - // client has to prove its authenticity by knowing common token - Token, + Types availableTypes() const; - AuthTypeCount + AuthenticationPluginInterface* configuredPlugin() const + { + return m_configuredPlugin; + } - } ; + void reloadConfiguration(); - Q_ENUM(Type) +private: + Plugins m_plugins; + AuthenticationPluginInterface* m_configuredPlugin; + DummyAuthentication m_dummyAuthentication; }; diff --git a/core/include/AuthenticationPluginInterface.h b/core/include/AuthenticationPluginInterface.h new file mode 100644 index 000000000..a43e15042 --- /dev/null +++ b/core/include/AuthenticationPluginInterface.h @@ -0,0 +1,67 @@ +/* + * AuthenticationPluginInterface.h - interface class for authentication plugins + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "PluginInterface.h" +#include "VncServerClient.h" + +// clazy:excludeall=copyable-polymorphic + +class VEYON_CORE_EXPORT AuthenticationPluginInterface +{ + Q_GADGET +public: + virtual ~AuthenticationPluginInterface() = default; + + virtual QString authenticationTypeName() const = 0; + + virtual bool initializeCredentials() = 0; + virtual bool hasCredentials() const = 0; + + virtual bool testConfiguration() const = 0; + + // server side authentication + virtual VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const = 0; + + // client side authentication + virtual bool authenticate( QIODevice* socket ) const = 0; + + virtual bool requiresAccessControl() const + { + return true; + } + + virtual QString accessControlUser() const; + + static QString authenticationTestTitle() + { + return VeyonCore::tr( "Authentication test"); + } + +}; + +#define AuthenticationPluginInterface_iid "io.veyon.Veyon.Plugins.AuthenticationPluginInterface" + +Q_DECLARE_INTERFACE(AuthenticationPluginInterface, AuthenticationPluginInterface_iid) diff --git a/core/include/DummyAuthentication.h b/core/include/DummyAuthentication.h new file mode 100644 index 000000000..b0aa11372 --- /dev/null +++ b/core/include/DummyAuthentication.h @@ -0,0 +1,70 @@ +/* + * DummyAuthentication.h - non-functional fallback auth plugin + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "AuthenticationPluginInterface.h" + +// clazy:excludeall=copyable-polymorphic + +class DummyAuthentication : public AuthenticationPluginInterface +{ + Q_INTERFACES(AuthenticationPluginInterface) +public: + QString authenticationTypeName() const override + { + return QStringLiteral( "Dummy authentication" ); + } + + bool initializeCredentials() override + { + return false; + } + + bool hasCredentials() const override + { + return false; + } + + bool testConfiguration() const override + { + return false; + } + + // server side authentication + VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override + { + Q_UNUSED(client) + Q_UNUSED(message) + return VncServerClient::AuthState::Failed; + } + + // client side authentication + bool authenticate( QIODevice* socket ) const override + { + Q_UNUSED(socket) + return false; + } + +}; diff --git a/core/include/PasswordDialog.h b/core/include/PasswordDialog.h index 9adc69f3e..c008bdc12 100644 --- a/core/include/PasswordDialog.h +++ b/core/include/PasswordDialog.h @@ -24,7 +24,7 @@ #pragma once -#include "AuthenticationCredentials.h" +#include "CryptoCore.h" #include @@ -38,9 +38,7 @@ class VEYON_CORE_EXPORT PasswordDialog : public QDialog ~PasswordDialog() override; QString username() const; - QString password() const; - - AuthenticationCredentials credentials() const; + CryptoCore::SecureArray password() const; void accept() override; diff --git a/core/include/PlatformUserFunctions.h b/core/include/PlatformUserFunctions.h index ac59de2f9..9b8430e94 100644 --- a/core/include/PlatformUserFunctions.h +++ b/core/include/PlatformUserFunctions.h @@ -24,6 +24,7 @@ #pragma once +#include "CryptoCore.h" #include "PlatformPluginInterface.h" // clazy:excludeall=copyable-polymorphic @@ -44,6 +45,6 @@ class PlatformUserFunctions virtual bool logon( const QString& username, const QString& password ) = 0; virtual void logoff() = 0; - virtual bool authenticate( const QString& username, const QString& password ) = 0; + virtual bool authenticate( const QString& username, const CryptoCore::SecureArray& password ) = 0; }; diff --git a/core/include/VeyonConfigurationProperties.h b/core/include/VeyonConfigurationProperties.h index 21afe94b6..2079d2ea6 100644 --- a/core/include/VeyonConfigurationProperties.h +++ b/core/include/VeyonConfigurationProperties.h @@ -102,6 +102,7 @@ #define FOREACH_VEYON_AUTHENTICATION_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::AuthenticationMethod, authenticationMethod, setAuthenticationMethod, "Method", "Authentication", QVariant::fromValue(VeyonCore::AuthenticationMethod::LogonAuthentication), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), QUuid, authenticationPlugin, setAuthenticationPlugin, "Plugin", "Authentication", QUuid(), Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_KEY_AUTHENTICATION_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QString, privateKeyBaseDir, setPrivateKeyBaseDir, "PrivateKeyBaseDir", "Authentication", QDir::toNativeSeparators( QStringLiteral( "%GLOBALAPPDATA%/keys/private" ) ), Configuration::Property::Flag::Advanced ) \ diff --git a/core/include/VeyonConnection.h b/core/include/VeyonConnection.h index cca738bb1..837d5264f 100644 --- a/core/include/VeyonConnection.h +++ b/core/include/VeyonConnection.h @@ -26,7 +26,6 @@ #include -#include "RfbVeyonAuth.h" #include "VncConnection.h" @@ -64,16 +63,6 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject return m_userHomeDir; } - void setVeyonAuthType( RfbVeyonAuth::Type authType ) - { - m_veyonAuthType = authType; - } - - RfbVeyonAuth::Type veyonAuthType() const - { - return m_veyonAuthType; - } - void sendFeatureMessage( const FeatureMessage& featureMessage, bool wake ); bool handleServerMessage( rfbClient* client, uint8_t msg ); @@ -94,8 +83,6 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject QPointer m_vncConnection; - RfbVeyonAuth::Type m_veyonAuthType; - QString m_user; QString m_userHomeDir; diff --git a/core/include/VeyonCore.h b/core/include/VeyonCore.h index f3efea6e6..19d244505 100644 --- a/core/include/VeyonCore.h +++ b/core/include/VeyonCore.h @@ -46,6 +46,7 @@ class QCoreApplication; class QWidget; class AuthenticationCredentials; +class AuthenticationManager; class BuiltinFeatures; class ComputerControlInterface; class CryptoCore; @@ -71,6 +72,8 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject }; Q_ENUM(ApplicationVersion) + static constexpr char RfbSecurityTypeVeyon = 40; + VeyonCore( QCoreApplication* application, const QString& appComponentName ); ~VeyonCore() override; @@ -95,6 +98,11 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject return *( instance()->m_authenticationCredentials ); } + static AuthenticationManager& authenticationManager() + { + return *( instance()->m_authenticationManager ); + } + static CryptoCore& cryptoCore() { return *( instance()->m_cryptoCore ); @@ -152,13 +160,6 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject static QString stripDomain( const QString& username ); static QString formattedUuid( QUuid uuid ); - const QString& authenticationKeyName() const - { - return m_authenticationKeyName; - } - - static bool isAuthenticationKeyNameValid( const QString& authKeyName ); - enum class AuthenticationMethod { LogonAuthentication, @@ -178,8 +179,6 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject void initPlugins(); void initManagers(); void initLocalComputerControlInterface(); - bool initLogonAuthentication(); - bool initKeyFileAuthentication(); void initSystemInfo(); static VeyonCore* s_instance; @@ -188,6 +187,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject VeyonConfiguration* m_config; Logger* m_logger; AuthenticationCredentials* m_authenticationCredentials; + AuthenticationManager* m_authenticationManager; CryptoCore* m_cryptoCore; PluginManager* m_pluginManager; PlatformPluginManager* m_platformPluginManager; @@ -199,7 +199,6 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject ComputerControlInterface* m_localComputerControlInterface; QString m_applicationName; - QString m_authenticationKeyName; bool m_debugging; signals: diff --git a/core/include/VncServerClient.h b/core/include/VncServerClient.h index 08914841d..b5d92daad 100644 --- a/core/include/VncServerClient.h +++ b/core/include/VncServerClient.h @@ -35,9 +35,7 @@ class VEYON_CORE_EXPORT VncServerClient : public QObject public: enum class AuthState { Init, - Challenge, - Password, - Token, + Stage1, Successful, Failed, } ; @@ -56,7 +54,7 @@ class VEYON_CORE_EXPORT VncServerClient : public QObject QObject( parent ), m_protocolState( VncServerProtocol::Disconnected ), m_authState( AuthState::Init ), - m_authType( RfbVeyonAuth::Invalid ), + m_authPluginUid(), m_accessControlState( AccessControlState::Init ), m_username(), m_hostAddress(), @@ -84,14 +82,14 @@ class VEYON_CORE_EXPORT VncServerClient : public QObject m_authState = authState; } - RfbVeyonAuth::Type authType() const + Plugin::Uid authPluginUid() const { - return m_authType; + return m_authPluginUid; } - void setAuthType( RfbVeyonAuth::Type authType ) + void setAuthPluginUid( Plugin::Uid pluginUid ) { - m_authType = authType; + m_authPluginUid = pluginUid; } AccessControlState accessControlState() const @@ -161,7 +159,7 @@ public slots: private: VncServerProtocol::State m_protocolState; AuthState m_authState; - RfbVeyonAuth::Type m_authType; + Plugin::Uid m_authPluginUid; AccessControlState m_accessControlState; QElapsedTimer m_accessControlTimer; QString m_username; diff --git a/core/include/VncServerProtocol.h b/core/include/VncServerProtocol.h index c4fa14454..c73488314 100644 --- a/core/include/VncServerProtocol.h +++ b/core/include/VncServerProtocol.h @@ -24,7 +24,8 @@ #pragma once -#include "RfbVeyonAuth.h" +#include "VeyonCore.h" +#include "Plugin.h" class QTcpSocket; @@ -36,6 +37,8 @@ class VncServerClient; class VEYON_CORE_EXPORT VncServerProtocol { public: + using AuthPluginUids = QVector; + enum State { Disconnected, Protocol, @@ -64,7 +67,7 @@ class VEYON_CORE_EXPORT VncServerProtocol } protected: - virtual QVector supportedAuthTypes() const = 0; + virtual AuthPluginUids supportedAuthPluginUids() const = 0; virtual void processAuthenticationMessage( VariantArrayMessage& message ) = 0; virtual void performAccessControl() = 0; diff --git a/core/src/AuthenticationCredentials.cpp b/core/src/AuthenticationCredentials.cpp deleted file mode 100644 index fb9720f2d..000000000 --- a/core/src/AuthenticationCredentials.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * AuthenticationCredentials.cpp - class holding credentials for authentication - * - * Copyright (c) 2010-2019 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include "AuthenticationCredentials.h" - - -AuthenticationCredentials::AuthenticationCredentials() : - m_privateKey(), - m_logonUsername(), - m_logonPassword(), - m_token(), - m_internalVncServerPassword() -{ -} - - - -AuthenticationCredentials::AuthenticationCredentials( const AuthenticationCredentials &other ) : - m_privateKey(), - m_logonUsername( other.logonUsername() ), - m_logonPassword( other.logonPassword() ), - m_token( other.token() ), - m_internalVncServerPassword( other.internalVncServerPassword() ) -{ -} - - - -bool AuthenticationCredentials::hasCredentials( Type type ) const -{ - switch( type ) - { - case Type::PrivateKey: - return m_privateKey.isNull() == false; - - case Type::UserLogon: - return m_logonUsername.isEmpty() == false && m_logonPassword.isEmpty() == false; - - case Type::Token: - return m_token.isEmpty() == false && - QByteArray::fromBase64( m_token.toUtf8() ).size() == CryptoCore::ChallengeSize; - - default: - break; - } - - vCritical() << "no valid credential type given:" << TypeFlags( type ); - - return false; -} - - - -bool AuthenticationCredentials::loadPrivateKey( const QString& privateKeyFile ) -{ - vDebug() << privateKeyFile; - - if( privateKeyFile.isEmpty() ) - { - return false; - } - - m_privateKey = CryptoCore::PrivateKey( privateKeyFile ); - - return m_privateKey.isNull() == false && m_privateKey.isPrivate(); -} diff --git a/core/src/AuthenticationManager.cpp b/core/src/AuthenticationManager.cpp new file mode 100644 index 000000000..a980c1dd6 --- /dev/null +++ b/core/src/AuthenticationManager.cpp @@ -0,0 +1,77 @@ +/* + * AuthenticationManager.cpp - implementation of AuthenticationManager + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "PluginManager.h" +#include "AuthenticationManager.h" +#include "VeyonConfiguration.h" + +AuthenticationManager::AuthenticationManager( QObject* parent ) : + QObject( parent ), + m_configuredPlugin( nullptr ), + m_dummyAuthentication() +{ + for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) + { + auto pluginInterface = qobject_cast( pluginObject ); + auto authenticationPluginInterface = qobject_cast( pluginObject ); + + if( pluginInterface && authenticationPluginInterface ) + { + m_plugins[pluginInterface->uid()] = authenticationPluginInterface; + } + } + + if( m_plugins.isEmpty() ) + { + qFatal( "AuthenticationManager: no authentication plugins available!" ); + } + + reloadConfiguration(); +} + + + +AuthenticationManager::Types AuthenticationManager::availableTypes() const +{ + Types types; + + for( auto it = m_plugins.constBegin(), end = m_plugins.constEnd(); it != end; ++it ) + { + types[it.key()] = it.value()->authenticationTypeName(); + } + + return types; +} + + + +void AuthenticationManager::reloadConfiguration() +{ + m_configuredPlugin = m_plugins.value( VeyonCore::config().authenticationPlugin() ); + + if( m_configuredPlugin == nullptr ) + { + m_configuredPlugin = &m_dummyAuthentication; + } +} diff --git a/core/src/AuthenticationPluginInterface.cpp b/core/src/AuthenticationPluginInterface.cpp new file mode 100644 index 000000000..abfbfb172 --- /dev/null +++ b/core/src/AuthenticationPluginInterface.cpp @@ -0,0 +1,32 @@ +/* + * AuthenticationPluginInterface.cpp - interface class for authentication plugins + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "AuthenticationPluginInterface.h" +#include "PlatformUserFunctions.h" + + +QString AuthenticationPluginInterface::accessControlUser() const +{ + return VeyonCore::platform().userFunctions().currentUser(); +} diff --git a/core/src/PasswordDialog.cpp b/core/src/PasswordDialog.cpp index 06b068984..6cf08e84d 100644 --- a/core/src/PasswordDialog.cpp +++ b/core/src/PasswordDialog.cpp @@ -65,21 +65,9 @@ QString PasswordDialog::username() const -QString PasswordDialog::password() const +CryptoCore::SecureArray PasswordDialog::password() const { - return ui->password->text(); -} - - - - -AuthenticationCredentials PasswordDialog::credentials() const -{ - AuthenticationCredentials cred; - cred.setLogonUsername( username() ); - cred.setLogonPassword( password() ); - - return cred; + return ui->password->text().toUtf8(); } diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 74ed62f17..04aea64f6 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -25,6 +25,7 @@ #include "rfb/rfbclient.h" #include "AuthenticationCredentials.h" +#include "AuthenticationManager.h" #include "CryptoCore.h" #include "PlatformUserFunctions.h" #include "SocketDevice.h" @@ -35,7 +36,7 @@ static rfbClientProtocolExtension* __veyonProtocolExt = nullptr; -static const uint32_t __veyonSecurityTypes[2] = { rfbSecTypeVeyon, 0 }; +static const uint32_t __veyonSecurityTypes[2] = { VeyonCore::RfbSecurityTypeVeyon, 0 }; rfbBool handleVeyonMessage( rfbClient* client, rfbServerToClientMsg* msg ) @@ -53,7 +54,6 @@ rfbBool handleVeyonMessage( rfbClient* client, rfbServerToClientMsg* msg ) VeyonConnection::VeyonConnection( VncConnection* vncConnection ): m_vncConnection( vncConnection ), - m_veyonAuthType( RfbVeyonAuth::Logon ), m_user(), m_userHomeDir() { @@ -69,11 +69,6 @@ VeyonConnection::VeyonConnection( VncConnection* vncConnection ): rfbClientRegisterExtension( __veyonProtocolExt ); } - if( VeyonCore::config().authenticationMethod() == VeyonCore::AuthenticationMethod::KeyFileAuthentication ) - { - m_veyonAuthType = RfbVeyonAuth::KeyFile; - } - connect( m_vncConnection, &VncConnection::connectionPrepared, this, &VeyonConnection::registerConnection, Qt::DirectConnection ); } @@ -152,7 +147,7 @@ void VeyonConnection::unregisterConnection() int8_t VeyonConnection::handleSecTypeVeyon( rfbClient* client, uint32_t authScheme ) { - if( authScheme != rfbSecTypeVeyon ) + if( authScheme != VeyonCore::RfbSecurityTypeVeyon ) { return false; } @@ -171,128 +166,48 @@ int8_t VeyonConnection::handleSecTypeVeyon( rfbClient* client, uint32_t authSche int authTypeCount = message.read().toInt(); - QList authTypes; + PluginUidList authTypes; authTypes.reserve( authTypeCount ); for( int i = 0; i < authTypeCount; ++i ) { - authTypes.append( QVariantHelper::value( message.read() ) ); + authTypes.append( message.read().toUuid() ); } vDebug() << QThread::currentThreadId() << "received authentication types:" << authTypes; - RfbVeyonAuth::Type chosenAuthType = RfbVeyonAuth::Token; - if( authTypes.count() > 0 ) - { - chosenAuthType = authTypes.first(); - - // look whether the VncConnection recommends a specific - // authentication type (e.g. VeyonAuthHostBased when running as - // demo client) + auto chosenAuthPlugin = Plugin::Uid(); - for( auto authType : authTypes ) + const auto& plugins = VeyonCore::authenticationManager().plugins(); + for( auto it = plugins.constBegin(), end = plugins.constEnd(); it != end; ++it ) + { + if( authTypes.contains( it.key() ) && it.value()->hasCredentials() ) { - if( connection->veyonAuthType() == authType ) - { - chosenAuthType = authType; - } + chosenAuthPlugin = it.key(); } } - vDebug() << QThread::currentThreadId() << "chose authentication type:" << authTypes; + if( chosenAuthPlugin.isNull() ) + { + vWarning() << QThread::currentThreadId() << "authentication plugins not supported " + "or missing credentials"; + return false; + } + + vDebug() << QThread::currentThreadId() << "chose authentication type:" << chosenAuthPlugin; VariantArrayMessage authReplyMessage( &socketDevice ); - authReplyMessage.write( chosenAuthType ); + authReplyMessage.write( chosenAuthPlugin ); // send username which is used when displaying an access confirm dialog - if( VeyonCore::authenticationCredentials().hasCredentials( AuthenticationCredentials::Type::UserLogon ) ) - { - authReplyMessage.write( VeyonCore::authenticationCredentials().logonUsername() ); - } - else - { - authReplyMessage.write( VeyonCore::platform().userFunctions().currentUser() ); - } - + authReplyMessage.write( VeyonCore::platform().userFunctions().currentUser() ); authReplyMessage.send(); VariantArrayMessage authAckMessage( &socketDevice ); authAckMessage.receive(); - switch( chosenAuthType ) - { - case RfbVeyonAuth::KeyFile: - if( VeyonCore::authenticationCredentials().hasCredentials( AuthenticationCredentials::Type::PrivateKey ) ) - { - VariantArrayMessage challengeReceiveMessage( &socketDevice ); - challengeReceiveMessage.receive(); - const auto challenge = challengeReceiveMessage.read().toByteArray(); - - if( challenge.size() != CryptoCore::ChallengeSize ) - { - vCritical() << QThread::currentThreadId() << "challenge size mismatch!"; - return false; - } - - // create local copy of private key so we can modify it within our own thread - auto key = VeyonCore::authenticationCredentials().privateKey(); - if( key.isNull() || key.canSign() == false ) - { - vCritical() << QThread::currentThreadId() << "invalid private key!"; - return false; - } - - const auto signature = key.signMessage( challenge, CryptoCore::DefaultSignatureAlgorithm ); - - VariantArrayMessage challengeResponseMessage( &socketDevice ); - challengeResponseMessage.write( VeyonCore::instance()->authenticationKeyName() ); - challengeResponseMessage.write( signature ); - challengeResponseMessage.send(); - } - break; - - case RfbVeyonAuth::Logon: - { - VariantArrayMessage publicKeyMessage( &socketDevice ); - publicKeyMessage.receive(); - - CryptoCore::PublicKey publicKey = CryptoCore::PublicKey::fromPEM( publicKeyMessage.read().toString() ); - - if( publicKey.canEncrypt() == false ) - { - vCritical() << QThread::currentThreadId() << "can't encrypt with given public key!"; - return false; - } - - CryptoCore::SecureArray plainTextPassword( VeyonCore::authenticationCredentials().logonPassword().toUtf8() ); - CryptoCore::SecureArray encryptedPassword = publicKey.encrypt( plainTextPassword, CryptoCore::DefaultEncryptionAlgorithm ); - if( encryptedPassword.isEmpty() ) - { - vCritical() << QThread::currentThreadId() << "password encryption failed!"; - return false; - } - - VariantArrayMessage passwordResponse( &socketDevice ); - passwordResponse.write( encryptedPassword.toByteArray() ); - passwordResponse.send(); - break; - } - - case RfbVeyonAuth::Token: - { - VariantArrayMessage tokenAuthMessage( &socketDevice ); - tokenAuthMessage.write( VeyonCore::authenticationCredentials().token() ); - tokenAuthMessage.send(); - break; - } - - default: - // nothing to do - we just get accepted - break; - } - - return true; + return plugins[chosenAuthPlugin]->authenticate( &socketDevice ); } diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 05a325928..a3b43a009 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -36,13 +36,14 @@ #include #include +#include "AuthenticationCredentials.h" +#include "AuthenticationManager.h" #include "BuiltinFeatures.h" #include "ComputerControlInterface.h" #include "Filesystem.h" #include "HostAddress.h" #include "Logger.h" #include "NetworkObjectDirectoryManager.h" -#include "PasswordDialog.h" #include "PlatformPluginManager.h" #include "PlatformCoreFunctions.h" #include "PlatformServiceCore.h" @@ -61,6 +62,7 @@ VeyonCore::VeyonCore( QCoreApplication* application, const QString& appComponent m_config( nullptr ), m_logger( nullptr ), m_authenticationCredentials( nullptr ), + m_authenticationManager( nullptr ), m_cryptoCore( nullptr ), m_pluginManager( nullptr ), m_platformPluginManager( nullptr ), @@ -70,7 +72,6 @@ VeyonCore::VeyonCore( QCoreApplication* application, const QString& appComponent m_networkObjectDirectoryManager( nullptr ), m_localComputerControlInterface( nullptr ), m_applicationName( QStringLiteral( "Veyon" ) ), - m_authenticationKeyName(), m_debugging( false ) { Q_ASSERT( application != nullptr ); @@ -110,6 +111,9 @@ VeyonCore::~VeyonCore() delete m_authenticationCredentials; m_authenticationCredentials = nullptr; + delete m_authenticationManager; + m_authenticationManager = nullptr; + delete m_cryptoCore; m_cryptoCore = nullptr; @@ -211,13 +215,7 @@ void VeyonCore::setupApplicationParameters() bool VeyonCore::initAuthentication() { - switch( config().authenticationMethod() ) - { - case AuthenticationMethod::LogonAuthentication: return initLogonAuthentication(); - case AuthenticationMethod::KeyFileAuthentication: return initKeyFileAuthentication(); - } - - return false; + return m_authenticationManager->configuredPlugin()->initializeCredentials(); } @@ -485,13 +483,6 @@ QString VeyonCore::formattedUuid( QUuid uuid ) -bool VeyonCore::isAuthenticationKeyNameValid( const QString& authKeyName ) -{ - return QRegExp( QStringLiteral("\\w+") ).exactMatch( authKeyName ); -} - - - int VeyonCore::exec() { emit applicationLoaded(); @@ -639,6 +630,7 @@ void VeyonCore::initPlugins() void VeyonCore::initManagers() { + m_authenticationManager = new AuthenticationManager( this ); m_userGroupsBackendManager = new UserGroupsBackendManager( this ); m_networkObjectDirectoryManager = new NetworkObjectDirectoryManager( this ); } @@ -656,59 +648,6 @@ void VeyonCore::initLocalComputerControlInterface() -bool VeyonCore::initLogonAuthentication() -{ - if( qobject_cast( QCoreApplication::instance() ) ) - { - PasswordDialog dlg( QApplication::activeWindow() ); - if( dlg.exec() && - dlg.credentials().hasCredentials( AuthenticationCredentials::Type::UserLogon ) ) - { - m_authenticationCredentials->setLogonUsername( dlg.username() ); - m_authenticationCredentials->setLogonPassword( dlg.password() ); - - return true; - } - } - - return false; -} - - - -bool VeyonCore::initKeyFileAuthentication() -{ - auto authKeyName = QProcessEnvironment::systemEnvironment().value( QStringLiteral("VEYON_AUTH_KEY_NAME") ); - - if( authKeyName.isEmpty() == false ) - { - if( isAuthenticationKeyNameValid( authKeyName ) && - m_authenticationCredentials->loadPrivateKey( VeyonCore::filesystem().privateKeyPath( authKeyName ) ) ) - { - m_authenticationKeyName = authKeyName; - } - } - else - { - // try to auto-detect private key file by searching for readable file - const auto privateKeyBaseDir = VeyonCore::filesystem().expandPath( VeyonCore::config().privateKeyBaseDir() ); - const auto privateKeyDirs = QDir( privateKeyBaseDir ).entryList( QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name ); - - for( const auto& privateKeyDir : privateKeyDirs ) - { - if( m_authenticationCredentials->loadPrivateKey( VeyonCore::filesystem().privateKeyPath( privateKeyDir ) ) ) - { - m_authenticationKeyName = privateKeyDir; - return true; - } - } - } - - return false; -} - - - void VeyonCore::initSystemInfo() { vDebug() << version() << HostAddress::localFQDN() diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index c65886dac..32f4262ce 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -26,7 +26,6 @@ #include #include - #include "AuthenticationCredentials.h" #include "VariantArrayMessage.h" #include "VncServerClient.h" @@ -146,7 +145,7 @@ bool VncServerProtocol::readProtocol() bool VncServerProtocol::sendSecurityTypes() { // send list of supported security types - const char securityTypeList[2] = { 1, rfbSecTypeVeyon }; // Flawfinder: ignore + static const char securityTypeList[2] = { 1, VeyonCore::RfbSecurityTypeVeyon }; // Flawfinder: ignore m_socket->write( securityTypeList, sizeof( securityTypeList ) ); return true; @@ -161,7 +160,7 @@ bool VncServerProtocol::receiveSecurityTypeResponse() char chosenSecurityType = 0; if( m_socket->read( &chosenSecurityType, sizeof(chosenSecurityType) ) != sizeof(chosenSecurityType) || - chosenSecurityType != rfbSecTypeVeyon ) + chosenSecurityType != VeyonCore::RfbSecurityTypeVeyon ) { vCritical() << "protocol initialization failed"; m_socket->close(); @@ -181,7 +180,7 @@ bool VncServerProtocol::receiveSecurityTypeResponse() bool VncServerProtocol::sendAuthenticationTypes() { - const auto authTypes = supportedAuthTypes(); + const auto authTypes = supportedAuthPluginUids(); VariantArrayMessage message( m_socket ); message.write( authTypes.count() ); @@ -202,9 +201,10 @@ bool VncServerProtocol::receiveAuthenticationTypeResponse() if( message.isReadyForReceive() && message.receive() ) { - const auto chosenAuthType = QVariantHelper::value( message.read() ); + const auto chosenAuthPluginUid = message.read().toUuid(); - if( supportedAuthTypes().contains( chosenAuthType ) == false ) + if( chosenAuthPluginUid .isNull() || + supportedAuthPluginUids().contains( chosenAuthPluginUid ) == false ) { vCritical() << "unsupported authentication type chosen by client!"; m_socket->close(); @@ -212,16 +212,9 @@ bool VncServerProtocol::receiveAuthenticationTypeResponse() return false; } - if( chosenAuthType == RfbVeyonAuth::None ) - { - vWarning() << "skipping authentication."; - setState( AccessControl ); - return true; - } - const auto username = message.read().toString(); - m_client->setAuthType( chosenAuthType ); + m_client->setAuthPluginUid( chosenAuthPluginUid ); m_client->setUsername( username ); m_client->setHostAddress( m_socket->peerAddress().toString() ); diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index 3d0f2f517..f1cd8c5c0 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -64,7 +64,6 @@ VncView::VncView( const QString &host, int port, QWidget *parent, Mode mode ) : if( m_mode == DemoMode ) { m_vncConn->setQuality( VncConnection::Quality::Default ); - m_veyonConnection->setVeyonAuthType( RfbVeyonAuth::Token ); m_establishingConnectionWidget = new ProgressWidget( tr( "Establishing connection to %1 ..." ).arg( m_vncConn->host() ), QStringLiteral( ":/core/watch%1.png" ), 16, this ); diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 1595423de..6c8dec4bd 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -31,6 +31,7 @@ #include "AboutDialog.h" #include "AccessControlProvider.h" +#include "AuthenticationManager.h" #include "MainWindow.h" #include "BuiltinFeatures.h" #include "AuthenticationCredentials.h" @@ -198,16 +199,16 @@ bool MainWindow::initAuthentication() bool MainWindow::initAccessControl() { if( VeyonCore::config().accessControlForMasterEnabled() && - VeyonCore::authenticationCredentials().hasCredentials( AuthenticationCredentials::Type::UserLogon ) ) + VeyonCore::authenticationManager().configuredPlugin()->requiresAccessControl() ) { + const auto username = VeyonCore::authenticationManager().configuredPlugin()->accessControlUser(); const auto accessControlResult = - AccessControlProvider().checkAccess( VeyonCore::authenticationCredentials().logonUsername(), + AccessControlProvider().checkAccess( username, QHostAddress( QHostAddress::LocalHost ).toString(), QStringList() ); if( accessControlResult == AccessControlProvider::Access::Deny ) { - vWarning() << "user" << VeyonCore::authenticationCredentials().logonUsername() - << "is not allowed to access computers"; + vWarning() << "user" << username << "is not allowed to access computers"; QMessageBox::critical( nullptr, tr( "Access denied" ), tr( "According to the local configuration you're not allowed " "to access computers in the network. Please log in with a different " diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index 419ac80ff..23eb4f1b1 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "AuthKeysManager.h" #include "CommandLineIO.h" @@ -47,10 +48,16 @@ AuthKeysManager::AuthKeysManager( QObject* parent ) : } +bool AuthKeysManager::isKeyNameValid( const QString& authKeyName ) +{ + return QRegularExpression( QStringLiteral("^\\w+$") ).match( authKeyName ).hasMatch(); +} + + bool AuthKeysManager::createKeyPair( const QString& name ) { - if( VeyonCore::isAuthenticationKeyNameValid( name ) == false) + if( isKeyNameValid( name ) == false) { m_resultMessage = m_invalidKeyName; return false; @@ -159,7 +166,7 @@ bool AuthKeysManager::exportKey( const QString& name, const QString& type, const bool AuthKeysManager::importKey( const QString& name, const QString& type, const QString& inputFile ) { - if( VeyonCore::isAuthenticationKeyNameValid( name ) == false) + if( isKeyNameValid( name ) == false) { m_resultMessage = m_invalidKeyName; return false; @@ -269,7 +276,7 @@ QStringList AuthKeysManager::listKeys() bool AuthKeysManager::extractPublicFromPrivateKey( const QString& name ) { - if( VeyonCore::isAuthenticationKeyNameValid( name ) == false) + if( isKeyNameValid( name ) == false) { m_resultMessage = m_invalidKeyName; return false; @@ -474,7 +481,7 @@ QString AuthKeysManager::keyNameFromExportedKeyFile( const QString& keyFile ) bool AuthKeysManager::checkKey( const QString& name, const QString& type, bool checkIsReadable ) { - if( VeyonCore::isAuthenticationKeyNameValid( name ) == false ) + if( isKeyNameValid( name ) == false ) { m_resultMessage = m_invalidKeyName; return false; diff --git a/plugins/authkeys/AuthKeysManager.h b/plugins/authkeys/AuthKeysManager.h index 7d26ca4bd..6077e6285 100644 --- a/plugins/authkeys/AuthKeysManager.h +++ b/plugins/authkeys/AuthKeysManager.h @@ -33,6 +33,8 @@ class AuthKeysManager : public QObject explicit AuthKeysManager( QObject* parent = nullptr ); ~AuthKeysManager() override = default; + static bool isKeyNameValid( const QString& authKeyName ); + const QString& resultMessage() const { return m_resultMessage; diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index c1f01bff5..548a5ab81 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -22,13 +22,22 @@ * */ +#include +#include +#include +#include + #include "AuthKeysConfigurationPage.h" #include "AuthKeysPlugin.h" #include "AuthKeysManager.h" +#include "Filesystem.h" +#include "VariantArrayMessage.h" +#include "VeyonConfiguration.h" AuthKeysPlugin::AuthKeysPlugin( QObject* parent ) : QObject( parent ), + m_privateKey(), m_commands( { { QStringLiteral("create"), tr( "Create new authentication key pair" ) }, { QStringLiteral("delete"), tr( "Delete authentication key" ) }, @@ -43,6 +52,149 @@ AuthKeysPlugin::AuthKeysPlugin( QObject* parent ) : +bool AuthKeysPlugin::initializeCredentials() +{ + m_privateKey = {}; + + auto authKeyName = QProcessEnvironment::systemEnvironment().value( QStringLiteral("VEYON_AUTH_KEY_NAME") ); + + if( authKeyName.isEmpty() == false ) + { + if( AuthKeysManager::isKeyNameValid( authKeyName ) && + loadPrivateKey( VeyonCore::filesystem().privateKeyPath( authKeyName ) ) ) + { + m_authKeyName = authKeyName; + return true; + } + } + else + { + // try to auto-detect private key file by searching for readable file + const auto privateKeyBaseDir = VeyonCore::filesystem().expandPath( VeyonCore::config().privateKeyBaseDir() ); + const auto privateKeyDirs = QDir( privateKeyBaseDir ).entryList( QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name ); + + for( const auto& privateKeyDir : privateKeyDirs ) + { + if( loadPrivateKey( VeyonCore::filesystem().privateKeyPath( privateKeyDir ) ) ) + { + m_authKeyName = privateKeyDir; + return true; + } + } + } + + return false; +} + + + +bool AuthKeysPlugin::hasCredentials() const +{ + return m_privateKey.isNull() == false; +} + + + +bool AuthKeysPlugin::testConfiguration() const +{ + if( VeyonCore::instance()->initAuthentication() == false ) + { + QMessageBox::critical( QApplication::activeWindow(), authenticationTestTitle(), + tr( "Authentication keys are not set up properly on this computer." ) ); + return false; + } + + return true; +} + + + +VncServerClient::AuthState AuthKeysPlugin::performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const +{ + switch( client->authState() ) + { + case VncServerClient::AuthState::Init: + client->setChallenge( CryptoCore::generateChallenge() ); + if( VariantArrayMessage( message.ioDevice() ).write( client->challenge() ).send() == false ) + { + vWarning() << "failed to send challenge"; + return VncServerClient::AuthState::Failed; + } + return VncServerClient::AuthState::Stage1; + + case VncServerClient::AuthState::Stage1: + { + // get authentication key name + const auto authKeyName = message.read().toString(); // Flawfinder: ignore + + if( AuthKeysManager::isKeyNameValid( authKeyName ) == false ) + { + vDebug() << "invalid auth key name!"; + return VncServerClient::AuthState::Failed; + } + + // now try to verify received signed data using public key of the user + // under which the client claims to run + const auto signature = message.read().toByteArray(); // Flawfinder: ignore + + const auto publicKeyPath = VeyonCore::filesystem().publicKeyPath( authKeyName ); + + vDebug() << "loading public key" << publicKeyPath; + CryptoCore::PublicKey publicKey( publicKeyPath ); + + if( publicKey.isNull() || publicKey.isPublic() == false || + publicKey.verifyMessage( client->challenge(), signature, CryptoCore::DefaultSignatureAlgorithm ) == false ) + { + vWarning() << "FAIL"; + return VncServerClient::AuthState::Failed; + } + + vDebug() << "SUCCESS"; + return VncServerClient::AuthState::Successful; + } + + default: + break; + } + + return VncServerClient::AuthState::Failed; +} + + + +bool AuthKeysPlugin::authenticate( QIODevice* socket ) const +{ + VariantArrayMessage challengeReceiveMessage( socket ); + challengeReceiveMessage.receive(); + const auto challenge = challengeReceiveMessage.read().toByteArray(); + + if( challenge.size() != CryptoCore::ChallengeSize ) + { + vCritical() << QThread::currentThreadId() << "challenge size mismatch!"; + return false; + } + + // create local copy of private key so we can modify it within our own thread + auto key = m_privateKey; + + if( key.isNull() || key.canSign() == false ) + { + vCritical() << QThread::currentThreadId() << "invalid private key!"; + return false; + } + + const auto signature = key.signMessage( challenge, CryptoCore::DefaultSignatureAlgorithm ); + + VariantArrayMessage challengeResponseMessage( socket ); + challengeResponseMessage.write( m_authKeyName ); + challengeResponseMessage.write( signature ); + challengeResponseMessage.send(); + + return true; +} + + + QStringList AuthKeysPlugin::commands() const { return m_commands.keys(); @@ -294,6 +446,22 @@ CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_extract( const QStr +bool AuthKeysPlugin::loadPrivateKey( const QString& privateKeyFile ) +{ + vDebug() << privateKeyFile; + + if( privateKeyFile.isEmpty() ) + { + return false; + } + + m_privateKey = CryptoCore::PrivateKey( privateKeyFile ); + + return m_privateKey.isNull() == false && m_privateKey.isPrivate(); +} + + + void AuthKeysPlugin::printAuthKeyTable() { AuthKeysTableModel tableModel; @@ -307,9 +475,9 @@ void AuthKeysPlugin::printAuthKeyTable() for( int i = 0; i < tableModel.rowCount(); ++i ) { tableRows.append( { authKeysTableData( tableModel, i, AuthKeysTableModel::ColumnKeyName ), - authKeysTableData( tableModel, i, AuthKeysTableModel::ColumnKeyType ), - authKeysTableData( tableModel, i, AuthKeysTableModel::ColumnKeyPairID ), - authKeysTableData( tableModel, i, AuthKeysTableModel::ColumnAccessGroup ) } ); + authKeysTableData( tableModel, i, AuthKeysTableModel::ColumnKeyType ), + authKeysTableData( tableModel, i, AuthKeysTableModel::ColumnKeyPairID ), + authKeysTableData( tableModel, i, AuthKeysTableModel::ColumnAccessGroup ) } ); } CommandLineIO::printTable( CommandLineIO::Table( tableHeader, tableRows ) ); diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index cde3c1bc9..8a6813163 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -24,6 +24,7 @@ #pragma once +#include "AuthenticationPluginInterface.h" #include "CommandLineIO.h" #include "CommandLinePluginInterface.h" #include "ConfigurationPagePluginInterface.h" @@ -31,6 +32,7 @@ class AuthKeysTableModel; class AuthKeysPlugin : public QObject, + AuthenticationPluginInterface, CommandLinePluginInterface, PluginInterface, CommandLineIO, @@ -39,6 +41,7 @@ class AuthKeysPlugin : public QObject, Q_OBJECT Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.AuthKeys") Q_INTERFACES(PluginInterface + AuthenticationPluginInterface CommandLinePluginInterface ConfigurationPagePluginInterface) public: @@ -62,7 +65,7 @@ class AuthKeysPlugin : public QObject, QString description() const override { - return tr( "Command line support for managing authentication keys" ); + return tr( "Key file authentication" ); } QString vendor() const override @@ -75,6 +78,22 @@ class AuthKeysPlugin : public QObject, return QStringLiteral( "Tobias Junghans" ); } + QString authenticationTypeName() const override + { + return description(); + } + + bool initializeCredentials() override; + bool hasCredentials() const override; + + bool testConfiguration() const override; + + // server side authentication + VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; + + // client side authentication + bool authenticate( QIODevice* socket ) const override; + QString commandLineModuleName() const override { return QStringLiteral( "authkeys" ); @@ -101,10 +120,15 @@ public slots: CommandLinePluginInterface::RunResult handle_extract( const QStringList& arguments ); private: + bool loadPrivateKey( const QString& privateKeyFile ); + static void printAuthKeyTable(); static QString authKeysTableData( const AuthKeysTableModel& tableModel, int row, int column ); static void printAuthKeyList(); + CryptoCore::PrivateKey m_privateKey; + QString m_authKeyName; + QMap m_commands; }; diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp new file mode 100644 index 000000000..fc6ee7a33 --- /dev/null +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -0,0 +1,154 @@ +/* + * AuthLogonPlugin.cpp - implementation of AuthLogonPlugin class + * + * Copyright (c) 2018-2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include + +#include "AuthLogonPlugin.h" +#include "Filesystem.h" +#include "PasswordDialog.h" +#include "PlatformUserFunctions.h" +#include "VariantArrayMessage.h" +#include "VeyonConfiguration.h" + +AuthLogonPlugin::AuthLogonPlugin( QObject* parent ) : + QObject( parent ) +{ +} + + + +bool AuthLogonPlugin::initializeCredentials() +{ + if( qobject_cast( QCoreApplication::instance() ) ) + { + PasswordDialog passwordDialog( QApplication::activeWindow() ); + if( passwordDialog.exec() == PasswordDialog::Accepted ) + { + m_username = passwordDialog.username(); + m_password = passwordDialog.password(); + + return true; + } + } + + return false; +} + + + +bool AuthLogonPlugin::hasCredentials() const +{ + return m_username.isEmpty() == false && m_password.isEmpty() == false; +} + + + +bool AuthLogonPlugin::testConfiguration() const +{ + return PasswordDialog( QApplication::activeWindow() ).exec() == PasswordDialog::Accepted; +} + + + +VncServerClient::AuthState AuthLogonPlugin::performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const +{ + switch( client->authState() ) + { + case VncServerClient::AuthState::Init: + client->setPrivateKey( CryptoCore::KeyGenerator().createRSA( CryptoCore::RsaKeySize ) ); + + if( VariantArrayMessage( message.ioDevice() ).write( client->privateKey().toPublicKey().toPEM() ).send() ) + { + return VncServerClient::AuthState::Stage1; + } + + vDebug() << "failed to send public key"; + return VncServerClient::AuthState::Failed; + + case VncServerClient::AuthState::Stage1: + { + auto privateKey = client->privateKey(); + + client->setUsername( message.read().toString() ); // Flawfinder: ignore + CryptoCore::SecureArray encryptedPassword( message.read().toByteArray() ); // Flawfinder: ignore + + CryptoCore::SecureArray decryptedPassword; + + if( privateKey.decrypt( encryptedPassword, + &decryptedPassword, + CryptoCore::DefaultEncryptionAlgorithm ) == false ) + { + vWarning() << "failed to decrypt password"; + return VncServerClient::AuthState::Failed; + } + + vInfo() << "authenticating user" << client->username(); + + if( VeyonCore::platform().userFunctions().authenticate( client->username(), decryptedPassword.toByteArray() ) ) + { + vDebug() << "SUCCESS"; + return VncServerClient::AuthState::Successful; + } + + vDebug() << "FAIL"; + return VncServerClient::AuthState::Failed; + } + + default: + break; + } + + return VncServerClient::AuthState::Failed; + +} + + + +bool AuthLogonPlugin::authenticate( QIODevice* socket ) const +{ + VariantArrayMessage publicKeyMessage( socket ); + publicKeyMessage.receive(); + + CryptoCore::PublicKey publicKey = CryptoCore::PublicKey::fromPEM( publicKeyMessage.read().toString() ); + + if( publicKey.canEncrypt() == false ) + { + vCritical() << QThread::currentThreadId() << "can't encrypt with given public key!"; + return false; + } + + CryptoCore::SecureArray encryptedPassword = publicKey.encrypt( m_password, CryptoCore::DefaultEncryptionAlgorithm ); + if( encryptedPassword.isEmpty() ) + { + vCritical() << QThread::currentThreadId() << "password encryption failed!"; + return false; + } + + VariantArrayMessage response( socket ); + response.write( m_username ); + response.write( encryptedPassword.toByteArray() ); + response.send(); + + return true; +} diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h new file mode 100644 index 000000000..a3b1059f9 --- /dev/null +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -0,0 +1,94 @@ +/* + * AuthLogonPlugin.h - declaration of AuthLogonPlugin class + * + * Copyright (c) 2018-2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "AuthenticationPluginInterface.h" + +class AuthLogonPlugin : public QObject, + AuthenticationPluginInterface, + PluginInterface +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.AuthLogon") + Q_INTERFACES(PluginInterface + AuthenticationPluginInterface) +public: + explicit AuthLogonPlugin( QObject* parent = nullptr ); + ~AuthLogonPlugin() override = default; + + Plugin::Uid uid() const override + { + return QStringLiteral("63611f7c-b457-42c7-832e-67d0f9281085"); + } + + QVersionNumber version() const override + { + return QVersionNumber( 1, 0 ); + } + + QString name() const override + { + return QStringLiteral( "AuthLogon" ); + } + + QString description() const override + { + return tr( "Logon authentication" ); + } + + QString vendor() const override + { + return QStringLiteral( "Veyon Community" ); + } + + QString copyright() const override + { + return QStringLiteral( "Tobias Junghans" ); + } + + QString authenticationTypeName() const override + { + return description(); + } + + bool initializeCredentials() override; + bool hasCredentials() const override; + + bool testConfiguration() const override; + + VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; + + bool authenticate( QIODevice* socket ) const override; + + QString accessControlUser() const override + { + return m_username; + } + +private: + QString m_username; + CryptoCore::SecureArray m_password; + +}; diff --git a/plugins/authlogon/CMakeLists.txt b/plugins/authlogon/CMakeLists.txt new file mode 100644 index 000000000..b84778281 --- /dev/null +++ b/plugins/authlogon/CMakeLists.txt @@ -0,0 +1,6 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(authlogon + AuthLogonPlugin.cpp + AuthLogonPlugin.h +) diff --git a/plugins/demo/CMakeLists.txt b/plugins/demo/CMakeLists.txt index 99c84a07f..911018ddc 100644 --- a/plugins/demo/CMakeLists.txt +++ b/plugins/demo/CMakeLists.txt @@ -2,6 +2,7 @@ INCLUDE(BuildPlugin) BUILD_PLUGIN(demo DemoFeaturePlugin.cpp + DemoAuthentication.cpp DemoConfigurationPage.cpp DemoConfigurationPage.ui DemoServer.cpp @@ -9,6 +10,7 @@ BUILD_PLUGIN(demo DemoServerProtocol.cpp DemoClient.cpp DemoFeaturePlugin.h + DemoAuthentication.h DemoConfiguration.h DemoConfigurationPage.h DemoServer.h diff --git a/plugins/demo/DemoAuthentication.cpp b/plugins/demo/DemoAuthentication.cpp new file mode 100644 index 000000000..d92719c3b --- /dev/null +++ b/plugins/demo/DemoAuthentication.cpp @@ -0,0 +1,99 @@ +/* + * DemoAuthentication.cpp - implementation of DemoAuthentication class + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "DemoAuthentication.h" +#include "VariantArrayMessage.h" + + +DemoAuthentication::DemoAuthentication( const Plugin::Uid& pluginUid, QObject* parent ) : + QObject( parent ), + m_accessToken(), + m_pluginUid( pluginUid ) +{ +} + + + +bool DemoAuthentication::initializeCredentials() +{ + m_accessToken = CryptoCore::generateChallenge().toBase64(); + + return hasCredentials(); +} + + + +bool DemoAuthentication::hasCredentials() const +{ + return m_accessToken.isEmpty() == false && + QByteArray::fromBase64( m_accessToken.toByteArray() ).size() == CryptoCore::ChallengeSize; +} + + + +bool DemoAuthentication::testConfiguration() const +{ + return true; +} + + + +VncServerClient::AuthState DemoAuthentication::performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const +{ + switch( client->authState() ) + { + case VncServerClient::AuthState::Init: + return VncServerClient::AuthState::Stage1; + + case VncServerClient::AuthState::Stage1: + { + const CryptoCore::SecureArray token = message.read().toByteArray(); // Flawfinder: ignore + + if( hasCredentials() && token == m_accessToken ) + { + vDebug() << "SUCCESS"; + return VncServerClient::AuthState::Successful; + } + + vDebug() << "FAIL"; + return VncServerClient::AuthState::Failed; + } + + default: + break; + } + + return VncServerClient::AuthState::Failed; +} + + + +bool DemoAuthentication::authenticate( QIODevice* socket ) const +{ + VariantArrayMessage tokenAuthMessage( socket ); + tokenAuthMessage.write( m_accessToken.toByteArray() ); + tokenAuthMessage.send(); + + return false; +} diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h new file mode 100644 index 000000000..d76553e6d --- /dev/null +++ b/plugins/demo/DemoAuthentication.h @@ -0,0 +1,76 @@ +/* + * DemoAuthentication.h - declaration of DemoAuthentication class + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "AuthenticationPluginInterface.h" + +class DemoAuthentication : public QObject, public AuthenticationPluginInterface +{ + Q_OBJECT +public: + using AccessToken = CryptoCore::SecureArray; + + explicit DemoAuthentication( const Plugin::Uid& pluginUid, QObject* parent = nullptr ); + ~DemoAuthentication() override = default; + + QString authenticationTypeName() const override + { + return tr( "Demo authentication" ); + } + + bool initializeCredentials() override; + bool hasCredentials() const override; + + bool testConfiguration() const override; + + VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; + + bool authenticate( QIODevice* socket ) const override; + + bool requiresAccessControl() const override + { + return false; + } + + const AccessToken& accessToken() const + { + return m_accessToken; + } + + void setAccessToken( const AccessToken& token ) + { + m_accessToken = token; + } + + const Plugin::Uid& pluginUid() const + { + return m_pluginUid; + } + +private: + AccessToken m_accessToken; + Plugin::Uid m_pluginUid; + +}; diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 9e718c858..216700ae9 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -33,6 +33,7 @@ #include "DemoFeaturePlugin.h" #include "Logger.h" #include "FeatureWorkerManager.h" +#include "VariantArrayMessage.h" #include "VeyonConfiguration.h" #include "VeyonServerInterface.h" @@ -63,9 +64,9 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : Feature::Uid(), tr( "Demo server" ), {}, {} ), m_features( { m_fullscreenDemoFeature, m_windowDemoFeature, m_demoServerFeature } ), - m_demoAccessToken( QString::fromLatin1( CryptoCore::generateChallenge().toBase64() ) ), - m_demoClientHosts(), + m_authentication( uid(), this ), m_configuration( &VeyonCore::config() ), + m_demoClientHosts(), m_demoServer( nullptr ), m_demoClient( nullptr ) { @@ -81,7 +82,7 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur if( feature == m_windowDemoFeature || feature == m_fullscreenDemoFeature ) { FeatureMessage featureMessage( m_demoServerFeature.uid(), StartDemoServer ); - featureMessage.addArgument( DemoAccessToken, m_demoAccessToken ); + featureMessage.addArgument( DemoAccessToken, m_authentication.accessToken().toByteArray() ); VeyonCore::localComputerControlInterface().sendFeatureMessage( featureMessage, true ); @@ -98,7 +99,8 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur vDebug() << "clients:" << m_demoClientHosts; - return sendFeatureMessage( FeatureMessage( feature.uid(), StartDemoClient ).addArgument( DemoAccessToken, m_demoAccessToken ), + return sendFeatureMessage( FeatureMessage( feature.uid(), StartDemoClient ). + addArgument( DemoAccessToken, m_authentication.accessToken().toByteArray() ), computerControlInterfaces ); } @@ -243,9 +245,11 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worker, cons case StartDemoServer: if( m_demoServer == nullptr ) { + m_authentication.setAccessToken( message.argument( DemoAccessToken ).toByteArray() ); + m_demoServer = new DemoServer( message.argument( VncServerPort ).toInt(), message.argument( VncServerPassword ).toString(), - message.argument( DemoAccessToken ).toString(), + m_authentication, m_configuration, this ); } @@ -266,7 +270,7 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worker, cons switch( message.command() ) { case StartDemoClient: - VeyonCore::authenticationCredentials().setToken( message.argument( DemoAccessToken ).toString() ); + m_authentication.setAccessToken( message.argument( DemoAccessToken ).toByteArray() ); if( m_demoClient == nullptr ) { @@ -303,4 +307,53 @@ ConfigurationPage* DemoFeaturePlugin::createConfigurationPage() +QString DemoFeaturePlugin::authenticationTypeName() const +{ + return m_authentication.authenticationTypeName(); +} + + + +bool DemoFeaturePlugin::initializeCredentials() +{ + return m_authentication.initializeCredentials(); +} + + + +bool DemoFeaturePlugin::hasCredentials() const +{ + return m_authentication.hasCredentials(); +} + + + +bool DemoFeaturePlugin::testConfiguration() const +{ + return m_authentication.testConfiguration(); +} + + + +VncServerClient::AuthState DemoFeaturePlugin::performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const +{ + return m_authentication.performAuthentication( client, message ); +} + + + +bool DemoFeaturePlugin::authenticate( QIODevice* socket ) const +{ + return m_authentication.authenticate( socket ); +} + + + +bool DemoFeaturePlugin::requiresAccessControl() const +{ + return m_authentication.requiresAccessControl(); +} + + + IMPLEMENT_CONFIG_PROXY(DemoConfiguration) diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 675daeea5..e922041cb 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -24,18 +24,23 @@ #pragma once +#include "AuthenticationPluginInterface.h" #include "ConfigurationPagePluginInterface.h" +#include "DemoAuthentication.h" #include "DemoConfiguration.h" #include "FeatureProviderInterface.h" class DemoServer; class DemoClient; -class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterface, ConfigurationPagePluginInterface +class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterface, ConfigurationPagePluginInterface, AuthenticationPluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.Demo") - Q_INTERFACES(PluginInterface FeatureProviderInterface ConfigurationPagePluginInterface) + Q_INTERFACES(PluginInterface + FeatureProviderInterface + ConfigurationPagePluginInterface + AuthenticationPluginInterface) public: explicit DemoFeaturePlugin( QObject* parent = nullptr ); ~DemoFeaturePlugin() override = default; @@ -92,6 +97,19 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf ConfigurationPage* createConfigurationPage() override; + QString authenticationTypeName() const override; + + bool initializeCredentials() override; + bool hasCredentials() const override; + + bool testConfiguration() const override; + + VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; + + bool authenticate( QIODevice* socket ) const override; + + bool requiresAccessControl() const override; + private: enum Commands { StartDemoServer, @@ -112,11 +130,11 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf const Feature m_demoServerFeature; const FeatureList m_features; - QString m_demoAccessToken; - QStringList m_demoClientHosts; - + DemoAuthentication m_authentication; DemoConfiguration m_configuration; + QStringList m_demoClientHosts; + DemoServer* m_demoServer; DemoClient* m_demoClient; diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 55118cc24..03e1e3d4d 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -32,14 +32,14 @@ #include "VeyonConfiguration.h" -DemoServer::DemoServer( int vncServerPort, const QString& vncServerPassword, const QString& demoAccessToken, +DemoServer::DemoServer( int vncServerPort, const QString& vncServerPassword, const DemoAuthentication& authentication, const DemoConfiguration& configuration, QObject *parent ) : QObject( parent ), + m_authentication( authentication ), m_configuration( configuration ), m_memoryLimit( m_configuration.memoryLimit() * 1024*1024 ), m_keyFrameInterval( m_configuration.keyFrameInterval() * 1000 ), m_vncServerPort( vncServerPort ), - m_demoAccessToken( demoAccessToken ), m_tcpServer( new QTcpServer( this ) ), m_vncServerSocket( new QTcpSocket( this ) ), m_vncClientProtocol( m_vncServerSocket, vncServerPassword ), @@ -118,7 +118,7 @@ void DemoServer::acceptPendingConnections() while( m_tcpServer->hasPendingConnections() ) { - new DemoServerConnection( m_demoAccessToken, m_tcpServer->nextPendingConnection(), this ); + new DemoServerConnection( m_authentication, m_tcpServer->nextPendingConnection(), this ); } } diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index 04251a50f..2bcec6c95 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -31,6 +31,7 @@ #include "VncClientProtocol.h" +class DemoAuthentication; class DemoConfiguration; class QTcpServer; @@ -40,7 +41,7 @@ class DemoServer : public QObject public: using MessageList = QVector; - DemoServer( int vncServerPort, const QString& vncServerPassword, const QString& demoAccessToken, + DemoServer( int vncServerPort, const QString& vncServerPassword, const DemoAuthentication& authentication, const DemoConfiguration& configuration, QObject *parent ); ~DemoServer() override; @@ -86,6 +87,7 @@ class DemoServer : public QObject bool setVncServerPixelFormat(); bool setVncServerEncodings(); + const DemoAuthentication& m_authentication; const DemoConfiguration& m_configuration; const qint64 m_memoryLimit; const int m_keyFrameInterval; diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index f86d18b0c..c9cc0adc6 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -30,14 +30,14 @@ #include "DemoServerConnection.h" -DemoServerConnection::DemoServerConnection( const QString& demoAccessToken, +DemoServerConnection::DemoServerConnection( const DemoAuthentication& authentication, QTcpSocket* socket, DemoServer* demoServer ) : QObject( demoServer ), m_demoServer( demoServer ), m_socket( socket ), m_vncServerClient(), - m_serverProtocol( demoAccessToken, m_socket, &m_vncServerClient ), + m_serverProtocol( authentication, m_socket, &m_vncServerClient ), m_rfbClientToServerMessageSizes( { std::pair( rfbSetPixelFormat, sz_rfbSetPixelFormatMsg ), std::pair( rfbFramebufferUpdateRequest, sz_rfbFramebufferUpdateRequestMsg ), diff --git a/plugins/demo/DemoServerConnection.h b/plugins/demo/DemoServerConnection.h index 6b364f436..ee5648ae0 100644 --- a/plugins/demo/DemoServerConnection.h +++ b/plugins/demo/DemoServerConnection.h @@ -41,7 +41,7 @@ class DemoServerConnection : public QObject ProtocolRetryTime = 250, }; - DemoServerConnection( const QString& demoAccessToken, QTcpSocket* socket, DemoServer* demoServer ); + DemoServerConnection( const DemoAuthentication& authentication, QTcpSocket* socket, DemoServer* demoServer ); ~DemoServerConnection() override; public slots: diff --git a/plugins/demo/DemoServerProtocol.cpp b/plugins/demo/DemoServerProtocol.cpp index dc9f16c87..7c55129e2 100644 --- a/plugins/demo/DemoServerProtocol.cpp +++ b/plugins/demo/DemoServerProtocol.cpp @@ -22,29 +22,30 @@ * */ +#include "DemoAuthentication.h" #include "DemoServerProtocol.h" #include "VariantArrayMessage.h" #include "VncServerClient.h" -DemoServerProtocol::DemoServerProtocol( const QString& demoAccessToken, QTcpSocket* socket, VncServerClient* client ) : +DemoServerProtocol::DemoServerProtocol( const DemoAuthentication& authentication, QTcpSocket* socket, VncServerClient* client ) : VncServerProtocol( socket, client ), - m_demoAccessToken( demoAccessToken ) + m_authentication( authentication ) { } -QVector DemoServerProtocol::supportedAuthTypes() const +DemoServerProtocol::AuthPluginUids DemoServerProtocol::supportedAuthPluginUids() const { - return { RfbVeyonAuth::Token }; + return { m_authentication.pluginUid() }; } void DemoServerProtocol::processAuthenticationMessage( VariantArrayMessage& message ) { - if( client()->authType() == RfbVeyonAuth::Token ) + if( client()->authPluginUid() == m_authentication.pluginUid() ) { client()->setAuthState( performTokenAuthentication( message ) ); } @@ -68,10 +69,10 @@ VncServerClient::AuthState DemoServerProtocol::performTokenAuthentication( Varia switch( client()->authState() ) { case VncServerClient::AuthState::Init: - return VncServerClient::AuthState::Token; + return VncServerClient::AuthState::Stage1; - case VncServerClient::AuthState::Token: - if( message.read().toString() == m_demoAccessToken ) + case VncServerClient::AuthState::Stage1: + if( message.read().toByteArray() == m_authentication.accessToken().toByteArray() ) { vDebug() << "SUCCESS"; return VncServerClient::AuthState::Successful; diff --git a/plugins/demo/DemoServerProtocol.h b/plugins/demo/DemoServerProtocol.h index 5e71ff6c7..46bf681fd 100644 --- a/plugins/demo/DemoServerProtocol.h +++ b/plugins/demo/DemoServerProtocol.h @@ -27,21 +27,23 @@ #include "VncServerClient.h" #include "VncServerProtocol.h" +class DemoAuthentication; + // clazy:excludeall=copyable-polymorphic class DemoServerProtocol : public VncServerProtocol { public: - DemoServerProtocol( const QString& demoAccessToken, QTcpSocket* socket, VncServerClient* client ); + DemoServerProtocol( const DemoAuthentication& authentication, QTcpSocket* socket, VncServerClient* client ); protected: - QVector supportedAuthTypes() const override; + AuthPluginUids supportedAuthPluginUids() const override; void processAuthenticationMessage( VariantArrayMessage& message ) override; void performAccessControl() override; private: VncServerClient::AuthState performTokenAuthentication( VariantArrayMessage& message ); - const QString m_demoAccessToken; + const DemoAuthentication& m_authentication; } ; diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 27408f4f7..e28977930 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -308,7 +308,7 @@ void LinuxUserFunctions::logoff() -bool LinuxUserFunctions::authenticate( const QString& username, const QString& password ) +bool LinuxUserFunctions::authenticate( const QString& username, const CryptoCore::SecureArray& password ) { QProcess p; p.start( QStringLiteral( "veyon-auth-helper" ), QProcess::ReadWrite | QProcess::Unbuffered ); @@ -321,9 +321,9 @@ bool LinuxUserFunctions::authenticate( const QString& username, const QString& p const auto pamService = LinuxPlatformConfiguration( &VeyonCore::config() ).pamServiceName(); QDataStream ds( &p ); - ds << VeyonCore::stripDomain( username ); - ds << password; - ds << pamService; + ds << VeyonCore::stripDomain( username ).toUtf8(); + ds << password.toByteArray(); + ds << pamService.toUtf8(); p.waitForFinished(); diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index 02d3d1b53..829f72c7f 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -44,7 +44,7 @@ class LinuxUserFunctions : public PlatformUserFunctions bool logon( const QString& username, const QString& password ) override; void logoff() override; - bool authenticate( const QString& username, const QString& password ) override; + bool authenticate( const QString& username, const CryptoCore::SecureArray& password ) override; static uid_t userIdFromName( const QString& username ); diff --git a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp index e1f415da9..917c4c309 100644 --- a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp +++ b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp @@ -70,23 +70,19 @@ static int pam_conv( int num_msg, const struct pam_message** msg, struct pam_res int main() { - QString username, password, service; + QByteArray username, password, service; QFile stdIn; stdIn.open( 0, QFile::ReadOnly | QFile::Unbuffered ); QDataStream ds( &stdIn ); - ds >> username; - ds >> password; - ds >> service; + ds >> pam_username; + ds >> pam_password; + ds >> pam_service; - if( service.isEmpty() ) + if( pam_service.isEmpty() ) { - service = QStringLiteral("login"); + pam_service = QByteArrayLiteral("login"); } - pam_username = username.toUtf8(); - pam_password = password.toUtf8(); - pam_service = service.toUtf8(); - struct pam_conv pconv = { &pam_conv, nullptr }; pam_handle_t* pamh = nullptr; auto err = pam_start( pam_service.constData(), nullptr, &pconv, &pamh ); diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index 2f2fc5233..fc02baed2 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -29,7 +29,6 @@ #include "FeatureManager.h" #include "FeatureWorkerManager.h" -#include "RfbVeyonAuth.h" #include "ServerAuthenticationManager.h" #include "ServerAccessControlManager.h" #include "VeyonServerInterface.h" diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index f35e98710..400c4e167 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -22,13 +22,11 @@ * */ -#include "VeyonCore.h" - #include "ServerAccessControlManager.h" #include "AccessControlProvider.h" +#include "AuthenticationManager.h" #include "DesktopAccessDialog.h" #include "VeyonConfiguration.h" -#include "VariantArrayMessage.h" ServerAccessControlManager::ServerAccessControlManager( FeatureWorkerManager& featureWorkerManager, @@ -46,22 +44,21 @@ ServerAccessControlManager::ServerAccessControlManager( FeatureWorkerManager& fe void ServerAccessControlManager::addClient( VncServerClient* client ) { - switch( client->authType() ) + const auto plugins = VeyonCore::authenticationManager().plugins(); + if( plugins.contains( client->authPluginUid() ) ) + { + if( plugins[client->authPluginUid()]->requiresAccessControl() ) + { + performAccessControl( client ); + } + else + { + client->setAccessControlState( VncServerClient::AccessControlState::Successful ); + } + } + else { - case RfbVeyonAuth::KeyFile: - case RfbVeyonAuth::Logon: - performAccessControl( client ); - break; - - case RfbVeyonAuth::None: - case RfbVeyonAuth::Token: - client->setAccessControlState( VncServerClient::AccessControlState::Successful ); - break; - - default: - // reject unknown auth type client->setAccessControlState( VncServerClient::AccessControlState::Failed ); - break; } if( client->accessControlState() == VncServerClient::AccessControlState::Successful ) @@ -88,7 +85,7 @@ void ServerAccessControlManager::removeClient( VncServerClient* client ) addClient( prevClient ); if( prevClient->accessControlState() != VncServerClient::AccessControlState::Successful && - prevClient->accessControlState() != VncServerClient::AccessControlState::Pending ) + prevClient->accessControlState() != VncServerClient::AccessControlState::Pending ) { vDebug() << "closing connection as client does not pass access control any longer"; prevClient->setProtocolState( VncServerProtocol::Close ); @@ -189,7 +186,7 @@ void ServerAccessControlManager::finishDesktopAccessConfirmation( VncServerClien { // break helper connections for asynchronous desktop access control operations if( m_desktopAccessDialog.disconnect( client ) == false || - client->disconnect( this ) == false ) + client->disconnect( this ) == false ) { vCritical() << "could not break object connections"; } diff --git a/server/src/ServerAccessControlManager.h b/server/src/ServerAccessControlManager.h index c2fd86d79..2c41a066e 100644 --- a/server/src/ServerAccessControlManager.h +++ b/server/src/ServerAccessControlManager.h @@ -25,7 +25,6 @@ #pragma once #include "DesktopAccessDialog.h" -#include "RfbVeyonAuth.h" #include "VncServerClient.h" class VariantArrayMessage; diff --git a/server/src/ServerAuthenticationManager.cpp b/server/src/ServerAuthenticationManager.cpp index d8e4c2c8c..0a3b0baf9 100644 --- a/server/src/ServerAuthenticationManager.cpp +++ b/server/src/ServerAuthenticationManager.cpp @@ -22,13 +22,8 @@ * */ -#include "AuthenticationCredentials.h" +#include "AuthenticationManager.h" #include "ServerAuthenticationManager.h" -#include "CryptoCore.h" -#include "Filesystem.h" -#include "PlatformUserFunctions.h" -#include "VariantArrayMessage.h" -#include "VeyonConfiguration.h" ServerAuthenticationManager::ServerAuthenticationManager( QObject* parent ) : @@ -38,26 +33,9 @@ ServerAuthenticationManager::ServerAuthenticationManager( QObject* parent ) : -QVector ServerAuthenticationManager::supportedAuthTypes() const +VncServerProtocol::AuthPluginUids ServerAuthenticationManager::supportedAuthPluginUids() const { - QVector authTypes; - - if( VeyonCore::config().authenticationMethod() == VeyonCore::AuthenticationMethod::KeyFileAuthentication ) - { - authTypes.append( RfbVeyonAuth::KeyFile ); - } - - if( VeyonCore::config().authenticationMethod() == VeyonCore::AuthenticationMethod::LogonAuthentication ) - { - authTypes.append( RfbVeyonAuth::Logon ); - } - - if( VeyonCore::authenticationCredentials().hasCredentials( AuthenticationCredentials::Type::Token ) ) - { - authTypes.append( RfbVeyonAuth::Token ); - } - - return authTypes; + return VncServerProtocol::AuthPluginUids::fromList( VeyonCore::authenticationManager().plugins().keys() ); } @@ -66,34 +44,18 @@ void ServerAuthenticationManager::processAuthenticationMessage( VncServerClient* VariantArrayMessage& message ) { vDebug() << "state" << client->authState() - << "type" << client->authType() + << "plugin" << client->authPluginUid() << "host" << client->hostAddress() << "user" << client->username(); - switch( client->authType() ) + const auto plugins = VeyonCore::authenticationManager().plugins(); + if( plugins.contains( client->authPluginUid() ) ) + { + client->setAuthState( plugins[client->authPluginUid()]->performAuthentication( client, message ) ); + } + else { - // no authentication - case RfbVeyonAuth::None: - client->setAuthState( VncServerClient::AuthState::Successful ); - break; - - // authentication via DSA-challenge/-response - case RfbVeyonAuth::KeyFile: - client->setAuthState( performKeyAuthentication( client, message ) ); - break; - - case RfbVeyonAuth::Logon: - client->setAuthState( performLogonAuthentication( client, message ) ); - break; - - case RfbVeyonAuth::Token: - client->setAuthState( performTokenAuthentication( client, message ) ); - break; - - default: - // unknown or unsupported auth type client->setAuthState( VncServerClient::AuthState::Failed ); - break; } switch( client->authState() ) @@ -101,147 +63,8 @@ void ServerAuthenticationManager::processAuthenticationMessage( VncServerClient* case VncServerClient::AuthState::Failed: case VncServerClient::AuthState::Successful: emit finished( client ); - default: - break; - } -} - - - -VncServerClient::AuthState ServerAuthenticationManager::performKeyAuthentication( VncServerClient* client, - VariantArrayMessage& message ) -{ - switch( client->authState() ) - { - case VncServerClient::AuthState::Init: - client->setChallenge( CryptoCore::generateChallenge() ); - if( VariantArrayMessage( message.ioDevice() ).write( client->challenge() ).send() == false ) - { - vWarning() << "failed to send challenge"; - return VncServerClient::AuthState::Failed; - } - return VncServerClient::AuthState::Challenge; - - case VncServerClient::AuthState::Challenge: - { - // get authentication key name - const auto authKeyName = message.read().toString(); // Flawfinder: ignore - - if( VeyonCore::isAuthenticationKeyNameValid( authKeyName ) == false ) - { - vDebug() << "invalid auth key name!"; - return VncServerClient::AuthState::Failed; - } - - // now try to verify received signed data using public key of the user - // under which the client claims to run - const auto signature = message.read().toByteArray(); // Flawfinder: ignore - - const auto publicKeyPath = VeyonCore::filesystem().publicKeyPath( authKeyName ); - - vDebug() << "loading public key" << publicKeyPath; - CryptoCore::PublicKey publicKey( publicKeyPath ); - - if( publicKey.isNull() || publicKey.isPublic() == false || - publicKey.verifyMessage( client->challenge(), signature, CryptoCore::DefaultSignatureAlgorithm ) == false ) - { - vWarning() << "FAIL"; - return VncServerClient::AuthState::Failed; - } - - vDebug() << "SUCCESS"; - return VncServerClient::AuthState::Successful; - } - - default: break; - } - - return VncServerClient::AuthState::Failed; -} - - - -VncServerClient::AuthState ServerAuthenticationManager::performLogonAuthentication( VncServerClient* client, - VariantArrayMessage& message ) -{ - switch( client->authState() ) - { - case VncServerClient::AuthState::Init: - client->setPrivateKey( CryptoCore::KeyGenerator().createRSA( CryptoCore::RsaKeySize ) ); - - if( VariantArrayMessage( message.ioDevice() ).write( client->privateKey().toPublicKey().toPEM() ).send() ) - { - return VncServerClient::AuthState::Password; - } - - vDebug() << "failed to send public key"; - return VncServerClient::AuthState::Failed; - - case VncServerClient::AuthState::Password: - { - auto privateKey = client->privateKey(); - - CryptoCore::SecureArray encryptedPassword( message.read().toByteArray() ); // Flawfinder: ignore - - CryptoCore::SecureArray decryptedPassword; - - if( privateKey.decrypt( encryptedPassword, - &decryptedPassword, - CryptoCore::DefaultEncryptionAlgorithm ) == false ) - { - vWarning() << "failed to decrypt password"; - return VncServerClient::AuthState::Failed; - } - - vInfo() << "authenticating user" << client->username(); - - if( VeyonCore::platform().userFunctions().authenticate( client->username(), - QString::fromUtf8( decryptedPassword.toByteArray() ) ) ) - { - vDebug() << "SUCCESS"; - return VncServerClient::AuthState::Successful; - } - - vDebug() << "FAIL"; - return VncServerClient::AuthState::Failed; - } - - default: - break; - } - - return VncServerClient::AuthState::Failed; -} - - - -VncServerClient::AuthState ServerAuthenticationManager::performTokenAuthentication( VncServerClient* client, - VariantArrayMessage& message ) -{ - switch( client->authState() ) - { - case VncServerClient::AuthState::Init: - return VncServerClient::AuthState::Token; - - case VncServerClient::AuthState::Token: - { - const auto token = message.read().toString(); // Flawfinder: ignore - - if( VeyonCore::authenticationCredentials().hasCredentials( AuthenticationCredentials::Type::Token ) && - token == VeyonCore::authenticationCredentials().token() ) - { - vDebug() << "SUCCESS"; - return VncServerClient::AuthState::Successful; - } - - vDebug() << "FAIL"; - return VncServerClient::AuthState::Failed; - } - default: break; } - - return VncServerClient::AuthState::Failed; } diff --git a/server/src/ServerAuthenticationManager.h b/server/src/ServerAuthenticationManager.h index a7860c20a..54f658da8 100644 --- a/server/src/ServerAuthenticationManager.h +++ b/server/src/ServerAuthenticationManager.h @@ -27,7 +27,6 @@ #include #include -#include "RfbVeyonAuth.h" #include "VncServerClient.h" class VariantArrayMessage; @@ -44,7 +43,7 @@ class ServerAuthenticationManager : public QObject explicit ServerAuthenticationManager( QObject* parent ); - QVector supportedAuthTypes() const; + VncServerProtocol::AuthPluginUids supportedAuthPluginUids() const; void processAuthenticationMessage( VncServerClient* client, VariantArrayMessage& message ); @@ -53,9 +52,4 @@ class ServerAuthenticationManager : public QObject signals: void finished( VncServerClient* client ); -private: - VncServerClient::AuthState performKeyAuthentication( VncServerClient* client, VariantArrayMessage& message ); - VncServerClient::AuthState performLogonAuthentication( VncServerClient* client, VariantArrayMessage& message ); - VncServerClient::AuthState performTokenAuthentication( VncServerClient* client, VariantArrayMessage& message ); - } ; diff --git a/server/src/VeyonServerProtocol.cpp b/server/src/VeyonServerProtocol.cpp index b9dc01231..f74d4e729 100644 --- a/server/src/VeyonServerProtocol.cpp +++ b/server/src/VeyonServerProtocol.cpp @@ -39,14 +39,14 @@ VeyonServerProtocol::VeyonServerProtocol( QTcpSocket* socket, -QVector VeyonServerProtocol::supportedAuthTypes() const +VeyonServerProtocol::AuthPluginUids VeyonServerProtocol::supportedAuthPluginUids() const { - return m_serverAuthenticationManager.supportedAuthTypes(); + return m_serverAuthenticationManager.supportedAuthPluginUids(); } -void VeyonServerProtocol::processAuthenticationMessage(VariantArrayMessage &message) +void VeyonServerProtocol::processAuthenticationMessage( VariantArrayMessage& message ) { m_serverAuthenticationManager.processAuthenticationMessage( client(), message ); } @@ -59,7 +59,7 @@ void VeyonServerProtocol::performAccessControl() // client just entered access control or is still waiting to be // processed (e.g. desktop access dialog already active for a different connection) if( client()->accessControlState() == VncServerClient::AccessControlState::Init || - client()->accessControlState() == VncServerClient::AccessControlState::Waiting ) + client()->accessControlState() == VncServerClient::AccessControlState::Waiting ) { m_serverAccessControlManager.addClient( client() ); } diff --git a/server/src/VeyonServerProtocol.h b/server/src/VeyonServerProtocol.h index 3ffe50e39..36449d8d1 100644 --- a/server/src/VeyonServerProtocol.h +++ b/server/src/VeyonServerProtocol.h @@ -40,7 +40,7 @@ class VeyonServerProtocol : public VncServerProtocol ServerAccessControlManager& serverAccessControlManager ); protected: - QVector supportedAuthTypes() const override; + AuthPluginUids supportedAuthPluginUids() const override; void processAuthenticationMessage( VariantArrayMessage& message ) override; void performAccessControl() override; From 5b37474892ca40f045c7e761aa682fb48dc3ac60 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 13:39:19 +0200 Subject: [PATCH 0004/1765] LinuxUserFunctions: make auth fail on timeout If the veyon-auth-helper binary is not working properly and causes a timeout we have to indicate a failed authentication. --- plugins/platform/linux/LinuxUserFunctions.cpp | 4 ++-- plugins/platform/linux/LinuxUserFunctions.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index e28977930..a3b2c647a 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -325,9 +325,9 @@ bool LinuxUserFunctions::authenticate( const QString& username, const CryptoCore ds << password.toByteArray(); ds << pamService.toUtf8(); - p.waitForFinished(); + p.waitForFinished( AuthHelperTimeout ); - if( p.exitCode() != 0 ) + if( p.state() != QProcess::NotRunning || p.exitCode() != 0 ) { vCritical() << "VeyonAuthHelper failed:" << p.exitCode() << p.readAllStandardOutput().trimmed() << p.readAllStandardError().trimmed(); diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index 829f72c7f..c10ef27b9 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -50,5 +50,6 @@ class LinuxUserFunctions : public PlatformUserFunctions private: static constexpr auto WhoProcessTimeout = 3000; + static constexpr auto AuthHelperTimeout = 10000; }; From d2f2e132f460c85cced46cdfa5f2eaf1e7cd0bdb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 13:40:40 +0200 Subject: [PATCH 0005/1765] Use CryptoCore::SecureArray for passwords --- core/include/AuthenticationCredentials.h | 10 ++++++---- core/include/PlatformUserFunctions.h | 4 +++- core/include/VncClientProtocol.h | 8 +++++--- core/include/VncServerPluginInterface.h | 9 +++++++-- core/src/VncClientProtocol.cpp | 6 +++--- plugins/demo/DemoFeaturePlugin.cpp | 4 ++-- plugins/demo/DemoServer.cpp | 2 +- plugins/demo/DemoServer.h | 3 ++- plugins/platform/windows/WindowsUserFunctions.cpp | 4 ++-- plugins/platform/windows/WindowsUserFunctions.h | 2 +- plugins/vncserver/external/ExternalVncServer.cpp | 6 +++--- plugins/vncserver/external/ExternalVncServer.h | 4 ++-- .../ultravnc-builtin/BuiltinUltraVncServer.cpp | 6 +++--- .../vncserver/ultravnc-builtin/BuiltinUltraVncServer.h | 8 ++++---- .../vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp | 6 +++--- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h | 4 ++-- server/src/ComputerControlClient.cpp | 2 +- server/src/ComputerControlClient.h | 4 +++- server/src/ComputerControlServer.cpp | 2 +- server/src/ComputerControlServer.h | 2 +- server/src/VncProxyConnectionFactory.h | 9 +++++++-- server/src/VncProxyServer.cpp | 2 +- server/src/VncProxyServer.h | 7 +++++-- server/src/VncServer.cpp | 4 ++-- server/src/VncServer.h | 6 +++++- 25 files changed, 75 insertions(+), 49 deletions(-) diff --git a/core/include/AuthenticationCredentials.h b/core/include/AuthenticationCredentials.h index eb33db753..1b610b499 100644 --- a/core/include/AuthenticationCredentials.h +++ b/core/include/AuthenticationCredentials.h @@ -24,24 +24,26 @@ #pragma once -#include "VeyonCore.h" +#include "CryptoCore.h" // clazy:excludeall=rule-of-three class VEYON_CORE_EXPORT AuthenticationCredentials { public: - void setInternalVncServerPassword( const QString& password ) + using Password = CryptoCore::SecureArray; + + void setInternalVncServerPassword( const Password& password ) { m_internalVncServerPassword = password; } - const QString& internalVncServerPassword() const + const Password& internalVncServerPassword() const { return m_internalVncServerPassword; } private: - QString m_internalVncServerPassword; + Password m_internalVncServerPassword; } ; diff --git a/core/include/PlatformUserFunctions.h b/core/include/PlatformUserFunctions.h index 9b8430e94..990ee1916 100644 --- a/core/include/PlatformUserFunctions.h +++ b/core/include/PlatformUserFunctions.h @@ -32,6 +32,8 @@ class PlatformUserFunctions { public: + using Password = CryptoCore::SecureArray; + virtual ~PlatformUserFunctions() = default; virtual QString fullName( const QString& username ) = 0; @@ -45,6 +47,6 @@ class PlatformUserFunctions virtual bool logon( const QString& username, const QString& password ) = 0; virtual void logoff() = 0; - virtual bool authenticate( const QString& username, const CryptoCore::SecureArray& password ) = 0; + virtual bool authenticate( const QString& username, const Password& password ) = 0; }; diff --git a/core/include/VncClientProtocol.h b/core/include/VncClientProtocol.h index 8b03fd2f8..efaa58a60 100644 --- a/core/include/VncClientProtocol.h +++ b/core/include/VncClientProtocol.h @@ -28,7 +28,7 @@ #include "rfb/rfbproto.h" -#include "VeyonCore.h" +#include "CryptoCore.h" class QBuffer; class QTcpSocket; @@ -36,6 +36,8 @@ class QTcpSocket; class VEYON_CORE_EXPORT VncClientProtocol { public: + using Password = CryptoCore::SecureArray; + enum State { Disconnected, Protocol, @@ -47,7 +49,7 @@ class VEYON_CORE_EXPORT VncClientProtocol StateCount } ; - VncClientProtocol( QTcpSocket* socket, const QString& vncPassword ); + VncClientProtocol( QTcpSocket* socket, const Password& vncPassword ); State state() const { @@ -124,7 +126,7 @@ class VEYON_CORE_EXPORT VncClientProtocol QTcpSocket* m_socket; State m_state; - QByteArray m_vncPassword; + Password m_vncPassword; QByteArray m_serverInitMessage; diff --git a/core/include/VncServerPluginInterface.h b/core/include/VncServerPluginInterface.h index bc3beea09..ca22eda37 100644 --- a/core/include/VncServerPluginInterface.h +++ b/core/include/VncServerPluginInterface.h @@ -24,6 +24,7 @@ #pragma once +#include "CryptoCore.h" #include "PluginInterface.h" // clazy:excludeall=copyable-polymorphic @@ -31,6 +32,10 @@ class VncServerPluginInterface { public: + using Password = CryptoCore::SecureArray; + + virtual ~VncServerPluginInterface() = default; + /*! * \brief Create configuration widget for VNC server plugin - used in Configurator */ @@ -43,11 +48,11 @@ class VncServerPluginInterface * \param serverPort the port the VNC server should listen at * \param password the password to be used for VNC authentication */ - virtual void runServer( int serverPort, const QString& password ) = 0; + virtual void runServer( int serverPort, const Password& password ) = 0; virtual int configuredServerPort() = 0; - virtual QString configuredPassword() = 0; + virtual Password configuredPassword() = 0; } ; diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 865a55f0d..461056f01 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -66,10 +66,10 @@ vncEncryptBytes(unsigned char *bytes, const char *passwd, size_t passwd_length) -VncClientProtocol::VncClientProtocol( QTcpSocket* socket, const QString& vncPassword ) : +VncClientProtocol::VncClientProtocol( QTcpSocket* socket, const Password& vncPassword ) : m_socket( socket ), m_state( Disconnected ), - m_vncPassword( vncPassword.toUtf8() ), + m_vncPassword( vncPassword ), m_serverInitMessage(), m_pixelFormat( { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ), m_framebufferWidth( 0 ), @@ -485,7 +485,7 @@ bool VncClientProtocol::receiveCutTextMessage() return false; } - return readMessage( sz_rfbServerCutTextMsg + qFromBigEndian( message.length ) ); + return readMessage( sz_rfbServerCutTextMsg + static_cast( qFromBigEndian( message.length ) ) ); } diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 216700ae9..bb10cddbf 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -176,7 +176,7 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonServerInterface& server, server.featureWorkerManager(). sendMessage( FeatureMessage( m_demoServerFeature.uid(), StartDemoServer ). addArgument( VncServerPort, VeyonCore::config().vncServerPort() + VeyonCore::sessionId() ). - addArgument( VncServerPassword, VeyonCore::authenticationCredentials().internalVncServerPassword() ). + addArgument( VncServerPassword, VeyonCore::authenticationCredentials().internalVncServerPassword().toByteArray() ). addArgument( DemoAccessToken, message.argument( DemoAccessToken ) ) ); } else @@ -248,7 +248,7 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worker, cons m_authentication.setAccessToken( message.argument( DemoAccessToken ).toByteArray() ); m_demoServer = new DemoServer( message.argument( VncServerPort ).toInt(), - message.argument( VncServerPassword ).toString(), + message.argument( VncServerPassword ).toByteArray(), m_authentication, m_configuration, this ); diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 03e1e3d4d..c41e90826 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -32,7 +32,7 @@ #include "VeyonConfiguration.h" -DemoServer::DemoServer( int vncServerPort, const QString& vncServerPassword, const DemoAuthentication& authentication, +DemoServer::DemoServer( int vncServerPort, const Password& vncServerPassword, const DemoAuthentication& authentication, const DemoConfiguration& configuration, QObject *parent ) : QObject( parent ), m_authentication( authentication ), diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index 2bcec6c95..62f5439c6 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -39,9 +39,10 @@ class DemoServer : public QObject { Q_OBJECT public: + using Password = CryptoCore::SecureArray; using MessageList = QVector; - DemoServer( int vncServerPort, const QString& vncServerPassword, const DemoAuthentication& authentication, + DemoServer( int vncServerPort, const Password& vncServerPassword, const DemoAuthentication& authentication, const DemoConfiguration& configuration, QObject *parent ); ~DemoServer() override; diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 4b94054f8..dd3c2557a 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -356,7 +356,7 @@ void WindowsUserFunctions::logoff() -bool WindowsUserFunctions::authenticate( const QString& username, const QString& password ) +bool WindowsUserFunctions::authenticate( const QString& username, const Password& password ) { QString domain; QString user; @@ -374,7 +374,7 @@ bool WindowsUserFunctions::authenticate( const QString& username, const QString& auto domainWide = WindowsCoreFunctions::toWCharArray( domain ); auto userWide = WindowsCoreFunctions::toWCharArray( user ); - auto passwordWide = WindowsCoreFunctions::toWCharArray( password ); + auto passwordWide = WindowsCoreFunctions::toWCharArray( QString::fromUtf8( password.toByteArray() ) ); bool result = false; diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index dcffeff0f..8c939823c 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -42,7 +42,7 @@ class WindowsUserFunctions : public PlatformUserFunctions bool logon( const QString& username, const QString& password ) override; void logoff() override; - bool authenticate( const QString& username, const QString& password ) override; + bool authenticate( const QString& username, const Password& password ) override; private: diff --git a/plugins/vncserver/external/ExternalVncServer.cpp b/plugins/vncserver/external/ExternalVncServer.cpp index 448ddce2a..13836ca5c 100644 --- a/plugins/vncserver/external/ExternalVncServer.cpp +++ b/plugins/vncserver/external/ExternalVncServer.cpp @@ -67,7 +67,7 @@ void ExternalVncServer::prepareServer() -void ExternalVncServer::runServer( int serverPort, const QString& password ) +void ExternalVncServer::runServer( int serverPort, const Password& password ) { Q_UNUSED(serverPort); Q_UNUSED(password); @@ -84,9 +84,9 @@ int ExternalVncServer::configuredServerPort() -QString ExternalVncServer::configuredPassword() +ExternalVncServer::Password ExternalVncServer::configuredPassword() { - return m_configuration.password().plainText(); + return m_configuration.password().plainText().toUtf8(); } diff --git a/plugins/vncserver/external/ExternalVncServer.h b/plugins/vncserver/external/ExternalVncServer.h index 5d28c3e93..3b1ac0293 100644 --- a/plugins/vncserver/external/ExternalVncServer.h +++ b/plugins/vncserver/external/ExternalVncServer.h @@ -77,11 +77,11 @@ class ExternalVncServer : public QObject, VncServerPluginInterface, PluginInterf void prepareServer() override; - void runServer( int serverPort, const QString& password ) override; + void runServer( int serverPort, const Password& password ) override; int configuredServerPort() override; - QString configuredPassword() override; + Password configuredPassword() override; private: enum { diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp index 36289611b..83aa1a08b 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp @@ -42,11 +42,11 @@ extern HINSTANCE hInstResDLL; void ultravnc_veyon_load_password( char* out, int size ) { - const auto password = vncServerInstance->password().toUtf8(); + const auto password = vncServerInstance->password().toByteArray(); if( password.size() == size ) { - memcpy( out, password.constData(), size ); // Flawfinder: ignore + memcpy( out, password.constData(), static_cast( size ) ); // Flawfinder: ignore } else { @@ -195,7 +195,7 @@ void BuiltinUltraVncServer::prepareServer() -void BuiltinUltraVncServer::runServer( int serverPort, const QString& password ) +void BuiltinUltraVncServer::runServer( int serverPort, const Password& password ) { m_serverPort = serverPort; m_password = password; diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h index 187c27c54..481f11245 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h @@ -77,14 +77,14 @@ class BuiltinUltraVncServer : public QObject, VncServerPluginInterface, PluginIn void prepareServer() override; - void runServer( int serverPort, const QString& password ) override; + void runServer( int serverPort, const Password& password ) override; int configuredServerPort() override { return -1; } - QString configuredPassword() override + Password configuredPassword() override { return {}; } @@ -99,7 +99,7 @@ class BuiltinUltraVncServer : public QObject, VncServerPluginInterface, PluginIn return m_serverPort; } - const QString& password() const + const Password& password() const { return m_password; } @@ -110,7 +110,7 @@ class BuiltinUltraVncServer : public QObject, VncServerPluginInterface, PluginIn static constexpr auto DefaultServerPort = 5900; int m_serverPort; - QString m_password; + Password m_password; LogoffEventFilter* m_logoffEventFilter; diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index f0ba0150b..a2fa5f293 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -55,7 +55,7 @@ void BuiltinX11VncServer::prepareServer() -void BuiltinX11VncServer::runServer( int serverPort, const QString& password ) +void BuiltinX11VncServer::runServer( int serverPort, const Password& password ) { QStringList cmdline = { QStringLiteral("-localhost"), QStringLiteral("-nosel"), // do not exchange clipboard-contents @@ -98,7 +98,7 @@ void BuiltinX11VncServer::runServer( int serverPort, const QString& password ) vCritical() << "Could not create temporary file!"; return; } - tempFile.write( password.toLocal8Bit() ); + tempFile.write( password.toByteArray() ); tempFile.close(); cmdline.append( QStringLiteral("-passwdfile") ); @@ -122,7 +122,7 @@ void BuiltinX11VncServer::runServer( int serverPort, const QString& password ) x11vnc.waitForFinished( -1 ); } #else - cmdline.append( { QStringLiteral("-passwd"), password } ); + cmdline.append( { QStringLiteral("-passwd"), QString::fromUtf8( password.toByteArray() ) } ); // build new C-style command line array based on cmdline-QStringList const auto appArguments = QCoreApplication::arguments(); diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h index c678cffdc..021b7cf2d 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h @@ -75,14 +75,14 @@ class BuiltinX11VncServer : public QObject, VncServerPluginInterface, PluginInte void prepareServer() override; - void runServer( int serverPort, const QString& password ) override; + void runServer( int serverPort, const Password& password ) override; int configuredServerPort() override { return -1; } - QString configuredPassword() override + Password configuredPassword() override { return {}; } diff --git a/server/src/ComputerControlClient.cpp b/server/src/ComputerControlClient.cpp index 9bf579d2f..01bb31e1a 100644 --- a/server/src/ComputerControlClient.cpp +++ b/server/src/ComputerControlClient.cpp @@ -32,7 +32,7 @@ ComputerControlClient::ComputerControlClient( ComputerControlServer* server, QTcpSocket* clientSocket, int vncServerPort, - const QString& vncServerPassword, + const Password& vncServerPassword, QObject* parent ) : VncProxyConnection( clientSocket, vncServerPort, parent ), m_server( server ), diff --git a/server/src/ComputerControlClient.h b/server/src/ComputerControlClient.h index a2dc24f3e..0cb66afbe 100644 --- a/server/src/ComputerControlClient.h +++ b/server/src/ComputerControlClient.h @@ -35,10 +35,12 @@ class ComputerControlClient : public VncProxyConnection { Q_OBJECT public: + using Password = CryptoCore::SecureArray; + ComputerControlClient( ComputerControlServer* server, QTcpSocket* clientSocket, int vncServerPort, - const QString& vncServerPassword, + const Password& vncServerPassword, QObject* parent ); ~ComputerControlClient() override; diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index e861e5c63..c320b82a8 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -93,7 +93,7 @@ bool ComputerControlServer::start() VncProxyConnection* ComputerControlServer::createVncProxyConnection( QTcpSocket* clientSocket, int vncServerPort, - const QString& vncServerPassword, + const Password& vncServerPassword, QObject* parent ) { return new ComputerControlClient( this, clientSocket, vncServerPort, vncServerPassword, parent ); diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index fc02baed2..3f7ea4db4 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -47,7 +47,7 @@ class ComputerControlServer : public QObject, VncProxyConnectionFactory, VeyonSe VncProxyConnection* createVncProxyConnection( QTcpSocket* clientSocket, int vncServerPort, - const QString& vncServerPassword, + const Password& vncServerPassword, QObject* parent ) override; ServerAuthenticationManager& authenticationManager() diff --git a/server/src/VncProxyConnectionFactory.h b/server/src/VncProxyConnectionFactory.h index 88b2327c6..a5e65c24c 100644 --- a/server/src/VncProxyConnectionFactory.h +++ b/server/src/VncProxyConnectionFactory.h @@ -24,7 +24,8 @@ #pragma once -class QObject; +#include "CryptoCore.h" + class QTcpSocket; class VncProxyConnection; @@ -33,9 +34,13 @@ class VncProxyConnection; class VncProxyConnectionFactory { public: + using Password = CryptoCore::SecureArray; + + virtual ~VncProxyConnectionFactory() = default; + virtual VncProxyConnection* createVncProxyConnection( QTcpSocket* clientSocket, int vncServerPort, - const QString& vncServerPassword, + const Password& vncServerPassword, QObject* parent ) = 0; } ; diff --git a/server/src/VncProxyServer.cpp b/server/src/VncProxyServer.cpp index 0a792bbab..6d16e2d31 100644 --- a/server/src/VncProxyServer.cpp +++ b/server/src/VncProxyServer.cpp @@ -55,7 +55,7 @@ VncProxyServer::~VncProxyServer() -bool VncProxyServer::start( int vncServerPort, const QString& vncServerPassword ) +bool VncProxyServer::start( int vncServerPort, const Password& vncServerPassword ) { m_vncServerPort = vncServerPort; m_vncServerPassword = vncServerPassword; diff --git a/server/src/VncProxyServer.h b/server/src/VncProxyServer.h index 29ab25bd4..5f7e9d6f2 100644 --- a/server/src/VncProxyServer.h +++ b/server/src/VncProxyServer.h @@ -27,6 +27,8 @@ #include #include +#include "CryptoCore.h" + class QTcpServer; class VncProxyConnection; class VncProxyConnectionFactory; @@ -35,6 +37,7 @@ class VncProxyServer : public QObject { Q_OBJECT public: + using Password = CryptoCore::SecureArray; using VncProxyConnectionList = QVector; VncProxyServer( const QHostAddress& listenAddress, @@ -43,7 +46,7 @@ class VncProxyServer : public QObject QObject* parent = nullptr ); ~VncProxyServer() override; - bool start( int vncServerPort, const QString& vncServerPassword ); + bool start( int vncServerPort, const Password& vncServerPassword ); void stop(); const VncProxyConnectionList& clients() const @@ -56,7 +59,7 @@ class VncProxyServer : public QObject void closeConnection( VncProxyConnection* ); int m_vncServerPort; - QString m_vncServerPassword; + Password m_vncServerPassword; QHostAddress m_listenAddress; int m_listenPort; QTcpServer* m_server; diff --git a/server/src/VncServer.cpp b/server/src/VncServer.cpp index 0e41f9472..1655d57fa 100644 --- a/server/src/VncServer.cpp +++ b/server/src/VncServer.cpp @@ -38,7 +38,7 @@ VncServer::VncServer( QObject* parent ) : m_pluginInterface( nullptr ) { VeyonCore::authenticationCredentials().setInternalVncServerPassword( - QString::fromLatin1( CryptoCore::generateChallenge().toBase64().left( MAXPWLEN ) ) ); + CryptoCore::generateChallenge().toBase64().left( MAXPWLEN ) ); VncServerPluginInterfaceList defaultVncServerPlugins; @@ -106,7 +106,7 @@ int VncServer::serverPort() const -QString VncServer::password() const +VncServer::Password VncServer::password() const { if( m_pluginInterface && m_pluginInterface->configuredPassword().isEmpty() == false ) { diff --git a/server/src/VncServer.h b/server/src/VncServer.h index 472425ec7..d72b490db 100644 --- a/server/src/VncServer.h +++ b/server/src/VncServer.h @@ -27,12 +27,16 @@ #include +#include "CryptoCore.h" + class VncServerPluginInterface; class VncServer : public QThread { Q_OBJECT public: + using Password = CryptoCore::SecureArray; + explicit VncServer( QObject* parent = nullptr ); ~VncServer() override; @@ -40,7 +44,7 @@ class VncServer : public QThread int serverPort() const; - QString password() const; + Password password() const; private: void run() override; From dcc1bdd35a9df6b18081763b126cd0da380c2d62 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 13:42:06 +0200 Subject: [PATCH 0006/1765] Bump to development version --- CMakeLists.txt | 4 ++-- project.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e6a012054..a869cb0c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,8 +74,8 @@ ENDIF() # can't retrieve version information as not building from Git repository? IF(NOT VERSION_STRING) SET(VERSION_MAJOR 4) - SET(VERSION_MINOR 2) - SET(VERSION_PATCH 3) + SET(VERSION_MINOR 99) + SET(VERSION_PATCH 0) SET(VERSION_BUILD 0) SET(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") ELSE() diff --git a/project.yml b/project.yml index 569e6bbda..3e7051eb3 100644 --- a/project.yml +++ b/project.yml @@ -1,6 +1,6 @@ project: name: Veyon - version: 4.2.3 + version: 4.99.0 copyright: 2004-2019 author: Tobias Junghans contact: Tobias Junghans From b4fc25ccacf44c55f9d3e6b2c33daf689fcd2911 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 13:42:53 +0200 Subject: [PATCH 0007/1765] Update translations --- translations/ru.ts | 12 ++++++------ translations/uk.ts | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/translations/ru.ts b/translations/ru.ts index b86bb29ec..527f181ff 100644 --- a/translations/ru.ts +++ b/translations/ru.ts @@ -319,7 +319,7 @@ If you're interested in translating Veyon into your local or another langua AndroidPlatformConfigurationPage Android - + Android General @@ -330,7 +330,7 @@ If you're interested in translating Veyon into your local or another langua AndroidPlatformPlugin Plugin implementing specific functions for the Android platform - + В плагине реализованы специфические возможности для платформы Android @@ -1479,11 +1479,11 @@ The public key is used on client computers to authenticate incoming connection r Handout - + Бесплатный образец Texts to read - + Фрагменты текста для чтения @@ -2750,7 +2750,7 @@ USAGE Plugin implementing specific functions for the Linux platform - + В плагине реализованы специфические возможности для платформы Linux @@ -4157,7 +4157,7 @@ Typically this is required to support terminal servers. Plugin implementing specific functions for the Windows platform - + В плагине реализованы специфические возможности для платформы Windows diff --git a/translations/uk.ts b/translations/uk.ts index 5e4616f12..e8e1e92dd 100644 --- a/translations/uk.ts +++ b/translations/uk.ts @@ -319,7 +319,7 @@ If you're interested in translating Veyon into your local or another langua AndroidPlatformConfigurationPage Android - + Android General @@ -330,7 +330,7 @@ If you're interested in translating Veyon into your local or another langua AndroidPlatformPlugin Plugin implementing specific functions for the Android platform - + У додатку реалізовано специфічні можливості для платформи Android @@ -1476,11 +1476,11 @@ The public key is used on client computers to authenticate incoming connection r Handout - + Безкоштовний зразок Texts to read - + Фрагменти тексту для читання @@ -2749,7 +2749,7 @@ USAGE Plugin implementing specific functions for the Linux platform - + У додатку реалізовано специфічні можливості для платформи Linux @@ -4156,7 +4156,7 @@ Typically this is required to support terminal servers. Plugin implementing specific functions for the Windows platform - + У додатку реалізовано специфічні можливості для платформи Windows From 9fb975174e7dee01324389e54895b1c67cf146bc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 14:21:35 +0200 Subject: [PATCH 0008/1765] Improve credentials mangement and verification --- configurator/src/GeneralConfigurationPage.cpp | 3 ++- core/include/AuthenticationPluginInterface.h | 3 +-- core/include/DummyAuthentication.h | 2 +- master/src/MainWindow.cpp | 20 ++--------------- plugins/authkeys/AuthKeysPlugin.cpp | 14 ++++++++---- plugins/authkeys/AuthKeysPlugin.h | 3 +-- plugins/authlogon/AuthLogonPlugin.cpp | 22 ++++++++++++++++--- plugins/authlogon/AuthLogonPlugin.h | 2 +- plugins/demo/DemoAuthentication.cpp | 2 +- plugins/demo/DemoAuthentication.h | 2 +- plugins/demo/DemoFeaturePlugin.cpp | 10 ++++----- plugins/demo/DemoFeaturePlugin.h | 2 +- .../RemoteAccessFeaturePlugin.cpp | 11 +++------- 13 files changed, 47 insertions(+), 49 deletions(-) diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index 3a9a7f3bd..da65bdc8b 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -127,7 +127,8 @@ void GeneralConfigurationPage::testAuthentication() { VeyonCore::authenticationManager().reloadConfiguration(); - if( VeyonCore::authenticationManager().configuredPlugin()->testConfiguration() ) + if( VeyonCore::authenticationManager().configuredPlugin()->initializeCredentials() && + VeyonCore::authenticationManager().configuredPlugin()->checkCredentials() ) { QMessageBox::information( this, AuthenticationPluginInterface::authenticationTestTitle(), tr( "Authentication is set up properly on this computer." ) ); diff --git a/core/include/AuthenticationPluginInterface.h b/core/include/AuthenticationPluginInterface.h index a43e15042..510cb0d7f 100644 --- a/core/include/AuthenticationPluginInterface.h +++ b/core/include/AuthenticationPluginInterface.h @@ -39,8 +39,7 @@ class VEYON_CORE_EXPORT AuthenticationPluginInterface virtual bool initializeCredentials() = 0; virtual bool hasCredentials() const = 0; - - virtual bool testConfiguration() const = 0; + virtual bool checkCredentials() const = 0; // server side authentication virtual VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const = 0; diff --git a/core/include/DummyAuthentication.h b/core/include/DummyAuthentication.h index b0aa11372..158cd4db9 100644 --- a/core/include/DummyAuthentication.h +++ b/core/include/DummyAuthentication.h @@ -47,7 +47,7 @@ class DummyAuthentication : public AuthenticationPluginInterface return false; } - bool testConfiguration() const override + bool checkCredentials() const override { return false; } diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 6c8dec4bd..40bbb973c 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -174,24 +174,8 @@ MainWindow::~MainWindow() bool MainWindow::initAuthentication() { - if( VeyonCore::instance()->initAuthentication() ) - { - return true; - } - - if( VeyonCore::config().authenticationMethod() == VeyonCore::AuthenticationMethod::KeyFileAuthentication ) - { - QMessageBox::information( nullptr, - tr( "Authentication impossible" ), - tr( "No authentication key files were found or your current ones " - "are outdated. Please create new key files using the %1 " - "Configurator. Alternatively set up logon authentication " - "using the %1 Configurator. Otherwise you won't be " - "able to access computers using %1." ).arg( VeyonCore::applicationName() ) ); - - } - - return false; + return VeyonCore::authenticationManager().configuredPlugin()->initializeCredentials() && + VeyonCore::authenticationManager().configuredPlugin()->checkCredentials(); } diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index 548a5ab81..cb0d30379 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -95,12 +95,18 @@ bool AuthKeysPlugin::hasCredentials() const -bool AuthKeysPlugin::testConfiguration() const +bool AuthKeysPlugin::checkCredentials() const { - if( VeyonCore::instance()->initAuthentication() == false ) + if( hasCredentials() == false ) { - QMessageBox::critical( QApplication::activeWindow(), authenticationTestTitle(), - tr( "Authentication keys are not set up properly on this computer." ) ); + vWarning() << "Authentication key files not set up properly!"; + + QMessageBox::critical( QApplication::activeWindow(), + authenticationTestTitle(), + tr( "Authentication key files are not set up properly on this computer. " + "Please create new key files or switch to a different authentication method " + "using the Veyon Configurator." ) ); + return false; } diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index 8a6813163..38750f0c8 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -85,8 +85,7 @@ class AuthKeysPlugin : public QObject, bool initializeCredentials() override; bool hasCredentials() const override; - - bool testConfiguration() const override; + bool checkCredentials() const override; // server side authentication VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index fc6ee7a33..4b77b2f38 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -23,14 +23,15 @@ */ #include +#include #include "AuthLogonPlugin.h" -#include "Filesystem.h" #include "PasswordDialog.h" #include "PlatformUserFunctions.h" #include "VariantArrayMessage.h" #include "VeyonConfiguration.h" + AuthLogonPlugin::AuthLogonPlugin( QObject* parent ) : QObject( parent ) { @@ -40,6 +41,9 @@ AuthLogonPlugin::AuthLogonPlugin( QObject* parent ) : bool AuthLogonPlugin::initializeCredentials() { + m_username.clear(); + m_password.clear(); + if( qobject_cast( QCoreApplication::instance() ) ) { PasswordDialog passwordDialog( QApplication::activeWindow() ); @@ -64,9 +68,21 @@ bool AuthLogonPlugin::hasCredentials() const -bool AuthLogonPlugin::testConfiguration() const +bool AuthLogonPlugin::checkCredentials() const { - return PasswordDialog( QApplication::activeWindow() ).exec() == PasswordDialog::Accepted; + if( hasCredentials() == false ) + { + vWarning() << "Invalid username or password!"; + + QMessageBox::critical( QApplication::activeWindow(), + authenticationTestTitle(), + tr( "The supplied username or password is wrong. Please enter valid credentials or " + "switch to a different authentication method using the Veyon Configurator." ) ); + + return false; + } + + return true; } diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h index a3b1059f9..0fd7fdaa5 100644 --- a/plugins/authlogon/AuthLogonPlugin.h +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -76,7 +76,7 @@ class AuthLogonPlugin : public QObject, bool initializeCredentials() override; bool hasCredentials() const override; - bool testConfiguration() const override; + bool checkCredentials() const override; VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; diff --git a/plugins/demo/DemoAuthentication.cpp b/plugins/demo/DemoAuthentication.cpp index d92719c3b..762634664 100644 --- a/plugins/demo/DemoAuthentication.cpp +++ b/plugins/demo/DemoAuthentication.cpp @@ -52,7 +52,7 @@ bool DemoAuthentication::hasCredentials() const -bool DemoAuthentication::testConfiguration() const +bool DemoAuthentication::checkCredentials() const { return true; } diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index d76553e6d..035c9f5b3 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -43,7 +43,7 @@ class DemoAuthentication : public QObject, public AuthenticationPluginInterface bool initializeCredentials() override; bool hasCredentials() const override; - bool testConfiguration() const override; + bool checkCredentials() const override; VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index bb10cddbf..5520a1a06 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -24,16 +24,14 @@ #include -#include "DemoServer.h" #include "AuthenticationCredentials.h" #include "Computer.h" -#include "CryptoCore.h" #include "DemoClient.h" #include "DemoConfigurationPage.h" #include "DemoFeaturePlugin.h" -#include "Logger.h" +#include "DemoServer.h" #include "FeatureWorkerManager.h" -#include "VariantArrayMessage.h" +#include "Logger.h" #include "VeyonConfiguration.h" #include "VeyonServerInterface.h" @@ -328,9 +326,9 @@ bool DemoFeaturePlugin::hasCredentials() const -bool DemoFeaturePlugin::testConfiguration() const +bool DemoFeaturePlugin::checkCredentials() const { - return m_authentication.testConfiguration(); + return m_authentication.checkCredentials(); } diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index e922041cb..61eed1d7c 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -102,7 +102,7 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf bool initializeCredentials() override; bool hasCredentials() const override; - bool testConfiguration() const override; + bool checkCredentials() const override; VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 341863951..d16421d26 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -25,7 +25,7 @@ #include #include -#include "AuthenticationCredentials.h" +#include "AuthenticationManager.h" #include "RemoteAccessFeaturePlugin.h" #include "RemoteAccessWidget.h" #include "VeyonMasterInterface.h" @@ -174,13 +174,8 @@ CommandLinePluginInterface::RunResult RemoteAccessFeaturePlugin::handle_help( co bool RemoteAccessFeaturePlugin::initAuthentication() { - if( VeyonCore::instance()->initAuthentication() == false ) - { - vWarning() << "Could not initialize authentication"; - return false; - } - - return true; + return VeyonCore::authenticationManager().configuredPlugin()->initializeCredentials() && + VeyonCore::authenticationManager().configuredPlugin()->checkCredentials(); } From ba8b38f9922c8de2fe13f0cd528074a48c0fe85c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 14:22:21 +0200 Subject: [PATCH 0009/1765] VeyonConfigurationProperties: drop AuthenticationMethod --- core/include/VeyonConfigurationProperties.h | 1 - 1 file changed, 1 deletion(-) diff --git a/core/include/VeyonConfigurationProperties.h b/core/include/VeyonConfigurationProperties.h index 2079d2ea6..24ceb48d7 100644 --- a/core/include/VeyonConfigurationProperties.h +++ b/core/include/VeyonConfigurationProperties.h @@ -101,7 +101,6 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, confirmUnsafeActions, setConfirmUnsafeActions, "ConfirmUnsafeActions", "Master", false, Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_AUTHENTICATION_CONFIG_PROPERTY(OP) \ - OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::AuthenticationMethod, authenticationMethod, setAuthenticationMethod, "Method", "Authentication", QVariant::fromValue(VeyonCore::AuthenticationMethod::LogonAuthentication), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QUuid, authenticationPlugin, setAuthenticationPlugin, "Plugin", "Authentication", QUuid(), Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_KEY_AUTHENTICATION_CONFIG_PROPERTY(OP) \ From 8bed582cd467ecab47937db433902aaebe22eece Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 14:22:43 +0200 Subject: [PATCH 0010/1765] VeyonCore: drop AuthenticationMethod enum --- core/include/VeyonCore.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core/include/VeyonCore.h b/core/include/VeyonCore.h index 19d244505..577d7e7b6 100644 --- a/core/include/VeyonCore.h +++ b/core/include/VeyonCore.h @@ -160,13 +160,6 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject static QString stripDomain( const QString& username ); static QString formattedUuid( QUuid uuid ); - enum class AuthenticationMethod - { - LogonAuthentication, - KeyFileAuthentication, - }; - Q_ENUM(AuthenticationMethod) - int exec(); private: From 446dba12a16d4c3668e54b337b5ef055c35b01a4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 14:22:59 +0200 Subject: [PATCH 0011/1765] VeyonCore: drop initAuthentication() --- core/include/VeyonCore.h | 1 - core/src/VeyonCore.cpp | 7 ------- 2 files changed, 8 deletions(-) diff --git a/core/include/VeyonCore.h b/core/include/VeyonCore.h index 577d7e7b6..69a7601dd 100644 --- a/core/include/VeyonCore.h +++ b/core/include/VeyonCore.h @@ -144,7 +144,6 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject } static void setupApplicationParameters(); - bool initAuthentication(); static bool hasSessionId(); static int sessionId(); diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index a3b43a009..73e7f1d68 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -213,13 +213,6 @@ void VeyonCore::setupApplicationParameters() -bool VeyonCore::initAuthentication() -{ - return m_authenticationManager->configuredPlugin()->initializeCredentials(); -} - - - bool VeyonCore::hasSessionId() { return QProcessEnvironment::systemEnvironment().contains( sessionIdEnvironmentVariable() ); From 9fe0dad098472638b43e6376da05728aded2da5f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 14:23:16 +0200 Subject: [PATCH 0012/1765] Clean up includes --- core/src/VeyonConnection.cpp | 2 -- master/src/MainWindow.cpp | 1 - 2 files changed, 3 deletions(-) diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 04aea64f6..7528ac72d 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -24,9 +24,7 @@ #include "rfb/rfbclient.h" -#include "AuthenticationCredentials.h" #include "AuthenticationManager.h" -#include "CryptoCore.h" #include "PlatformUserFunctions.h" #include "SocketDevice.h" #include "VariantArrayMessage.h" diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 40bbb973c..17d91823c 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -34,7 +34,6 @@ #include "AuthenticationManager.h" #include "MainWindow.h" #include "BuiltinFeatures.h" -#include "AuthenticationCredentials.h" #include "ComputerControlListModel.h" #include "ComputerManager.h" #include "ComputerSelectPanel.h" From 62e85b62945923d68444f5585f6106b0dd6ae541 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 14:25:48 +0200 Subject: [PATCH 0013/1765] MainWindow: remove dead code --- master/src/MainWindow.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 17d91823c..674ce018d 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -153,12 +153,6 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : m_modeGroup->button( static_cast( qHash( VeyonCore::builtinFeatures().monitoringMode().feature().uid() ) ) )->setChecked( true ); - // setup system tray icon - QIcon icon( QStringLiteral(":/core/icon16.png") ); - icon.addFile( QStringLiteral(":/core/icon22.png") ); - icon.addFile( QStringLiteral(":/core/icon32.png") ); - icon.addFile( QStringLiteral(":/core/icon64.png") ); - VeyonCore::enforceBranding( this ); } From 0eb2d45168ff37a0ea8eec327b3869dd100d2b21 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 14:54:27 +0200 Subject: [PATCH 0014/1765] ConfigurationProperty: use object as parent --- core/src/Configuration/Property.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index de1ab6dc7..dce03b89c 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -32,6 +32,7 @@ namespace Configuration Configuration::Property::Property( Object* object, const QString& key, const QString& parentKey, const QVariant& defaultValue, Flags flags ) : + QObject( object ), m_object( object ), m_proxy( nullptr ), m_key( key ), @@ -45,6 +46,7 @@ Configuration::Property::Property( Object* object, const QString& key, const QSt Configuration::Property::Property( Proxy* proxy, const QString& key, const QString& parentKey, const QVariant& defaultValue, Flags flags ) : + QObject( proxy ), m_object( nullptr ), m_proxy( proxy ), m_key( key ), From f40bb4e3759625f558db7d6e90e2196c49b24ec8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 14:54:51 +0200 Subject: [PATCH 0015/1765] ConfigurationProperty: add find() --- core/include/Configuration/Property.h | 2 ++ core/src/Configuration/Property.cpp | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/core/include/Configuration/Property.h b/core/include/Configuration/Property.h index 0726676cc..e3e8f2dfc 100644 --- a/core/include/Configuration/Property.h +++ b/core/include/Configuration/Property.h @@ -82,6 +82,8 @@ class VEYON_CORE_EXPORT Property : public QObject void setVariantValue( const QVariant& value ); + static Property* find( QObject* parent, const QString& key, const QString& parentKey ); + private: Object* m_object; Proxy* m_proxy; diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index dce03b89c..bc0ff101b 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -104,6 +104,22 @@ void Property::setVariantValue( const QVariant& value ) +Property* Property::find( QObject* parent, const QString& key, const QString& parentKey ) +{ + const auto properties = parent->findChildren(); + for( auto property : properties ) + { + if( property->m_key == key && property->m_parentKey == parentKey ) + { + return property; + } + } + + return nullptr; +} + + + template<> Password Configuration::TypedProperty::value() const { From 18209f8f6c74b0f85251ba6d9b35699ea9634252 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 14:56:03 +0200 Subject: [PATCH 0016/1765] Config: determine default value through property If a certain property is not yet set we still want to detect its type through its default value. Closes #546. --- plugins/config/ConfigCommandLinePlugin.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/config/ConfigCommandLinePlugin.cpp b/plugins/config/ConfigCommandLinePlugin.cpp index b013a46ca..ff1e2d280 100644 --- a/plugins/config/ConfigCommandLinePlugin.cpp +++ b/plugins/config/ConfigCommandLinePlugin.cpp @@ -198,7 +198,14 @@ CommandLinePluginInterface::RunResult ConfigCommandLinePlugin::handle_set( const parentKey = keyParts.mid( 0, keyParts.size()-1).join( QLatin1Char('/') ); } - const auto valueType = VeyonCore::config().value( key, parentKey, {} ).userType(); + auto valueType = QMetaType::UnknownType; + const auto property = Configuration::Property::find( &VeyonCore::config(), key, parentKey ); + + if( property ) + { + valueType = static_cast( property->variantValue().userType() ); + } + QVariant configValue = value; if( type == QLatin1String("json") || From 54008e0b4cd0f34276d412b902a697335abd6e36 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 16:03:31 +0200 Subject: [PATCH 0017/1765] GeneralConfigurationPage: hide auth plugins without name --- configurator/src/GeneralConfigurationPage.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index da65bdc8b..f34b0b484 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -78,7 +78,10 @@ GeneralConfigurationPage::GeneralConfigurationPage() : const auto authenticationPlugin = VeyonCore::authenticationManager().availableTypes(); for( auto it = authenticationPlugin.constBegin(), end = authenticationPlugin.constEnd(); it != end; ++it ) { - ui->authenticationPlugin->addItem( it.value(), it.key() ); + if( it.value().isEmpty() == false ) + { + ui->authenticationPlugin->addItem( it.value(), it.key() ); + } } connect( ui->testAuthenticationButton, &QPushButton::clicked, this, &GeneralConfigurationPage::testAuthentication ); From 887e445fa1f0c59987376ac97391294158debe73 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 16:03:52 +0200 Subject: [PATCH 0018/1765] DemoAuthentication: use empty name --- plugins/demo/DemoAuthentication.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index 035c9f5b3..16503859e 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -37,7 +37,7 @@ class DemoAuthentication : public QObject, public AuthenticationPluginInterface QString authenticationTypeName() const override { - return tr( "Demo authentication" ); + return {}; } bool initializeCredentials() override; From fb93c5c559d36af16b6c1136821fa85766b7ed76 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 16:36:29 +0200 Subject: [PATCH 0019/1765] PluginManager: add find() method Allows to find specific interface instances with any kind of filter. --- core/include/PluginManager.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/include/PluginManager.h b/core/include/PluginManager.h index 71ad2faf9..e353431b6 100644 --- a/core/include/PluginManager.h +++ b/core/include/PluginManager.h @@ -60,6 +60,21 @@ class VEYON_CORE_EXPORT PluginManager : public QObject PluginInterface* pluginInterface( Plugin::Uid pluginUid ); + template + InterfaceType* find( const std::function& filter = []() { return true; } ) + { + for( auto object : m_pluginObjects ) + { + auto pluginInterface = qobject_cast( object ); + if( pluginInterface && filter( qobject_cast( object ) ) ) + { + return pluginInterface; + } + } + + return nullptr; + } + QString pluginName( Plugin::Uid pluginUid ) const; private: From b5b17102e401795c210c65bc6eeb107a9635e3a6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 16:38:53 +0200 Subject: [PATCH 0020/1765] PluginManager: drop unused pluginInterface() --- core/include/PluginManager.h | 2 -- core/src/PluginManager.cpp | 15 --------------- 2 files changed, 17 deletions(-) diff --git a/core/include/PluginManager.h b/core/include/PluginManager.h index e353431b6..0e4e035ed 100644 --- a/core/include/PluginManager.h +++ b/core/include/PluginManager.h @@ -58,8 +58,6 @@ class VEYON_CORE_EXPORT PluginManager : public QObject PluginUidList pluginUids() const; - PluginInterface* pluginInterface( Plugin::Uid pluginUid ); - template InterfaceType* find( const std::function& filter = []() { return true; } ) { diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index 12c4b51c3..a1e204352 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -117,21 +117,6 @@ PluginUidList PluginManager::pluginUids() const -PluginInterface* PluginManager::pluginInterface( Plugin::Uid pluginUid ) -{ - for( auto pluginInterface : qAsConst( m_pluginInterfaces ) ) - { - if( pluginInterface->uid() == pluginUid ) - { - return pluginInterface; - } - } - - return nullptr; -} - - - QString PluginManager::pluginName( Plugin::Uid pluginUid ) const { for( auto pluginInterface : m_pluginInterfaces ) From 78f46479f229c71d389490fb6b6933479442ed66 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 16:41:23 +0200 Subject: [PATCH 0021/1765] DocumentationFigureCreator: drop PasswordDialog dependency --- master/src/DocumentationFigureCreator.cpp | 31 +++++++++++++---------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index ab16d4626..d1d5832bd 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -37,13 +37,13 @@ #include #include +#include "AuthenticationPluginInterface.h" #include "ComputerMonitoringWidget.h" #include "DocumentationFigureCreator.h" #include "FeatureManager.h" #include "LocationDialog.h" #include "MainToolBar.h" #include "MainWindow.h" -#include "PasswordDialog.h" #include "Plugin.h" #include "PluginManager.h" #include "Screenshot.h" @@ -75,10 +75,10 @@ void DocumentationFigureCreator::run() hideComputers(); - createFeatureFigures(); - createContextMenuFigure(); +/* createFeatureFigures(); + createContextMenuFigure();*/ createLogonDialogFigure(); - createLocationDialogFigure(); +/* createLocationDialogFigure(); createScreenshotManagementPanelFigure(); createTextMessageDialogFigure(); createOpenWebsiteDialogFigure(); @@ -89,7 +89,7 @@ void DocumentationFigureCreator::run() createRemoteAccessWindowFigure(); createPowerDownOptionsFigure(); createPowerDownTimeInputDialogFigure(); - createFileTransferDialogFigure(); + createFileTransferDialogFigure();*/ } @@ -176,15 +176,20 @@ void DocumentationFigureCreator::createContextMenuFigure() void DocumentationFigureCreator::createLogonDialogFigure() { - PasswordDialog dialog( m_master->mainWindow() ); - dialog.show(); - dialog.findChild( QStringLiteral("password") )->setText( QStringLiteral( "TeacherPassword") ); - dialog.findChild( QStringLiteral("password") )->cursorForward( false ); - dialog.findChild( QStringLiteral("username") )->setText( tr( "Teacher") ); + auto authLogonPlugin = VeyonCore::pluginManager().find( + []( const PluginInterface* plugin ) { return plugin->name() == QStringLiteral("AuthLogon"); } ); - grabDialog( &dialog, {}, QStringLiteral("LogonDialog.png") ); - - dialog.exec(); + if( authLogonPlugin ) + { + scheduleUiOperation( []() { + auto dialog = dynamic_cast( QApplication::activeWindow() ); + dialog->findChild( QStringLiteral("password") )->setText( QStringLiteral( "TeacherPassword") ); + dialog->findChild( QStringLiteral("password") )->cursorForward( false ); + dialog->findChild( QStringLiteral("username") )->setText( tr( "Teacher") ); + grabDialog( dialog, {}, QStringLiteral("LogonDialog.png") ); + } ); + authLogonPlugin->initializeCredentials(); + } } From 6a6f905c88712c1c96c3fe55f890a1c2314e68ae Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 16:42:14 +0200 Subject: [PATCH 0022/1765] GeneralConfigurationPage: drop unused include --- configurator/src/GeneralConfigurationPage.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index f34b0b484..b3a0f54e3 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -31,7 +31,6 @@ #include "Filesystem.h" #include "FileSystemBrowser.h" #include "NetworkObjectDirectoryManager.h" -#include "PasswordDialog.h" #include "PlatformFilesystemFunctions.h" #include "PlatformUserFunctions.h" #include "PluginManager.h" From 3e9e3d84c923836a43f6c5976b19c1e3c5c4a9be Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 16:42:34 +0200 Subject: [PATCH 0023/1765] Move PasswordDialog from Core to AuthLogon plugin --- plugins/authlogon/CMakeLists.txt | 3 +++ {core/src => plugins/authlogon}/PasswordDialog.cpp | 0 {core/include => plugins/authlogon}/PasswordDialog.h | 0 {core/src => plugins/authlogon}/PasswordDialog.ui | 0 4 files changed, 3 insertions(+) rename {core/src => plugins/authlogon}/PasswordDialog.cpp (100%) rename {core/include => plugins/authlogon}/PasswordDialog.h (100%) rename {core/src => plugins/authlogon}/PasswordDialog.ui (100%) diff --git a/plugins/authlogon/CMakeLists.txt b/plugins/authlogon/CMakeLists.txt index b84778281..e8b9e2b26 100644 --- a/plugins/authlogon/CMakeLists.txt +++ b/plugins/authlogon/CMakeLists.txt @@ -3,4 +3,7 @@ INCLUDE(BuildPlugin) BUILD_PLUGIN(authlogon AuthLogonPlugin.cpp AuthLogonPlugin.h + PasswordDialog.cpp + PasswordDialog.h + PasswordDialog.ui ) diff --git a/core/src/PasswordDialog.cpp b/plugins/authlogon/PasswordDialog.cpp similarity index 100% rename from core/src/PasswordDialog.cpp rename to plugins/authlogon/PasswordDialog.cpp diff --git a/core/include/PasswordDialog.h b/plugins/authlogon/PasswordDialog.h similarity index 100% rename from core/include/PasswordDialog.h rename to plugins/authlogon/PasswordDialog.h diff --git a/core/src/PasswordDialog.ui b/plugins/authlogon/PasswordDialog.ui similarity index 100% rename from core/src/PasswordDialog.ui rename to plugins/authlogon/PasswordDialog.ui From 9cb3f8acfaff189c856127cfa1e4f30167ec7aa3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jul 2019 16:46:41 +0200 Subject: [PATCH 0024/1765] AuthLogon: rename PasswordDialog to AuthLogonDialog --- ...PasswordDialog.cpp => AuthLogonDialog.cpp} | 20 +++++++++---------- .../{PasswordDialog.h => AuthLogonDialog.h} | 12 +++++------ .../{PasswordDialog.ui => AuthLogonDialog.ui} | 16 +++++++-------- plugins/authlogon/AuthLogonPlugin.cpp | 10 +++++----- plugins/authlogon/CMakeLists.txt | 6 +++--- 5 files changed, 32 insertions(+), 32 deletions(-) rename plugins/authlogon/{PasswordDialog.cpp => AuthLogonDialog.cpp} (80%) rename plugins/authlogon/{PasswordDialog.h => AuthLogonDialog.h} (81%) rename plugins/authlogon/{PasswordDialog.ui => AuthLogonDialog.ui} (90%) diff --git a/plugins/authlogon/PasswordDialog.cpp b/plugins/authlogon/AuthLogonDialog.cpp similarity index 80% rename from plugins/authlogon/PasswordDialog.cpp rename to plugins/authlogon/AuthLogonDialog.cpp index 6cf08e84d..7d8f6e89a 100644 --- a/plugins/authlogon/PasswordDialog.cpp +++ b/plugins/authlogon/AuthLogonDialog.cpp @@ -1,5 +1,5 @@ /* - * PasswordDialog.cpp - dialog for querying logon credentials + * AuthLogonDialog.cpp - dialog for querying logon credentials * * Copyright (c) 2010-2019 Tobias Junghans * @@ -25,15 +25,15 @@ #include #include -#include "PasswordDialog.h" +#include "AuthLogonDialog.h" #include "PlatformUserFunctions.h" -#include "ui_PasswordDialog.h" +#include "ui_AuthLogonDialog.h" -PasswordDialog::PasswordDialog( QWidget *parent ) : +AuthLogonDialog::AuthLogonDialog( QWidget *parent ) : QDialog( parent ), - ui( new Ui::PasswordDialog ) + ui( new Ui::AuthLogonDialog ) { ui->setupUi( this ); @@ -51,28 +51,28 @@ PasswordDialog::PasswordDialog( QWidget *parent ) : -PasswordDialog::~PasswordDialog() +AuthLogonDialog::~AuthLogonDialog() { delete ui; } -QString PasswordDialog::username() const +QString AuthLogonDialog::username() const { return ui->username->text(); } -CryptoCore::SecureArray PasswordDialog::password() const +CryptoCore::SecureArray AuthLogonDialog::password() const { return ui->password->text().toUtf8(); } -void PasswordDialog::accept() +void AuthLogonDialog::accept() { if( VeyonCore::platform().userFunctions().authenticate( username(), password() ) == false ) { @@ -88,7 +88,7 @@ void PasswordDialog::accept() -void PasswordDialog::updateOkButton() +void AuthLogonDialog::updateOkButton() { ui->buttonBox->button( QDialogButtonBox::Ok )-> setEnabled( !username().isEmpty() && !password().isEmpty() ); diff --git a/plugins/authlogon/PasswordDialog.h b/plugins/authlogon/AuthLogonDialog.h similarity index 81% rename from plugins/authlogon/PasswordDialog.h rename to plugins/authlogon/AuthLogonDialog.h index c008bdc12..f43a0b0bd 100644 --- a/plugins/authlogon/PasswordDialog.h +++ b/plugins/authlogon/AuthLogonDialog.h @@ -1,5 +1,5 @@ /* - * PasswordDialog.h - declaration of password dialog + * AuthLogonDialog.h - declaration of password dialog * * Copyright (c) 2010-2016 Tobias Junghans * @@ -28,14 +28,14 @@ #include -namespace Ui { class PasswordDialog; } +namespace Ui { class AuthLogonDialog; } -class VEYON_CORE_EXPORT PasswordDialog : public QDialog +class AuthLogonDialog : public QDialog { Q_OBJECT public: - explicit PasswordDialog( QWidget *parent ); - ~PasswordDialog() override; + explicit AuthLogonDialog( QWidget *parent ); + ~AuthLogonDialog() override; QString username() const; CryptoCore::SecureArray password() const; @@ -47,6 +47,6 @@ private slots: private: - Ui::PasswordDialog *ui; + Ui::AuthLogonDialog *ui; } ; diff --git a/plugins/authlogon/PasswordDialog.ui b/plugins/authlogon/AuthLogonDialog.ui similarity index 90% rename from plugins/authlogon/PasswordDialog.ui rename to plugins/authlogon/AuthLogonDialog.ui index f06882490..3aaac1da0 100644 --- a/plugins/authlogon/PasswordDialog.ui +++ b/plugins/authlogon/AuthLogonDialog.ui @@ -1,12 +1,12 @@ - PasswordDialog - + AuthLogonDialog + Veyon Logon - + :/core/application-x-pem-key.png:/core/application-x-pem-key.png @@ -68,13 +68,13 @@ - + buttonBox accepted() - PasswordDialog + AuthLogonDialog accept() @@ -90,7 +90,7 @@ buttonBox rejected() - PasswordDialog + AuthLogonDialog reject() @@ -106,7 +106,7 @@ password textChanged(QString) - PasswordDialog + AuthLogonDialog updateOkButton() @@ -122,7 +122,7 @@ username textChanged(QString) - PasswordDialog + AuthLogonDialog updateOkButton() diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index 4b77b2f38..371879012 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -26,7 +26,7 @@ #include #include "AuthLogonPlugin.h" -#include "PasswordDialog.h" +#include "AuthLogonDialog.h" #include "PlatformUserFunctions.h" #include "VariantArrayMessage.h" #include "VeyonConfiguration.h" @@ -46,11 +46,11 @@ bool AuthLogonPlugin::initializeCredentials() if( qobject_cast( QCoreApplication::instance() ) ) { - PasswordDialog passwordDialog( QApplication::activeWindow() ); - if( passwordDialog.exec() == PasswordDialog::Accepted ) + AuthLogonDialog logonDialog( QApplication::activeWindow() ); + if( logonDialog.exec() == AuthLogonDialog::Accepted ) { - m_username = passwordDialog.username(); - m_password = passwordDialog.password(); + m_username = logonDialog.username(); + m_password = logonDialog.password(); return true; } diff --git a/plugins/authlogon/CMakeLists.txt b/plugins/authlogon/CMakeLists.txt index e8b9e2b26..819d8a4e5 100644 --- a/plugins/authlogon/CMakeLists.txt +++ b/plugins/authlogon/CMakeLists.txt @@ -3,7 +3,7 @@ INCLUDE(BuildPlugin) BUILD_PLUGIN(authlogon AuthLogonPlugin.cpp AuthLogonPlugin.h - PasswordDialog.cpp - PasswordDialog.h - PasswordDialog.ui + AuthLogonDialog.cpp + AuthLogonDialog.h + AuthLogonDialog.ui ) From 7a2c4f3213167f570d6497b62eda7f4665718cb0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 25 Jul 2019 07:40:31 +0200 Subject: [PATCH 0025/1765] DemoFeaturePlugin: inherit from DemoAuthentication There's no need to wrap the authentication API. --- plugins/demo/DemoAuthentication.cpp | 3 +- plugins/demo/DemoAuthentication.h | 5 +-- plugins/demo/DemoFeaturePlugin.cpp | 62 +++-------------------------- plugins/demo/DemoFeaturePlugin.h | 16 +------- 4 files changed, 10 insertions(+), 76 deletions(-) diff --git a/plugins/demo/DemoAuthentication.cpp b/plugins/demo/DemoAuthentication.cpp index 762634664..9899008c2 100644 --- a/plugins/demo/DemoAuthentication.cpp +++ b/plugins/demo/DemoAuthentication.cpp @@ -26,8 +26,7 @@ #include "VariantArrayMessage.h" -DemoAuthentication::DemoAuthentication( const Plugin::Uid& pluginUid, QObject* parent ) : - QObject( parent ), +DemoAuthentication::DemoAuthentication( const Plugin::Uid& pluginUid ) : m_accessToken(), m_pluginUid( pluginUid ) { diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index 16503859e..13f13fd92 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -26,13 +26,12 @@ #include "AuthenticationPluginInterface.h" -class DemoAuthentication : public QObject, public AuthenticationPluginInterface +class DemoAuthentication : public AuthenticationPluginInterface { - Q_OBJECT public: using AccessToken = CryptoCore::SecureArray; - explicit DemoAuthentication( const Plugin::Uid& pluginUid, QObject* parent = nullptr ); + explicit DemoAuthentication( const Plugin::Uid& pluginUid ); ~DemoAuthentication() override = default; QString authenticationTypeName() const override diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 5520a1a06..31df4b707 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -38,6 +38,7 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : QObject( parent ), + DemoAuthentication( uid() ), m_fullscreenDemoFeature( QStringLiteral( "FullscreenDemo" ), Feature::Mode | Feature::AllComponents, Feature::Uid( "7b6231bd-eb89-45d3-af32-f70663b2f878" ), @@ -62,7 +63,6 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : Feature::Uid(), tr( "Demo server" ), {}, {} ), m_features( { m_fullscreenDemoFeature, m_windowDemoFeature, m_demoServerFeature } ), - m_authentication( uid(), this ), m_configuration( &VeyonCore::config() ), m_demoClientHosts(), m_demoServer( nullptr ), @@ -80,7 +80,7 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur if( feature == m_windowDemoFeature || feature == m_fullscreenDemoFeature ) { FeatureMessage featureMessage( m_demoServerFeature.uid(), StartDemoServer ); - featureMessage.addArgument( DemoAccessToken, m_authentication.accessToken().toByteArray() ); + featureMessage.addArgument( DemoAccessToken, accessToken().toByteArray() ); VeyonCore::localComputerControlInterface().sendFeatureMessage( featureMessage, true ); @@ -98,7 +98,7 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur vDebug() << "clients:" << m_demoClientHosts; return sendFeatureMessage( FeatureMessage( feature.uid(), StartDemoClient ). - addArgument( DemoAccessToken, m_authentication.accessToken().toByteArray() ), + addArgument( DemoAccessToken, accessToken().toByteArray() ), computerControlInterfaces ); } @@ -243,11 +243,11 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worker, cons case StartDemoServer: if( m_demoServer == nullptr ) { - m_authentication.setAccessToken( message.argument( DemoAccessToken ).toByteArray() ); + setAccessToken( message.argument( DemoAccessToken ).toByteArray() ); m_demoServer = new DemoServer( message.argument( VncServerPort ).toInt(), message.argument( VncServerPassword ).toByteArray(), - m_authentication, + *this, m_configuration, this ); } @@ -268,7 +268,7 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worker, cons switch( message.command() ) { case StartDemoClient: - m_authentication.setAccessToken( message.argument( DemoAccessToken ).toByteArray() ); + setAccessToken( message.argument( DemoAccessToken ).toByteArray() ); if( m_demoClient == nullptr ) { @@ -304,54 +304,4 @@ ConfigurationPage* DemoFeaturePlugin::createConfigurationPage() } - -QString DemoFeaturePlugin::authenticationTypeName() const -{ - return m_authentication.authenticationTypeName(); -} - - - -bool DemoFeaturePlugin::initializeCredentials() -{ - return m_authentication.initializeCredentials(); -} - - - -bool DemoFeaturePlugin::hasCredentials() const -{ - return m_authentication.hasCredentials(); -} - - - -bool DemoFeaturePlugin::checkCredentials() const -{ - return m_authentication.checkCredentials(); -} - - - -VncServerClient::AuthState DemoFeaturePlugin::performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const -{ - return m_authentication.performAuthentication( client, message ); -} - - - -bool DemoFeaturePlugin::authenticate( QIODevice* socket ) const -{ - return m_authentication.authenticate( socket ); -} - - - -bool DemoFeaturePlugin::requiresAccessControl() const -{ - return m_authentication.requiresAccessControl(); -} - - - IMPLEMENT_CONFIG_PROXY(DemoConfiguration) diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 61eed1d7c..96035ea9c 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -33,7 +33,7 @@ class DemoServer; class DemoClient; -class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterface, ConfigurationPagePluginInterface, AuthenticationPluginInterface +class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterface, ConfigurationPagePluginInterface, DemoAuthentication { Q_OBJECT Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.Demo") @@ -97,19 +97,6 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf ConfigurationPage* createConfigurationPage() override; - QString authenticationTypeName() const override; - - bool initializeCredentials() override; - bool hasCredentials() const override; - - bool checkCredentials() const override; - - VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; - - bool authenticate( QIODevice* socket ) const override; - - bool requiresAccessControl() const override; - private: enum Commands { StartDemoServer, @@ -130,7 +117,6 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf const Feature m_demoServerFeature; const FeatureList m_features; - DemoAuthentication m_authentication; DemoConfiguration m_configuration; QStringList m_demoClientHosts; From c1bfec37cf3668ef0123bef29d39ff70a13ef623 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 25 Jul 2019 07:48:48 +0200 Subject: [PATCH 0026/1765] AuthSimple: add initial version This plugin implements a simple authentication to use Veyon with one global access password. It's less secure than logon or key file authentication but may be more simple to set up and use. --- plugins/authsimple/AuthSimpleConfiguration.h | 32 ++++ plugins/authsimple/AuthSimpleDialog.cpp | 81 +++++++++ plugins/authsimple/AuthSimpleDialog.h | 47 +++++ plugins/authsimple/AuthSimpleDialog.ui | 82 +++++++++ plugins/authsimple/AuthSimplePlugin.cpp | 171 +++++++++++++++++++ plugins/authsimple/AuthSimplePlugin.h | 88 ++++++++++ plugins/authsimple/CMakeLists.txt | 10 ++ 7 files changed, 511 insertions(+) create mode 100644 plugins/authsimple/AuthSimpleConfiguration.h create mode 100644 plugins/authsimple/AuthSimpleDialog.cpp create mode 100644 plugins/authsimple/AuthSimpleDialog.h create mode 100644 plugins/authsimple/AuthSimpleDialog.ui create mode 100644 plugins/authsimple/AuthSimplePlugin.cpp create mode 100644 plugins/authsimple/AuthSimplePlugin.h create mode 100644 plugins/authsimple/CMakeLists.txt diff --git a/plugins/authsimple/AuthSimpleConfiguration.h b/plugins/authsimple/AuthSimpleConfiguration.h new file mode 100644 index 000000000..06630f5d0 --- /dev/null +++ b/plugins/authsimple/AuthSimpleConfiguration.h @@ -0,0 +1,32 @@ +/* + * AuthSimpleConfiguration.h - configuration values for AuthSimple plugin + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "Configuration/Proxy.h" + +#define FOREACH_AUTH_SIMPLE_CONFIG_PROPERTY(OP) \ + OP( AuthSimpleConfiguration, m_configuration, Configuration::Password, password, setPassword, "Password", "AuthSimple", QString(), Configuration::Property::Flag::Standard ) \ + +DECLARE_CONFIG_PROXY(AuthSimpleConfiguration, FOREACH_AUTH_SIMPLE_CONFIG_PROPERTY) diff --git a/plugins/authsimple/AuthSimpleDialog.cpp b/plugins/authsimple/AuthSimpleDialog.cpp new file mode 100644 index 000000000..a03e5a2d8 --- /dev/null +++ b/plugins/authsimple/AuthSimpleDialog.cpp @@ -0,0 +1,81 @@ +/* + * AuthSimpleDialog.cpp - dialog for querying logon credentials + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include +#include + +#include "AuthSimpleDialog.h" +#include "AuthSimpleConfiguration.h" +#include "VeyonConfiguration.h" + +#include "ui_AuthSimpleDialog.h" + + +AuthSimpleDialog::AuthSimpleDialog( QWidget *parent ) : + QDialog( parent ), + ui( new Ui::AuthSimpleDialog ) +{ + ui->setupUi( this ); + ui->password->setFocus(); + + connect( ui->password, &QLineEdit::textChanged, this, [this]() { + ui->buttonBox->button( QDialogButtonBox::Ok )->setDisabled( password().isEmpty() ); + } ); + + ui->buttonBox->button( QDialogButtonBox::Ok )->setDisabled( true ); + + VeyonCore::enforceBranding( this ); +} + + + +AuthSimpleDialog::~AuthSimpleDialog() +{ + delete ui; +} + + + +CryptoCore::SecureArray AuthSimpleDialog::password() const +{ + return ui->password->text().toUtf8(); +} + + + +void AuthSimpleDialog::accept() +{ + AuthSimpleConfiguration config( &VeyonCore::config() ); + + if( config.password().plainText().toUtf8() != password().toByteArray() ) + { + QMessageBox::critical( window(), + tr( "Authentication error" ), + tr( "Logon failed with given password. Please try again!" ) ); + } + else + { + QDialog::accept(); + } +} diff --git a/plugins/authsimple/AuthSimpleDialog.h b/plugins/authsimple/AuthSimpleDialog.h new file mode 100644 index 000000000..c6ced5b7e --- /dev/null +++ b/plugins/authsimple/AuthSimpleDialog.h @@ -0,0 +1,47 @@ +/* + * AuthSimpleDialog.h - declaration of password dialog + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "CryptoCore.h" + +#include + +namespace Ui { class AuthSimpleDialog; } + +class AuthSimpleDialog : public QDialog +{ + Q_OBJECT +public: + explicit AuthSimpleDialog( QWidget *parent ); + ~AuthSimpleDialog() override; + + CryptoCore::SecureArray password() const; + + void accept() override; + +private: + Ui::AuthSimpleDialog *ui; + +} ; diff --git a/plugins/authsimple/AuthSimpleDialog.ui b/plugins/authsimple/AuthSimpleDialog.ui new file mode 100644 index 000000000..5fdb0cb97 --- /dev/null +++ b/plugins/authsimple/AuthSimpleDialog.ui @@ -0,0 +1,82 @@ + + + AuthSimpleDialog + + + Veyon Logon + + + + :/core/application-x-pem-key.png:/core/application-x-pem-key.png + + + + 15 + + + + + Please enter the Veyon password: + + + + + + + + 350 + 0 + + + + QLineEdit::Password + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + AuthSimpleDialog + accept() + + + 206 + 137 + + + 169 + 79 + + + + + buttonBox + rejected() + AuthSimpleDialog + reject() + + + 206 + 137 + + + 169 + 79 + + + + + diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp new file mode 100644 index 000000000..fde7ce35b --- /dev/null +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -0,0 +1,171 @@ +/* + * AuthSimplePlugin.cpp - implementation of AuthSimplePlugin class + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include +#include + +#include "AuthSimplePlugin.h" +#include "AuthSimpleConfiguration.h" +#include "AuthSimpleDialog.h" +#include "VariantArrayMessage.h" +#include "VeyonConfiguration.h" + + +AuthSimplePlugin::AuthSimplePlugin( QObject* parent ) : + QObject( parent ) +{ +} + + + +bool AuthSimplePlugin::initializeCredentials() +{ + m_password.clear(); + + if( qobject_cast( QCoreApplication::instance() ) ) + { + AuthSimpleDialog passwordDialog( QApplication::activeWindow() ); + if( passwordDialog.exec() == AuthSimpleDialog::Accepted ) + { + m_password = passwordDialog.password(); + + return true; + } + } + + return false; +} + + + +bool AuthSimplePlugin::hasCredentials() const +{ + return m_password.isEmpty() == false; +} + + + +bool AuthSimplePlugin::checkCredentials() const +{ + if( hasCredentials() == false ) + { + vWarning() << "Invalid password!"; + + QMessageBox::critical( QApplication::activeWindow(), + authenticationTestTitle(), + tr( "The supplied password is wrong. Please enter the correct password or " + "switch to a different authentication method using the Veyon Configurator." ) ); + + return false; + } + + return true; +} + + + +VncServerClient::AuthState AuthSimplePlugin::performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const +{ + switch( client->authState() ) + { + case VncServerClient::AuthState::Init: + client->setPrivateKey( CryptoCore::KeyGenerator().createRSA( CryptoCore::RsaKeySize ) ); + + if( VariantArrayMessage( message.ioDevice() ).write( client->privateKey().toPublicKey().toPEM() ).send() ) + { + return VncServerClient::AuthState::Stage1; + } + + vDebug() << "failed to send public key"; + return VncServerClient::AuthState::Failed; + + case VncServerClient::AuthState::Stage1: + { + auto privateKey = client->privateKey(); + + CryptoCore::SecureArray encryptedPassword( message.read().toByteArray() ); // Flawfinder: ignore + + CryptoCore::SecureArray decryptedPassword; + + if( privateKey.decrypt( encryptedPassword, + &decryptedPassword, + CryptoCore::DefaultEncryptionAlgorithm ) == false ) + { + vWarning() << "failed to decrypt password"; + return VncServerClient::AuthState::Failed; + } + + vInfo() << "authenticating user" << client->username(); + + AuthSimpleConfiguration config( &VeyonCore::config() ); + + if( config.password().plainText().toUtf8() == decryptedPassword.toByteArray() ) + { + vDebug() << "SUCCESS"; + return VncServerClient::AuthState::Successful; + } + + vDebug() << "FAIL"; + return VncServerClient::AuthState::Failed; + } + + default: + break; + } + + return VncServerClient::AuthState::Failed; + +} + + + +bool AuthSimplePlugin::authenticate( QIODevice* socket ) const +{ + VariantArrayMessage publicKeyMessage( socket ); + publicKeyMessage.receive(); + + CryptoCore::PublicKey publicKey = CryptoCore::PublicKey::fromPEM( publicKeyMessage.read().toString() ); + + if( publicKey.canEncrypt() == false ) + { + vCritical() << QThread::currentThreadId() << "can't encrypt with given public key!"; + return false; + } + + CryptoCore::SecureArray encryptedPassword = publicKey.encrypt( m_password, CryptoCore::DefaultEncryptionAlgorithm ); + if( encryptedPassword.isEmpty() ) + { + vCritical() << QThread::currentThreadId() << "password encryption failed!"; + return false; + } + + VariantArrayMessage response( socket ); + response.write( encryptedPassword.toByteArray() ); + response.send(); + + return true; +} + + +IMPLEMENT_CONFIG_PROXY(AuthSimpleConfiguration) diff --git a/plugins/authsimple/AuthSimplePlugin.h b/plugins/authsimple/AuthSimplePlugin.h new file mode 100644 index 000000000..ccb271a3e --- /dev/null +++ b/plugins/authsimple/AuthSimplePlugin.h @@ -0,0 +1,88 @@ +/* + * AuthSimplePlugin.h - declaration of AuthSimplePlugin class + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "AuthenticationPluginInterface.h" + +class AuthSimplePlugin : public QObject, + AuthenticationPluginInterface, + PluginInterface +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.AuthSimple") + Q_INTERFACES(PluginInterface + AuthenticationPluginInterface) +public: + explicit AuthSimplePlugin( QObject* parent = nullptr ); + ~AuthSimplePlugin() override = default; + + Plugin::Uid uid() const override + { + return QStringLiteral("3940fdb4-bcc5-4cba-a227-1a2b22b5971d"); + } + + QVersionNumber version() const override + { + return QVersionNumber( 1, 0 ); + } + + QString name() const override + { + return QStringLiteral( "AuthSimple" ); + } + + QString description() const override + { + return tr( "Simple password authentication" ); + } + + QString vendor() const override + { + return QStringLiteral( "Veyon Community" ); + } + + QString copyright() const override + { + return QStringLiteral( "Tobias Junghans" ); + } + + QString authenticationTypeName() const override + { + return description(); + } + + bool initializeCredentials() override; + bool hasCredentials() const override; + + bool checkCredentials() const override; + + VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; + + bool authenticate( QIODevice* socket ) const override; + +private: + CryptoCore::SecureArray m_password; + +}; diff --git a/plugins/authsimple/CMakeLists.txt b/plugins/authsimple/CMakeLists.txt new file mode 100644 index 000000000..1e6f172a0 --- /dev/null +++ b/plugins/authsimple/CMakeLists.txt @@ -0,0 +1,10 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(authsimple + AuthSimplePlugin.cpp + AuthSimplePlugin.h + AuthSimpleConfiguration.h + AuthSimpleDialog.cpp + AuthSimpleDialog.h + AuthSimpleDialog.ui +) From 848d5520ce42530095c4f777e8881b7914ca47aa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 25 Jul 2019 08:29:29 +0200 Subject: [PATCH 0027/1765] Configuration: UiMapping: use Property throug const ref --- core/include/Configuration/UiMapping.h | 26 +++++++++++++------------- core/src/Configuration/UiMapping.cpp | 20 ++++++++++---------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/core/include/Configuration/UiMapping.h b/core/include/Configuration/UiMapping.h index 10231c048..8e88db6a7 100644 --- a/core/include/Configuration/UiMapping.h +++ b/core/include/Configuration/UiMapping.h @@ -86,21 +86,21 @@ class VEYON_CORE_EXPORT UiMapping // connect widget signals to configuration property write methods - static void connectWidgetToProperty( Configuration::TypedProperty& property, QCheckBox* widget ); - static void connectWidgetToProperty( Configuration::TypedProperty& property, QGroupBox* widget ); - static void connectWidgetToProperty( Configuration::TypedProperty& property, QRadioButton* widget ); - static void connectWidgetToProperty( Configuration::TypedProperty& property, QComboBox* widget ); - static void connectWidgetToProperty( Configuration::TypedProperty& property, QLineEdit* widget ); - static void connectWidgetToProperty( Configuration::TypedProperty& property, QLineEdit* widget ); - static void connectWidgetToProperty( Configuration::TypedProperty& property, QPushButton* widget ); - static void connectWidgetToProperty( Configuration::TypedProperty& property, QComboBox* widget ); - static void connectWidgetToProperty( Configuration::TypedProperty& property, QSpinBox* widget ); - static void connectWidgetToProperty( Configuration::TypedProperty& property, QComboBox* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QCheckBox* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QGroupBox* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QRadioButton* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QComboBox* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QLineEdit* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QLineEdit* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QPushButton* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QComboBox* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QSpinBox* widget ); + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QComboBox* widget ); // SFINAE overload for enum classes template static typename std::enable_if::value, void>::type - connectWidgetToProperty( Configuration::TypedProperty& property, QComboBox* widget ) + connectWidgetToProperty( const Configuration::TypedProperty& property, QComboBox* widget ) { QObject::connect( widget, QOverload::of(&QComboBox::currentIndexChanged), property.lambdaContext(), [&property]( int index ) { property.setValue( static_cast( index ) ); } ); @@ -108,13 +108,13 @@ class VEYON_CORE_EXPORT UiMapping // overloads for special properties which can't be connected to widgets - static void connectWidgetToProperty( Configuration::TypedProperty& property, QLabel* widget ) + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QLabel* widget ) { Q_UNUSED(property) Q_UNUSED(widget) } - static void connectWidgetToProperty( Configuration::TypedProperty& property, QLabel* widget ) + static void connectWidgetToProperty( const Configuration::TypedProperty& property, QLabel* widget ) { Q_UNUSED(property) Q_UNUSED(widget) diff --git a/core/src/Configuration/UiMapping.cpp b/core/src/Configuration/UiMapping.cpp index 0010465e9..81859d353 100644 --- a/core/src/Configuration/UiMapping.cpp +++ b/core/src/Configuration/UiMapping.cpp @@ -133,7 +133,7 @@ Property::Flags UiMapping::flags( QObject* object ) -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QCheckBox* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QCheckBox* widget ) { QObject::connect( widget, &QCheckBox::toggled, property.lambdaContext(), [&property]( bool value ) { property.setValue( value ); } ); @@ -141,7 +141,7 @@ void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& pro -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QGroupBox* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QGroupBox* widget ) { QObject::connect( widget, &QGroupBox::toggled, property.lambdaContext(), [&property]( bool value ) { property.setValue( value ); } ); @@ -149,7 +149,7 @@ void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& pro -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QRadioButton* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QRadioButton* widget ) { QObject::connect( widget, &QCheckBox::toggled, property.lambdaContext(), [&property]( bool value ) { property.setValue( value ); } ); @@ -157,7 +157,7 @@ void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& pro -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QComboBox* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QComboBox* widget ) { QObject::connect( widget, &QComboBox::currentTextChanged, property.lambdaContext(), [&property]( const QString& value ) { property.setValue( value ); } ); @@ -165,7 +165,7 @@ void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QLineEdit* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QLineEdit* widget ) { QObject::connect( widget, &QLineEdit::textChanged, property.lambdaContext(), [&property]( const QString& value ) { property.setValue( value ); } ); @@ -173,7 +173,7 @@ void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QLineEdit* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QLineEdit* widget ) { QObject::connect( widget, &QLineEdit::textChanged, property.lambdaContext(), [&property]( const QString& plainText ) { property.setValue( Password::fromPlainText( plainText ) ); } ); @@ -181,7 +181,7 @@ void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QPushButton* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QPushButton* widget ) { QObject::connect( widget, &QAbstractButton::clicked, property.lambdaContext(), [&property, widget]() { auto palette = widget->palette(); @@ -197,7 +197,7 @@ void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& p -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QComboBox* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QComboBox* widget ) { QObject::connect( widget, QOverload::of(&QComboBox::currentIndexChanged), property.lambdaContext(), [&property]( int index ) { property.setValue( index ); } ); @@ -205,7 +205,7 @@ void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& prop -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QSpinBox* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QSpinBox* widget ) { QObject::connect( widget, QOverload::of(&QSpinBox::valueChanged), property.lambdaContext(), [&property]( int index ) { property.setValue( index ); } ); @@ -213,7 +213,7 @@ void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& prop -void UiMapping::connectWidgetToProperty( Configuration::TypedProperty& property, QComboBox* widget ) +void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QComboBox* widget ) { QObject::connect( widget, QOverload::of(&QComboBox::currentIndexChanged), property.lambdaContext(), [widget, &property]( int index ) { property.setValue( widget->itemData( index ).toUuid() ); } ); From d133838cbeb5b9efd25ac3f9d9b6ac0c5e5e7bc0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 25 Jul 2019 08:30:27 +0200 Subject: [PATCH 0028/1765] Configuration: Property: make setter const As we only wrap the Configuration objects we can make the setter const. --- core/include/Configuration/Property.h | 6 +++--- core/src/Configuration/Property.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/include/Configuration/Property.h b/core/include/Configuration/Property.h index e3e8f2dfc..50e22caa2 100644 --- a/core/include/Configuration/Property.h +++ b/core/include/Configuration/Property.h @@ -80,7 +80,7 @@ class VEYON_CORE_EXPORT Property : public QObject QVariant variantValue() const; - void setVariantValue( const QVariant& value ); + void setVariantValue( const QVariant& value ) const; static Property* find( QObject* parent, const QString& key, const QString& parentKey ); @@ -117,7 +117,7 @@ class VEYON_CORE_EXPORT TypedProperty : public Property { return QVariantHelper::value( variantValue() ); } - void setValue( Type value ) + void setValue( Type value ) const { setVariantValue( QVariant::fromValue( value ) ); } @@ -127,7 +127,7 @@ template<> VEYON_CORE_EXPORT Password TypedProperty::value() const; template<> -VEYON_CORE_EXPORT void TypedProperty::setValue( const Password& value ); +VEYON_CORE_EXPORT void TypedProperty::setValue( const Password& value ) const; #define DECLARE_CONFIG_PROPERTY(className,config,type, name, setter, key, parentKey, defaultValue, flags) \ diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index bc0ff101b..429abe616 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -86,7 +86,7 @@ QVariant Property::variantValue() const -void Property::setVariantValue( const QVariant& value ) +void Property::setVariantValue( const QVariant& value ) const { if( m_object ) { @@ -129,7 +129,7 @@ Password Configuration::TypedProperty::value() const template<> -void Configuration::TypedProperty::setValue( const Password& value ) +void Configuration::TypedProperty::setValue( const Password& value ) const { setVariantValue( value.encrypted() ); } From 656255c325ba6a19e5d8c36c80b52b3cf764106e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 25 Jul 2019 08:31:19 +0200 Subject: [PATCH 0029/1765] Configuration: Property: store as const members --- core/include/Configuration/Property.h | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/include/Configuration/Property.h b/core/include/Configuration/Property.h index 50e22caa2..1eda8914d 100644 --- a/core/include/Configuration/Property.h +++ b/core/include/Configuration/Property.h @@ -132,7 +132,7 @@ VEYON_CORE_EXPORT void TypedProperty::setValue( const Password& value #define DECLARE_CONFIG_PROPERTY(className,config,type, name, setter, key, parentKey, defaultValue, flags) \ private: \ - Configuration::TypedProperty m_##name{this, QStringLiteral(key), QStringLiteral(parentKey), defaultValue, flags}; \ + const Configuration::TypedProperty m_##name{this, QStringLiteral(key), QStringLiteral(parentKey), defaultValue, flags}; \ public: \ type name() const \ { \ @@ -142,11 +142,7 @@ VEYON_CORE_EXPORT void TypedProperty::setValue( const Password& value { \ return m_##name; \ } \ - Configuration::TypedProperty& name##Property() \ - { \ - return m_##name; \ - } \ - void setter( Configuration::TypedProperty::Type value ) \ + void setter( Configuration::TypedProperty::Type value ) const \ { \ m_##name.setValue( value ); \ } From 55fda9cecdd23f5f6d5fc7ea84b5bd16229137e6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 25 Jul 2019 08:42:01 +0200 Subject: [PATCH 0030/1765] CryptoCore, ConfigurationPassword: use SecureArray --- core/include/Configuration/Password.h | 6 +++--- core/include/CryptoCore.h | 5 +++-- core/src/Configuration/Password.cpp | 4 ++-- core/src/Configuration/UiMapping.cpp | 4 ++-- core/src/CryptoCore.cpp | 10 +++++----- plugins/authlogon/AuthLogonPlugin.cpp | 1 - plugins/authsimple/AuthSimpleDialog.cpp | 2 +- plugins/authsimple/AuthSimplePlugin.cpp | 2 +- plugins/config/ConfigCommandLinePlugin.cpp | 2 +- plugins/ldap/LdapPlugin.cpp | 2 +- plugins/ldap/common/LdapClient.cpp | 2 +- plugins/vncserver/external/ExternalVncServer.cpp | 4 ++-- 12 files changed, 22 insertions(+), 22 deletions(-) diff --git a/core/include/Configuration/Password.h b/core/include/Configuration/Password.h index 97d59ae63..d8d1eb56e 100644 --- a/core/include/Configuration/Password.h +++ b/core/include/Configuration/Password.h @@ -24,7 +24,7 @@ #pragma once -#include "VeyonCore.h" +#include "CryptoCore.h" namespace Configuration { @@ -35,14 +35,14 @@ class VEYON_CORE_EXPORT Password public: Password() = default; - QString plainText() const; + CryptoCore::PlaintextPassword plainText() const; const QString& encrypted() const { return m_encrypted; } - static Password fromPlainText( const QString& plainText ); + static Password fromPlainText( const CryptoCore::PlaintextPassword& plainText ); static Password fromEncrypted( const QString& encrypted ); private: diff --git a/core/include/CryptoCore.h b/core/include/CryptoCore.h index 77e1c0a39..09ac19f54 100644 --- a/core/include/CryptoCore.h +++ b/core/include/CryptoCore.h @@ -37,6 +37,7 @@ class VEYON_CORE_EXPORT CryptoCore using PrivateKey = QCA::PrivateKey; using PublicKey = QCA::PublicKey; using SecureArray = QCA::SecureArray; + using PlaintextPassword = SecureArray; enum { RsaKeySize = 4096, @@ -51,8 +52,8 @@ class VEYON_CORE_EXPORT CryptoCore static QByteArray generateChallenge(); - QString encryptPassword( const QString& password ) const; - QString decryptPassword( const QString& encryptedPassword ) const; + QString encryptPassword( const PlaintextPassword& password ) const; + PlaintextPassword decryptPassword( const QString& encryptedPassword ) const; private: QCA::Initializer m_qcaInitializer; diff --git a/core/src/Configuration/Password.cpp b/core/src/Configuration/Password.cpp index e7613f5e1..1a869ebf0 100644 --- a/core/src/Configuration/Password.cpp +++ b/core/src/Configuration/Password.cpp @@ -29,14 +29,14 @@ namespace Configuration { -QString Password::plainText() const +CryptoCore::PlaintextPassword Password::plainText() const { return VeyonCore::cryptoCore().decryptPassword( m_encrypted ); } -Password Password::fromPlainText( const QString& plaintext ) +Password Password::fromPlainText( const CryptoCore::PlaintextPassword& plaintext ) { Password password; password.m_encrypted = VeyonCore::cryptoCore().encryptPassword( plaintext ); diff --git a/core/src/Configuration/UiMapping.cpp b/core/src/Configuration/UiMapping.cpp index 81859d353..b05c9b68b 100644 --- a/core/src/Configuration/UiMapping.cpp +++ b/core/src/Configuration/UiMapping.cpp @@ -75,7 +75,7 @@ void UiMapping::initWidgetFromProperty( const Configuration::TypedProperty& property, QLineEdit* widget ) { - widget->setText( property.value().plainText() ); + widget->setText( QString::fromUtf8( property.value().plainText().toByteArray() ) ); } @@ -176,7 +176,7 @@ void UiMapping::connectWidgetToProperty( const Configuration::TypedProperty& property, QLineEdit* widget ) { QObject::connect( widget, &QLineEdit::textChanged, property.lambdaContext(), - [&property]( const QString& plainText ) { property.setValue( Password::fromPlainText( plainText ) ); } ); + [&property]( const QString& plainText ) { property.setValue( Password::fromPlainText( plainText.toUtf8() ) ); } ); } diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index 098a0ffc0..ec96860f0 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -73,22 +73,22 @@ QByteArray CryptoCore::generateChallenge() -QString CryptoCore::encryptPassword( const QString& password ) const +QString CryptoCore::encryptPassword( const PlaintextPassword& password ) const { return QString::fromLatin1( m_defaultPrivateKey.toPublicKey(). - encrypt( password.toUtf8(), DefaultEncryptionAlgorithm ).toByteArray().toHex() ); + encrypt( password, DefaultEncryptionAlgorithm ).toByteArray().toHex() ); } -QString CryptoCore::decryptPassword( const QString& encryptedPassword ) const +CryptoCore::PlaintextPassword CryptoCore::decryptPassword( const QString& encryptedPassword ) const { - SecureArray decryptedPassword; + PlaintextPassword decryptedPassword; if( PrivateKey( m_defaultPrivateKey ).decrypt( QByteArray::fromHex( encryptedPassword.toUtf8() ), &decryptedPassword, DefaultEncryptionAlgorithm ) ) { - return QString::fromUtf8( decryptedPassword.toByteArray() ); + return decryptedPassword; } vCritical() << "failed to decrypt password!"; diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index 371879012..6d19055bb 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -29,7 +29,6 @@ #include "AuthLogonDialog.h" #include "PlatformUserFunctions.h" #include "VariantArrayMessage.h" -#include "VeyonConfiguration.h" AuthLogonPlugin::AuthLogonPlugin( QObject* parent ) : diff --git a/plugins/authsimple/AuthSimpleDialog.cpp b/plugins/authsimple/AuthSimpleDialog.cpp index a03e5a2d8..b69d3b045 100644 --- a/plugins/authsimple/AuthSimpleDialog.cpp +++ b/plugins/authsimple/AuthSimpleDialog.cpp @@ -68,7 +68,7 @@ void AuthSimpleDialog::accept() { AuthSimpleConfiguration config( &VeyonCore::config() ); - if( config.password().plainText().toUtf8() != password().toByteArray() ) + if( config.password().plainText() != password() ) { QMessageBox::critical( window(), tr( "Authentication error" ), diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp index fde7ce35b..acb7c8725 100644 --- a/plugins/authsimple/AuthSimplePlugin.cpp +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -120,7 +120,7 @@ VncServerClient::AuthState AuthSimplePlugin::performAuthentication( VncServerCli AuthSimpleConfiguration config( &VeyonCore::config() ); - if( config.password().plainText().toUtf8() == decryptedPassword.toByteArray() ) + if( config.password().plainText() == decryptedPassword ) { vDebug() << "SUCCESS"; return VncServerClient::AuthState::Successful; diff --git a/plugins/config/ConfigCommandLinePlugin.cpp b/plugins/config/ConfigCommandLinePlugin.cpp index ff1e2d280..0848fcf35 100644 --- a/plugins/config/ConfigCommandLinePlugin.cpp +++ b/plugins/config/ConfigCommandLinePlugin.cpp @@ -216,7 +216,7 @@ CommandLinePluginInterface::RunResult ConfigCommandLinePlugin::handle_set( const else if( key.contains( QStringLiteral("password"), Qt::CaseInsensitive ) || type == QLatin1String("password") ) { - configValue = VeyonCore::cryptoCore().encryptPassword( value ); + configValue = VeyonCore::cryptoCore().encryptPassword( value.toUtf8() ); } else if( type == QLatin1String("list") || valueType == QMetaType::QStringList ) diff --git a/plugins/ldap/LdapPlugin.cpp b/plugins/ldap/LdapPlugin.cpp index addb45ca4..6ae608bce 100644 --- a/plugins/ldap/LdapPlugin.cpp +++ b/plugins/ldap/LdapPlugin.cpp @@ -82,7 +82,7 @@ void LdapPlugin::upgrade( const QVersionNumber& oldVersion ) if( rawBindPassword.size() < MaximumPlaintextPasswordLength ) { // setting it again will encrypt it - m_configuration.setBindPassword( Configuration::Password::fromPlainText( rawBindPassword ) ); + m_configuration.setBindPassword( Configuration::Password::fromPlainText( rawBindPassword.toUtf8() ) ); } } else if( oldVersion < QVersionNumber( 1, 2 ) ) diff --git a/plugins/ldap/common/LdapClient.cpp b/plugins/ldap/common/LdapClient.cpp index 93481ee55..1a999eb72 100644 --- a/plugins/ldap/common/LdapClient.cpp +++ b/plugins/ldap/common/LdapClient.cpp @@ -466,7 +466,7 @@ bool LdapClient::connectAndBind( const QUrl& url ) if( m_configuration.useBindCredentials() ) { m_server->setBindDn( m_configuration.bindDn() ); - m_server->setPassword( m_configuration.bindPassword().plainText() ); + m_server->setPassword( QString::fromUtf8( m_configuration.bindPassword().plainText().toByteArray() ) ); m_server->setAuth( KLDAP::LdapServer::Simple ); } else diff --git a/plugins/vncserver/external/ExternalVncServer.cpp b/plugins/vncserver/external/ExternalVncServer.cpp index 13836ca5c..bc99209f5 100644 --- a/plugins/vncserver/external/ExternalVncServer.cpp +++ b/plugins/vncserver/external/ExternalVncServer.cpp @@ -47,7 +47,7 @@ void ExternalVncServer::upgrade( const QVersionNumber& oldVersion ) if( rawPassword.size() < MaximumPlaintextPasswordLength ) { // setting it again will encrypt it - m_configuration.setPassword( Configuration::Password::fromPlainText( rawPassword ) ); + m_configuration.setPassword( Configuration::Password::fromPlainText( rawPassword.toUtf8() ) ); } } } @@ -86,7 +86,7 @@ int ExternalVncServer::configuredServerPort() ExternalVncServer::Password ExternalVncServer::configuredPassword() { - return m_configuration.password().plainText().toUtf8(); + return m_configuration.password().plainText(); } From 587b3d55423c3baee07deab74dbb3c7c16115d81 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 25 Jul 2019 08:52:38 +0200 Subject: [PATCH 0031/1765] CryptoCore: rename SecureArray to PlaintextPassword --- core/include/AuthenticationCredentials.h | 2 +- core/include/CryptoCore.h | 3 +-- core/include/PlatformUserFunctions.h | 2 +- core/include/VncClientProtocol.h | 2 +- core/include/VncServerPluginInterface.h | 2 +- plugins/authlogon/AuthLogonDialog.cpp | 2 +- plugins/authlogon/AuthLogonDialog.h | 2 +- plugins/authlogon/AuthLogonPlugin.cpp | 6 +++--- plugins/authlogon/AuthLogonPlugin.h | 2 +- plugins/authsimple/AuthSimpleDialog.cpp | 2 +- plugins/authsimple/AuthSimpleDialog.h | 2 +- plugins/authsimple/AuthSimplePlugin.cpp | 6 +++--- plugins/authsimple/AuthSimplePlugin.h | 2 +- plugins/demo/DemoAuthentication.cpp | 2 +- plugins/demo/DemoAuthentication.h | 2 +- plugins/demo/DemoServer.cpp | 2 ++ plugins/demo/DemoServer.h | 2 +- plugins/platform/linux/LinuxUserFunctions.cpp | 2 +- plugins/platform/linux/LinuxUserFunctions.h | 2 +- server/src/ComputerControlClient.h | 2 +- server/src/VncProxyConnectionFactory.h | 2 +- server/src/VncProxyServer.h | 2 +- server/src/VncServer.h | 2 +- 23 files changed, 28 insertions(+), 27 deletions(-) diff --git a/core/include/AuthenticationCredentials.h b/core/include/AuthenticationCredentials.h index 1b610b499..7dbe95fcf 100644 --- a/core/include/AuthenticationCredentials.h +++ b/core/include/AuthenticationCredentials.h @@ -31,7 +31,7 @@ class VEYON_CORE_EXPORT AuthenticationCredentials { public: - using Password = CryptoCore::SecureArray; + using Password = CryptoCore::PlaintextPassword; void setInternalVncServerPassword( const Password& password ) { diff --git a/core/include/CryptoCore.h b/core/include/CryptoCore.h index 09ac19f54..efedeb31a 100644 --- a/core/include/CryptoCore.h +++ b/core/include/CryptoCore.h @@ -36,8 +36,7 @@ class VEYON_CORE_EXPORT CryptoCore using KeyGenerator = QCA::KeyGenerator; using PrivateKey = QCA::PrivateKey; using PublicKey = QCA::PublicKey; - using SecureArray = QCA::SecureArray; - using PlaintextPassword = SecureArray; + using PlaintextPassword = QCA::SecureArray; enum { RsaKeySize = 4096, diff --git a/core/include/PlatformUserFunctions.h b/core/include/PlatformUserFunctions.h index 990ee1916..d0ebb0239 100644 --- a/core/include/PlatformUserFunctions.h +++ b/core/include/PlatformUserFunctions.h @@ -32,7 +32,7 @@ class PlatformUserFunctions { public: - using Password = CryptoCore::SecureArray; + using Password = CryptoCore::PlaintextPassword; virtual ~PlatformUserFunctions() = default; diff --git a/core/include/VncClientProtocol.h b/core/include/VncClientProtocol.h index efaa58a60..74e0453b0 100644 --- a/core/include/VncClientProtocol.h +++ b/core/include/VncClientProtocol.h @@ -36,7 +36,7 @@ class QTcpSocket; class VEYON_CORE_EXPORT VncClientProtocol { public: - using Password = CryptoCore::SecureArray; + using Password = CryptoCore::PlaintextPassword; enum State { Disconnected, diff --git a/core/include/VncServerPluginInterface.h b/core/include/VncServerPluginInterface.h index ca22eda37..f2c4a9977 100644 --- a/core/include/VncServerPluginInterface.h +++ b/core/include/VncServerPluginInterface.h @@ -32,7 +32,7 @@ class VncServerPluginInterface { public: - using Password = CryptoCore::SecureArray; + using Password = CryptoCore::PlaintextPassword; virtual ~VncServerPluginInterface() = default; diff --git a/plugins/authlogon/AuthLogonDialog.cpp b/plugins/authlogon/AuthLogonDialog.cpp index 7d8f6e89a..d0cb6eeca 100644 --- a/plugins/authlogon/AuthLogonDialog.cpp +++ b/plugins/authlogon/AuthLogonDialog.cpp @@ -65,7 +65,7 @@ QString AuthLogonDialog::username() const -CryptoCore::SecureArray AuthLogonDialog::password() const +CryptoCore::PlaintextPassword AuthLogonDialog::password() const { return ui->password->text().toUtf8(); } diff --git a/plugins/authlogon/AuthLogonDialog.h b/plugins/authlogon/AuthLogonDialog.h index f43a0b0bd..29dfab91a 100644 --- a/plugins/authlogon/AuthLogonDialog.h +++ b/plugins/authlogon/AuthLogonDialog.h @@ -38,7 +38,7 @@ class AuthLogonDialog : public QDialog ~AuthLogonDialog() override; QString username() const; - CryptoCore::SecureArray password() const; + CryptoCore::PlaintextPassword password() const; void accept() override; diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index 6d19055bb..f8730c986 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -106,9 +106,9 @@ VncServerClient::AuthState AuthLogonPlugin::performAuthentication( VncServerClie auto privateKey = client->privateKey(); client->setUsername( message.read().toString() ); // Flawfinder: ignore - CryptoCore::SecureArray encryptedPassword( message.read().toByteArray() ); // Flawfinder: ignore + CryptoCore::PlaintextPassword encryptedPassword( message.read().toByteArray() ); // Flawfinder: ignore - CryptoCore::SecureArray decryptedPassword; + CryptoCore::PlaintextPassword decryptedPassword; if( privateKey.decrypt( encryptedPassword, &decryptedPassword, @@ -153,7 +153,7 @@ bool AuthLogonPlugin::authenticate( QIODevice* socket ) const return false; } - CryptoCore::SecureArray encryptedPassword = publicKey.encrypt( m_password, CryptoCore::DefaultEncryptionAlgorithm ); + CryptoCore::PlaintextPassword encryptedPassword = publicKey.encrypt( m_password, CryptoCore::DefaultEncryptionAlgorithm ); if( encryptedPassword.isEmpty() ) { vCritical() << QThread::currentThreadId() << "password encryption failed!"; diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h index 0fd7fdaa5..4deb0c8dd 100644 --- a/plugins/authlogon/AuthLogonPlugin.h +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -89,6 +89,6 @@ class AuthLogonPlugin : public QObject, private: QString m_username; - CryptoCore::SecureArray m_password; + CryptoCore::PlaintextPassword m_password; }; diff --git a/plugins/authsimple/AuthSimpleDialog.cpp b/plugins/authsimple/AuthSimpleDialog.cpp index b69d3b045..d71816a07 100644 --- a/plugins/authsimple/AuthSimpleDialog.cpp +++ b/plugins/authsimple/AuthSimpleDialog.cpp @@ -57,7 +57,7 @@ AuthSimpleDialog::~AuthSimpleDialog() -CryptoCore::SecureArray AuthSimpleDialog::password() const +CryptoCore::PlaintextPassword AuthSimpleDialog::password() const { return ui->password->text().toUtf8(); } diff --git a/plugins/authsimple/AuthSimpleDialog.h b/plugins/authsimple/AuthSimpleDialog.h index c6ced5b7e..9d25cc05a 100644 --- a/plugins/authsimple/AuthSimpleDialog.h +++ b/plugins/authsimple/AuthSimpleDialog.h @@ -37,7 +37,7 @@ class AuthSimpleDialog : public QDialog explicit AuthSimpleDialog( QWidget *parent ); ~AuthSimpleDialog() override; - CryptoCore::SecureArray password() const; + CryptoCore::PlaintextPassword password() const; void accept() override; diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp index acb7c8725..586b69cfa 100644 --- a/plugins/authsimple/AuthSimplePlugin.cpp +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -104,9 +104,9 @@ VncServerClient::AuthState AuthSimplePlugin::performAuthentication( VncServerCli { auto privateKey = client->privateKey(); - CryptoCore::SecureArray encryptedPassword( message.read().toByteArray() ); // Flawfinder: ignore + CryptoCore::PlaintextPassword encryptedPassword( message.read().toByteArray() ); // Flawfinder: ignore - CryptoCore::SecureArray decryptedPassword; + CryptoCore::PlaintextPassword decryptedPassword; if( privateKey.decrypt( encryptedPassword, &decryptedPassword, @@ -153,7 +153,7 @@ bool AuthSimplePlugin::authenticate( QIODevice* socket ) const return false; } - CryptoCore::SecureArray encryptedPassword = publicKey.encrypt( m_password, CryptoCore::DefaultEncryptionAlgorithm ); + CryptoCore::PlaintextPassword encryptedPassword = publicKey.encrypt( m_password, CryptoCore::DefaultEncryptionAlgorithm ); if( encryptedPassword.isEmpty() ) { vCritical() << QThread::currentThreadId() << "password encryption failed!"; diff --git a/plugins/authsimple/AuthSimplePlugin.h b/plugins/authsimple/AuthSimplePlugin.h index ccb271a3e..059f26a50 100644 --- a/plugins/authsimple/AuthSimplePlugin.h +++ b/plugins/authsimple/AuthSimplePlugin.h @@ -83,6 +83,6 @@ class AuthSimplePlugin : public QObject, bool authenticate( QIODevice* socket ) const override; private: - CryptoCore::SecureArray m_password; + CryptoCore::PlaintextPassword m_password; }; diff --git a/plugins/demo/DemoAuthentication.cpp b/plugins/demo/DemoAuthentication.cpp index 9899008c2..ffa588b4e 100644 --- a/plugins/demo/DemoAuthentication.cpp +++ b/plugins/demo/DemoAuthentication.cpp @@ -67,7 +67,7 @@ VncServerClient::AuthState DemoAuthentication::performAuthentication( VncServerC case VncServerClient::AuthState::Stage1: { - const CryptoCore::SecureArray token = message.read().toByteArray(); // Flawfinder: ignore + const CryptoCore::PlaintextPassword token = message.read().toByteArray(); // Flawfinder: ignore if( hasCredentials() && token == m_accessToken ) { diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index 13f13fd92..f6f2ce590 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -29,7 +29,7 @@ class DemoAuthentication : public AuthenticationPluginInterface { public: - using AccessToken = CryptoCore::SecureArray; + using AccessToken = CryptoCore::PlaintextPassword; explicit DemoAuthentication( const Plugin::Uid& pluginUid ); ~DemoAuthentication() override = default; diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index c41e90826..67f6d7a17 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -23,6 +23,8 @@ * */ +#include "rfb/rfbproto.h" + #include #include diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index 62f5439c6..9575de4ae 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -39,7 +39,7 @@ class DemoServer : public QObject { Q_OBJECT public: - using Password = CryptoCore::SecureArray; + using Password = CryptoCore::PlaintextPassword; using MessageList = QVector; DemoServer( int vncServerPort, const Password& vncServerPassword, const DemoAuthentication& authentication, diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index a3b2c647a..45d7c7173 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -308,7 +308,7 @@ void LinuxUserFunctions::logoff() -bool LinuxUserFunctions::authenticate( const QString& username, const CryptoCore::SecureArray& password ) +bool LinuxUserFunctions::authenticate( const QString& username, const Password& password ) { QProcess p; p.start( QStringLiteral( "veyon-auth-helper" ), QProcess::ReadWrite | QProcess::Unbuffered ); diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index c10ef27b9..2d43f6e21 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -44,7 +44,7 @@ class LinuxUserFunctions : public PlatformUserFunctions bool logon( const QString& username, const QString& password ) override; void logoff() override; - bool authenticate( const QString& username, const CryptoCore::SecureArray& password ) override; + bool authenticate( const QString& username, const Password& password ) override; static uid_t userIdFromName( const QString& username ); diff --git a/server/src/ComputerControlClient.h b/server/src/ComputerControlClient.h index 0cb66afbe..2de4abdc2 100644 --- a/server/src/ComputerControlClient.h +++ b/server/src/ComputerControlClient.h @@ -35,7 +35,7 @@ class ComputerControlClient : public VncProxyConnection { Q_OBJECT public: - using Password = CryptoCore::SecureArray; + using Password = CryptoCore::PlaintextPassword; ComputerControlClient( ComputerControlServer* server, QTcpSocket* clientSocket, diff --git a/server/src/VncProxyConnectionFactory.h b/server/src/VncProxyConnectionFactory.h index a5e65c24c..20f79c80a 100644 --- a/server/src/VncProxyConnectionFactory.h +++ b/server/src/VncProxyConnectionFactory.h @@ -34,7 +34,7 @@ class VncProxyConnection; class VncProxyConnectionFactory { public: - using Password = CryptoCore::SecureArray; + using Password = CryptoCore::PlaintextPassword; virtual ~VncProxyConnectionFactory() = default; diff --git a/server/src/VncProxyServer.h b/server/src/VncProxyServer.h index 5f7e9d6f2..d77471c65 100644 --- a/server/src/VncProxyServer.h +++ b/server/src/VncProxyServer.h @@ -37,7 +37,7 @@ class VncProxyServer : public QObject { Q_OBJECT public: - using Password = CryptoCore::SecureArray; + using Password = CryptoCore::PlaintextPassword; using VncProxyConnectionList = QVector; VncProxyServer( const QHostAddress& listenAddress, diff --git a/server/src/VncServer.h b/server/src/VncServer.h index d72b490db..7112b3869 100644 --- a/server/src/VncServer.h +++ b/server/src/VncServer.h @@ -35,7 +35,7 @@ class VncServer : public QThread { Q_OBJECT public: - using Password = CryptoCore::SecureArray; + using Password = CryptoCore::PlaintextPassword; explicit VncServer( QObject* parent = nullptr ); ~VncServer() override; From 0e73f077a2029970960eae179248c2a0fa0726d8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 25 Jul 2019 09:01:19 +0200 Subject: [PATCH 0032/1765] Prepare translation resource for Veyon 5 --- .tx/config | 2 +- translations/veyon.ts | 135 +++++++++++++++++++++++++----------------- 2 files changed, 81 insertions(+), 56 deletions(-) diff --git a/.tx/config b/.tx/config index ad87236ed..86796fdf4 100644 --- a/.tx/config +++ b/.tx/config @@ -2,7 +2,7 @@ host = https://www.transifex.com minimum_perc = 5 -[veyon.veyon_42] +[veyon.veyon_50] file_filter = translations/.ts source_file = translations/veyon.ts source_lang = en diff --git a/translations/veyon.ts b/translations/veyon.ts index cce141530..0ff81e87d 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -656,10 +656,6 @@ The public key is used on client computers to authenticate incoming connection r PAIR ID - - Command line support for managing authentication keys - - Commands for managing authentication keys @@ -676,6 +672,14 @@ The public key is used on client computers to authenticate incoming connection r This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. + + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. + + + + Key file authentication + + AuthKeysTableModel @@ -696,6 +700,74 @@ The public key is used on client computers to authenticate incoming connection r + + AuthLogonDialog + + Veyon Logon + + + + Please enter your username and password in order to access computers. + + + + Username + + + + Password + + + + Authentication error + + + + Logon failed with given username and password. Please try again! + + + + + AuthLogonPlugin + + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. + + + + Logon authentication + + + + + AuthSimpleDialog + + Veyon Logon + + + + Please enter the Veyon password: + + + + Authentication error + + + + Logon failed with given password. Please try again! + + + + + AuthSimplePlugin + + The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. + + + + Simple password authentication + + + BuiltinDirectoryConfigurationPage @@ -1719,14 +1791,6 @@ The public key is used on client computers to authenticate incoming connection r Method: - - Logon authentication - - - - Key file authentication - - Test @@ -1735,14 +1799,6 @@ The public key is used on client computers to authenticate incoming connection r Authentication is set up properly on this computer. - - Authentication keys are not set up properly on this computer. - - - - Authentication test - - InternetAccessControlConfigurationPage @@ -2793,10 +2849,6 @@ USAGE About Qt - - Authentication impossible - - Configuration not writable @@ -2857,10 +2909,6 @@ USAGE The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - - No authentication key files were found or your current ones are outdated. Please create new key files using the %1 Configurator. Alternatively set up logon authentication using the %1 Configurator. Otherwise you won't be able to access computers using %1. - - Access denied @@ -3280,33 +3328,6 @@ USAGE - - PasswordDialog - - Username - - - - Password - - - - Veyon Logon - - - - Authentication error - - - - Logon failed with given username and password. Please try again! - - - - Please enter your username and password in order to access computers. - - - PowerControlFeaturePlugin @@ -4048,6 +4069,10 @@ Typically this is required to support terminal servers. WARNING + + Authentication test + + VeyonServiceControl From 05549c88dcec3ba88e1d2f2d358c228de3885edc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 15:49:49 +0200 Subject: [PATCH 0033/1765] 3rdparty: libvncserver: update submodule --- 3rdparty/libvncserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index 132f321ae..6ec2e2ddc 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit 132f321ae61d66205b88f224fd1eb07afbdde439 +Subproject commit 6ec2e2ddccb220fe8f4dc8721b02a184ddf1cd88 From 65612ff4b3b93d32a2e9b55d393b2de91900d534 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 15:50:11 +0200 Subject: [PATCH 0034/1765] X11VncBuiltin: update and clean up header detection list --- .../vncserver/x11vnc-builtin/CMakeLists.txt | 52 +++++++------------ 1 file changed, 19 insertions(+), 33 deletions(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 660bc5e72..c4b112d3b 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -23,7 +23,24 @@ FOREACH(_func ${LIBVNCSERVER_FUNCS}) ENDFOREACH() # headers -SET(LIBVNCSERVER_HEADERS fcntl sys/endian sys/wait sys/uio vfork) +SET(LIBVNCSERVER_HEADERS + endian + fcntl + limits + netinet/in + sys/endian + sys/resource + sys/socket + sys/stat + sys/time + sys/uio + sys/wait + string + vfork + unistd + ws2tcpip +) + FOREACH(_header ${LIBVNCSERVER_HEADERS}) STRING(TOUPPER "${_header}" _huc) STRING(REPLACE "/" "_" _header_escaped "${_huc}") @@ -46,48 +63,17 @@ ENDFOREACH(_func ${FUNCS}) CHECK_C_SOURCE_COMPILES("static __thread int p = 0; int main() {}" HAVE_TLS) -CHECK_INCLUDE_FILES(arpa/inet.h HAVE_ARPA_INET_H) -CHECK_INCLUDE_FILES(ctype.h HAVE_CTYPE_H) -CHECK_INCLUDE_FILES(dlfcn.h HAVE_DLFCN_H) -CHECK_INCLUDE_FILES(endian.h HAVE_ENDIAN_H) -CHECK_INCLUDE_FILES(errno.h HAVE_ERRNO_H) -CHECK_INCLUDE_FILES(fcntl.h HAVE_FCNTL_H) -CHECK_INCLUDE_FILES(inttypes.h HAVE_INTTYPES_H) +# x11vnc header macros CHECK_INCLUDE_FILES(linux/fb.h HAVE_LINUX_FB_H) CHECK_INCLUDE_FILES(linux/input.h HAVE_LINUX_INPUT_H) CHECK_INCLUDE_FILES(linux/uinput.h HAVE_LINUX_UINPUT_H) -CHECK_INCLUDE_FILES(linux/videodev2.h HAVE_LINUX_VIDEODEV2_H) CHECK_INCLUDE_FILES(linux/videodev.h HAVE_LINUX_VIDEODEV_H) -CHECK_INCLUDE_FILES(memory.h HAVE_MEMORY_H) CHECK_INCLUDE_FILES(netdb.h HAVE_NETDB_H) -CHECK_INCLUDE_FILES(netinet/in.h HAVE_NETINET_IN_H) -CHECK_INCLUDE_FILES(process.h HAVE_PROCESS_H) -CHECK_INCLUDE_FILES(pthread.h HAVE_PTHREAD_H) CHECK_INCLUDE_FILES(pwd.h HAVE_PWD_H) -CHECK_INCLUDE_FILES(signal.h HAVE_SIGNAL_H) -CHECK_INCLUDE_FILES(stdarg.h HAVE_STDARG_H) -CHECK_INCLUDE_FILES(stdbool.h HAVE_STDBOOL_H) -CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H) -CHECK_INCLUDE_FILES(stdlib.h HAVE_STDLIB_H) -CHECK_INCLUDE_FILES(string.h HAVE_STRING_H) -CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H) -CHECK_INCLUDE_FILES(sys/endian.h HAVE_SYS_ENDIAN_H) CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H) -CHECK_INCLUDE_FILES(sys/ipc.h HAVE_SYS_IPC_H) -CHECK_INCLUDE_FILES(syslog.h HAVE_SYSLOG_H) -CHECK_INCLUDE_FILES(sys/shm.h HAVE_SYS_SHM_H) -CHECK_INCLUDE_FILES(sys/socket.h HAVE_SYS_SOCKET_H) -CHECK_INCLUDE_FILES(sys/stat.h HAVE_SYS_STAT_H) CHECK_INCLUDE_FILES(sys/stropts.h HAVE_SYS_STROPTS_H) -CHECK_INCLUDE_FILES(sys/timeb.h HAVE_SYS_TIMEB_H) -CHECK_INCLUDE_FILES(sys/time.h HAVE_SYS_TIME_H) -CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H) -CHECK_INCLUDE_FILES(sys/wait.h HAVE_SYS_WAIT_H) CHECK_INCLUDE_FILES(termios.h HAVE_TERMIOS_H) -CHECK_INCLUDE_FILES(time.h HAVE_TIME_H) -CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H) CHECK_INCLUDE_FILES(utmpx.h HAVE_UTMPX_H) -CHECK_INCLUDE_FILES(vfork.h HAVE_VFORK_H) FIND_PACKAGE(X11 REQUIRED) From 8509bbb9cff26a23433997031b1d4977d7bb25a2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 16:00:27 +0200 Subject: [PATCH 0035/1765] VncClientProtocol: include rfbproto.h first --- core/include/VncClientProtocol.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/include/VncClientProtocol.h b/core/include/VncClientProtocol.h index 74e0453b0..45ca2fbbd 100644 --- a/core/include/VncClientProtocol.h +++ b/core/include/VncClientProtocol.h @@ -24,10 +24,10 @@ #pragma once -#include - #include "rfb/rfbproto.h" +#include + #include "CryptoCore.h" class QBuffer; From 6fdc0f1428492ffe4f372f1130142d125297aa4e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 16:01:21 +0200 Subject: [PATCH 0036/1765] DemoServer: forward-declare VncClientProtocol --- plugins/demo/DemoServer.cpp | 47 +++++++++++++++++---------- plugins/demo/DemoServer.h | 11 +++---- plugins/demo/DemoServerConnection.cpp | 2 ++ 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 67f6d7a17..473f71224 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -32,6 +32,7 @@ #include "DemoServer.h" #include "DemoServerConnection.h" #include "VeyonConfiguration.h" +#include "VncClientProtocol.h" DemoServer::DemoServer( int vncServerPort, const Password& vncServerPassword, const DemoAuthentication& authentication, @@ -44,7 +45,7 @@ DemoServer::DemoServer( int vncServerPort, const Password& vncServerPassword, co m_vncServerPort( vncServerPort ), m_tcpServer( new QTcpServer( this ) ), m_vncServerSocket( new QTcpSocket( this ) ), - m_vncClientProtocol( m_vncServerSocket, vncServerPassword ), + m_vncClientProtocol( new VncClientProtocol( m_vncServerSocket, vncServerPassword ) ), m_framebufferUpdateTimer( this ), m_lastFullFramebufferUpdate(), m_requestFullFramebufferUpdate( false ), @@ -90,11 +91,21 @@ DemoServer::~DemoServer() vDebug() << "deleting TCP server"; delete m_tcpServer; + vDebug() << "deleting VNC client protocol"; + delete m_vncClientProtocol; + vDebug() << "finished"; } +const QByteArray& DemoServer::serverInitMessage() const +{ + return m_vncClientProtocol->serverInitMessage(); +} + + + void DemoServer::lockDataForRead() { QElapsedTimer readLockTimer; @@ -113,7 +124,7 @@ void DemoServer::lockDataForRead() void DemoServer::acceptPendingConnections() { - if( m_vncClientProtocol.state() != VncClientProtocol::Running ) + if( m_vncClientProtocol->state() != VncClientProtocol::Running ) { return; } @@ -128,7 +139,7 @@ void DemoServer::acceptPendingConnections() void DemoServer::reconnectToVncServer() { - m_vncClientProtocol.start(); + m_vncClientProtocol->start(); m_vncServerSocket->connectToHost( QHostAddress::LocalHost, static_cast( m_vncServerPort ) ); } @@ -137,13 +148,13 @@ void DemoServer::reconnectToVncServer() void DemoServer::readFromVncServer() { - if( m_vncClientProtocol.state() != VncClientProtocol::Running ) + if( m_vncClientProtocol->state() != VncClientProtocol::Running ) { - while( m_vncClientProtocol.read() ) + while( m_vncClientProtocol->read() ) { } - if( m_vncClientProtocol.state() == VncClientProtocol::Running ) + if( m_vncClientProtocol->state() == VncClientProtocol::Running ) { start(); } @@ -160,7 +171,7 @@ void DemoServer::readFromVncServer() void DemoServer::requestFramebufferUpdate() { - if( m_vncClientProtocol.state() != VncClientProtocol::Running ) + if( m_vncClientProtocol->state() != VncClientProtocol::Running ) { return; } @@ -169,13 +180,13 @@ void DemoServer::requestFramebufferUpdate() m_lastFullFramebufferUpdate.elapsed() >= m_keyFrameInterval ) { vDebug() << "Requesting full framebuffer update"; - m_vncClientProtocol.requestFramebufferUpdate( false ); + m_vncClientProtocol->requestFramebufferUpdate( false ); m_lastFullFramebufferUpdate.restart(); m_requestFullFramebufferUpdate = false; } else { - m_vncClientProtocol.requestFramebufferUpdate( true ); + m_vncClientProtocol->requestFramebufferUpdate( true ); } } @@ -183,15 +194,15 @@ void DemoServer::requestFramebufferUpdate() bool DemoServer::receiveVncServerMessage() { - if( m_vncClientProtocol.receiveMessage() ) + if( m_vncClientProtocol->receiveMessage() ) { - if( m_vncClientProtocol.lastMessageType() == rfbFramebufferUpdate ) + if( m_vncClientProtocol->lastMessageType() == rfbFramebufferUpdate ) { - enqueueFramebufferUpdateMessage( m_vncClientProtocol.lastMessage() ); + enqueueFramebufferUpdateMessage( m_vncClientProtocol->lastMessage() ); } else { - vWarning() << "skipping server message of type" << static_cast( m_vncClientProtocol.lastMessageType() ); + vWarning() << "skipping server message of type" << static_cast( m_vncClientProtocol->lastMessageType() ); } return true; @@ -214,11 +225,11 @@ void DemoServer::enqueueFramebufferUpdateMessage( const QByteArray& message ) vDebug() << "locking for write took" << writeLockTime.elapsed() << "ms"; } - const auto lastUpdatedRect = m_vncClientProtocol.lastUpdatedRect(); + const auto lastUpdatedRect = m_vncClientProtocol->lastUpdatedRect(); const bool isFullUpdate = ( lastUpdatedRect.x() == 0 && lastUpdatedRect.y() == 0 && - lastUpdatedRect.width() == m_vncClientProtocol.framebufferWidth() && - lastUpdatedRect.height() == m_vncClientProtocol.framebufferHeight() ); + lastUpdatedRect.width() == m_vncClientProtocol->framebufferWidth() && + lastUpdatedRect.height() == m_vncClientProtocol->framebufferHeight() ); const auto queueSize = framebufferUpdateMessageQueueSize(); @@ -300,14 +311,14 @@ bool DemoServer::setVncServerPixelFormat() format.pad1 = 0; format.pad2 = 0; - return m_vncClientProtocol.setPixelFormat( format ); + return m_vncClientProtocol->setPixelFormat( format ); } bool DemoServer::setVncServerEncodings() { - return m_vncClientProtocol. + return m_vncClientProtocol-> setEncodings( { rfbEncodingUltraZip, rfbEncodingUltra, diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index 9575de4ae..5c6aa2369 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -29,11 +29,13 @@ #include #include -#include "VncClientProtocol.h" +#include "CryptoCore.h" class DemoAuthentication; class DemoConfiguration; class QTcpServer; +class QTcpSocket; +class VncClientProtocol; class DemoServer : public QObject { @@ -51,10 +53,7 @@ class DemoServer : public QObject return m_configuration; } - const QByteArray& serverInitMessage() const - { - return m_vncClientProtocol.serverInitMessage(); - } + const QByteArray& serverInitMessage() const; void lockDataForRead(); @@ -97,7 +96,7 @@ class DemoServer : public QObject QTcpServer* m_tcpServer; QTcpSocket* m_vncServerSocket; - VncClientProtocol m_vncClientProtocol; + VncClientProtocol* m_vncClientProtocol; QReadWriteLock m_dataLock; QTimer m_framebufferUpdateTimer; diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index c9cc0adc6..069141532 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -23,6 +23,8 @@ * */ +#include "rfb/rfbproto.h" + #include #include "DemoConfiguration.h" From c39bd65d3971c04415a9b66bbdbf6b964d99a663 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 16:18:39 +0200 Subject: [PATCH 0037/1765] UltraVNC: distinguish compiler flags for C/C++ --- .../vncserver/ultravnc-builtin/CMakeLists.txt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index 5cd56dc05..2ae30084d 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -9,7 +9,7 @@ INCLUDE_DIRECTORIES( ${ultravnc_DIR}/winvnc/winvnc ) -SET(ultravnc_SOURCES +SET(ultravnc_CXX_SOURCES ${ultravnc_DIR}/winvnc/winvnc/HideDesktop.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbRegion_win32.cpp ${ultravnc_DIR}/winvnc/winvnc/vistahook.cpp @@ -21,7 +21,6 @@ SET(ultravnc_SOURCES ${ultravnc_DIR}/winvnc/winvnc/vncserver.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbUpdateTracker.cpp ${ultravnc_DIR}/winvnc/winvnc/vncencodehext.cpp - ${ultravnc_DIR}/winvnc/winvnc/d3des.c ${ultravnc_DIR}/winvnc/winvnc/vncproperties.cpp ${ultravnc_DIR}/winvnc/winvnc/security.cpp ${ultravnc_DIR}/winvnc/winvnc/buildtime.cpp @@ -42,7 +41,6 @@ SET(ultravnc_SOURCES ${ultravnc_DIR}/winvnc/winvnc/vnckeymap.cpp ${ultravnc_DIR}/winvnc/winvnc/vncOSVersion.cpp ${ultravnc_DIR}/winvnc/winvnc/winvnc.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncauth.c ${ultravnc_DIR}/winvnc/winvnc/stdhdrs.cpp ${ultravnc_DIR}/winvnc/winvnc/vncEncodeUltra.cpp ${ultravnc_DIR}/winvnc/winvnc/vncEncodeUltra2.cpp @@ -67,6 +65,11 @@ SET(ultravnc_SOURCES vncntlm.cpp ) +SET(ultravnc_C_SOURCES + ${ultravnc_DIR}/winvnc/winvnc/d3des.c + ${ultravnc_DIR}/winvnc/winvnc/vncauth.c + ) + ADD_DEFINITIONS(-DULTRAVNC_VEYON_SUPPORT -D_INTERNALLIB -D_WIN32_WINNT=0x0600) IF(VEYON_BUILD_WIN64) @@ -79,7 +82,8 @@ BUILD_PLUGIN(builtin-ultravnc-server LogoffEventFilter.cpp UltraVncConfigurationWidget.cpp UltraVncConfigurationWidget.ui - ${ultravnc_SOURCES} + ${ultravnc_C_SOURCES} + ${ultravnc_CXX_SOURCES} BuiltinUltraVncServer.h LogoffEventFilter.h UltraVncConfigurationWidget.h @@ -87,4 +91,8 @@ BUILD_PLUGIN(builtin-ultravnc-server ) TARGET_LINK_LIBRARIES(builtin-ultravnc-server -luserenv -lole32 -lversion -lgdi32 -limm32 -lwinmm) -SET_SOURCE_FILES_PROPERTIES(${ultravnc_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-comments -Wno-attributes -Wno-terminate -Wno-write-strings -Wno-parentheses -Wno-misleading-indentation -Wno-unused-result -Wno-unused-label -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-conversion-null -Wno-format-zero-length -Wno-sign-compare -fexceptions") + +SET(ULTRAVNC_COMPILER_FLAGS "-Wno-comments -Wno-attributes -Wno-write-strings -Wno-parentheses -Wno-misleading-indentation -Wno-unused-result -Wno-unused-label -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-format-zero-length -Wno-sign-compare -fexceptions") + +SET_SOURCE_FILES_PROPERTIES(${ultravnc_C_SOURCES} PROPERTIES COMPILE_FLAGS "${ULTRAVNC_COMPILER_FLAGS}") +SET_SOURCE_FILES_PROPERTIES(${ultravnc_CXX_SOURCES} PROPERTIES COMPILE_FLAGS "${ULTRAVNC_COMPILER_FLAGS} -Wno-terminate -Wno-conversion-null") From a1987ba8925829506c6a84c6ee1a3989b98464f8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 16:22:21 +0200 Subject: [PATCH 0038/1765] WindowsUserFunctions: clear logon on instantiation --- plugins/platform/windows/WindowsUserFunctions.cpp | 10 ++++++++++ plugins/platform/windows/WindowsUserFunctions.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index dd3c2557a..868017929 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -199,6 +199,16 @@ static bool clearAutologon() +WindowsUserFunctions::WindowsUserFunctions() +{ + if( isAnyUserLoggedOn() ) + { + clearAutologon(); + } +} + + + QString WindowsUserFunctions::fullName( const QString& username ) { QString fullName; diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index 8c939823c..ebe0abd53 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -31,6 +31,8 @@ class WindowsUserFunctions : public PlatformUserFunctions { public: + WindowsUserFunctions(); + QString fullName( const QString& username ) override; QStringList userGroups( bool queryDomainGroups ) override; From a96bd7da5643e1fb0ffe82743cb48b2691d3219f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 16:22:35 +0200 Subject: [PATCH 0039/1765] CMakeLists: make all warnings errors --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a869cb0c7..df06ce9df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -222,8 +222,8 @@ SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LTO_FLAGS}") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LTO_FLAGS}") ENDIF() -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-exceptions -std=c++11 -fstack-protector-strong ${CXXFLAGS}") -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -fstack-protector-strong ${CFLAGS}") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -fstack-protector-strong ${CFLAGS}") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -fstack-protector-strong -fno-exceptions -std=c++11 ${CXXFLAGS}") IF(NOT VEYON_BUILD_WIN32) SET(SYS_INC SYSTEM) ENDIF() From 89dfeb9c2bf568e13744a32df59f14404fc642b6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 16:26:06 +0200 Subject: [PATCH 0040/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 8b749632a..4c3b844ff 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 8b749632a26a3b8d81cb062d43eec980a5b6dca1 +Subproject commit 4c3b844ffb100d4c543b5a00d36aad57826f1aff From 7aa61496a50f7f154282b12d934ec60d12db0182 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 17:08:17 +0200 Subject: [PATCH 0041/1765] CMake: always generate rfbconfig.h --- CMakeLists.txt | 4 +--- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index df06ce9df..9662eb6ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -201,9 +201,7 @@ IF(VEYON_BUILD_WIN32) ENDIF() FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb) -IF(NOT VEYON_BUILD_LINUX OR VEYON_X11VNC_EXTERNAL) - CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/3rdparty/libvncserver/rfb/rfbconfig.h.cmakein ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb/rfbconfig.h @ONLY) -ENDIF() +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/3rdparty/libvncserver/rfb/rfbconfig.h.cmakein ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb/rfbconfig.h @ONLY) ### END: libvncclient configuration diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index c4b112d3b..f8ffc49b8 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -52,8 +52,6 @@ SET(FULL_PACKAGE_NAME "Veyon") SET(PACKAGE_VERSION "${VERSION_STRING}") SET(VERSION_PATCHLEVEL "${VERSION_PATCH}") -CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/3rdparty/libvncserver/rfb/rfbconfig.h.cmakein ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb/rfbconfig.h @ONLY) - # check for x11vnc requirements SET(FUNCS dup2 floor ftime geteuid gethostbyname gethostname getpwnam getpwuid getspnam gettimeofday getuid grantpt inet_ntoa initgroups memcmp memcpy memmove memset mkfifo mmap fork pow putenv select seteuid setegid setgid setpgrp setsid setuid setutxent shmat socket strchr strcspn strdup strerror strftime strpbrk strrchr strstr uname vfork vprintf waitpid) FOREACH(_func ${FUNCS}) From ca14aad3932bb535940210a61f5deb45903a1066 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 17:08:35 +0200 Subject: [PATCH 0042/1765] CMake: enable 24BPP support for libvncserver --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9662eb6ae..ead32ee04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -194,6 +194,7 @@ SET(LIBVNCSERVER_HAVE_LZO TRUE) SET(LIBVNCSERVER_HAVE_LIBPNG TRUE) SET(LIBVNCSERVER_HAVE_LIBZ TRUE) SET(LIBVNCSERVER_HAVE_LIBSSL TRUE) +SET(LIBVNCSERVER_ALLOW24BPP TRUE) SET(LIBVNCSERVER_IPv6 TRUE) IF(VEYON_BUILD_WIN32) From 6b3876457a10fbf309f37f034d5bc2367986fc03 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 17:08:54 +0200 Subject: [PATCH 0043/1765] Core: enable TLS support for libvncclient --- core/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index cfe383559..77b831acb 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -26,11 +26,12 @@ SET(libvncclient_SOURCES ${libvncserver_DIR}/libvncclient/listen.c ${libvncserver_DIR}/libvncclient/rfbproto.c ${libvncserver_DIR}/libvncclient/sockets.c - ${libvncserver_DIR}/libvncclient/tls_none.c + ${libvncserver_DIR}/libvncclient/tls_openssl.c ${libvncserver_DIR}/libvncclient/vncviewer.c ${libvncserver_DIR}/common/d3des.c ${libvncserver_DIR}/common/turbojpeg.c) +SET_SOURCE_FILES_PROPERTIES(${libvncclient_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-function -Wno-unused-variable") ADD_DEFINITIONS(-DBUILD_VEYON_CORE_LIBRARY) From b4a48e5f2917481066ae9365fae38b0972c25a17 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 17:09:54 +0200 Subject: [PATCH 0044/1765] X11VncBuiltin: fix header detection --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index f8ffc49b8..8060f4b94 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -67,9 +67,11 @@ CHECK_INCLUDE_FILES(linux/input.h HAVE_LINUX_INPUT_H) CHECK_INCLUDE_FILES(linux/uinput.h HAVE_LINUX_UINPUT_H) CHECK_INCLUDE_FILES(linux/videodev.h HAVE_LINUX_VIDEODEV_H) CHECK_INCLUDE_FILES(netdb.h HAVE_NETDB_H) +CHECK_INCLUDE_FILES(netinet/in.h HAVE_NETINET_IN_H) CHECK_INCLUDE_FILES(pwd.h HAVE_PWD_H) CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H) CHECK_INCLUDE_FILES(sys/stropts.h HAVE_SYS_STROPTS_H) +CHECK_INCLUDE_FILES(sys/wait.h HAVE_SYS_WAIT_H) CHECK_INCLUDE_FILES(termios.h HAVE_TERMIOS_H) CHECK_INCLUDE_FILES(utmpx.h HAVE_UTMPX_H) @@ -221,10 +223,10 @@ SET(x11vnc_SOURCES x11vnc-veyon.c ${x11vnc_DIR}/src/uinput.c ) -ENDIF() - SET_SOURCE_FILES_PROPERTIES(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-format -Wno-discarded-qualifiers" COTIRE_EXCLUDED TRUE) +ENDIF() + BUILD_PLUGIN(builtin-x11vnc-server BuiltinX11VncServer.cpp X11VncConfigurationWidget.cpp From 36b7796001175a7a2a9e8cd4f1d41ed67d0112d1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 17:13:09 +0200 Subject: [PATCH 0045/1765] Core: fix compile flags for libvncclient sources --- core/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 77b831acb..e7e4a0e85 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -31,7 +31,7 @@ SET(libvncclient_SOURCES ${libvncserver_DIR}/common/d3des.c ${libvncserver_DIR}/common/turbojpeg.c) -SET_SOURCE_FILES_PROPERTIES(${libvncclient_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-function -Wno-unused-variable") +SET_SOURCE_FILES_PROPERTIES(${libvncclient_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-function -Wno-unused-variable -Wno-incompatible-pointer-types") ADD_DEFINITIONS(-DBUILD_VEYON_CORE_LIBRARY) From 0fb0c3ee86288ea5a90210d6f4660c58064be444 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 29 Jul 2019 17:23:54 +0200 Subject: [PATCH 0046/1765] CMake: write rfbconfig.h after processing subdirs --- CMakeLists.txt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ead32ee04..fd677862b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -201,9 +201,6 @@ IF(VEYON_BUILD_WIN32) SET(LIBVNCSERVER_NEED_INADDR_T TRUE) ENDIF() -FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb) -CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/3rdparty/libvncserver/rfb/rfbconfig.h.cmakein ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb/rfbconfig.h @ONLY) - ### END: libvncclient configuration @@ -262,6 +259,11 @@ ADD_SUBDIRECTORY(worker) ADD_SUBDIRECTORY(plugins) ADD_SUBDIRECTORY(translations) +# write libvncserver/libvncclient configuration header +FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb) +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/3rdparty/libvncserver/rfb/rfbconfig.h.cmakein ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb/rfbconfig.h @ONLY) + + # # add target for generating Windows installer # From 3ffd8e22ebcad546abfb08075131acc6b4ebfdb1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:02:17 +0200 Subject: [PATCH 0047/1765] 3rdparty: libvncserver: update submodule --- 3rdparty/libvncserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index 6ec2e2ddc..9b5b4bbf2 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit 6ec2e2ddccb220fe8f4dc8721b02a184ddf1cd88 +Subproject commit 9b5b4bbf2cf1e5fc37a6a7a777134d300235b25a From efa018a59a963a4710ad1aa93b17cf8dce188297 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:02:39 +0200 Subject: [PATCH 0048/1765] CMake: require Threads library --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index fd677862b..1271258be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,6 +154,9 @@ FIND_PACKAGE(JPEG REQUIRED) FIND_PACKAGE(LZO REQUIRED) FIND_PACKAGE(QCA REQUIRED) +SET(CMAKE_THREAD_PREFER_PTHREAD TRUE) +FIND_PACKAGE(Threads REQUIRED) + # FindOpenSSL.cmake in recent versions of CMake will only find the DLLs instead # of the import libraries if CYGWIN is not set SET(CYGWIN TRUE) From 9b8ffe5002c0dc50af19495330d90a1495fb2e08 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:03:25 +0200 Subject: [PATCH 0049/1765] CMake: move specific code to LibVNCServerIntegration.cmake --- CMakeLists.txt | 31 ++------- cmake/modules/LibVNCServerIntegration.cmake | 77 +++++++++++++++++++++ 2 files changed, 81 insertions(+), 27 deletions(-) create mode 100644 cmake/modules/LibVNCServerIntegration.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 1271258be..d0e16fd42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,42 +169,19 @@ IF(VEYON_BUILD_LINUX) ENDIF() -### BEGIN: libvncclient configuration -CHECK_INCLUDE_FILES(endian.h LIBVNCSERVER_HAVE_ENDIAN_H) -CHECK_INCLUDE_FILES(limits.h LIBVNCSERVER_HAVE_LIMITS_H) -CHECK_INCLUDE_FILES(time.h LIBVNCSERVER_HAVE_TIME_H) -CHECK_INCLUDE_FILES(unistd.h LIBVNCSERVER_HAVE_UNISTD_H) -CHECK_INCLUDE_FILES(ws2tcpip.h LIBVNCSERVER_HAVE_WS2TCPIP_H) -CHECK_INCLUDE_FILES(netinet/in.h LIBVNCSERVER_HAVE_NETINET_IN_H) -CHECK_INCLUDE_FILES(sys/endian.h LIBVNCSERVER_HAVE_SYS_ENDIAN_H) -CHECK_INCLUDE_FILES(sys/socket.h LIBVNCSERVER_HAVE_SYS_SOCKET_H) -CHECK_INCLUDE_FILES(sys/stat.h LIBVNCSERVER_HAVE_SYS_STAT_H) -CHECK_INCLUDE_FILES(sys/time.h LIBVNCSERVER_HAVE_SYS_TIME_H) -CHECK_INCLUDE_FILES(sys/timeb.h LIBVNCSERVER_HAVE_SYS_TIMEB_H) -CHECK_INCLUDE_FILES(sys/types.h LIBVNCSERVER_HAVE_SYS_TYPES_H) - -IF(LIBVNCSERVER_HAVE_SYS_SOCKET_H) - LIST(APPEND CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") -ENDIF() - -CHECK_TYPE_SIZE("pid_t" LIBVNCSERVER_PID_T) -CHECK_TYPE_SIZE("size_t" LIBVNCSERVER_SIZE_T) -CHECK_TYPE_SIZE("socklen_t" LIBVNCSERVER_SOCKLEN_T) +### BEGIN: libvncserver configuration +INCLUDE(LibVNCServerIntegration) SET(_RFB_RFBCONFIG_H TRUE) SET(LIBVNCSERVER_HAVE_LIBJPEG TRUE) SET(LIBVNCSERVER_HAVE_LZO TRUE) SET(LIBVNCSERVER_HAVE_LIBPNG TRUE) +SET(LIBVNCSERVER_HAVE_LIBPTHREAD TRUE) SET(LIBVNCSERVER_HAVE_LIBZ TRUE) SET(LIBVNCSERVER_HAVE_LIBSSL TRUE) SET(LIBVNCSERVER_ALLOW24BPP TRUE) SET(LIBVNCSERVER_IPv6 TRUE) - -IF(VEYON_BUILD_WIN32) - SET(LIBVNCSERVER_NEED_INADDR_T TRUE) -ENDIF() - -### END: libvncclient configuration +### END: libvncserver configuration IF(SANITIZE) diff --git a/cmake/modules/LibVNCServerIntegration.cmake b/cmake/modules/LibVNCServerIntegration.cmake new file mode 100644 index 000000000..c734974e4 --- /dev/null +++ b/cmake/modules/LibVNCServerIntegration.cmake @@ -0,0 +1,77 @@ +include(CheckFunctionExists) +include(CheckSymbolExists) +include(CheckIncludeFile) +include(CheckTypeSize) +include(TestBigEndian) +include(CheckCSourceCompiles) +include(CheckCSourceRuns) + +check_include_file("endian.h" LIBVNCSERVER_HAVE_ENDIAN_H) +check_include_file("fcntl.h" LIBVNCSERVER_HAVE_FCNTL_H) +check_include_file("netinet/in.h" LIBVNCSERVER_HAVE_NETINET_IN_H) +check_include_file("sys/endian.h" LIBVNCSERVER_HAVE_SYS_ENDIAN_H) +check_include_file("sys/socket.h" LIBVNCSERVER_HAVE_SYS_SOCKET_H) +check_include_file("sys/stat.h" LIBVNCSERVER_HAVE_SYS_STAT_H) +check_include_file("sys/time.h" LIBVNCSERVER_HAVE_SYS_TIME_H) +check_include_file("sys/types.h" LIBVNCSERVER_HAVE_SYS_TYPES_H) +check_include_file("sys/wait.h" LIBVNCSERVER_HAVE_SYS_WAIT_H) +check_include_file("unistd.h" LIBVNCSERVER_HAVE_UNISTD_H) +check_include_file("sys/uio.h" LIBVNCSERVER_HAVE_SYS_UIO_H) +check_include_file("sys/resource.h" LIBVNCSERVER_HAVE_SYS_RESOURCE_H) + + +# headers needed for check_type_size() +check_include_file("vfork.h" LIBVNCSERVER_HAVE_VFORK_H) +check_include_file("ws2tcpip.h" LIBVNCSERVER_HAVE_WS2TCPIP_H) +check_include_file("arpa/inet.h" HAVE_ARPA_INET_H) +check_include_file("stdint.h" HAVE_STDINT_H) +check_include_file("stddef.h" HAVE_STDDEF_H) +check_include_file("sys/types.h" HAVE_SYS_TYPES_H) + +# error out if required headers not found +if(NOT HAVE_STDINT_H) + message(FATAL_ERROR "Could NOT find required header stdint.h") +endif() + +check_function_exists(gettimeofday LIBVNCSERVER_HAVE_GETTIMEOFDAY) +check_function_exists(vfork LIBVNCSERVER_HAVE_VFORK) +check_function_exists(vprintf LIBVNCSERVER_HAVE_VPRINTF) +check_function_exists(mmap LIBVNCSERVER_HAVE_MMAP) +check_function_exists(fork LIBVNCSERVER_HAVE_FORK) +check_function_exists(ftime LIBVNCSERVER_HAVE_FTIME) +check_function_exists(gethostbyname LIBVNCSERVER_HAVE_GETHOSTBYNAME) +check_function_exists(gethostname LIBVNCSERVER_HAVE_GETHOSTNAME) +check_function_exists(inet_ntoa LIBVNCSERVER_HAVE_INET_NTOA) +check_function_exists(memmove LIBVNCSERVER_HAVE_MEMMOVE) +check_function_exists(memset LIBVNCSERVER_HAVE_MEMSET) +check_function_exists(mkfifo LIBVNCSERVER_HAVE_MKFIFO) +check_function_exists(select LIBVNCSERVER_HAVE_SELECT) +check_function_exists(socket LIBVNCSERVER_HAVE_SOCKET) +check_function_exists(strchr LIBVNCSERVER_HAVE_STRCHR) +check_function_exists(strcspn LIBVNCSERVER_HAVE_STRCSPN) +check_function_exists(strdup LIBVNCSERVER_HAVE_STRDUP) +check_function_exists(strerror LIBVNCSERVER_HAVE_STRERROR) +check_function_exists(strstr LIBVNCSERVER_HAVE_STRSTR) + +check_symbol_exists(htobe64 "endian.h" LIBVNCSERVER_HAVE_HTOBE64) +check_symbol_exists(OSSwapHostToBigInt64 "libkern/OSByteOrder.h" LIBVNCSERVER_HAVE_OSSWAPHOSTTOBIGINT64) + +if(LIBVNCSERVER_HAVE_SYS_SOCKET_H) + # socklen_t + list(APPEND CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") +endif(LIBVNCSERVER_HAVE_SYS_SOCKET_H) +if(HAVE_ARPA_INET_H) + # in_addr_t + list(APPEND CMAKE_EXTRA_INCLUDE_FILES "arpa/inet.h") +endif(HAVE_ARPA_INET_H) + +check_type_size(pid_t LIBVNCSERVER_PID_T) +check_type_size(size_t LIBVNCSERVER_SIZE_T) +check_type_size(socklen_t LIBVNCSERVER_SOCKLEN_T) +check_type_size(in_addr_t LIBVNCSERVER_IN_ADDR_T) +if(NOT HAVE_LIBVNCSERVER_IN_ADDR_T) + set(LIBVNCSERVER_NEED_INADDR_T 1) +endif(NOT HAVE_LIBVNCSERVER_IN_ADDR_T) + +TEST_BIG_ENDIAN(LIBVNCSERVER_WORDS_BIGENDIAN) + From 3d402be5591efb068488f78ca4daf583dcf89066 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:03:58 +0200 Subject: [PATCH 0050/1765] VeyonCore: use the veyon_core_EXPORTS definition --- core/include/VeyonCore.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/include/VeyonCore.h b/core/include/VeyonCore.h index 69a7601dd..e119d4eaf 100644 --- a/core/include/VeyonCore.h +++ b/core/include/VeyonCore.h @@ -34,7 +34,7 @@ #include "QtCompat.h" -#if defined(BUILD_VEYON_CORE_LIBRARY) +#if defined(veyon_core_EXPORTS) # define VEYON_CORE_EXPORT Q_DECL_EXPORT #else # define VEYON_CORE_EXPORT Q_DECL_IMPORT From bd746255de5248e5fe932f58bce4405779308fbb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:04:35 +0200 Subject: [PATCH 0051/1765] CMake: BuildApplication: use common target settings --- cli/CMakeLists.txt | 3 --- cmake/modules/BuildApplication.cmake | 2 ++ configurator/CMakeLists.txt | 2 -- master/CMakeLists.txt | 3 +-- server/CMakeLists.txt | 3 --- service/CMakeLists.txt | 3 --- worker/CMakeLists.txt | 2 -- 7 files changed, 3 insertions(+), 15 deletions(-) diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index a26ab81aa..33f01a7f2 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -1,18 +1,15 @@ INCLUDE(BuildApplication) INCLUDE(WindowsBuildHelpers) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) SET(cli_SOURCES src/main.cpp) BUILD_APPLICATION(veyon-cli ${cli_SOURCES}) -TARGET_LINK_LIBRARIES(veyon-cli veyon-core Qt5::Network) ADD_WINDOWS_RESOURCE(veyon-cli ${CMAKE_CURRENT_BINARY_DIR}/veyon-cli.rc) MAKE_CONSOLE_APP(veyon-cli) IF(VEYON_BUILD_WIN32) BUILD_APPLICATION(veyon-wcli ${cli_SOURCES}) -TARGET_LINK_LIBRARIES(veyon-wcli veyon-core Qt5::Network) ADD_WINDOWS_RESOURCE(veyon-wcli ${CMAKE_CURRENT_BINARY_DIR}/veyon-wcli.rc) MAKE_GRAPHICAL_APP(veyon-wcli) diff --git a/cmake/modules/BuildApplication.cmake b/cmake/modules/BuildApplication.cmake index 25144ea24..8e8155204 100644 --- a/cmake/modules/BuildApplication.cmake +++ b/cmake/modules/BuildApplication.cmake @@ -12,5 +12,7 @@ MACRO(BUILD_APPLICATION APPLICATION_NAME) ADD_EXECUTABLE(${APPLICATION_NAME} ${APPLICATION_SOURCES}) INSTALL(TARGETS ${APPLICATION_NAME} RUNTIME DESTINATION bin) ENDIF() + TARGET_INCLUDE_DIRECTORIES(${APPLICATION_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) + TARGET_LINK_LIBRARIES(${APPLICATION_NAME} veyon-core) ENDMACRO() diff --git a/configurator/CMakeLists.txt b/configurator/CMakeLists.txt index ffdc1d0d9..798732d3d 100644 --- a/configurator/CMakeLists.txt +++ b/configurator/CMakeLists.txt @@ -5,9 +5,7 @@ FILE(GLOB configurator_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h) FILE(GLOB configurator_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/*.ui) SET(configurator_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/resources/configurator.qrc) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) BUILD_APPLICATION(veyon-configurator ${configurator_SOURCES} ${configurator_INCLUDES} ${configurator_RESOURCES}) -TARGET_LINK_LIBRARIES(veyon-configurator veyon-core) ADD_WINDOWS_RESOURCE(veyon-configurator) MAKE_GRAPHICAL_APP(veyon-configurator) diff --git a/master/CMakeLists.txt b/master/CMakeLists.txt index 2dbdc9633..f63c2d722 100644 --- a/master/CMakeLists.txt +++ b/master/CMakeLists.txt @@ -17,9 +17,8 @@ IF(VEYON_DEBUG) SET(master_RESOURCES ${master_RESOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/resources/examples.qrc) ENDIF() -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${kitemmodels_SOURCE_DIR}) BUILD_APPLICATION(veyon-master ${master_SOURCES} ${master_INCLUDES} ${master_RESOURCES} ${kitemmodels_SOURCES}) -TARGET_LINK_LIBRARIES(veyon-master veyon-core) +TARGET_INCLUDE_DIRECTORIES(veyon-master PRIVATE ${kitemmodels_SOURCE_DIR}) ADD_WINDOWS_RESOURCE(veyon-master) MAKE_GRAPHICAL_APP(veyon-master) diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index e15be3d8b..e3eafab09 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -4,10 +4,7 @@ INCLUDE(WindowsBuildHelpers) FILE(GLOB server_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h) FILE(GLOB server_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) - BUILD_APPLICATION(veyon-server ${server_SOURCES} ${server_INCLUDES}) -TARGET_LINK_LIBRARIES(veyon-server veyon-core) ADD_WINDOWS_RESOURCE(veyon-server) MAKE_GRAPHICAL_APP(veyon-server) diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt index 83d66d551..e7e0a0711 100644 --- a/service/CMakeLists.txt +++ b/service/CMakeLists.txt @@ -1,10 +1,7 @@ INCLUDE(BuildApplication) INCLUDE(WindowsBuildHelpers) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) - BUILD_APPLICATION(veyon-service ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp) -TARGET_LINK_LIBRARIES(veyon-service veyon-core) ADD_WINDOWS_RESOURCE(veyon-service) MAKE_GRAPHICAL_APP(veyon-service) diff --git a/worker/CMakeLists.txt b/worker/CMakeLists.txt index df1275009..6bbfed3af 100644 --- a/worker/CMakeLists.txt +++ b/worker/CMakeLists.txt @@ -4,9 +4,7 @@ INCLUDE(WindowsBuildHelpers) FILE(GLOB worker_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h) FILE(GLOB worker_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) BUILD_APPLICATION(veyon-worker ${worker_SOURCES} ${worker_INCLUDES}) -TARGET_LINK_LIBRARIES(veyon-worker veyon-core Qt5::Network) ADD_WINDOWS_RESOURCE(veyon-worker) MAKE_GRAPHICAL_APP(veyon-worker) From 64e17d5678143e1fdad539c940b36bbd993bf130 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:07:10 +0200 Subject: [PATCH 0052/1765] Core: use target-specific include dirs & libraries --- CMakeLists.txt | 8 -------- core/CMakeLists.txt | 19 ++++++++++++++++--- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d0e16fd42..427b1eb02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -200,9 +200,6 @@ ENDIF() SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -fstack-protector-strong ${CFLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -fstack-protector-strong -fno-exceptions -std=c++11 ${CXXFLAGS}") -IF(NOT VEYON_BUILD_WIN32) - SET(SYS_INC SYSTEM) -ENDIF() ADD_DEFINITIONS(-DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050600 -D_FORTIFY_SOURCE=2 -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_BYTEARRAY) @@ -218,11 +215,6 @@ SET(ultravnc_DIR ${3rdparty_DIR}/ultravnc) SET(libvncserver_DIR ${3rdparty_DIR}/libvncserver) SET(x11vnc_DIR ${3rdparty_DIR}/x11vnc) -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/${VEYON_CORE_INCLUDE_DIR} ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR} ${libvncserver_DIR}) -INCLUDE_DIRECTORIES(${SYS_INC} ${ZLIB_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${QCA_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${LZO_INCLUDE_DIR}) - -LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/core) - SET(CMAKE_SKIP_BUILD_RPATH FALSE) SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${VEYON_LIB_DIR}") diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index e7e4a0e85..482fc92e9 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -33,16 +33,29 @@ SET(libvncclient_SOURCES SET_SOURCE_FILES_PROPERTIES(${libvncclient_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-function -Wno-unused-variable -Wno-incompatible-pointer-types") -ADD_DEFINITIONS(-DBUILD_VEYON_CORE_LIBRARY) - -INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include ${libvncserver_DIR}/common/) ADD_LIBRARY(veyon-core SHARED ${veyoncore_SOURCES} ${veyoncore_INCLUDES} ${core_RESOURCES} ${libvncclient_SOURCES}) +TARGET_INCLUDE_DIRECTORIES(veyon-core PUBLIC + ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_BINARY_DIR}/include + ${libvncserver_DIR}/common/ + ${libvncserver_DIR} + ${QCA_INCLUDE_DIR} +) + +TARGET_INCLUDE_DIRECTORIES(veyon-core PRIVATE SYSTEM ${ZLIB_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${LZO_INCLUDE_DIR}) + +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/core) + + TARGET_LINK_LIBRARIES(veyon-core Qt5::Concurrent Qt5::Gui Qt5::Network Qt5::Widgets + Threads::Threads ${VEYON_DEBUG_LIBRARIES} ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} From a3f37f2568fc2e86acab95f4ae562886db31a9f8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:07:50 +0200 Subject: [PATCH 0053/1765] Platform: use target-specific include dirs --- plugins/platform/linux/CMakeLists.txt | 4 ++-- plugins/platform/linux/auth-helper/CMakeLists.txt | 3 +-- plugins/platform/windows/CMakeLists.txt | 4 +--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index ad797141c..6ecd8c076 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -7,8 +7,6 @@ pkg_check_modules(procps REQUIRED libprocps) INCLUDE(BuildPlugin) -INCLUDE_DIRECTORIES(${procps_INCLUDE_DIRS}) - BUILD_PLUGIN(linux-platform LinuxPlatformPlugin.cpp LinuxCoreFunctions.cpp @@ -35,6 +33,8 @@ BUILD_PLUGIN(linux-platform linux.qrc ) +TARGET_INCLUDE_DIRECTORIES(linux-platform PRIVATE ${procps_INCLUDE_DIRS}) + TARGET_LINK_LIBRARIES(linux-platform ${X11_LIBRARIES} Qt5::DBus diff --git a/plugins/platform/linux/auth-helper/CMakeLists.txt b/plugins/platform/linux/auth-helper/CMakeLists.txt index 5736237e2..b71f90d24 100644 --- a/plugins/platform/linux/auth-helper/CMakeLists.txt +++ b/plugins/platform/linux/auth-helper/CMakeLists.txt @@ -1,5 +1,3 @@ -INCLUDE_DIRECTORIES(${PAM_INCLUDE_DIR}) - FIND_PACKAGE(PAM REQUIRED) SET(CMAKE_SKIP_BUILD_RPATH TRUE) @@ -8,6 +6,7 @@ SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) ADD_EXECUTABLE(veyon-auth-helper ${CMAKE_CURRENT_SOURCE_DIR}/VeyonAuthHelper.cpp) +TARGET_INCLUDE_DIRECTORIES(veyon-auth-helper PRIVATE ${PAM_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(veyon-auth-helper Qt5::Core ${PAM_LIBRARY}) INSTALL(TARGETS veyon-auth-helper RUNTIME DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE SETUID GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index fcbf84749..63533e4c1 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -38,9 +38,7 @@ BUILD_PLUGIN(windows-platform windows.qrc ) -INCLUDE_DIRECTORIES(${ultravnc_DIR}/addon/ms-logon/authSSP) -INCLUDE_DIRECTORIES(${Qt5Gui_PRIVATE_INCLUDE_DIRS}) - +TARGET_INCLUDE_DIRECTORIES(windows-platform PRIVATE ${ultravnc_DIR}/addon/ms-logon/authSSP ${Qt5Gui_PRIVATE_INCLUDE_DIRS}) TARGET_LINK_LIBRARIES(windows-platform -lwtsapi32 -lnetapi32 -luserenv -linterception) SET_TARGET_PROPERTIES(windows-platform PROPERTIES COMPILE_FLAGS "-Wno-unknown-pragmas") From 2039067ad0b70688d94981a4bc3d5c9047566eea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:09:00 +0200 Subject: [PATCH 0054/1765] UltraVnc: use target-specific include dirs --- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index 2ae30084d..c2e5501cd 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -2,13 +2,6 @@ ADD_SUBDIRECTORY(vnchooks) INCLUDE(BuildPlugin) -INCLUDE_DIRECTORIES( - ${ultravnc_DIR} - ${ultravnc_DIR}/winvnc - ${ultravnc_DIR}/winvnc/omnithread - ${ultravnc_DIR}/winvnc/winvnc - ) - SET(ultravnc_CXX_SOURCES ${ultravnc_DIR}/winvnc/winvnc/HideDesktop.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbRegion_win32.cpp @@ -91,6 +84,13 @@ BUILD_PLUGIN(builtin-ultravnc-server ) TARGET_LINK_LIBRARIES(builtin-ultravnc-server -luserenv -lole32 -lversion -lgdi32 -limm32 -lwinmm) +TARGET_INCLUDE_DIRECTORIES(builtin-ultravnc-server PRIVATE + ${ultravnc_DIR} + ${ultravnc_DIR}/winvnc + ${ultravnc_DIR}/winvnc/omnithread + ${ultravnc_DIR}/winvnc/winvnc + ) + SET(ULTRAVNC_COMPILER_FLAGS "-Wno-comments -Wno-attributes -Wno-write-strings -Wno-parentheses -Wno-misleading-indentation -Wno-unused-result -Wno-unused-label -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-format-zero-length -Wno-sign-compare -fexceptions") From d9fd5ebc6df15e29594eedd0ce8e80ec0e85e612 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:10:48 +0200 Subject: [PATCH 0055/1765] X11Vnc: use target-specific include dirs --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 8060f4b94..ae56dad62 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -148,7 +148,6 @@ SET(X11VNC_CONFIG ${CMAKE_BINARY_DIR}/config.h) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY) ADD_DEFINITIONS(-DVNCSHARED -DFOREVER -DNOREPEAT=0 -DNOPW=1 -DREMOTE_CONTROL=0 -DEXTERNAL_COMMANDS=0 -DFILEXFER=0 -DNOGUI -DSMALL_FOOTPRINT) -INCLUDE_DIRECTORIES(${libvncserver_DIR}/libvncserver ${libvncserver_DIR}/common ${3rdparty_DIR} ${x11vnc_DIR}/src) SET(libvncserver_SOURCES ${libvncserver_DIR}/libvncserver/auth.c @@ -239,6 +238,7 @@ BUILD_PLUGIN(builtin-x11vnc-server ) IF(NOT VEYON_X11VNC_EXTERNAL) +TARGET_INCLUDE_DIRECTORIES(builtin-x11vnc-server PRIVATE ${libvncserver_DIR}/libvncserver ${libvncserver_DIR}/common ${3rdparty_DIR} ${x11vnc_DIR}/src) TARGET_LINK_LIBRARIES(builtin-x11vnc-server Threads::Threads ${X11_LIBRARIES} From bf020d472cad1135ccdc2508dcd90a191751c495 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:11:29 +0200 Subject: [PATCH 0056/1765] X11Vnc: drop redundant CMake code for libvncserver integration --- .../vncserver/x11vnc-builtin/CMakeLists.txt | 42 ------------------- 1 file changed, 42 deletions(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index ae56dad62..8baaf08ff 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -6,48 +6,6 @@ ADD_DEFINITIONS(-DVEYON_X11VNC_EXTERNAL) ELSE() -# check for pthreads and TLS support -SET(CMAKE_THREAD_PREFER_PTHREAD TRUE) -FIND_PACKAGE(Threads) -IF(CMAKE_USE_PTHREADS_INIT) - SET(LIBVNCSERVER_HAVE_LIBPTHREAD TRUE) -ENDIF(CMAKE_USE_PTHREADS_INIT) - -# check for libvncserver requirements - -# functions -SET(LIBVNCSERVER_FUNCS fork ftime gethostbyname gethostname gettimeofday inet_ntoa memmove memset mkfifo mmap select socket strchr strdup strerror strstr vfork vprintf) -FOREACH(_func ${LIBVNCSERVER_FUNCS}) - STRING(TOUPPER "${_func}" fuc) - CHECK_FUNCTION_EXISTS(${_func} LIBVNCSERVER_HAVE_${fuc}) -ENDFOREACH() - -# headers -SET(LIBVNCSERVER_HEADERS - endian - fcntl - limits - netinet/in - sys/endian - sys/resource - sys/socket - sys/stat - sys/time - sys/uio - sys/wait - string - vfork - unistd - ws2tcpip -) - -FOREACH(_header ${LIBVNCSERVER_HEADERS}) - STRING(TOUPPER "${_header}" _huc) - STRING(REPLACE "/" "_" _header_escaped "${_huc}") - CHECK_INCLUDE_FILES(${_header}.h LIBVNCSERVER_HAVE_${_header_escaped}_H) -ENDFOREACH() - -SET(LIBVNCSERVER_ALLOW24BPP TRUE) SET(FULL_PACKAGE_NAME "Veyon") SET(PACKAGE_VERSION "${VERSION_STRING}") SET(VERSION_PATCHLEVEL "${VERSION_PATCH}") From 46c1cb50fd8f1444af4ce196578e82a73325f6aa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:12:39 +0200 Subject: [PATCH 0057/1765] X11Vnc: check for X509_print_ex_fp symbol --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 8baaf08ff..8bd4ad4f8 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -100,6 +100,9 @@ IF(HAVE_XKBLIB_H) CHECK_FUNCTION_EXISTS(XkbSelectEvents HAVE_XKEYBOARD) ENDIF(HAVE_XKBLIB_H) +SET(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES}) +CHECK_FUNCTION_EXISTS(X509_print_ex_fp HAVE_X509_PRINT_EX_FP) + UNSET(CMAKE_REQUIRED_LIBRARIES) SET(X11VNC_CONFIG ${CMAKE_BINARY_DIR}/config.h) From 6180fac53c3761abfaf7e6e3886e4f40a488480d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:12:55 +0200 Subject: [PATCH 0058/1765] X11Vnc: drop unused function checks --- .../vncserver/x11vnc-builtin/CMakeLists.txt | 2 +- plugins/vncserver/x11vnc-builtin/config.h.in | 139 ------------------ 2 files changed, 1 insertion(+), 140 deletions(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 8bd4ad4f8..9661354a1 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -11,7 +11,7 @@ SET(PACKAGE_VERSION "${VERSION_STRING}") SET(VERSION_PATCHLEVEL "${VERSION_PATCH}") # check for x11vnc requirements -SET(FUNCS dup2 floor ftime geteuid gethostbyname gethostname getpwnam getpwuid getspnam gettimeofday getuid grantpt inet_ntoa initgroups memcmp memcpy memmove memset mkfifo mmap fork pow putenv select seteuid setegid setgid setpgrp setsid setuid setutxent shmat socket strchr strcspn strdup strerror strftime strpbrk strrchr strstr uname vfork vprintf waitpid) +SET(FUNCS getpwnam getspnam getuid grantpt initgroups seteuid setegid setgid setsid setuid shmat waitpid) FOREACH(_func ${FUNCS}) STRING(TOUPPER "${_func}" fuc) CHECK_FUNCTION_EXISTS(${_func} HAVE_${fuc}) diff --git a/plugins/vncserver/x11vnc-builtin/config.h.in b/plugins/vncserver/x11vnc-builtin/config.h.in index e977c64d6..9cbf3b6a5 100644 --- a/plugins/vncserver/x11vnc-builtin/config.h.in +++ b/plugins/vncserver/x11vnc-builtin/config.h.in @@ -1,8 +1,5 @@ /* config.h.in. Generated from configure.ac by autoheader. */ -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ARPA_INET_H 1 - /* Avahi/mDNS client build environment present */ #cmakedefine HAVE_AVAHI 1 @@ -15,57 +12,24 @@ /* DPMS extension build environment present */ #cmakedefine HAVE_DPMS 1 -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_ENDIAN_H 1 - /* FBPM extension build environment present */ #cmakedefine HAVE_FBPM 1 -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_FCNTL_H 1 - -/* Define to 1 if you have the `fork' function. */ -#cmakedefine HAVE_FORK 1 - -/* Define to 1 if you have the `ftime' function. */ -#cmakedefine HAVE_FTIME 1 - -/* Define to 1 if you have the `geteuid' function. */ -#cmakedefine HAVE_GETEUID 1 - -/* Define to 1 if you have the `gethostbyname' function. */ -#cmakedefine HAVE_GETHOSTBYNAME 1 - -/* Define to 1 if you have the `gethostname' function. */ -#cmakedefine HAVE_GETHOSTNAME 1 - /* Define to 1 if you have the `getpwnam' function. */ #cmakedefine HAVE_GETPWNAM 1 -/* Define to 1 if you have the `getpwuid' function. */ -#cmakedefine HAVE_GETPWUID 1 - /* Define to 1 if you have the `getspnam' function. */ #cmakedefine HAVE_GETSPNAM 1 -/* Define to 1 if you have the `gettimeofday' function. */ -#cmakedefine HAVE_GETTIMEOFDAY 1 - /* Define to 1 if you have the `getuid' function. */ #cmakedefine HAVE_GETUID 1 /* Define to 1 if you have the `grantpt' function. */ #cmakedefine HAVE_GRANTPT 1 -/* Define to 1 if you have the `inet_ntoa' function. */ -#cmakedefine HAVE_INET_NTOA 1 - /* Define to 1 if you have the `initgroups' function. */ #cmakedefine HAVE_INITGROUPS 1 -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_INTTYPES_H 1 - /* IRIX XReadDisplay available */ #cmakedefine HAVE_IRIX_XREADDISPLAY 1 @@ -126,21 +90,6 @@ /* MacOS X OpenGL present */ #cmakedefine HAVE_MACOSX_OPENGL_H 1 -/* Define to 1 if you have the `memmove' function. */ -#cmakedefine HAVE_MEMMOVE 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_MEMORY_H 1 - -/* Define to 1 if you have the `memset' function. */ -#cmakedefine HAVE_MEMSET 1 - -/* Define to 1 if you have the `mkfifo' function. */ -#cmakedefine HAVE_MKFIFO 1 - -/* Define to 1 if you have the `mmap' function. */ -#cmakedefine HAVE_MMAP 1 - /* Define to 1 if you have the header file. */ #cmakedefine HAVE_NETDB_H 1 @@ -153,9 +102,6 @@ /* RECORD extension build environment present */ #cmakedefine HAVE_RECORD 1 -/* Define to 1 if you have the `select' function. */ -#cmakedefine HAVE_SELECT 1 - /* Define to 1 if you have the `setegid' function. */ #cmakedefine HAVE_SETEGID 1 @@ -165,121 +111,36 @@ /* Define to 1 if you have the `setgid' function. */ #cmakedefine HAVE_SETGID 1 -/* Define to 1 if you have the `setpgrp' function. */ -#cmakedefine HAVE_SETPGRP 1 - /* Define to 1 if you have the `setsid' function. */ #cmakedefine HAVE_SETSID 1 /* Define to 1 if you have the `setuid' function. */ #cmakedefine HAVE_SETUID 1 -/* Define to 1 if you have the `setutxent' function. */ -#cmakedefine HAVE_SETUTXENT 1 - /* Define to 1 if you have the `shmat' function. */ #cmakedefine HAVE_SHMAT 1 -/* Define to 1 if you have the `socket' function. */ -#cmakedefine HAVE_SOCKET 1 - /* Solaris XReadScreen available */ #cmakedefine HAVE_SOLARIS_XREADSCREEN 1 -/* Define to 1 if `stat' has the bug that it succeeds when given the - zero-length file name argument. */ -#cmakedefine HAVE_STAT_EMPTY_STRING_BUG 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDLIB_H 1 - -/* Define to 1 if you have the `strchr' function. */ -#cmakedefine HAVE_STRCHR 1 - -/* Define to 1 if you have the `strcspn' function. */ -#cmakedefine HAVE_STRCSPN 1 - -/* Define to 1 if you have the `strdup' function. */ -#cmakedefine HAVE_STRDUP 1 - -/* Define to 1 if you have the `strerror' function. */ -#cmakedefine HAVE_STRERROR 1 - -/* Define to 1 if you have the `strftime' function. */ -#cmakedefine HAVE_STRFTIME 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRING_H 1 - -/* Define to 1 if you have the `strstr' function. */ -#cmakedefine HAVE_STRSTR 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYSLOG_H 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_ENDIAN_H 1 - /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_IOCTL_H 1 -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_SOCKET_H 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_STAT_H 1 - /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_STROPTS_H 1 -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TIMEB_H 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TIME_H 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TYPES_H 1 - /* Define to 1 if you have that is POSIX.1 compatible. */ #cmakedefine HAVE_SYS_WAIT_H 1 /* Define to 1 if you have the header file. */ #cmakedefine HAVE_TERMIOS_H 1 -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_UNISTD_H 1 - /* Define to 1 if you have the header file. */ #cmakedefine HAVE_UTMPX_H 1 -/* Define to 1 if you have the `vfork' function. */ -#cmakedefine HAVE_VFORK 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_VFORK_H 1 - -/* Define to 1 if you have the `vprintf' function. */ -#cmakedefine HAVE_VPRINTF 1 - /* Define to 1 if you have the `waitpid' function. */ #cmakedefine HAVE_WAITPID 1 -/* Define to 1 if `fork' works. */ -#cmakedefine HAVE_WORKING_FORK 1 - -/* Define to 1 if `vfork' works. */ -#cmakedefine HAVE_WORKING_VFORK 1 - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_WS2TCPIP_H 1 - /* X11 build environment present */ #cmakedefine HAVE_X11 1 From c080f93e4b068ba1071c600f889c162a26cd84e6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:13:18 +0200 Subject: [PATCH 0059/1765] X11Vnc: drop explicit Threads linkage --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 9661354a1..90f11d552 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -201,7 +201,6 @@ BUILD_PLUGIN(builtin-x11vnc-server IF(NOT VEYON_X11VNC_EXTERNAL) TARGET_INCLUDE_DIRECTORIES(builtin-x11vnc-server PRIVATE ${libvncserver_DIR}/libvncserver ${libvncserver_DIR}/common ${3rdparty_DIR} ${x11vnc_DIR}/src) TARGET_LINK_LIBRARIES(builtin-x11vnc-server - Threads::Threads ${X11_LIBRARIES} ${X11_XTest_LIB} ${X11_Xfixes_LIB} From 43dd54ce6cdab78d49f5ae898c7d5313d7d5a9fc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 10:39:37 +0200 Subject: [PATCH 0060/1765] UltraVnc: prioritize RFB headers of libvncserver --- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index c2e5501cd..e9a5d5c1a 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -85,6 +85,7 @@ BUILD_PLUGIN(builtin-ultravnc-server TARGET_LINK_LIBRARIES(builtin-ultravnc-server -luserenv -lole32 -lversion -lgdi32 -limm32 -lwinmm) TARGET_INCLUDE_DIRECTORIES(builtin-ultravnc-server PRIVATE + ${libvncserver_DIR} ${ultravnc_DIR} ${ultravnc_DIR}/winvnc ${ultravnc_DIR}/winvnc/omnithread From 9c69463c66a512456a9fcd09b5960bad6288ea39 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 11:16:39 +0200 Subject: [PATCH 0061/1765] CMake: more code modernizations --- CMakeLists.txt | 5 +++-- cmake/modules/BuildApplication.cmake | 1 + cmake/modules/BuildPlugin.cmake | 1 + core/CMakeLists.txt | 22 +++++++++---------- plugins/ldap/common/CMakeLists.txt | 1 + plugins/ldap/kldap/CMakeLists.txt | 1 + .../platform/linux/auth-helper/CMakeLists.txt | 1 + plugins/platform/windows/CMakeLists.txt | 6 ++--- .../vncserver/ultravnc-builtin/CMakeLists.txt | 12 +++++----- .../ultravnc-builtin/vnchooks/CMakeLists.txt | 1 + .../vncserver/x11vnc-builtin/CMakeLists.txt | 18 +++++++-------- 11 files changed, 36 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 427b1eb02..69b25e6fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -198,8 +198,9 @@ SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LTO_FLAGS}") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LTO_FLAGS}") ENDIF() -SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -fstack-protector-strong ${CFLAGS}") -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -fstack-protector-strong -fno-exceptions -std=c++11 ${CXXFLAGS}") +SET(VEYON_COMPILE_OPTIONS "-Wall;-Werror") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong ${CFLAGS}") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong -fno-exceptions -std=c++11 ${CXXFLAGS}") ADD_DEFINITIONS(-DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050600 -D_FORTIFY_SOURCE=2 -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_BYTEARRAY) diff --git a/cmake/modules/BuildApplication.cmake b/cmake/modules/BuildApplication.cmake index 8e8155204..5feb288ed 100644 --- a/cmake/modules/BuildApplication.cmake +++ b/cmake/modules/BuildApplication.cmake @@ -14,5 +14,6 @@ MACRO(BUILD_APPLICATION APPLICATION_NAME) ENDIF() TARGET_INCLUDE_DIRECTORIES(${APPLICATION_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) TARGET_LINK_LIBRARIES(${APPLICATION_NAME} veyon-core) + TARGET_COMPILE_OPTIONS(${APPLICATION_NAME} PRIVATE ${VEYON_COMPILE_OPTIONS}) ENDMACRO() diff --git a/cmake/modules/BuildPlugin.cmake b/cmake/modules/BuildPlugin.cmake index 154560fb1..ace47583e 100644 --- a/cmake/modules/BuildPlugin.cmake +++ b/cmake/modules/BuildPlugin.cmake @@ -10,6 +10,7 @@ MACRO(BUILD_PLUGIN PLUGIN_NAME) TARGET_INCLUDE_DIRECTORIES(${PLUGIN_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) TARGET_LINK_LIBRARIES(${PLUGIN_NAME} veyon-core) + TARGET_COMPILE_OPTIONS(${PLUGIN_NAME} PRIVATE ${VEYON_COMPILE_OPTIONS}) SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES PREFIX "") SET_TARGET_PROPERTIES(${PLUGIN_NAME} PROPERTIES LINK_FLAGS "-Wl,-no-undefined") diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 482fc92e9..d53ba8406 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -11,16 +11,6 @@ FILE(GLOB veyoncore_SOURCES CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/builddata.qrc.in ${CMAKE_CURRENT_BINARY_DIR}/builddata.qrc) SET(core_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/resources/core.qrc ${CMAKE_CURRENT_BINARY_DIR}/builddata.qrc) -# find Qt's translation directory -IF(NOT VEYON_BUILD_WIN32) - GET_TARGET_PROPERTY(QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) - EXECUTE_PROCESS(COMMAND "${QT_QMAKE_EXECUTABLE}" -query QT_INSTALL_TRANSLATIONS - OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_VARIABLE QT_TRANSLATIONS_DIR) - ADD_DEFINITIONS(-D'QT_TRANSLATIONS_DIR="${QT_TRANSLATIONS_DIR}"') -ENDIF() - - SET(libvncclient_SOURCES ${libvncserver_DIR}/libvncclient/cursor.c ${libvncserver_DIR}/libvncclient/listen.c @@ -47,7 +37,17 @@ TARGET_INCLUDE_DIRECTORIES(veyon-core PUBLIC TARGET_INCLUDE_DIRECTORIES(veyon-core PRIVATE SYSTEM ${ZLIB_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${LZO_INCLUDE_DIR}) -LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/core) +TARGET_COMPILE_OPTIONS(veyon-core PRIVATE ${VEYON_COMPILE_OPTIONS}) + +# find Qt's translation directory +IF(NOT VEYON_BUILD_WIN32) + GET_TARGET_PROPERTY(QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) + EXECUTE_PROCESS(COMMAND "${QT_QMAKE_EXECUTABLE}" -query QT_INSTALL_TRANSLATIONS + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE QT_TRANSLATIONS_DIR) + TARGET_COMPILE_DEFINITIONS(veyon-core PRIVATE QT_TRANSLATIONS_DIR="${QT_TRANSLATIONS_DIR}") +ENDIF() + TARGET_LINK_LIBRARIES(veyon-core diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index 97222d87c..decdb0bc6 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -19,6 +19,7 @@ SET(ldap_common_SOURCES ) ADD_LIBRARY(ldap-common SHARED ${ldap_common_SOURCES}) +TARGET_COMPILE_OPTIONS(ldap-common PRIVATE ${VEYON_COMPILE_OPTIONS}) TARGET_INCLUDE_DIRECTORIES(ldap-common PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) TARGET_INCLUDE_DIRECTORIES(ldap-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) TARGET_LINK_LIBRARIES(ldap-common kldap-light veyon-core) diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index cb313d7f2..cab482da1 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -34,6 +34,7 @@ SET(kldap_SOURCES ) ADD_LIBRARY(kldap-light SHARED ${kldap_SOURCES}) +TARGET_COMPILE_OPTIONS(kldap-light PRIVATE ${VEYON_COMPILE_OPTIONS}) TARGET_LINK_LIBRARIES(kldap-light Qt5::Core ${Ldap_LIBRARIES} ${Sasl2_LIBRARIES}) TARGET_INCLUDE_DIRECTORIES(kldap-light PRIVATE ${Ldap_INCLUDE_DIRS}) TARGET_INCLUDE_DIRECTORIES(kldap-light PUBLIC ${kldap_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/plugins/platform/linux/auth-helper/CMakeLists.txt b/plugins/platform/linux/auth-helper/CMakeLists.txt index b71f90d24..c665262a9 100644 --- a/plugins/platform/linux/auth-helper/CMakeLists.txt +++ b/plugins/platform/linux/auth-helper/CMakeLists.txt @@ -6,6 +6,7 @@ SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) ADD_EXECUTABLE(veyon-auth-helper ${CMAKE_CURRENT_SOURCE_DIR}/VeyonAuthHelper.cpp) +TARGET_COMPILE_OPTIONS(veyon-auth-helper PRIVATE ${VEYON_COMPILE_OPTIONS}) TARGET_INCLUDE_DIRECTORIES(veyon-auth-helper PRIVATE ${PAM_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(veyon-auth-helper Qt5::Core ${PAM_LIBRARY}) diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index 63533e4c1..52358d39b 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -1,7 +1,5 @@ INCLUDE(BuildPlugin) -ADD_DEFINITIONS(-DULTRAVNC_VEYON_SUPPORT -DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0600) - BUILD_PLUGIN(windows-platform WindowsPlatformPlugin.cpp WindowsPlatformConfigurationPage.h @@ -40,5 +38,5 @@ BUILD_PLUGIN(windows-platform TARGET_INCLUDE_DIRECTORIES(windows-platform PRIVATE ${ultravnc_DIR}/addon/ms-logon/authSSP ${Qt5Gui_PRIVATE_INCLUDE_DIRS}) TARGET_LINK_LIBRARIES(windows-platform -lwtsapi32 -lnetapi32 -luserenv -linterception) - -SET_TARGET_PROPERTIES(windows-platform PROPERTIES COMPILE_FLAGS "-Wno-unknown-pragmas") +TARGET_COMPILE_DEFINITIONS(windows-platform PRIVATE -DULTRAVNC_VEYON_SUPPORT -DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0600) +TARGET_COMPILE_OPTIONS(windows-platform PRIVATE "-Wno-unknown-pragmas") diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index e9a5d5c1a..d07d23dc8 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -63,13 +63,6 @@ SET(ultravnc_C_SOURCES ${ultravnc_DIR}/winvnc/winvnc/vncauth.c ) -ADD_DEFINITIONS(-DULTRAVNC_VEYON_SUPPORT -D_INTERNALLIB -D_WIN32_WINNT=0x0600) - -IF(VEYON_BUILD_WIN64) - ADD_DEFINITIONS(-D_X64) -ENDIF(VEYON_BUILD_WIN64) - - BUILD_PLUGIN(builtin-ultravnc-server BuiltinUltraVncServer.cpp LogoffEventFilter.cpp @@ -92,6 +85,11 @@ TARGET_INCLUDE_DIRECTORIES(builtin-ultravnc-server PRIVATE ${ultravnc_DIR}/winvnc/winvnc ) +TARGET_COMPILE_DEFINITIONS(builtin-ultravnc-server PRIVATE ULTRAVNC_VEYON_SUPPORT _INTERNALLIB _WIN32_WINNT=0x0600) + +IF(VEYON_BUILD_WIN64) + TARGET_COMPILE_DEFINITIONS(builtin-ultravnc-server PRIVATE _X64) +ENDIF() SET(ULTRAVNC_COMPILER_FLAGS "-Wno-comments -Wno-attributes -Wno-write-strings -Wno-parentheses -Wno-misleading-indentation -Wno-unused-result -Wno-unused-label -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-format-zero-length -Wno-sign-compare -fexceptions") diff --git a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt index c7b9b92ef..d778cfa43 100644 --- a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt @@ -9,6 +9,7 @@ ADD_LIBRARY(vnchooks MODULE ${ultravnc_DIR}/winvnc/vnchooks/VNCHooks.cpp ${ultravnc_DIR}/winvnc/vnchooks/SharedData.cpp ${VH_WINRC}) +TARGET_COMPILE_OPTIONS(vnchooks PRIVATE ${VEYON_COMPILE_OPTIONS}) SET_TARGET_PROPERTIES(vnchooks PROPERTIES PREFIX "") SET_TARGET_PROPERTIES(vnchooks PROPERTIES COMPILE_FLAGS "-Wno-write-strings -Wno-unused-variable -Wno-unknown-pragmas") SET_TARGET_PROPERTIES(vnchooks PROPERTIES LINK_FLAGS -Wl,-export-all-symbols) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 90f11d552..d79a45e95 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -1,10 +1,6 @@ INCLUDE(BuildPlugin) -IF(VEYON_X11VNC_EXTERNAL) - -ADD_DEFINITIONS(-DVEYON_X11VNC_EXTERNAL) - -ELSE() +IF(NOT VEYON_X11VNC_EXTERNAL) SET(FULL_PACKAGE_NAME "Veyon") SET(PACKAGE_VERSION "${VERSION_STRING}") @@ -108,8 +104,6 @@ UNSET(CMAKE_REQUIRED_LIBRARIES) SET(X11VNC_CONFIG ${CMAKE_BINARY_DIR}/config.h) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY) -ADD_DEFINITIONS(-DVNCSHARED -DFOREVER -DNOREPEAT=0 -DNOPW=1 -DREMOTE_CONTROL=0 -DEXTERNAL_COMMANDS=0 -DFILEXFER=0 -DNOGUI -DSMALL_FOOTPRINT) - SET(libvncserver_SOURCES ${libvncserver_DIR}/libvncserver/auth.c ${libvncserver_DIR}/libvncserver/cargs.c @@ -183,7 +177,7 @@ SET(x11vnc_SOURCES x11vnc-veyon.c ${x11vnc_DIR}/src/uinput.c ) -SET_SOURCE_FILES_PROPERTIES(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-format -Wno-discarded-qualifiers" COTIRE_EXCLUDED TRUE) +SET_SOURCE_FILES_PROPERTIES(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-format -Wno-discarded-qualifiers -Wno-strict-aliasing" COTIRE_EXCLUDED TRUE) ENDIF() @@ -198,7 +192,13 @@ BUILD_PLUGIN(builtin-x11vnc-server X11VncConfiguration.h ) -IF(NOT VEYON_X11VNC_EXTERNAL) +IF(VEYON_X11VNC_EXTERNAL) + +TARGET_COMPILE_DEFINITIONS(builtin-x11vnc-server PRIVATE VEYON_X11VNC_EXTERNAL) + +ELSE() + +TARGET_COMPILE_DEFINITIONS(builtin-x11vnc-server PRIVATE VNCSHARED FOREVER NOREPEAT=0 NOPW=1 REMOTE_CONTROL=0 EXTERNAL_COMMANDS=0 FILEXFER=0 NOGUI SMALL_FOOTPRINT) TARGET_INCLUDE_DIRECTORIES(builtin-x11vnc-server PRIVATE ${libvncserver_DIR}/libvncserver ${libvncserver_DIR}/common ${3rdparty_DIR} ${x11vnc_DIR}/src) TARGET_LINK_LIBRARIES(builtin-x11vnc-server ${X11_LIBRARIES} From 735cac36df34a4d7bd489aa2c6e6606037cd60f7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 11:31:45 +0200 Subject: [PATCH 0062/1765] CI: drop Ubuntu Xenial builds Ubuntu Xenial ships Qt 5.5 which is too old for the next major version of Veyon. --- .ci/linux.ubuntu.xenial/Dockerfile | 22 ---------------------- .ci/linux.ubuntu.xenial/script.sh | 6 ------ .travis.yml | 1 - 3 files changed, 29 deletions(-) delete mode 100644 .ci/linux.ubuntu.xenial/Dockerfile delete mode 100755 .ci/linux.ubuntu.xenial/script.sh diff --git a/.ci/linux.ubuntu.xenial/Dockerfile b/.ci/linux.ubuntu.xenial/Dockerfile deleted file mode 100644 index 5ea3c1cdb..000000000 --- a/.ci/linux.ubuntu.xenial/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM ubuntu:xenial -MAINTAINER Tobias Junghans - -RUN \ - apt-get update && \ - apt-get install --no-install-recommends -y \ - git binutils gcc g++ make cmake rename file fakeroot bzip2 \ - qtbase5-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools \ - xorg-dev \ - libjpeg-dev \ - zlib1g-dev \ - libssl-dev \ - libpam0g-dev \ - libprocps-dev \ - libldap2-dev \ - libsasl2-dev \ - libpng-dev \ - liblzo2-dev \ - libqca-qt5-2-dev libqca-qt5-2-plugins \ - && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.ubuntu.xenial/script.sh b/.ci/linux.ubuntu.xenial/script.sh deleted file mode 100755 index 358388e1f..000000000 --- a/.ci/linux.ubuntu.xenial/script.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -set -e - -/veyon/.ci/common/linux-build.sh /veyon /build -/veyon/.ci/common/finalize-deb.sh "ubuntu-xenial" diff --git a/.travis.yml b/.travis.yml index 0d586610b..07693fb15 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,6 @@ matrix: - env: TARGET_OS=opensuse.15.0 - env: TARGET_OS=opensuse.15.1 - env: TARGET_OS=ubuntu.bionic - - env: TARGET_OS=ubuntu.xenial - env: TARGET_OS=sast script: - wget http://archive.ubuntu.com/ubuntu/pool/main/libs/libseccomp/libseccomp2_2.3.3-3ubuntu1_amd64.deb && sudo dpkg -i libseccomp2*deb From c6a7aaa0a090f831cc19ed853f65d0cf5538ef1f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 11:33:31 +0200 Subject: [PATCH 0063/1765] QtCompat: drop QVariantHelper --- core/include/Configuration/Property.h | 3 +-- core/include/QtCompat.h | 21 --------------------- core/src/DesktopAccessDialog.cpp | 2 +- core/src/FeatureMessage.cpp | 2 +- master/src/CheckableItemProxyModel.cpp | 7 +++---- master/src/CheckableItemProxyModel.h | 7 ------- master/src/ComputerManager.cpp | 2 +- master/src/ComputerSelectPanel.cpp | 2 +- master/src/ComputerSortFilterProxyModel.cpp | 4 ++-- master/src/FlexibleListView.cpp | 1 - 10 files changed, 10 insertions(+), 41 deletions(-) diff --git a/core/include/Configuration/Property.h b/core/include/Configuration/Property.h index 1eda8914d..198c21d29 100644 --- a/core/include/Configuration/Property.h +++ b/core/include/Configuration/Property.h @@ -26,7 +26,6 @@ #include -#include "QtCompat.h" #include "VeyonCore.h" #include "Configuration/Password.h" @@ -114,7 +113,7 @@ class VEYON_CORE_EXPORT TypedProperty : public Property { T value() const { - return QVariantHelper::value( variantValue() ); + return variantValue().value(); } void setValue( Type value ) const diff --git a/core/include/QtCompat.h b/core/include/QtCompat.h index fcc4ce926..e0655459f 100644 --- a/core/include/QtCompat.h +++ b/core/include/QtCompat.h @@ -350,24 +350,3 @@ struct QOverload : QConstOverload, QNonConstOverload #else #include #endif - - -template -struct QVariantHelper -{ - static T value( const QVariant& variant ) - { - return variant.value(); - } -}; - -#if QT_VERSION < 0x050600 -template -struct QVariantHelper::value >::type> -{ - static T value( const QVariant& variant ) - { - return static_cast( variant.toInt() ); - } -}; -#endif diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index abd1342de..a2dc314a1 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -94,7 +94,7 @@ bool DesktopAccessDialog::handleFeatureMessage( VeyonServerInterface& server, if( m_desktopAccessDialogFeature.uid() == message.featureUid() && message.command() == ReportDesktopAccessChoice ) { - m_choice = QVariantHelper::value( message.argument( ChoiceArgument ) ); + m_choice = message.argument( ChoiceArgument ).value(); server.featureWorkerManager().stopWorker( m_desktopAccessDialogFeature ); diff --git a/core/src/FeatureMessage.cpp b/core/src/FeatureMessage.cpp index 21d3fec18..b22e0a37e 100644 --- a/core/src/FeatureMessage.cpp +++ b/core/src/FeatureMessage.cpp @@ -63,7 +63,7 @@ bool FeatureMessage::receive( QIODevice* ioDevice ) if( message.receive() ) { m_featureUid = message.read().toUuid(); // Flawfinder: ignore - m_command = QVariantHelper::value( message.read() ); // Flawfinder: ignore + m_command = message.read().value(); // Flawfinder: ignore m_arguments = message.read().toMap(); // Flawfinder: ignore return true; } diff --git a/master/src/CheckableItemProxyModel.cpp b/master/src/CheckableItemProxyModel.cpp index a58b926c2..7135ec1c1 100644 --- a/master/src/CheckableItemProxyModel.cpp +++ b/master/src/CheckableItemProxyModel.cpp @@ -23,7 +23,6 @@ */ #include "CheckableItemProxyModel.h" -#include "QtCompat.h" #if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) #include @@ -99,7 +98,7 @@ bool CheckableItemProxyModel::setData( const QModelIndex& index, const QVariant& } const auto uuid = indexToUuid( index ); - const auto checkState = checkStateFromVariant( value ); + const auto checkState = value.value(); if( qAsConst(m_checkStates)[uuid] != checkState ) { @@ -118,7 +117,7 @@ bool CheckableItemProxyModel::setData( const QModelIndex& index, const QVariant& void CheckableItemProxyModel::updateNewRows(const QModelIndex &parent, int first, int last) { // also set newly inserted items checked if parent is checked - if( parent.isValid() && checkStateFromVariant( data( parent, Qt::CheckStateRole ) ) == Qt::Checked ) + if( parent.isValid() && data( parent, Qt::CheckStateRole ).value() == Qt::Checked ) { for( int i = first; i <= last; ++i ) { @@ -238,7 +237,7 @@ void CheckableItemProxyModel::setParentData( const QModelIndex& index, Qt::Check for( int i = 0; i < childCount; ++i ) { - if( checkStateFromVariant( data( this->index( i, 0, index ), Qt::CheckStateRole ) ) != checkState ) + if( data( this->index( i, 0, index ), Qt::CheckStateRole ).value() != checkState ) { checkState = Qt::PartiallyChecked; break; diff --git a/master/src/CheckableItemProxyModel.h b/master/src/CheckableItemProxyModel.h index be144b26c..52e0a895e 100644 --- a/master/src/CheckableItemProxyModel.h +++ b/master/src/CheckableItemProxyModel.h @@ -28,8 +28,6 @@ #include #include -#include "QtCompat.h" - class CheckableItemProxyModel : public QIdentityProxyModel { Q_OBJECT @@ -55,11 +53,6 @@ class CheckableItemProxyModel : public QIdentityProxyModel bool setChildData( const QModelIndex &index, Qt::CheckState checkState ); void setParentData( const QModelIndex &index, Qt::CheckState checkState ); - Qt::CheckState checkStateFromVariant( const QVariant& data ) const - { - return QVariantHelper::value( data ); - } - int m_uidRole; int m_exceptionRole; QVariant m_exceptionData; diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index d415fc318..f32e3349d 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -372,7 +372,7 @@ ComputerList ComputerManager::selectedComputers( const QModelIndex& parent ) { QModelIndex entryIndex = model->index( i, 0, parent ); - if( QVariantHelper::value( model->data( entryIndex, NetworkObjectModel::CheckStateRole ) ) == Qt::Unchecked ) + if( model->data( entryIndex, NetworkObjectModel::CheckStateRole ).value() == Qt::Unchecked ) { continue; } diff --git a/master/src/ComputerSelectPanel.cpp b/master/src/ComputerSelectPanel.cpp index 7f8caa5d1..6b8b783b8 100644 --- a/master/src/ComputerSelectPanel.cpp +++ b/master/src/ComputerSelectPanel.cpp @@ -108,7 +108,7 @@ void ComputerSelectPanel::removeLocation() const auto index = ui->treeView->selectionModel()->currentIndex(); if( index.isValid() && - QVariantHelper::value( model->data( index, NetworkObjectModel::TypeRole ) ) == NetworkObject::Type::Location ) + model->data( index, NetworkObjectModel::TypeRole ).value() == NetworkObject::Type::Location ) { m_computerManager.removeLocation( model->data( index, NetworkObjectModel::NameRole ).toString() ); } diff --git a/master/src/ComputerSortFilterProxyModel.cpp b/master/src/ComputerSortFilterProxyModel.cpp index 039f3cd58..176d79215 100644 --- a/master/src/ComputerSortFilterProxyModel.cpp +++ b/master/src/ComputerSortFilterProxyModel.cpp @@ -65,8 +65,8 @@ bool ComputerSortFilterProxyModel::filterAcceptsRow( int sourceRow, const QModel { if( m_stateFilter != ComputerControlInterface::State::None && m_stateRole >= 0 && - QVariantHelper::value( - sourceModel()->data( sourceModel()->index( sourceRow, 0, sourceParent ), m_stateRole ) ) != m_stateFilter ) + sourceModel()->data( sourceModel()->index( sourceRow, 0, sourceParent ), + m_stateRole ).value() != m_stateFilter ) { return false; } diff --git a/master/src/FlexibleListView.cpp b/master/src/FlexibleListView.cpp index 68c6b7e2c..95d63fb5f 100644 --- a/master/src/FlexibleListView.cpp +++ b/master/src/FlexibleListView.cpp @@ -27,7 +27,6 @@ #include #include "FlexibleListView.h" -#include "QtCompat.h" FlexibleListView::FlexibleListView( QWidget* parent ) : From 8189cd8e855cce3e4103efa90affefd4ec006e38 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 11:34:59 +0200 Subject: [PATCH 0064/1765] QtCompat: drop QVersionNumber --- core/include/PluginInterface.h | 1 + core/include/QtCompat.h | 255 --------------------------------- core/src/QtCompat.cpp | 166 --------------------- 3 files changed, 1 insertion(+), 421 deletions(-) delete mode 100644 core/src/QtCompat.cpp diff --git a/core/include/PluginInterface.h b/core/include/PluginInterface.h index 07d6534e2..9f83b4e15 100644 --- a/core/include/PluginInterface.h +++ b/core/include/PluginInterface.h @@ -25,6 +25,7 @@ #pragma once #include +#include #include "VeyonCore.h" #include "Plugin.h" diff --git a/core/include/QtCompat.h b/core/include/QtCompat.h index e0655459f..cd6286d4a 100644 --- a/core/include/QtCompat.h +++ b/core/include/QtCompat.h @@ -43,261 +43,6 @@ static inline bool intersects( const QSet& a, const QSet& b ) Class(const Class &&) Q_DECL_EQ_DELETE;\ Class &operator=(const Class &&) Q_DECL_EQ_DELETE; -#if QT_VERSION >= 0x050600 -#include -#else - -// taken from qtbase/src/corelib/tools/qversionnumber.h - -class QVersionNumber -{ - /* - * QVersionNumber stores small values inline, without memory allocation. - * We do that by setting the LSB in the pointer that would otherwise hold - * the longer form of the segments. - * The constants below help us deal with the permutations for 32- and 64-bit, - * little- and big-endian architectures. - */ - enum { - // in little-endian, inline_segments[0] is shared with the pointer's LSB, while - // in big-endian, it's inline_segments[7] - InlineSegmentMarker = Q_BYTE_ORDER == Q_LITTLE_ENDIAN ? 0 : sizeof(void*) - 1, - InlineSegmentStartIdx = !InlineSegmentMarker, // 0 for BE, 1 for LE - InlineSegmentCount = sizeof(void*) - 1 - }; - Q_STATIC_ASSERT(InlineSegmentCount >= 3); // at least major, minor, micro - - struct SegmentStorage { - // Note: we alias the use of dummy and inline_segments in the use of the - // union below. This is undefined behavior in C++98, but most compilers implement - // the C++11 behavior. The one known exception is older versions of Sun Studio. - union { - quintptr dummy; - qint8 inline_segments[sizeof(void*)]; - QVector *pointer_segments; - }; - - // set the InlineSegmentMarker and set length to zero - SegmentStorage() Q_DECL_NOTHROW : dummy(1) {} - - SegmentStorage(const QVector &seg) - { - if (dataFitsInline(seg.begin(), seg.size())) - setInlineData(seg.begin(), seg.size()); - else - pointer_segments = new QVector(seg); - } - - SegmentStorage(const SegmentStorage &other) - { - if (other.isUsingPointer()) - pointer_segments = new QVector(*other.pointer_segments); - else - dummy = other.dummy; - } - - SegmentStorage &operator=(const SegmentStorage &other) - { - if (isUsingPointer() && other.isUsingPointer()) { - *pointer_segments = *other.pointer_segments; - } else if (other.isUsingPointer()) { - pointer_segments = new QVector(*other.pointer_segments); - } else { - if (isUsingPointer()) - delete pointer_segments; - dummy = other.dummy; - } - return *this; - } - -#ifdef Q_COMPILER_RVALUE_REFS - SegmentStorage(SegmentStorage &&other) Q_DECL_NOTHROW - : dummy(other.dummy) - { - other.dummy = 1; - } - - SegmentStorage &operator=(SegmentStorage &&other) Q_DECL_NOTHROW - { - qSwap(dummy, other.dummy); - return *this; - } - - explicit SegmentStorage(QVector &&seg) - { - if (dataFitsInline(seg.begin(), seg.size())) - setInlineData(seg.begin(), seg.size()); - else - pointer_segments = new QVector(std::move(seg)); - } -#endif -#ifdef Q_COMPILER_INITIALIZER_LISTS - SegmentStorage(std::initializer_list args) - { - if (dataFitsInline(args.begin(), int(args.size()))) { - setInlineData(args.begin(), int(args.size())); - } else { - pointer_segments = new QVector(args); - } - } -#endif - - ~SegmentStorage() { if (isUsingPointer()) delete pointer_segments; } - - bool isUsingPointer() const Q_DECL_NOTHROW - { return (inline_segments[InlineSegmentMarker] & 1) == 0; } - - int size() const Q_DECL_NOTHROW - { return isUsingPointer() ? pointer_segments->size() : (inline_segments[InlineSegmentMarker] >> 1); } - - void setInlineSize(int len) - { inline_segments[InlineSegmentMarker] = 1 + 2 * len; } - - void resize(int len) - { - if (isUsingPointer()) - pointer_segments->resize(len); - else - setInlineSize(len); - } - - int at(int index) const - { - return isUsingPointer() ? - pointer_segments->at(index) : - inline_segments[InlineSegmentStartIdx + index]; - } - - void setSegments(int len, int maj, int min = 0, int mic = 0) - { - if (maj == qint8(maj) && min == qint8(min) && mic == qint8(mic)) { - int data[] = { maj, min, mic }; - setInlineData(data, len); - } else { - setVector(len, maj, min, mic); - } - } - - private: - static bool dataFitsInline(const int *data, int len) - { - if (len > InlineSegmentCount) - return false; - for (int i = 0; i < len; ++i) - if (data[i] != qint8(data[i])) - return false; - return true; - } - void setInlineData(const int *data, int len) - { - dummy = 1 + len * 2; -#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN - for (int i = 0; i < len; ++i) - dummy |= quintptr(data[i] & 0xFF) << (8 * (i + 1)); -#elif Q_BYTE_ORDER == Q_BIG_ENDIAN - for (int i = 0; i < len; ++i) - dummy |= quintptr(data[i] & 0xFF) << (8 * (sizeof(void *) - i - 1)); -#else - // the code above is equivalent to: - setInlineSize(len); - for (int i = 0; i < len; ++i) - inline_segments[InlineSegmentStartIdx + i] = data[i] & 0xFF; -#endif - } - - Q_CORE_EXPORT void setVector(int len, int maj, int min, int mic); - } m_segments; - -public: - inline QVersionNumber() Q_DECL_NOTHROW - : m_segments() - {} - inline explicit QVersionNumber(const QVector &seg) - : m_segments(seg) - {} - - // compiler-generated copy/move ctor/assignment operators and the destructor are ok - -#ifdef Q_COMPILER_RVALUE_REFS - explicit QVersionNumber(QVector &&seg) - : m_segments(std::move(seg)) - {} -#endif - -#ifdef Q_COMPILER_INITIALIZER_LISTS - inline QVersionNumber(std::initializer_list args) - : m_segments(args) - {} -#endif - - inline explicit QVersionNumber(int maj) - { m_segments.setSegments(1, maj); } - - inline explicit QVersionNumber(int maj, int min) - { m_segments.setSegments(2, maj, min); } - - inline explicit QVersionNumber(int maj, int min, int mic) - { m_segments.setSegments(3, maj, min, mic); } - - Q_REQUIRED_RESULT inline bool isNull() const Q_DECL_NOTHROW - { return segmentCount() == 0; } - - Q_REQUIRED_RESULT inline bool isNormalized() const Q_DECL_NOTHROW - { return isNull() || segmentAt(segmentCount() - 1) != 0; } - - Q_REQUIRED_RESULT inline int majorVersion() const Q_DECL_NOTHROW - { return segmentAt(0); } - - Q_REQUIRED_RESULT inline int minorVersion() const Q_DECL_NOTHROW - { return segmentAt(1); } - - Q_REQUIRED_RESULT inline int microVersion() const Q_DECL_NOTHROW - { return segmentAt(2); } - - Q_REQUIRED_RESULT Q_CORE_EXPORT QVersionNumber normalized() const; - - Q_REQUIRED_RESULT Q_CORE_EXPORT QVector segments() const; - - Q_REQUIRED_RESULT inline int segmentAt(int index) const Q_DECL_NOTHROW - { return (m_segments.size() > index) ? m_segments.at(index) : 0; } - - Q_REQUIRED_RESULT inline int segmentCount() const Q_DECL_NOTHROW - { return m_segments.size(); } - - Q_REQUIRED_RESULT Q_CORE_EXPORT bool isPrefixOf(const QVersionNumber &other) const Q_DECL_NOTHROW; - - Q_REQUIRED_RESULT Q_CORE_EXPORT static int compare(const QVersionNumber &v1, const QVersionNumber &v2) Q_DECL_NOTHROW; - - Q_REQUIRED_RESULT Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber commonPrefix(const QVersionNumber &v1, const QVersionNumber &v2); - - Q_REQUIRED_RESULT Q_CORE_EXPORT QString toString() const; - Q_REQUIRED_RESULT Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber fromString(const QString &string, int *suffixIndex = Q_NULLPTR); - -}; - -Q_DECLARE_TYPEINFO(QVersionNumber, Q_MOVABLE_TYPE); - -Q_REQUIRED_RESULT inline bool operator> (const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW -{ return QVersionNumber::compare(lhs, rhs) > 0; } - -Q_REQUIRED_RESULT inline bool operator>=(const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW -{ return QVersionNumber::compare(lhs, rhs) >= 0; } - -Q_REQUIRED_RESULT inline bool operator< (const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW -{ return QVersionNumber::compare(lhs, rhs) < 0; } - -Q_REQUIRED_RESULT inline bool operator<=(const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW -{ return QVersionNumber::compare(lhs, rhs) <= 0; } - -Q_REQUIRED_RESULT inline bool operator==(const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW -{ return QVersionNumber::compare(lhs, rhs) == 0; } - -Q_REQUIRED_RESULT inline bool operator!=(const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW -{ return QVersionNumber::compare(lhs, rhs) != 0; } - -Q_DECLARE_METATYPE(QVersionNumber) -#endif - #if QT_VERSION < 0x050700 template struct QAddConst { using Type = const T; }; template constexpr typename QAddConst::Type &qAsConst(T &t) { return t; } diff --git a/core/src/QtCompat.cpp b/core/src/QtCompat.cpp deleted file mode 100644 index 9af067496..000000000 --- a/core/src/QtCompat.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - * QtCompat.cpp - functions and templates for compatibility with older Qt versions - * - * Copyright (c) 2018-2019 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#include "QtCompat.h" - -#if QT_VERSION < 0x050600 - -// taken from qtbase/src/corelib/tools/qversionnumber.cpp - -QVector QVersionNumber::segments() const -{ - if (m_segments.isUsingPointer()) - return *m_segments.pointer_segments; - - QVector result; - result.resize(segmentCount()); - for (int i = 0; i < segmentCount(); ++i) - result[i] = segmentAt(i); - return result; -} - -QVersionNumber QVersionNumber::normalized() const -{ - int i; - for (i = m_segments.size(); i; --i) - if (m_segments.at(i - 1) != 0) - break; - - QVersionNumber result(*this); - result.m_segments.resize(i); - return result; -} - -bool QVersionNumber::isPrefixOf(const QVersionNumber &other) const Q_DECL_NOTHROW -{ - if (segmentCount() > other.segmentCount()) - return false; - for (int i = 0; i < segmentCount(); ++i) { - if (segmentAt(i) != other.segmentAt(i)) - return false; - } - return true; -} - -int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2) Q_DECL_NOTHROW -{ - int commonlen; - - if (Q_LIKELY(!v1.m_segments.isUsingPointer() && !v2.m_segments.isUsingPointer())) { - // we can't use memcmp because it interprets the data as unsigned bytes - const qint8 *ptr1 = v1.m_segments.inline_segments + InlineSegmentStartIdx; - const qint8 *ptr2 = v2.m_segments.inline_segments + InlineSegmentStartIdx; - commonlen = qMin(v1.m_segments.size(), - v2.m_segments.size()); - for (int i = 0; i < commonlen; ++i) - if (int x = ptr1[i] - ptr2[i]) - return x; - } else { - commonlen = qMin(v1.segmentCount(), v2.segmentCount()); - for (int i = 0; i < commonlen; ++i) { - if (v1.segmentAt(i) != v2.segmentAt(i)) - return v1.segmentAt(i) - v2.segmentAt(i); - } - } - - // ran out of segments in v1 and/or v2 and need to check the first trailing - // segment to finish the compare - if (v1.segmentCount() > commonlen) { - // v1 is longer - if (v1.segmentAt(commonlen) != 0) - return v1.segmentAt(commonlen); - else - return 1; - } else if (v2.segmentCount() > commonlen) { - // v2 is longer - if (v2.segmentAt(commonlen) != 0) - return -v2.segmentAt(commonlen); - else - return -1; - } - - // the two version numbers are the same - return 0; -} - -QVersionNumber QVersionNumber::commonPrefix(const QVersionNumber &v1, - const QVersionNumber &v2) -{ - int commonlen = qMin(v1.segmentCount(), v2.segmentCount()); - int i; - for (i = 0; i < commonlen; ++i) { - if (v1.segmentAt(i) != v2.segmentAt(i)) - break; - } - - if (i == 0) - return QVersionNumber(); - - // try to use the one with inline segments, if there's one - QVersionNumber result(!v1.m_segments.isUsingPointer() ? v1 : v2); - result.m_segments.resize(i); - return result; -} - -QString QVersionNumber::toString() const -{ - QString version; - version.reserve(qMax(segmentCount() * 2 - 1, 0)); - bool first = true; - for (int i = 0; i < segmentCount(); ++i) { - if (!first) - version += QLatin1Char('.'); - version += QString::number(segmentAt(i)); - first = false; - } - return version; -} - -QVersionNumber QVersionNumber::fromString(const QString &string, int *suffixIndex) -{ - QVector seg; - - const QByteArray cString(string.toLatin1()); - - const char *start = cString.constData(); - const char *end = start; - const char *lastGoodEnd = start; - const char *endOfString = cString.constData() + cString.size(); - - do { - const qulonglong value = strtoull(start, (char **) &end, 10); - if (value > qulonglong(std::numeric_limits::max())) - break; - seg.append(int(value)); - start = end + 1; - lastGoodEnd = end; - } while (start < endOfString && (end < endOfString && *end == '.')); - - if (suffixIndex) - *suffixIndex = int(lastGoodEnd - cString.constData()); - - return QVersionNumber(qMove(seg)); -} - -#endif From 7589efe07209f240e232dcfdbfa5fb7ba092647c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 11:35:20 +0200 Subject: [PATCH 0065/1765] QtCompat: fix intersects() for QSet --- core/include/QtCompat.h | 11 +---------- core/src/AccessControlProvider.cpp | 6 +++--- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/core/include/QtCompat.h b/core/include/QtCompat.h index cd6286d4a..d40f07c8a 100644 --- a/core/include/QtCompat.h +++ b/core/include/QtCompat.h @@ -25,19 +25,10 @@ #pragma once #include -#include -#include -#include -template -static inline bool intersects( const QSet& a, const QSet& b ) -{ #if QT_VERSION < 0x050600 - return QSet( a ).intersect( b ).isEmpty() == false; -#else - return a.intersects( b ); +#error Qt < 5.6 not supported #endif -} #define Q_DISABLE_MOVE(Class) \ Class(const Class &&) Q_DECL_EQ_DELETE;\ diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index dabd14f4e..ae2e4a1b8 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -165,8 +165,8 @@ bool AccessControlProvider::processAuthorizedGroups( const QString& accessingUse { vDebug() << "processing for user" << accessingUser; - return intersects( m_userGroupsBackend->groupsOfUser( accessingUser, m_queryDomainGroups ).toSet(), - VeyonCore::config().authorizedUserGroups().toSet() ); + return m_userGroupsBackend->groupsOfUser( accessingUser, m_queryDomainGroups ).toSet().intersects( + VeyonCore::config().authorizedUserGroups().toSet() ); } @@ -262,7 +262,7 @@ bool AccessControlProvider::haveGroupsInCommon( const QString &userOne, const QS const auto userOneGroups = m_userGroupsBackend->groupsOfUser( userOne, m_queryDomainGroups ); const auto userTwoGroups = m_userGroupsBackend->groupsOfUser( userTwo, m_queryDomainGroups ); - return intersects( userOneGroups.toSet(), userTwoGroups.toSet() ); + return userOneGroups.toSet().intersects( userTwoGroups.toSet() ); } From 56dd57cadbb6b5b827b960f4ad937b5eadfa08eb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 11:36:02 +0200 Subject: [PATCH 0066/1765] Drop remaining Qt 5.5 compat code --- core/src/HostAddress.cpp | 10 +--------- core/src/Logger.cpp | 7 ------- master/src/ComputerMonitoringWidget.cpp | 19 +++---------------- master/src/MainToolBar.cpp | 12 ------------ master/src/MainWindow.cpp | 7 ------- plugins/ldap/common/LdapBrowseModel.cpp | 7 ------- plugins/remoteaccess/RemoteAccessWidget.cpp | 20 -------------------- 7 files changed, 4 insertions(+), 78 deletions(-) diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index 9287c60a6..a6f9f1078 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -164,11 +164,7 @@ QString HostAddress::toIpAddress( const QString& hostName ) return {}; } -#if QT_VERSION < 0x050600 - const auto ipAddress = hostInfo.addresses().value( 0 ).toString(); -#else const auto ipAddress = hostInfo.addresses().constFirst().toString(); -#endif vDebug() << "Resolved IP address of host" << hostName << "to" << ipAddress; return ipAddress; @@ -247,9 +243,5 @@ QString HostAddress::toFQDN( HostAddress::Type type, const QString& address ) QString HostAddress::fqdnToHostName( const QString& fqdn ) { -#if QT_VERSION < 0x050600 - return fqdn.split( QLatin1Char( '.' ) ).value( 0 ); -#else - return fqdn.split( QLatin1Char( '.' ) ).constFirst(); -#endif + return fqdn.split( QLatin1Char( '.' ) ).constFirst(); } diff --git a/core/src/Logger.cpp b/core/src/Logger.cpp index 19ddc98e4..1a6f1ffed 100644 --- a/core/src/Logger.cpp +++ b/core/src/Logger.cpp @@ -180,14 +180,7 @@ void Logger::rotateLogFile() logFileInfo.dir().remove( rotatedLogFiles.takeLast() ); } -#if QT_VERSION < 0x050600 -#warning Building compat code for unsupported version of Qt - using QStringListReverseIterator = std::reverse_iterator; - for( auto it = QStringListReverseIterator(rotatedLogFiles.cend()), - end = QStringListReverseIterator(rotatedLogFiles.cbegin()); it != end; ++it ) -#else for( auto it = rotatedLogFiles.crbegin(), end = rotatedLogFiles.crend(); it != end; ++it ) -#endif { bool numberOk = false; int logFileIndex = it->section( QLatin1Char('.'), -1 ).toInt( &numberOk ); diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 0f8b50db5..ed0199977 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -348,15 +348,9 @@ void ComputerMonitoringWidget::populateFeatureMenu( const FeatureUidList& active void ComputerMonitoringWidget::addFeatureToMenu( const Feature& feature, const QString& label ) { -#if QT_VERSION < 0x050600 -#warning Building legacy compat code for unsupported version of Qt - auto action = m_featureMenu->addAction( QIcon( feature.iconUrl() ), label ); - connect( action, &QAction::triggered, this, [=] () { runFeature( feature ); } ); -#else - m_featureMenu->addAction( QIcon( feature.iconUrl() ), - label, - this, [=] () { runFeature( feature ); } ); -#endif + m_featureMenu->addAction( QIcon( feature.iconUrl() ), + label, + this, [=] () { runFeature( feature ); } ); } @@ -367,14 +361,7 @@ void ComputerMonitoringWidget::addSubFeaturesToMenu( const Feature& parentFeatur for( const auto& subFeature : subFeatures ) { -#if QT_VERSION < 0x050600 -#warning Building legacy compat code for unsupported version of Qt - auto action = menu->addAction( QIcon( subFeature.iconUrl() ), subFeature.displayName() ); - action->setShortcut( subFeature.shortcut() ); - connect( action, &QAction::triggered, this, [=] () { runFeature( subFeature ); } ); -#else menu->addAction( QIcon( subFeature.iconUrl() ), subFeature.displayName(), this, [=]() { runFeature( subFeature ); }, subFeature.shortcut() ); -#endif } } diff --git a/master/src/MainToolBar.cpp b/master/src/MainToolBar.cpp index 939b7d164..8354ce757 100644 --- a/master/src/MainToolBar.cpp +++ b/master/src/MainToolBar.cpp @@ -50,23 +50,11 @@ void MainToolBar::contextMenuEvent( QContextMenuEvent* event ) { QMenu menu( this ); -#if QT_VERSION < 0x050600 -#warning Building legacy compat code for unsupported version of Qt - auto toolTipAction = menu.addAction( tr( "Disable balloon tooltips" ) ); - connect( toolTipAction, &QAction::triggered, this, &MainToolBar::toggleToolTips ); -#else auto toolTipAction = menu.addAction( tr( "Disable balloon tooltips" ), this, &MainToolBar::toggleToolTips ); -#endif toolTipAction->setCheckable( true ); toolTipAction->setChecked( m_mainWindow->masterCore().userConfig().noToolTips() ); -#if QT_VERSION < 0x050600 -#warning Building legacy compat code for unsupported version of Qt - auto iconModeAction = menu.addAction( tr( "Show icons only" ) ); - connect( iconModeAction, &QAction::triggered, this, &MainToolBar::toggleIconMode ); -#else auto iconModeAction = menu.addAction( tr( "Show icons only" ), this, &MainToolBar::toggleIconMode ); -#endif iconModeAction->setCheckable( true ); iconModeAction->setChecked( m_mainWindow->masterCore().userConfig().toolButtonIconOnlyMode() ); diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 674ce018d..0671c8768 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -310,15 +310,8 @@ void MainWindow::addSubFeaturesToToolButton( QToolButton* button, const Feature& for( const auto& subFeature : subFeatures ) { -#if QT_VERSION < 0x050600 -#warning Building legacy compat code for unsupported version of Qt - auto action = menu->addAction( QIcon( subFeature.iconUrl() ), subFeature.displayName() ); - action->setShortcut( subFeature.shortcut() ); - connect( action, &QAction::triggered, this, [=] () { m_master.runFeature( subFeature ); } ); -#else auto action = menu->addAction( QIcon( subFeature.iconUrl() ), subFeature.displayName(), this, [=]() { m_master.runFeature( subFeature ); }, subFeature.shortcut() ); -#endif action->setToolTip( subFeature.description() ); action->setObjectName( subFeature.uid().toString() ); } diff --git a/plugins/ldap/common/LdapBrowseModel.cpp b/plugins/ldap/common/LdapBrowseModel.cpp index 720bd5da2..a068c52cc 100644 --- a/plugins/ldap/common/LdapBrowseModel.cpp +++ b/plugins/ldap/common/LdapBrowseModel.cpp @@ -350,14 +350,7 @@ void LdapBrowseModel::populateRoot() const auto parent = m_root; QStringList fullDn; const auto dns = namingContext.split( QLatin1Char(',') ); -#if QT_VERSION < 0x050600 -#warning Building compat code for unsupported version of Qt - using QStringListReverseIterator = std::reverse_iterator; - for( auto it = QStringListReverseIterator(dns.cend()), - end = QStringListReverseIterator(dns.cbegin()); it != end; ++it ) -#else for( auto it = dns.crbegin(), end = dns.crend(); it != end; ++it ) -#endif { fullDn.prepend( *it ); auto node = new Node( Node::DN, fullDn.join( QLatin1Char(',') ), parent ); diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 3c0307d06..2263b93f6 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -75,25 +75,6 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent auto vncView = parent->vncView(); auto shortcutMenu = new QMenu(); -#if QT_VERSION < 0x050600 -#warning Building legacy compat code for unsupported version of Qt - connect( shortcutMenu->addAction( tr( "Ctrl+Alt+Del" ) ), &QAction::triggered, - vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlAltDel ); } ); - connect( shortcutMenu->addAction( tr( "Ctrl+Esc" ) ), &QAction::triggered, - vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlEscape ); } ); - connect( shortcutMenu->addAction( tr( "Alt+Tab" ) ), &QAction::triggered, - vncView, [=]() { vncView->sendShortcut( VncView::ShortcutAltTab ); } ); - connect( shortcutMenu->addAction( tr( "Alt+F4" ) ), &QAction::triggered, - vncView, [=]() { vncView->sendShortcut( VncView::ShortcutAltF4 ); } ); - connect( shortcutMenu->addAction( tr( "Win+Tab" ) ), &QAction::triggered, - vncView, [=]() { vncView->sendShortcut( VncView::ShortcutWinTab ); } ); - connect( shortcutMenu->addAction( tr( "Win" ) ), &QAction::triggered, - vncView, [=]() { vncView->sendShortcut( VncView::ShortcutWin ); } ); - connect( shortcutMenu->addAction( tr( "Menu" ) ), &QAction::triggered, - vncView, [=]() { vncView->sendShortcut( VncView::ShortcutMenu ); } ); - connect( shortcutMenu->addAction( tr( "Alt+Ctrl+F1" ) ), &QAction::triggered, - vncView, [=]() { vncView->sendShortcut( VncView::ShortcutAltCtrlF1 ); } ); -#else shortcutMenu->addAction( tr( "Ctrl+Alt+Del" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlAltDel ); } ); shortcutMenu->addAction( tr( "Ctrl+Esc" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlEscape ); } ); shortcutMenu->addAction( tr( "Alt+Tab" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutAltTab ); } ); @@ -102,7 +83,6 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent shortcutMenu->addAction( tr( "Win" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutWin ); } ); shortcutMenu->addAction( tr( "Menu" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutMenu ); } ); shortcutMenu->addAction( tr( "Alt+Ctrl+F1" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutAltCtrlF1 ); } ); -#endif m_sendShortcutButton->setMenu( shortcutMenu ); m_sendShortcutButton->setPopupMode( QToolButton::InstantPopup ); From e4ce5506bd612fd3d053d5e9d8195a10fbd4dc1d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 11:39:29 +0200 Subject: [PATCH 0067/1765] Property: add quirk for Qt 5.7 --- core/include/Configuration/Property.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/include/Configuration/Property.h b/core/include/Configuration/Property.h index 198c21d29..d8f87ec15 100644 --- a/core/include/Configuration/Property.h +++ b/core/include/Configuration/Property.h @@ -113,7 +113,8 @@ class VEYON_CORE_EXPORT TypedProperty : public Property { T value() const { - return variantValue().value(); + const auto v = variantValue(); + return QVariant( v ).value(); } void setValue( Type value ) const From d71fd23546db70f14bd22b0e0383bb630ad5005b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 12:44:20 +0200 Subject: [PATCH 0068/1765] X11Vnc: ignore warning with GCC 8 --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index d79a45e95..cf44e704e 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -177,7 +177,7 @@ SET(x11vnc_SOURCES x11vnc-veyon.c ${x11vnc_DIR}/src/uinput.c ) -SET_SOURCE_FILES_PROPERTIES(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-format -Wno-discarded-qualifiers -Wno-strict-aliasing" COTIRE_EXCLUDED TRUE) +SET_SOURCE_FILES_PROPERTIES(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-format -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros" COTIRE_EXCLUDED TRUE) ENDIF() From eef4078f8128f45b66fa764b3f5d451756d3735c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 30 Jul 2019 13:37:54 +0200 Subject: [PATCH 0069/1765] CMake: define macros affecting PCH via ADD_DEFINITIONS There seems to be a bug in Cotire which causes the COMPILE_DEFINITIONS property being ignored for the PCH creation. --- plugins/platform/windows/CMakeLists.txt | 4 +++- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index 52358d39b..cc372be2b 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -1,5 +1,7 @@ INCLUDE(BuildPlugin) +ADD_DEFINITIONS(-DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0600) + BUILD_PLUGIN(windows-platform WindowsPlatformPlugin.cpp WindowsPlatformConfigurationPage.h @@ -38,5 +40,5 @@ BUILD_PLUGIN(windows-platform TARGET_INCLUDE_DIRECTORIES(windows-platform PRIVATE ${ultravnc_DIR}/addon/ms-logon/authSSP ${Qt5Gui_PRIVATE_INCLUDE_DIRS}) TARGET_LINK_LIBRARIES(windows-platform -lwtsapi32 -lnetapi32 -luserenv -linterception) -TARGET_COMPILE_DEFINITIONS(windows-platform PRIVATE -DULTRAVNC_VEYON_SUPPORT -DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0600) +TARGET_COMPILE_DEFINITIONS(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) TARGET_COMPILE_OPTIONS(windows-platform PRIVATE "-Wno-unknown-pragmas") diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index d07d23dc8..aaa3ace89 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -2,6 +2,8 @@ ADD_SUBDIRECTORY(vnchooks) INCLUDE(BuildPlugin) +ADD_DEFINITIONS(-D_WIN32_WINNT=0x0600) + SET(ultravnc_CXX_SOURCES ${ultravnc_DIR}/winvnc/winvnc/HideDesktop.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbRegion_win32.cpp @@ -85,7 +87,7 @@ TARGET_INCLUDE_DIRECTORIES(builtin-ultravnc-server PRIVATE ${ultravnc_DIR}/winvnc/winvnc ) -TARGET_COMPILE_DEFINITIONS(builtin-ultravnc-server PRIVATE ULTRAVNC_VEYON_SUPPORT _INTERNALLIB _WIN32_WINNT=0x0600) +TARGET_COMPILE_DEFINITIONS(builtin-ultravnc-server PRIVATE ULTRAVNC_VEYON_SUPPORT _INTERNALLIB) IF(VEYON_BUILD_WIN64) TARGET_COMPILE_DEFINITIONS(builtin-ultravnc-server PRIVATE _X64) From 7ef8e6834cb07e45c499ac7480018a61f355b326 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 31 Jul 2019 09:23:25 +0200 Subject: [PATCH 0070/1765] 3rdparty: libvncserver: update submodule --- 3rdparty/libvncserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index 9b5b4bbf2..5f2ab5db1 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit 9b5b4bbf2cf1e5fc37a6a7a777134d300235b25a +Subproject commit 5f2ab5db1d3333eafa932a9a1b2497dbadb31672 From 1f1f00b8444c74b8f5abddd5b9f5d163254103b5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 1 Aug 2019 19:13:31 +0200 Subject: [PATCH 0071/1765] AuthenticationPluginInterface: add configureCredentials() --- core/include/AuthenticationPluginInterface.h | 1 + core/include/DummyAuthentication.h | 4 ++++ plugins/authkeys/AuthKeysPlugin.h | 4 ++++ plugins/authlogon/AuthLogonPlugin.cpp | 6 ++++++ plugins/authlogon/AuthLogonPlugin.h | 2 ++ plugins/authsimple/AuthSimplePlugin.cpp | 7 +++++++ plugins/authsimple/AuthSimplePlugin.h | 2 ++ plugins/demo/DemoAuthentication.h | 4 ++++ 8 files changed, 30 insertions(+) diff --git a/core/include/AuthenticationPluginInterface.h b/core/include/AuthenticationPluginInterface.h index 510cb0d7f..197e07fd8 100644 --- a/core/include/AuthenticationPluginInterface.h +++ b/core/include/AuthenticationPluginInterface.h @@ -40,6 +40,7 @@ class VEYON_CORE_EXPORT AuthenticationPluginInterface virtual bool initializeCredentials() = 0; virtual bool hasCredentials() const = 0; virtual bool checkCredentials() const = 0; + virtual void configureCredentials() = 0; // server side authentication virtual VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const = 0; diff --git a/core/include/DummyAuthentication.h b/core/include/DummyAuthentication.h index 158cd4db9..cee5e8a3a 100644 --- a/core/include/DummyAuthentication.h +++ b/core/include/DummyAuthentication.h @@ -52,6 +52,10 @@ class DummyAuthentication : public AuthenticationPluginInterface return false; } + void configureCredentials() override + { + } + // server side authentication VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override { diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index 38750f0c8..88982b4f9 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -87,6 +87,10 @@ class AuthKeysPlugin : public QObject, bool hasCredentials() const override; bool checkCredentials() const override; + void configureCredentials() override + { + } + // server side authentication VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index f8730c986..bbba97fb0 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -86,6 +86,12 @@ bool AuthLogonPlugin::checkCredentials() const +void AuthLogonPlugin::configureCredentials() +{ +} + + + VncServerClient::AuthState AuthLogonPlugin::performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const { switch( client->authState() ) diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h index 4deb0c8dd..3316b31a1 100644 --- a/plugins/authlogon/AuthLogonPlugin.h +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -78,6 +78,8 @@ class AuthLogonPlugin : public QObject, bool checkCredentials() const override; + void configureCredentials() override; + VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; bool authenticate( QIODevice* socket ) const override; diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp index 586b69cfa..1d939ab20 100644 --- a/plugins/authsimple/AuthSimplePlugin.cpp +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -85,6 +85,13 @@ bool AuthSimplePlugin::checkCredentials() const +void AuthSimplePlugin::configureCredentials() +{ + +} + + + VncServerClient::AuthState AuthSimplePlugin::performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const { switch( client->authState() ) diff --git a/plugins/authsimple/AuthSimplePlugin.h b/plugins/authsimple/AuthSimplePlugin.h index 059f26a50..d3e9035ec 100644 --- a/plugins/authsimple/AuthSimplePlugin.h +++ b/plugins/authsimple/AuthSimplePlugin.h @@ -78,6 +78,8 @@ class AuthSimplePlugin : public QObject, bool checkCredentials() const override; + void configureCredentials() override; + VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; bool authenticate( QIODevice* socket ) const override; diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index f6f2ce590..50d87418d 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -44,6 +44,10 @@ class DemoAuthentication : public AuthenticationPluginInterface bool checkCredentials() const override; + void configureCredentials() override + { + } + VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; bool authenticate( QIODevice* socket ) const override; From 03504ef399e5b197a8f7a2bd3396f6e10723e2fc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 1 Aug 2019 19:14:32 +0200 Subject: [PATCH 0072/1765] AuthKeys: refactor configuration backend+frontend --- core/include/Filesystem.h | 3 - core/include/VeyonConfigurationProperties.h | 5 - core/src/Filesystem.cpp | 20 ---- plugins/authkeys/AuthKeysConfiguration.h | 37 +++++++ ...ge.cpp => AuthKeysConfigurationDialog.cpp} | 96 ++++++++----------- ...onPage.h => AuthKeysConfigurationDialog.h} | 27 +++--- ...Page.ui => AuthKeysConfigurationDialog.ui} | 46 ++++++++- plugins/authkeys/AuthKeysManager.cpp | 44 ++++++--- plugins/authkeys/AuthKeysManager.h | 8 +- plugins/authkeys/AuthKeysPlugin.cpp | 86 +++++++++-------- plugins/authkeys/AuthKeysPlugin.h | 26 ++--- plugins/authkeys/AuthKeysTableModel.cpp | 17 +--- plugins/authkeys/AuthKeysTableModel.h | 6 +- plugins/authkeys/CMakeLists.txt | 7 +- 14 files changed, 250 insertions(+), 178 deletions(-) create mode 100644 plugins/authkeys/AuthKeysConfiguration.h rename plugins/authkeys/{AuthKeysConfigurationPage.cpp => AuthKeysConfigurationDialog.cpp} (66%) rename plugins/authkeys/{AuthKeysConfigurationPage.h => AuthKeysConfigurationDialog.h} (72%) rename plugins/authkeys/{AuthKeysConfigurationPage.ui => AuthKeysConfigurationDialog.ui} (88%) diff --git a/core/include/Filesystem.h b/core/include/Filesystem.h index 60097cc15..97e4855cd 100644 --- a/core/include/Filesystem.h +++ b/core/include/Filesystem.h @@ -35,9 +35,6 @@ class VEYON_CORE_EXPORT Filesystem QString shrinkPath( QString path ) const; bool ensurePathExists( const QString &path ) const; - QString privateKeyPath( const QString& name ) const; - QString publicKeyPath( const QString& name ) const; - QString serverFilePath() const; QString workerFilePath() const; diff --git a/core/include/VeyonConfigurationProperties.h b/core/include/VeyonConfigurationProperties.h index 24ceb48d7..25670038e 100644 --- a/core/include/VeyonConfigurationProperties.h +++ b/core/include/VeyonConfigurationProperties.h @@ -103,10 +103,6 @@ #define FOREACH_VEYON_AUTHENTICATION_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QUuid, authenticationPlugin, setAuthenticationPlugin, "Plugin", "Authentication", QUuid(), Configuration::Property::Flag::Standard ) \ -#define FOREACH_VEYON_KEY_AUTHENTICATION_CONFIG_PROPERTY(OP) \ - OP( VeyonConfiguration, VeyonCore::config(), QString, privateKeyBaseDir, setPrivateKeyBaseDir, "PrivateKeyBaseDir", "Authentication", QDir::toNativeSeparators( QStringLiteral( "%GLOBALAPPDATA%/keys/private" ) ), Configuration::Property::Flag::Advanced ) \ - OP( VeyonConfiguration, VeyonCore::config(), QString, publicKeyBaseDir, setPublicKeyBaseDir, "PublicKeyBaseDir", "Authentication", QDir::toNativeSeparators( QStringLiteral( "%GLOBALAPPDATA%/keys/public" ) ), Configuration::Property::Flag::Advanced ) \ - #define FOREACH_VEYON_ACCESS_CONTROL_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QUuid, accessControlUserGroupsBackend, setAccessControlUserGroupsBackend, "UserGroupsBackend", "AccessControl", QUuid(), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, domainGroupsForAccessControlEnabled, setDomainGroupsForAccessControlEnabled, "DomainGroupsEnabled", "AccessControl", false, Configuration::Property::Flag::Standard ) \ @@ -136,6 +132,5 @@ FOREACH_VEYON_DIRECTORIES_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_MASTER_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_AUTHENTICATION_CONFIG_PROPERTY(OP) \ - FOREACH_VEYON_KEY_AUTHENTICATION_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_ACCESS_CONTROL_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_LEGACY_CONFIG_PROPERTY(OP) diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index f628c60c1..d1f8bc380 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -128,26 +128,6 @@ bool Filesystem::ensurePathExists( const QString &path ) const -QString Filesystem::privateKeyPath( const QString& name ) const -{ - const auto d = VeyonCore::filesystem().expandPath( VeyonCore::config().privateKeyBaseDir() ) + - QDir::separator() + name + QDir::separator() + QStringLiteral( "key" ); - - return QDir::toNativeSeparators( d ); -} - - - -QString Filesystem::publicKeyPath( const QString& name ) const -{ - const auto d = VeyonCore::filesystem().expandPath( VeyonCore::config().publicKeyBaseDir() ) + - QDir::separator() + name + QDir::separator() + QStringLiteral( "key" ); - - return QDir::toNativeSeparators( d ); -} - - - QString Filesystem::serverFilePath() const { return QDir::toNativeSeparators( QCoreApplication::applicationDirPath() + QDir::separator() + diff --git a/plugins/authkeys/AuthKeysConfiguration.h b/plugins/authkeys/AuthKeysConfiguration.h new file mode 100644 index 000000000..c8818ffac --- /dev/null +++ b/plugins/authkeys/AuthKeysConfiguration.h @@ -0,0 +1,37 @@ +/* + * AuthKeysConfiguration.h - configuration values for AuthKeys plugin + * + * Copyright (c) 2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include + +#include "Configuration/Proxy.h" + +#define FOREACH_AUTH_KEYS_CONFIG_PROPERTY(OP) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, privateKeyBaseDir, setPrivateKeyBaseDir, "PrivateKeyBaseDir", "AuthKeys", QDir::toNativeSeparators( QStringLiteral( "%GLOBALAPPDATA%/keys/private" ) ), Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, publicKeyBaseDir, setPublicKeyBaseDir, "PublicKeyBaseDir", "AuthKeys", QDir::toNativeSeparators( QStringLiteral( "%GLOBALAPPDATA%/keys/public" ) ), Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, legacyPrivateKeyBaseDir, setLegacyPrivateKeyBaseDir, "PrivateKeyBaseDir", "Authentication", QDir::toNativeSeparators( QStringLiteral( "%GLOBALAPPDATA%/keys/private" ) ), Configuration::Property::Flag::Legacy ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, legacyPublicKeyBaseDir, setLegacyPublicKeyBaseDir, "PublicKeyBaseDir", "Authentication", QDir::toNativeSeparators( QStringLiteral( "%GLOBALAPPDATA%/keys/public" ) ), Configuration::Property::Flag::Legacy ) \ + +DECLARE_CONFIG_PROXY(AuthKeysConfiguration, FOREACH_AUTH_KEYS_CONFIG_PROPERTY) diff --git a/plugins/authkeys/AuthKeysConfigurationPage.cpp b/plugins/authkeys/AuthKeysConfigurationDialog.cpp similarity index 66% rename from plugins/authkeys/AuthKeysConfigurationPage.cpp rename to plugins/authkeys/AuthKeysConfigurationDialog.cpp index 50ce66c12..fe585da99 100644 --- a/plugins/authkeys/AuthKeysConfigurationPage.cpp +++ b/plugins/authkeys/AuthKeysConfigurationDialog.cpp @@ -1,5 +1,5 @@ /* - * AuthKeysConfigurationPage.cpp - implementation of the authentication configuration page + * AuthKeysConfigurationDialog.cpp - implementation of the authentication configuration page * * Copyright (c) 2017-2019 Tobias Junghans * @@ -26,28 +26,32 @@ #include #include -#include "AuthKeysConfigurationPage.h" +#include "AuthKeysConfiguration.h" +#include "AuthKeysConfigurationDialog.h" #include "AuthKeysManager.h" #include "FileSystemBrowser.h" #include "PlatformUserFunctions.h" #include "VeyonConfiguration.h" -#include "Configuration/UiMapping.h" -#include "ui_AuthKeysConfigurationPage.h" +#include "ui_AuthKeysConfigurationDialog.h" -AuthKeysConfigurationPage::AuthKeysConfigurationPage() : - ConfigurationPage(), - ui(new Ui::AuthKeysConfigurationPage), - m_authKeyTableModel( this ), +AuthKeysConfigurationDialog::AuthKeysConfigurationDialog( AuthKeysConfiguration& configuration, + AuthKeysManager& manager ) : + QDialog( QApplication::activeWindow() ), + ui( new Ui::AuthKeysConfigurationDialog ), + m_configuration( configuration ), + m_manager( manager ), + m_authKeyTableModel( m_manager, this ), m_keyFilesFilter( tr( "Key files (*.pem)" ) ) { ui->setupUi(this); - Configuration::UiMapping::setFlags( ui->keyFileDirectories, Configuration::Property::Flag::Advanced ); + ui->privateKeyBaseDir->setText( m_configuration.privateKeyBaseDir() ); + ui->publicKeyBaseDir->setText( m_configuration.publicKeyBaseDir() ); #define CONNECT_BUTTON_SLOT(name) \ - connect( ui->name, &QAbstractButton::clicked, this, &AuthKeysConfigurationPage::name ); + connect( ui->name, &QAbstractButton::clicked, this, &AuthKeysConfigurationDialog::name ); CONNECT_BUTTON_SLOT( openPublicKeyBaseDir ); CONNECT_BUTTON_SLOT( openPrivateKeyBaseDir ); @@ -63,36 +67,25 @@ AuthKeysConfigurationPage::AuthKeysConfigurationPage() : } -AuthKeysConfigurationPage::~AuthKeysConfigurationPage() -{ - delete ui; -} - - -void AuthKeysConfigurationPage::resetWidgets() +AuthKeysConfigurationDialog::~AuthKeysConfigurationDialog() { - FOREACH_VEYON_KEY_AUTHENTICATION_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); - - reloadKeyTable(); + delete ui; } -void AuthKeysConfigurationPage::connectWidgetsToProperties() +void AuthKeysConfigurationDialog::accept() { - FOREACH_VEYON_KEY_AUTHENTICATION_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); -} + m_configuration.setPrivateKeyBaseDir( ui->privateKeyBaseDir->text() ); + m_configuration.setPublicKeyBaseDir( ui->publicKeyBaseDir->text() ); - - -void AuthKeysConfigurationPage::applyConfiguration() -{ + QDialog::accept(); } -void AuthKeysConfigurationPage::openPublicKeyBaseDir() +void AuthKeysConfigurationDialog::openPublicKeyBaseDir() { FileSystemBrowser( FileSystemBrowser::ExistingDirectory ). exec( ui->publicKeyBaseDir ); @@ -100,7 +93,7 @@ void AuthKeysConfigurationPage::openPublicKeyBaseDir() -void AuthKeysConfigurationPage::openPrivateKeyBaseDir() +void AuthKeysConfigurationDialog::openPrivateKeyBaseDir() { FileSystemBrowser( FileSystemBrowser::ExistingDirectory ). exec( ui->privateKeyBaseDir ); @@ -108,16 +101,15 @@ void AuthKeysConfigurationPage::openPrivateKeyBaseDir() -void AuthKeysConfigurationPage::createKeyPair() +void AuthKeysConfigurationDialog::createKeyPair() { const auto keyName = QInputDialog::getText( this, tr( "Authentication key name" ), tr( "Please enter the name of the user group or role for which to create an authentication key pair:") ); if( keyName.isEmpty() == false ) { - AuthKeysManager authKeysManager; - const auto success = authKeysManager.createKeyPair( keyName ); + const auto success = m_manager.createKeyPair( keyName ); - showResultMessage( success, tr( "Create key pair" ), authKeysManager.resultMessage() ); + showResultMessage( success, tr( "Create key pair" ), m_manager.resultMessage() ); reloadKeyTable(); } @@ -125,7 +117,7 @@ void AuthKeysConfigurationPage::createKeyPair() -void AuthKeysConfigurationPage::deleteKey() +void AuthKeysConfigurationDialog::deleteKey() { const auto title = ui->deleteKey->text(); @@ -139,10 +131,9 @@ void AuthKeysConfigurationPage::deleteKey() if( QMessageBox::question( this, title, tr( "Do you really want to delete authentication key \"%1/%2\"?" ).arg( name, type ) ) == QMessageBox::Yes ) { - AuthKeysManager authKeysManager; - const auto success = authKeysManager.deleteKey( name, type ); + const auto success = m_manager.deleteKey( name, type ); - showResultMessage( success, title, authKeysManager.resultMessage() ); + showResultMessage( success, title, m_manager.resultMessage() ); reloadKeyTable(); } @@ -155,7 +146,7 @@ void AuthKeysConfigurationPage::deleteKey() -void AuthKeysConfigurationPage::importKey() +void AuthKeysConfigurationDialog::importKey() { const auto title = ui->importKey->text(); @@ -174,18 +165,17 @@ void AuthKeysConfigurationPage::importKey() return; } - AuthKeysManager authKeysManager; - const auto keyType = authKeysManager.detectKeyType( inputFile ); - const auto success = authKeysManager.importKey( keyName, keyType, inputFile ); + const auto keyType = m_manager.detectKeyType( inputFile ); + const auto success = m_manager.importKey( keyName, keyType, inputFile ); - showResultMessage( success, title, authKeysManager.resultMessage() ); + showResultMessage( success, title, m_manager.resultMessage() ); reloadKeyTable(); } -void AuthKeysConfigurationPage::exportKey() +void AuthKeysConfigurationDialog::exportKey() { const auto title = ui->exportKey->text(); @@ -201,10 +191,9 @@ void AuthKeysConfigurationPage::exportKey() m_keyFilesFilter ); if( outputFile.isEmpty() == false ) { - AuthKeysManager authKeysManager; - const auto success = authKeysManager.exportKey( name, type, outputFile ); + const auto success = m_manager.exportKey( name, type, outputFile ); - showResultMessage( success, title, authKeysManager.resultMessage() ); + showResultMessage( success, title, m_manager.resultMessage() ); } } else @@ -215,7 +204,7 @@ void AuthKeysConfigurationPage::exportKey() -void AuthKeysConfigurationPage::setAccessGroup() +void AuthKeysConfigurationDialog::setAccessGroup() { const auto title = ui->setAccessGroup->text(); @@ -224,7 +213,7 @@ void AuthKeysConfigurationPage::setAccessGroup() if( key.isEmpty() == false ) { const auto userGroups = VeyonCore::platform().userFunctions().userGroups( VeyonCore::config().domainGroupsForAccessControlEnabled() ); - const auto currentGroup = AuthKeysManager().accessGroup( key ); + const auto currentGroup = m_manager.accessGroup( key ); bool ok = false; const auto selectedGroup = QInputDialog::getItem( this, title, @@ -233,10 +222,9 @@ void AuthKeysConfigurationPage::setAccessGroup() if( ok && selectedGroup.isEmpty() == false ) { - AuthKeysManager manager; - const auto success = manager.setAccessGroup( key, selectedGroup ); + const auto success = m_manager.setAccessGroup( key, selectedGroup ); - showResultMessage( success, title, manager.resultMessage() ); + showResultMessage( success, title, m_manager.resultMessage() ); reloadKeyTable(); } @@ -249,7 +237,7 @@ void AuthKeysConfigurationPage::setAccessGroup() -void AuthKeysConfigurationPage::reloadKeyTable() +void AuthKeysConfigurationDialog::reloadKeyTable() { m_authKeyTableModel.reload(); ui->keyTable->resizeColumnsToContents(); @@ -257,7 +245,7 @@ void AuthKeysConfigurationPage::reloadKeyTable() -QString AuthKeysConfigurationPage::selectedKey() const +QString AuthKeysConfigurationDialog::selectedKey() const { const auto row = ui->keyTable->currentIndex().row(); if( row >= 0 && row < m_authKeyTableModel.rowCount() ) @@ -270,7 +258,7 @@ QString AuthKeysConfigurationPage::selectedKey() const -void AuthKeysConfigurationPage::showResultMessage( bool success, const QString& title, const QString& message ) +void AuthKeysConfigurationDialog::showResultMessage( bool success, const QString& title, const QString& message ) { if( message.isEmpty() ) { diff --git a/plugins/authkeys/AuthKeysConfigurationPage.h b/plugins/authkeys/AuthKeysConfigurationDialog.h similarity index 72% rename from plugins/authkeys/AuthKeysConfigurationPage.h rename to plugins/authkeys/AuthKeysConfigurationDialog.h index fdcfedfe4..11630a9b4 100644 --- a/plugins/authkeys/AuthKeysConfigurationPage.h +++ b/plugins/authkeys/AuthKeysConfigurationDialog.h @@ -1,5 +1,5 @@ /* - * AuthKeysConfigurationPage.h - header for the AuthKeysConfigurationPage class + * AuthKeysConfigurationDialog.h - header for the AuthKeysConfigurationDialog class * * Copyright (c) 2017-2019 Tobias Junghans * @@ -24,25 +24,27 @@ #pragma once +#include + #include "AuthKeysTableModel.h" -#include "ConfigurationPage.h" namespace Ui { -class AuthKeysConfigurationPage; +class AuthKeysConfigurationDialog; } -class AuthKeysConfigurationPage : public ConfigurationPage +class AuthKeysConfiguration; +class AuthKeysManager; + +class AuthKeysConfigurationDialog : public QDialog { Q_OBJECT public: - AuthKeysConfigurationPage(); - ~AuthKeysConfigurationPage() override; + AuthKeysConfigurationDialog( AuthKeysConfiguration& configuration, AuthKeysManager& manager ); + ~AuthKeysConfigurationDialog() override; - void resetWidgets() override; - void connectWidgetsToProperties() override; - void applyConfiguration() override; + void accept() override; -private slots: +private: void openPublicKeyBaseDir(); void openPrivateKeyBaseDir(); void createKeyPair(); @@ -52,11 +54,12 @@ private slots: void setAccessGroup(); void reloadKeyTable(); -private: QString selectedKey() const; void showResultMessage( bool success, const QString& title, const QString& message ); - Ui::AuthKeysConfigurationPage *ui; + Ui::AuthKeysConfigurationDialog* ui; + AuthKeysConfiguration& m_configuration; + AuthKeysManager& m_manager; AuthKeysTableModel m_authKeyTableModel; const QString m_keyFilesFilter; diff --git a/plugins/authkeys/AuthKeysConfigurationPage.ui b/plugins/authkeys/AuthKeysConfigurationDialog.ui similarity index 88% rename from plugins/authkeys/AuthKeysConfigurationPage.ui rename to plugins/authkeys/AuthKeysConfigurationDialog.ui index d941e9b67..80cc833cc 100644 --- a/plugins/authkeys/AuthKeysConfigurationPage.ui +++ b/plugins/authkeys/AuthKeysConfigurationDialog.ui @@ -1,7 +1,7 @@ - AuthKeysConfigurationPage - + AuthKeysConfigurationDialog + Authentication keys @@ -241,10 +241,50 @@ The public key is used on client computers to authenticate incoming connection r + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + - + + + buttonBox + accepted() + AuthKeysConfigurationDialog + accept() + + + 338 + 800 + + + 338 + 408 + + + + + buttonBox + rejected() + AuthKeysConfigurationDialog + reject() + + + 338 + 800 + + + 338 + 408 + + + + diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index 23eb4f1b1..0c9802cef 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -26,6 +26,7 @@ #include #include +#include "AuthKeysConfiguration.h" #include "AuthKeysManager.h" #include "CommandLineIO.h" #include "CryptoCore.h" @@ -34,8 +35,9 @@ #include "VeyonConfiguration.h" -AuthKeysManager::AuthKeysManager( QObject* parent ) : +AuthKeysManager::AuthKeysManager( AuthKeysConfiguration& configuration, QObject* parent ) : QObject( parent ), + m_configuration( configuration ), m_keyTypePrivate( QStringLiteral("private") ), m_keyTypePublic( QStringLiteral("public") ), m_checkPermissions( tr( "Please check your permissions." ) ), @@ -63,8 +65,8 @@ bool AuthKeysManager::createKeyPair( const QString& name ) return false; } - const auto privateKeyFileName = VeyonCore::filesystem().privateKeyPath( name ); - const auto publicKeyFileName = VeyonCore::filesystem().publicKeyPath( name ); + const auto privateKeyFileName = privateKeyPath( name ); + const auto publicKeyFileName = publicKeyPath( name ); if( QFileInfo::exists( privateKeyFileName ) || QFileInfo::exists( publicKeyFileName ) ) { @@ -189,7 +191,7 @@ bool AuthKeysManager::importKey( const QString& name, const QString& type, const return false; } - keyFileName = VeyonCore::filesystem().privateKeyPath( name ); + keyFileName = privateKeyPath( name ); } else if( type == m_keyTypePublic ) { @@ -200,7 +202,7 @@ bool AuthKeysManager::importKey( const QString& name, const QString& type, const return false; } - keyFileName = VeyonCore::filesystem().publicKeyPath( name ); + keyFileName = publicKeyPath( name ); } else { @@ -242,10 +244,10 @@ bool AuthKeysManager::importKey( const QString& name, const QString& type, const QStringList AuthKeysManager::listKeys() { - const auto privateKeyBaseDir = VeyonCore::filesystem().expandPath( VeyonCore::config().privateKeyBaseDir() ); + const auto privateKeyBaseDir = VeyonCore::filesystem().expandPath( m_configuration.privateKeyBaseDir() ); const auto privateKeyDirs = QDir( privateKeyBaseDir ).entryList( QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name ); - const auto publicKeyBaseDir = VeyonCore::filesystem().expandPath( VeyonCore::config().publicKeyBaseDir() ); + const auto publicKeyBaseDir = VeyonCore::filesystem().expandPath( m_configuration.publicKeyBaseDir() ); const auto publicKeyDirs = QDir( publicKeyBaseDir ).entryList( QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name ); QStringList keys; @@ -282,8 +284,8 @@ bool AuthKeysManager::extractPublicFromPrivateKey( const QString& name ) return false; } - const auto privateKeyFileName = VeyonCore::filesystem().privateKeyPath( name ); - const auto publicKeyFileName = VeyonCore::filesystem().publicKeyPath( name ); + const auto privateKeyFileName = privateKeyPath( name ); + const auto publicKeyFileName = publicKeyPath( name ); if( QFileInfo::exists( privateKeyFileName ) == false ) { @@ -479,6 +481,26 @@ QString AuthKeysManager::keyNameFromExportedKeyFile( const QString& keyFile ) +QString AuthKeysManager::privateKeyPath( const QString& name ) const +{ + const auto d = VeyonCore::filesystem().expandPath( m_configuration.privateKeyBaseDir() ) + + QDir::separator() + name + QDir::separator() + QStringLiteral( "key" ); + + return QDir::toNativeSeparators( d ); +} + + + +QString AuthKeysManager::publicKeyPath(const QString& name) const +{ + const auto d = VeyonCore::filesystem().expandPath( m_configuration.publicKeyBaseDir() ) + + QDir::separator() + name + QDir::separator() + QStringLiteral( "key" ); + + return QDir::toNativeSeparators( d ); +} + + + bool AuthKeysManager::checkKey( const QString& name, const QString& type, bool checkIsReadable ) { if( isKeyNameValid( name ) == false ) @@ -518,11 +540,11 @@ QString AuthKeysManager::keyFilePathFromType( const QString& name, const QString { if( type == m_keyTypePrivate ) { - return VeyonCore::filesystem().privateKeyPath( name ); + return privateKeyPath( name ); } else if( type == m_keyTypePublic ) { - return VeyonCore::filesystem().publicKeyPath( name ); + return publicKeyPath( name ); } return {}; diff --git a/plugins/authkeys/AuthKeysManager.h b/plugins/authkeys/AuthKeysManager.h index 6077e6285..bb31a8ec2 100644 --- a/plugins/authkeys/AuthKeysManager.h +++ b/plugins/authkeys/AuthKeysManager.h @@ -26,11 +26,13 @@ #include "CryptoCore.h" +class AuthKeysConfiguration; + class AuthKeysManager : public QObject { Q_OBJECT public: - explicit AuthKeysManager( QObject* parent = nullptr ); + explicit AuthKeysManager( AuthKeysConfiguration& configuration, QObject* parent = nullptr ); ~AuthKeysManager() override = default; static bool isKeyNameValid( const QString& authKeyName ); @@ -60,6 +62,9 @@ class AuthKeysManager : public QObject static QString exportedKeyFileName( const QString& name, const QString& type ); static QString keyNameFromExportedKeyFile( const QString& keyFile ); + QString privateKeyPath( const QString& name ) const; + QString publicKeyPath( const QString& name ) const; + private: bool checkKey( const QString& name, const QString& type, bool checkIsReadable = true ); @@ -68,6 +73,7 @@ class AuthKeysManager : public QObject bool setPrivateKeyFilePermissions( const QString& fileName ) const; bool setPublicKeyFilePermissions( const QString& fileName ) const; + AuthKeysConfiguration& m_configuration; const QString m_keyTypePrivate; const QString m_keyTypePublic; const QString m_checkPermissions; diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index cb0d30379..249203f03 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -27,7 +27,7 @@ #include #include -#include "AuthKeysConfigurationPage.h" +#include "AuthKeysConfigurationDialog.h" #include "AuthKeysPlugin.h" #include "AuthKeysManager.h" #include "Filesystem.h" @@ -37,6 +37,8 @@ AuthKeysPlugin::AuthKeysPlugin( QObject* parent ) : QObject( parent ), + m_configuration( &VeyonCore::config() ), + m_manager( m_configuration ), m_privateKey(), m_commands( { { QStringLiteral("create"), tr( "Create new authentication key pair" ) }, @@ -52,6 +54,17 @@ AuthKeysPlugin::AuthKeysPlugin( QObject* parent ) : +void AuthKeysPlugin::upgrade(const QVersionNumber& oldVersion) +{ + if( oldVersion < QVersionNumber( 2, 0 ) ) + { + m_configuration.setPublicKeyBaseDir( m_configuration.legacyPublicKeyBaseDir() ); + m_configuration.setPrivateKeyBaseDir( m_configuration.legacyPrivateKeyBaseDir() ); + } +} + + + bool AuthKeysPlugin::initializeCredentials() { m_privateKey = {}; @@ -61,7 +74,7 @@ bool AuthKeysPlugin::initializeCredentials() if( authKeyName.isEmpty() == false ) { if( AuthKeysManager::isKeyNameValid( authKeyName ) && - loadPrivateKey( VeyonCore::filesystem().privateKeyPath( authKeyName ) ) ) + loadPrivateKey( m_manager.privateKeyPath( authKeyName ) ) ) { m_authKeyName = authKeyName; return true; @@ -70,12 +83,12 @@ bool AuthKeysPlugin::initializeCredentials() else { // try to auto-detect private key file by searching for readable file - const auto privateKeyBaseDir = VeyonCore::filesystem().expandPath( VeyonCore::config().privateKeyBaseDir() ); + const auto privateKeyBaseDir = VeyonCore::filesystem().expandPath( m_configuration.privateKeyBaseDir() ); const auto privateKeyDirs = QDir( privateKeyBaseDir ).entryList( QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name ); for( const auto& privateKeyDir : privateKeyDirs ) { - if( loadPrivateKey( VeyonCore::filesystem().privateKeyPath( privateKeyDir ) ) ) + if( loadPrivateKey( m_manager.privateKeyPath( privateKeyDir ) ) ) { m_authKeyName = privateKeyDir; return true; @@ -115,6 +128,13 @@ bool AuthKeysPlugin::checkCredentials() const +void AuthKeysPlugin::configureCredentials() +{ + AuthKeysConfigurationDialog( m_configuration, m_manager ).exec(); +} + + + VncServerClient::AuthState AuthKeysPlugin::performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const { switch( client->authState() ) @@ -143,7 +163,7 @@ VncServerClient::AuthState AuthKeysPlugin::performAuthentication( VncServerClien // under which the client claims to run const auto signature = message.read().toByteArray(); // Flawfinder: ignore - const auto publicKeyPath = VeyonCore::filesystem().publicKeyPath( authKeyName ); + const auto publicKeyPath = m_manager.publicKeyPath( authKeyName ); vDebug() << "loading public key" << publicKeyPath; CryptoCore::PublicKey publicKey( publicKeyPath ); @@ -215,13 +235,6 @@ QString AuthKeysPlugin::commandHelp( const QString& command ) const -ConfigurationPage* AuthKeysPlugin::createConfigurationPage() -{ - return new AuthKeysConfigurationPage(); -} - - - CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_help( const QStringList& arguments ) { const auto command = arguments.value( 0 ); @@ -285,15 +298,14 @@ CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_setaccessgroup( con const auto key = arguments[0]; const auto accessGroup = arguments[1]; - AuthKeysManager manager; - if( manager.setAccessGroup( key, accessGroup ) == false ) + if( m_manager.setAccessGroup( key, accessGroup ) == false ) { - error( manager.resultMessage() ); + error( m_manager.resultMessage() ); return Failed; } - info( manager.resultMessage() ); + info( m_manager.resultMessage() ); return Successful; } @@ -307,15 +319,14 @@ CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_create( const QStri return NotEnoughArguments; } - AuthKeysManager manager; - if( manager.createKeyPair( arguments.first() ) == false ) + if( m_manager.createKeyPair( arguments.first() ) == false ) { - error( manager.resultMessage() ); + error( m_manager.resultMessage() ); return Failed; } - info( manager.resultMessage() ); + info( m_manager.resultMessage() ); return Successful; } @@ -333,15 +344,14 @@ CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_delete( const QStri const auto name = nameAndType.value( 0 ); const auto type = nameAndType.value( 1 ); - AuthKeysManager manager; - if( manager.deleteKey( name, type ) == false ) + if( m_manager.deleteKey( name, type ) == false ) { - error( manager.resultMessage() ); + error( m_manager.resultMessage() ); return Failed; } - info( manager.resultMessage() ); + info( m_manager.resultMessage() ); return Successful; } @@ -366,15 +376,14 @@ CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_export( const QStri outputFile = AuthKeysManager::exportedKeyFileName( name, type ); } - AuthKeysManager manager; - if( manager.exportKey( name, type, outputFile ) == false ) + if( m_manager.exportKey( name, type, outputFile ) == false ) { - error( manager.resultMessage() ); + error( m_manager.resultMessage() ); return Failed; } - info( manager.resultMessage() ); + info( m_manager.resultMessage() ); return Successful; } @@ -399,15 +408,14 @@ CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_import( const QStri inputFile = AuthKeysManager::exportedKeyFileName( name, type ); } - AuthKeysManager manager; - if( manager.importKey( name, type, inputFile ) == false ) + if( m_manager.importKey( name, type, inputFile ) == false ) { - error( manager.resultMessage() ); + error( m_manager.resultMessage() ); return Failed; } - info( manager.resultMessage() ); + info( m_manager.resultMessage() ); return Successful; } @@ -437,15 +445,14 @@ CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_extract( const QStr return NotEnoughArguments; } - AuthKeysManager manager; - if( manager.extractPublicFromPrivateKey( arguments.first() ) == false ) + if( m_manager.extractPublicFromPrivateKey( arguments.first() ) == false ) { - error( manager.resultMessage() ); + error( m_manager.resultMessage() ); return Failed; } - info( manager.resultMessage() ); + info( m_manager.resultMessage() ); return Successful; } @@ -470,7 +477,7 @@ bool AuthKeysPlugin::loadPrivateKey( const QString& privateKeyFile ) void AuthKeysPlugin::printAuthKeyTable() { - AuthKeysTableModel tableModel; + AuthKeysTableModel tableModel( m_manager ); tableModel.reload(); CommandLineIO::TableHeader tableHeader( { tr("NAME"), tr("TYPE"), tr("PAIR ID"), tr("ACCESS GROUP") } ); @@ -500,10 +507,13 @@ QString AuthKeysPlugin::authKeysTableData( const AuthKeysTableModel& tableModel, void AuthKeysPlugin::printAuthKeyList() { - const auto keys = AuthKeysManager().listKeys(); + const auto keys = m_manager.listKeys(); for( const auto& key : keys ) { print( key ); } } + + +IMPLEMENT_CONFIG_PROXY(AuthKeysConfiguration) diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index 88982b4f9..6f42198c5 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -25,9 +25,10 @@ #pragma once #include "AuthenticationPluginInterface.h" +#include "AuthKeysConfiguration.h" +#include "AuthKeysManager.h" #include "CommandLineIO.h" #include "CommandLinePluginInterface.h" -#include "ConfigurationPagePluginInterface.h" class AuthKeysTableModel; @@ -35,15 +36,13 @@ class AuthKeysPlugin : public QObject, AuthenticationPluginInterface, CommandLinePluginInterface, PluginInterface, - CommandLineIO, - ConfigurationPagePluginInterface + CommandLineIO { Q_OBJECT Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.AuthKeys") Q_INTERFACES(PluginInterface AuthenticationPluginInterface - CommandLinePluginInterface - ConfigurationPagePluginInterface) + CommandLinePluginInterface) public: explicit AuthKeysPlugin( QObject* parent = nullptr ); ~AuthKeysPlugin() override = default; @@ -55,7 +54,7 @@ class AuthKeysPlugin : public QObject, QVersionNumber version() const override { - return QVersionNumber( 1, 1 ); + return QVersionNumber( 2, 0 ); } QString name() const override @@ -78,6 +77,8 @@ class AuthKeysPlugin : public QObject, return QStringLiteral( "Tobias Junghans" ); } + void upgrade( const QVersionNumber& oldVersion ) override; + QString authenticationTypeName() const override { return description(); @@ -87,9 +88,7 @@ class AuthKeysPlugin : public QObject, bool hasCredentials() const override; bool checkCredentials() const override; - void configureCredentials() override - { - } + void configureCredentials() override; // server side authentication VncServerClient::AuthState performAuthentication( VncServerClient* client, VariantArrayMessage& message ) const override; @@ -110,8 +109,6 @@ class AuthKeysPlugin : public QObject, QStringList commands() const override; QString commandHelp( const QString& command ) const override; - ConfigurationPage* createConfigurationPage() override; - public slots: CommandLinePluginInterface::RunResult handle_help( const QStringList& arguments ); CommandLinePluginInterface::RunResult handle_setaccessgroup( const QStringList& arguments ); @@ -125,9 +122,12 @@ public slots: private: bool loadPrivateKey( const QString& privateKeyFile ); - static void printAuthKeyTable(); + void printAuthKeyTable(); static QString authKeysTableData( const AuthKeysTableModel& tableModel, int row, int column ); - static void printAuthKeyList(); + void printAuthKeyList(); + + AuthKeysConfiguration m_configuration; + AuthKeysManager m_manager; CryptoCore::PrivateKey m_privateKey; QString m_authKeyName; diff --git a/plugins/authkeys/AuthKeysTableModel.cpp b/plugins/authkeys/AuthKeysTableModel.cpp index fd4ab786b..f72da3a0f 100644 --- a/plugins/authkeys/AuthKeysTableModel.cpp +++ b/plugins/authkeys/AuthKeysTableModel.cpp @@ -25,27 +25,20 @@ #include "AuthKeysTableModel.h" #include "AuthKeysManager.h" -AuthKeysTableModel::AuthKeysTableModel( QObject* parent ) : +AuthKeysTableModel::AuthKeysTableModel( AuthKeysManager& manager, QObject* parent ) : QAbstractTableModel( parent ), - m_manager( new AuthKeysManager( this ) ), + m_manager( manager ), m_keys() { } -AuthKeysTableModel::~AuthKeysTableModel() -{ - delete m_manager; -} - - - void AuthKeysTableModel::reload() { beginResetModel(); - m_keys = m_manager->listKeys(); + m_keys = m_manager.listKeys(); endResetModel(); } @@ -83,8 +76,8 @@ QVariant AuthKeysTableModel::data( const QModelIndex& index, int role ) const { case ColumnKeyName: return key.split( QLatin1Char('/') ).value( 0 ); case ColumnKeyType: return key.split( QLatin1Char('/') ).value( 1 ); - case ColumnAccessGroup: return m_manager->accessGroup( key ); - case ColumnKeyPairID: return m_manager->keyPairId( key ); + case ColumnAccessGroup: return m_manager.accessGroup( key ); + case ColumnKeyPairID: return m_manager.keyPairId( key ); default: break; } diff --git a/plugins/authkeys/AuthKeysTableModel.h b/plugins/authkeys/AuthKeysTableModel.h index 24eba90d5..ce735d293 100644 --- a/plugins/authkeys/AuthKeysTableModel.h +++ b/plugins/authkeys/AuthKeysTableModel.h @@ -40,8 +40,8 @@ class AuthKeysTableModel : public QAbstractTableModel ColumnCount }; - explicit AuthKeysTableModel( QObject* parent = nullptr ); - ~AuthKeysTableModel() override; + explicit AuthKeysTableModel( AuthKeysManager& manager, QObject* parent = nullptr ); + ~AuthKeysTableModel() override = default; void reload(); @@ -56,7 +56,7 @@ class AuthKeysTableModel : public QAbstractTableModel QVariant headerData( int section, Qt::Orientation orientation, int role ) const override; private: - AuthKeysManager* m_manager; + AuthKeysManager& m_manager; QStringList m_keys; }; diff --git a/plugins/authkeys/CMakeLists.txt b/plugins/authkeys/CMakeLists.txt index 517c6e75f..3261dc627 100644 --- a/plugins/authkeys/CMakeLists.txt +++ b/plugins/authkeys/CMakeLists.txt @@ -2,12 +2,13 @@ INCLUDE(BuildPlugin) BUILD_PLUGIN(authkeys AuthKeysPlugin.cpp - AuthKeysConfigurationPage.cpp - AuthKeysConfigurationPage.ui + AuthKeysConfigurationDialog.cpp + AuthKeysConfigurationDialog.ui AuthKeysTableModel.cpp AuthKeysManager.cpp AuthKeysPlugin.h - AuthKeysConfigurationPage.h + AuthKeysConfigurationDialog.h + AuthKeysConfiguration.h AuthKeysTableModel.h AuthKeysManager.h ) From 2773b15e6f7e309747250ea56980c61bdfb68bc0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 1 Aug 2019 19:23:19 +0200 Subject: [PATCH 0073/1765] GeneralConfigurationPage: add auth config button --- configurator/src/GeneralConfigurationPage.cpp | 9 +++++ configurator/src/GeneralConfigurationPage.h | 1 + configurator/src/GeneralConfigurationPage.ui | 37 ++++++++++++++++--- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index b3a0f54e3..6d31ea50f 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -83,6 +83,7 @@ GeneralConfigurationPage::GeneralConfigurationPage() : } } + connect( ui->configureAuthenticationButton, &QPushButton::clicked, this, &GeneralConfigurationPage::configureAuthentication ); connect( ui->testAuthenticationButton, &QPushButton::clicked, this, &GeneralConfigurationPage::testAuthentication ); connect( ui->openLogFileDirectory, &QPushButton::clicked, this, &GeneralConfigurationPage::openLogFileDirectory ); connect( ui->clearLogFiles, &QPushButton::clicked, this, &GeneralConfigurationPage::clearLogFiles ); @@ -125,6 +126,14 @@ void GeneralConfigurationPage::applyConfiguration() +void GeneralConfigurationPage::configureAuthentication() +{ + VeyonCore::authenticationManager().reloadConfiguration(); + VeyonCore::authenticationManager().configuredPlugin()->configureCredentials(); +} + + + void GeneralConfigurationPage::testAuthentication() { VeyonCore::authenticationManager().reloadConfiguration(); diff --git a/configurator/src/GeneralConfigurationPage.h b/configurator/src/GeneralConfigurationPage.h index 9f224deaf..309a91e5b 100644 --- a/configurator/src/GeneralConfigurationPage.h +++ b/configurator/src/GeneralConfigurationPage.h @@ -40,6 +40,7 @@ class GeneralConfigurationPage : public ConfigurationPage void applyConfiguration() override; private: + void configureAuthentication(); void testAuthentication(); void openLogFileDirectory(); diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index 140feec48..b58a196ec 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -55,18 +55,15 @@ Authentication - - + + Method: - - - - + Test @@ -77,6 +74,33 @@ + + + + Configure + + + + :/core/document-edit.png:/core/document-edit.png + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -333,6 +357,7 @@ applicationName uiLanguage authenticationPlugin + configureAuthenticationButton testAuthenticationButton networkObjectDirectoryPlugin networkObjectDirectoryUpdateInterval From 6ffc156c542fca8ac7e1f834218953445279bfc7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 5 Aug 2019 10:58:54 +0200 Subject: [PATCH 0074/1765] ComputerListModel: add new base class This base class provides common enum classes for computer-related list models. --- core/include/ComputerListModel.h | 75 ++++++++++++++++++++++++++++++++ core/src/ComputerListModel.cpp | 62 ++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 core/include/ComputerListModel.h create mode 100644 core/src/ComputerListModel.cpp diff --git a/core/include/ComputerListModel.h b/core/include/ComputerListModel.h new file mode 100644 index 000000000..e9a3d39d4 --- /dev/null +++ b/core/include/ComputerListModel.h @@ -0,0 +1,75 @@ +/* + * ComputerListModel.h - data model base class for computer objects + * + * Copyright (c) 2017-2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include + +#include "VeyonCore.h" + +class VEYON_CORE_EXPORT ComputerListModel : public QAbstractListModel +{ + Q_OBJECT +public: + enum { + UidRole = Qt::UserRole, + StateRole + }; + + enum class DisplayRoleContent { + UserAndComputerName, + UserName, + ComputerName, + }; + Q_ENUM(DisplayRoleContent) + + enum class SortOrder { + ComputerAndUserName, + UserName, + ComputerName, + }; + Q_ENUM(SortOrder) + + explicit ComputerListModel( QObject* parent = nullptr ); + + Qt::ItemFlags flags( const QModelIndex& index ) const override; + + Qt::DropActions supportedDragActions() const override; + Qt::DropActions supportedDropActions() const override; + + DisplayRoleContent displayRoleContent() const + { + return m_displayRoleContent; + } + + SortOrder sortOrder() const + { + return m_sortOrder; + } + +private: + DisplayRoleContent m_displayRoleContent; + SortOrder m_sortOrder; + +}; diff --git a/core/src/ComputerListModel.cpp b/core/src/ComputerListModel.cpp new file mode 100644 index 000000000..c72947acc --- /dev/null +++ b/core/src/ComputerListModel.cpp @@ -0,0 +1,62 @@ +/* + * ComputerListModel.cpp - data model base class for computer objects + * + * Copyright (c) 2017-2019 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "ComputerListModel.h" +#include "VeyonConfiguration.h" + + +ComputerListModel::ComputerListModel( QObject* parent ) : + QAbstractListModel( parent ), + m_displayRoleContent( VeyonCore::config().computerDisplayRoleContent() ), + m_sortOrder( VeyonCore::config().computerMonitoringSortOrder() ) +{ +} + + + +Qt::ItemFlags ComputerListModel::flags( const QModelIndex& index ) const +{ + auto defaultFlags = QAbstractListModel::flags( index ); + + if( index.isValid() ) + { + return Qt::ItemIsDragEnabled | defaultFlags; + } + + return Qt::ItemIsDropEnabled | defaultFlags; +} + + + +Qt::DropActions ComputerListModel::supportedDragActions() const +{ + return Qt::MoveAction; +} + + + +Qt::DropActions ComputerListModel::supportedDropActions() const +{ + return Qt::MoveAction; +} From 969bea6940a2ba7eca1339cffd18f3cf10d73023 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 5 Aug 2019 11:01:39 +0200 Subject: [PATCH 0075/1765] ComputerControlListModel: inherit ComputerListModel --- master/src/ComputerControlListModel.cpp | 50 +++++-------------------- master/src/ComputerControlListModel.h | 30 +-------------- 2 files changed, 12 insertions(+), 68 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index d648670f6..ef641f39b 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -37,10 +37,8 @@ ComputerControlListModel::ComputerControlListModel( VeyonMaster* masterCore, QObject* parent ) : - QAbstractListModel( parent ), + ComputerListModel( parent ), m_master( masterCore ), - m_displayRoleContent( static_cast( VeyonCore::config().computerDisplayRoleContent() ) ), - m_sortOrder( static_cast( VeyonCore::config().computerDisplayRoleContent() ) ), m_iconDefault(), m_iconConnectionProblem(), m_iconDemoMode() @@ -367,9 +365,9 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte QString ComputerControlListModel::computerDisplayRole( const ComputerControlInterface::Pointer& controlInterface ) const { - if( m_displayRoleContent != DisplayComputerName && - controlInterface->state() == ComputerControlInterface::State::Connected && - controlInterface->userLoginName().isEmpty() == false ) + if( displayRoleContent() != DisplayRoleContent::ComputerName && + controlInterface->state() == ComputerControlInterface::State::Connected && + controlInterface->userLoginName().isEmpty() == false ) { auto user = controlInterface->userFullName(); if( user.isEmpty() ) @@ -377,7 +375,7 @@ QString ComputerControlListModel::computerDisplayRole( const ComputerControlInte user = controlInterface->userLoginName(); } - if( m_displayRoleContent == DisplayUserName ) + if( displayRoleContent() == DisplayRoleContent::UserName ) { return user; } @@ -387,7 +385,7 @@ QString ComputerControlListModel::computerDisplayRole( const ComputerControlInte } } - if( m_displayRoleContent != DisplayUserName ) + if( displayRoleContent() != DisplayRoleContent::UserName ) { return controlInterface->computer().name(); } @@ -399,17 +397,17 @@ QString ComputerControlListModel::computerDisplayRole( const ComputerControlInte QString ComputerControlListModel::computerSortRole( const ComputerControlInterface::Pointer& controlInterface ) const { - switch( m_sortOrder ) + switch( sortOrder() ) { - case SortByComputerAndUserName: + case SortOrder::ComputerAndUserName: return controlInterface->computer().location() + controlInterface->computer().name() + controlInterface->computer().hostAddress() + controlInterface->userLoginName(); - case SortByComputerName: + case SortOrder::ComputerName: return controlInterface->computer().location() + controlInterface->computer().name() + controlInterface->computer().hostAddress(); - case SortByUserName: + case SortOrder::UserName: if( controlInterface->userFullName().isEmpty() == false ) { return controlInterface->userFullName(); @@ -490,31 +488,3 @@ QString ComputerControlListModel::activeFeatures( const ComputerControlInterface return featureNames.join( QStringLiteral(", ") ); } - - - -Qt::ItemFlags ComputerControlListModel::flags( const QModelIndex& index ) const -{ - auto defaultFlags = QAbstractListModel::flags( index ); - - if( index.isValid() ) - { - return Qt::ItemIsDragEnabled | defaultFlags; - } - - return Qt::ItemIsDropEnabled | defaultFlags; -} - - - -Qt::DropActions ComputerControlListModel::supportedDragActions() const -{ - return Qt::MoveAction; -} - - - -Qt::DropActions ComputerControlListModel::supportedDropActions() const -{ - return Qt::MoveAction; -} diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index d02abed86..6242da340 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -27,33 +27,15 @@ #include #include +#include "ComputerListModel.h" #include "ComputerControlInterface.h" class VeyonMaster; -class ComputerControlListModel : public QAbstractListModel +class ComputerControlListModel : public ComputerListModel { Q_OBJECT public: - enum { - UidRole = Qt::UserRole, - StateRole - }; - - enum DisplayRoleContent { - DisplayUserAndComputerName, - DisplayUserName, - DisplayComputerName, - }; - Q_ENUM(DisplayRoleContent) - - enum SortOrder { - SortByComputerAndUserName, - SortByUserName, - SortByComputerName, - }; - Q_ENUM(SortOrder) - explicit ComputerControlListModel( VeyonMaster* masterCore, QObject* parent = nullptr ); int rowCount( const QModelIndex& parent = QModelIndex() ) const override; @@ -69,11 +51,6 @@ class ComputerControlListModel : public QAbstractListModel ComputerControlInterface::Pointer computerControlInterface( const QModelIndex& index ) const; - Qt::ItemFlags flags( const QModelIndex& index ) const override; - - Qt::DropActions supportedDragActions() const override; - Qt::DropActions supportedDropActions() const override; - void reload(); signals: @@ -104,9 +81,6 @@ class ComputerControlListModel : public QAbstractListModel VeyonMaster* m_master; - DisplayRoleContent m_displayRoleContent; - SortOrder m_sortOrder; - QImage m_iconDefault; QImage m_iconConnectionProblem; QImage m_iconDemoMode; From 38b9d1af3cf5abc845205ef4587b1fe35f858d16 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 5 Aug 2019 11:04:35 +0200 Subject: [PATCH 0076/1765] VeyonConfigurationProperties: integrate ComputerListModel --- core/include/VeyonConfigurationProperties.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/include/VeyonConfigurationProperties.h b/core/include/VeyonConfigurationProperties.h index 25670038e..816994616 100644 --- a/core/include/VeyonConfigurationProperties.h +++ b/core/include/VeyonConfigurationProperties.h @@ -30,6 +30,7 @@ #include #include +#include "ComputerListModel.h" #include "Logger.h" #include "NetworkObjectDirectory.h" @@ -83,8 +84,8 @@ #define FOREACH_VEYON_MASTER_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringUpdateInterval, setComputerMonitoringUpdateInterval, "ComputerMonitoringUpdateInterval", "Master", 1000, Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, computerDisplayRoleContent, setComputerDisplayRoleContent, "ComputerDisplayRoleContent", "Master", QVariant(), Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringSortOrder, setComputerMonitoringSortOrder, "ComputerMonitoringSortOrder", "Master", QVariant(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::DisplayRoleContent, computerDisplayRoleContent, setComputerDisplayRoleContent, "ComputerDisplayRoleContent", "Master", QVariant::fromValue(ComputerListModel::DisplayRoleContent::UserAndComputerName), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::SortOrder, computerMonitoringSortOrder, setComputerMonitoringSortOrder, "ComputerMonitoringSortOrder", "Master", QVariant::fromValue(ComputerListModel::SortOrder::ComputerAndUserName), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QColor, computerMonitoringBackgroundColor, setComputerMonitoringBackgroundColor, "ComputerMonitoringBackgroundColor", "Master", QColor(Qt::white), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QColor, computerMonitoringTextColor, setComputerMonitoringTextColor, "ComputerMonitoringTextColor", "Master", QColor(Qt::black), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, accessControlForMasterEnabled, setAccessControlForMasterEnabled, "AccessControlForMasterEnabled", "Master", false, Configuration::Property::Flag::Standard ) \ From 90c9298c29507abc9981e86f3e2e77faa93c667b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 5 Aug 2019 11:04:53 +0200 Subject: [PATCH 0077/1765] VeyonConfigurationProperties: fix default values --- core/include/VeyonConfigurationProperties.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/include/VeyonConfigurationProperties.h b/core/include/VeyonConfigurationProperties.h index 816994616..5e3f61932 100644 --- a/core/include/VeyonConfigurationProperties.h +++ b/core/include/VeyonConfigurationProperties.h @@ -36,7 +36,7 @@ #define FOREACH_VEYON_CORE_CONFIG_PROPERTIES(OP) \ OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::ApplicationVersion, applicationVersion, setApplicationVersion, "ApplicationVersion", "Core", QVariant::fromValue(VeyonCore::ApplicationVersion::Version_4_0), Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), QJsonObject, pluginVersions, setPluginVersions, "PluginVersions", "Core", QVariant(), Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), QJsonObject, pluginVersions, setPluginVersions, "PluginVersions", "Core", QJsonObject(), Configuration::Property::Flag::Hidden ) \ OP( VeyonConfiguration, VeyonCore::config(), QString, installationID, setInstallationID, "InstallationID", "Core", QString(), Configuration::Property::Flag::Hidden ) \ #define FOREACH_VEYON_UI_CONFIG_PROPERTY(OP) \ @@ -110,7 +110,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, isAccessRestrictedToUserGroups, setAccessRestrictedToUserGroups, "AccessRestrictedToUserGroups", "AccessControl", false , Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, isAccessControlRulesProcessingEnabled, setAccessControlRulesProcessingEnabled, "AccessControlRulesProcessingEnabled", "AccessControl", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QStringList, authorizedUserGroups, setAuthorizedUserGroups, "AuthorizedUserGroups", "AccessControl", QStringList(), Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), QJsonArray, accessControlRules, setAccessControlRules, "AccessControlRules", "AccessControl", QVariant(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), QJsonArray, accessControlRules, setAccessControlRules, "AccessControlRules", "AccessControl", QJsonArray(), Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_LEGACY_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, legacyOpenComputerManagementAtStart, setLegacyOpenComputerManagementAtStart, "OpenComputerManagementAtStart", "Master", false, Configuration::Property::Flag::Legacy ) \ From 30686ad6aa751c60fc923373c6cad1c114280e6a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 5 Aug 2019 11:08:11 +0200 Subject: [PATCH 0078/1765] ConfigurationProperty: add getters --- core/include/Configuration/Property.h | 30 +++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/core/include/Configuration/Property.h b/core/include/Configuration/Property.h index d8f87ec15..17f368afb 100644 --- a/core/include/Configuration/Property.h +++ b/core/include/Configuration/Property.h @@ -83,6 +83,36 @@ class VEYON_CORE_EXPORT Property : public QObject static Property* find( QObject* parent, const QString& key, const QString& parentKey ); + const QString& key() const + { + return m_key; + } + + const QString& parentKey() const + { + return m_parentKey; + } + + QString absoluteKey() const + { + if( m_parentKey.isEmpty() ) + { + return m_key; + } + + return m_parentKey + QLatin1Char('/') + m_key; + } + + const QVariant& defaultValue() const + { + return m_defaultValue; + } + + Flags flags() const + { + return m_flags; + } + private: Object* m_object; Proxy* m_proxy; From 7f0d624c6bb17657f018bd3cd99a7fa58d98ce4c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 6 Aug 2019 08:46:08 +0200 Subject: [PATCH 0079/1765] ConfigurationProperty: add Q_OBJECT macro --- core/include/Configuration/Property.h | 1 + 1 file changed, 1 insertion(+) diff --git a/core/include/Configuration/Property.h b/core/include/Configuration/Property.h index 17f368afb..f83923b2a 100644 --- a/core/include/Configuration/Property.h +++ b/core/include/Configuration/Property.h @@ -54,6 +54,7 @@ template struct CheapestType { using Type = T *; }; class VEYON_CORE_EXPORT Property : public QObject { + Q_OBJECT public: enum class Flag { From 793d5f63bcf3f5fee66259742732a6553615c17b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 6 Aug 2019 08:47:24 +0200 Subject: [PATCH 0080/1765] ConfigurationProperty: store as pointers in object Configuration property objects should be deleted during children cleanup in the parent object allowing to use a different parent for the property objects. --- core/include/Configuration/Property.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/include/Configuration/Property.h b/core/include/Configuration/Property.h index f83923b2a..7933ab417 100644 --- a/core/include/Configuration/Property.h +++ b/core/include/Configuration/Property.h @@ -163,19 +163,19 @@ VEYON_CORE_EXPORT void TypedProperty::setValue( const Password& value #define DECLARE_CONFIG_PROPERTY(className,config,type, name, setter, key, parentKey, defaultValue, flags) \ private: \ - const Configuration::TypedProperty m_##name{this, QStringLiteral(key), QStringLiteral(parentKey), defaultValue, flags}; \ + const Configuration::TypedProperty* m_##name{ new Configuration::TypedProperty( this, QStringLiteral(key), QStringLiteral(parentKey), defaultValue, flags ) }; \ public: \ type name() const \ { \ - return m_##name.value(); \ + return m_##name->value(); \ } \ const Configuration::TypedProperty& name##Property() const \ { \ - return m_##name; \ + return *m_##name; \ } \ void setter( Configuration::TypedProperty::Type value ) const \ { \ - m_##name.setValue( value ); \ + m_##name->setValue( value ); \ } } From 40ffe33f61cdc3ec4ba03864fa0b67b921179681 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 6 Aug 2019 08:49:28 +0200 Subject: [PATCH 0081/1765] ConfigurationProxy: use object as parent for properties --- core/include/Configuration/Proxy.h | 11 ++++++++--- core/src/Configuration/Property.cpp | 2 +- core/src/Configuration/Proxy.cpp | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/core/include/Configuration/Proxy.h b/core/include/Configuration/Proxy.h index 8f2d9527b..48795601b 100644 --- a/core/include/Configuration/Proxy.h +++ b/core/include/Configuration/Proxy.h @@ -34,7 +34,7 @@ class VEYON_CORE_EXPORT Proxy : public QObject { Q_OBJECT public: - explicit Proxy( Object* object, QObject* parent = nullptr ); + explicit Proxy( Object* object ); ~Proxy() override = default; bool hasValue( const QString& key, const QString& parentKey ) const; @@ -48,6 +48,11 @@ class VEYON_CORE_EXPORT Proxy : public QObject void reloadFromStore(); void flushStore(); + QObject* object() const + { + return m_object; + } + const QString& instanceId() const { return m_instanceId; @@ -71,11 +76,11 @@ class VEYON_CORE_EXPORT Proxy : public QObject #define DECLARE_CONFIG_PROXY(name, ops) \ class name : public Configuration::Proxy { \ public: \ - explicit name( Configuration::Object* object, QObject* parent = nullptr ); \ + explicit name( Configuration::Object* object ); \ ops(DECLARE_CONFIG_PROPERTY) \ }; #define IMPLEMENT_CONFIG_PROXY(name) \ - name::name( Configuration::Object* object, QObject* parent ) : Configuration::Proxy( object, parent ) { } + name::name( Configuration::Object* object ) : Configuration::Proxy( object ) { } } diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index 429abe616..84ca335b9 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -46,7 +46,7 @@ Configuration::Property::Property( Object* object, const QString& key, const QSt Configuration::Property::Property( Proxy* proxy, const QString& key, const QString& parentKey, const QVariant& defaultValue, Flags flags ) : - QObject( proxy ), + QObject( proxy->object() ), m_object( nullptr ), m_proxy( proxy ), m_key( key ), diff --git a/core/src/Configuration/Proxy.cpp b/core/src/Configuration/Proxy.cpp index 0ce7284e6..aff78534d 100644 --- a/core/src/Configuration/Proxy.cpp +++ b/core/src/Configuration/Proxy.cpp @@ -28,8 +28,8 @@ namespace Configuration { -Proxy::Proxy(Object *object, QObject *parent) : - QObject( parent ), +Proxy::Proxy( Object* object ) : + QObject(), m_object( object ), m_instanceId() { From ceb32788f2c3e89ccd975cc4ce489fc6ac29846a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 6 Aug 2019 08:50:07 +0200 Subject: [PATCH 0082/1765] Config: improve string formatting of properties Both enumerations and JSON objects are now handled properly. --- plugins/config/ConfigCommandLinePlugin.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/plugins/config/ConfigCommandLinePlugin.cpp b/plugins/config/ConfigCommandLinePlugin.cpp index 0848fcf35..72dd20626 100644 --- a/plugins/config/ConfigCommandLinePlugin.cpp +++ b/plugins/config/ConfigCommandLinePlugin.cpp @@ -312,9 +312,10 @@ CommandLinePluginInterface::RunResult ConfigCommandLinePlugin::applyConfiguratio QString ConfigCommandLinePlugin::printableConfigurationValue( const QVariant& value ) { if( value.type() == QVariant::String || - value.type() == QVariant::Uuid || - value.type() == QVariant::UInt || - value.type() == QVariant::Bool ) + value.type() == QVariant::Uuid || + value.type() == QVariant::UInt || + value.type() == QVariant::Int || + value.type() == QVariant::Bool ) { return value.toString(); } @@ -322,10 +323,18 @@ QString ConfigCommandLinePlugin::printableConfigurationValue( const QVariant& va { return value.toStringList().join( QLatin1Char(';') ); } - else if( value.userType() == QMetaType::type( "QJsonArray" ) ) + else if( value.userType() == QMetaType::QJsonArray ) { return QString::fromUtf8( QJsonDocument( value.toJsonArray() ).toJson( QJsonDocument::Compact ) ); } + else if( value.userType() == QMetaType::QJsonObject ) + { + return QString::fromUtf8( QJsonDocument( value.toJsonObject() ).toJson( QJsonDocument::Compact ) ); + } + else if( QMetaType( value.userType() ).flags().testFlag( QMetaType::IsEnumeration ) ) + { + return QString::number( value.toInt() ); + } return {}; } From a02e5ef44d5df8cc9aedf5dd654fa7ac560787a7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 6 Aug 2019 08:51:15 +0200 Subject: [PATCH 0083/1765] Config: add modes for listing config properties By passing either "defaults" or "types" to the "list" command the default values or their respective types are listed instead of the current configuration values. --- plugins/config/ConfigCommandLinePlugin.cpp | 56 ++++++++++++++-------- plugins/config/ConfigCommandLinePlugin.h | 10 +++- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/plugins/config/ConfigCommandLinePlugin.cpp b/plugins/config/ConfigCommandLinePlugin.cpp index 72dd20626..c659982d9 100644 --- a/plugins/config/ConfigCommandLinePlugin.cpp +++ b/plugins/config/ConfigCommandLinePlugin.cpp @@ -81,10 +81,18 @@ CommandLinePluginInterface::RunResult ConfigCommandLinePlugin::handle_clear( con CommandLinePluginInterface::RunResult ConfigCommandLinePlugin::handle_list( const QStringList& arguments ) { - Q_UNUSED(arguments); + auto listMode = ListMode::Values; + + if( arguments.value( 0 ) == QLatin1String("defaults") ) + { + listMode = ListMode::Defaults; + } + else if( arguments.value( 0 ) == QLatin1String("types") ) + { + listMode = ListMode::Types; + } - // clear global configuration - listConfiguration( VeyonCore::config().data(), {} ); + listConfiguration( listMode ); return NoResult; } @@ -266,29 +274,35 @@ CommandLinePluginInterface::RunResult ConfigCommandLinePlugin::handle_upgrade( c -void ConfigCommandLinePlugin::listConfiguration( const VeyonConfiguration::DataMap &map, - const QString &parentKey ) +void ConfigCommandLinePlugin::listConfiguration( ListMode listMode ) const { - for( auto it = map.begin(); it != map.end(); ++it ) - { - QString curParentKey = parentKey.isEmpty() ? it.key() : parentKey + QLatin1Char('/') + it.key(); + QTextStream stdoutStream( stdout ); + + const auto properties = VeyonCore::config().findChildren(); - if( it.value().type() == QVariant::Map ) + for( auto property : properties ) + { + if( property->flags().testFlag( Configuration::Property::Flag::Legacy ) ) { - listConfiguration( it.value().toMap(), curParentKey ); + continue; } - else + + stdoutStream << property->absoluteKey() << "="; + switch( listMode ) { - QString value = printableConfigurationValue( it.value() ); - if( value.isNull() ) - { - qWarning() << "Key" << it.key() << "has unknown value type:" << it.value(); - } - else - { - QTextStream( stdout ) << curParentKey << "=" << value << endl; - } + case ListMode::Values: + stdoutStream << printableConfigurationValue( property->variantValue() ); + break; + case ListMode::Defaults: + stdoutStream << printableConfigurationValue( property->defaultValue() ); + break; + case ListMode::Types: + stdoutStream << QStringLiteral("[%1]").arg( QString::fromLatin1( + property->defaultValue().typeName() ). + replace( QLatin1Char('Q'), QString() ).toLower() ); + break; } + stdoutStream << endl; } } @@ -299,7 +313,7 @@ CommandLinePluginInterface::RunResult ConfigCommandLinePlugin::applyConfiguratio ConfigurationManager configurationManager; if( configurationManager.saveConfiguration() == false || - configurationManager.applyConfiguration() == false ) + configurationManager.applyConfiguration() == false ) { return operationError( configurationManager.errorString() ); } diff --git a/plugins/config/ConfigCommandLinePlugin.h b/plugins/config/ConfigCommandLinePlugin.h index b3cec06b0..3abe4eecd 100644 --- a/plugins/config/ConfigCommandLinePlugin.h +++ b/plugins/config/ConfigCommandLinePlugin.h @@ -90,8 +90,14 @@ public slots: CommandLinePluginInterface::RunResult handle_upgrade( const QStringList& arguments ); private: - void listConfiguration( const VeyonConfiguration::DataMap &map, - const QString &parentKey ); + enum class ListMode { + Values, + Defaults, + Types + }; + + void listConfiguration( ListMode listMode ) const; + CommandLinePluginInterface::RunResult applyConfiguration(); static QString printableConfigurationValue( const QVariant& value ); From 27e953be599f165d4b48de39fdadbfb18065e003 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 14 Aug 2019 19:06:21 +0200 Subject: [PATCH 0084/1765] AndroidToolchain: update SDK build tools revision --- cmake/modules/AndroidToolchain.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/AndroidToolchain.cmake b/cmake/modules/AndroidToolchain.cmake index 3fe33afe6..4ca0a7cc6 100644 --- a/cmake/modules/AndroidToolchain.cmake +++ b/cmake/modules/AndroidToolchain.cmake @@ -1,7 +1,7 @@ SET(ANDROID_STL "c++_shared") SET(ANDROID_TOOLCHAIN "clang") SET(ANDROID_API "21") -SET(ANDROID_SDK_BUILD_TOOLS_REVISION "29.0.1") +SET(ANDROID_SDK_BUILD_TOOLS_REVISION "29.0.2") SET(ANDROID_COMPILER_VERSION "4.9") SET(ANDROID_SDK_ROOT "/opt/android/sdk") SET(ANDROID_PLATFORM "android-${ANDROID_API}") From 5af6ef41571383c4ef5632a5a8bfc7cee531883f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 14 Aug 2019 19:06:57 +0200 Subject: [PATCH 0085/1765] AndroidDeployQt: support APK builds for subdirs --- cmake/modules/AndroidDeployQt.cmake | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmake/modules/AndroidDeployQt.cmake b/cmake/modules/AndroidDeployQt.cmake index 1b0fbec61..5446caa27 100644 --- a/cmake/modules/AndroidDeployQt.cmake +++ b/cmake/modules/AndroidDeployQt.cmake @@ -1,7 +1,7 @@ find_package(Qt5Core REQUIRED) function(androiddeployqt QTANDROID_EXPORTED_TARGET ADDITIONAL_FIND_ROOT_PATH) - set(EXPORT_DIR "${CMAKE_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}_build_apk/") + set(EXPORT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}_build_apk/") set(EXECUTABLE_DESTINATION_PATH "${EXPORT_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}/lib${QTANDROID_EXPORTED_TARGET}.so") set(EXTRA_PREFIX_DIRS "") @@ -13,9 +13,9 @@ function(androiddeployqt QTANDROID_EXPORTED_TARGET ADDITIONAL_FIND_ROOT_PATH) endif() endforeach() string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" _LOWER_CMAKE_HOST_SYSTEM_NAME) - configure_file("${_CMAKE_ANDROID_DIR}/deployment-file.json.in" "${CMAKE_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}-deployment.json.in1") - file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}-deployment.json.in2" - INPUT "${CMAKE_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}-deployment.json.in1") + configure_file("${CMAKE_SOURCE_DIR}/android/deployment-file.json.in" "${CMAKE_CURRENT_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}-deployment.json.in1") + file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}-deployment.json.in2" + INPUT "${CMAKE_CURRENT_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}-deployment.json.in1") if (NOT TARGET create-apk) add_custom_target(create-apk) @@ -27,8 +27,8 @@ function(androiddeployqt QTANDROID_EXPORTED_TARGET ADDITIONAL_FIND_ROOT_PATH) COMMAND cmake -E remove_directory "${EXPORT_DIR}" COMMAND cmake -E copy_directory "$" "${EXPORT_DIR}" COMMAND cmake -E copy "$" "${EXECUTABLE_DESTINATION_PATH}" - COMMAND LANG=C cmake "-DTARGET=$" -P ${_CMAKE_ANDROID_DIR}/hasMainSymbol.cmake - COMMAND LANG=C cmake -DINPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json.in2" -DOUTPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json" "-DTARGET=$" "-DOUTPUT_DIR=$" "-DEXPORT_DIR=${CMAKE_INSTALL_PREFIX}" "-DANDROID_ADDITIONAL_FIND_ROOT_PATH=\"${ANDROID_ADDITIONAL_FIND_ROOT_PATH}\"" "-DANDROID_EXTRA_LIBS=\"${ANDROID_EXTRA_LIBS}\"" "-DANDROID_EXTRA_PLUGINS=\"${ANDROID_EXTRA_PLUGINS}\"" -P ${_CMAKE_ANDROID_DIR}/specifydependencies.cmake + COMMAND LANG=C cmake "-DTARGET=$" -P ${CMAKE_SOURCE_DIR}/android/hasMainSymbol.cmake + COMMAND LANG=C cmake -DINPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json.in2" -DOUTPUT_FILE="${QTANDROID_EXPORTED_TARGET}-deployment.json" "-DTARGET=$" "-DOUTPUT_DIR=$" "-DEXPORT_DIR=${CMAKE_INSTALL_PREFIX}" "-DANDROID_ADDITIONAL_FIND_ROOT_PATH=\"${ANDROID_ADDITIONAL_FIND_ROOT_PATH}\"" "-DANDROID_EXTRA_LIBS=\"${ANDROID_EXTRA_LIBS}\"" "-DANDROID_EXTRA_PLUGINS=\"${ANDROID_EXTRA_PLUGINS}\"" -P ${CMAKE_SOURCE_DIR}/android/specifydependencies.cmake COMMAND $/androiddeployqt --gradle --input "${QTANDROID_EXPORTED_TARGET}-deployment.json" --output "${EXPORT_DIR}" --deployment bundled "\\$(ARGS)" ) From c2afa42c3ff471f0c94b08fd54f3d641ccd75005 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 14 Aug 2019 19:08:36 +0200 Subject: [PATCH 0086/1765] android: build.gradle: add dependency --- android/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/android/build.gradle b/android/build.gradle index 989d0792c..f7405a73e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -18,6 +18,7 @@ apply plugin: 'com.android.application' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) + implementation 'com.android.support:appcompat-v7:28.0.0' } android { From 1d6c6964a56ed3058f08ec5224c5a3e9bd395584 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 14 Aug 2019 19:09:17 +0200 Subject: [PATCH 0087/1765] Server: add APK build target --- server/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index e3eafab09..32b1ea9a0 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -16,3 +16,11 @@ TARGET_LINK_LIBRARIES(veyon-server ) COTIRE_VEYON(veyon-server) + +IF(VEYON_BUILD_ANDROID) + SET(CMAKE_ANDROID_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") + androiddeployqt("veyon-server" "${ANDROID_ADDITIONAL_FIND_ROOT_PATH};${CMAKE_BINARY_DIR}/core") + SET_TARGET_PROPERTIES(create-apk-veyon-server PROPERTIES ANDROID_APK_DIR "${CMAKE_ANDROID_DIR}") + + add_dependencies(create-apk-veyon-server prepare-apk) +ENDIF() From 81eeabb35a1f8c9a92c636da2ca7f75531fe973e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Aug 2019 14:39:12 +0200 Subject: [PATCH 0088/1765] Server: only authenticate via configured plugin --- server/src/ServerAuthenticationManager.cpp | 13 +++---------- server/src/ServerAuthenticationManager.h | 2 -- server/src/VeyonServerProtocol.cpp | 3 ++- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/server/src/ServerAuthenticationManager.cpp b/server/src/ServerAuthenticationManager.cpp index 0a3b0baf9..afe5e410f 100644 --- a/server/src/ServerAuthenticationManager.cpp +++ b/server/src/ServerAuthenticationManager.cpp @@ -24,6 +24,7 @@ #include "AuthenticationManager.h" #include "ServerAuthenticationManager.h" +#include "VeyonConfiguration.h" ServerAuthenticationManager::ServerAuthenticationManager( QObject* parent ) : @@ -33,13 +34,6 @@ ServerAuthenticationManager::ServerAuthenticationManager( QObject* parent ) : -VncServerProtocol::AuthPluginUids ServerAuthenticationManager::supportedAuthPluginUids() const -{ - return VncServerProtocol::AuthPluginUids::fromList( VeyonCore::authenticationManager().plugins().keys() ); -} - - - void ServerAuthenticationManager::processAuthenticationMessage( VncServerClient* client, VariantArrayMessage& message ) { @@ -48,10 +42,9 @@ void ServerAuthenticationManager::processAuthenticationMessage( VncServerClient* << "host" << client->hostAddress() << "user" << client->username(); - const auto plugins = VeyonCore::authenticationManager().plugins(); - if( plugins.contains( client->authPluginUid() ) ) + if( client->authPluginUid() == VeyonCore::config().authenticationPlugin() ) { - client->setAuthState( plugins[client->authPluginUid()]->performAuthentication( client, message ) ); + client->setAuthState( VeyonCore::authenticationManager().configuredPlugin()->performAuthentication( client, message ) ); } else { diff --git a/server/src/ServerAuthenticationManager.h b/server/src/ServerAuthenticationManager.h index 54f658da8..3422c8e9e 100644 --- a/server/src/ServerAuthenticationManager.h +++ b/server/src/ServerAuthenticationManager.h @@ -43,8 +43,6 @@ class ServerAuthenticationManager : public QObject explicit ServerAuthenticationManager( QObject* parent ); - VncServerProtocol::AuthPluginUids supportedAuthPluginUids() const; - void processAuthenticationMessage( VncServerClient* client, VariantArrayMessage& message ); diff --git a/server/src/VeyonServerProtocol.cpp b/server/src/VeyonServerProtocol.cpp index f74d4e729..6a98f61c1 100644 --- a/server/src/VeyonServerProtocol.cpp +++ b/server/src/VeyonServerProtocol.cpp @@ -25,6 +25,7 @@ #include "ServerAuthenticationManager.h" #include "ServerAccessControlManager.h" #include "VeyonServerProtocol.h" +#include "VeyonConfiguration.h" VeyonServerProtocol::VeyonServerProtocol( QTcpSocket* socket, @@ -41,7 +42,7 @@ VeyonServerProtocol::VeyonServerProtocol( QTcpSocket* socket, VeyonServerProtocol::AuthPluginUids VeyonServerProtocol::supportedAuthPluginUids() const { - return m_serverAuthenticationManager.supportedAuthPluginUids(); + return { VeyonCore::config().authenticationPlugin() }; } From fb760bb0e4719de56b1a215ae5e40f80280743d9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Aug 2019 14:39:37 +0200 Subject: [PATCH 0089/1765] DocumentationFigureCreator: uncomment function calls --- master/src/DocumentationFigureCreator.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index d1d5832bd..5ddb4d5bd 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -75,10 +75,10 @@ void DocumentationFigureCreator::run() hideComputers(); -/* createFeatureFigures(); - createContextMenuFigure();*/ + createFeatureFigures(); + createContextMenuFigure(); createLogonDialogFigure(); -/* createLocationDialogFigure(); + createLocationDialogFigure(); createScreenshotManagementPanelFigure(); createTextMessageDialogFigure(); createOpenWebsiteDialogFigure(); @@ -89,7 +89,7 @@ void DocumentationFigureCreator::run() createRemoteAccessWindowFigure(); createPowerDownOptionsFigure(); createPowerDownTimeInputDialogFigure(); - createFileTransferDialogFigure();*/ + createFileTransferDialogFigure(); } From 49d4b1613f19f24f04414b450175fd12fdf4a0a3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 26 Aug 2019 09:21:02 +0200 Subject: [PATCH 0090/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 4c3b844ff..895cfbd68 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 4c3b844ffb100d4c543b5a00d36aad57826f1aff +Subproject commit 895cfbd6869e6ef0b3d427e4ab28782ab0a8742d From 7eda5ca24ff1dcbd841bd0490fc2c6814ce39db7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Aug 2019 15:17:51 +0200 Subject: [PATCH 0091/1765] 3rdparty: kldap: update submodule --- 3rdparty/kldap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/kldap b/3rdparty/kldap index 87c2b3cfe..6a888e572 160000 --- a/3rdparty/kldap +++ b/3rdparty/kldap @@ -1 +1 @@ -Subproject commit 87c2b3cfe108d42a7630e4822e29789e852600c1 +Subproject commit 6a888e5720411ff19ebdb2b21798c6821500729f From 63745d28d97297beefb8fb01090a87b9fb91db92 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Aug 2019 15:24:15 +0200 Subject: [PATCH 0092/1765] android: build.gradle: compile asset JAR files --- android/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/android/build.gradle b/android/build.gradle index f7405a73e..980b1d093 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -18,6 +18,7 @@ apply plugin: 'com.android.application' dependencies { implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) + implementation fileTree(dir: 'assets/jar', include: ['*.jar', '*.aar']) implementation 'com.android.support:appcompat-v7:28.0.0' } From 91c9428f8682a49777d5e38caf98d062054d496d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Aug 2019 15:24:55 +0200 Subject: [PATCH 0093/1765] android: set extraPrefixDirs for androiddeployqt --- android/deployment-file.json.in | 1 + android/specifydependencies.cmake | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/android/deployment-file.json.in b/android/deployment-file.json.in index ddccc6f45..67b92ead3 100644 --- a/android/deployment-file.json.in +++ b/android/deployment-file.json.in @@ -10,6 +10,7 @@ "application-binary": "@EXECUTABLE_DESTINATION_PATH@", "stdcpp-path": "@ANDROID_STDCPP@", "sdkBuildToolsRevision": "@ANDROID_SDK_BUILD_TOOLS_REVISION@", + ##EXTRAPREFIXDIRS## ##EXTRALIBS## ##EXTRAPLUGINS## "android-package-source-directory": "@CMAKE_ANDROID_DIR@" diff --git a/android/specifydependencies.cmake b/android/specifydependencies.cmake index b59f6bc51..2bfde779f 100644 --- a/android/specifydependencies.cmake +++ b/android/specifydependencies.cmake @@ -66,6 +66,17 @@ if(extraplugins) set(extraplugins "\"android-extra-plugins\": \"${plugins}\",") endif() +set(extraPrefixDirs "") +foreach(prefix ${ANDROID_ADDITIONAL_FIND_ROOT_PATH}) + if (extraPrefixDirs) + set(extraPrefixDirs "${extraPrefixDirs}, \"${prefix}\"") + else() + set(extraPrefixDirs "\"${prefix}\"") + endif() +endforeach() + +set(extraprefixdirs "\"extraPrefixDirs\": [${extraPrefixDirs}],") + file(READ "${INPUT_FILE}" CONTENTS) #file(READ "stl" stl_contents) @@ -75,6 +86,7 @@ file(READ "${INPUT_FILE}" CONTENTS) string(REPLACE "##ANDROID_TOOL_PREFIX##" "${CMAKE_MATCH_1}" NEWCONTENTS "${CONTENTS}") string(REPLACE "##ANDROID_TOOLCHAIN_VERSION##" "${CMAKE_MATCH_2}" NEWCONTENTS "${NEWCONTENTS}") string(REPLACE "##ANDROID_COMPILER_PREFIX##" "${CMAKE_MATCH_3}" NEWCONTENTS "${NEWCONTENTS}") +string(REPLACE "##EXTRAPREFIXDIRS##" "${extraprefixdirs}" NEWCONTENTS "${NEWCONTENTS}") string(REPLACE "##EXTRALIBS##" "${extralibs}" NEWCONTENTS "${NEWCONTENTS}") string(REPLACE "##EXTRAPLUGINS##" "${extraplugins}" NEWCONTENTS "${NEWCONTENTS}") string(REPLACE "##CMAKE_CXX_STANDARD_LIBRARIES##" "${stl_contents}" NEWCONTENTS "${NEWCONTENTS}") From 0817a7f025b779864f9d4c3b2c52dfb106f42d8e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Aug 2019 15:25:24 +0200 Subject: [PATCH 0094/1765] android: drop global AndroidManifest.xml --- android/AndroidManifest.xml | 93 ------------------------------------- 1 file changed, 93 deletions(-) delete mode 100644 android/AndroidManifest.xml diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml deleted file mode 100644 index 1548cb13d..000000000 --- a/android/AndroidManifest.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 4c58f4e3882eeb417c1f3d4b26b3ad2ddc6d9235 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Aug 2019 15:26:05 +0200 Subject: [PATCH 0095/1765] server: add Android build files --- server/android/AndroidManifest.xml | 88 ++++++++++++++++++++++++++++++ server/android/build.gradle | 1 + 2 files changed, 89 insertions(+) create mode 100644 server/android/AndroidManifest.xml create mode 120000 server/android/build.gradle diff --git a/server/android/AndroidManifest.xml b/server/android/AndroidManifest.xml new file mode 100644 index 000000000..ad3e5424d --- /dev/null +++ b/server/android/AndroidManifest.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/android/build.gradle b/server/android/build.gradle new file mode 120000 index 000000000..b8869a3b7 --- /dev/null +++ b/server/android/build.gradle @@ -0,0 +1 @@ +../../android/build.gradle \ No newline at end of file From 21a13e80b7930179bbf5a426057a53eecd715a30 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Aug 2019 15:26:33 +0200 Subject: [PATCH 0096/1765] server: pass Android install path to androiddeployqt --- server/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 32b1ea9a0..e05e913b3 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -19,7 +19,7 @@ COTIRE_VEYON(veyon-server) IF(VEYON_BUILD_ANDROID) SET(CMAKE_ANDROID_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") - androiddeployqt("veyon-server" "${ANDROID_ADDITIONAL_FIND_ROOT_PATH};${CMAKE_BINARY_DIR}/core") + androiddeployqt("veyon-server" "${ANDROID_ADDITIONAL_FIND_ROOT_PATH};${CMAKE_BINARY_DIR}/core;${ANDROID_INSTALL_DIR}") SET_TARGET_PROPERTIES(create-apk-veyon-server PROPERTIES ANDROID_APK_DIR "${CMAKE_ANDROID_DIR}") add_dependencies(create-apk-veyon-server prepare-apk) From e22011258200286f20e3b7753aa155d20b6ed83b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Aug 2019 15:27:46 +0200 Subject: [PATCH 0097/1765] cmake: fix path and extra prefix dirs handling --- cmake/modules/AndroidDeployQt.cmake | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/cmake/modules/AndroidDeployQt.cmake b/cmake/modules/AndroidDeployQt.cmake index 5446caa27..66c4ba857 100644 --- a/cmake/modules/AndroidDeployQt.cmake +++ b/cmake/modules/AndroidDeployQt.cmake @@ -1,17 +1,9 @@ find_package(Qt5Core REQUIRED) -function(androiddeployqt QTANDROID_EXPORTED_TARGET ADDITIONAL_FIND_ROOT_PATH) +function(androiddeployqt QTANDROID_EXPORTED_TARGET ANDROID_ADDITIONAL_FIND_ROOT_PATH) set(EXPORT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}_build_apk/") set(EXECUTABLE_DESTINATION_PATH "${EXPORT_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}/lib${QTANDROID_EXPORTED_TARGET}.so") - set(EXTRA_PREFIX_DIRS "") - foreach(prefix ${ADDITIONAL_FIND_ROOT_PATH}) - if (EXTRA_PREFIX_DIRS) - set(EXTRA_PREFIX_DIRS "${EXTRA_PREFIX_DIRS}, \"${prefix}\"") - else() - set(EXTRA_PREFIX_DIRS "\"${prefix}\"") - endif() - endforeach() string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" _LOWER_CMAKE_HOST_SYSTEM_NAME) configure_file("${CMAKE_SOURCE_DIR}/android/deployment-file.json.in" "${CMAKE_CURRENT_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}-deployment.json.in1") file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${QTANDROID_EXPORTED_TARGET}-deployment.json.in2" From 6127ce5350d8f1ab288e85ff87b4ea91c5f3aef8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Aug 2019 15:30:54 +0200 Subject: [PATCH 0098/1765] cmake: improve generic Android build support --- CMakeLists.txt | 45 ++++++++++++++++++++++----------------------- core/CMakeLists.txt | 4 ++++ 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 69b25e6fd..12bfe7335 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,7 +108,7 @@ ENDIF(WIN64) # set up library and plugin path variables IF(VEYON_BUILD_ANDROID) SET(CMAKE_INSTALL_PREFIX "/") - SET(VEYON_LIB_DIR "libs/${ANDROID_ABI}") + SET(VEYON_LIB_DIR "lib") SET(VEYON_INSTALL_PLUGIN_DIR "${VEYON_LIB_DIR}/veyon") SET(VEYON_INSTALL_DATA_DIR "${CMAKE_INSTALL_DATA_DIR}/veyon") SET(VEYON_PLUGIN_DIR "") @@ -142,6 +142,9 @@ FIND_PACKAGE(Qt5Gui REQUIRED) FIND_PACKAGE(Qt5Widgets REQUIRED) FIND_PACKAGE(Qt5Network REQUIRED) FIND_PACKAGE(Qt5LinguistTools REQUIRED) +IF(VEYON_BUILD_ANDROID) +FIND_PACKAGE(Qt5AndroidExtras REQUIRED) +ENDIF() IF(VEYON_DEBUG) FIND_PACKAGE(Qt5Test REQUIRED) SET(VEYON_DEBUG_LIBRARIES Qt5::Test) @@ -221,6 +224,24 @@ SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${VEYON_LIB_DIR}") SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +IF(VEYON_BUILD_ANDROID) + INCLUDE(AndroidDeployQt) + SET(_CMAKE_ANDROID_DIR "${CMAKE_SOURCE_DIR}/android") + SET(ANDROID_INSTALL_DIR "${CMAKE_BINARY_DIR}/install") + SET(ANDROID_EXTRA_PLUGINS ${ANDROID_INSTALL_DIR}/${VEYON_LIB_DIR}/veyon/ ${QT_DIR}/lib/qca-qt5/crypto ${ANDROID_INSTALL_DIR}/jar) + SET(ANDROID_EXTRA_LIBS) + LIST(APPEND ANDROID_EXTRA_LIBS "${ANDROID_SYSROOT_GENERIC}/libc++_shared.so") + LIST(APPEND ANDROID_EXTRA_LIBS "${QT_DIR}/lib/libldap.so" + "${QT_DIR}/lib/liblber.so" + "${QT_DIR}/lib/libsasl2.so") + + add_custom_target(prepare-apk + COMMAND rm -rf ${ANDROID_INSTALL_DIR} + COMMAND cd ${CMAKE_BINARY_DIR}/core && make DESTDIR=${ANDROID_INSTALL_DIR} install + COMMAND cd ${CMAKE_BINARY_DIR}/plugins && make DESTDIR=${ANDROID_INSTALL_DIR} install + ) +ENDIF() + # make sub-directories ADD_SUBDIRECTORY(core) ADD_SUBDIRECTORY(server) @@ -322,25 +343,3 @@ MESSAGE("\n" "* Compile flags : ${CMAKE_C_FLAGS} (CXX: ${CMAKE_CXX_FLAGS})\n" ) -IF(VEYON_BUILD_ANDROID) - INCLUDE(AndroidDeployQt) - SET(CMAKE_ANDROID_DIR "${CMAKE_SOURCE_DIR}/android") - SET(_CMAKE_ANDROID_DIR "${CMAKE_ANDROID_DIR}") - SET(ANDROID_INSTALL_DIR "${CMAKE_BINARY_DIR}/install") - SET(ANDROID_EXTRA_PLUGINS ${ANDROID_INSTALL_DIR}/${VEYON_LIB_DIR}/veyon/ ${QT_DIR}/lib/qca-qt5/crypto) - FILE(GLOB ANDROID_EXTRA_LIBS ${ANDROID_INSTALL_DIR}/${VEYON_LIB_DIR}/*.so) - LIST(APPEND ANDROID_EXTRA_LIBS "${ANDROID_SYSROOT_GENERIC}/libc++_shared.so") - LIST(APPEND ANDROID_EXTRA_LIBS "${QT_DIR}/lib/libldap.so" - "${QT_DIR}/lib/liblber.so" - "${QT_DIR}/lib/libsasl2.so") - androiddeployqt("veyon-master" "${ANDROID_ADDITIONAL_FIND_ROOT_PATH};${CMAKE_BINARY_DIR}/core") - SET_TARGET_PROPERTIES(create-apk-veyon-master PROPERTIES ANDROID_APK_DIR "${CMAKE_ANDROID_DIR}") - - add_custom_target(prepare-apk - COMMAND rm -rf ${ANDROID_INSTALL_DIR} - COMMAND cd ${CMAKE_BINARY_DIR}/core && make DESTDIR=${ANDROID_INSTALL_DIR} install - COMMAND cd ${CMAKE_BINARY_DIR}/plugins && make DESTDIR=${ANDROID_INSTALL_DIR} install - ) - - add_dependencies(create-apk-veyon-master prepare-apk) -ENDIF() diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index d53ba8406..80003b59b 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -74,4 +74,8 @@ ELSE() INSTALL(TARGETS veyon-core LIBRARY DESTINATION ${VEYON_LIB_DIR}) ENDIF(VEYON_BUILD_WIN32) +IF(VEYON_BUILD_ANDROID) + TARGET_LINK_LIBRARIES(veyon-core Qt5::AndroidExtras) +ENDIF() + COTIRE_VEYON(veyon-core) From 1d6e1dbe1d7c68fc1e7a7ddd507e26a5e3fee435 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Aug 2019 16:17:57 +0200 Subject: [PATCH 0099/1765] Server: add VeyonAccessibilityService This service is used by the VNC server to inject input events. --- server/android/AndroidManifest.xml | 15 +++++ .../veyon_accessibility_service_config.xml | 8 +++ .../io/veyon/VeyonAccessibilityService.java | 66 +++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 server/android/res/xml/veyon_accessibility_service_config.xml create mode 100644 server/android/src/io/veyon/VeyonAccessibilityService.java diff --git a/server/android/AndroidManifest.xml b/server/android/AndroidManifest.xml index ad3e5424d..6ca49efb8 100644 --- a/server/android/AndroidManifest.xml +++ b/server/android/AndroidManifest.xml @@ -74,6 +74,21 @@ + + + + + + + + R6K)1fHsWBru!QCpiaDuml_+4?$I)p-KUu zq>H1;7aAsnP^y}i?w=%~RJa_#75s(UI)17PTY}h&G!%dqZT){qT|29H^DL$Kfs=dj zR0}}7C4P=(Vc|pC&VB+e*}6l~%^jN|2zStSv{hm7qO>iDK0_M;XsWnf`#3t4FY)01 z9;%A*1T@Td)9LicVjECS1c1IJ+REniu$3A_{?_<@V%VVo6gy+M$Ht}1GHhpiV-5u4 zW?Fjiywb|W(s)j!1Qrq~x_5`&S7DN6qB$|d=R=`AaYt!3IXE=CX-wRLW!mu^cI}Q#|XYR_irvPdUkvr z8}Mw4;o@__v?mos4Cxy!6-^aq$D#r-tj<)hl$=DxEa|djzWiaI2TZ4LE~RKBU6g@8 z546)qEDOUaKJT!I#4h@+)&U+3?TgdFtT>qUb37l$-!s5xf$MnHC^HFo zCtbgezbB|-x~hXMv_nVRw6s@G2^&<@frX--aX0_lf}`)?UF~-D3>YwAz<>b*1`HT5 gV8DO@1EGZf0hB@B{O}7Q%m4rY07*qoM6N<$g3NuXTL1t6 literal 0 HcmV?d00001 diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 61427c13c..19ae590ca 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -95,7 +95,7 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : m_screenshotManagementPanel = new ScreenshotManagementPanel( splitter ); auto slideshowPanel = new SlideshowPanel( m_master.userConfig(), ui->computerMonitoringWidget, specialMonitoringSplitter ); - auto spotlightPanel = new SpotlightPanel( ui->computerMonitoringWidget, specialMonitoringSplitter ); + auto spotlightPanel = new SpotlightPanel( m_master.userConfig(), ui->computerMonitoringWidget, specialMonitoringSplitter ); specialMonitoringSplitter->addWidget( slideshowPanel ); specialMonitoringSplitter->addWidget( spotlightPanel ); diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index ce231acd7..8dbb8be0b 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -29,13 +29,15 @@ #include "ComputerMonitoringWidget.h" #include "SpotlightModel.h" #include "SpotlightPanel.h" +#include "UserConfig.h" #include "ui_SpotlightPanel.h" -SpotlightPanel::SpotlightPanel( ComputerMonitoringWidget* computerMonitoringWidget, QWidget* parent ) : +SpotlightPanel::SpotlightPanel( UserConfig& config, ComputerMonitoringWidget* computerMonitoringWidget, QWidget* parent ) : QWidget( parent ), ui( new Ui::SpotlightPanel ), + m_config( config ), m_computerMonitoringWidget( computerMonitoringWidget ), m_model( new SpotlightModel( m_computerMonitoringWidget->dataModel(), this ) ) { @@ -49,9 +51,12 @@ SpotlightPanel::SpotlightPanel( ComputerMonitoringWidget* computerMonitoringWidg connect( ui->addButton, &QAbstractButton::clicked, this, &SpotlightPanel::add ); connect( ui->removeButton, &QAbstractButton::clicked, this, &SpotlightPanel::remove ); + connect( ui->realtimeViewButton, &QAbstractButton::toggled, this, &SpotlightPanel::setRealtimeView ); connect( m_computerMonitoringWidget, &QAbstractItemView::pressed, this, &SpotlightPanel::addPressedItem ); connect( ui->list, &QAbstractItemView::pressed, this, &SpotlightPanel::removePressedItem ); + + setRealtimeView( m_config.spotlightRealtime() ); } @@ -115,6 +120,17 @@ void SpotlightPanel::remove() +void SpotlightPanel::setRealtimeView( bool enabled ) +{ + m_model->setUpdateInRealtime( enabled ); + + m_config.setSpotlightRealtime( enabled ); + + ui->realtimeViewButton->setChecked( enabled ); +} + + + void SpotlightPanel::addPressedItem( const QModelIndex& index ) { if( QGuiApplication::mouseButtons().testFlag( Qt::MidButton ) ) diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index 4db3db366..4b5bc2579 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -28,6 +28,7 @@ class ComputerMonitoringWidget; class SpotlightModel; +class UserConfig; namespace Ui { class SpotlightPanel; @@ -37,7 +38,7 @@ class SpotlightPanel : public QWidget { Q_OBJECT public: - explicit SpotlightPanel( ComputerMonitoringWidget* computerMonitoringWidget, QWidget* parent ); + explicit SpotlightPanel( UserConfig& config, ComputerMonitoringWidget* computerMonitoringWidget, QWidget* parent ); ~SpotlightPanel() override; protected: @@ -46,12 +47,15 @@ class SpotlightPanel : public QWidget private: void add(); void remove(); + void setRealtimeView( bool enabled ); void addPressedItem( const QModelIndex& index ); void removePressedItem( const QModelIndex& index ); Ui::SpotlightPanel* ui; + UserConfig& m_config; + ComputerMonitoringWidget* m_computerMonitoringWidget; SpotlightModel* m_model; diff --git a/master/src/SpotlightPanel.ui b/master/src/SpotlightPanel.ui index bd0d3cfee..0c69ecc0d 100644 --- a/master/src/SpotlightPanel.ui +++ b/master/src/SpotlightPanel.ui @@ -40,10 +40,7 @@ - Previous - - - Add selected computer + Add selected computers @@ -55,18 +52,12 @@ 32 - - Qt::ToolButtonTextBesideIcon - - Next - - - Remove selected computer + Remove selected computers @@ -78,9 +69,6 @@ 32 - - Qt::ToolButtonTextBesideIcon - @@ -96,6 +84,30 @@ + + + + Update computers in realtime + + + + :/master/update-realtime-disabled.png + :/master/update-realtime-enabled.png:/master/update-realtime-disabled.png + + + + 32 + 32 + + + + true + + + true + + + @@ -118,6 +130,7 @@ + diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index dc76063ef..f48df8d74 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -47,6 +47,7 @@ class UserConfig : public Configuration::Object OP( UserConfig, VeyonMaster::userConfig(), bool, filterPoweredOnComputers, setFilterPoweredOnComputers, "FilterPoweredOnComputers", "UI", false, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), int, monitoringScreenSize, setMonitoringScreenSize, "MonitoringScreenSize", "UI", ComputerMonitoringView::DefaultComputerScreenSize, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), int, slideshowDuration, setSlideshowDuration, "SlideshowDuration", "UI", SlideshowPanel::DefaultDuration, Configuration::Property::Flag::Standard ) \ + OP( UserConfig, VeyonMaster::userConfig(), bool, spotlightRealtime, setSpotlightRealtime, "SpotlightRealtime", "UI", true, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), int, defaultRole, setDefaultRole, "DefaultRole", "Authentication", 0, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), bool, toolButtonIconOnlyMode, setToolButtonIconOnlyMode, "ToolButtonIconOnlyMode", "UI", false, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), bool, noToolTips, setNoToolTips, "NoToolTips", "UI", false, Configuration::Property::Flag::Standard ) \ From 3374c1f7ebcbeff8e8366396c2fafea9d61a5fea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Nov 2020 11:02:10 +0100 Subject: [PATCH 0675/1765] ComputerSelectPanel: clean up unused properties --- master/src/ComputerSelectPanel.ui | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/master/src/ComputerSelectPanel.ui b/master/src/ComputerSelectPanel.ui index 9e779ece9..ad2cf0abd 100644 --- a/master/src/ComputerSelectPanel.ui +++ b/master/src/ComputerSelectPanel.ui @@ -2,18 +2,9 @@ ComputerSelectPanel - - Computer management - - + - - - 0 - 0 - - QAbstractScrollArea::AdjustToContents From 80c0f70d8632f47381f75a4b0c6c39cb4ea9ebe4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Nov 2020 11:02:47 +0100 Subject: [PATCH 0676/1765] Master: reorder panel buttons --- master/src/MainWindow.ui | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/master/src/MainWindow.ui b/master/src/MainWindow.ui index c136035a6..2cb985348 100644 --- a/master/src/MainWindow.ui +++ b/master/src/MainWindow.ui @@ -35,7 +35,7 @@ 0 - + @@ -308,13 +308,13 @@ - + - Slideshow + Screenshots - :/master/computer-slideshow.png:/master/computer-slideshow.png + :/master/camera-photo.png:/master/camera-photo.png @@ -328,16 +328,19 @@ Qt::ToolButtonTextBesideIcon + + buttonGroup + - + - Spotlight + Slideshow - :/master/spotlight.png:/master/spotlight.png + :/master/computer-slideshow.png:/master/computer-slideshow.png @@ -354,13 +357,13 @@ - + - Screenshots + Spotlight - :/master/camera-photo.png:/master/camera-photo.png + :/master/spotlight.png:/master/spotlight.png @@ -374,9 +377,6 @@ Qt::ToolButtonTextBesideIcon - - buttonGroup - @@ -399,17 +399,17 @@ - - MainToolBar - QToolBar -
MainToolBar.h
-
ComputerMonitoringWidget QListView
ComputerMonitoringWidget.h
1
+ + MainToolBar + QToolBar +
MainToolBar.h
+
From 9b17ed1fb6f04d1c7ae9b8319d29f4fea7de20c3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Nov 2020 11:03:08 +0100 Subject: [PATCH 0677/1765] Master: save and restore splitter and panel states In order to restore the size of hidden splitter content widgets, we need to track their original sizes and restore them accordingly. --- master/src/MainWindow.cpp | 161 ++++++++++++++++++++----- master/src/MainWindow.h | 11 +- master/src/ScreenshotManagementPanel.h | 2 +- master/src/SlideshowPanel.h | 3 +- master/src/SpotlightPanel.h | 3 +- master/src/UserConfig.h | 2 + 6 files changed, 146 insertions(+), 36 deletions(-) diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 19ae590ca..61f530642 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -80,45 +80,104 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : ui->statusBar->addWidget( ui->aboutButton ); // create all views - auto splitter = new QSplitter( Qt::Horizontal, ui->centralWidget ); - splitter->setChildrenCollapsible( false ); + auto mainSplitter = new QSplitter( Qt::Horizontal, ui->centralWidget ); + mainSplitter->setChildrenCollapsible( false ); + mainSplitter->setObjectName( QStringLiteral("MainSplitter") ); - auto monitoringSplitter = new QSplitter( Qt::Vertical, splitter ); + auto monitoringSplitter = new QSplitter( Qt::Vertical, mainSplitter ); monitoringSplitter->setChildrenCollapsible( false ); + monitoringSplitter->setObjectName( QStringLiteral("MonitoringSplitter") ); - auto specialMonitoringSplitter = new QSplitter( Qt::Horizontal, monitoringSplitter ); - specialMonitoringSplitter->setChildrenCollapsible( false ); + auto slideshowSpotlightSplitter = new QSplitter( Qt::Horizontal, monitoringSplitter ); + slideshowSpotlightSplitter->setChildrenCollapsible( false ); + slideshowSpotlightSplitter->setObjectName( QStringLiteral("SlideshowSpotlightSplitter") ); - ui->centralLayout->addWidget( splitter ); + auto computerSelectPanel = new ComputerSelectPanel( m_master.computerManager(), m_master.computerSelectModel() ); + auto screenshotManagementPanel = new ScreenshotManagementPanel(); + auto slideshowPanel = new SlideshowPanel( m_master.userConfig(), ui->computerMonitoringWidget ); + auto spotlightPanel = new SpotlightPanel( m_master.userConfig(), ui->computerMonitoringWidget ); - m_computerSelectPanel = new ComputerSelectPanel( m_master.computerManager(), m_master.computerSelectModel(), splitter ); - m_screenshotManagementPanel = new ScreenshotManagementPanel( splitter ); + slideshowSpotlightSplitter->addWidget( slideshowPanel ); + slideshowSpotlightSplitter->addWidget( spotlightPanel ); + slideshowSpotlightSplitter->setStretchFactor( slideshowSpotlightSplitter->indexOf(slideshowPanel), 1 ); + slideshowSpotlightSplitter->setStretchFactor( slideshowSpotlightSplitter->indexOf(spotlightPanel), 1 ); - auto slideshowPanel = new SlideshowPanel( m_master.userConfig(), ui->computerMonitoringWidget, specialMonitoringSplitter ); - auto spotlightPanel = new SpotlightPanel( m_master.userConfig(), ui->computerMonitoringWidget, specialMonitoringSplitter ); + monitoringSplitter->addWidget( slideshowSpotlightSplitter ); + monitoringSplitter->addWidget( ui->computerMonitoringWidget ); + monitoringSplitter->setStretchFactor( monitoringSplitter->indexOf(slideshowSpotlightSplitter), 1 ); + monitoringSplitter->setStretchFactor( monitoringSplitter->indexOf(ui->computerMonitoringWidget), 1 ); - specialMonitoringSplitter->addWidget( slideshowPanel ); - specialMonitoringSplitter->addWidget( spotlightPanel ); + mainSplitter->addWidget( computerSelectPanel ); + mainSplitter->addWidget( screenshotManagementPanel ); + mainSplitter->addWidget( monitoringSplitter ); - monitoringSplitter->addWidget( specialMonitoringSplitter ); - monitoringSplitter->addWidget( ui->computerMonitoringWidget ); + mainSplitter->setStretchFactor( mainSplitter->indexOf(monitoringSplitter), 1 ); - splitter->addWidget( m_computerSelectPanel ); - splitter->addWidget( m_screenshotManagementPanel ); - splitter->addWidget( monitoringSplitter ); - // hide views per default and connect related button - m_computerSelectPanel->hide(); - slideshowPanel->hide(); - spotlightPanel->hide(); - m_screenshotManagementPanel->hide(); + static const QMap panelButtons{ + { computerSelectPanel, ui->computerSelectPanelButton }, + { screenshotManagementPanel, ui->screenshotManagementPanelButton }, + { slideshowPanel, ui->slideshowPanelButton }, + { spotlightPanel, ui->spotlightPanelButton } + }; + + for( auto it = panelButtons.constBegin(), end = panelButtons.constEnd(); it != end; ++it ) + { + it.key()->hide(); + it.key()->installEventFilter( this ); + connect( *it, &QAbstractButton::toggled, it.key(), &QWidget::setVisible ); + } + + for( auto* splitter : { slideshowSpotlightSplitter, monitoringSplitter, mainSplitter } ) + { + splitter->installEventFilter( this ); - connect( ui->computerSelectPanelButton, &QAbstractButton::toggled, - m_computerSelectPanel, &QWidget::setVisible ); - connect( ui->slideshowPanelButton, &QAbstractButton::toggled, slideshowPanel, &QWidget::setVisible ); - connect( ui->spotlightPanelButton, &QAbstractButton::toggled, spotlightPanel, &QWidget::setVisible ); - connect( ui->screenshotManagementPanelButton, &QAbstractButton::toggled, - m_screenshotManagementPanel, &QWidget::setVisible ); + QList splitterSizes; + int index = 0; + + for( const auto& sizeObject : m_master.userConfig().splitterStates()[splitter->objectName()].toArray() ) + { + auto size = sizeObject.toInt(); + const auto widget = splitter->widget( index ); + const auto button = panelButtons.value( widget ); + if( widget && button ) + { + widget->setVisible( size > 0 ); + button->setChecked( size > 0 ); + } + + size = qAbs( size ); + if( splitter->orientation() == Qt::Horizontal ) + { + widget->resize( size, widget->height() ); + } + else + { + widget->resize( widget->width(), size ); + } + + widget->setProperty( originalSizePropertyName(), widget->size() ); + splitterSizes.append( size ); + ++index; + } + splitter->setSizes( splitterSizes ); + } + + const auto SplitterContentBaseSize = 500; + + if( spotlightPanel->property( originalSizePropertyName() ).isNull() || + slideshowPanel->property( originalSizePropertyName() ).isNull() ) + { + slideshowSpotlightSplitter->setSizes( { SplitterContentBaseSize, SplitterContentBaseSize } ); + } + + if( slideshowSpotlightSplitter->property( originalSizePropertyName() ).isNull() || + ui->computerMonitoringWidget->property( originalSizePropertyName() ).isNull() ) + { + monitoringSplitter->setSizes( { SplitterContentBaseSize, SplitterContentBaseSize } ); + } + + ui->centralLayout->addWidget( mainSplitter ); if( VeyonCore::config().autoOpenComputerSelectPanel() ) { @@ -258,6 +317,34 @@ void MainWindow::closeEvent( QCloseEvent* event ) return; } + QJsonObject splitterStates; + for( const auto* splitter : findChildren() ) + { + QJsonArray splitterSizes; + int i = 0; + int hiddenSize = 0; + for( auto size : splitter->sizes() ) + { + auto widget = splitter->widget(i); + const auto originalSize = widget->property( originalSizePropertyName() ).toSize(); + if( widget->size().isEmpty() && originalSize.isEmpty() == false ) + { + size = splitter->orientation() == Qt::Horizontal ? -originalSize.width() : -originalSize.height(); + hiddenSize += qAbs(size); + } + else + { + size -= hiddenSize; + } + + splitterSizes.append( size ); + ++i; + } + splitterStates[splitter->objectName()] = splitterSizes; + } + + m_master.userConfig().setSplitterStates( splitterStates ); + m_master.userConfig().setWindowState( QString::fromLatin1( saveState().toBase64() ) ); m_master.userConfig().setWindowGeometry( QString::fromLatin1( saveGeometry().toBase64() ) ); @@ -266,6 +353,24 @@ void MainWindow::closeEvent( QCloseEvent* event ) +bool MainWindow::eventFilter( QObject* object, QEvent* event ) +{ + if( event->type() == QEvent::Resize ) + { + const auto widget = qobject_cast( object ); + const auto resizeEvent = static_cast( event ); + + if( resizeEvent->oldSize().isEmpty() == false ) + { + widget->setProperty( originalSizePropertyName(), resizeEvent->oldSize() ); + } + } + + return QMainWindow::eventFilter( object, event ); +} + + + void MainWindow::keyPressEvent( QKeyEvent* event ) { switch( event->key() ) diff --git a/master/src/MainWindow.h b/master/src/MainWindow.h index 62d864b35..ba51cf2cc 100644 --- a/master/src/MainWindow.h +++ b/master/src/MainWindow.h @@ -31,8 +31,6 @@ class QButtonGroup; class QToolButton; -class ComputerSelectPanel; -class ScreenshotManagementPanel; class VeyonMaster; namespace Ui { @@ -61,6 +59,7 @@ class MainWindow : public QMainWindow protected: void closeEvent( QCloseEvent* event ) override; + bool eventFilter( QObject* object, QEvent* event ) override; void keyPressEvent( QKeyEvent *e ) override; @@ -73,6 +72,11 @@ private Q_SLOTS: return static_cast( qHash( feature.uid() ) ); } + static constexpr const char* originalSizePropertyName() + { + return "originalSize"; + } + void addFeaturesToToolBar(); void addSubFeaturesToToolButton( QToolButton* button, const Feature& parentFeature ); @@ -84,7 +88,4 @@ private Q_SLOTS: QButtonGroup* m_modeGroup; - ComputerSelectPanel* m_computerSelectPanel; - ScreenshotManagementPanel* m_screenshotManagementPanel; - } ; diff --git a/master/src/ScreenshotManagementPanel.h b/master/src/ScreenshotManagementPanel.h index 19865a3da..ad47bd5cb 100644 --- a/master/src/ScreenshotManagementPanel.h +++ b/master/src/ScreenshotManagementPanel.h @@ -38,7 +38,7 @@ class ScreenshotManagementPanel : public QWidget { Q_OBJECT public: - explicit ScreenshotManagementPanel( QWidget *parent ); + explicit ScreenshotManagementPanel( QWidget *parent = nullptr ); ~ScreenshotManagementPanel() override; void setPreview( const Screenshot& screenshot ); diff --git a/master/src/SlideshowPanel.h b/master/src/SlideshowPanel.h index 242727ca5..a3cd45ae6 100644 --- a/master/src/SlideshowPanel.h +++ b/master/src/SlideshowPanel.h @@ -38,7 +38,8 @@ class SlideshowPanel : public QWidget { Q_OBJECT public: - explicit SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* computerMonitoringWidget, QWidget *parent ); + explicit SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* computerMonitoringWidget, + QWidget* parent = nullptr ); ~SlideshowPanel() override; static constexpr auto DefaultDuration = 3000; diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index 4b5bc2579..a2e902c28 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -38,7 +38,8 @@ class SpotlightPanel : public QWidget { Q_OBJECT public: - explicit SpotlightPanel( UserConfig& config, ComputerMonitoringWidget* computerMonitoringWidget, QWidget* parent ); + explicit SpotlightPanel( UserConfig& config, ComputerMonitoringWidget* computerMonitoringWidget, + QWidget* parent = nullptr ); ~SpotlightPanel() override; protected: diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index f48df8d74..e66589ad9 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -25,6 +25,7 @@ #pragma once #include +#include #include "Configuration/Object.h" #include "Configuration/Property.h" @@ -51,6 +52,7 @@ class UserConfig : public Configuration::Object OP( UserConfig, VeyonMaster::userConfig(), int, defaultRole, setDefaultRole, "DefaultRole", "Authentication", 0, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), bool, toolButtonIconOnlyMode, setToolButtonIconOnlyMode, "ToolButtonIconOnlyMode", "UI", false, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), bool, noToolTips, setNoToolTips, "NoToolTips", "UI", false, Configuration::Property::Flag::Standard ) \ + OP( UserConfig, VeyonMaster::userConfig(), QJsonObject, splitterStates, setSplitterStates, "SplitterStates", "UI", {}, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), QString, windowState, setWindowState, "WindowState", "UI", QString(), Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), QString, windowGeometry, setWindowGeometry, "WindowGeometry", "UI", QString(), Configuration::Property::Flag::Standard ) \ From 00607aa172ae0c901354eb422d59300cc12e7758 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Nov 2020 11:16:35 +0100 Subject: [PATCH 0678/1765] Master: improve usability of splitter handles --- master/src/MainWindow.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 61f530642..0327b71ca 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -130,6 +130,9 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : for( auto* splitter : { slideshowSpotlightSplitter, monitoringSplitter, mainSplitter } ) { + splitter->setHandleWidth( 7 ); + splitter->setStyleSheet( QStringLiteral("QSplitter::handle:hover{background-color:#66a0b3;}") ); + splitter->installEventFilter( this ); QList splitterSizes; From 4f30bfa6384fd48f670e7c6fdc5b4cf8bde1253f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Nov 2020 11:42:47 +0100 Subject: [PATCH 0679/1765] SpotlightPanel: add hint on how to add computers --- master/src/SpotlightPanel.cpp | 34 +++++++++-- master/src/SpotlightPanel.h | 1 + master/src/SpotlightPanel.ui | 109 ++++++++++++++++++++++++++++++++-- 3 files changed, 132 insertions(+), 12 deletions(-) diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index 8dbb8be0b..a52d97347 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -56,6 +56,13 @@ SpotlightPanel::SpotlightPanel( UserConfig& config, ComputerMonitoringWidget* co connect( m_computerMonitoringWidget, &QAbstractItemView::pressed, this, &SpotlightPanel::addPressedItem ); connect( ui->list, &QAbstractItemView::pressed, this, &SpotlightPanel::removePressedItem ); + connect( m_model, &QAbstractItemModel::rowsRemoved, this, [=]() { + if( m_model->rowCount() <= 0 ) + { + ui->stackedWidget->setCurrentWidget( ui->helpPage ); + } + } ); + setRealtimeView( m_config.spotlightRealtime() ); } @@ -70,12 +77,7 @@ SpotlightPanel::~SpotlightPanel() void SpotlightPanel::resizeEvent( QResizeEvent* event ) { - const auto w = ui->list->width() - 40; - const auto h = ui->list->height() - 40; - - ui->list->setIconSize( { qMin(w, h * 16 / 9), - qMin(h, w * 9 / 16) } ); - m_model->setIconSize( ui->list->iconSize() ); + updateIconSize(); QWidget::resizeEvent( event ); } @@ -97,6 +99,14 @@ void SpotlightPanel::add() { m_model->add( controlInterface ); } + + if( ui->stackedWidget->currentWidget() != ui->viewPage ) + { + ui->stackedWidget->setCurrentWidget( ui->viewPage ); + + // due to a bug in QListView force relayout of all items to show decorations (thumbnails) properly + updateIconSize(); + } } @@ -131,6 +141,18 @@ void SpotlightPanel::setRealtimeView( bool enabled ) +void SpotlightPanel::updateIconSize() +{ + const auto w = ui->list->width() - 40; + const auto h = ui->list->height() - 40; + + ui->list->setIconSize( { qMin(w, h * 16 / 9), + qMin(h, w * 9 / 16) } ); + m_model->setIconSize( ui->list->iconSize() ); +} + + + void SpotlightPanel::addPressedItem( const QModelIndex& index ) { if( QGuiApplication::mouseButtons().testFlag( Qt::MidButton ) ) diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index a2e902c28..d24ec8f8f 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -49,6 +49,7 @@ class SpotlightPanel : public QWidget void add(); void remove(); void setRealtimeView( bool enabled ); + void updateIconSize(); void addPressedItem( const QModelIndex& index ); void removePressedItem( const QModelIndex& index ); diff --git a/master/src/SpotlightPanel.ui b/master/src/SpotlightPanel.ui index 0c69ecc0d..312efa16e 100644 --- a/master/src/SpotlightPanel.ui +++ b/master/src/SpotlightPanel.ui @@ -2,7 +2,7 @@ SpotlightPanel - + 0 @@ -19,10 +19,107 @@ 0 - - - QListView::Static - + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + + + + + 128 + 128 + 128 + + + + + + + + + 128 + 128 + 128 + + + + + + + + + 119 + 120 + 120 + + + + + + + + + 20 + + + + Add computers by clicking with the middle mouse button or using the first button. + + + Qt::AlignCenter + + + true + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QListView::Static + + + + + @@ -72,7 +169,7 @@ - + Qt::Horizontal From 0159ae97ba566d577e618daba1d966ec2fcc9337 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Nov 2020 13:49:13 +0100 Subject: [PATCH 0680/1765] Master: reuse icons from Core --- master/qml/AppDrawer.qml | 4 ++-- master/resources/go-next.png | Bin 1314 -> 0 bytes master/resources/go-previous.png | Bin 1297 -> 0 bytes master/resources/master.qrc | 2 -- master/src/SlideshowPanel.ui | 9 +++++---- 5 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 master/resources/go-next.png delete mode 100644 master/resources/go-previous.png diff --git a/master/qml/AppDrawer.qml b/master/qml/AppDrawer.qml index f27d47b46..c51e3393c 100644 --- a/master/qml/AppDrawer.qml +++ b/master/qml/AppDrawer.qml @@ -44,7 +44,7 @@ Drawer { onClicked: drawerMenu.model.rootIndex = drawerMenu.model.parentModelIndex() Image { anchors.left: parent.left - source: "qrc:/master/go-previous.png" + source: "qrc:/core/go-previous.png" width: height height: parent.implicitHeight*0.8 anchors.verticalCenter: parent.verticalCenter @@ -82,7 +82,7 @@ Drawer { Image { anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter - source: "qrc:/master/go-next.png" + source: "qrc:/core/go-next.png" width: height height: parent.implicitHeight*0.8 } diff --git a/master/resources/go-next.png b/master/resources/go-next.png deleted file mode 100644 index 20da882de46fb95339dd842560eed008d4c597ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1314 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&F&8^|hH!9j+7^7?d$97=H>?B1_T6ndwaXPy9Wja0>yy}{QUfa zf`WW}eEj|Wfg)aBUO+WK22dGL3MdXFfl@#&kOXpp3LvsT5(t2@$P73as1gW(Qa}>rK78FU}S7+ zVQpjY=;Z3=>E#;`5)qS-n39^FnUh;sR90T!*xcUH)7L+7@|3AFX3m|zVA0Z*t5&aB zyKeo)En9c&+_P{0p~J^co;rQz?D>nAu3o=&=kC4x4|S+E|6IL}BdsoEeetSy9xMya|6IQPB8$VrK7l>`svKO~S`*$V zIZoKE$TImO%fYpxia+Lf2rSX(Jh(ljNg+3k-6Eb-Xq>P?t>3)TNVU!^u1U9x5k&F zW-G_RVAp{5iY3RL9+)Vx@OCwD^7Q+)Jg^j!SS89RETP5M3KV(D?sTDMJ0?ln_4s#BY-O2aL7t5y3cV? zPDny&Pf5asu&JCp@5B@>R;8?2<h$3Q3m?y|Wj|jDHf^fCu`av8?T6r%)(8Co z|9Knltc!PXDR$i7^|D{^ujMjc&fJqP#H<$_XV0+P3zgc-jGkw%R@%}geFXIBW VSk`+_|7wCtC{I^Emvv4FO#q?;{gMCx diff --git a/master/resources/go-previous.png b/master/resources/go-previous.png deleted file mode 100644 index ee690e3f839c3185c14e9d7558039e6395586825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1297 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&F&8^|hH!9j+7^7?d$97=H>?B0?B}Y0B>(^cX#)|z(AlBP>r9T zpO=>xko58K@%Q%!3If#tNuUT202vTLpe~>Sph_SEA_9>GDgcT@*gz7_28ts~0olm1 z5M^)^z-mDXAPk@^L_L}~kPDQ8$f8NX1tEsOxya@~v|trM6NI}2zZSSG@r=TV*Y|)? z)mswe7tFxO#LU9V#?HaT&BMnpASfg(A}TH+B`qtbps1p*p{1>(Z(wY0VQpjY;OOM) z<>wy|91rm}lxZ_&&YC-K(c&dbmn~npX5IRYo3?D- zv2)Mfeftj`JAUf)*>mSFUAuns*4=v#9zK5Z?D@-AZ{EHC@bS~+)!uYdO4zrWe%?Y(CCdQLjOl3f4s#~&+fxTjt-*03w|+giJD!BcUrU|zT)L+1S-z@A>#%{xe|GDdfBcNUq+i)D zoX@-Y*n5UAp9^MPJ+F58{~68(`4{z47uE;t4`x>p=RP3s7{=eVr{!jBg>{glMZ1EX z%b(>l{!4z`pB(2=q562~l=-JVS98`GA2wh9d0TO)3+tD~KF6*2UngAm@EA0RP diff --git a/master/resources/master.qrc b/master/resources/master.qrc index ae450e00f..7f2cc18a7 100644 --- a/master/resources/master.qrc +++ b/master/resources/master.qrc @@ -18,8 +18,6 @@ edit-select-all.png homerun.png application-menu.png - go-previous.png - go-next.png computer-slideshow.png spotlight.png media-playback-start.png diff --git a/master/src/SlideshowPanel.ui b/master/src/SlideshowPanel.ui index 3776d1344..7c90cdeae 100644 --- a/master/src/SlideshowPanel.ui +++ b/master/src/SlideshowPanel.ui @@ -46,8 +46,8 @@ Previous - - :/master/go-previous.png:/master/go-previous.png + + :/core/go-previous.png:/core/go-previous.png @@ -87,8 +87,8 @@ Next - - :/master/go-next.png:/master/go-next.png + + :/core/go-next.png:/core/go-next.png @@ -161,6 +161,7 @@ + From 084bd24b169f36efedb67275ca17ca524d189786 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 6 Nov 2020 19:27:12 +0100 Subject: [PATCH 0681/1765] SlideshowPanel, SpotlightPanel: improve icon size calculation Include icon spacing and label height in calculation. --- master/src/SlideshowPanel.cpp | 9 +++++++-- master/src/SpotlightPanel.cpp | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index ab99a928a..e88555bc8 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -70,8 +70,13 @@ SlideshowPanel::~SlideshowPanel() void SlideshowPanel::resizeEvent( QResizeEvent* event ) { - const auto w = ui->list->width() - 40; - const auto h = ui->list->height() - 40; + static constexpr auto ExtraMargin = 10; + + const auto spacing = ui->list->spacing(); + const auto labelHeight = ui->list->fontMetrics().height(); + + const auto w = ui->list->width() - ExtraMargin - spacing * 2; + const auto h = ui->list->height() - ExtraMargin - labelHeight - spacing * 2; ui->list->setIconSize( { qMin(w, h * 16 / 9), qMin(h, w * 9 / 16) } ); diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index a52d97347..d24d3525f 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -143,8 +143,13 @@ void SpotlightPanel::setRealtimeView( bool enabled ) void SpotlightPanel::updateIconSize() { - const auto w = ui->list->width() - 40; - const auto h = ui->list->height() - 40; + static constexpr auto ExtraMargin = 10; + + const auto spacing = ui->list->spacing(); + const auto labelHeight = ui->list->fontMetrics().height(); + + const auto w = ui->list->width() - ExtraMargin - spacing * 2; + const auto h = ui->list->height() - ExtraMargin - labelHeight - spacing * 2; ui->list->setIconSize( { qMin(w, h * 16 / 9), qMin(h, w * 9 / 16) } ); From 85d3946b3a62e6ca76f46b5fd6efd39fb798781c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 6 Nov 2020 19:28:12 +0100 Subject: [PATCH 0682/1765] VeyonConfig: make ComputerMonitoringThumbnailSpacing default to 5 --- core/src/VeyonConfigurationProperties.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 1d848e176..ee689511a 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -100,7 +100,7 @@ #define FOREACH_VEYON_MASTER_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, modernUserInterface, setModernUserInterface, "ModernUserInterface", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringUpdateInterval, setComputerMonitoringUpdateInterval, "ComputerMonitoringUpdateInterval", "Master", 1000, Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringThumbnailSpacing, setComputerMonitoringThumbnailSpacing, "ComputerMonitoringThumbnailSpacing", "Master", 16, Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringThumbnailSpacing, setComputerMonitoringThumbnailSpacing, "ComputerMonitoringThumbnailSpacing", "Master", 5, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::DisplayRoleContent, computerDisplayRoleContent, setComputerDisplayRoleContent, "ComputerDisplayRoleContent", "Master", QVariant::fromValue(ComputerListModel::DisplayRoleContent::UserAndComputerName), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::SortOrder, computerMonitoringSortOrder, setComputerMonitoringSortOrder, "ComputerMonitoringSortOrder", "Master", QVariant::fromValue(ComputerListModel::SortOrder::ComputerAndUserName), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QColor, computerMonitoringBackgroundColor, setComputerMonitoringBackgroundColor, "ComputerMonitoringBackgroundColor", "Master", QColor(Qt::white), Configuration::Property::Flag::Standard ) \ From bfea2979b7971f3637a599b5002ac2c82096c3f0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Sat, 7 Nov 2020 10:03:21 +0100 Subject: [PATCH 0683/1765] ComputerListModel: add AspectRatio setting --- configurator/src/MasterConfigurationPage.ui | 182 ++++++++++++-------- core/src/ComputerListModel.cpp | 3 +- core/src/ComputerListModel.h | 15 ++ core/src/VeyonConfigurationProperties.h | 1 + 4 files changed, 127 insertions(+), 74 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 4e60850e4..6043d4b81 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -82,43 +82,10 @@ User interface - - - - Text color - - - - - - - Computer thumbnail caption - - - - - - - - Computer and user name - - - - - Only user name - - - - - Only computer name - - - - - - - + + + @@ -137,44 +104,39 @@ - - - - Thumbnail spacing + + + + px - - - - - - Use modern user interface (experimental) + + - - - - - - Background color + + 2 + + + 50 + + + 16 - - + + - Thumbnail update interval + Computer thumbnail caption - + Sort order - - - @@ -194,25 +156,99 @@ + + + + Background color + + + - - - px + + + + Computer and user name + + + + + Only user name + + + + + Only computer name + + + + + + + + Thumbnail spacing - - + + + + + + Thumbnail update interval - - 2 + + + + + + Text color - - 50 + + + + + + + + + Use modern user interface (experimental) - - 16 + + + + + + Thumbnail aspect ratio + + + + + Auto + + + + + 16:9 + + + + + 16:10 + + + + + 3:2 + + + + + 4:3 + + + + @@ -423,7 +459,7 @@ ... - + :/configurator/go-next.png:/configurator/go-next.png @@ -434,7 +470,7 @@ ... - + :/configurator/go-previous.png:/configurator/go-previous.png @@ -473,6 +509,7 @@ openScreenshotDirectory modernUserInterface computerMonitoringUpdateInterval + computerMonitoringAspectRatio computerMonitoringBackgroundColor computerMonitoringTextColor computerDisplayRoleContent @@ -497,7 +534,6 @@ disabledFeaturesListWidget - diff --git a/core/src/ComputerListModel.cpp b/core/src/ComputerListModel.cpp index 70b407451..657ec5690 100644 --- a/core/src/ComputerListModel.cpp +++ b/core/src/ComputerListModel.cpp @@ -29,7 +29,8 @@ ComputerListModel::ComputerListModel( QObject* parent ) : QAbstractListModel( parent ), m_displayRoleContent( VeyonCore::config().computerDisplayRoleContent() ), - m_sortOrder( VeyonCore::config().computerMonitoringSortOrder() ) + m_sortOrder( VeyonCore::config().computerMonitoringSortOrder() ), + m_aspectRatio( VeyonCore::config().computerMonitoringAspectRatio() ) { } diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index a41bd53db..8a6765046 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -55,6 +55,15 @@ class VEYON_CORE_EXPORT ComputerListModel : public QAbstractListModel }; Q_ENUM(SortOrder) + enum class AspectRatio { + Auto, + AR16_9, + AR16_10, + AR3_2, + AR4_3 + }; + Q_ENUM(AspectRatio) + explicit ComputerListModel( QObject* parent = nullptr ); Qt::ItemFlags flags( const QModelIndex& index ) const override; @@ -74,8 +83,14 @@ class VEYON_CORE_EXPORT ComputerListModel : public QAbstractListModel return m_sortOrder; } + AspectRatio aspectRatio() const + { + return m_aspectRatio; + } + private: DisplayRoleContent m_displayRoleContent; SortOrder m_sortOrder; + AspectRatio m_aspectRatio; }; diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index ee689511a..bf80548f0 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -103,6 +103,7 @@ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringThumbnailSpacing, setComputerMonitoringThumbnailSpacing, "ComputerMonitoringThumbnailSpacing", "Master", 5, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::DisplayRoleContent, computerDisplayRoleContent, setComputerDisplayRoleContent, "ComputerDisplayRoleContent", "Master", QVariant::fromValue(ComputerListModel::DisplayRoleContent::UserAndComputerName), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::SortOrder, computerMonitoringSortOrder, setComputerMonitoringSortOrder, "ComputerMonitoringSortOrder", "Master", QVariant::fromValue(ComputerListModel::SortOrder::ComputerAndUserName), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::AspectRatio, computerMonitoringAspectRatio, setComputerMonitoringAspectRatio, "ComputerMonitoringAspectRatio", "Master", QVariant::fromValue(ComputerListModel::AspectRatio::Auto), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QColor, computerMonitoringBackgroundColor, setComputerMonitoringBackgroundColor, "ComputerMonitoringBackgroundColor", "Master", QColor(Qt::white), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QColor, computerMonitoringTextColor, setComputerMonitoringTextColor, "ComputerMonitoringTextColor", "Master", QColor(Qt::black), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, accessControlForMasterEnabled, setAccessControlForMasterEnabled, "AccessControlForMasterEnabled", "Master", false, Configuration::Property::Flag::Standard ) \ From f4d075941f24dde23f8ebc6cd1281849f69a6979 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:09:46 +0100 Subject: [PATCH 0684/1765] ComputerControlListModel: add support for different aspect ratios --- master/src/ComputerControlListModel.cpp | 35 +++++++++++++++++++++---- master/src/ComputerControlListModel.h | 9 ++++++- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index e2927d8a9..6c7e75308 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -52,6 +52,8 @@ ComputerControlListModel::ComputerControlListModel( VeyonMaster* masterCore, QOb connect( &m_master->computerManager(), &ComputerManager::computerSelectionChanged, this, &ComputerControlListModel::update ); + updateComputerScreenSize(); + reload(); } @@ -174,11 +176,24 @@ QImage ComputerControlListModel::requestImage( const QString& id, QSize* size, c void ComputerControlListModel::updateComputerScreenSize() { - const auto size = computerScreenSize(); + auto ratio = 1.0; + + switch( aspectRatio() ) + { + case AspectRatio::Auto: ratio = averageAspectRatio(); break; + case AspectRatio::AR16_9: ratio = 16.0 / 9.0; break; + case AspectRatio::AR16_10: ratio = 16.0 / 10.0; break; + case AspectRatio::AR3_2: ratio = 3.0 / 2.0; break; + case AspectRatio::AR4_3: ratio = 4.0 / 3.0; break; + + } + + m_computerScreenSize = { m_master->userConfig().monitoringScreenSize(), + int(m_master->userConfig().monitoringScreenSize() / ratio) }; for( auto& controlInterface : m_computerControlInterfaces ) { - controlInterface->setScaledScreenSize( size ); + controlInterface->setScaledScreenSize( m_computerScreenSize ); } } @@ -363,10 +378,20 @@ void ComputerControlListModel::stopComputerControlInterface( const ComputerContr -QSize ComputerControlListModel::computerScreenSize() const +double ComputerControlListModel::averageAspectRatio() const { - return { m_master->userConfig().monitoringScreenSize(), - m_master->userConfig().monitoringScreenSize() * 9 / 16 }; + QSize size{ 16, 9 }; + + for( const auto& controlInterface : m_computerControlInterfaces ) + { + const auto currentSize = controlInterface->screen().size(); + if( currentSize.isValid() ) + { + size += currentSize; + } + } + + return double(size.width()) / double(size.height()); } diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 612c044e8..8a1f77502 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -54,6 +54,11 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro void updateComputerScreenSize(); + QSize computerScreenSize() const + { + return m_computerScreenSize; + } + const ComputerControlInterfaceList& computerControlInterfaces() const { return m_computerControlInterfaces; @@ -80,7 +85,7 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro void startComputerControlInterface( ComputerControlInterface* controlInterface ); void stopComputerControlInterface( const ComputerControlInterface::Pointer& controlInterface ); - QSize computerScreenSize() const; + double averageAspectRatio() const; void loadIcons(); QImage prepareIcon( const QImage& icon ); @@ -99,6 +104,8 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro QImage m_iconConnectionProblem{}; QImage m_iconDemoMode{}; + QSize m_computerScreenSize{}; + ComputerControlInterfaceList m_computerControlInterfaces{}; }; From a08b1e3c1a6c007691505115a90410a08c227983 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:23:51 +0100 Subject: [PATCH 0685/1765] ComputerMonitoringView: use icon size from model --- master/src/ComputerMonitoringView.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 595452048..d9a3c6c47 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -123,7 +123,7 @@ void ComputerMonitoringView::setComputerScreenSize( int size ) m_master->computerControlListModel().updateComputerScreenSize(); - setIconSize( QSize( size, size * 9 / 16 ) ); + setIconSize( m_master->computerControlListModel().computerScreenSize() ); } } From 0b914aeee769adfbbe9dac0a528fad468ff328ef Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:24:05 +0100 Subject: [PATCH 0686/1765] ComputerMonitoringWidget: set resize mode to Fixed --- master/src/ComputerMonitoringWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index b3508cbbf..fe094d61d 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -50,7 +50,7 @@ ComputerMonitoringWidget::ComputerMonitoringWidget( QWidget *parent ) : setSelectionMode( QAbstractItemView::ExtendedSelection ); setFlow( QListView::LeftToRight ); setWrapping( true ); - setResizeMode( QListView::Adjust ); + setResizeMode( QListView::Fixed ); setSpacing( computerMonitoringThumbnailSpacing ); setViewMode( QListView::IconMode ); setUniformItemSizes( true ); From 050c9f01d9893dcc86930e68e06793bd0c451245 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:26:25 +0100 Subject: [PATCH 0687/1765] SlideshowModel: add range check --- master/src/SlideshowModel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/master/src/SlideshowModel.cpp b/master/src/SlideshowModel.cpp index b925f8f62..b3c2c4a6e 100644 --- a/master/src/SlideshowModel.cpp +++ b/master/src/SlideshowModel.cpp @@ -131,7 +131,8 @@ void SlideshowModel::showNext() bool SlideshowModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { - return m_currentControlInterface == sourceModel()->data( sourceModel()->index( sourceRow, 0, sourceParent ), + return sourceRow < sourceModel()->rowCount() && + m_currentControlInterface == sourceModel()->data( sourceModel()->index( sourceRow, 0, sourceParent ), ComputerListModel::ControlInterfaceRole ) .value(); } From c6e4944ea754e8bb990d54f5dfb4bd224209ead9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:27:14 +0100 Subject: [PATCH 0688/1765] SlideshowPanel: use maximum possible icon size --- master/src/SlideshowPanel.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index e88555bc8..21d2e99e1 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -75,11 +75,8 @@ void SlideshowPanel::resizeEvent( QResizeEvent* event ) const auto spacing = ui->list->spacing(); const auto labelHeight = ui->list->fontMetrics().height(); - const auto w = ui->list->width() - ExtraMargin - spacing * 2; - const auto h = ui->list->height() - ExtraMargin - labelHeight - spacing * 2; - - ui->list->setIconSize( { qMin(w, h * 16 / 9), - qMin(h, w * 9 / 16) } ); + ui->list->setIconSize( { ui->list->width() - ExtraMargin - spacing * 2, + ui->list->height() - ExtraMargin - labelHeight - spacing * 2 } ); QWidget::resizeEvent( event ); } From 615aaf9ec5003b516cc49a67bb6e3532dc132eb9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:28:57 +0100 Subject: [PATCH 0689/1765] SpotlightPanel: use maximum possible icon size --- master/src/SpotlightPanel.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index d24d3525f..7d7146ae0 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -148,11 +148,8 @@ void SpotlightPanel::updateIconSize() const auto spacing = ui->list->spacing(); const auto labelHeight = ui->list->fontMetrics().height(); - const auto w = ui->list->width() - ExtraMargin - spacing * 2; - const auto h = ui->list->height() - ExtraMargin - labelHeight - spacing * 2; - - ui->list->setIconSize( { qMin(w, h * 16 / 9), - qMin(h, w * 9 / 16) } ); + ui->list->setIconSize( { ui->list->width() - ExtraMargin - spacing * 2, + ui->list->height() - ExtraMargin - labelHeight - spacing * 2 } ); m_model->setIconSize( ui->list->iconSize() ); } From fd2e88f4555b1fed7819fef80b8de4bdc668eb83 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:29:05 +0100 Subject: [PATCH 0690/1765] SpotlightPanel: improve help text --- master/src/SpotlightPanel.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/SpotlightPanel.ui b/master/src/SpotlightPanel.ui index 312efa16e..fd0dd5538 100644 --- a/master/src/SpotlightPanel.ui +++ b/master/src/SpotlightPanel.ui @@ -85,7 +85,7 @@ - Add computers by clicking with the middle mouse button or using the first button. + Add computers by clicking with the middle mouse button or clicking the first button below. Qt::AlignCenter From bcd601f908f6fe643cf50b251a3f6713ec981acc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:29:43 +0100 Subject: [PATCH 0691/1765] CryptoCore: use auto keyword --- core/src/CryptoCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index 81c8467fa..f003e91c4 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -52,7 +52,7 @@ CryptoCore::~CryptoCore() QByteArray CryptoCore::generateChallenge() { - BIGNUM * challengeBigNum = BN_new(); + const auto challengeBigNum = BN_new(); if( challengeBigNum == nullptr ) { From 23a076f1cb631fe1a5c0b149370dae312bf3ead6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:30:21 +0100 Subject: [PATCH 0692/1765] CMake: add option for enabling model testers --- CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 59d18167a..b93cb6230 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,10 +155,6 @@ find_package(Qt5QuickControls2 REQUIRED) if(VEYON_BUILD_ANDROID) find_package(Qt5AndroidExtras REQUIRED) endif() -if(VEYON_DEBUG) -find_package(Qt5Test REQUIRED) -set(VEYON_DEBUG_LIBRARIES Qt5::Test) -endif() # find required libraries find_package(QCA REQUIRED) @@ -203,6 +199,7 @@ endif() option(WITH_LTO "Build with link-time optimization" ON) option(WITH_PCH "Reduce compile time by using precompiled headers" ON) option(WITH_SANITIZERS "Build with thread and UB sanitizers" OFF) +option(WITH_MODEL_TESTERS "Build with model testers (turn on for debugging only)" OFF) if(WITH_SANITIZERS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fsanitize=undefined") @@ -226,6 +223,11 @@ if(VEYON_BUILD_WIN32 OR VEYON_BUILD_WIN64) set(WITH_LTO OFF) endif() +if(WITH_MODEL_TESTERS) +find_package(Qt5Test REQUIRED) +set(VEYON_DEBUG_LIBRARIES Qt5::Test) +endif() + add_definitions( -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050e00 From bbead708d9f659e7c9363c0a23de1dc175d85910 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:32:28 +0100 Subject: [PATCH 0693/1765] 3rdparty: kitemmodels: update submodule --- 3rdparty/kitemmodels | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/kitemmodels b/3rdparty/kitemmodels index 21b93c103..1d2606f23 160000 --- a/3rdparty/kitemmodels +++ b/3rdparty/kitemmodels @@ -1 +1 @@ -Subproject commit 21b93c1038aeca375d43b1249fde105f20fbf16b +Subproject commit 1d2606f230574992a3518cdb6eebad206ff983df From 85dd28ae39a9e0035b4116b42978c9237dbf3264 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Nov 2020 11:32:35 +0100 Subject: [PATCH 0694/1765] 3rdparty: kldap: update submodule --- 3rdparty/kldap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/kldap b/3rdparty/kldap index fdb7f7497..2e42f0f14 160000 --- a/3rdparty/kldap +++ b/3rdparty/kldap @@ -1 +1 @@ -Subproject commit fdb7f749779ba7bb22f27354040b2491e5e2b1cc +Subproject commit 2e42f0f145b70c8b45539c80efefb1fda903ccfe From 82b5f37f12a0529de5cb4c96191804ebd0b6fbfa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Nov 2020 08:09:17 +0100 Subject: [PATCH 0695/1765] Feature: drop unused flag Dialog --- core/src/DesktopAccessDialog.cpp | 2 +- core/src/Feature.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index 0ed022722..f58f4d5c9 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -38,7 +38,7 @@ DesktopAccessDialog::DesktopAccessDialog( QObject* parent ) : QObject( parent ), m_desktopAccessDialogFeature( Feature( QLatin1String( staticMetaObject.className() ), - Feature::Dialog | Feature::Service | Feature::Worker | Feature::Builtin, + Feature::Service | Feature::Worker | Feature::Builtin, Feature::Uid( "3dd8ec3e-7004-4936-8f2a-70699b9819be" ), Feature::Uid(), tr( "Desktop access dialog" ), {}, {} ) ), diff --git a/core/src/Feature.h b/core/src/Feature.h index edad13763..3242c4042 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -44,7 +44,6 @@ class VEYON_CORE_EXPORT Feature Action = 0x0002, Session = 0x0004, Internal = 0x0008, - Dialog = 0x0010, Master = 0x0100, Service = 0x0200, Worker = 0x0400, From 9110741e33f7b2de76993ba498b7df7c8ddc8a85 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Nov 2020 08:09:41 +0100 Subject: [PATCH 0696/1765] Feature: add flags Option and Checked --- core/src/Feature.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/Feature.h b/core/src/Feature.h index 3242c4042..7e85fa7d0 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -44,6 +44,8 @@ class VEYON_CORE_EXPORT Feature Action = 0x0002, Session = 0x0004, Internal = 0x0008, + Option = 0x0010, + Checked = 0x0020, Master = 0x0100, Service = 0x0200, Worker = 0x0400, From cf0465a81abd62ab845452a5eccab20b33a2f18a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Nov 2020 08:10:10 +0100 Subject: [PATCH 0697/1765] Master: make option features checkable --- master/src/MainWindow.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 0327b71ca..36b1077e7 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -466,13 +466,22 @@ void MainWindow::addSubFeaturesToToolButton( QToolButton* button, const Feature& m_master.runFeature( subFeature ); if( parentFeatureIsMode ) { - button->setChecked( true ); + if( subFeature.testFlag( Feature::Option ) == false ) + { + button->setChecked( true ); + } reloadSubFeatures(); } }, subFeature.shortcut() ); action->setToolTip( subFeature.description() ); action->setObjectName( subFeature.uid().toString() ); + + if( subFeature.testFlag( Feature::Option ) ) + { + action->setCheckable( true ); + action->setChecked( subFeature.testFlag( Feature::Checked ) ); + } } button->setMenu( menu ); From adb0bf76d5e7b2c381db97250e2d53917816a95c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Nov 2020 08:18:03 +0100 Subject: [PATCH 0698/1765] VncView: add framebuffer viewport support This allows displaying a subarea of the framebuffer only. --- core/src/VncView.cpp | 42 +++++++++++++++++++++++++++----------- core/src/VncView.h | 14 +++++++++++-- core/src/VncViewItem.cpp | 12 ++++++++++- core/src/VncViewWidget.cpp | 16 +++++++++++---- core/src/VncViewWidget.h | 2 +- 5 files changed, 66 insertions(+), 20 deletions(-) diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index ada62e9bb..dfe703fa3 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -62,10 +62,24 @@ QSize VncView::scaledSize() const { if( isScaledView() == false ) { - return m_framebufferSize; + return effectiveFramebufferSize(); } - return m_framebufferSize.scaled( viewSize(), Qt::KeepAspectRatio ); + return effectiveFramebufferSize().scaled( viewSize(), Qt::KeepAspectRatio ); +} + + + +QSize VncView::effectiveFramebufferSize() const +{ + const auto viewportSize = m_viewport.size(); + + if( viewportSize.isEmpty() == false ) + { + return viewportSize; + } + + return m_framebufferSize; } @@ -162,8 +176,8 @@ void VncView::sendShortcut( VncView::Shortcut shortcut ) bool VncView::isScaledView() const { - return viewSize().width() < m_framebufferSize.width() || - viewSize().height() < m_framebufferSize.height(); + return viewSize().width() < effectiveFramebufferSize().width() || + viewSize().height() < effectiveFramebufferSize().height(); } @@ -172,7 +186,7 @@ qreal VncView::scaleFactor() const { if( isScaledView() ) { - return qreal( scaledSize().width() ) / m_framebufferSize.width(); + return qreal( scaledSize().width() ) / effectiveFramebufferSize().width(); } return 1; @@ -182,26 +196,28 @@ qreal VncView::scaleFactor() const QPoint VncView::mapToFramebuffer( QPoint pos ) { - if( m_framebufferSize.isEmpty() ) + if( effectiveFramebufferSize().isEmpty() ) { return { 0, 0 }; } - return { pos.x() * m_framebufferSize.width() / scaledSize().width(), - pos.y() * m_framebufferSize.height() / scaledSize().height() }; + return { pos.x() * effectiveFramebufferSize().width() / scaledSize().width() + viewport().x(), + pos.y() * effectiveFramebufferSize().height() / scaledSize().height() + viewport().y() }; } QRect VncView::mapFromFramebuffer( QRect r ) { - if( m_framebufferSize.isEmpty() ) + if( effectiveFramebufferSize().isEmpty() ) { return {}; } - const auto dx = scaledSize().width() / qreal( m_framebufferSize.width() ); - const auto dy = scaledSize().height() / qreal( m_framebufferSize.height() ); + r.translate( -viewport().x(), -viewport().y() ); + + const auto dx = scaledSize().width() / qreal( effectiveFramebufferSize().width() ); + const auto dy = scaledSize().height() / qreal( effectiveFramebufferSize().height() ); return { int(r.x()*dx), int(r.y()*dy), int(r.width()*dx), int(r.height()*dy) }; @@ -255,8 +271,10 @@ void VncView::updateFramebufferSize( int w, int h ) void VncView::updateImage( int x, int y, int w, int h ) { - const auto scale = scaleFactor(); + x -= viewport().x(); + y -= viewport().y(); + const auto scale = scaleFactor(); updateView( qMax( 0, qFloor( x*scale - 1 ) ), qMax( 0, qFloor( y*scale - 1 ) ), qCeil( w*scale + 2 ), qCeil( h*scale + 2 ) ); } diff --git a/core/src/VncView.h b/core/src/VncView.h index 38e4d4b37..71723544a 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -77,9 +77,17 @@ class VEYON_CORE_EXPORT VncView } QSize scaledSize() const; - QSize framebufferSize() const + + QSize effectiveFramebufferSize() const; + + const QRect& viewport() const + { + return m_viewport; + } + + void setViewport( const QRect& viewport ) { - return m_framebufferSize; + m_viewport = viewport; } virtual void setViewOnly( bool viewOnly ); @@ -154,6 +162,8 @@ class VEYON_CORE_EXPORT VncView QSize m_framebufferSize{0, 0}; bool m_viewOnly{true}; + QRect m_viewport{}; + uint m_buttonMask{0}; QMap m_mods; diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index 505edc695..4e82ec28d 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -69,7 +69,17 @@ QSGNode* VncViewItem::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* up node->setTexture( texture ); } - dynamic_cast( node->texture() )->setImage(m_computerControlInterface->screen() ); + const auto texture = dynamic_cast( node->texture() ); + + if( viewport().isValid() ) + { + texture->setImage( m_computerControlInterface->screen().copy( viewport() ) ); + } + else + { + texture->setImage( m_computerControlInterface->screen() ); + } + node->setRect( boundingRect() ); return node; diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index cf35848bf..fafaed60e 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -34,11 +34,13 @@ #include "VncViewWidget.h" -VncViewWidget::VncViewWidget( const QString& host, int port, QWidget* parent, Mode mode ) : +VncViewWidget::VncViewWidget( const QString& host, int port, QWidget* parent, Mode mode, const QRect& viewport ) : QWidget( parent ), VncView( new VncConnection( QCoreApplication::instance() ) ), m_veyonConnection( new VeyonConnection( connection() ) ) { + setViewport( viewport ); + connectUpdateFunctions( this ); connection()->setHost( host ); @@ -101,7 +103,7 @@ VncViewWidget::~VncViewWidget() QSize VncViewWidget::sizeHint() const { - return framebufferSize(); + return effectiveFramebufferSize(); } @@ -274,14 +276,20 @@ void VncViewWidget::paintEvent( QPaintEvent* paintEvent ) return; } + auto source = viewport(); + if( source.isNull() || source.isEmpty() ) + { + source = { QPoint{ 0, 0 }, image.size() }; + } + if( isScaledView() ) { // repaint everything in scaled mode to avoid artifacts at rectangle boundaries - p.drawImage( QRect( QPoint( 0, 0 ), scaledSize() ), image ); + p.drawImage( QRect( QPoint( 0, 0 ), scaledSize() ), image, source ); } else { - p.drawImage( 0, 0, image ); + p.drawImage( { 0, 0 }, image, source ); } if( viewOnly() && cursorShape().isNull() == false ) diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index a035fe7d1..64b708420 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -36,7 +36,7 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView { Q_OBJECT public: - VncViewWidget( const QString& host, int port, QWidget* parent, Mode mode ); + VncViewWidget( const QString& host, int port, QWidget* parent, Mode mode, const QRect& viewport = {} ); ~VncViewWidget() override; QSize sizeHint() const override; From 67446d8401c82b79fce94262f5712f842c83aea7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Nov 2020 09:09:17 +0100 Subject: [PATCH 0699/1765] Demo: integrate framebuffer viewport support --- plugins/demo/DemoClient.cpp | 4 ++-- plugins/demo/DemoClient.h | 2 +- plugins/demo/DemoFeaturePlugin.cpp | 13 +++++++++++-- plugins/demo/DemoFeaturePlugin.h | 7 ++++++- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index 0faec4525..5dbda2afb 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -34,7 +34,7 @@ #include "VncViewWidget.h" -DemoClient::DemoClient( const QString& host, int port, bool fullscreen, QObject* parent ) : +DemoClient::DemoClient( const QString& host, int port, bool fullscreen, const QRect& viewport, QObject* parent ) : QObject( parent ), m_toplevel( nullptr ) { @@ -57,7 +57,7 @@ DemoClient::DemoClient( const QString& host, int port, bool fullscreen, QObject* m_toplevel->resize( QApplication::desktop()->availableGeometry( m_toplevel ).size() - QSize( 10, 30 ) ); } - m_vncView = new VncViewWidget( host, port, m_toplevel, VncView::DemoMode ); + m_vncView = new VncViewWidget( host, port, m_toplevel, VncView::DemoMode, viewport ); auto toplevelLayout = new QVBoxLayout; toplevelLayout->setContentsMargins( 0, 0, 0, 0 ); diff --git a/plugins/demo/DemoClient.h b/plugins/demo/DemoClient.h index e9735efad..ec7f50cab 100644 --- a/plugins/demo/DemoClient.h +++ b/plugins/demo/DemoClient.h @@ -32,7 +32,7 @@ class DemoClient : public QObject { Q_OBJECT public: - DemoClient( const QString& host, int port, bool fullscreen, QObject* parent = nullptr ); + DemoClient( const QString& host, int port, bool fullscreen, const QRect& viewport, QObject* parent = nullptr ); ~DemoClient() override; private: diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 2dda52247..02815965a 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -361,9 +361,10 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worker, cons const auto demoServerHost = message.argument( Argument::DemoServerHost ).toString(); const auto demoServerPort = message.argument( Argument::DemoServerPort ).toInt(); const auto isFullscreenDemo = message.featureUid() == m_demoClientFullScreenFeature.uid(); + const auto viewport = message.argument( Argument::Viewport ).toRect(); vDebug() << "connecting with master" << demoServerHost; - m_demoClient = new DemoClient( demoServerHost, demoServerPort, isFullscreenDemo ); + m_demoClient = new DemoClient( demoServerHost, demoServerPort, isFullscreenDemo, viewport ); } return true; @@ -437,6 +438,13 @@ bool DemoFeaturePlugin::controlDemoClient( Feature::Uid featureUid, Operation op const auto demoServerPort = arguments.value( argToString(Argument::DemoServerPort), VeyonCore::config().demoServerPort() + VeyonCore::sessionId() ).toInt(); + QRect viewport{ + arguments.value( argToString(Argument::ViewportX) ).toInt(), + arguments.value( argToString(Argument::ViewportY) ).toInt(), + arguments.value( argToString(Argument::ViewportWidth) ).toInt(), + arguments.value( argToString(Argument::ViewportHeight) ).toInt() + }; + const auto disableUpdates = m_configuration.slowDownThumbnailUpdates(); for( const auto& computerControlInterface : computerControlInterfaces ) @@ -451,7 +459,8 @@ bool DemoFeaturePlugin::controlDemoClient( Feature::Uid featureUid, Operation op sendFeatureMessage( FeatureMessage{ featureUid, StartDemoClient } .addArgument( Argument::DemoAccessToken, demoAccessToken ) .addArgument( Argument::DemoServerHost, demoServerHost ) - .addArgument( Argument::DemoServerPort, demoServerPort ), + .addArgument( Argument::DemoServerPort, demoServerPort ) + .addArgument( Argument::Viewport, viewport ), computerControlInterfaces ); return true; diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 748ea0803..2a4dd70ca 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -47,7 +47,12 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf VncServerPort, VncServerPassword, DemoServerHost, - DemoServerPort + DemoServerPort, + Viewport, + ViewportX, + ViewportY, + ViewportWidth, + ViewportHeight }; Q_ENUM(Argument) From 8182f602c9ba6811703444b5058271500b3fa239 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Nov 2020 09:10:48 +0100 Subject: [PATCH 0700/1765] Demo: implement screen selection and management This new feature allows the user to select which screen(s) to share by telling the demo client to only display the parts of the framebuffer belonging to the selected screen(s). The implementation is still very basic and lacks support for selecting e.g. 2 out of 3 screens. Also the selected screen should be rememebered between program starts. --- plugins/demo/DemoFeaturePlugin.cpp | 131 ++++++++++++++++++++++++++++- plugins/demo/DemoFeaturePlugin.h | 20 ++++- 2 files changed, 148 insertions(+), 3 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 02815965a..beca888cc 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -22,8 +22,8 @@ * */ -#include #include +#include #include "AuthenticationCredentials.h" #include "Computer.h" @@ -98,7 +98,7 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : Feature::Uid( "e4b6e743-1f5b-491d-9364-e091086200f4" ), m_demoFeature.uid(), {}, {}, {} ), - m_features( { + m_staticFeatures( { m_demoFeature, m_demoServerFeature, m_demoClientFullScreenFeature, m_demoClientWindowFeature, m_shareOwnScreenFullScreenFeature, m_shareOwnScreenWindowFeature, @@ -106,6 +106,10 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : } ), m_configuration( &VeyonCore::config() ) { + connect( qGuiApp, &QGuiApplication::screenAdded, this, &DemoFeaturePlugin::addScreen ); + connect( qGuiApp, &QGuiApplication::screenRemoved, this, &DemoFeaturePlugin::removeScreen ); + + updateFeatures(); } @@ -204,6 +208,14 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur return true; } + const auto screenIndex = m_screenSelectionFeatures.indexOf( feature ); + if( screenIndex >= 0 ) + { + m_screenSelection = screenIndex; + + updateFeatures(); + } + return false; } @@ -393,6 +405,116 @@ ConfigurationPage* DemoFeaturePlugin::createConfigurationPage() +void DemoFeaturePlugin::addScreen( QScreen* screen ) +{ + m_screens = QGuiApplication::screens(); + + const auto screenIndex = m_screens.indexOf( screen ) + 1; + if( m_screenSelection > ScreenSelectionNone && + screenIndex <= m_screenSelection ) + { + m_screenSelection++; + } + + updateFeatures(); +} + + + +void DemoFeaturePlugin::removeScreen( QScreen* screen ) +{ + const auto screenIndex = m_screens.indexOf( screen ) + 1; + if( screenIndex == m_screenSelection ) + { + m_screenSelection = ScreenSelectionNone; + } + + m_screens = QGuiApplication::screens(); + + m_screenSelection = qMin( m_screenSelection, m_screens.size() ); + + updateFeatures(); +} + + + +void DemoFeaturePlugin::updateFeatures() +{ + m_screenSelectionFeatures.clear(); + + if( m_screens.size() > 1 ) + { + m_screenSelectionFeatures.reserve( m_screens.size() + 1 ); + + auto allScreensFlags = Feature::Option | Feature::Master; + if( m_screenSelection <= ScreenSelectionNone ) + { + allScreensFlags |= Feature::Checked; + } + + m_screenSelectionFeatures.append( Feature{ QStringLiteral("DemoAllScreens"), + allScreensFlags, + Feature::Uid("2aca1e9f-25f9-4d0f-9729-01b03c80ab28"), + m_demoFeature.uid(), tr("All screens"), {}, {}, {} } ); + + int index = 1; + for( auto screen : qAsConst(m_screens) ) + { + const auto name = QStringLiteral( "DemoScreen%1" ).arg( index ); + + auto displayName = tr( "Screen %1 [%2]" ).arg( index ).arg( screen->name() ); + +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) + if( screen->manufacturer().isEmpty() == false && + screen->model().isEmpty() == false ) + { + displayName += QStringLiteral(" – %1 %2").arg( screen->manufacturer(), screen->model() ); + } +#endif + + auto flags = Feature::Option | Feature::Master; + if( index == m_screenSelection ) + { + flags |= Feature::Checked; + } + + m_screenSelectionFeatures.append( Feature{ name, flags, + Feature::Uid::createUuidV5( m_demoFeature.uid(), name ), + m_demoFeature.uid(), displayName, {}, {}, {} } ); + ++index; + } + } + + m_features = m_staticFeatures + m_screenSelectionFeatures; + + const auto master = VeyonCore::instance()->findChild(); + if( master ) + { + master->reloadSubFeatures(); + } +} + + + + +QRect DemoFeaturePlugin::viewportFromScreenSelection() const +{ + if( m_screenSelection <= ScreenSelectionNone ) + { + return {}; + } + + const auto screen = m_screens.value( m_screenSelection - 1 ); + if( screen ) + { + return screen->geometry(); + } + + return {}; +} + + + bool DemoFeaturePlugin::controlDemoServer( Operation operation, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ) { @@ -445,6 +567,11 @@ bool DemoFeaturePlugin::controlDemoClient( Feature::Uid featureUid, Operation op arguments.value( argToString(Argument::ViewportHeight) ).toInt() }; + if( viewport.isNull() || viewport.isEmpty() ) + { + viewport = viewportFromScreenSelection(); + } + const auto disableUpdates = m_configuration.slowDownThumbnailUpdates(); for( const auto& computerControlInterface : computerControlInterfaces ) diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 2a4dd70ca..cc16d08fc 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -24,12 +24,16 @@ #pragma once +#include + #include "AuthenticationPluginInterface.h" #include "ConfigurationPagePluginInterface.h" #include "DemoAuthentication.h" #include "DemoConfiguration.h" #include "FeatureProviderInterface.h" +class QScreen; + class DemoServer; class DemoClient; @@ -112,6 +116,15 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf ConfigurationPage* createConfigurationPage() override; private: + static constexpr auto ScreenSelectionNone = 0; + + void addScreen( QScreen* screen ); + void removeScreen( QScreen* screen ); + + void updateFeatures(); + + QRect viewportFromScreenSelection() const; + bool controlDemoServer( Operation operation, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ); bool controlDemoClient( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, @@ -132,7 +145,12 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf const Feature m_shareUserScreenFullScreenFeature; const Feature m_shareUserScreenWindowFeature; const Feature m_demoServerFeature; - const FeatureList m_features; + const FeatureList m_staticFeatures{}; + FeatureList m_features{}; + + FeatureList m_screenSelectionFeatures{}; + int m_screenSelection{ScreenSelectionNone}; + QList m_screens{QGuiApplication::screens()}; DemoConfiguration m_configuration; From c4b186710ff97363e3319a36818ff6ae4d274b5c Mon Sep 17 00:00:00 2001 From: Michael Wehr Date: Thu, 12 Nov 2020 11:53:09 +0100 Subject: [PATCH 0701/1765] RemoteAccess: show username in window title --- plugins/remoteaccess/RemoteAccessWidget.cpp | 21 +++++++++++++++++++-- plugins/remoteaccess/RemoteAccessWidget.h | 2 +- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index d0ad59174..9a829c695 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -252,8 +252,9 @@ RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& m_vncView( new VncViewWidget( computerControlInterface->computer().hostAddress(), -1, this, VncView::RemoteControlMode ) ), m_toolBar( new RemoteAccessWidgetToolBar( this, startViewOnly, showViewOnlyToggleButton ) ) { - setWindowTitle( tr( "%1 - %2 Remote Access" ).arg( computerControlInterface->computer().name(), - VeyonCore::applicationName() ) ); + updateRemoteAccessTitle(); + connect( m_computerControlInterface.data(), &ComputerControlInterface::userChanged, this, &RemoteAccessWidget::updateRemoteAccessTitle ); + setWindowIcon( QPixmap( QStringLiteral(":/remoteaccess/kmag.png") ) ); setAttribute( Qt::WA_DeleteOnClose, true ); @@ -372,3 +373,19 @@ void RemoteAccessWidget::takeScreenshot() { Screenshot().take( m_computerControlInterface ); } + + + +void RemoteAccessWidget::updateRemoteAccessTitle() +{ + if ( m_computerControlInterface->userFullName().isEmpty() ) + { + setWindowTitle( tr( "%1 - %2 Remote Access" ).arg( m_computerControlInterface->computer().name(), + VeyonCore::applicationName() ) ); + } else + { + setWindowTitle( tr( "%1 - %2 - %3 Remote Access" ).arg( m_computerControlInterface->userFullName(), + m_computerControlInterface->computer().name(), + VeyonCore::applicationName() ) ); + } +} diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index 95fb45e65..2c4101c2a 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -96,7 +96,6 @@ class RemoteAccessWidget : public QWidget void toggleViewOnly( bool viewOnly ); void takeScreenshot(); - protected: bool eventFilter( QObject* object, QEvent* event ) override; void enterEvent( QEvent* event ) override; @@ -105,6 +104,7 @@ class RemoteAccessWidget : public QWidget private: void updateSize(); + void updateRemoteAccessTitle(); ComputerControlInterface::Pointer m_computerControlInterface; VncViewWidget* m_vncView; From 08b7a0529611a9fa2bcc205d714e92c2fe30f7b0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Nov 2020 19:46:03 +0100 Subject: [PATCH 0702/1765] MasterConfigurationPage: fix minor UI issues --- configurator/src/MasterConfigurationPage.ui | 176 ++++++++++---------- 1 file changed, 85 insertions(+), 91 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 6043d4b81..1dbd86a19 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -82,14 +82,11 @@ User interface - - - - - + + - User and computer name + Computer and user name @@ -104,39 +101,6 @@ - - - - px - - - - - - 2 - - - 50 - - - 16 - - - - - - - Computer thumbnail caption - - - - - - - Sort order - - - @@ -156,99 +120,135 @@ - - + + - Background color + Sort order - - + + - Computer and user name + Auto - Only user name + 16:9 - Only computer name + 16:10 + + + + + 3:2 + + + + + 4:3 - - + + - Thumbnail spacing + Background color - - - - Thumbnail update interval + + + + px + + + + + + 2 + + + 50 + + + 16 - - + + + + + - Text color + Thumbnail aspect ratio - - + + + + Computer thumbnail caption + + - - + + - Use modern user interface (experimental) + Thumbnail spacing - - + + - Thumbnail aspect ratio + Text color - - - - - Auto - - - - - 16:9 - - + + + + + - 16:10 + User and computer name - 3:2 + Only user name - 4:3 + Only computer name + + + + Thumbnail update interval + + + + + + + Use modern user interface (experimental) + + + @@ -455,23 +455,17 @@ - - ... - - - :/configurator/go-next.png:/configurator/go-next.png + + :/core/go-next.png:/core/go-next.png - - ... - - - :/configurator/go-previous.png:/configurator/go-previous.png + + :/core/go-previous.png:/core/go-previous.png @@ -507,7 +501,6 @@ screenshotDirectory openUserConfigurationDirectory openScreenshotDirectory - modernUserInterface computerMonitoringUpdateInterval computerMonitoringAspectRatio computerMonitoringBackgroundColor @@ -515,6 +508,7 @@ computerDisplayRoleContent computerMonitoringSortOrder computerMonitoringThumbnailSpacing + modernUserInterface accessControlForMasterEnabled autoSelectCurrentLocation autoAdjustGridSize From 567a66395ec4a74573a69f1d6b9a60fab5c29f10 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Nov 2020 19:49:18 +0100 Subject: [PATCH 0703/1765] Drop unused placeholder texts for tool buttons --- configurator/src/GeneralConfigurationPage.ui | 11 ----------- configurator/src/MasterConfigurationPage.ui | 6 ------ plugins/authkeys/AuthKeysConfigurationWidget.ui | 6 ------ plugins/filetransfer/FileTransferConfigurationPage.ui | 6 ------ 4 files changed, 29 deletions(-) diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index e56f4c309..24c48710e 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -2,14 +2,6 @@ GeneralConfigurationPage - - - 0 - 0 - 631 - 858 - - 0 @@ -120,9 +112,6 @@ - - ... - :/core/document-open.png:/core/document-open.png diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 1dbd86a19..e342b5d64 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -33,9 +33,6 @@ - - ... - :/core/document-open.png:/core/document-open.png @@ -64,9 +61,6 @@ - - ... - :/core/document-open.png:/core/document-open.png diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.ui b/plugins/authkeys/AuthKeysConfigurationWidget.ui index 7156fd10f..90d9a7a89 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.ui +++ b/plugins/authkeys/AuthKeysConfigurationWidget.ui @@ -130,9 +130,6 @@ - - ... - :/core/document-open.png:/core/document-open.png @@ -141,9 +138,6 @@ - - ... - :/core/document-open.png:/core/document-open.png diff --git a/plugins/filetransfer/FileTransferConfigurationPage.ui b/plugins/filetransfer/FileTransferConfigurationPage.ui index bea767308..67c7cf994 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.ui +++ b/plugins/filetransfer/FileTransferConfigurationPage.ui @@ -34,9 +34,6 @@ - - ... - :/core/document-open.png:/core/document-open.png @@ -45,9 +42,6 @@ - - ... - :/core/document-open.png:/core/document-open.png From da46553961c3aa03b25f489d3760de927f32aeed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Nov 2020 09:41:08 +0100 Subject: [PATCH 0704/1765] Make public API key names camelCase --- core/src/EnumHelper.h | 9 ++++++++- core/src/FeatureProviderInterface.h | 2 +- core/src/NetworkObject.cpp | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/core/src/EnumHelper.h b/core/src/EnumHelper.h index 4ec0b8383..8b7131d13 100644 --- a/core/src/EnumHelper.h +++ b/core/src/EnumHelper.h @@ -32,9 +32,16 @@ class EnumHelper { public: template - static QString itemName( T item ) + static QString toString( T item ) { return QLatin1String( QMetaEnum::fromType().key( static_cast( item ) ) ); } + template + static QString toCamelCaseString( T item ) + { + const auto name = toString( item ); + return name.mid( 0 ).toLower() + name.mid( 1 ); + } + } ; diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index 0ed95876d..831444e43 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -72,7 +72,7 @@ class VEYON_CORE_EXPORT FeatureProviderInterface template static QString argToString( T item ) { - return EnumHelper::itemName( item ).toLower(); + return EnumHelper::toCamelCaseString( item ).toLower(); } /*! diff --git a/core/src/NetworkObject.cpp b/core/src/NetworkObject.cpp index 46b6d902b..aa31d5c7b 100644 --- a/core/src/NetworkObject.cpp +++ b/core/src/NetworkObject.cpp @@ -163,7 +163,7 @@ QVariant NetworkObject::property( Property property ) const QString NetworkObject::propertyKey( Property property ) { - return EnumHelper::itemName(property); + return EnumHelper::toString(property); } From 81581ac40298e7e270a31d38951b5595ed32ce28 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Nov 2020 13:44:24 +0100 Subject: [PATCH 0705/1765] ComputerMonitoring: refactor icon size auto adjust Adjusting icon sizes automatically is now a mode instead of an action so when enabled, the icon size is adjusted automatically on any resize or data model changes. --- configurator/src/MasterConfigurationPage.ui | 4 +- core/src/VeyonConfiguration.cpp | 1 + core/src/VeyonConfigurationProperties.h | 3 +- master/src/ComputerMonitoringItem.cpp | 12 +--- master/src/ComputerMonitoringItem.h | 2 - master/src/ComputerMonitoringView.cpp | 42 +++++++++++- master/src/ComputerMonitoringView.h | 20 +++++- master/src/ComputerMonitoringWidget.cpp | 73 +++++++++++++-------- master/src/ComputerMonitoringWidget.h | 6 +- master/src/MainWindow.cpp | 11 +++- master/src/MainWindow.ui | 9 ++- master/src/SlideshowPanel.cpp | 1 + master/src/SpotlightPanel.cpp | 1 + master/src/UserConfig.h | 1 + 14 files changed, 134 insertions(+), 52 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index e342b5d64..5bb2ff4da 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -287,9 +287,9 @@ - + - Automatically adjust computer thumbnail size + Automatically adjust computer icon size diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index c70538f00..a94bc049a 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -64,6 +64,7 @@ void VeyonConfiguration::upgrade() setVeyonServerPort( legacyPrimaryServicePort() ); setHideLocalComputer( legacyLocalComputerHidden() ); setHideComputerFilter( legacyComputerFilterHidden() ); + setAutoAdjustMonitoringIconSize( legacyAutoAdjustGridSize() ); setApplicationVersion( VeyonCore::ApplicationVersion::Version_4_5 ); } diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index bf80548f0..d113cd98c 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -107,7 +107,7 @@ OP( VeyonConfiguration, VeyonCore::config(), QColor, computerMonitoringBackgroundColor, setComputerMonitoringBackgroundColor, "ComputerMonitoringBackgroundColor", "Master", QColor(Qt::white), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QColor, computerMonitoringTextColor, setComputerMonitoringTextColor, "ComputerMonitoringTextColor", "Master", QColor(Qt::black), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, accessControlForMasterEnabled, setAccessControlForMasterEnabled, "AccessControlForMasterEnabled", "Master", false, Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), bool, autoAdjustGridSize, setAutoAdjustGridSize, "AutoAdjustGridSize", "Master", false, Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, autoAdjustMonitoringIconSize, setAutoAdjustMonitoringIconSize, "AutoAdjustMonitoringIconSize", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, autoSelectCurrentLocation, setAutoSelectCurrentLocation, "AutoSelectCurrentLocation", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, showCurrentLocationOnly, setShowCurrentLocationOnly, "ShowCurrentLocationOnly", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, allowAddingHiddenLocations, setAllowAddingHiddenLocations, "AllowAddingHiddenLocations", "Master", false, Configuration::Property::Flag::Standard ) \ @@ -132,6 +132,7 @@ OP( VeyonConfiguration, VeyonCore::config(), QJsonArray, accessControlRules, setAccessControlRules, "AccessControlRules", "AccessControl", QJsonArray(), Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_LEGACY_CONFIG_PROPERTY(OP) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, legacyAutoAdjustGridSize, setLegacyAutoAdjustGridSize, "AutoAdjustGridSize", "Master", false, Configuration::Property::Flag::Legacy ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, legacyOpenComputerManagementAtStart, setLegacyOpenComputerManagementAtStart, "OpenComputerManagementAtStart", "Master", false, Configuration::Property::Flag::Legacy ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, legacyAutoSwitchToCurrentRoom, setLegacyAutoSwitchToCurrentRoom, "AutoSwitchToCurrentRoom", "Master", false, Configuration::Property::Flag::Legacy ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, legacyOnlyCurrentRoomVisible, setLegacyOnlyCurrentRoomVisible, "OnlyCurrentRoomVisible", "Master", false, Configuration::Property::Flag::Legacy ) \ diff --git a/master/src/ComputerMonitoringItem.cpp b/master/src/ComputerMonitoringItem.cpp index db8c12d50..7a3accaa6 100644 --- a/master/src/ComputerMonitoringItem.cpp +++ b/master/src/ComputerMonitoringItem.cpp @@ -56,11 +56,11 @@ ComputerControlInterfaceList ComputerMonitoringItem::selectedComputerControlInte void ComputerMonitoringItem::componentComplete() { - initializeView(); + initializeView( this ); - if( VeyonCore::config().autoAdjustGridSize() ) + if( VeyonCore::config().autoAdjustMonitoringIconSize() ) { - autoAdjustComputerScreenSize(); + initiateIconSizeAutoAdjust(); } QQuickItem::componentComplete(); @@ -68,12 +68,6 @@ void ComputerMonitoringItem::componentComplete() -void ComputerMonitoringItem::autoAdjustComputerScreenSize() -{ -} - - - void ComputerMonitoringItem::setUseCustomComputerPositions( bool enabled ) { } diff --git a/master/src/ComputerMonitoringItem.h b/master/src/ComputerMonitoringItem.h index aa99e7483..f40e88b78 100644 --- a/master/src/ComputerMonitoringItem.h +++ b/master/src/ComputerMonitoringItem.h @@ -57,8 +57,6 @@ class ComputerMonitoringItem : public QQuickItem, public ComputerMonitoringView void componentComplete() override; - void autoAdjustComputerScreenSize(); - void setUseCustomComputerPositions( bool enabled ) override; void alignComputers() override; diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index d9a3c6c47..1a05db2df 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -35,12 +35,23 @@ ComputerMonitoringView::ComputerMonitoringView() : m_master( VeyonCore::instance()->findChild() ) { + m_autoAdjustIconSize = VeyonCore::config().autoAdjustMonitoringIconSize() || + master()->userConfig().autoAdjustMonitoringIconSize(); + + m_iconSizeAutoAdjustTimer.setInterval( IconSizeAdjustDelay ); + m_iconSizeAutoAdjustTimer.setSingleShot( true ); } -void ComputerMonitoringView::initializeView() +void ComputerMonitoringView::initializeView( QObject* self ) { + const auto autoAdjust = [this]() { performIconSizeAutoAdjust(); }; + + QObject::connect( &m_iconSizeAutoAdjustTimer, &QTimer::timeout, self, autoAdjust ); + QObject::connect( dataModel(), &ComputerMonitoringModel::rowsInserted, self, autoAdjust ); + QObject::connect( dataModel(), &ComputerMonitoringModel::rowsRemoved, self, autoAdjust ); + setColors( VeyonCore::config().computerMonitoringBackgroundColor(), VeyonCore::config().computerMonitoringTextColor() ); @@ -136,6 +147,35 @@ int ComputerMonitoringView::computerScreenSize() const +void ComputerMonitoringView::setAutoAdjustIconSize( bool enabled ) +{ + m_autoAdjustIconSize = enabled; + + if( m_autoAdjustIconSize ) + { + performIconSizeAutoAdjust(); + } +} + + + +bool ComputerMonitoringView::performIconSizeAutoAdjust() +{ + m_iconSizeAutoAdjustTimer.stop(); + + return m_autoAdjustIconSize && dataModel()->rowCount() > 0; +} + + + + +void ComputerMonitoringView::initiateIconSizeAutoAdjust() +{ + m_iconSizeAutoAdjustTimer.start(); +} + + + void ComputerMonitoringView::runFeature( const Feature& feature ) { auto computerControlInterfaces = selectedComputerControlInterfaces(); diff --git a/master/src/ComputerMonitoringView.h b/master/src/ComputerMonitoringView.h index 4793e57ed..f38fcfe32 100644 --- a/master/src/ComputerMonitoringView.h +++ b/master/src/ComputerMonitoringView.h @@ -24,6 +24,8 @@ #pragma once +#include + #include "ComputerControlInterface.h" class ComputerMonitoringModel; @@ -38,10 +40,13 @@ class ComputerMonitoringView static constexpr int MaximumComputerScreenSize = 1000; static constexpr int DefaultComputerScreenSize = 150; + static constexpr auto IconSizeAdjustStepSize = 10; + static constexpr auto IconSizeAdjustDelay = 250; + ComputerMonitoringView(); virtual ~ComputerMonitoringView() = default; - void initializeView(); + void initializeView( QObject* self ); void saveConfiguration(); @@ -63,6 +68,12 @@ class ComputerMonitoringView virtual void alignComputers() = 0; + bool autoAdjustIconSize() const + { + return m_autoAdjustIconSize; + } + void setAutoAdjustIconSize( bool enabled ); + protected: virtual void setColors( const QColor& backgroundColor, const QColor& textColor ) = 0; virtual QJsonArray saveComputerPositions() = 0; @@ -71,6 +82,10 @@ class ComputerMonitoringView virtual void setUseCustomComputerPositions( bool enabled ) = 0; virtual void setIconSize( const QSize& size ) = 0; + virtual bool performIconSizeAutoAdjust(); + + void initiateIconSizeAutoAdjust(); + VeyonMaster* master() const { return m_master; @@ -85,4 +100,7 @@ class ComputerMonitoringView VeyonMaster* m_master{nullptr}; int m_computerScreenSize{DefaultComputerScreenSize}; + bool m_autoAdjustIconSize{false}; + QTimer m_iconSizeAutoAdjustTimer{}; + }; diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index fe094d61d..c8b02880f 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include "ComputerControlListModel.h" #include "ComputerMonitoringWidget.h" @@ -62,7 +61,7 @@ ComputerMonitoringWidget::ComputerMonitoringWidget( QWidget *parent ) : connect( this, &QListView::customContextMenuRequested, this, [this]( QPoint pos ) { showContextMenu( mapToGlobal( pos ) ); } ); - initializeView(); + initializeView( this ); setModel( dataModel() ); } @@ -87,41 +86,48 @@ ComputerControlInterfaceList ComputerMonitoringWidget::selectedComputerControlIn -void ComputerMonitoringWidget::autoAdjustComputerScreenSize() +bool ComputerMonitoringWidget::performIconSizeAutoAdjust() { - int size = iconSize().width(); - - if( verticalScrollBar()->isVisible() || - horizontalScrollBar()->isVisible() ) + if( ComputerMonitoringView::performIconSizeAutoAdjust() == false) { - while( ( verticalScrollBar()->isVisible() || - horizontalScrollBar()->isVisible() ) && - size > MinimumComputerScreenSize ) - { - size -= 10; - setComputerScreenSize( size ); - QApplication::processEvents(); - } + return false; } - else + + m_ignoreResizeEvent = true; + + auto size = iconSize().width(); + + setComputerScreenSize( size ); + QApplication::processEvents(); + + while( verticalScrollBar()->isVisible() == false && + horizontalScrollBar()->isVisible() == false && + size < MaximumComputerScreenSize ) { - while( verticalScrollBar()->isVisible() == false && - horizontalScrollBar()->isVisible() == false && - size < MaximumComputerScreenSize ) - { - size += 10; - setComputerScreenSize( size ); - QApplication::processEvents(); - } + size += IconSizeAdjustStepSize; + setComputerScreenSize( size ); + QApplication::processEvents(); + } - setComputerScreenSize( size-20 ); + while( ( verticalScrollBar()->isVisible() || + horizontalScrollBar()->isVisible() ) && + size > MinimumComputerScreenSize ) + { + size -= IconSizeAdjustStepSize; + setComputerScreenSize( size ); + QApplication::processEvents(); } Q_EMIT computerScreenSizeAdjusted( size ); + + m_ignoreResizeEvent = false; + + return true; } + void ComputerMonitoringWidget::setUseCustomComputerPositions( bool enabled ) { setFlexible( enabled ); @@ -266,12 +272,23 @@ void ComputerMonitoringWidget::runDoubleClickFeature( const QModelIndex& index ) +void ComputerMonitoringWidget::resizeEvent( QResizeEvent* event ) +{ + FlexibleListView::resizeEvent( event ); + + if( m_ignoreResizeEvent == false ) + { + initiateIconSizeAutoAdjust(); + } +} + + + void ComputerMonitoringWidget::showEvent( QShowEvent* event ) { - if( event->spontaneous() == false && - VeyonCore::config().autoAdjustGridSize() ) + if( event->spontaneous() == false ) { - QTimer::singleShot( 250, this, &ComputerMonitoringWidget::autoAdjustComputerScreenSize ); + initiateIconSizeAutoAdjust(); } FlexibleListView::showEvent( event ); diff --git a/master/src/ComputerMonitoringWidget.h b/master/src/ComputerMonitoringWidget.h index 148187bea..d3d73979e 100644 --- a/master/src/ComputerMonitoringWidget.h +++ b/master/src/ComputerMonitoringWidget.h @@ -40,8 +40,6 @@ class ComputerMonitoringWidget : public FlexibleListView, public ComputerMonitor ComputerControlInterfaceList selectedComputerControlInterfaces() const override; - void autoAdjustComputerScreenSize(); - void setUseCustomComputerPositions( bool enabled ) override; void alignComputers() override; @@ -60,17 +58,21 @@ class ComputerMonitoringWidget : public FlexibleListView, public ComputerMonitor bool useCustomComputerPositions() override; void loadComputerPositions( const QJsonArray& positions ) override; + bool performIconSizeAutoAdjust() override; + void populateFeatureMenu( const ComputerControlInterfaceList& computerControlInterfaces ); void addFeatureToMenu( const Feature& feature, const QString& label ); void addSubFeaturesToMenu( const Feature& parentFeature, const FeatureList& subFeatures, const QString& label ); void runDoubleClickFeature( const QModelIndex& index ); + void resizeEvent( QResizeEvent* event ) override; void showEvent( QShowEvent* event ) override; void wheelEvent( QWheelEvent* event ) override; QMenu* m_featureMenu{}; bool m_ignoreWheelEvent{false}; + bool m_ignoreResizeEvent{false}; Q_SIGNALS: void computerScreenSizeAdjusted( int size ); diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 36b1077e7..78c88e724 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -72,7 +72,7 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : ui->statusBar->addWidget( ui->filterPoweredOnComputersButton ); ui->statusBar->addWidget( ui->spacerLabel2, 1 ); ui->statusBar->addWidget( ui->gridSizeSlider, 2 ); - ui->statusBar->addWidget( ui->autoFitButton ); + ui->statusBar->addWidget( ui->autoAdjustComputerIconSizeButton ); ui->statusBar->addWidget( ui->spacerLabel3 ); ui->statusBar->addWidget( ui->useCustomComputerArrangementButton ); ui->statusBar->addWidget( ui->alignComputersButton ); @@ -199,12 +199,17 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : ui->gridSizeSlider->setMaximum( ComputerMonitoringWidget::MaximumComputerScreenSize ); ui->gridSizeSlider->setValue( ui->computerMonitoringWidget->computerScreenSize() ); + ui->autoAdjustComputerIconSizeButton->setChecked( ui->computerMonitoringWidget->autoAdjustIconSize() ); + connect( ui->gridSizeSlider, &QSlider::valueChanged, this, [this]( int size ) { ui->computerMonitoringWidget->setComputerScreenSize( size ); } ); connect( ui->computerMonitoringWidget, &ComputerMonitoringWidget::computerScreenSizeAdjusted, ui->gridSizeSlider, &QSlider::setValue ); - connect( ui->autoFitButton, &QToolButton::clicked, - ui->computerMonitoringWidget, &ComputerMonitoringWidget::autoAdjustComputerScreenSize ); + connect( ui->autoAdjustComputerIconSizeButton, &QToolButton::toggled, + this, [this]( bool enabled ) { + ui->computerMonitoringWidget->setAutoAdjustIconSize( enabled ); + m_master.userConfig().setAutoAdjustMonitoringIconSize( enabled ); + } ); // initialize computer placement controls ui->useCustomComputerArrangementButton->setChecked( m_master.userConfig().useCustomComputerPositions() ); diff --git a/master/src/MainWindow.ui b/master/src/MainWindow.ui index 2cb985348..d444fb832 100644 --- a/master/src/MainWindow.ui +++ b/master/src/MainWindow.ui @@ -36,7 +36,7 @@ - + 890 @@ -46,7 +46,7 @@ - Adjust optimal size + Adjust size of computer icons automatically Auto @@ -61,6 +61,9 @@ 32 + + true + @@ -132,7 +135,7 @@ - 910 + 940 570 99 30 diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index 21d2e99e1..c9f1e6d04 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -39,6 +39,7 @@ SlideshowPanel::SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* co { ui->setupUi( this ); + ui->list->setAutoAdjustIconSize( false ); ui->list->setUseCustomComputerPositions( false ); ui->list->setAcceptDrops( false ); ui->list->setDragEnabled( false ); diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index 7d7146ae0..e33ef97aa 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -43,6 +43,7 @@ SpotlightPanel::SpotlightPanel( UserConfig& config, ComputerMonitoringWidget* co { ui->setupUi( this ); + ui->list->setAutoAdjustIconSize( false ); ui->list->setUseCustomComputerPositions( false ); ui->list->setAcceptDrops( false ); ui->list->setDragEnabled( false ); diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index e66589ad9..56265fb95 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -47,6 +47,7 @@ class UserConfig : public Configuration::Object OP( UserConfig, VeyonMaster::userConfig(), bool, useCustomComputerPositions, setUseCustomComputerPositions, "UseCustomComputerPositions", "UI", false, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), bool, filterPoweredOnComputers, setFilterPoweredOnComputers, "FilterPoweredOnComputers", "UI", false, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), int, monitoringScreenSize, setMonitoringScreenSize, "MonitoringScreenSize", "UI", ComputerMonitoringView::DefaultComputerScreenSize, Configuration::Property::Flag::Standard ) \ + OP( UserConfig, VeyonMaster::userConfig(), bool, autoAdjustMonitoringIconSize, setAutoAdjustMonitoringIconSize, "AutoAdjustMonitoringIconSize", "UI", false, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), int, slideshowDuration, setSlideshowDuration, "SlideshowDuration", "UI", SlideshowPanel::DefaultDuration, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), bool, spotlightRealtime, setSpotlightRealtime, "SpotlightRealtime", "UI", true, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), int, defaultRole, setDefaultRole, "DefaultRole", "Authentication", 0, Configuration::Property::Flag::Standard ) \ From 77aadc0266417c83e54b99c7b8ecaddbcd9cde82 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Nov 2020 14:16:19 +0100 Subject: [PATCH 0706/1765] Slideshow, Spotlight: improve UI element naming --- master/src/SlideshowPanel.cpp | 24 +++++++++++----------- master/src/SlideshowPanel.ui | 6 +----- master/src/SpotlightModel.cpp | 4 ++-- master/src/SpotlightPanel.cpp | 38 +++++++++++++++++------------------ master/src/SpotlightPanel.h | 2 +- master/src/SpotlightPanel.ui | 6 +----- 6 files changed, 36 insertions(+), 44 deletions(-) diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index c9f1e6d04..6b24f353b 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -39,15 +39,15 @@ SlideshowPanel::SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* co { ui->setupUi( this ); - ui->list->setAutoAdjustIconSize( false ); - ui->list->setUseCustomComputerPositions( false ); - ui->list->setAcceptDrops( false ); - ui->list->setDragEnabled( false ); - ui->list->setIgnoreWheelEvent( true ); - ui->list->setSelectionMode( QListView::SingleSelection ); - ui->list->setModel( m_model ); + ui->monitoringWidget->setAutoAdjustIconSize( false ); + ui->monitoringWidget->setUseCustomComputerPositions( false ); + ui->monitoringWidget->setAcceptDrops( false ); + ui->monitoringWidget->setDragEnabled( false ); + ui->monitoringWidget->setIgnoreWheelEvent( true ); + ui->monitoringWidget->setSelectionMode( QListView::SingleSelection ); + ui->monitoringWidget->setModel( m_model ); - connect( ui->list, &QListView::iconSizeChanged, m_model, &SlideshowModel::setIconSize ); + connect( ui->monitoringWidget, &QListView::iconSizeChanged, m_model, &SlideshowModel::setIconSize ); connect( ui->startStopButton, &QAbstractButton::toggled, this, &SlideshowPanel::updateDuration ); connect( ui->durationSlider, &QSlider::valueChanged, this, &SlideshowPanel::updateDuration ); @@ -73,11 +73,11 @@ void SlideshowPanel::resizeEvent( QResizeEvent* event ) { static constexpr auto ExtraMargin = 10; - const auto spacing = ui->list->spacing(); - const auto labelHeight = ui->list->fontMetrics().height(); + const auto spacing = ui->monitoringWidget->spacing(); + const auto labelHeight = ui->monitoringWidget->fontMetrics().height(); - ui->list->setIconSize( { ui->list->width() - ExtraMargin - spacing * 2, - ui->list->height() - ExtraMargin - labelHeight - spacing * 2 } ); + ui->monitoringWidget->setIconSize( { ui->monitoringWidget->width() - ExtraMargin - spacing * 2, + ui->monitoringWidget->height() - ExtraMargin - labelHeight - spacing * 2 } ); QWidget::resizeEvent( event ); } diff --git a/master/src/SlideshowPanel.ui b/master/src/SlideshowPanel.ui index 7c90cdeae..8b6a8bd48 100644 --- a/master/src/SlideshowPanel.ui +++ b/master/src/SlideshowPanel.ui @@ -19,11 +19,7 @@ 0 - - - QListView::Static - - + diff --git a/master/src/SpotlightModel.cpp b/master/src/SpotlightModel.cpp index 03d9c39ea..be947ad87 100644 --- a/master/src/SpotlightModel.cpp +++ b/master/src/SpotlightModel.cpp @@ -107,6 +107,6 @@ QVariant SpotlightModel::data( const QModelIndex& index, int role ) const bool SpotlightModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { return m_controlInterfaces.contains( sourceModel()->data( sourceModel()->index( sourceRow, 0, sourceParent ), - ComputerListModel::ControlInterfaceRole ) - .value() ); + ComputerListModel::ControlInterfaceRole ) + .value() ); } diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index e33ef97aa..7fea3a39d 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -38,24 +38,24 @@ SpotlightPanel::SpotlightPanel( UserConfig& config, ComputerMonitoringWidget* co QWidget( parent ), ui( new Ui::SpotlightPanel ), m_config( config ), - m_computerMonitoringWidget( computerMonitoringWidget ), - m_model( new SpotlightModel( m_computerMonitoringWidget->dataModel(), this ) ) + m_globalComputerMonitoringWidget( computerMonitoringWidget ), + m_model( new SpotlightModel( m_globalComputerMonitoringWidget->dataModel(), this ) ) { ui->setupUi( this ); - ui->list->setAutoAdjustIconSize( false ); - ui->list->setUseCustomComputerPositions( false ); - ui->list->setAcceptDrops( false ); - ui->list->setDragEnabled( false ); - ui->list->setIgnoreWheelEvent( true ); - ui->list->setModel( m_model ); + ui->monitoringWidget->setAutoAdjustIconSize( false ); + ui->monitoringWidget->setUseCustomComputerPositions( false ); + ui->monitoringWidget->setAcceptDrops( false ); + ui->monitoringWidget->setDragEnabled( false ); + ui->monitoringWidget->setIgnoreWheelEvent( true ); + ui->monitoringWidget->setModel( m_model ); connect( ui->addButton, &QAbstractButton::clicked, this, &SpotlightPanel::add ); connect( ui->removeButton, &QAbstractButton::clicked, this, &SpotlightPanel::remove ); connect( ui->realtimeViewButton, &QAbstractButton::toggled, this, &SpotlightPanel::setRealtimeView ); - connect( m_computerMonitoringWidget, &QAbstractItemView::pressed, this, &SpotlightPanel::addPressedItem ); - connect( ui->list, &QAbstractItemView::pressed, this, &SpotlightPanel::removePressedItem ); + connect( m_globalComputerMonitoringWidget, &QAbstractItemView::pressed, this, &SpotlightPanel::addPressedItem ); + connect( ui->monitoringWidget, &QAbstractItemView::pressed, this, &SpotlightPanel::removePressedItem ); connect( m_model, &QAbstractItemModel::rowsRemoved, this, [=]() { if( m_model->rowCount() <= 0 ) @@ -87,7 +87,7 @@ void SpotlightPanel::resizeEvent( QResizeEvent* event ) void SpotlightPanel::add() { - const auto selectedComputerControlInterfaces = m_computerMonitoringWidget->selectedComputerControlInterfaces(); + const auto selectedComputerControlInterfaces = m_globalComputerMonitoringWidget->selectedComputerControlInterfaces(); if( selectedComputerControlInterfaces.isEmpty() ) { @@ -114,7 +114,7 @@ void SpotlightPanel::add() void SpotlightPanel::remove() { - const auto selection = ui->list->selectionModel()->selectedIndexes(); + const auto selection = ui->monitoringWidget->selectionModel()->selectedIndexes(); if( selection.isEmpty() ) { QMessageBox::information( this, tr("Spotlight"), @@ -146,12 +146,12 @@ void SpotlightPanel::updateIconSize() { static constexpr auto ExtraMargin = 10; - const auto spacing = ui->list->spacing(); - const auto labelHeight = ui->list->fontMetrics().height(); + const auto spacing = ui->monitoringWidget->spacing(); + const auto labelHeight = ui->monitoringWidget->fontMetrics().height(); - ui->list->setIconSize( { ui->list->width() - ExtraMargin - spacing * 2, - ui->list->height() - ExtraMargin - labelHeight - spacing * 2 } ); - m_model->setIconSize( ui->list->iconSize() ); + ui->monitoringWidget->setIconSize( { ui->monitoringWidget->width() - ExtraMargin - spacing * 2, + ui->monitoringWidget->height() - ExtraMargin - labelHeight - spacing * 2 } ); + m_model->setIconSize( ui->monitoringWidget->iconSize() ); } @@ -160,7 +160,7 @@ void SpotlightPanel::addPressedItem( const QModelIndex& index ) { if( QGuiApplication::mouseButtons().testFlag( Qt::MidButton ) ) { - m_computerMonitoringWidget->selectionModel()->select( index, QItemSelectionModel::SelectCurrent ); + m_globalComputerMonitoringWidget->selectionModel()->select( index, QItemSelectionModel::SelectCurrent ); add(); } @@ -172,7 +172,7 @@ void SpotlightPanel::removePressedItem( const QModelIndex& index ) { if( QGuiApplication::mouseButtons().testFlag( Qt::MidButton ) ) { - ui->list->selectionModel()->select( index, QItemSelectionModel::SelectCurrent ); + ui->monitoringWidget->selectionModel()->select( index, QItemSelectionModel::SelectCurrent ); remove(); } diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index d24ec8f8f..12945cad5 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -58,7 +58,7 @@ class SpotlightPanel : public QWidget UserConfig& m_config; - ComputerMonitoringWidget* m_computerMonitoringWidget; + ComputerMonitoringWidget* m_globalComputerMonitoringWidget; SpotlightModel* m_model; } ; diff --git a/master/src/SpotlightPanel.ui b/master/src/SpotlightPanel.ui index fd0dd5538..6c2fc4b79 100644 --- a/master/src/SpotlightPanel.ui +++ b/master/src/SpotlightPanel.ui @@ -112,11 +112,7 @@ 0 - - - QListView::Static - - + From d28f4859f74936716d1827163b49b00aa2d3a2c9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:01:44 +0100 Subject: [PATCH 0707/1765] Filesystem: inherit from QObject --- core/src/Filesystem.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/Filesystem.h b/core/src/Filesystem.h index 3c52d82d3..c3cc07dc7 100644 --- a/core/src/Filesystem.h +++ b/core/src/Filesystem.h @@ -28,8 +28,9 @@ // clazy:excludeall=rule-of-three -class VEYON_CORE_EXPORT Filesystem +class VEYON_CORE_EXPORT Filesystem : public QObject { + Q_OBJECT public: QString expandPath( QString path ) const; QString shrinkPath( QString path ) const; From 3b7bfdc510fa5a926e61788d8e3921f7115e8d43 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:02:10 +0100 Subject: [PATCH 0708/1765] Filesystem: add screenshotDirectoryPath() --- core/src/Filesystem.cpp | 7 +++++++ core/src/Filesystem.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index 34471afab..9143f58eb 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -128,6 +128,13 @@ bool Filesystem::ensurePathExists( const QString &path ) const +QString Filesystem::screenshotDirectoryPath() const +{ + return expandPath( VeyonCore::config().screenshotDirectory() ); +} + + + QString Filesystem::serviceFilePath() const { return QDir::toNativeSeparators( QCoreApplication::applicationDirPath() + QDir::separator() + diff --git a/core/src/Filesystem.h b/core/src/Filesystem.h index c3cc07dc7..996db7881 100644 --- a/core/src/Filesystem.h +++ b/core/src/Filesystem.h @@ -36,6 +36,8 @@ class VEYON_CORE_EXPORT Filesystem : public QObject QString shrinkPath( QString path ) const; bool ensurePathExists( const QString &path ) const; + QString screenshotDirectoryPath() const; + QString serviceFilePath() const; QString serverFilePath() const; QString workerFilePath() const; From fee7fb442ba8afff740bd16d65e3c19c18b5bcbb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:02:31 +0100 Subject: [PATCH 0709/1765] Filesystem: add screenshotDirectoryModified() signal --- core/src/Filesystem.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/Filesystem.h b/core/src/Filesystem.h index 996db7881..dcccbf376 100644 --- a/core/src/Filesystem.h +++ b/core/src/Filesystem.h @@ -42,4 +42,7 @@ class VEYON_CORE_EXPORT Filesystem : public QObject QString serverFilePath() const; QString workerFilePath() const; +Q_SIGNALS: + void screenshotDirectoryModified(); + }; From c2f12b3c687223ae7a55e5b8f0adf920e55a214f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:02:58 +0100 Subject: [PATCH 0710/1765] Screenshot: use Filesystem::screenshotDirectoryPath() --- core/src/Screenshot.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index c8c4142c2..51b8a50a8 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -58,7 +58,7 @@ void Screenshot::take( const ComputerControlInterface::Pointer& computerControlI userLogin = tr( "unknown" ); } - const auto dir = VeyonCore::filesystem().expandPath( VeyonCore::config().screenshotDirectory() ); + const auto dir = VeyonCore::filesystem().screenshotDirectoryPath(); if( VeyonCore::filesystem().ensurePathExists( dir ) == false ) { From 9f4c6e3593dadd31a3a16bd86a7662a00e14e496 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:03:12 +0100 Subject: [PATCH 0711/1765] Screenshot: emit signal after saving file --- core/src/Screenshot.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index 51b8a50a8..5052063d5 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -146,6 +146,8 @@ void Screenshot::take( const ComputerControlInterface::Pointer& computerControlI m_image.setText( metaDataKey( MetaData::Time ), time ); m_image.save( &outputFile, "PNG", 50 ); + + Q_EMIT VeyonCore::filesystem().screenshotDirectoryModified(); } From 173ded2e6cb9697188dd46b4eb945f535c49fe5f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:04:50 +0100 Subject: [PATCH 0712/1765] ScreenshotManagementPanel: refactor directory updates QFilesystemModel only supports local directories, i.e. it fails to update properly when the screenshot directory is located in a roaming profile or on a network share. Instead the list model is now populated manually. Updates are triggered by both QFilesystemWatcher (which seems to support non-local dirs) and the new Filesystem::screenshotDirectoryModified() signal. Closes #668. --- master/src/ScreenshotManagementPanel.cpp | 59 ++++++++++++++++++------ master/src/ScreenshotManagementPanel.h | 20 ++++++-- master/src/ScreenshotManagementPanel.ui | 6 ++- 3 files changed, 64 insertions(+), 21 deletions(-) diff --git a/master/src/ScreenshotManagementPanel.cpp b/master/src/ScreenshotManagementPanel.cpp index ccbeb0b36..d8cc2b2d2 100644 --- a/master/src/ScreenshotManagementPanel.cpp +++ b/master/src/ScreenshotManagementPanel.cpp @@ -23,8 +23,7 @@ */ #include -#include -#include +#include #include "Filesystem.h" #include "ScreenshotManagementPanel.h" @@ -37,19 +36,23 @@ ScreenshotManagementPanel::ScreenshotManagementPanel( QWidget *parent ) : QWidget( parent ), - ui( new Ui::ScreenshotManagementPanel ), - m_fsModel( this ) + ui( new Ui::ScreenshotManagementPanel ) { ui->setupUi( this ); VeyonCore::filesystem().ensurePathExists( VeyonCore::config().screenshotDirectory() ); - m_fsModel.setNameFilters( { QStringLiteral("*.png") } ); - m_fsModel.setFilter( QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Files ); - m_fsModel.setRootPath( VeyonCore::filesystem().expandPath( VeyonCore::config().screenshotDirectory() ) ); + m_fsWatcher.addPath( VeyonCore::config().screenshotDirectory() ); + connect( &m_fsWatcher, &QFileSystemWatcher::directoryChanged, this, &ScreenshotManagementPanel::updateModel ); - ui->list->setModel( &m_fsModel ); - ui->list->setRootIndex( m_fsModel.index( m_fsModel.rootPath() ) ); + m_reloadTimer.setInterval( FsModelResetDelay ); + m_reloadTimer.setSingleShot( true ); + + connect( &m_reloadTimer, &QTimer::timeout, this, &ScreenshotManagementPanel::updateModel ); + connect( &VeyonCore::filesystem(), &Filesystem::screenshotDirectoryModified, + &m_reloadTimer, QOverload<>::of(&QTimer::start) ); + + ui->list->setModel( &m_model ); connect( ui->list->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &ScreenshotManagementPanel::updateScreenshot ); @@ -57,6 +60,8 @@ ScreenshotManagementPanel::ScreenshotManagementPanel( QWidget *parent ) : connect( ui->showBtn, &QPushButton::clicked, this, &ScreenshotManagementPanel::showScreenshot ); connect( ui->deleteBtn, &QPushButton::clicked, this, &ScreenshotManagementPanel::deleteScreenshot ); + + updateModel(); } @@ -92,19 +97,41 @@ void ScreenshotManagementPanel::resizeEvent( QResizeEvent* event ) -void ScreenshotManagementPanel::updateScreenshot( const QModelIndex &idx ) +void ScreenshotManagementPanel::updateModel() { - setPreview( Screenshot( m_fsModel.filePath( idx ) ) ); + const auto currentFile = m_model.data( ui->list->currentIndex(), Qt::DisplayRole ).toString(); + + const QDir dir{ VeyonCore::filesystem().screenshotDirectoryPath() }; + const auto files = dir.entryList( { QStringLiteral("*.png") }, + QDir::Filter::Files, QDir::SortFlag::Name ); + + m_model.setStringList( files ); + + ui->list->setCurrentIndex( m_model.index( files.indexOf( currentFile ) ) ); } -void ScreenshotManagementPanel::screenshotDoubleClicked( const QModelIndex &idx ) +QString ScreenshotManagementPanel::filePath( const QModelIndex& index ) const +{ + return VeyonCore::filesystem().screenshotDirectoryPath() + QDir::separator() + m_model.data( index, Qt::DisplayRole ).toString(); +} + + + +void ScreenshotManagementPanel::updateScreenshot( const QModelIndex& index ) +{ + setPreview( Screenshot( filePath( index ) ) ); +} + + + +void ScreenshotManagementPanel::screenshotDoubleClicked( const QModelIndex& index ) { auto screenshotWindow = new QLabel; - screenshotWindow->setPixmap( m_fsModel.filePath( idx ) ); + screenshotWindow->setPixmap( filePath( index ) ); screenshotWindow->setScaledContents( true ); - screenshotWindow->setWindowTitle( m_fsModel.fileName( idx ) ); + screenshotWindow->setWindowTitle( QFileInfo( filePath( index ) ).fileName() ); screenshotWindow->setAttribute( Qt::WA_DeleteOnClose, true ); screenshotWindow->showNormal(); } @@ -125,6 +152,8 @@ void ScreenshotManagementPanel::deleteScreenshot() { if( ui->list->currentIndex().isValid() ) { - m_fsModel.remove( ui->list->currentIndex() ); + QFile::remove( filePath( ui->list->currentIndex() ) ); } + + updateModel(); } diff --git a/master/src/ScreenshotManagementPanel.h b/master/src/ScreenshotManagementPanel.h index ad47bd5cb..ab798f5d3 100644 --- a/master/src/ScreenshotManagementPanel.h +++ b/master/src/ScreenshotManagementPanel.h @@ -24,7 +24,9 @@ #pragma once -#include +#include +#include +#include #include class QModelIndex; @@ -47,13 +49,23 @@ class ScreenshotManagementPanel : public QWidget void resizeEvent( QResizeEvent* event ) override; private: - void updateScreenshot( const QModelIndex &idx ); - void screenshotDoubleClicked( const QModelIndex &idx ); + void updateModel(); + + QString filePath( const QModelIndex& index ) const; + + void updateScreenshot( const QModelIndex& index ); + void screenshotDoubleClicked( const QModelIndex& index ); void showScreenshot(); void deleteScreenshot(); Ui::ScreenshotManagementPanel* ui; - QFileSystemModel m_fsModel; + + QStringListModel m_model{this}; + QFileSystemWatcher m_fsWatcher{this}; + + QTimer m_reloadTimer{this}; + + static constexpr auto FsModelResetDelay = 1000; } ; diff --git a/master/src/ScreenshotManagementPanel.ui b/master/src/ScreenshotManagementPanel.ui index c3249f1c0..1acc2d729 100644 --- a/master/src/ScreenshotManagementPanel.ui +++ b/master/src/ScreenshotManagementPanel.ui @@ -8,6 +8,9 @@ All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. + + QAbstractItemView::NoEditTriggers + @@ -99,7 +102,7 @@ Show - + :/core/edit-find.png:/core/edit-find.png @@ -149,7 +152,6 @@ - From 9f321b2b7aa8da3d6e56161a1156c6cb0d3f93db Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:16:27 +0100 Subject: [PATCH 0713/1765] ScreenshotManagementPanel: add support for deleting multiple screenshots --- master/src/ScreenshotManagementPanel.cpp | 14 ++++++++++++-- master/src/ScreenshotManagementPanel.ui | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/master/src/ScreenshotManagementPanel.cpp b/master/src/ScreenshotManagementPanel.cpp index d8cc2b2d2..95f1e1c06 100644 --- a/master/src/ScreenshotManagementPanel.cpp +++ b/master/src/ScreenshotManagementPanel.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "Filesystem.h" #include "ScreenshotManagementPanel.h" @@ -150,9 +151,18 @@ void ScreenshotManagementPanel::showScreenshot() void ScreenshotManagementPanel::deleteScreenshot() { - if( ui->list->currentIndex().isValid() ) + const auto selection = ui->list->selectionModel()->selectedIndexes(); + if( selection.size() > 1 && + QMessageBox::question( this, + tr("Screenshot"), + tr("Do you really want to delete all selected screenshots?") ) != QMessageBox::Yes ) + { + return; + } + + for( const auto& index : selection ) { - QFile::remove( filePath( ui->list->currentIndex() ) ); + QFile::remove( filePath( index ) ); } updateModel(); diff --git a/master/src/ScreenshotManagementPanel.ui b/master/src/ScreenshotManagementPanel.ui index 1acc2d729..2784fbcf7 100644 --- a/master/src/ScreenshotManagementPanel.ui +++ b/master/src/ScreenshotManagementPanel.ui @@ -11,6 +11,9 @@ QAbstractItemView::NoEditTriggers + + QAbstractItemView::ExtendedSelection + From 48ee5c21bae168d55fedb0f5f5050b91f9b6011a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:17:06 +0100 Subject: [PATCH 0714/1765] Screenshot: fix non-working feature invocation --- plugins/screenshot/ScreenshotFeaturePlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.cpp b/plugins/screenshot/ScreenshotFeaturePlugin.cpp index e203539d4..b05542660 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.cpp +++ b/plugins/screenshot/ScreenshotFeaturePlugin.cpp @@ -63,7 +63,7 @@ bool ScreenshotFeaturePlugin::controlFeature( Feature::Uid featureUid, { Q_UNUSED(arguments) - if( hasFeature( featureUid ) && operation != Operation::Start ) + if( hasFeature( featureUid ) && operation == Operation::Start ) { for( const auto& controlInterface : computerControlInterfaces ) { From 937526d111bee0c7f88b08c9ad729775cf54d144 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:17:44 +0100 Subject: [PATCH 0715/1765] MasterConfigurationPage: fix widget name --- configurator/src/MasterConfigurationPage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 5bb2ff4da..3c31923b5 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -505,7 +505,7 @@ modernUserInterface accessControlForMasterEnabled autoSelectCurrentLocation - autoAdjustGridSize + autoAdjustMonitoringIconSize autoOpenComputerSelectPanel showCurrentLocationOnly allowAddingHiddenLocations From a325dfdca2d713cd62df7f3ff77323e7f225277d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 11:27:35 +0100 Subject: [PATCH 0716/1765] Revert "ComputerMonitoringWidget: set resize mode to Fixed" This reverts commit 0b914aeee769adfbbe9dac0a528fad468ff328ef. --- master/src/ComputerMonitoringWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index c8b02880f..b85223f4e 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -49,7 +49,7 @@ ComputerMonitoringWidget::ComputerMonitoringWidget( QWidget *parent ) : setSelectionMode( QAbstractItemView::ExtendedSelection ); setFlow( QListView::LeftToRight ); setWrapping( true ); - setResizeMode( QListView::Fixed ); + setResizeMode( QListView::Adjust ); setSpacing( computerMonitoringThumbnailSpacing ); setViewMode( QListView::IconMode ); setUniformItemSizes( true ); From 998a4edfd06de7e52c9dfe1610712032d11119a7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 12:03:38 +0100 Subject: [PATCH 0717/1765] ComputerControlServer: notify first successful access control pass only Whenever a client disconnects, the ServerAccessControlManager performs access control for all remaining clients again. As a result, it notifies the ComputerControlServer about a finished access control pass again even for active connections where nothing has changed. Therefore only show a notification for the first successful access control pass. This fixes undesired notification popups when using the NetworkDiscovery add-on. --- server/src/ComputerControlServer.cpp | 3 ++- server/src/ServerAccessControlManager.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 090bfbfff..6229c2b80 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -182,7 +182,8 @@ void ComputerControlServer::showAuthenticationMessage( VncServerClient* client ) void ComputerControlServer::showAccessControlMessage( VncServerClient* client ) { - if( client->accessControlState() == VncServerClient::AccessControlState::Successful ) + if( client->accessControlState() == VncServerClient::AccessControlState::Successful && + client->protocolState() == VncServerProtocol::State::AccessControl ) { vInfo() << "Access control successful for" << client->hostAddress() << client->username(); diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index 75145f8d8..c8b1d9882 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -72,7 +72,7 @@ void ServerAccessControlManager::removeClient( VncServerClient* client ) m_clients.removeAll( client ); // force all remaining clients to pass access control again as conditions might - // have changed (e.g. AccessControlRule::ConditionAccessFromAlreadyConnectedUser) + // have changed (e.g. AccessControlRule::Condition::AccessFromAlreadyConnectedUser) const VncServerClientList previousClients = m_clients; m_clients.clear(); From be839ea8fcb42943e4e0cb619af59604234d87f2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 19 Nov 2020 18:54:52 +0100 Subject: [PATCH 0718/1765] cmake: CPackDefinitions: use supplied package name --- cmake/CPackDefinitions.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/CPackDefinitions.cmake b/cmake/CPackDefinitions.cmake index 39eca50f0..8904081ea 100644 --- a/cmake/CPackDefinitions.cmake +++ b/cmake/CPackDefinitions.cmake @@ -8,7 +8,9 @@ endif() # Basic information -set(CPACK_PACKAGE_NAME "veyon") +if(NOT CPACK_PACKAGE_NAME) + set(CPACK_PACKAGE_NAME "veyon") +endif() set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}") From 1f9351a036d5a27401e204cda6ccad6d46689fb4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Nov 2020 10:02:57 +0100 Subject: [PATCH 0719/1765] Update and complete resource files By adding the missing VarFileInfo block, file information are now displayed completely and the notification title for tray icon messages on Windows 10 properly displays "Veyon" instead of "veyon-worker.exe". --- cli/veyon-cli.rc.in | 13 +++++++++---- cli/veyon-wcli.rc.in | 13 +++++++++---- configurator/veyon-configurator.rc.in | 13 +++++++++---- master/veyon-master.rc.in | 15 ++++++++++----- nsis/veyon.nsi.in | 2 +- server/veyon-server.rc.in | 14 +++++++++----- service/veyon-service.rc.in | 14 +++++++++----- worker/veyon-worker.rc.in | 15 ++++++++++----- 8 files changed, 66 insertions(+), 33 deletions(-) diff --git a/cli/veyon-cli.rc.in b/cli/veyon-cli.rc.in index 006be27fd..7e8a5b8f5 100644 --- a/cli/veyon-cli.rc.in +++ b/cli/veyon-cli.rc.in @@ -1,10 +1,10 @@ #include -ID_MANIFEST RT_MANIFEST data/veyon-cli.exe.manifest +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST data/veyon-cli.exe.manifest VS_VERSION_INFO VERSIONINFO FILEVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,@VERSION_BUILD@ - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGSMASK 0x0L FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN @@ -16,11 +16,16 @@ BEGIN BEGIN VALUE "Comments", "Virtual Eye On Networks (https://veyon.io)\0" VALUE "CompanyName", "Veyon Solutions\0" + VALUE "ProductName", "Veyon\0" + VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-cli.exe\0" - VALUE "ProductName", "Veyon\0" END END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04E4 + END END diff --git a/cli/veyon-wcli.rc.in b/cli/veyon-wcli.rc.in index 67d054e2c..07eaa4dda 100644 --- a/cli/veyon-wcli.rc.in +++ b/cli/veyon-wcli.rc.in @@ -1,10 +1,10 @@ #include -ID_MANIFEST RT_MANIFEST data/veyon-wcli.exe.manifest +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST data/veyon-wcli.exe.manifest VS_VERSION_INFO VERSIONINFO FILEVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,@VERSION_BUILD@ - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGSMASK 0x0L FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN @@ -16,11 +16,16 @@ BEGIN BEGIN VALUE "Comments", "Virtual Eye On Networks (https://veyon.io)\0" VALUE "CompanyName", "Veyon Solutions\0" + VALUE "ProductName", "Veyon\0" + VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (non-console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-wcli.exe\0" - VALUE "ProductName", "Veyon\0" END END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04E4 + END END diff --git a/configurator/veyon-configurator.rc.in b/configurator/veyon-configurator.rc.in index 80d4aca00..174b7e4c3 100644 --- a/configurator/veyon-configurator.rc.in +++ b/configurator/veyon-configurator.rc.in @@ -1,11 +1,11 @@ veyonconfiguratoricon ICON data/veyon-configurator.ico #include -ID_MANIFEST RT_MANIFEST data/veyon-configurator.exe.manifest +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST data/veyon-configurator.exe.manifest VS_VERSION_INFO VERSIONINFO FILEVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,@VERSION_BUILD@ - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGSMASK 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN @@ -17,11 +17,16 @@ BEGIN BEGIN VALUE "Comments", "Virtual Eye On Networks (https://veyon.io)\0" VALUE "CompanyName", "Veyon Solutions\0" + VALUE "ProductName", "Veyon\0" + VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Configurator\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2010-2020 Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-configurator.exe\0" - VALUE "ProductName", "Veyon\0" END END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04E4 + END END diff --git a/master/veyon-master.rc.in b/master/veyon-master.rc.in index 14258720c..401c735f3 100644 --- a/master/veyon-master.rc.in +++ b/master/veyon-master.rc.in @@ -1,11 +1,11 @@ veyonmastericon ICON data/veyon-master.ico #include -ID_MANIFEST RT_MANIFEST data/veyon-master.exe.manifest +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST data/veyon-master.exe.manifest VS_VERSION_INFO VERSIONINFO FILEVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,@VERSION_BUILD@ - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGSMASK 0x0L FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN @@ -17,11 +17,16 @@ BEGIN BEGIN VALUE "Comments", "Virtual Eye On Networks (https://veyon.io)\0" VALUE "CompanyName", "Veyon Solutions\0" - VALUE "FileDescription", "Veyon Master Application\0" + VALUE "ProductName", "Veyon\0" + VALUE "ProductVersion", "@VERSION_STRING@\0" + VALUE "FileDescription", "Veyon Master\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2004-2020 Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-master.exe\0" - VALUE "ProductName", "Veyon\0" END END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04E4 + END END diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index 77e1dba30..1ef2ea136 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -2,7 +2,7 @@ !define COMP_NAME "Veyon Solutions" !define WEB_SITE "https://veyon.io" !define VERSION "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@.@VERSION_BUILD@" -!define COPYRIGHT "2004-2020 Tobias Junghans / Veyon Solutions" +!define COPYRIGHT "2004-2020 Veyon Solutions / Tobias Junghans" !define DESCRIPTION "Veyon Installer" !define LICENSE_TXT "COPYING" !define INSTALLER_NAME "veyon-${VERSION}-@MINGW_PLATFORM@-setup.exe" diff --git a/server/veyon-server.rc.in b/server/veyon-server.rc.in index c2c184d09..e7cffabc3 100644 --- a/server/veyon-server.rc.in +++ b/server/veyon-server.rc.in @@ -1,10 +1,10 @@ #include -ID_MANIFEST RT_MANIFEST data/veyon-server.exe.manifest +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST data/veyon-server.exe.manifest VS_VERSION_INFO VERSIONINFO FILEVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,@VERSION_BUILD@ - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGSMASK 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN @@ -16,12 +16,16 @@ BEGIN BEGIN VALUE "Comments", "Virtual Eye On Networks (https://veyon.io)\0" VALUE "CompanyName", "Veyon Solutions\0" + VALUE "ProductName", "Veyon\0" + VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Server\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2004-2020 Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-server.exe\0" - VALUE "ProductName", "Veyon\0" - VALUE "ProductVersion", "@VERSION_STRING@\0" END END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04E4 + END END diff --git a/service/veyon-service.rc.in b/service/veyon-service.rc.in index 333cb9caf..4720188a4 100644 --- a/service/veyon-service.rc.in +++ b/service/veyon-service.rc.in @@ -1,10 +1,10 @@ #include -ID_MANIFEST RT_MANIFEST data/veyon-service.exe.manifest +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST data/veyon-service.exe.manifest VS_VERSION_INFO VERSIONINFO FILEVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,@VERSION_BUILD@ - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGSMASK 0 FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN @@ -16,12 +16,16 @@ BEGIN BEGIN VALUE "Comments", "Virtual Eye On Networks (https://veyon.io)\0" VALUE "CompanyName", "Veyon Solutions\0" + VALUE "ProductName", "Veyon\0" + VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Service\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2004-2020 Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-service.exe\0" - VALUE "ProductName", "Veyon\0" - VALUE "ProductVersion", "@VERSION_STRING@\0" END END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04E4 + END END diff --git a/worker/veyon-worker.rc.in b/worker/veyon-worker.rc.in index a1622d0b6..e8d7cb562 100644 --- a/worker/veyon-worker.rc.in +++ b/worker/veyon-worker.rc.in @@ -1,10 +1,10 @@ #include -ID_MANIFEST RT_MANIFEST data/veyon-worker.exe.manifest +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST data/veyon-worker.exe.manifest VS_VERSION_INFO VERSIONINFO FILEVERSION @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_PATCH@,@VERSION_BUILD@ - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGSMASK 0x0L FILEOS VOS_NT_WINDOWS32 FILETYPE VFT_APP FILESUBTYPE VFT2_UNKNOWN @@ -16,11 +16,16 @@ BEGIN BEGIN VALUE "Comments", "Virtual Eye On Networks (https://veyon.io)\0" VALUE "CompanyName", "Veyon Solutions\0" - VALUE "FileDescription", "Veyon Worker\0" + VALUE "ProductName", "Veyon\0" + VALUE "ProductVersion", "@VERSION_STRING@\0" + VALUE "FileDescription", "Veyon\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-worker.exe\0" - VALUE "ProductName", "Veyon\0" END END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 0x04E4 + END END From 9371016997944b9a71d3ce38964262f3a299b4a4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Nov 2020 10:22:21 +0100 Subject: [PATCH 0720/1765] CI: forward all arguments to build scripts --- .ci/linux.centos.7.8/script.sh | 2 +- .ci/linux.centos.8.2/script.sh | 2 +- .ci/linux.debian.buster/script.sh | 2 +- .ci/linux.debian.stretch/script.sh | 2 +- .ci/linux.fedora.31/script.sh | 2 +- .ci/linux.opensuse.15.1/script.sh | 2 +- .ci/linux.opensuse.15.2/script.sh | 2 +- .ci/linux.ubuntu.bionic/script.sh | 2 +- .ci/linux.ubuntu.focal/script.sh | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.ci/linux.centos.7.8/script.sh b/.ci/linux.centos.7.8/script.sh index 87e5c81e2..c32ad2c1d 100755 --- a/.ci/linux.centos.7.8/script.sh +++ b/.ci/linux.centos.7.8/script.sh @@ -4,5 +4,5 @@ source scl_source enable devtoolset-7 set -e -$1/.ci/common/linux-build.sh $1 $2 +$1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "centos-7.8" diff --git a/.ci/linux.centos.8.2/script.sh b/.ci/linux.centos.8.2/script.sh index b256792ed..120c500f8 100755 --- a/.ci/linux.centos.8.2/script.sh +++ b/.ci/linux.centos.8.2/script.sh @@ -4,5 +4,5 @@ set -e export CMAKE_FLAGS="-DWITH_PCH=OFF" -$1/.ci/common/linux-build.sh $1 $2 +$1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "centos-8.2" diff --git a/.ci/linux.debian.buster/script.sh b/.ci/linux.debian.buster/script.sh index fc91f3198..edb441c50 100755 --- a/.ci/linux.debian.buster/script.sh +++ b/.ci/linux.debian.buster/script.sh @@ -2,5 +2,5 @@ set -e -$1/.ci/common/linux-build.sh $1 $2 +$1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 "debian-buster" diff --git a/.ci/linux.debian.stretch/script.sh b/.ci/linux.debian.stretch/script.sh index fd6b4c22a..5a794e844 100755 --- a/.ci/linux.debian.stretch/script.sh +++ b/.ci/linux.debian.stretch/script.sh @@ -2,7 +2,7 @@ set -e -$1/.ci/common/linux-build.sh $1 $2 +$1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 "debian-stretch" # generate source tarball diff --git a/.ci/linux.fedora.31/script.sh b/.ci/linux.fedora.31/script.sh index e511fbbec..71ab48097 100755 --- a/.ci/linux.fedora.31/script.sh +++ b/.ci/linux.fedora.31/script.sh @@ -2,5 +2,5 @@ set -e -$1/.ci/common/linux-build.sh $1 $2 +$1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "fc31" diff --git a/.ci/linux.opensuse.15.1/script.sh b/.ci/linux.opensuse.15.1/script.sh index a6e265128..c1c29d5bd 100755 --- a/.ci/linux.opensuse.15.1/script.sh +++ b/.ci/linux.opensuse.15.1/script.sh @@ -2,5 +2,5 @@ set -e -$1/.ci/common/linux-build.sh $1 $2 +$1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "opensuse-15.1" diff --git a/.ci/linux.opensuse.15.2/script.sh b/.ci/linux.opensuse.15.2/script.sh index 978904d30..873f77801 100755 --- a/.ci/linux.opensuse.15.2/script.sh +++ b/.ci/linux.opensuse.15.2/script.sh @@ -2,5 +2,5 @@ set -e -$1/.ci/common/linux-build.sh $1 $2 +$1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "opensuse-15.2" diff --git a/.ci/linux.ubuntu.bionic/script.sh b/.ci/linux.ubuntu.bionic/script.sh index de662754f..52a055c20 100755 --- a/.ci/linux.ubuntu.bionic/script.sh +++ b/.ci/linux.ubuntu.bionic/script.sh @@ -2,5 +2,5 @@ set -e -$1/.ci/common/linux-build.sh $1 $2 +$1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 "ubuntu-bionic" diff --git a/.ci/linux.ubuntu.focal/script.sh b/.ci/linux.ubuntu.focal/script.sh index e09e59841..02e39e6f8 100755 --- a/.ci/linux.ubuntu.focal/script.sh +++ b/.ci/linux.ubuntu.focal/script.sh @@ -2,5 +2,5 @@ set -e -$1/.ci/common/linux-build.sh $1 $2 +$1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 "ubuntu-focal" From c97a1020f1d01b77f57b4cec92619a19a1634e38 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Nov 2020 10:23:30 +0100 Subject: [PATCH 0721/1765] CI: build package for custom targets too --- .ci/common/linux-build.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/common/linux-build.sh b/.ci/common/linux-build.sh index ff9792953..9aaae8512 100755 --- a/.ci/common/linux-build.sh +++ b/.ci/common/linux-build.sh @@ -30,5 +30,6 @@ if [ -z "$3" ] ; then ./cli/veyon-cli about else make ${@:3} -j$CPUS + fakeroot make package fi From 02d48fec8c239d2ecd6da003829769d6658648ae Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Nov 2020 11:00:52 +0100 Subject: [PATCH 0722/1765] CMake: add options related to building add-ons --- CMakeLists.txt | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b93cb6230..702f44459 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -200,6 +200,8 @@ option(WITH_LTO "Build with link-time optimization" ON) option(WITH_PCH "Reduce compile time by using precompiled headers" ON) option(WITH_SANITIZERS "Build with thread and UB sanitizers" OFF) option(WITH_MODEL_TESTERS "Build with model testers (turn on for debugging only)" OFF) +option(WITH_CORE_ONLY "Build core library only" OFF) +option(WITH_ADDONS "Build add-ons" OFF) if(WITH_SANITIZERS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fsanitize=undefined") @@ -280,14 +282,19 @@ endif() # make sub-directories add_subdirectory(core) -add_subdirectory(server) -add_subdirectory(service) -add_subdirectory(master) -add_subdirectory(configurator) -add_subdirectory(cli) -add_subdirectory(worker) -add_subdirectory(plugins) -add_subdirectory(translations) +if(NOT WITH_CORE_ONLY) + add_subdirectory(server) + add_subdirectory(service) + add_subdirectory(master) + add_subdirectory(configurator) + add_subdirectory(cli) + add_subdirectory(worker) + add_subdirectory(plugins) + add_subdirectory(translations) +endif() +if(WITH_ADDONS) + add_subdirectory(addons) +endif() # # add Windows installer related targets From 74f52b96056b4f95e38f15137e1f8b66593d8b26 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Nov 2020 12:02:57 +0100 Subject: [PATCH 0723/1765] CI: Windows: add support for CMAKE_FLAGS --- .ci/windows/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh index 5634c1452..78b28dda8 100755 --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -12,7 +12,7 @@ rm -rf $BUILDDIR mkdir $BUILDDIR cd $BUILDDIR -cmake $BASEDIR -DCMAKE_TOOLCHAIN_FILE=$BASEDIR/cmake/modules/Win${1}Toolchain.cmake -DCMAKE_MODULE_PATH=$BASEDIR/cmake/modules/ +cmake $BASEDIR -DCMAKE_TOOLCHAIN_FILE=$BASEDIR/cmake/modules/Win${1}Toolchain.cmake -DCMAKE_MODULE_PATH=$BASEDIR/cmake/modules/ $CMAKE_FLAGS echo Building on $CPUS CPUs From 5b63536dc80da19ec51275d7dfbdbb79aaad7073 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Nov 2020 12:07:44 +0100 Subject: [PATCH 0724/1765] cmake: CPackDefinitions: update versioning scheme --- cmake/CPackDefinitions.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/CPackDefinitions.cmake b/cmake/CPackDefinitions.cmake index 8904081ea..2cdd2ab23 100644 --- a/cmake/CPackDefinitions.cmake +++ b/cmake/CPackDefinitions.cmake @@ -17,7 +17,7 @@ set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}") set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") -set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_${CPACK_SYSTEM_NAME}") +set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}-${CPACK_SYSTEM_NAME}") set(CPACK_PACKAGE_CONTACT "Tobias Junghans ") set(CPACK_PACKAGE_HOMEPAGE "https://veyon.io") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Open source computer monitoring and classroom management") @@ -95,14 +95,14 @@ elseif( ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # TODO set(CPACK_GENERATOR "PackageMake") else() if(EXISTS /etc/redhat-release OR EXISTS /etc/fedora-release OR OS_OPENSUSE) - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}.${CPACK_SYSTEM_NAME}") + set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}.${CPACK_SYSTEM_NAME}") set(CPACK_GENERATOR "RPM") endif() if(EXISTS /etc/debian_version) if(CPACK_SYSTEM_NAME STREQUAL "x86_64") set(CPACK_SYSTEM_NAME "amd64") endif() - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_${CPACK_SYSTEM_NAME}") + set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_BUILD}_${CPACK_SYSTEM_NAME}") set(CPACK_GENERATOR "DEB") endif() set(CPACK_SOURCE_GENERATOR "TGZ") From 3f1833711e34ebae2e787f12295cfdfdb04c69ef Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Nov 2020 12:30:37 +0100 Subject: [PATCH 0725/1765] Don't install libs when building with CORE_ONLY --- core/CMakeLists.txt | 8 ++++++-- plugins/ldap/common/CMakeLists.txt | 2 ++ plugins/ldap/kldap/CMakeLists.txt | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 7a182de71..e6c54ebd9 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -83,9 +83,13 @@ if(VEYON_BUILD_WIN32) # add Windows Socket library required by libvncclient target_link_libraries(veyon-core -lws2_32) set_target_properties(veyon-core PROPERTIES PREFIX "") - install(TARGETS veyon-core RUNTIME DESTINATION ${VEYON_LIB_DIR}) + if(NOT WITH_CORE_ONLY) + install(TARGETS veyon-core RUNTIME DESTINATION ${VEYON_LIB_DIR}) + endif() else() - install(TARGETS veyon-core LIBRARY DESTINATION ${VEYON_LIB_DIR}) + if(NOT WITH_CORE_ONLY) + install(TARGETS veyon-core LIBRARY DESTINATION ${VEYON_LIB_DIR}) + endif() endif() if(VEYON_BUILD_ANDROID) diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index 637d522dd..10e556316 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -27,5 +27,7 @@ target_include_directories(ldap-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(ldap-common kldap-light veyon-core) set_default_target_properties(ldap-common) set_target_properties(ldap-common PROPERTIES LINK_FLAGS "-Wl,-no-undefined") +if(NOT WITH_CORE_ONLY) install(TARGETS ldap-common DESTINATION ${VEYON_LIB_DIR}) +endif() cotire_veyon(ldap-common) diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index 9f460a477..3e3e3276e 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -40,6 +40,8 @@ target_include_directories(kldap-light PRIVATE ${Ldap_INCLUDE_DIRS}) target_include_directories(kldap-light PUBLIC ${kldap_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) set_default_target_properties(kldap-light) set_target_properties(kldap-light PROPERTIES LINK_FLAGS "-Wl,-no-undefined") +if(NOT WITH_CORE_ONLY) install(TARGETS kldap-light DESTINATION ${VEYON_LIB_DIR}) +endif() cotire_veyon(kldap-light) From c506cc4bbc9360e0e686283b36284d612f5f1fa9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:02:45 +0100 Subject: [PATCH 0726/1765] ComputerControlInterface: add screenSizeChanged() signal --- core/src/ComputerControlInterface.cpp | 2 ++ core/src/ComputerControlInterface.h | 1 + 2 files changed, 3 insertions(+) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 90c5f1b8f..1dac3a0c8 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -93,6 +93,8 @@ void ComputerControlInterface::start( QSize scaledScreenSize, UpdateMode updateM Q_EMIT scaledScreenUpdated(); } ); + connect( m_vncConnection, &VncConnection::framebufferSizeChanged, this, &ComputerControlInterface::screenSizeChanged ); + connect( m_vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); connect( m_vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateUser ); connect( m_vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateActiveFeatures ); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 931cc5845..836b558dd 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -182,6 +182,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject Q_SIGNALS: void featureMessageReceived( const FeatureMessage&, ComputerControlInterface::Pointer ); + void screenSizeChanged(); void screenUpdated( QRect rect ); void scaledScreenUpdated(); void userChanged(); From cd1dfd7d2167f2d9a7dff8b368343e076dd94921 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:10:41 +0100 Subject: [PATCH 0727/1765] ComputerControlInterface: add screenSize() getter --- core/src/ComputerControlInterface.cpp | 7 +++++++ core/src/ComputerControlInterface.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 1dac3a0c8..3a8ff4c42 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -139,6 +139,13 @@ bool ComputerControlInterface::hasValidFramebuffer() const +QSize ComputerControlInterface::screenSize() const +{ + return m_vncConnection->image().size(); +} + + + void ComputerControlInterface::setScaledScreenSize( QSize scaledScreenSize ) { m_scaledScreenSize = scaledScreenSize; diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 836b558dd..4a9d74e30 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -77,6 +77,8 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject bool hasValidFramebuffer() const; + QSize screenSize() const; + const QSize& scaledScreenSize() const { return m_scaledScreenSize; From 49bae25cd358601bf2b8fdab994feb05c08cd727 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:13:10 +0100 Subject: [PATCH 0728/1765] ComputerControlListModel: use dedicated getter --- master/src/ComputerControlListModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 6c7e75308..db364d435 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -384,7 +384,7 @@ double ComputerControlListModel::averageAspectRatio() const for( const auto& controlInterface : m_computerControlInterfaces ) { - const auto currentSize = controlInterface->screen().size(); + const auto currentSize = controlInterface->screenSize(); if( currentSize.isValid() ) { size += currentSize; From b274dfa653bc1dd3685727b7d203902db15fb513 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:14:56 +0100 Subject: [PATCH 0729/1765] ComputerControlListModel: always update on any screen size change --- master/src/ComputerControlListModel.cpp | 23 ++++++++++++++++++++--- master/src/ComputerControlListModel.h | 1 + 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index db364d435..a74556aa7 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -188,12 +188,24 @@ void ComputerControlListModel::updateComputerScreenSize() } - m_computerScreenSize = { m_master->userConfig().monitoringScreenSize(), - int(m_master->userConfig().monitoringScreenSize() / ratio) }; + const QSize newSize{ m_master->userConfig().monitoringScreenSize(), + int(m_master->userConfig().monitoringScreenSize() / ratio) }; for( auto& controlInterface : m_computerControlInterfaces ) { - controlInterface->setScaledScreenSize( m_computerScreenSize ); + controlInterface->setScaledScreenSize( newSize ); + } + + if( m_computerScreenSize != newSize ) + { + m_computerScreenSize = newSize; + + for( int i = 0; i < rowCount(); ++i ) + { + updateScreen( index( i ) ); + } + + Q_EMIT computerScreenSizeChanged(); } } @@ -296,6 +308,8 @@ void ComputerControlListModel::update() ++row; } + + updateComputerScreenSize(); } @@ -351,6 +365,9 @@ void ComputerControlListModel::startComputerControlInterface( ComputerControlInt m_master->featureManager().handleFeatureMessage( computerControlInterface, featureMessage ); } ); + connect( controlInterface, &ComputerControlInterface::screenSizeChanged, + this, &ComputerControlListModel::updateComputerScreenSize ); + connect( controlInterface, &ComputerControlInterface::scaledScreenUpdated, this, [=] () { updateScreen( interfaceIndex( controlInterface ) ); } ); diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 8a1f77502..807599775 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -71,6 +71,7 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro Q_SIGNALS: void activeFeaturesChanged( QModelIndex ); + void computerScreenSizeChanged(); private: void update(); From e4cc9cfe47c0a89c2032e10ad74f82ddc14739df Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:15:42 +0100 Subject: [PATCH 0730/1765] ComputerMonitoringView: update icon size on any change reported by model --- master/src/ComputerMonitoringView.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 1a05db2df..fcae03f67 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -51,6 +51,8 @@ void ComputerMonitoringView::initializeView( QObject* self ) QObject::connect( &m_iconSizeAutoAdjustTimer, &QTimer::timeout, self, autoAdjust ); QObject::connect( dataModel(), &ComputerMonitoringModel::rowsInserted, self, autoAdjust ); QObject::connect( dataModel(), &ComputerMonitoringModel::rowsRemoved, self, autoAdjust ); + QObject::connect( &m_master->computerControlListModel(), &ComputerControlListModel::computerScreenSizeChanged, self, + [this]() { setIconSize( m_master->computerControlListModel().computerScreenSize() ); } ); setColors( VeyonCore::config().computerMonitoringBackgroundColor(), VeyonCore::config().computerMonitoringTextColor() ); @@ -133,8 +135,6 @@ void ComputerMonitoringView::setComputerScreenSize( int size ) m_master->userConfig().setMonitoringScreenSize( size ); m_master->computerControlListModel().updateComputerScreenSize(); - - setIconSize( m_master->computerControlListModel().computerScreenSize() ); } } From cd1068484f4a09abcc04aaeeaf4632244fc03b39 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:16:40 +0100 Subject: [PATCH 0731/1765] ComputerMonitoringView: delay auto adjust on row changes Don't trigger auto adjust on each row inserted/removed but wait until all rows have been inserted/removed. --- master/src/ComputerMonitoringView.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index fcae03f67..521fa2bc9 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -46,9 +46,9 @@ ComputerMonitoringView::ComputerMonitoringView() : void ComputerMonitoringView::initializeView( QObject* self ) { - const auto autoAdjust = [this]() { performIconSizeAutoAdjust(); }; + const auto autoAdjust = [this]() { initiateIconSizeAutoAdjust(); }; - QObject::connect( &m_iconSizeAutoAdjustTimer, &QTimer::timeout, self, autoAdjust ); + QObject::connect( &m_iconSizeAutoAdjustTimer, &QTimer::timeout, self, [this]() { performIconSizeAutoAdjust(); } ); QObject::connect( dataModel(), &ComputerMonitoringModel::rowsInserted, self, autoAdjust ); QObject::connect( dataModel(), &ComputerMonitoringModel::rowsRemoved, self, autoAdjust ); QObject::connect( &m_master->computerControlListModel(), &ComputerControlListModel::computerScreenSizeChanged, self, From e831e7323978066ce5be4591c731ac50d5716487 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:18:50 +0100 Subject: [PATCH 0732/1765] ComputerControlListModel: fall back to AR of 16:9 --- master/src/ComputerControlListModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index a74556aa7..e7fd4507f 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -176,7 +176,7 @@ QImage ComputerControlListModel::requestImage( const QString& id, QSize* size, c void ComputerControlListModel::updateComputerScreenSize() { - auto ratio = 1.0; + auto ratio = 16.0 / 9.0; switch( aspectRatio() ) { From cfe1ad40346915fc8d0026634efef7913de32fab Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:20:10 +0100 Subject: [PATCH 0733/1765] ComputerControlListModel: scale and align status icons dynamically --- master/src/ComputerControlListModel.cpp | 43 +++++++++++-------------- master/src/ComputerControlListModel.h | 3 +- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index e7fd4507f..ee2e03633 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -39,14 +39,15 @@ ComputerControlListModel::ComputerControlListModel( VeyonMaster* masterCore, QObject* parent ) : ComputerListModel( parent ), QQuickImageProvider( QQmlImageProviderBase::Image ), - m_master( masterCore ) + m_master( masterCore ), + m_iconDefault( QStringLiteral(":/master/preferences-desktop-display-gray.png") ), + m_iconConnectionProblem( QStringLiteral(":/master/preferences-desktop-display-red.png") ), + m_iconDemoMode( QStringLiteral(":/master/preferences-desktop-display-orange.png") ) { #if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) new QAbstractItemModelTester( this, QAbstractItemModelTester::FailureReportingMode::Warning, this ); #endif - loadIcons(); - connect( &m_master->computerManager(), &ComputerManager::computerSelectionReset, this, &ComputerControlListModel::reload ); connect( &m_master->computerManager(), &ComputerManager::computerSelectionChanged, @@ -413,53 +414,47 @@ double ComputerControlListModel::averageAspectRatio() const -void ComputerControlListModel::loadIcons() +QImage ComputerControlListModel::scaleAndAlignIcon( const QImage& icon, QSize size ) const { - m_iconDefault = prepareIcon( QImage( QStringLiteral(":/master/preferences-desktop-display-gray.png") ) ); - m_iconConnectionProblem = prepareIcon( QImage( QStringLiteral(":/master/preferences-desktop-display-red.png") ) ); - m_iconDemoMode = prepareIcon( QImage( QStringLiteral(":/master/preferences-desktop-display-orange.png") ) ); -} + const auto scaledIcon = icon.scaled( size.width(), size.height(), Qt::KeepAspectRatio ); + QImage scaledAndAlignedIcon( size, QImage::Format_ARGB32 ); + scaledAndAlignedIcon.fill( Qt::transparent ); + QPainter painter( &scaledAndAlignedIcon ); + painter.drawImage( ( scaledAndAlignedIcon.width() - scaledIcon.width() ) / 2, + ( scaledAndAlignedIcon.height() - scaledIcon.height() ) / 2, + scaledIcon ); -QImage ComputerControlListModel::prepareIcon(const QImage &icon) -{ - QImage wideIcon( icon.width() * 16 / 9, icon.height(), QImage::Format_ARGB32 ); - wideIcon.fill( Qt::transparent ); - QPainter p( &wideIcon ); - p.drawImage( ( wideIcon.width() - icon.width() ) / 2, 0, icon ); - return wideIcon; + return scaledAndAlignedIcon; } QImage ComputerControlListModel::computerDecorationRole( const ComputerControlInterface::Pointer& controlInterface ) const { - QImage image; - switch( controlInterface->state() ) { case ComputerControlInterface::State::Connected: - image = controlInterface->scaledScreen(); + { + const auto image = controlInterface->scaledScreen(); if( image.isNull() == false ) { return image; } - image = m_iconDefault; - break; + return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledScreenSize() ); + } case ComputerControlInterface::State::AuthenticationFailed: case ComputerControlInterface::State::ServiceUnreachable: - image = m_iconConnectionProblem; - break; + return scaleAndAlignIcon( m_iconConnectionProblem, controlInterface->scaledScreenSize() ); default: - image = m_iconDefault; break; } - return image.scaled( controlInterface->scaledScreenSize(), Qt::KeepAspectRatio ); + return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledScreenSize() ); } diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 807599775..45b6b096d 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -88,8 +88,7 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro double averageAspectRatio() const; - void loadIcons(); - QImage prepareIcon( const QImage& icon ); + QImage scaleAndAlignIcon( const QImage& icon, QSize size ) const; QImage computerDecorationRole( const ComputerControlInterface::Pointer& controlInterface ) const; QString computerToolTipRole( const ComputerControlInterface::Pointer& controlInterface ) const; QString computerDisplayRole( const ComputerControlInterface::Pointer& controlInterface ) const; From 106f8ea69f02bb81e29baff7c2b1a42a30bdb4db Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:26:26 +0100 Subject: [PATCH 0734/1765] Rename state ServiceUnreachable to ServerNotRunning --- core/src/ComputerControlInterface.cpp | 2 +- core/src/VncConnection.cpp | 2 +- core/src/VncConnection.h | 2 +- master/src/ComputerControlListModel.cpp | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 3a8ff4c42..8d3d7e887 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -318,7 +318,7 @@ void ComputerControlInterface::updateState() case VncConnection::State::Connecting: m_state = State::Connecting; break; case VncConnection::State::Connected: m_state = State::Connected; break; case VncConnection::State::HostOffline: m_state = State::HostOffline; break; - case VncConnection::State::ServiceUnreachable: m_state = State::ServiceUnreachable; break; + case VncConnection::State::ServerNotRunning: m_state = State::ServerNotRunning; break; case VncConnection::State::AuthenticationFailed: m_state = State::AuthenticationFailed; break; default: m_state = VncConnection::State::Disconnected; break; } diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 636ff6979..9058a516a 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -480,7 +480,7 @@ void VncConnection::establishConnection() } else { - setState( State::ServiceUnreachable ); + setState( State::ServerNotRunning ); } } else if( m_framebufferState == FramebufferState::Invalid ) diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 2aea49e14..cda290460 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -80,7 +80,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread Disconnected, Connecting, HostOffline, - ServiceUnreachable, + ServerNotRunning, AuthenticationFailed, ConnectionFailed, Connected diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index ee2e03633..2fac953ef 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -446,8 +446,8 @@ QImage ComputerControlListModel::computerDecorationRole( const ComputerControlIn return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledScreenSize() ); } + case ComputerControlInterface::State::ServerNotRunning: case ComputerControlInterface::State::AuthenticationFailed: - case ComputerControlInterface::State::ServiceUnreachable: return scaleAndAlignIcon( m_iconConnectionProblem, controlInterface->scaledScreenSize() ); default: @@ -546,8 +546,8 @@ QString ComputerControlListModel::computerStateDescription( const ComputerContro case ComputerControlInterface::State::HostOffline: return tr( "Computer offline or switched off" ); - case ComputerControlInterface::State::ServiceUnreachable: - return tr( "Service unreachable or not running" ); + case ComputerControlInterface::State::ServerNotRunning: + return tr( "Veyon Server unreachable or not running" ); case ComputerControlInterface::State::AuthenticationFailed: return tr( "Authentication failed or access denied" ); From 578a5b1da216b87f7df9b95bfc63f86b56c0af97 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 10:29:50 +0100 Subject: [PATCH 0735/1765] ComputerControlListModel: use dedicated icon for State::ServerNotRunning --- master/src/ComputerControlListModel.cpp | 4 +++- master/src/ComputerControlListModel.h | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 2fac953ef..34035dc55 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -42,7 +42,7 @@ ComputerControlListModel::ComputerControlListModel( VeyonMaster* masterCore, QOb m_master( masterCore ), m_iconDefault( QStringLiteral(":/master/preferences-desktop-display-gray.png") ), m_iconConnectionProblem( QStringLiteral(":/master/preferences-desktop-display-red.png") ), - m_iconDemoMode( QStringLiteral(":/master/preferences-desktop-display-orange.png") ) + m_iconServerNotRunning( QStringLiteral(":/master/preferences-desktop-display-orange.png") ) { #if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) new QAbstractItemModelTester( this, QAbstractItemModelTester::FailureReportingMode::Warning, this ); @@ -447,6 +447,8 @@ QImage ComputerControlListModel::computerDecorationRole( const ComputerControlIn } case ComputerControlInterface::State::ServerNotRunning: + return scaleAndAlignIcon( m_iconServerNotRunning, controlInterface->scaledScreenSize() ); + case ComputerControlInterface::State::AuthenticationFailed: return scaleAndAlignIcon( m_iconConnectionProblem, controlInterface->scaledScreenSize() ); diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 45b6b096d..ced22aa98 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -100,9 +100,9 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro VeyonMaster* m_master; QString m_imageProviderId{ QStringLiteral("computers") }; - QImage m_iconDefault{}; - QImage m_iconConnectionProblem{}; - QImage m_iconDemoMode{}; + QImage m_iconDefault; + QImage m_iconConnectionProblem; + QImage m_iconServerNotRunning; QSize m_computerScreenSize{}; From 98dedf0347d8fc62cbc8ba9bc909cf80df32e354 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 11:08:57 +0100 Subject: [PATCH 0736/1765] SlideshowPanel: fix updating icon size --- master/src/SlideshowPanel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index 6b24f353b..138f9f3ee 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -47,8 +47,6 @@ SlideshowPanel::SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* co ui->monitoringWidget->setSelectionMode( QListView::SingleSelection ); ui->monitoringWidget->setModel( m_model ); - connect( ui->monitoringWidget, &QListView::iconSizeChanged, m_model, &SlideshowModel::setIconSize ); - connect( ui->startStopButton, &QAbstractButton::toggled, this, &SlideshowPanel::updateDuration ); connect( ui->durationSlider, &QSlider::valueChanged, this, &SlideshowPanel::updateDuration ); @@ -79,6 +77,8 @@ void SlideshowPanel::resizeEvent( QResizeEvent* event ) ui->monitoringWidget->setIconSize( { ui->monitoringWidget->width() - ExtraMargin - spacing * 2, ui->monitoringWidget->height() - ExtraMargin - labelHeight - spacing * 2 } ); + m_model->setIconSize( ui->monitoringWidget->iconSize() ); + QWidget::resizeEvent( event ); } From e3fc4d1e0c93b9c419521b16c0e73cb7af1b0999 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 11:18:43 +0100 Subject: [PATCH 0737/1765] SlideshowModel: only show connected computers --- master/src/SlideshowModel.cpp | 51 ++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/master/src/SlideshowModel.cpp b/master/src/SlideshowModel.cpp index b3c2c4a6e..b13c27645 100644 --- a/master/src/SlideshowModel.cpp +++ b/master/src/SlideshowModel.cpp @@ -38,7 +38,7 @@ SlideshowModel::SlideshowModel( QAbstractItemModel* sourceModel, QObject* parent Q_UNUSED(end) if( start <= m_currentRow ) { - setCurrentRow( m_currentRow + 1 ); + showNext(); } } ); connect( sourceModel, &QAbstractItemModel::rowsRemoved, this, @@ -48,7 +48,7 @@ SlideshowModel::SlideshowModel( QAbstractItemModel* sourceModel, QObject* parent Q_UNUSED(end) if( start <= m_currentRow ) { - setCurrentRow( m_currentRow - 1 ); + showPrevious(); } } ); @@ -68,6 +68,11 @@ void SlideshowModel::setIconSize( QSize size ) QVariant SlideshowModel::data( const QModelIndex& index, int role ) const { + if( m_currentControlInterface.isNull() ) + { + return {}; + } + const auto sourceIndex = mapToSource( index ); if( sourceIndex.isValid() == false ) { @@ -105,7 +110,26 @@ void SlideshowModel::setRunning( bool running, int duration ) void SlideshowModel::showPrevious() { - setCurrentRow( m_currentRow - 1 ); + auto valid = false; + + for( int i = 0; i < sourceModel()->rowCount(); ++i ) + { + setCurrentRow( m_currentRow - 1 ); + + if( m_currentControlInterface && + m_currentControlInterface->state() == ComputerControlInterface::State::Connected && + m_currentControlInterface->hasValidFramebuffer() ) + { + valid = true; + break; + } + } + + if( valid == false ) + { + m_currentRow = 0; + m_currentControlInterface.clear(); + } if( m_timer.isActive() ) { @@ -118,7 +142,26 @@ void SlideshowModel::showPrevious() void SlideshowModel::showNext() { - setCurrentRow( m_currentRow + 1 ); + auto valid = false; + + for( int i = 0; i < sourceModel()->rowCount(); ++i ) + { + setCurrentRow( m_currentRow + 1 ); + + if( m_currentControlInterface && + m_currentControlInterface->state() == ComputerControlInterface::State::Connected && + m_currentControlInterface->hasValidFramebuffer() ) + { + valid = true; + break; + } + } + + if( valid == false ) + { + m_currentRow = 0; + m_currentControlInterface.clear(); + } if( m_timer.isActive() ) { From 2b1518137eb7f5531ccdde6ab934eb4fd12dbf62 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 11:43:30 +0100 Subject: [PATCH 0738/1765] translations: update paths for addons --- translations/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/CMakeLists.txt b/translations/CMakeLists.txt index a16ed4553..a2b46304e 100644 --- a/translations/CMakeLists.txt +++ b/translations/CMakeLists.txt @@ -4,7 +4,7 @@ include(FindQtTranslations) file(GLOB veyon_translations ${CMAKE_CURRENT_SOURCE_DIR}/*.ts) file(GLOB_RECURSE veyon_sources ${CMAKE_SOURCE_DIR}/*.cpp ${CMAKE_SOURCE_DIR}/*.h ${CMAKE_SOURCE_DIR}/*.ui ${CMAKE_SOURCE_DIR}/*.qml) string(REGEX REPLACE "${CMAKE_SOURCE_DIR}/3rdparty[^;]+;?" "" veyon_sources "${veyon_sources}") -string(REGEX REPLACE "${CMAKE_SOURCE_DIR}/plugins/addons[^;]+;?" "" veyon_sources "${veyon_sources}") +string(REGEX REPLACE "${CMAKE_SOURCE_DIR}/addons[^;]+;?" "" veyon_sources "${veyon_sources}") create_translations(veyon "${veyon_translations}" "${veyon_sources}") find_qt_translations() From 8e40a73fcf7f9ac055db658d3533a7986377d184 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 13:55:59 +0100 Subject: [PATCH 0739/1765] CI: create source tarball for generic builds only --- .ci/linux.debian.stretch/script.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.ci/linux.debian.stretch/script.sh b/.ci/linux.debian.stretch/script.sh index 5a794e844..f27279dad 100755 --- a/.ci/linux.debian.stretch/script.sh +++ b/.ci/linux.debian.stretch/script.sh @@ -5,6 +5,8 @@ set -e $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 "debian-stretch" +if [ -z "$3" ] ; then + # generate source tarball cd $1 VERSION=$(git describe --tags --abbrev=0 | sed -e 's/^v//g') @@ -20,3 +22,5 @@ cd / tar --transform "s,^veyon,veyon-$VERSION," --exclude=".git" --exclude="*.deb" -cjf $2/veyon-$VERSION-src.tar.bz2 veyon mv -v $2/*.tar.bz2 $1 + +fi From c85cba4c54dc00cb45333fc075a1701ca2bff841 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 14:33:06 +0100 Subject: [PATCH 0740/1765] EnumHelper: fix toCamelCaseString() --- core/src/EnumHelper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/EnumHelper.h b/core/src/EnumHelper.h index 8b7131d13..58374de58 100644 --- a/core/src/EnumHelper.h +++ b/core/src/EnumHelper.h @@ -41,7 +41,7 @@ class EnumHelper static QString toCamelCaseString( T item ) { const auto name = toString( item ); - return name.mid( 0 ).toLower() + name.mid( 1 ); + return name.mid( 0, 1 ).toLower() + name.mid( 1 ); } } ; From df82905d2963185c643f9abc4984ba31bb6f8523 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 15:57:27 +0100 Subject: [PATCH 0741/1765] FeatureProviderInterface: fix argToString() Don't call toLower() after converting to camel case. --- core/src/FeatureProviderInterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index 831444e43..51cfbe100 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -72,7 +72,7 @@ class VEYON_CORE_EXPORT FeatureProviderInterface template static QString argToString( T item ) { - return EnumHelper::toCamelCaseString( item ).toLower(); + return EnumHelper::toCamelCaseString( item ); } /*! From 3bc6f57e4e4f842be06c9379c2cc16b011caf0a8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 23 Nov 2020 15:59:49 +0100 Subject: [PATCH 0742/1765] CI: use matrix for Windows builds --- .gitlab-ci.yml | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6d3e52472..adece8895 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,24 +3,17 @@ image: docker:latest stages: - build -build-win32: +build-windows: stage: build - image: $IMAGE + image: $CI_REGISTRY/veyon/ci-mingw-w64:5.0 script: - - .ci/windows/build.sh 32 + - .ci/windows/build.sh $BITS + parallel: + matrix: + - BITS: [32, 64] artifacts: - paths: [ veyon-win32* ] - expire_in: 1 day - -build-win64: - stage: build - image: $IMAGE - script: - - .ci/windows/build.sh 64 - artifacts: - paths: [ veyon-win64* ] + paths: [ veyon-win* ] expire_in: 1 day variables: GIT_SUBMODULE_STRATEGY: recursive - IMAGE: $CI_REGISTRY/veyon/ci-mingw-w64:5.0 From 553171c3ce54fdb5ebb805de33035583224cbcb6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 25 Nov 2020 09:12:36 +0100 Subject: [PATCH 0743/1765] ComputerControlListModel: always supply non-empty display role There's a bug in Qt's item views making delegates not updating their size properly when supplying an empty display role (caption) first and changing it to a non-empty value later. This causes the caption being overlapped by the icon. --- master/src/ComputerControlListModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 34035dc55..a4d0f0640 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -504,7 +504,7 @@ QString ComputerControlListModel::computerDisplayRole( const ComputerControlInte return controlInterface->computer().name(); } - return {}; + return tr("[no user]"); } From 22947625ce1ebe9ca8b5b1528e44e844f29ecaee Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 25 Nov 2020 10:56:31 +0100 Subject: [PATCH 0744/1765] README.md: update build status badge We migrated to travis-ci.com. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e5f91fc0c..b657b4a3a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Veyon - Virtual Eye On Networks -[![Build status](https://img.shields.io/travis/veyon/veyon.svg)](https://travis-ci.org/veyon/veyon) +[![Build status](https://travis-ci.com/veyon/veyon.svg?branch=master)](https://travis-ci.com/veyon/veyon) [![Latest stable release](https://img.shields.io/github/release/veyon/veyon.svg?maxAge=3600)](https://github.com/veyon/veyon/releases) [![Overall downloads on Github](https://img.shields.io/github/downloads/veyon/veyon/total.svg?maxAge=3600)](https://github.com/veyon/veyon/releases) [![Documentation Status](https://readthedocs.org/projects/veyon/badge/?version=latest)](https://docs.veyon.io/) From dc0fd632bf33731c9b305bc8b2b910eb30ed471f Mon Sep 17 00:00:00 2001 From: SlrG Date: Fri, 27 Nov 2020 12:13:01 +0100 Subject: [PATCH 0745/1765] add option showFeatureWindowsOnSameScreen as master --- configurator/src/MasterConfigurationPage.ui | 12 ++++++++++-- core/src/VeyonConfigurationProperties.h | 1 + plugins/remoteaccess/RemoteAccessWidget.cpp | 14 ++++++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 3c31923b5..b4cc48dd5 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -380,16 +380,23 @@ - + - + Feature on computer double click: + + + + Open feature windows on the same screen as the main window + + + @@ -515,6 +522,7 @@ hideComputerFilter enforceSelectedModeForClients confirmUnsafeActions + showFeatureWindowsOnSameScreen computerDoubleClickFeature allFeaturesListWidget disableFeatureButton diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index d113cd98c..a7b77d03e 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -119,6 +119,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, enforceSelectedModeForClients, setEnforceSelectedModeForClients, "EnforceSelectedModeForClients", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, autoOpenComputerSelectPanel, setAutoOpenComputerSelectPanel, "AutoOpenComputerSelectPanel", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, confirmUnsafeActions, setConfirmUnsafeActions, "ConfirmUnsafeActions", "Master", false, Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, showFeatureWindowsOnSameScreen, setShowFeatureWindowsOnSameScreen, "ShowFeatureWindowsOnSameScreen", "Master", false, Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_AUTHENTICATION_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QStringList, enabledAuthenticationPlugins, setEnabledAuthenticationPlugins, "EnabledPlugins", "Authentication", QStringList(), Configuration::Property::Flag::Standard ) \ diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 9a829c695..c38cf0017 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -31,7 +31,9 @@ #include "RemoteAccessWidget.h" #include "VncViewWidget.h" +#include "VeyonConfiguration.h" #include "VeyonConnection.h" +#include "VeyonMasterInterface.h" #include "Computer.h" #include "ComputerControlInterface.h" #include "PlatformCoreFunctions.h" @@ -252,6 +254,16 @@ RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& m_vncView( new VncViewWidget( computerControlInterface->computer().hostAddress(), -1, this, VncView::RemoteControlMode ) ), m_toolBar( new RemoteAccessWidgetToolBar( this, startViewOnly, showViewOnlyToggleButton ) ) { + const auto openOnMasterScreen = VeyonCore::config().showFeatureWindowsOnSameScreen(); + const auto master = VeyonCore::instance()->findChild(); + const auto masterWindow = master->mainWindow(); + if( master && openOnMasterScreen ) + { + move( masterWindow->x(), masterWindow->y() ); + } else { + move( 0, 0 ); + } + updateRemoteAccessTitle(); connect( m_computerControlInterface.data(), &ComputerControlInterface::userChanged, this, &RemoteAccessWidget::updateRemoteAccessTitle ); @@ -268,8 +280,6 @@ RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& showNormal(); - move( 0, 0 ); - toggleViewOnly( startViewOnly ); } From 0c69655f95e466c41cca4869964bc2f3fe6db2eb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 1 Dec 2020 12:55:25 +0100 Subject: [PATCH 0746/1765] RemoteAccessWidget: use non-deprecated Qt API --- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index c38cf0017..ab1e86f32 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -118,7 +118,7 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent m_iconStateTimeLine.setFrameRange( 0, 100 ); m_iconStateTimeLine.setDuration( 1500 ); m_iconStateTimeLine.setUpdateInterval( 60 ); - m_iconStateTimeLine.setCurveShape( QTimeLine::SineCurve ); + m_iconStateTimeLine.easingCurve().setType( QEasingCurve::SineCurve ); connect( &m_iconStateTimeLine, &QTimeLine::valueChanged, this, &RemoteAccessWidgetToolBar::updateConnectionAnimation ); connect( &m_iconStateTimeLine, &QTimeLine::finished, &m_iconStateTimeLine, &QTimeLine::start ); } From 1686ee57a6212b05a774b348b30e16d35c7c3660 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 1 Dec 2020 12:57:14 +0100 Subject: [PATCH 0747/1765] CMake: fix rules/deps for translation file generation This makes the TS files being updated whenever a source file changes and fixes ninja-based builds. --- cmake/modules/CreateTranslations.cmake | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/cmake/modules/CreateTranslations.cmake b/cmake/modules/CreateTranslations.cmake index 31d3f84e6..a112a8e63 100644 --- a/cmake/modules/CreateTranslations.cmake +++ b/cmake/modules/CreateTranslations.cmake @@ -7,13 +7,20 @@ function(create_translations name ts_files source_files) set(qm_targets "") foreach(ts_file ${ts_files}) - string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" ts_target "${ts_file}") - string(REPLACE ".ts" ".qm" qm_target "${ts_target}") - set(qm_file "${CMAKE_CURRENT_BINARY_DIR}/${qm_target}") - add_custom_target(${ts_target} COMMAND ${Qt5_LUPDATE_EXECUTABLE} -locations none -no-obsolete ${source_files} -ts ${ts_file}) + string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" ts_filename "${ts_file}") + string(REPLACE ".ts" "" basename "${ts_filename}") + set(ts_target "${basename}_ts") + set(qm_target "${basename}_qm") + set(qm_file "${CMAKE_CURRENT_BINARY_DIR}/${basename}.qm") + add_custom_command(OUTPUT ${ts_file} + COMMAND ${Qt5_LUPDATE_EXECUTABLE} -locations none -no-obsolete ${source_files} -ts ${ts_file} + DEPENDS ${source_files}) + add_custom_target(${ts_target} DEPENDS ${ts_file}) # add command and target for generating/updating QM file if TS file is newer or no QM file exists yet - add_custom_command(OUTPUT ${qm_file} COMMAND ${Qt5_LRELEASE_EXECUTABLE} ${ts_file} -qm ${qm_file} DEPENDS ${ts_file}) - add_custom_target(${qm_target} ALL DEPENDS ${qm_file}) + add_custom_command(OUTPUT ${qm_file} + COMMAND ${Qt5_LRELEASE_EXECUTABLE} ${ts_file} -qm ${qm_file} + DEPENDS ${ts_file}) + add_custom_target(${qm_target} DEPENDS ${qm_file}) list(APPEND qm_targets "${qm_target}") From c3e6779dff40acc574f039e4d2ac01a45168f367 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 1 Dec 2020 12:58:48 +0100 Subject: [PATCH 0748/1765] CMake: add policy for required for ninja support --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 702f44459..c2c75e71f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS 1) if(COMMAND CMAKE_POLICY) cmake_policy(SET CMP0009 NEW) cmake_policy(SET CMP0020 NEW) + cmake_policy(SET CMP0058 NEW) cmake_policy(SET CMP0063 NEW) if(${CMAKE_VERSION} VERSION_GREATER "3.8.0") cmake_policy(SET CMP0069 NEW) From 4f5740045d65d82701181afe7f335d4a3cae4da2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 1 Dec 2020 13:30:37 +0100 Subject: [PATCH 0749/1765] Update translations --- translations/veyon.ts | 114 +- translations/veyon_ar.ts | 114 +- translations/veyon_bg.ts | 330 ++++-- translations/veyon_ca_ES.ts | 114 +- translations/veyon_cs.ts | 210 +++- translations/veyon_de.ts | 126 ++- translations/veyon_el.ts | 1724 +++++++++++++++-------------- translations/veyon_es_ES.ts | 150 ++- translations/veyon_et.ts | 148 ++- translations/veyon_fa.ts | 1554 ++++++++++++++------------- translations/veyon_fr.ts | 130 ++- translations/veyon_he.ts | 1816 ++++++++++++++++--------------- translations/veyon_hu.ts | 256 +++-- translations/veyon_id.ts | 1378 +++++++++++++----------- translations/veyon_it.ts | 148 ++- translations/veyon_ja.ts | 1412 ++++++++++++------------ translations/veyon_ko.ts | 252 +++-- translations/veyon_lt.ts | 610 ++++++----- translations/veyon_lv.ts | 1498 ++++++++++++++------------ translations/veyon_mn.ts | 114 +- translations/veyon_nl.ts | 852 ++++++++------- translations/veyon_no_NO.ts | 2026 ++++++++++++++++++----------------- translations/veyon_pl.ts | 194 +++- translations/veyon_pt_BR.ts | 890 ++++++++------- translations/veyon_pt_PT.ts | 114 +- translations/veyon_ru.ts | 180 +++- translations/veyon_sl.ts | 402 ++++--- translations/veyon_sr.ts | 236 ++-- translations/veyon_sv.ts | 114 +- translations/veyon_th.ts | 1338 ++++++++++++----------- translations/veyon_tr.ts | 240 +++-- translations/veyon_uk.ts | 124 ++- translations/veyon_vi.ts | 114 +- translations/veyon_zh_CN.ts | 218 ++-- translations/veyon_zh_TW.ts | 148 ++- 35 files changed, 11297 insertions(+), 8091 deletions(-) diff --git a/translations/veyon.ts b/translations/veyon.ts index 6ffc09497..79ff2447d 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -454,10 +454,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory - - ... - - Available authentication keys @@ -1265,10 +1261,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off - - Service unreachable or not running - - Authentication failed or access denied @@ -1289,6 +1281,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1639,6 +1639,14 @@ The public key is used on client computers to authenticate incoming connection r Please select only one user screen to share. + + All screens + + + + Screen %1 [%2] + + DesktopAccessDialog @@ -1839,10 +1847,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - ... - - Default source directory @@ -3142,6 +3146,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication + + Adjust size of computer icons automatically + + + + Slideshow + + + + Spotlight + + MasterConfigurationPage @@ -3309,6 +3325,18 @@ The public key is used on client computers to authenticate incoming connection r Hide local session + + Auto + + + + Thumbnail aspect ratio + + + + Automatically adjust computer icon size + + MonitoringMode @@ -3649,6 +3677,10 @@ Please save your work and close all programs. %1 - %2 Remote Access + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3858,6 +3890,14 @@ Please save your work and close all programs. Delete + + Screenshot + + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4080,6 +4120,56 @@ Typically this is required to support terminal servers. + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon diff --git a/translations/veyon_ar.ts b/translations/veyon_ar.ts index b71503ec8..66dfa46fa 100644 --- a/translations/veyon_ar.ts +++ b/translations/veyon_ar.ts @@ -452,10 +452,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory دليل ملفات المفاتيح الخاصة الأساسي - - ... - ... - Available authentication keys @@ -1263,10 +1259,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off - - Service unreachable or not running - - Authentication failed or access denied @@ -1287,6 +1279,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1637,6 +1637,14 @@ The public key is used on client computers to authenticate incoming connection r Please select only one user screen to share. + + All screens + + + + Screen %1 [%2] + + DesktopAccessDialog @@ -1837,10 +1845,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - ... - ... - Default source directory @@ -3140,6 +3144,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication توثيق + + Adjust size of computer icons automatically + + + + Slideshow + + + + Spotlight + + MasterConfigurationPage @@ -3307,6 +3323,18 @@ The public key is used on client computers to authenticate incoming connection r Hide local session + + Auto + + + + Thumbnail aspect ratio + + + + Automatically adjust computer icon size + + MonitoringMode @@ -3647,6 +3675,10 @@ Please save your work and close all programs. %1 - %2 Remote Access + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3856,6 +3888,14 @@ Please save your work and close all programs. Delete حذف + + Screenshot + لقطة شاشة + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4078,6 +4118,56 @@ Typically this is required to support terminal servers. + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon diff --git a/translations/veyon_bg.ts b/translations/veyon_bg.ts index 032b88964..040a1943f 100644 --- a/translations/veyon_bg.ts +++ b/translations/veyon_bg.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -265,7 +267,7 @@ If you're interested in translating Veyon into your local or another langua Authenticated via method - + @@ -320,14 +322,14 @@ If you're interested in translating Veyon into your local or another langua Authentication method - + AndroidPlatformConfigurationPage Android - + General @@ -457,10 +459,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory Private key file base directory - - ... - ... - Available authentication keys Available authentication keys @@ -759,7 +757,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -767,7 +765,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -793,7 +791,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -801,11 +799,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -816,7 +814,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -866,7 +864,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -874,7 +872,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + @@ -885,7 +883,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the Veyon password: - + Authentication error @@ -893,29 +891,29 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. @@ -926,7 +924,7 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPageTab Enabled - + Test @@ -1271,10 +1269,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off Computer offline or switched off - - Service unreachable or not running - Service unreachable or not running - Authentication failed or access denied Authentication failed or access denied @@ -1295,6 +1289,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 Location: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1328,14 +1330,14 @@ The public key is used on client computers to authenticate incoming connection r Active connections: - + ComputerGroupSelector Group %1 - + @@ -1377,19 +1379,19 @@ The public key is used on client computers to authenticate incoming connection r Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1526,7 +1528,7 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Service. - + @@ -1599,51 +1601,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1843,15 +1853,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - - - ... - ... + Default source directory - + Options @@ -1859,11 +1865,11 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + @@ -2086,7 +2092,7 @@ The public key is used on client computers to authenticate incoming connection r Configure - + @@ -2341,7 +2347,7 @@ The public key is used on client computers to authenticate incoming connection r Computer groups filter - + Computer locations identification @@ -2353,11 +2359,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2863,62 +2869,62 @@ The public key is used on client computers to authenticate incoming connection r Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses - + Add new network range - + Remove selected network range - + ID - + Valid until - + Licensee - + Information - + Installation ID - + Addons available for licensing - + Addon - + @@ -3167,6 +3173,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication Authentication + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3320,19 +3338,31 @@ The public key is used on client computers to authenticate incoming connection r Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Auto + + + Automatically adjust computer icon size + @@ -3354,31 +3384,31 @@ The public key is used on client computers to authenticate incoming connection r NetworkDiscoveryConfigurationPage Network discovery - + Mode - + Scan network ranges - + e.g. 192.168.1.0/24 - + Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3386,43 +3416,43 @@ The public key is used on client computers to authenticate incoming connection r Network ranges - + Add new group - + Remove selected group - + Groups - + First address - + Last address - + Add new network range - + Remove selected network range - + Parallel scans - + Scan timeout - + ms @@ -3430,7 +3460,7 @@ The public key is used on client computers to authenticate incoming connection r Session scan limit - + Options @@ -3438,7 +3468,7 @@ The public key is used on client computers to authenticate incoming connection r Reverse lookup discovered IP addresses to host names - + @@ -3479,11 +3509,11 @@ The public key is used on client computers to authenticate incoming connection r PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3491,23 +3521,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3667,7 +3697,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3676,6 +3706,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 - %2 Remote Access + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3795,15 +3829,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3822,7 +3856,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3885,6 +3919,14 @@ Please save your work and close all programs. Delete Delete + + Screenshot + Screenshot + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3984,35 +4026,35 @@ Typically this is required to support terminal servers. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4020,7 +4062,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4108,6 +4150,56 @@ Typically this is required to support terminal servers. Commands for shell functionalities + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4403,7 +4495,7 @@ Typically this is required to support terminal servers. Use input device interception driver - + @@ -4463,7 +4555,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_ca_ES.ts b/translations/veyon_ca_ES.ts index b9157de8a..2b6250f1e 100644 --- a/translations/veyon_ca_ES.ts +++ b/translations/veyon_ca_ES.ts @@ -452,10 +452,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory Carpeta del fitxer de la clau privada - - ... - ... - Available authentication keys @@ -1263,10 +1259,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off - - Service unreachable or not running - - Authentication failed or access denied @@ -1287,6 +1279,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1637,6 +1637,14 @@ The public key is used on client computers to authenticate incoming connection r Please select only one user screen to share. + + All screens + + + + Screen %1 [%2] + + DesktopAccessDialog @@ -1837,10 +1845,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - ... - ... - Default source directory @@ -3140,6 +3144,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication Autentificació + + Adjust size of computer icons automatically + + + + Slideshow + + + + Spotlight + + MasterConfigurationPage @@ -3307,6 +3323,18 @@ The public key is used on client computers to authenticate incoming connection r Hide local session + + Auto + + + + Thumbnail aspect ratio + + + + Automatically adjust computer icon size + + MonitoringMode @@ -3647,6 +3675,10 @@ Please save your work and close all programs. %1 - %2 Remote Access + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3856,6 +3888,14 @@ Please save your work and close all programs. Delete Suprimeix + + Screenshot + + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4078,6 +4118,56 @@ Typically this is required to support terminal servers. + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon diff --git a/translations/veyon_cs.ts b/translations/veyon_cs.ts index c79cb68ea..b2df2437c 100644 --- a/translations/veyon_cs.ts +++ b/translations/veyon_cs.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -265,7 +267,7 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně Authenticated via method - + @@ -320,7 +322,7 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně Authentication method - + @@ -457,10 +459,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Private key file base directory Základní složka pro soukromou část klíče - - ... - - Available authentication keys Ověřovací klíče k dispozici @@ -767,7 +765,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Key file - + @@ -793,7 +791,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří AuthLdapConfigurationWidget LDAP authentication - + General @@ -801,11 +799,11 @@ Veřejná část je použita na klientských počítačích pro ověření pří Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -816,7 +814,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -874,7 +872,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Logon - + @@ -908,7 +906,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Simple password - + @@ -926,7 +924,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří AuthenticationPageTab Enabled - + Test @@ -1271,10 +1269,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Computer offline or switched off Počítač není dostupný na síti nebo je vypnutý - - Service unreachable or not running - Služba není dosažitelná nebo není spuštěná - Authentication failed or access denied Ověření se nezdařilo nebo odepřen přístup @@ -1295,6 +1289,14 @@ Veřejná část je použita na klientských počítačích pro ověření pří Location: %1 Umístění: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1526,7 +1528,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Could not configure the firewall configuration for the %1 Service. - + @@ -1599,51 +1601,59 @@ Veřejná část je použita na klientských počítačích pro ověření pří Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1843,15 +1853,11 @@ Veřejná část je použita na klientských počítačích pro ověření pří Destination directory - - - - ... - + Default source directory - + Options @@ -1859,11 +1865,11 @@ Veřejná část je použita na klientských počítačích pro ověření pří Remember last source directory - + Create destination directory if it does not exist - + @@ -2867,7 +2873,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří LDAP bind - + @@ -3163,6 +3169,18 @@ Veřejná část je použita na klientských počítačích pro ověření pří Authentication Ověření + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3320,15 +3338,27 @@ Veřejná část je použita na klientských počítačích pro ověření pří Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Automaticky + + + Automatically adjust computer icon size + @@ -3495,7 +3525,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří UID - + Plugin-related CLI operations @@ -3672,6 +3702,10 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. %1 - %2 Remote Access %1 – %2 vzdálený přístup + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3795,11 +3829,11 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3818,7 +3852,7 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Could not open screenshot file %1 for writing. - + @@ -3881,6 +3915,14 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Delete Smazat + + Screenshot + Snímek obrazovky + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3980,35 +4022,35 @@ Typicky je toto třeba na terminálových serverech. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4016,7 +4058,7 @@ Typicky je toto třeba na terminálových serverech. Miscellaneous network settings - + @@ -4104,6 +4146,56 @@ Typicky je toto třeba na terminálových serverech. Příkazy pro shellové funkce + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4399,7 +4491,7 @@ Typicky je toto třeba na terminálových serverech. Use input device interception driver - + @@ -4462,4 +4554,4 @@ Typicky je toto třeba na terminálových serverech. Veyon – hlavní - \ No newline at end of file + diff --git a/translations/veyon_de.ts b/translations/veyon_de.ts index 97ae74cb9..8c3e4c986 100644 --- a/translations/veyon_de.ts +++ b/translations/veyon_de.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -454,10 +456,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Private key file base directory Basisverzeichnis der privaten Schlüsseldatei - - ... - ... - Available authentication keys Verfügbare Authentifizierungsschlüssel @@ -1267,10 +1265,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Computer offline or switched off Computer offline oder ausgeschalten - - Service unreachable or not running - Dienst nicht erreichbar oder läuft nicht - Authentication failed or access denied Authentifizierung fehgeschlagen oder Zugriff verweigert @@ -1291,6 +1285,14 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Location: %1 Standort: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1641,6 +1643,14 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Please select only one user screen to share. Bitte wählen Sie nur einen Benutzer-Bildschirm zum Teilen. + + All screens + Alle Bildschirme + + + Screen %1 [%2] + Bildschirm %1 [%2] + DesktopAccessDialog @@ -1841,10 +1851,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Destination directory Zielverzeichnis - - ... - ... - Default source directory Standardquellverzeichnis @@ -3163,6 +3169,18 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Authentication Authentifizierung + + Slideshow + Diashow + + + Spotlight + Scheinwerfer + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3236,7 +3254,7 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Thumbnail update interval - Aktualisierungsintervall Vorschaubilder + Aktualisierungsintervall Miniaturbilder ms @@ -3308,7 +3326,7 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Automatically adjust computer thumbnail size - Automatisch die Größe der Computer-Miniaturansichten anpassen + Automatisch die Größe der Computer-Miniaturbilder anpassen Automatically open computer select panel @@ -3320,7 +3338,7 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Thumbnail spacing - Miniaturbildabstand + Abstand Miniaturbilder px @@ -3330,6 +3348,18 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Hide local session Lokale Sitzung ausblenden + + Thumbnail aspect ratio + Seitenverhältnis Miniaturbilder + + + Auto + Auto + + + Automatically adjust computer icon size + + MonitoringMode @@ -3672,6 +3702,10 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. %1 - %2 Remote Access %1 - %2 Fernzugriff + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3881,6 +3915,14 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Delete Löschen + + Screenshot + Bildschirmfoto + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4104,6 +4146,56 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Befehle für Shellfunktionalitäten + + SlideshowPanel + + Previous + Zurück + + + Start/pause + Starten/pausieren + + + Next + Weiter + + + Duration: + Dauer: + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + Computer durch Klick mit der mittleren Maustaste oder mit Hilfe des ersten Buttons hinzufügen. + + + Add selected computers + Gewählte Computer hinzufügen + + + Remove selected computers + Gewählte Computer entfernen + + + Update computers in realtime + Computer in Echtzeit aktualisieren + + + Spotlight + Scheinwerfer + + + Please select at least one computer to add. + Bitte wählen Sie mindestens einen hinzuzufügenden Computer aus. + + + Please select at least one computer to remove. + Bitte wählen Sie mindestens einen zu entfernenden Computer aus. + + SystemTrayIcon @@ -4462,4 +4554,4 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Veyon Master - \ No newline at end of file + diff --git a/translations/veyon_el.ts b/translations/veyon_el.ts index 5458e3c7e..aede69349 100644 --- a/translations/veyon_el.ts +++ b/translations/veyon_el.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -33,7 +35,7 @@ Current language not translated yet (or native English). If you're interested in translating Veyon into your local or another language or want to improve an existing translation, please contact a Veyon developer! - + About %1 %2 @@ -48,11 +50,11 @@ If you're interested in translating Veyon into your local or another langua AccessControlPage Computer access control - + Grant access to every authenticated user (default) - + Test @@ -60,7 +62,7 @@ If you're interested in translating Veyon into your local or another langua Process access control rules - + User groups authorized for computer access @@ -84,15 +86,15 @@ If you're interested in translating Veyon into your local or another langua Access control rules - + Add access control rule - + Remove access control rule - + Move selected rule down @@ -132,30 +134,30 @@ If you're interested in translating Veyon into your local or another langua Enable usage of domain groups - + User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups - + AccessControlRuleEditDialog Edit access control rule - + General @@ -191,19 +193,19 @@ If you're interested in translating Veyon into your local or another langua Accessing computer is localhost - + Accessing user is logged on user - + Accessing user is already connected - + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Action @@ -219,7 +221,7 @@ If you're interested in translating Veyon into your local or another langua Ask logged on user for permission - + None (rule disabled) @@ -227,15 +229,15 @@ If you're interested in translating Veyon into your local or another langua Accessing user - + Accessing computer - + Local (logged on) user - + Local computer @@ -243,38 +245,38 @@ If you're interested in translating Veyon into your local or another langua Always process rule and ignore conditions - + No user logged on - + Accessing user has one or more groups in common with local (logged on) user - + Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + AccessControlRulesTestDialog Access control rules test - + Accessing user: - + Local computer: @@ -282,11 +284,11 @@ If you're interested in translating Veyon into your local or another langua Accessing computer: - + Please enter the following user and computer information in order to test the configured ruleset. - + Local user: @@ -298,19 +300,19 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario is allowed. - + The access in the given scenario is denied. - + The access in the given scenario needs permission of the logged on user. - + ERROR: Unknown action - + Test result @@ -318,14 +320,14 @@ If you're interested in translating Veyon into your local or another langua Authentication method - + AndroidPlatformConfigurationPage Android - + General @@ -336,7 +338,7 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationDialog Authentication keys - + Introduction @@ -344,35 +346,35 @@ If you're interested in translating Veyon into your local or another langua Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories - + Public key file base directory - + Private key file base directory - + ... @@ -380,18 +382,18 @@ If you're interested in translating Veyon into your local or another langua Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair - + Delete key @@ -407,14 +409,14 @@ The public key is used on client computers to authenticate incoming connection r Set access group - + AuthKeysConfigurationWidget Authentication keys - + Introduction @@ -422,54 +424,50 @@ The public key is used on client computers to authenticate incoming connection r Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories - + Public key file base directory - + Private key file base directory - - - - ... - ... + Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair - + Delete key @@ -485,7 +483,7 @@ The public key is used on client computers to authenticate incoming connection r Set access group - + Key files (*.pem) @@ -493,15 +491,15 @@ The public key is used on client computers to authenticate incoming connection r Authentication key name - + Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? - + Please select a key to delete! @@ -509,7 +507,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -517,11 +515,11 @@ The public key is used on client computers to authenticate incoming connection r Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + @@ -532,234 +530,234 @@ The public key is used on client computers to authenticate incoming connection r Key name contains invalid characters! - + Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" - + Failed to create public or private key! - + Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. - + Failed to write output file. - + Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. - + File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. - + Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> - + Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key - + List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP - + This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -770,22 +768,22 @@ The public key is used on client computers to authenticate incoming connection r Type - + Access group - + Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -793,22 +791,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -820,22 +818,22 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - + Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -847,78 +845,78 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - + Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error - + Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -957,54 +955,54 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - + Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type - + Name @@ -1012,7 +1010,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + MAC address @@ -1020,283 +1018,287 @@ The public key is used on client computers to authenticate incoming connection r Specified object not found. - + File "%1" does not exist! - + Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None - + Computer - + Root - + Invalid - + Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected - + Establishing connection - + Computer offline or switched off - - - - Service unreachable or not running - + Authentication failed or access denied - + Disconnected - + No user logged on - + Logged on user: %1 - + Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error - + Remote access @@ -1304,30 +1306,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1338,23 +1340,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1365,23 +1367,23 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1396,147 +1398,147 @@ The public key is used on client computers to authenticate incoming connection r Add location - + Save computer/user list - + Select output filename - + CSV files (*.csv) - + File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + DemoClient %1 Demo - + DemoConfigurationPage Demo server - + Tunables - + ms @@ -1544,15 +1546,15 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit - + Use multithreading (experimental) - + MB @@ -1568,7 +1570,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1587,66 +1589,74 @@ The public key is used on client computers to authenticate incoming connection r In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + DesktopAccessDialog Desktop access dialog - + Confirm desktop access - + Never for this session @@ -1658,18 +1668,18 @@ The public key is used on client computers to authenticate incoming connection r The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1677,35 +1687,35 @@ The public key is used on client computers to authenticate incoming connection r Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL - + New program - + New website - + @@ -1724,27 +1734,27 @@ The public key is used on client computers to authenticate incoming connection r Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + @@ -1755,43 +1765,43 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + @@ -1820,14 +1830,14 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories @@ -1835,107 +1845,103 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - - - ... - ... + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1994,7 +2000,7 @@ The public key is used on client computers to authenticate incoming connection r Debug messages and everything else - + Limit log file size @@ -2002,19 +2008,19 @@ The public key is used on client computers to authenticate incoming connection r Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: @@ -2026,11 +2032,11 @@ The public key is used on client computers to authenticate incoming connection r The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. @@ -2042,7 +2048,7 @@ The public key is used on client computers to authenticate incoming connection r Could not remove all log files. - + MB @@ -2050,7 +2056,7 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x @@ -2062,15 +2068,15 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - + Authentication - + Method: - + Test @@ -2078,131 +2084,131 @@ The public key is used on client computers to authenticate incoming connection r Configure - + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members @@ -2210,7 +2216,7 @@ The public key is used on client computers to authenticate incoming connection r Group member attribute - + Group not found @@ -2218,51 +2224,51 @@ The public key is used on client computers to authenticate incoming connection r Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users @@ -2282,123 +2288,123 @@ The public key is used on client computers to authenticate incoming connection r computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2417,143 +2423,143 @@ The public key is used on client computers to authenticate incoming connection r Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2561,199 +2567,199 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None - + TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2761,42 +2767,42 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2804,135 +2810,135 @@ The public key is used on client computers to authenticate incoming connection r Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses - + Add new network range - + Remove selected network range - + ID - + Valid until - + Licensee - + Information - + Installation ID - + Addons available for licensing - + Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + @@ -2943,7 +2949,7 @@ The public key is used on client computers to authenticate incoming connection r Disable balloon tooltips - + Show icons only @@ -2954,11 +2960,11 @@ The public key is used on client computers to authenticate incoming connection r MainWindow MainWindow - + toolBar - + General @@ -2986,7 +2992,7 @@ The public key is used on client computers to authenticate incoming connection r L&oad settings from file - + Ctrl+O @@ -2998,11 +3004,11 @@ The public key is used on client computers to authenticate incoming connection r Configuration not writable - + Load settings from file - + Save settings to file @@ -3018,7 +3024,7 @@ The public key is used on client computers to authenticate incoming connection r Veyon Configurator - + Service @@ -3026,7 +3032,7 @@ The public key is used on client computers to authenticate incoming connection r Master - + Access control @@ -3046,15 +3052,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3062,7 +3068,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3070,11 +3076,11 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3082,63 +3088,75 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - + Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + + + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + @@ -3153,23 +3171,23 @@ The public key is used on client computers to authenticate incoming connection r User configuration - + Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3177,7 +3195,7 @@ The public key is used on client computers to authenticate incoming connection r <no feature> - + Basic settings @@ -3189,7 +3207,7 @@ The public key is used on client computers to authenticate incoming connection r Enforce selected mode for client computers - + Hide local computer @@ -3197,11 +3215,11 @@ The public key is used on client computers to authenticate incoming connection r Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3209,11 +3227,11 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Thumbnail update interval - + ms @@ -3221,137 +3239,149 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Αυτόματα + + + Automatically adjust computer icon size + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - + NetworkDiscoveryConfigurationPage Network discovery - + Mode - + Scan network ranges - + e.g. 192.168.1.0/24 - + Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3359,43 +3389,43 @@ The public key is used on client computers to authenticate incoming connection r Network ranges - + Add new group - + Remove selected group - + Groups - + First address - + Last address - + Add new network range - + Remove selected network range - + Parallel scans - + Scan timeout - + ms @@ -3403,22 +3433,22 @@ The public key is used on client computers to authenticate incoming connection r Session scan limit - + Options - + Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3429,15 +3459,15 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3445,18 +3475,18 @@ The public key is used on client computers to authenticate incoming connection r Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3464,34 +3494,34 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + PowerControlFeaturePlugin Power on - + Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3503,15 +3533,15 @@ The public key is used on client computers to authenticate incoming connection r Power down - + Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot @@ -3519,95 +3549,95 @@ The public key is used on client computers to authenticate incoming connection r Confirm power down - + Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + PowerDownTimeInputDialog Power down - + Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control @@ -3627,7 +3657,7 @@ Please save your work and close all programs. Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3638,14 +3668,18 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + + + + %1 - %2 - %3 Remote Access + @@ -3716,14 +3750,14 @@ Please save your work and close all programs. Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3731,19 +3765,19 @@ Please save your work and close all programs. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3758,23 +3792,23 @@ Please save your work and close all programs. Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3785,7 +3819,7 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3793,7 +3827,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3804,19 +3838,19 @@ Please save your work and close all programs. Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3830,7 +3864,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3856,6 +3890,14 @@ Please save your work and close all programs. Delete Διαγραφή + + Screenshot + Στιγμιότυπο + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3893,35 +3935,35 @@ Please save your work and close all programs. Demo server port - + Enable firewall exception - + Allow connections from localhost only - + Internal VNC server port - + VNC server - + Plugin: - + Restart %1 Service - + All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running @@ -3929,91 +3971,91 @@ Please save your work and close all programs. Feature manager port - + Primary service port - + Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - + Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server - + Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + @@ -4028,15 +4070,15 @@ Typically this is required to support terminal servers. Configure and control Veyon service - + Register Veyon Service - + Unregister Veyon Service - + Start Veyon Service @@ -4052,30 +4094,80 @@ Typically this is required to support terminal servers. Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! - + Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + @@ -4089,22 +4181,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4115,7 +4207,7 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + @@ -4141,49 +4233,49 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4198,46 +4290,46 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control - + VeyonCore [OK] - + [FAIL] - + Invalid command! - + Available commands: @@ -4245,83 +4337,83 @@ Typically this is required to support terminal servers. Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! - + Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4329,111 +4421,111 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_es_ES.ts b/translations/veyon_es_ES.ts index 40c80ef5c..3acac8574 100644 --- a/translations/veyon_es_ES.ts +++ b/translations/veyon_es_ES.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -459,10 +461,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Private key file base directory Directorio base para archivo de clave privada - - ... - ... - Available authentication keys Claves de autenticación disponibles @@ -1273,10 +1271,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Computer offline or switched off El equipo está desconectado o apagado - - Service unreachable or not running - Servicio inaccesible o no ejecutándose - Authentication failed or access denied Error de autenticación o acceso denegado @@ -1297,12 +1291,20 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Location: %1 Ubicación: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer %1 Service %2 at %3:%4 -  Servicio %1 %2 en %3:%4 +  Servicio %1 %2 en %3:%4 Authentication error @@ -1601,51 +1603,59 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Demo - + Demo Share your screen or allow a user to share his screen with other users. - + Compartir tu pantalla o permitir que un usuario comparta su pantalla con otros usuarios. Full screen demo - + Demo a pantalla completa Share your own screen in fullscreen mode - + Compartir tu propia pantalla en modo de pantalla completa In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + En este modo, su pantalla se muestra en modo de pantalla completa en todas las computadoras mientras los dispositivos de entrada de los usuarios están bloqueados. Share your own screen in a window - + Compartir tu propia pantalla en una ventana Share selected user's screen in fullscreen mode - + Compartir la pantalla del usuario seleccionado en modo de pantalla completa In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + En este modo, la pantalla del usuario seleccionado se muestra en modo de pantalla completa en todas las computadoras mientras los dispositivos de entrada de los usuarios están bloqueados. Share selected user's screen in a window - + Compartir la pantalla del usuario seleccionado en una ventana In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + En este modo, la pantalla del usuario seleccionado se muestra en una ventana en todas las computadoras. Los usuarios pueden cambiar a otras ventanas según sea necesario. Please select a user screen to share. - + Seleccione una pantalla de usuario para compartir. Please select only one user screen to share. - + Seleccione solo una pantalla de usuario para compartir. + + + All screens + Todas las pantallas + + + Screen %1 [%2] + Pantalla %1 [%2] @@ -1847,10 +1857,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Destination directory Directorio de destino - - ... - ... - Default source directory Directorio de origen predeterminado @@ -3169,6 +3175,18 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Authentication Autenticación + + Slideshow + Diapositivas + + + Spotlight + Foco + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3326,16 +3344,28 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Thumbnail spacing - + Espaciado de miniaturas px - + px Hide local session Ocultar sesión local + + Thumbnail aspect ratio + Relación de aspecto de la miniatura + + + Auto + Auto + + + Automatically adjust computer icon size + + MonitoringMode @@ -3678,6 +3708,10 @@ Por favor guarde su trabajo y cierre todos los programas. %1 - %2 Remote Access %1 - %2 Acceso remoto + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3887,6 +3921,14 @@ Por favor guarde su trabajo y cierre todos los programas. Delete Borrar + + Screenshot + Captura + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4110,6 +4152,56 @@ Por lo general, esto es necesario para admitir servidores de terminales.Comandos para funcionalidades de shell + + SlideshowPanel + + Previous + Anterior + + + Start/pause + Inicio/pausa + + + Next + Siguiente + + + Duration: + Duración: + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + Añada computadoras haciendo clic con el botón central del ratón o haciendo clic en el primer botón a continuación. + + + Add selected computers + Añadir las computadoras seleccionadas + + + Remove selected computers + Eliminar las computadoras seleccionadas + + + Update computers in realtime + Actualizar computadoras en tiempo real + + + Spotlight + Foco + + + Please select at least one computer to add. + Seleccione al menos una computadora para añadir. + + + Please select at least one computer to remove. + Seleccione al menos una computadora para eliminar. + + SystemTrayIcon @@ -4468,4 +4560,4 @@ Por lo general, esto es necesario para admitir servidores de terminales.Veyon Master - \ No newline at end of file + diff --git a/translations/veyon_et.ts b/translations/veyon_et.ts index 80ebeea90..431408771 100644 --- a/translations/veyon_et.ts +++ b/translations/veyon_et.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -457,10 +459,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Private key file base directory Privaatvõtme failibaasi kataloog - - ... - ... - Available authentication keys Saadaval olevad autentimisvõtmed @@ -1271,10 +1269,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Computer offline or switched off Arvuti on võrguühenduseta või välja lülitatud - - Service unreachable or not running - Teenus pole kättesaadav või ei tööta - Authentication failed or access denied Autentimine nurjus või juurdepääs keelati @@ -1295,6 +1289,14 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Location: %1 Asukoht: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1599,51 +1601,59 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Demo - + Demo Share your screen or allow a user to share his screen with other users. - + Jagage oma ekraani või lubage kasutajal oma ekraani teiste kasutajatega jagada. Full screen demo - + Täisekraaniga demo Share your own screen in fullscreen mode - + Jagage oma ekraani täisekraanirežiimis In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Selles režiimis kuvatakse teie ekraani täisekraanirežiimis kõikides arvutites, kui kasutajate sisendseadmed on lukus. Share your own screen in a window - + Jagage oma ekraani aknas Share selected user's screen in fullscreen mode - + Jagage valitud kasutaja ekraani täisekraanrežiimis In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Selles režiimis kuvatakse valitud kasutaja ekraan täisekraani režiimis kõigis arvutites, kui kasutajate sisendseadmed on lukus. Share selected user's screen in a window - + Jaga valitud kasutaja ekraani aknas In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Selles režiimis kuvatakse valitud arvuti ekraan kõigi arvutite aknas. Kasutajad saavad vajadusel üle minna teistele akendele. Please select a user screen to share. - + Valige jagamiseks kasutajaekraan. Please select only one user screen to share. - + Valige jagamiseks ainult üks kasutajaekraan. + + + All screens + Kõik ekraanid + + + Screen %1 [%2] + Ekraan %1 [%2] @@ -1845,10 +1855,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Destination directory Sihtkataloog - - ... - ... - Default source directory Vaikeallika kataloog @@ -3167,6 +3173,18 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Authentication Autentimine + + Slideshow + Slaidiseanss + + + Spotlight + Tähelepanu keskpunktis + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3324,16 +3342,28 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Thumbnail spacing - + Pisipiltide vahe px - + px Hide local session Peida kohalik seanss + + Thumbnail aspect ratio + Pisipildi kuvasuhe + + + Auto + Auto + + + Automatically adjust computer icon size + + MonitoringMode @@ -3676,6 +3706,10 @@ Salvestage oma töö ja sulgege kõik programmid. %1 - %2 Remote Access %1 - %2 Kaugjuurdepääs + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3885,6 +3919,14 @@ Salvestage oma töö ja sulgege kõik programmid. Delete Kustuta + + Screenshot + Ekraanipilt + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4108,6 +4150,56 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Käsud kestade funktsionaalsuste jaoks + + SlideshowPanel + + Previous + Eelmine + + + Start/pause + Start/paus + + + Next + Järgmine + + + Duration: + Kestus: + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + Arvutite lisamiseks klõpsake hiire keskmise nupuga või klõpsake allolevat esimest nuppu. + + + Add selected computers + Lisage valitud arvutid + + + Remove selected computers + Eemaldage valitud arvutid + + + Update computers in realtime + Värskendage arvuteid reaalajas + + + Spotlight + Tähelepanu keskpunktis + + + Please select at least one computer to add. + Valige lisamiseks vähemalt üks arvuti. + + + Please select at least one computer to remove. + Valige eemaldamiseks vähemalt üks arvuti. + + SystemTrayIcon @@ -4466,4 +4558,4 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Veyon Master - \ No newline at end of file + diff --git a/translations/veyon_fa.ts b/translations/veyon_fa.ts index 5a4bf1b23..cb40ae7c9 100644 --- a/translations/veyon_fa.ts +++ b/translations/veyon_fa.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -149,7 +151,7 @@ If you're interested in translating Veyon into your local or another langua Restrict access to members of specific user groups - + @@ -256,15 +258,15 @@ If you're interested in translating Veyon into your local or another langua Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + @@ -319,14 +321,14 @@ If you're interested in translating Veyon into your local or another langua Authentication method - + AndroidPlatformConfigurationPage Android - + General @@ -349,19 +351,19 @@ If you're interested in translating Veyon into your local or another langua 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -388,7 +390,7 @@ If you're interested in translating Veyon into your local or another langua A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair @@ -427,19 +429,19 @@ The public key is used on client computers to authenticate incoming connection r 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -453,10 +455,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory فایل پایگاه داده فایل خصوصی - - ... - ... - Available authentication keys کلیدهای تأیید موجود @@ -466,7 +464,7 @@ The public key is used on client computers to authenticate incoming connection r A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair @@ -529,230 +527,230 @@ The public key is used on client computers to authenticate incoming connection r AuthKeysManager Please check your permissions. - + Key name contains invalid characters! - + Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" - + Failed to create public or private key! - + Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. - + Failed to write output file. - + Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. - + File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. - + Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> - + Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key - + List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP - + This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -760,33 +758,33 @@ The public key is used on client computers to authenticate incoming connection r Key file - + AuthKeysTableModel Name - + Type - + Access group - + Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -794,22 +792,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -825,18 +823,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -852,14 +850,14 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -867,18 +865,18 @@ The public key is used on client computers to authenticate incoming connection r Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error @@ -886,22 +884,22 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + @@ -912,14 +910,14 @@ The public key is used on client computers to authenticate incoming connection r Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -930,302 +928,302 @@ The public key is used on client computers to authenticate incoming connection r BuiltinDirectoryConfigurationPage Computers - + Name - + Host address/IP - + MAC address - + Add new computer - + Remove selected computer - + New computer - + Builtin directory - + Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type - + Name - + Host address - + MAC address - + Specified object not found. - + File "%1" does not exist! - + Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None - + Computer - + Root - + Invalid - + Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + @@ -1264,10 +1262,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off کامپیوتر آفلاین یا خاموش است - - Service unreachable or not running - سرویس غیر قابل دسترس یا در حال اجرا نیست - Authentication failed or access denied تأیید اعتبار ناموفق بود یا دسترسی به آن ممنوع شد @@ -1286,7 +1280,15 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + @@ -1301,34 +1303,34 @@ The public key is used on client computers to authenticate incoming connection r Remote access - + User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1347,42 +1349,42 @@ The public key is used on client computers to authenticate incoming connection r Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + ComputerMonitoring Computers - + Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1397,7 +1399,7 @@ The public key is used on client computers to authenticate incoming connection r Add location - + Save computer/user list @@ -1452,7 +1454,7 @@ The public key is used on client computers to authenticate incoming connection r Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. @@ -1503,23 +1505,23 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1537,7 +1539,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms @@ -1569,7 +1571,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1592,51 +1594,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1666,47 +1676,47 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name - + Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL - + New program - + New website - + @@ -1733,66 +1743,66 @@ The public key is used on client computers to authenticate incoming connection r Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + @@ -1828,7 +1838,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferConfigurationPage File transfer - + Directories @@ -1836,107 +1846,103 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - - - ... - ... + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -2011,39 +2017,39 @@ The public key is used on client computers to authenticate incoming connection r Network object directory - + Backend: - + Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB @@ -2051,27 +2057,27 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x - + seconds - + Write to logging system of operating system - + Authentication - + Method: - + Test @@ -2079,334 +2085,334 @@ The public key is used on client computers to authenticate incoming connection r Configure - + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users - + user groups - + computers - + computer groups - + computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + LdapConfigurationPage Basic settings - + General @@ -2414,147 +2420,147 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2562,199 +2568,199 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None - + TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2762,42 +2768,42 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2805,161 +2811,161 @@ The public key is used on client computers to authenticate incoming connection r Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses - + Add new network range - + Remove selected network range - + ID - + Valid until - + Licensee - + Information - + Installation ID - + Addons available for licensing - + Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + MainToolBar Configuration - + Disable balloon tooltips - + Show icons only - + MainWindow MainWindow - + toolBar - + General @@ -2967,71 +2973,71 @@ The public key is used on client computers to authenticate incoming connection r &File - + &Help - + &Quit - + Ctrl+Q - + Ctrl+S - + L&oad settings from file - + Ctrl+O - + About Qt - + Configuration not writable - + Load settings from file - + Save settings to file - + Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service - + Master - + Access control - + About Veyon @@ -3039,7 +3045,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3047,15 +3053,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3063,7 +3069,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3071,11 +3077,11 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3083,19 +3089,19 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - + Adjust optimal size - + Align computers to grid - + %1 Configurator @@ -3103,43 +3109,55 @@ The public key is used on client computers to authenticate incoming connection r Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + + + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + @@ -3158,19 +3176,19 @@ The public key is used on client computers to authenticate incoming connection r Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3178,19 +3196,19 @@ The public key is used on client computers to authenticate incoming connection r <no feature> - + Basic settings - + Behaviour - + Enforce selected mode for client computers - + Hide local computer @@ -3198,11 +3216,11 @@ The public key is used on client computers to authenticate incoming connection r Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3210,11 +3228,11 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Thumbnail update interval - + ms @@ -3222,98 +3240,110 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + + + + Automatically adjust computer icon size + MonitoringMode Monitoring - + Builtin monitoring mode @@ -3321,38 +3351,38 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. - + NetworkDiscoveryConfigurationPage Network discovery - + Mode - + Scan network ranges - + e.g. 192.168.1.0/24 - + Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3360,43 +3390,43 @@ The public key is used on client computers to authenticate incoming connection r Network ranges - + Add new group - + Remove selected group - + Groups - + First address - + Last address - + Add new network range - + Remove selected network range - + Parallel scans - + Scan timeout - + ms @@ -3404,22 +3434,22 @@ The public key is used on client computers to authenticate incoming connection r Session scan limit - + Options - + Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3430,15 +3460,15 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3446,61 +3476,61 @@ The public key is used on client computers to authenticate incoming connection r Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name - + Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + PowerControlFeaturePlugin Power on - + Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot - + Click this button to reboot all computers. - + Power down @@ -3508,77 +3538,77 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot - + Confirm power down - + Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3589,42 +3619,42 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control - + Open a remote control window for a computer. - + Remote access - + Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: @@ -3639,14 +3669,18 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + + + + %1 - %2 - %3 Remote Access + @@ -3657,39 +3691,39 @@ Please save your work and close all programs. Remote control - + Send shortcut - + Fullscreen - + Window - + Ctrl+Alt+Del - + Ctrl+Esc - + Alt+Tab - + Alt+F4 - + Win+Tab - + Win @@ -3701,7 +3735,7 @@ Please save your work and close all programs. Alt+Ctrl+F1 - + Connecting %1 @@ -3713,38 +3747,38 @@ Please save your work and close all programs. Screenshot - + Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3759,53 +3793,53 @@ Please save your work and close all programs. Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot - + Could not open screenshot file %1 for writing. - + ScreenshotFeaturePlugin Screenshot - + Use this function to take a screenshot of selected computers. - + Screenshots taken @@ -3857,6 +3891,14 @@ Please save your work and close all programs. Delete حذف + + Screenshot + + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3866,11 +3908,11 @@ Please save your work and close all programs. Autostart - + Hide tray icon - + Start service @@ -3886,7 +3928,7 @@ Please save your work and close all programs. State: - + Network @@ -3894,7 +3936,7 @@ Please save your work and close all programs. Demo server port - + Enable firewall exception @@ -3939,51 +3981,51 @@ Please save your work and close all programs. Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - + Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -3991,30 +4033,30 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + @@ -4064,19 +4106,69 @@ Typically this is required to support terminal servers. ShellCommandLinePlugin Run command file - + File "%1" does not exist! - + Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + @@ -4090,22 +4182,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4154,15 +4246,15 @@ Typically this is required to support terminal servers. Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + @@ -4180,11 +4272,11 @@ Typically this is required to support terminal servers. UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4199,27 +4291,27 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4262,46 +4354,46 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + @@ -4322,7 +4414,7 @@ Typically this is required to support terminal servers. WindowsPlatformConfigurationPage Windows - + General @@ -4330,51 +4422,51 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4388,31 +4480,31 @@ Typically this is required to support terminal servers. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + @@ -4434,7 +4526,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_fr.ts b/translations/veyon_fr.ts index 47ac97011..a85663183 100644 --- a/translations/veyon_fr.ts +++ b/translations/veyon_fr.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -457,10 +459,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Private key file base directory Répertoire de base des clés d'accès privées - - ... - ... - Available authentication keys Clés d'authentification disponibles @@ -1271,10 +1269,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Computer offline or switched off Ordinateur hors ligne ou éteint - - Service unreachable or not running - Service injoignable ou éteint - Authentication failed or access denied L'authentification a échouée ou l'accès est refusé @@ -1295,6 +1289,14 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Location: %1 Emplacement: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1607,7 +1609,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Full screen demo - + Démo en plein écran Share your own screen in fullscreen mode @@ -1639,11 +1641,19 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please select a user screen to share. - + Veuillez sélectionner un écran d'utilisateur à partager. Please select only one user screen to share. - + Veuillez sélectionner un seul écran utilisateur à partager. + + + All screens + Tous les écrans + + + Screen %1 [%2] + Écran %1 [%2] @@ -1845,10 +1855,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Destination directory Répertoire de destination - - ... - ... - Default source directory Répertoire source par défaut @@ -3167,6 +3173,18 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Authentication Authentification + + Slideshow + Diaporama + + + Spotlight + Focalisation + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3324,16 +3342,28 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Thumbnail spacing - + Espacement des miniatures px - + px Hide local session Masquer la session locale + + Thumbnail aspect ratio + Rapport hauteur / largeur de la miniature + + + Auto + Auto + + + Automatically adjust computer icon size + + MonitoringMode @@ -3676,6 +3706,10 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. %1 - %2 Remote Access %1 - %2 Accès distant + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3885,6 +3919,14 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Delete Supprimer + + Screenshot + Capture d'écran + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4108,6 +4150,56 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Commandes pour les fonctionnalités du terminal + + SlideshowPanel + + Previous + Précédent + + + Start/pause + Démarrage/pause + + + Next + Suivant + + + Duration: + Durée: + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + Ajoutez des ordinateurs en cliquant avec le bouton central de la souris ou en cliquant sur le premier bouton ci-dessous. + + + Add selected computers + Ajouter les ordinateurs sélectionnés + + + Remove selected computers + Supprimer les ordinateurs sélectionnés + + + Update computers in realtime + Mettre à jour les ordinateurs en temps réel + + + Spotlight + Focalisation + + + Please select at least one computer to add. + Veuillez sélectionner au moins un ordinateur à ajouter. + + + Please select at least one computer to remove. + Veuillez sélectionner au moins un ordinateur à supprimer. + + SystemTrayIcon @@ -4466,4 +4558,4 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Veyon Maître - \ No newline at end of file + diff --git a/translations/veyon_he.ts b/translations/veyon_he.ts index ed1c1d022..397cc0489 100644 --- a/translations/veyon_he.ts +++ b/translations/veyon_he.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -136,19 +138,19 @@ If you're interested in translating Veyon into your local or another langua User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups - + @@ -179,31 +181,31 @@ If you're interested in translating Veyon into your local or another langua Invert all conditions ("is/has" interpreted as "is/has not") - + Conditions - + is member of group - + Accessing computer is localhost - + Accessing user is logged on user - + Accessing user is already connected - + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Action @@ -223,19 +225,19 @@ If you're interested in translating Veyon into your local or another langua None (rule disabled) - + Accessing user - + Accessing computer - + Local (logged on) user - + Local computer @@ -243,7 +245,7 @@ If you're interested in translating Veyon into your local or another langua Always process rule and ignore conditions - + No user logged on @@ -251,30 +253,30 @@ If you're interested in translating Veyon into your local or another langua Accessing user has one or more groups in common with local (logged on) user - + Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + AccessControlRulesTestDialog Access control rules test - + Accessing user: - + Local computer: @@ -286,7 +288,7 @@ If you're interested in translating Veyon into your local or another langua Please enter the following user and computer information in order to test the configured ruleset. - + Local user: @@ -298,27 +300,27 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario is allowed. - + The access in the given scenario is denied. - + The access in the given scenario needs permission of the logged on user. - + ERROR: Unknown action - + Test result - + Authentication method - + @@ -336,43 +338,43 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationDialog Authentication keys - + Introduction - + Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories - + Public key file base directory - + Private key file base directory - + ... @@ -380,318 +382,314 @@ If you're interested in translating Veyon into your local or another langua Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair - + Delete key - + Import key - + Export key - + Set access group - + AuthKeysConfigurationWidget Authentication keys - + Introduction - + Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories - + Public key file base directory - + Private key file base directory - - - - ... - ... + Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair - + Delete key - + Import key - + Export key - + Set access group - + Key files (*.pem) - + Authentication key name - + Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? - + Please select a key to delete! - + Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! - + Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + AuthKeysManager Please check your permissions. - + Key name contains invalid characters! - + Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" - + Failed to create public or private key! - + Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. - + Failed to write output file. - + Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. - + File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. - + Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> - + Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key - + List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP @@ -699,67 +697,67 @@ The public key is used on client computers to authenticate incoming connection r This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -778,14 +776,14 @@ The public key is used on client computers to authenticate incoming connection r Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -793,22 +791,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -824,18 +822,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -851,33 +849,33 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error @@ -885,40 +883,40 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -957,31 +955,31 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - + Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + @@ -1000,7 +998,7 @@ The public key is used on client computers to authenticate incoming connection r Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1012,7 +1010,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + MAC address @@ -1020,31 +1018,31 @@ The public key is used on client computers to authenticate incoming connection r Specified object not found. - + File "%1" does not exist! - + Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None - + Computer @@ -1052,224 +1050,220 @@ The public key is used on client computers to authenticate incoming connection r Root - + Invalid - + Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected - + Establishing connection - + Computer offline or switched off - - - - Service unreachable or not running - + Authentication failed or access denied - + Disconnected @@ -1285,14 +1279,22 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1304,30 +1306,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1338,23 +1340,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1369,34 +1371,34 @@ The public key is used on client computers to authenticate incoming connection r Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel Computer management - + Computer search - + Add location - + Save computer/user list @@ -1404,7 +1406,7 @@ The public key is used on client computers to authenticate incoming connection r Select output filename - + CSV files (*.csv) @@ -1412,120 +1414,120 @@ The public key is used on client computers to authenticate incoming connection r File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + DemoClient %1 Demo - + @@ -1536,15 +1538,15 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms - + Key frame interval - + Memory limit @@ -1552,23 +1554,23 @@ The public key is used on client computers to authenticate incoming connection r Use multithreading (experimental) - + MB - + Update interval - + s - + Slow down thumbnail updates while demo is running - + @@ -1583,59 +1585,67 @@ The public key is used on client computers to authenticate incoming connection r Give a demonstration by screen broadcasting - + In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1651,26 +1661,26 @@ The public key is used on client computers to authenticate incoming connection r Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1682,31 +1692,31 @@ The public key is used on client computers to authenticate incoming connection r Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL - + New program - + New website - + @@ -1721,96 +1731,96 @@ The public key is used on client computers to authenticate incoming connection r Click this button to open a website on all computers. - + Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: - + Password: @@ -1821,122 +1831,118 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories - + Destination directory - - - - ... - ... + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1955,15 +1961,15 @@ The public key is used on client computers to authenticate incoming connection r Veyon - + Logging - + Log file directory - + ... @@ -1971,11 +1977,11 @@ The public key is used on client computers to authenticate incoming connection r Log level - + Nothing - + Only critical messages @@ -1983,79 +1989,79 @@ The public key is used on client computers to authenticate incoming connection r Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB - + Rotate log files - + x - + seconds @@ -2063,15 +2069,15 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - + Authentication - + Method: - + Test @@ -2079,191 +2085,191 @@ The public key is used on client computers to authenticate incoming connection r Configure - + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users @@ -2283,11 +2289,11 @@ The public key is used on client computers to authenticate incoming connection r computer containers - + groups of user - + User not found @@ -2295,111 +2301,111 @@ The public key is used on client computers to authenticate incoming connection r Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2414,107 +2420,107 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings @@ -2522,39 +2528,39 @@ The public key is used on client computers to authenticate incoming connection r Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2562,15 +2568,15 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name @@ -2578,83 +2584,83 @@ The public key is used on client computers to authenticate incoming connection r Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None - + TLS @@ -2666,95 +2672,95 @@ The public key is used on client computers to authenticate incoming connection r e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2762,178 +2768,178 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command - + Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses - + Add new network range - + Remove selected network range - + ID - + Valid until - + Licensee - + Information - + Installation ID - + Addons available for licensing - + Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + @@ -2944,11 +2950,11 @@ The public key is used on client computers to authenticate incoming connection r Disable balloon tooltips - + Show icons only - + @@ -2959,7 +2965,7 @@ The public key is used on client computers to authenticate incoming connection r toolBar - + General @@ -2967,39 +2973,39 @@ The public key is used on client computers to authenticate incoming connection r &File - + &Help - + &Quit - + Ctrl+Q - + Ctrl+S - + L&oad settings from file - + Ctrl+O - + About Qt - + Configuration not writable - + Load settings from file @@ -3011,27 +3017,27 @@ The public key is used on client computers to authenticate incoming connection r Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service - + Master - + Access control - + About Veyon @@ -3039,7 +3045,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3047,15 +3053,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3063,7 +3069,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3071,11 +3077,11 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3083,7 +3089,7 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers @@ -3091,62 +3097,74 @@ The public key is used on client computers to authenticate incoming connection r Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + + + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + MasterConfigurationPage Directories - + ... @@ -3158,19 +3176,19 @@ The public key is used on client computers to authenticate incoming connection r Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3178,7 +3196,7 @@ The public key is used on client computers to authenticate incoming connection r <no feature> - + Basic settings @@ -3186,23 +3204,23 @@ The public key is used on client computers to authenticate incoming connection r Behaviour - + Enforce selected mode for client computers - + Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3210,149 +3228,161 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Thumbnail update interval - + ms - + Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + + + + Automatically adjust computer icon size + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - + NetworkDiscoveryConfigurationPage Network discovery - + Mode - + Scan network ranges - + e.g. 192.168.1.0/24 - + Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3360,66 +3390,66 @@ The public key is used on client computers to authenticate incoming connection r Network ranges - + Add new group - + Remove selected group - + Groups - + First address - + Last address - + Add new network range - + Remove selected network range - + Parallel scans - + Scan timeout - + ms - + Session scan limit - + Options - + Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3430,34 +3460,34 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3465,23 +3495,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3492,7 +3522,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3500,7 +3530,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to reboot all computers. - + Power down @@ -3508,11 +3538,11 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot @@ -3524,61 +3554,61 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3589,26 +3619,26 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control @@ -3616,7 +3646,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Remote access @@ -3624,29 +3654,33 @@ Please save your work and close all programs. Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command - + RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + + + + %1 - %2 - %3 Remote Access + @@ -3661,7 +3695,7 @@ Please save your work and close all programs. Send shortcut - + Fullscreen @@ -3693,11 +3727,11 @@ Please save your work and close all programs. Win - + Menu - + Alt+Ctrl+F1 @@ -3705,7 +3739,7 @@ Please save your work and close all programs. Connecting %1 - + Connected. @@ -3717,76 +3751,76 @@ Please save your work and close all programs. Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + ScreenLockFeaturePlugin Lock - + Unlock - + Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3794,7 +3828,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3805,19 +3839,19 @@ Please save your work and close all programs. Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3831,7 +3865,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3851,12 +3885,20 @@ Please save your work and close all programs. Show - + Delete מחק + + Screenshot + צילום מסך + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3866,11 +3908,11 @@ Please save your work and close all programs. Autostart - + Hide tray icon - + Start service @@ -3878,7 +3920,7 @@ Please save your work and close all programs. Stopped - + Stop service @@ -3886,104 +3928,104 @@ Please save your work and close all programs. State: - + Network - + Demo server port - + Enable firewall exception - + Allow connections from localhost only - + Internal VNC server port - + VNC server - + Plugin: - + Restart %1 Service - + All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running - + Feature manager port - + Primary service port - + Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - + Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -3991,121 +4033,171 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + ServiceControlPlugin Service is running - + Service is not running - + Configure and control Veyon service - + Register Veyon Service - + Unregister Veyon Service - + Start Veyon Service - + Stop Veyon Service - + Restart Veyon Service - + Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! - + Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + SystemTrayIcon System tray icon - + SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4116,7 +4208,7 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + @@ -4127,7 +4219,7 @@ Typically this is required to support terminal servers. Use this function to send a text message to all users e.g. to assign them new tasks. - + Message from teacher @@ -4142,27 +4234,27 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + @@ -4173,18 +4265,18 @@ Typically this is required to support terminal servers. Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4199,130 +4291,130 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control - + VeyonCore [OK] - + [FAIL] - + Invalid command! - + Available commands: - + Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! - + Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4330,111 +4422,111 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_hu.ts b/translations/veyon_hu.ts index 3f9a271b2..aa5987552 100644 --- a/translations/veyon_hu.ts +++ b/translations/veyon_hu.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -265,7 +267,7 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő Authenticated via method - + @@ -457,10 +459,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Private key file base directory Privát kulcsfájl alapmappája - - ... - ... - Available authentication keys Elérhető hitelesítési kulcsok @@ -767,7 +765,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Key file - + @@ -793,7 +791,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso AuthLdapConfigurationWidget LDAP authentication - + General @@ -801,11 +799,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -816,7 +814,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -874,7 +872,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Logon - + @@ -908,7 +906,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Simple password - + @@ -926,7 +924,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso AuthenticationPageTab Enabled - + Test @@ -1261,7 +1259,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Online and connected - Online és sikeren csatlakozott + Online és sikeresen csatlakozott Establishing connection @@ -1271,10 +1269,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Computer offline or switched off A számítógép nincs hálózaton vagy kikapcsolták - - Service unreachable or not running - A szolgáltatás nem érhető el vagy jelenleg nem fut - Authentication failed or access denied A hitelesítés sikertelen vagy a hozzáférés nem engedélyezett @@ -1295,6 +1289,14 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Location: %1 Helyszín: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1328,14 +1330,14 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Active connections: - + ComputerGroupSelector Group %1 - + @@ -1362,7 +1364,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - Nem sikerült azt a helyszínt azonosítani, amelyikhez a számítógép tartozik. Ez a rendszer hibás konfigurálására utal. Ehelyett a számítógépkijelölés-panelen az összes helyszínt megjelentjük. + Nem sikerült azt a helyszínt azonosítani, amelyikhez a számítógép tartozik. Ez a rendszer hibás konfigurálására utal. Ehelyett a számítógépkijelölés-panelen az összes helyszínt megjelenítjük. @@ -1377,19 +1379,19 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1526,7 +1528,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Could not configure the firewall configuration for the %1 Service. - + @@ -1599,51 +1601,59 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1843,15 +1853,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Destination directory - - - - ... - ... + Default source directory - + Options @@ -1859,11 +1865,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Remember last source directory - + Create destination directory if it does not exist - + @@ -1923,7 +1929,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Click this button to transfer files from your computer to all computers. - Kattints erre gombra, hogy számítógépedről fájlokat küld át az összes számítógépre. + Kattints erre gombra, hogy számítógépedről fájlokat küldj át az összes számítógépre. Select one or more files to transfer @@ -2341,7 +2347,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Computer groups filter - + Computer locations identification @@ -2353,11 +2359,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2863,7 +2869,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2871,7 +2877,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso LDAP bind - + @@ -3167,6 +3173,18 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Authentication Hitelesítés + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3320,19 +3338,31 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Automatikus + + + Automatically adjust computer icon size + @@ -3479,11 +3509,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3491,23 +3521,23 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3665,7 +3695,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3674,6 +3704,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 - %2 távoli hozzáférés + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3789,7 +3823,7 @@ Please save your work and close all programs. To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - Az összes felhasználó figyelmének elnyerés érdekében evvel a gombbak zárolhatod számítógépüket. Ebben a módban az összes bemeneti eszközt zároljuk és a képernyő elfeketedik. + Az összes felhasználó figyelmének elnyerés érdekében evvel a gombbal zárolhatod számítógépüket. Ebben a módban az összes bemeneti eszközt zároljuk és a képernyő elfeketedik. Lock input devices @@ -3797,11 +3831,11 @@ Please save your work and close all programs. Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3820,7 +3854,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3883,6 +3917,14 @@ Please save your work and close all programs. Delete Törlés + + Screenshot + Képernyőkép + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3948,7 +3990,7 @@ Please save your work and close all programs. All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - Az összes beállítást sikeresen mentette. A változások életbe lépéséhez %1 szolgáltatást új kell indítani. Újraindítod most? + Az összes beállítást sikeresen mentette. A változások életbe lépéséhez %1 szolgáltatást újra kell indítani. Újraindítod most? Running @@ -3981,27 +4023,27 @@ Typically this is required to support terminal servers. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server @@ -4017,7 +4059,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4105,6 +4147,56 @@ Typically this is required to support terminal servers. Parancsok héjfunkciókhoz + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4229,7 +4321,7 @@ Typically this is required to support terminal servers. Click this button to log in a specific user on all computers. - Kattints erre a gombra, hogy egy megadott felhasználó bejelentkezzen az össze számítógépre. + Kattints erre a gombra, hogy egy megadott felhasználó bejelentkezzen az összes számítógépre. Log off @@ -4237,7 +4329,7 @@ Typically this is required to support terminal servers. Click this button to log off users from all computers. - Kattints erre a gombra, hogy felhasználókat kijelentkeztesd az össze számítógépről. + Kattints erre a gombra, hogy a felhasználókat kijelentkeztesd az összes számítógépről. Confirm user logoff @@ -4400,7 +4492,7 @@ Typically this is required to support terminal servers. Use input device interception driver - + @@ -4460,7 +4552,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_id.ts b/translations/veyon_id.ts index 7ff476135..d88375f7b 100644 --- a/translations/veyon_id.ts +++ b/translations/veyon_id.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -265,7 +267,7 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Authenticated via method - + Metode autentikasi menggunakan @@ -320,14 +322,14 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Authentication method - + Metode autentikasi AndroidPlatformConfigurationPage Android - + Android General @@ -362,7 +364,7 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -382,7 +384,7 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Available authentication keys - + Kunci autentikasi tersedia An authentication key pair consist of two coupled cryptographic keys, a private and a public key. @@ -443,7 +445,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -457,13 +459,9 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Private key file base directory Direktori basis file kunci pribadi - - ... - ... - Available authentication keys - + Kunci autentikasi tersedia An authentication key pair consist of two coupled cryptographic keys, a private and a public key. @@ -517,7 +515,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -525,11 +523,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + @@ -544,15 +542,15 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" @@ -564,23 +562,23 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Tidak dapat menghaps file kunci "%1"! Could not remove key file directory "%1"! - + Tidak dapat menghapus kunci file direktori "%1"! Failed to create directory for output file. - + Gagal dalam membuat direktori untuk output file. File "%1" already exists. - + File "%1" telah tersedia' Failed to write output file. @@ -588,7 +586,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. @@ -596,11 +594,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. @@ -608,70 +606,70 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> - + <Tidak Diketahui> Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key @@ -707,7 +705,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME @@ -719,19 +717,19 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE @@ -743,31 +741,31 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -793,7 +791,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone AuthLdapConfigurationWidget LDAP authentication - + General @@ -801,11 +799,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -816,7 +814,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -832,7 +830,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Logon failed with given username and password. Please try again! - + @@ -843,7 +841,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter your username and password in order to access computers. - + Username @@ -859,22 +857,22 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + @@ -885,7 +883,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter the Veyon password: - + Authentication error @@ -893,40 +891,40 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -965,7 +963,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Builtin directory - + Locations & computers @@ -1004,11 +1002,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1048,7 +1046,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Unclassified object "%1" with ID "%2" - + None @@ -1060,7 +1058,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Root - + Invalid @@ -1068,7 +1066,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Error while parsing line %1. - + Network object directory which stores objects in local configuration @@ -1080,7 +1078,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone No format string or regular expression specified! - + Can't open file "%1" for writing! @@ -1088,7 +1086,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone No format string specified! - + Object UUID @@ -1108,7 +1106,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Dump all or individual locations and computers - + List all locations and computers @@ -1136,47 +1134,47 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1188,65 +1186,65 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + @@ -1265,19 +1263,15 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Establishing connection - + Computer offline or switched off - - - - Service unreachable or not running - + Authentication failed or access denied - + Disconnected @@ -1289,18 +1283,26 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Logged on user: %1 - + Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1308,34 +1310,34 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Remote access - + User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1354,11 +1356,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. @@ -1377,54 +1379,54 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel Computer management - + Computer search - + Add location - + Save computer/user list - + Select output filename - + CSV files (*.csv) - + File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + @@ -1483,7 +1485,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please specify a valid key. - + Specified key does not exist in current configuration! @@ -1491,11 +1493,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon @@ -1506,34 +1508,34 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + DemoClient %1 Demo - + @@ -1544,7 +1546,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Tunables - + ms @@ -1552,15 +1554,15 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Key frame interval - + Memory limit - + Use multithreading (experimental) - + MB @@ -1568,89 +1570,97 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Update interval - + s - + Slow down thumbnail updates while demo is running - + DemoFeaturePlugin Stop demo - + Window demo - + Give a demonstration by screen broadcasting - + In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + DesktopAccessDialog Desktop access dialog - + Confirm desktop access @@ -1666,18 +1676,18 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1685,157 +1695,157 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL - + URL New program - + New website - + DesktopServicesFeaturePlugin Run program - + Open website - + Click this button to open a website on all computers. - + Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: - + Password: - + FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories @@ -1843,107 +1853,103 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Destination directory - - - - ... - ... + Default source directory - + Options - + Opsi Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Opsi Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1954,23 +1960,23 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Language: - + Use system language setting - + Veyon - + Logging - + Log file directory - + ... @@ -1978,43 +1984,43 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Log level - + Nothing - + Only critical messages - + Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory @@ -2022,35 +2028,35 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Backend: - + Backend: Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB @@ -2058,27 +2064,27 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Rotate log files - + x - + seconds - + Write to logging system of operating system - + Authentication - + Method: - + Test @@ -2086,14 +2092,14 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Configure - + LdapBrowseDialog Browse LDAP - + @@ -2107,27 +2113,27 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. @@ -2135,130 +2141,130 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations @@ -2266,147 +2272,147 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Computer location attribute - + Location name attribute - + users - + user groups - + computers - + computer groups - + computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2421,147 +2427,147 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2569,75 +2575,75 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security @@ -2649,15 +2655,15 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone System defaults - + Never (insecure!) - + Custom CA certificate file - + None @@ -2673,23 +2679,23 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) @@ -2701,31 +2707,31 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location @@ -2737,11 +2743,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name @@ -2749,7 +2755,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter the name of a computer location (wildcards allowed): - + Enter location name @@ -2757,11 +2763,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2769,42 +2775,42 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2812,58 +2818,58 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (memuat komputer dan lokasi untuk LDAP/AD) %1 (load users and groups from LDAP/AD) - + %1 (memuat pengguna dan group untuk LDAP/AD) Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Perizinan Installed licenses - + Lisensi ter install Add new network range @@ -2875,54 +2881,54 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone ID - + ID Valid until - + Berlaku hingga Licensee - + Penerima lisensi Information - + Informasi Installation ID - + ID instalasi Addons available for licensing - + Addons tersedia untuk perizinan Addon - + Tambahan LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + @@ -2936,11 +2942,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LocationDialog Select location - + enter search filter... - + @@ -2962,11 +2968,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone MainWindow MainWindow - + toolBar - + General @@ -2994,7 +3000,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone L&oad settings from file - + Ctrl+O @@ -3034,11 +3040,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Master - + Access control - + About Veyon @@ -3046,7 +3052,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Auto - + About @@ -3054,7 +3060,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone %1 Configurator %2 - + JSON files (*.json) @@ -3062,7 +3068,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3078,11 +3084,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3098,19 +3104,19 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. @@ -3118,35 +3124,47 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + + + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + @@ -3185,7 +3203,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone <no feature> - + Basic settings @@ -3197,7 +3215,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Enforce selected mode for client computers - + Hide local computer @@ -3221,7 +3239,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Thumbnail update interval - + ms @@ -3229,7 +3247,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Program start - + Modes and features @@ -3249,7 +3267,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Computer thumbnail caption - + Text color @@ -3273,7 +3291,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Allow adding hidden locations manually - + Hide empty locations @@ -3281,54 +3299,66 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + + + + Automatically adjust computer icon size + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - + @@ -3399,11 +3429,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Parallel scans - + Pemindaian paralel Scan timeout - + Waktu pemindaian habis ms @@ -3411,60 +3441,60 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Session scan limit - + Batas sesi pemindaian Options - + Opsi Reverse lookup discovered IP addresses to host names - + Reverse lookup menemukan alamat IP ke nama host NetworkObjectTreeModel Locations/Computers - + OpenWebsiteDialog Open website - + e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3472,23 +3502,23 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3499,7 +3529,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3515,35 +3545,35 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot - + Confirm power down - + Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. @@ -3551,41 +3581,41 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3596,46 +3626,46 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control - + Open a remote control window for a computer. - + Remote access - + Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3646,29 +3676,33 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + + + + %1 - %2 - %3 Remote Access + RemoteAccessWidgetToolBar View only - + Remote control - + Send shortcut - + Fullscreen @@ -3712,7 +3746,7 @@ Please save your work and close all programs. Connecting %1 - + Connected. @@ -3724,14 +3758,14 @@ Please save your work and close all programs. Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3739,19 +3773,19 @@ Please save your work and close all programs. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3766,34 +3800,34 @@ Please save your work and close all programs. Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3801,7 +3835,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3812,19 +3846,19 @@ Please save your work and close all programs. Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3838,7 +3872,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3864,6 +3898,14 @@ Please save your work and close all programs. Delete Hapus + + Screenshot + Tangkapan layar + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3901,7 +3943,7 @@ Please save your work and close all programs. Demo server port - + Enable firewall exception @@ -3909,15 +3951,15 @@ Please save your work and close all programs. Allow connections from localhost only - + Internal VNC server port - + VNC server - + Plugin: @@ -3925,11 +3967,11 @@ Please save your work and close all programs. Restart %1 Service - + All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running @@ -3937,60 +3979,60 @@ Please save your work and close all programs. Feature manager port - + Primary service port - + Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - + Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Sesi sesi Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -3998,7 +4040,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4060,18 +4102,18 @@ Typically this is required to support terminal servers. Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4079,11 +4121,61 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + @@ -4097,22 +4189,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4123,18 +4215,18 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + TextMessageFeaturePlugin Text message - + Use this function to send a text message to all users e.g. to assign them new tasks. - + Message from teacher @@ -4149,49 +4241,49 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4206,31 +4298,31 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control - + @@ -4253,11 +4345,11 @@ Typically this is required to support terminal servers. Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! @@ -4269,7 +4361,7 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed @@ -4277,31 +4369,31 @@ Typically this is required to support terminal servers. INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + @@ -4315,21 +4407,21 @@ Typically this is required to support terminal servers. VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4337,51 +4429,51 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4395,53 +4487,53 @@ Typically this is required to support terminal servers. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_it.ts b/translations/veyon_it.ts index 61b6d25fc..46fb75b29 100644 --- a/translations/veyon_it.ts +++ b/translations/veyon_it.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -454,10 +456,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory Cartella chiave Privata - - ... - ... - Available authentication keys Chiavi di autenticazione disponibili @@ -1265,10 +1263,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off Computer disconnesso o spento - - Service unreachable or not running - Servizio irraggiungibile o non in esecuzione - Authentication failed or access denied Autenticazione fallita o accesso negato @@ -1289,6 +1283,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 Posizione: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1593,51 +1595,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Demo Share your screen or allow a user to share his screen with other users. - + Condividi il tuo schermo o consenti a un utente di condividere il suo schermo con altri utenti. Full screen demo - + Demo a schermo intero Share your own screen in fullscreen mode - + Condividi il tuo schermo in modalità a schermo intero In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + In questa modalità lo schermo viene visualizzato in modalità a schermo intero su tutti i computer mentre i dispositivi di input degli utenti sono bloccati. Share your own screen in a window - + Condividi il tuo schermo in una finestra Share selected user's screen in fullscreen mode - + Condividi lo schermo dell'utente selezionato in modalità a schermo intero In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + In questa modalità lo schermo dell'utente selezionato viene visualizzato in modalità a schermo intero su tutti i computer mentre i dispositivi di input degli utenti sono bloccati. Share selected user's screen in a window - + Condividi lo schermo dell'utente selezionato in una finestra In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + In questa modalità lo schermo dell'utente selezionato viene visualizzato in una finestra su tutti i computer. Gli utenti possono passare ad altre finestre secondo necessità. Please select a user screen to share. - + Seleziona una schermata utente da condividere. Please select only one user screen to share. - + Seleziona solo uno schermo utente da condividere. + + + All screens + Tutti gli schermi + + + Screen %1 [%2] + Schermo %1 [%2] @@ -1839,10 +1849,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory Directory di destinazione - - ... - ... - Default source directory Directory di origine predefinita @@ -3151,6 +3157,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication Autenticazione + + Slideshow + Presentazione + + + Spotlight + Spotlight + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3308,16 +3326,28 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail spacing - + Spaziatura delle miniature px - + px Hide local session Nascondi sessione locale + + Thumbnail aspect ratio + Proporzioni delle miniature + + + Auto + Automatico + + + Automatically adjust computer icon size + + MonitoringMode @@ -3660,6 +3690,10 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. %1 - %2 Remote Access %1 -%2 Accesso remoto + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3869,6 +3903,14 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Delete Elimina + + Screenshot + Screenshot + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4091,6 +4133,56 @@ Typically this is required to support terminal servers. Comandi per le funzionalità della shell + + SlideshowPanel + + Previous + Precedente + + + Start/pause + Avvia/pausa + + + Next + Prossimo + + + Duration: + Durata: + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + Aggiungi computer facendo clic con il pulsante centrale del mouse o facendo clic sul primo pulsante in basso. + + + Add selected computers + Aggiungi computer selezionati + + + Remove selected computers + Rimuovi i computer selezionati + + + Update computers in realtime + Aggiorna i computer in tempo reale + + + Spotlight + Spotlight + + + Please select at least one computer to add. + Seleziona almeno un computer da aggiungere. + + + Please select at least one computer to remove. + Seleziona almeno un computer da rimuovere. + + SystemTrayIcon @@ -4449,4 +4541,4 @@ Typically this is required to support terminal servers. Veyon Master - \ No newline at end of file + diff --git a/translations/veyon_ja.ts b/translations/veyon_ja.ts index 9f321d4d1..64155c6df 100644 --- a/translations/veyon_ja.ts +++ b/translations/veyon_ja.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -266,7 +268,7 @@ If you're interested in translating Veyon into your local or another langua Authenticated via method - + @@ -321,7 +323,7 @@ If you're interested in translating Veyon into your local or another langua Authentication method - + @@ -458,10 +460,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory プライベートキーのファイルの場所 - - ... - ... - Available authentication keys 使用可能な認証キー @@ -768,7 +766,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -794,7 +792,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -802,11 +800,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -817,7 +815,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -875,7 +873,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + @@ -909,25 +907,25 @@ The public key is used on client computers to authenticate incoming connection r Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -1141,15 +1139,15 @@ The public key is used on client computers to authenticate incoming connection r FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room @@ -1161,23 +1159,23 @@ The public key is used on client computers to authenticate incoming connection r Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1189,100 +1187,96 @@ The public key is used on client computers to authenticate incoming connection r PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected - + Establishing connection - + Computer offline or switched off - - - - Service unreachable or not running - + Authentication failed or access denied - + Disconnected - + No user logged on @@ -1290,18 +1284,26 @@ The public key is used on client computers to authenticate incoming connection r Logged on user: %1 - + Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1313,30 +1315,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1347,23 +1349,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1374,167 +1376,167 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel Computer management - + Computer search - + Add location - + Save computer/user list - + Select output filename - + CSV files (*.csv) - + File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + DemoClient %1 Demo - + @@ -1545,7 +1547,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms @@ -1553,38 +1555,38 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit - + Use multithreading (experimental) - + MB - + Update interval - + s - + Slow down thumbnail updates while demo is running - + DemoFeaturePlugin Stop demo - + Window demo @@ -1592,7 +1594,7 @@ The public key is used on client computers to authenticate incoming connection r Give a demonstration by screen broadcasting - + In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. @@ -1600,58 +1602,66 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + DesktopAccessDialog Desktop access dialog - + Confirm desktop access @@ -1659,26 +1669,26 @@ The public key is used on client computers to authenticate incoming connection r Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1686,23 +1696,23 @@ The public key is used on client computers to authenticate incoming connection r Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL @@ -1710,11 +1720,11 @@ The public key is used on client computers to authenticate incoming connection r New program - + New website - + @@ -1725,15 +1735,15 @@ The public key is used on client computers to authenticate incoming connection r Open website - + Click this button to open a website on all computers. - + Start programs and services in user desktop - + Click this button to run a program on all computers. @@ -1749,42 +1759,42 @@ The public key is used on client computers to authenticate incoming connection r Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program @@ -1792,51 +1802,51 @@ The public key is used on client computers to authenticate incoming connection r Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: - + Password: - + FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories @@ -1844,15 +1854,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - - - ... - ... + Default source directory - + Options @@ -1860,25 +1866,25 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options @@ -1886,49 +1892,49 @@ The public key is used on client computers to authenticate incoming connection r Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer @@ -1936,15 +1942,15 @@ The public key is used on client computers to authenticate incoming connection r Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1955,19 +1961,19 @@ The public key is used on client computers to authenticate incoming connection r Language: - + Use system language setting - + Veyon - + Logging - + Log file directory @@ -1999,27 +2005,27 @@ The public key is used on client computers to authenticate incoming connection r Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory - + Backend: @@ -2027,43 +2033,43 @@ The public key is used on client computers to authenticate incoming connection r Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB - + Rotate log files - + x - + seconds @@ -2071,7 +2077,7 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - + Authentication @@ -2079,7 +2085,7 @@ The public key is used on client computers to authenticate incoming connection r Method: - + Test @@ -2087,171 +2093,171 @@ The public key is used on client computers to authenticate incoming connection r Configure - + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses @@ -2259,162 +2265,162 @@ The public key is used on client computers to authenticate incoming connection r Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users - + user groups - + computers - + computer groups - + computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + LdapConfigurationPage Basic settings - + General @@ -2422,147 +2428,147 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2570,95 +2576,95 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None @@ -2666,103 +2672,103 @@ The public key is used on client computers to authenticate incoming connection r TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2770,42 +2776,42 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2813,11 +2819,11 @@ The public key is used on client computers to authenticate incoming connection r Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) @@ -2829,23 +2835,23 @@ The public key is used on client computers to authenticate incoming connection r Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2853,7 +2859,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP bind - + @@ -2907,56 +2913,56 @@ The public key is used on client computers to authenticate incoming connection r LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + MainToolBar Configuration - + Disable balloon tooltips - + Show icons only - + @@ -2979,67 +2985,67 @@ The public key is used on client computers to authenticate incoming connection r &Help - + &Quit - + Ctrl+Q - + Ctrl+S - + L&oad settings from file - + Ctrl+O - + About Qt - + Configuration not writable - + Load settings from file - + Save settings to file - + Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service - + Master - + Access control - + About Veyon @@ -3047,7 +3053,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3055,15 +3061,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3071,84 +3077,96 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots - + Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration - + Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - + Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication 認証 + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3162,55 +3180,55 @@ The public key is used on client computers to authenticate incoming connection r User configuration - + Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots - + <no feature> - + Basic settings - + Behaviour - + Enforce selected mode for client computers - + Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3218,11 +3236,11 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Thumbnail update interval - + ms @@ -3230,102 +3248,114 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + + + + Automatically adjust computer icon size + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. @@ -3427,45 +3457,45 @@ The public key is used on client computers to authenticate incoming connection r NetworkObjectTreeModel Locations/Computers - + OpenWebsiteDialog Open website - + e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3473,23 +3503,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3500,23 +3530,23 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot - + Click this button to reboot all computers. - + Power down - + Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer @@ -3524,7 +3554,7 @@ The public key is used on client computers to authenticate incoming connection r Confirm reboot - + Confirm power down @@ -3532,23 +3562,23 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! @@ -3556,27 +3586,27 @@ The public key is used on client computers to authenticate incoming connection r Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? @@ -3587,26 +3617,26 @@ The public key is used on client computers to authenticate incoming connection r The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + PowerDownTimeInputDialog Power down - + Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3625,7 +3655,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Remote access @@ -3633,11 +3663,11 @@ Please save your work and close all programs. Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3648,21 +3678,25 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + + + + %1 - %2 - %3 Remote Access + RemoteAccessWidgetToolBar View only - + Remote control @@ -3670,7 +3704,7 @@ Please save your work and close all programs. Send shortcut - + Fullscreen @@ -3678,82 +3712,82 @@ Please save your work and close all programs. Window - + Ctrl+Alt+Del - + Ctrl+Esc - + Alt+Tab - + Alt+F4 - + Win+Tab - + Win - + Menu - + Alt+Ctrl+F1 - + Connecting %1 - + Connected. - + Screenshot - + Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3776,95 +3810,103 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot - + Could not open screenshot file %1 for writing. - + ScreenshotFeaturePlugin Screenshot - + Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + ScreenshotManagementPage Screenshots - + ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: - + Computer: - + Date: - + Time: - + Show - + Delete - + + + + Screenshot + + + + Do you really want to delete all selected screenshots? + @@ -3899,7 +3941,7 @@ Please save your work and close all programs. Network - + Demo server port @@ -3907,23 +3949,23 @@ Please save your work and close all programs. Enable firewall exception - + Allow connections from localhost only - + Internal VNC server port - + VNC server - + Plugin: - + Restart %1 Service @@ -3931,32 +3973,32 @@ Please save your work and close all programs. All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running - + Feature manager port - + Primary service port - + Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - + Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked @@ -3964,35 +4006,35 @@ Typically this is required to support terminal servers. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4000,80 +4042,80 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + ServiceControlPlugin Service is running - + Service is not running - + Configure and control Veyon service - + Register Veyon Service - + Unregister Veyon Service - + Start Veyon Service - + Stop Veyon Service - + Restart Veyon Service - + Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4081,62 +4123,112 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + SystemTrayIcon System tray icon - + SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + TextMessageDialog Send text message - + Use the field below to type your message which will be sent to all selected users. - + TextMessageFeaturePlugin Text message - + Use this function to send a text message to all users e.g. to assign them new tasks. - + Message from teacher @@ -4144,56 +4236,56 @@ Typically this is required to support terminal servers. Send a message to a user - + UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4208,27 +4300,27 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4239,99 +4331,99 @@ Typically this is required to support terminal servers. VeyonCore [OK] - + [FAIL] - + Invalid command! - + Available commands: - + Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! - + Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4339,7 +4431,7 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock @@ -4347,103 +4439,103 @@ Typically this is required to support terminal servers. Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_ko.ts b/translations/veyon_ko.ts index 11782129b..aa73ca2c2 100644 --- a/translations/veyon_ko.ts +++ b/translations/veyon_ko.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -265,7 +267,7 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 Authenticated via method - + @@ -320,7 +322,7 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 Authentication method - + @@ -457,10 +459,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory 개인 키 화일 기본 폴더 - - ... - ... - Available authentication keys 사용 가능한 인증키들 @@ -767,7 +765,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -793,7 +791,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -801,11 +799,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -816,7 +814,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -874,7 +872,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + @@ -908,7 +906,7 @@ The public key is used on client computers to authenticate incoming connection r Simple password - + @@ -926,7 +924,7 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPageTab Enabled - + Test @@ -1271,10 +1269,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off 컴퓨터 오프라인 또는 전원 꺼짐 - - Service unreachable or not running - 서비스에 연결할 수 없거나 실행중이 아님 - Authentication failed or access denied 인증 실패 또는 접근 거부됨 @@ -1295,6 +1289,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 장소: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1328,14 +1330,14 @@ The public key is used on client computers to authenticate incoming connection r Active connections: - + ComputerGroupSelector Group %1 - + @@ -1377,19 +1379,19 @@ The public key is used on client computers to authenticate incoming connection r Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1526,7 +1528,7 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Service. - + @@ -1599,51 +1601,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1843,15 +1853,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - - - ... - ... + Default source directory - + Options @@ -1859,11 +1865,11 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + @@ -2339,7 +2345,7 @@ The public key is used on client computers to authenticate incoming connection r Computer groups filter - + Computer locations identification @@ -2351,11 +2357,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2861,7 +2867,7 @@ The public key is used on client computers to authenticate incoming connection r Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2869,7 +2875,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP bind - + @@ -3165,6 +3171,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication 인증 + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3318,19 +3336,31 @@ The public key is used on client computers to authenticate incoming connection r Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + 자동 + + + Automatically adjust computer icon size + @@ -3477,11 +3507,11 @@ The public key is used on client computers to authenticate incoming connection r PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3489,23 +3519,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3665,7 +3695,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3674,6 +3704,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 - %2 원격 접근 + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3793,15 +3827,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3820,7 +3854,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3883,6 +3917,14 @@ Please save your work and close all programs. Delete 삭제 + + Screenshot + 화면캡쳐 + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3982,35 +4024,35 @@ Typically this is required to support terminal servers. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4018,7 +4060,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4106,6 +4148,56 @@ Typically this is required to support terminal servers. 쉘 기능용 명령어들 + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4397,11 +4489,11 @@ Typically this is required to support terminal servers. Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4461,7 +4553,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_lt.ts b/translations/veyon_lt.ts index 4f4779e17..7b4e0ac4b 100644 --- a/translations/veyon_lt.ts +++ b/translations/veyon_lt.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -264,7 +266,7 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p Authenticated via method - + @@ -456,10 +458,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Private key file base directory Privataus rakto saugojimo direktorija - - ... - ... - Available authentication keys Galimi autorizavimo raktai @@ -792,7 +790,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u AuthLdapConfigurationWidget LDAP authentication - + General @@ -800,11 +798,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -815,7 +813,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -873,7 +871,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Logon - + @@ -907,7 +905,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Simple password - + @@ -925,7 +923,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u AuthenticationPageTab Enabled - + Test @@ -1270,10 +1268,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Computer offline or switched off Kompiuteris nepasiekiamas arba išjungtas - - Service unreachable or not running - Servisas nepasiekiamas arba nevykdomas - Authentication failed or access denied Autorizacija nepavyko arba prieiga negalima @@ -1294,6 +1288,14 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Location: %1 Vieta: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1334,7 +1336,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u ComputerGroupSelector Group %1 - + Grupė %1 @@ -1349,7 +1351,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed @@ -1361,7 +1363,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1376,19 +1378,19 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Select all - + Pasirinkti viską Unselect all - + Add to group - + Pridėti prie grupės Remove from group - + Pašalinti iš grupės @@ -1423,18 +1425,18 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not write the computer and users list to %1! Please check the file access permissions. - + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file @@ -1446,23 +1448,23 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! @@ -1470,7 +1472,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please specify a valid filename for the configuration export. - + Output file is not writable! @@ -1486,7 +1488,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Specified key does not exist in current configuration! - + Please specify a valid value. @@ -1498,34 +1500,34 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1594,55 +1596,63 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1842,15 +1852,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Destination directory - - - - ... - ... + Default source directory - + Options @@ -1858,11 +1864,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Remember last source directory - + Create destination directory if it does not exist - + @@ -2112,7 +2118,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed @@ -2122,7 +2128,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful @@ -2140,7 +2146,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2150,7 +2156,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2160,7 +2166,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2198,7 +2204,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u computer group tree - + Computer group tree @@ -2226,7 +2232,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects @@ -2242,15 +2248,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses @@ -2262,7 +2268,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u computer locations - + Computer location attribute @@ -2290,7 +2296,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u computer containers - + groups of user @@ -2302,7 +2308,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer @@ -2314,7 +2320,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed @@ -2322,19 +2328,19 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups @@ -2342,11 +2348,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2356,7 +2362,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2364,17 +2370,17 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and @@ -2382,31 +2388,31 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2453,7 +2459,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext @@ -2505,11 +2511,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute @@ -2521,7 +2527,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. uid or sAMAccountName - + Advanced settings @@ -2569,7 +2575,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter a user login name (wildcards allowed) which to query: - + Enter group name @@ -2593,7 +2599,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter a user login name whose group memberships to query: - + Enter computer IP address @@ -2605,7 +2611,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u (only if different from group tree) - + Computer group tree @@ -2617,7 +2623,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. room or computerLab - + Integration tests @@ -2629,15 +2635,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security @@ -2673,23 +2679,23 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) @@ -2717,19 +2723,19 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations @@ -2737,19 +2743,19 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name @@ -2757,7 +2763,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter the name of a location whose entries to query: - + Browse @@ -2769,15 +2775,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname @@ -2785,7 +2791,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter a computer hostname whose group memberships to query: - + User login name attribute @@ -2793,18 +2799,18 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2812,39 +2818,39 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2852,54 +2858,54 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses - + Add new network range - + Remove selected network range - + ID - + Valid until - + Licensee - + Information - + Installation ID - + Addons available for licensing - + Addon - + @@ -2910,7 +2916,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Custom PAM service for user authentication - + User authentication @@ -2922,14 +2928,14 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + @@ -2940,7 +2946,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u enter search filter... - + @@ -2951,11 +2957,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Disable balloon tooltips - + Show icons only - + @@ -3034,7 +3040,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Master - + Access control @@ -3046,7 +3052,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Auto - + About @@ -3054,15 +3060,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3070,7 +3076,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3082,7 +3088,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3090,7 +3096,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers @@ -3098,27 +3104,27 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file @@ -3130,15 +3136,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers @@ -3148,6 +3154,18 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Authentication Autorizavimas + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3165,7 +3183,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Feature on computer double click: - + Features @@ -3185,7 +3203,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u <no feature> - + Basic settings @@ -3201,15 +3219,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3229,11 +3247,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Program start - + Modes and features - + User and computer name @@ -3273,7 +3291,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Allow adding hidden locations manually - + Hide empty locations @@ -3289,77 +3307,89 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + + + + Automatically adjust computer icon size + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - + NetworkDiscoveryConfigurationPage Network discovery - + Mode - + Scan network ranges - + e.g. 192.168.1.0/24 - + Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3367,43 +3397,43 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Network ranges - + Add new group - + Remove selected group - + Groups - + First address - + Last address - + Add new network range - + Remove selected network range - + Parallel scans - + Scan timeout - + ms @@ -3411,7 +3441,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Session scan limit - + Options @@ -3419,7 +3449,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Reverse lookup discovered IP addresses to host names - + @@ -3441,7 +3471,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Remember and add to website menu - + e.g. www.veyon.io @@ -3449,7 +3479,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter the URL of the website to open: - + Name: @@ -3460,11 +3490,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3472,23 +3502,23 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3499,7 +3529,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3515,7 +3545,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer @@ -3535,11 +3565,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS @@ -3555,11 +3585,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now @@ -3571,21 +3601,21 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3596,7 +3626,7 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes @@ -3615,7 +3645,7 @@ Please save your work and close all programs. Open a remote view for a computer without interaction. - + Remote control @@ -3623,7 +3653,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Remote access @@ -3635,7 +3665,7 @@ Please save your work and close all programs. Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3646,14 +3676,18 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + + + + %1 - %2 - %3 Remote Access + @@ -3668,7 +3702,7 @@ Please save your work and close all programs. Send shortcut - + Fullscreen @@ -3731,7 +3765,7 @@ Please save your work and close all programs. RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3747,7 +3781,7 @@ Please save your work and close all programs. Remember and add to program menu - + e.g. VLC @@ -3770,19 +3804,19 @@ Please save your work and close all programs. To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3793,7 +3827,7 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3801,7 +3835,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3812,19 +3846,19 @@ Please save your work and close all programs. Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3838,7 +3872,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3864,6 +3898,14 @@ Please save your work and close all programs. Delete Ištrinti + + Screenshot + Ekrano vaizdas + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3946,7 +3988,7 @@ Please save your work and close all programs. Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection @@ -3962,27 +4004,27 @@ Typically this is required to support terminal servers. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server @@ -3998,7 +4040,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4064,7 +4106,7 @@ Typically this is required to support terminal servers. Commands for configuring and controlling Veyon Service - + @@ -4086,6 +4128,56 @@ Typically this is required to support terminal servers. Shell funkcijų komandos + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4097,7 +4189,7 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) @@ -4210,7 +4302,7 @@ Typically this is required to support terminal servers. Click this button to log in a specific user on all computers. - + Log off @@ -4373,15 +4465,15 @@ Typically this is required to support terminal servers. Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4444,4 +4536,4 @@ Typically this is required to support terminal servers. Veyon Master - \ No newline at end of file + diff --git a/translations/veyon_lv.ts b/translations/veyon_lv.ts index e4cbec6ae..c3a16a58f 100644 --- a/translations/veyon_lv.ts +++ b/translations/veyon_lv.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -130,27 +132,27 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l The specified user is not allowed to access computers with this configuration. - + Enable usage of domain groups - + User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups - + @@ -181,7 +183,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Invert all conditions ("is/has" interpreted as "is/has not") - + Conditions @@ -193,19 +195,19 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Accessing computer is localhost - + Accessing user is logged on user - + Accessing user is already connected - + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Action @@ -245,7 +247,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Always process rule and ignore conditions - + No user logged on @@ -253,19 +255,19 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Accessing user has one or more groups in common with local (logged on) user - + Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + @@ -288,7 +290,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Please enter the following user and computer information in order to test the configured ruleset. - + Local user: @@ -308,7 +310,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l The access in the given scenario needs permission of the logged on user. - + ERROR: Unknown action @@ -320,14 +322,14 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Authentication method - + AndroidPlatformConfigurationPage Android - + General @@ -346,23 +348,23 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -389,7 +391,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair @@ -424,23 +426,23 @@ The public key is used on client computers to authenticate incoming connection r Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -454,10 +456,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory Privāto atslēgfailu atrašanās mape - - ... - ... - Available authentication keys Pieejamās autentifikācijas atslēgas @@ -467,7 +465,7 @@ The public key is used on client computers to authenticate incoming connection r A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair @@ -499,11 +497,11 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? - + Please select a key to delete! @@ -511,7 +509,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -519,11 +517,11 @@ The public key is used on client computers to authenticate incoming connection r Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + @@ -534,43 +532,43 @@ The public key is used on client computers to authenticate incoming connection r Key name contains invalid characters! - + Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" - + Failed to create public or private key! - + Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. @@ -582,7 +580,7 @@ The public key is used on client computers to authenticate incoming connection r Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. @@ -590,11 +588,11 @@ The public key is used on client computers to authenticate incoming connection r File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. @@ -610,47 +608,47 @@ The public key is used on client computers to authenticate incoming connection r Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> @@ -665,7 +663,7 @@ The public key is used on client computers to authenticate incoming connection r AuthKeysPlugin Create new authentication key pair - + Delete authentication key @@ -673,23 +671,23 @@ The public key is used on client computers to authenticate incoming connection r List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY @@ -701,7 +699,7 @@ The public key is used on client computers to authenticate incoming connection r This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME @@ -713,19 +711,19 @@ The public key is used on client computers to authenticate incoming connection r This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE @@ -737,31 +735,31 @@ The public key is used on client computers to authenticate incoming connection r Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -787,7 +785,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -795,22 +793,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -826,18 +824,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -853,33 +851,33 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error @@ -887,40 +885,40 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -963,27 +961,27 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + @@ -994,15 +992,15 @@ The public key is used on client computers to authenticate incoming connection r Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1030,19 +1028,19 @@ The public key is used on client computers to authenticate incoming connection r Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None @@ -1066,23 +1064,23 @@ The public key is used on client computers to authenticate incoming connection r Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID @@ -1094,35 +1092,35 @@ The public key is used on client computers to authenticate incoming connection r Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE @@ -1130,47 +1128,47 @@ The public key is used on client computers to authenticate incoming connection r LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1182,47 +1180,47 @@ The public key is used on client computers to authenticate incoming connection r PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS @@ -1233,14 +1231,14 @@ The public key is used on client computers to authenticate incoming connection r BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + @@ -1263,15 +1261,11 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off - - - - Service unreachable or not running - + Authentication failed or access denied - + Disconnected @@ -1283,18 +1277,26 @@ The public key is used on client computers to authenticate incoming connection r Logged on user: %1 - + Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1306,30 +1308,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1340,23 +1342,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1367,23 +1369,23 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1398,7 +1400,7 @@ The public key is used on client computers to authenticate incoming connection r Add location - + Save computer/user list @@ -1418,109 +1420,109 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. - + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1546,7 +1548,7 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit @@ -1554,7 +1556,7 @@ The public key is used on client computers to authenticate incoming connection r Use multithreading (experimental) - + MB @@ -1570,7 +1572,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1589,89 +1591,97 @@ The public key is used on client computers to authenticate incoming connection r In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + DesktopAccessDialog Desktop access dialog - + Confirm desktop access - + Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1691,11 +1701,11 @@ The public key is used on client computers to authenticate incoming connection r Predefined websites - + Remove selected website - + URL @@ -1703,18 +1713,18 @@ The public key is used on client computers to authenticate incoming connection r New program - + New website - + DesktopServicesFeaturePlugin Run program - + Open website @@ -1722,15 +1732,15 @@ The public key is used on client computers to authenticate incoming connection r Click this button to open a website on all computers. - + Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" @@ -1738,80 +1748,80 @@ The public key is used on client computers to authenticate incoming connection r Custom program - + Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: - + Password: @@ -1822,14 +1832,14 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories @@ -1837,15 +1847,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - - - ... - ... + Default source directory - + Options @@ -1853,25 +1859,25 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options @@ -1879,72 +1885,72 @@ The public key is used on client computers to authenticate incoming connection r Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + GeneralConfigurationPage User interface - + Language: @@ -1952,7 +1958,7 @@ The public key is used on client computers to authenticate incoming connection r Use system language setting - + Veyon @@ -1972,31 +1978,31 @@ The public key is used on client computers to authenticate incoming connection r Log level - + Nothing - + Only critical messages - + Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size @@ -2004,23 +2010,23 @@ The public key is used on client computers to authenticate incoming connection r Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: - + %1 service @@ -2028,15 +2034,15 @@ The public key is used on client computers to authenticate incoming connection r The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error @@ -2044,7 +2050,7 @@ The public key is used on client computers to authenticate incoming connection r Could not remove all log files. - + MB @@ -2052,7 +2058,7 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x @@ -2064,7 +2070,7 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - + Authentication @@ -2072,7 +2078,7 @@ The public key is used on client computers to authenticate incoming connection r Method: - + Test @@ -2080,131 +2086,131 @@ The public key is used on client computers to authenticate incoming connection r Configure - + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members @@ -2212,7 +2218,7 @@ The public key is used on client computers to authenticate incoming connection r Group member attribute - + Group not found @@ -2220,51 +2226,51 @@ The public key is used on client computers to authenticate incoming connection r Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users @@ -2284,11 +2290,11 @@ The public key is used on client computers to authenticate incoming connection r computer containers - + groups of user - + User not found @@ -2296,118 +2302,118 @@ The public key is used on client computers to authenticate incoming connection r Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + LdapConfigurationPage Basic settings - + General @@ -2415,147 +2421,147 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2563,7 +2569,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name @@ -2571,7 +2577,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter a group name whose members to query: - + Enter computer name @@ -2579,43 +2585,43 @@ The public key is used on client computers to authenticate incoming connection r Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups @@ -2623,23 +2629,23 @@ The public key is used on client computers to authenticate incoming connection r e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults @@ -2647,11 +2653,11 @@ The public key is used on client computers to authenticate incoming connection r Never (insecure!) - + Custom CA certificate file - + None @@ -2659,103 +2665,103 @@ The public key is used on client computers to authenticate incoming connection r TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2763,42 +2769,42 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2806,131 +2812,131 @@ The public key is used on client computers to authenticate incoming connection r Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses - + Add new network range - + Remove selected network range - + ID - + Valid until - + Licensee - + Information - + Installation ID - + Addons available for licensing - + Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... @@ -2941,26 +2947,26 @@ The public key is used on client computers to authenticate incoming connection r MainToolBar Configuration - + Disable balloon tooltips - + Show icons only - + MainWindow MainWindow - + toolBar - + General @@ -2988,7 +2994,7 @@ The public key is used on client computers to authenticate incoming connection r L&oad settings from file - + Ctrl+O @@ -2996,31 +3002,31 @@ The public key is used on client computers to authenticate incoming connection r About Qt - + Configuration not writable - + Load settings from file - + Save settings to file - + Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service @@ -3028,11 +3034,11 @@ The public key is used on client computers to authenticate incoming connection r Master - + Access control - + About Veyon @@ -3040,7 +3046,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3048,15 +3054,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3064,7 +3070,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3072,23 +3078,23 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration - + Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - + Adjust optimal size @@ -3100,48 +3106,60 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication Autentifikācija + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3155,11 +3173,11 @@ The public key is used on client computers to authenticate incoming connection r User configuration - + Feature on computer double click: - + Features @@ -3183,39 +3201,39 @@ The public key is used on client computers to authenticate incoming connection r Basic settings - + Behaviour - + Enforce selected mode for client computers - + Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface - + Background color - + Thumbnail update interval - + ms @@ -3223,137 +3241,149 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + + + + Automatically adjust computer icon size + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - + NetworkDiscoveryConfigurationPage Network discovery - + Mode - + Scan network ranges - + e.g. 192.168.1.0/24 - + Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3361,43 +3391,43 @@ The public key is used on client computers to authenticate incoming connection r Network ranges - + Add new group - + Remove selected group - + Groups - + First address - + Last address - + Add new network range - + Remove selected network range - + Parallel scans - + Scan timeout - + ms @@ -3405,7 +3435,7 @@ The public key is used on client computers to authenticate incoming connection r Session scan limit - + Options @@ -3413,14 +3443,14 @@ The public key is used on client computers to authenticate incoming connection r Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3431,34 +3461,34 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3466,23 +3496,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3493,7 +3523,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3501,7 +3531,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to reboot all computers. - + Power down @@ -3509,7 +3539,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer @@ -3533,7 +3563,7 @@ The public key is used on client computers to authenticate incoming connection r Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS @@ -3541,45 +3571,45 @@ The public key is used on client computers to authenticate incoming connection r This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3590,15 +3620,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3625,11 +3655,11 @@ Please save your work and close all programs. Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3640,7 +3670,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3649,6 +3679,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 - %2 Attālināta piekļuve + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3718,14 +3752,14 @@ Please save your work and close all programs. Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3733,19 +3767,19 @@ Please save your work and close all programs. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3760,23 +3794,23 @@ Please save your work and close all programs. Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3787,7 +3821,7 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3795,7 +3829,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3832,7 +3866,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3858,6 +3892,14 @@ Please save your work and close all programs. Delete Izdzēst + + Screenshot + Ekrānšāviņš + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3887,7 +3929,7 @@ Please save your work and close all programs. State: - + Network @@ -3903,7 +3945,7 @@ Please save your work and close all programs. Allow connections from localhost only - + Internal VNC server port @@ -3923,7 +3965,7 @@ Please save your work and close all programs. All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running @@ -3931,60 +3973,60 @@ Please save your work and close all programs. Feature manager port - + Primary service port - + Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - + Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -3992,7 +4034,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4030,7 +4072,7 @@ Typically this is required to support terminal servers. Configure and control Veyon service - + Register Veyon Service @@ -4054,11 +4096,11 @@ Typically this is required to support terminal servers. Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + @@ -4073,11 +4115,61 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + @@ -4091,22 +4183,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4117,7 +4209,7 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + @@ -4128,7 +4220,7 @@ Typically this is required to support terminal servers. Use this function to send a text message to all users e.g. to assign them new tasks. - + Message from teacher @@ -4143,11 +4235,11 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) @@ -4155,15 +4247,15 @@ Typically this is required to support terminal servers. Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + @@ -4174,18 +4266,18 @@ Typically this is required to support terminal servers. Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4200,31 +4292,31 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control - + @@ -4247,11 +4339,11 @@ Typically this is required to support terminal servers. Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! @@ -4263,7 +4355,7 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed @@ -4279,23 +4371,23 @@ Typically this is required to support terminal servers. USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + @@ -4316,14 +4408,14 @@ Typically this is required to support terminal servers. WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4331,111 +4423,111 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_mn.ts b/translations/veyon_mn.ts index 435719fce..fed29788d 100644 --- a/translations/veyon_mn.ts +++ b/translations/veyon_mn.ts @@ -452,10 +452,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory Хувийн түлхүүрийг агуулсан сан - - ... - ... - Available authentication keys @@ -1263,10 +1259,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off - - Service unreachable or not running - - Authentication failed or access denied @@ -1287,6 +1279,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1637,6 +1637,14 @@ The public key is used on client computers to authenticate incoming connection r Please select only one user screen to share. + + All screens + + + + Screen %1 [%2] + + DesktopAccessDialog @@ -1837,10 +1845,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - ... - ... - Default source directory @@ -3140,6 +3144,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication Баталгаажуулалт + + Adjust size of computer icons automatically + + + + Slideshow + + + + Spotlight + + MasterConfigurationPage @@ -3307,6 +3323,18 @@ The public key is used on client computers to authenticate incoming connection r Hide local session + + Auto + + + + Thumbnail aspect ratio + + + + Automatically adjust computer icon size + + MonitoringMode @@ -3647,6 +3675,10 @@ Please save your work and close all programs. %1 - %2 Remote Access + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3856,6 +3888,14 @@ Please save your work and close all programs. Delete Устгах + + Screenshot + + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4078,6 +4118,56 @@ Typically this is required to support terminal servers. + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon diff --git a/translations/veyon_nl.ts b/translations/veyon_nl.ts index e7f636994..10d52b4b5 100644 --- a/translations/veyon_nl.ts +++ b/translations/veyon_nl.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -265,7 +267,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Authenticated via method - + @@ -320,7 +322,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Authentication method - + @@ -354,7 +356,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. @@ -362,7 +364,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -389,7 +391,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair @@ -432,7 +434,7 @@ The public key is used on client computers to authenticate incoming connection r 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. @@ -440,7 +442,7 @@ The public key is used on client computers to authenticate incoming connection r Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -454,10 +456,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory Privé sleutel basis bestands folder - - ... - ... - Available authentication keys Beschikbare authenticatie sleutels @@ -467,7 +465,7 @@ The public key is used on client computers to authenticate incoming connection r A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair @@ -538,11 +536,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. @@ -566,7 +564,7 @@ The public key is used on client computers to authenticate incoming connection r Could not remove key file directory "%1"! - + Failed to create directory for output file. @@ -582,7 +580,7 @@ The public key is used on client computers to authenticate incoming connection r Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. @@ -606,11 +604,11 @@ The public key is used on client computers to authenticate incoming connection r Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key @@ -626,31 +624,31 @@ The public key is used on client computers to authenticate incoming connection r Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> @@ -665,7 +663,7 @@ The public key is used on client computers to authenticate incoming connection r AuthKeysPlugin Create new authentication key pair - + Delete authentication key @@ -673,7 +671,7 @@ The public key is used on client computers to authenticate incoming connection r List authentication keys - + Import public or private key @@ -685,11 +683,11 @@ The public key is used on client computers to authenticate incoming connection r Extract public key from existing private key - + Set user group allowed to access a key - + KEY @@ -701,7 +699,7 @@ The public key is used on client computers to authenticate incoming connection r This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME @@ -713,19 +711,19 @@ The public key is used on client computers to authenticate incoming connection r This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE @@ -737,23 +735,23 @@ The public key is used on client computers to authenticate incoming connection r Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -761,7 +759,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -787,7 +785,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -795,11 +793,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -810,7 +808,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -860,7 +858,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -868,7 +866,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + @@ -879,7 +877,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the Veyon password: - + Authentication error @@ -887,22 +885,22 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + @@ -913,14 +911,14 @@ The public key is used on client computers to authenticate incoming connection r Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -959,7 +957,7 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - + Locations & computers @@ -967,19 +965,19 @@ The public key is used on client computers to authenticate incoming connection r Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location @@ -990,7 +988,7 @@ The public key is used on client computers to authenticate incoming connection r BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file @@ -1002,7 +1000,7 @@ The public key is used on client computers to authenticate incoming connection r Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1014,7 +1012,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + MAC address @@ -1038,11 +1036,11 @@ The public key is used on client computers to authenticate incoming connection r Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None @@ -1062,63 +1060,63 @@ The public key is used on client computers to authenticate incoming connection r Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location @@ -1134,43 +1132,43 @@ The public key is used on client computers to authenticate incoming connection r FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1182,11 +1180,11 @@ The public key is used on client computers to authenticate incoming connection r PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room @@ -1194,15 +1192,15 @@ The public key is used on client computers to authenticate incoming connection r Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name @@ -1210,19 +1208,19 @@ The public key is used on client computers to authenticate incoming connection r Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS @@ -1251,7 +1249,7 @@ The public key is used on client computers to authenticate incoming connection r Active features: %1 - + Online and connected @@ -1265,10 +1263,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off Computer offline of uitgeschakeld - - Service unreachable or not running - Service onbereikbaar of niet draaiende - Authentication failed or access denied Verificatie mislukt of toegang geweigerd @@ -1287,7 +1281,15 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + @@ -1306,30 +1308,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1348,15 +1350,15 @@ The public key is used on client computers to authenticate incoming connection r Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1371,19 +1373,19 @@ The public key is used on client computers to authenticate incoming connection r Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1398,7 +1400,7 @@ The public key is used on client computers to authenticate incoming connection r Add location - + Save computer/user list @@ -1453,7 +1455,7 @@ The public key is used on client computers to authenticate incoming connection r Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. @@ -1504,23 +1506,23 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1570,7 +1572,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1593,51 +1595,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1671,7 +1681,7 @@ The public key is used on client computers to authenticate incoming connection r Predefined programs - + Name @@ -1691,7 +1701,7 @@ The public key is used on client computers to authenticate incoming connection r Predefined websites - + Remove selected website @@ -1757,11 +1767,11 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website @@ -1769,15 +1779,15 @@ The public key is used on client computers to authenticate incoming connection r Open file manager - + Start learning tool - + Play tutorial video - + Custom program @@ -1785,15 +1795,15 @@ The public key is used on client computers to authenticate incoming connection r Handout - + Texts to read - + generic-student-user - + @@ -1829,7 +1839,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferConfigurationPage File transfer - + Directories @@ -1837,69 +1847,65 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - - - ... - ... + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + @@ -1913,7 +1919,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. @@ -1925,19 +1931,19 @@ The public key is used on client computers to authenticate incoming connection r Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -2064,7 +2070,7 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - + Authentication @@ -2080,14 +2086,14 @@ The public key is used on client computers to authenticate incoming connection r Configure - + LdapBrowseDialog Browse LDAP - + @@ -2119,7 +2125,7 @@ The public key is used on client computers to authenticate incoming connection r Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful @@ -2137,7 +2143,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2147,7 +2153,7 @@ The public key is used on client computers to authenticate incoming connection r The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2157,7 +2163,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2207,7 +2213,7 @@ The public key is used on client computers to authenticate incoming connection r User login name attribute - + group members @@ -2231,23 +2237,23 @@ The public key is used on client computers to authenticate incoming connection r Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses @@ -2259,15 +2265,15 @@ The public key is used on client computers to authenticate incoming connection r computer locations - + Computer location attribute - + Location name attribute - + users @@ -2287,7 +2293,7 @@ The public key is used on client computers to authenticate incoming connection r computer containers - + groups of user @@ -2299,7 +2305,7 @@ The public key is used on client computers to authenticate incoming connection r Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer @@ -2311,27 +2317,27 @@ The public key is used on client computers to authenticate incoming connection r Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups @@ -2339,11 +2345,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2353,7 +2359,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2365,21 +2371,21 @@ The public key is used on client computers to authenticate incoming connection r LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: @@ -2702,67 +2708,67 @@ The public key is used on client computers to authenticate incoming connection r Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2770,31 +2776,31 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + @@ -2817,90 +2823,90 @@ The public key is used on client computers to authenticate incoming connection r Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses - + Add new network range - + Remove selected network range - + ID - + Valid until - + Licensee - + Information - + Installation ID - + Addons available for licensing - + Addon - + @@ -2911,19 +2917,19 @@ The public key is used on client computers to authenticate incoming connection r Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + @@ -2937,7 +2943,7 @@ The public key is used on client computers to authenticate incoming connection r LocationDialog Select location - + enter search filter... @@ -3115,7 +3121,7 @@ The public key is used on client computers to authenticate incoming connection r Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers @@ -3127,28 +3133,40 @@ The public key is used on client computers to authenticate incoming connection r &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication Authenticatie + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3234,7 +3252,7 @@ The public key is used on client computers to authenticate incoming connection r Modes and features - + User and computer name @@ -3258,11 +3276,11 @@ The public key is used on client computers to authenticate incoming connection r Sort order - + Computer and user name - + Computer locations @@ -3270,51 +3288,63 @@ The public key is used on client computers to authenticate incoming connection r Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Auto + + + Automatically adjust computer icon size + @@ -3329,38 +3359,38 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. - + NetworkDiscoveryConfigurationPage Network discovery - + Mode - + Scan network ranges - + e.g. 192.168.1.0/24 - + Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3368,7 +3398,7 @@ The public key is used on client computers to authenticate incoming connection r Network ranges - + Add new group @@ -3392,19 +3422,19 @@ The public key is used on client computers to authenticate incoming connection r Add new network range - + Remove selected network range - + Parallel scans - + Scan timeout - + ms @@ -3412,22 +3442,22 @@ The public key is used on client computers to authenticate incoming connection r Session scan limit - + Options - + Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3438,15 +3468,15 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3454,18 +3484,18 @@ The public key is used on client computers to authenticate incoming connection r Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3473,23 +3503,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3540,7 +3570,7 @@ The public key is used on client computers to authenticate incoming connection r Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS @@ -3548,11 +3578,11 @@ The public key is used on client computers to authenticate incoming connection r This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! @@ -3560,7 +3590,7 @@ The public key is used on client computers to authenticate incoming connection r Commands for controlling power status of computers - + Power down now @@ -3572,7 +3602,7 @@ The public key is used on client computers to authenticate incoming connection r Power down after user confirmation - + Power down after timeout @@ -3580,13 +3610,13 @@ The public key is used on client computers to authenticate incoming connection r The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3597,15 +3627,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3647,7 +3677,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3656,6 +3686,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 - %2 Externe toegang + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3725,7 +3759,7 @@ Please save your work and close all programs. Exit - + @@ -3744,15 +3778,15 @@ Please save your work and close all programs. Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3775,15 +3809,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3802,7 +3836,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3865,6 +3899,14 @@ Please save your work and close all programs. Delete Verwijder + + Screenshot + Schermafbeelding + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3947,7 +3989,7 @@ Please save your work and close all programs. Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection @@ -3955,43 +3997,43 @@ Typically this is required to support terminal servers. Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -3999,7 +4041,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4018,11 +4060,11 @@ Typically this is required to support terminal servers. Unregistering service %1 - + Service control - + @@ -4072,7 +4114,7 @@ Typically this is required to support terminal servers. ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4080,11 +4122,61 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + @@ -4098,22 +4190,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4166,11 +4258,11 @@ Typically this is required to support terminal servers. Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + @@ -4188,11 +4280,11 @@ Typically this is required to support terminal servers. UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4207,27 +4299,27 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4270,39 +4362,39 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + @@ -4330,7 +4422,7 @@ Typically this is required to support terminal servers. WindowsPlatformConfigurationPage Windows - + General @@ -4342,47 +4434,47 @@ Typically this is required to support terminal servers. Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4396,31 +4488,31 @@ Typically this is required to support terminal servers. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + @@ -4442,7 +4534,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_no_NO.ts b/translations/veyon_no_NO.ts index 99adab042..a11119984 100644 --- a/translations/veyon_no_NO.ts +++ b/translations/veyon_no_NO.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -19,7 +21,7 @@ Contributors - + Version: @@ -27,13 +29,13 @@ Website: - + Current language not translated yet (or native English). If you're interested in translating Veyon into your local or another language or want to improve an existing translation, please contact a Veyon developer! - + About %1 %2 @@ -41,18 +43,18 @@ If you're interested in translating Veyon into your local or another langua Support Veyon project with a donation - + AccessControlPage Computer access control - + Grant access to every authenticated user (default) - + Test @@ -60,19 +62,19 @@ If you're interested in translating Veyon into your local or another langua Process access control rules - + User groups authorized for computer access - + Please add the groups whose members should be authorized to access computers in your Veyon network. - + Authorized user groups - + All groups @@ -84,78 +86,78 @@ If you're interested in translating Veyon into your local or another langua Access control rules - + Add access control rule - + Remove access control rule - + Move selected rule down - + Move selected rule up - + Edit selected rule - + Enter username - + Please enter a user login name whose access permissions to test: - + Access allowed - + The specified user is allowed to access computers with this configuration. - + Access denied - + The specified user is not allowed to access computers with this configuration. - + Enable usage of domain groups - + User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups - + AccessControlRuleEditDialog Edit access control rule - + General @@ -163,51 +165,51 @@ If you're interested in translating Veyon into your local or another langua enter a short name for the rule here - + Rule name: - + enter a description for the rule here - + Rule description: - + Invert all conditions ("is/has" interpreted as "is/has not") - + Conditions - + is member of group - + Accessing computer is localhost - + Accessing user is logged on user - + Accessing user is already connected - + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Action - + Allow access @@ -215,35 +217,35 @@ If you're interested in translating Veyon into your local or another langua Deny access - + Ask logged on user for permission - + None (rule disabled) - + Accessing user - + Accessing computer - + Local (logged on) user - + Local computer - + Always process rule and ignore conditions - + No user logged on @@ -251,42 +253,42 @@ If you're interested in translating Veyon into your local or another langua Accessing user has one or more groups in common with local (logged on) user - + Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + AccessControlRulesTestDialog Access control rules test - + Accessing user: - + Local computer: - + Accessing computer: - + Please enter the following user and computer information in order to test the configured ruleset. - + Local user: @@ -294,38 +296,38 @@ If you're interested in translating Veyon into your local or another langua Connected users: - + The access in the given scenario is allowed. - + The access in the given scenario is denied. - + The access in the given scenario needs permission of the logged on user. - + ERROR: Unknown action - + Test result - + Authentication method - + AndroidPlatformConfigurationPage Android - + General @@ -336,43 +338,43 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationDialog Authentication keys - + Introduction - + Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories - + Public key file base directory - + Private key file base directory - + ... @@ -380,386 +382,382 @@ If you're interested in translating Veyon into your local or another langua Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair - + Delete key - + Import key - + Export key - + Set access group - + AuthKeysConfigurationWidget Authentication keys - + Introduction - + Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories - + Public key file base directory - + Private key file base directory - - - - ... - ... + Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair - + Delete key - + Import key - + Export key - + Set access group - + Key files (*.pem) - + Authentication key name - + Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? - + Please select a key to delete! - + Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! - + Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + AuthKeysManager Please check your permissions. - + Key name contains invalid characters! - + Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" - + Failed to create public or private key! - + Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. - + Failed to write output file. - + Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. - + File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. - + Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> - + Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key - + List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP - + This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -770,22 +768,22 @@ The public key is used on client computers to authenticate incoming connection r Type - + Access group - + Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -793,132 +791,132 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username - + Password - + Authentication error - + Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username - + Password - + Authentication error - + Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error - + Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -937,74 +935,74 @@ The public key is used on client computers to authenticate incoming connection r Host address/IP - + MAC address - + Add new computer - + Remove selected computer - + New computer - + Builtin directory - + Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type - + Name @@ -1012,219 +1010,219 @@ The public key is used on client computers to authenticate incoming connection r Host address - + MAC address - + Specified object not found. - + File "%1" does not exist! - + Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None - + Computer - + Root - + Invalid - + Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + @@ -1245,31 +1243,27 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected - + Establishing connection - + Computer offline or switched off - - - - Service unreachable or not running - + Authentication failed or access denied - + Disconnected @@ -1285,49 +1279,57 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error - + Remote access - + User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1338,23 +1340,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1365,46 +1367,46 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel Computer management - + Computer search - + Add location - + Save computer/user list - + Select output filename - + CSV files (*.csv) @@ -1412,113 +1414,113 @@ The public key is used on client computers to authenticate incoming connection r File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1536,7 +1538,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms @@ -1544,15 +1546,15 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit - + Use multithreading (experimental) - + MB @@ -1560,7 +1562,7 @@ The public key is used on client computers to authenticate incoming connection r Update interval - + s @@ -1568,7 +1570,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1579,97 +1581,105 @@ The public key is used on client computers to authenticate incoming connection r Window demo - + Give a demonstration by screen broadcasting - + In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + DesktopAccessDialog Desktop access dialog - + Confirm desktop access - + Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1677,46 +1687,46 @@ The public key is used on client computers to authenticate incoming connection r Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL - + New program - + New website - + DesktopServicesFeaturePlugin Run program - + Open website - + Click this button to open a website on all computers. @@ -1724,27 +1734,27 @@ The public key is used on client computers to authenticate incoming connection r Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + @@ -1755,57 +1765,57 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: @@ -1820,129 +1830,125 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories - + Destination directory - - - - ... - ... + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + GeneralConfigurationPage User interface - + Language: @@ -1950,7 +1956,7 @@ The public key is used on client computers to authenticate incoming connection r Use system language setting - + Veyon @@ -1958,11 +1964,11 @@ The public key is used on client computers to authenticate incoming connection r Logging - + Log file directory - + ... @@ -1970,79 +1976,79 @@ The public key is used on client computers to authenticate incoming connection r Log level - + Nothing - + Only critical messages - + Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB @@ -2050,7 +2056,7 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x @@ -2062,15 +2068,15 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - + Authentication - + Method: - + Test @@ -2078,191 +2084,191 @@ The public key is used on client computers to authenticate incoming connection r Configure - + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users @@ -2270,7 +2276,7 @@ The public key is used on client computers to authenticate incoming connection r user groups - + computers @@ -2278,134 +2284,134 @@ The public key is used on client computers to authenticate incoming connection r computer groups - + computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + LdapConfigurationPage Basic settings - + General @@ -2413,347 +2419,347 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username - + Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None - + TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2761,204 +2767,204 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command - + Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses - + Add new network range - + Remove selected network range - + ID - + Valid until - + Licensee - + Information - + Installation ID - + Addons available for licensing - + Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + MainToolBar Configuration - + Disable balloon tooltips - + Show icons only - + MainWindow MainWindow - + toolBar - + General @@ -2986,7 +2992,7 @@ The public key is used on client computers to authenticate incoming connection r L&oad settings from file - + Ctrl+O @@ -2994,43 +3000,43 @@ The public key is used on client computers to authenticate incoming connection r About Qt - + Configuration not writable - + Load settings from file - + Save settings to file - + Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service - + Master - + Access control - + About Veyon @@ -3046,7 +3052,7 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) @@ -3054,15 +3060,15 @@ The public key is used on client computers to authenticate incoming connection r The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied - + According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3070,82 +3076,94 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration - + Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - + Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + + + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + MasterConfigurationPage Directories - + ... @@ -3153,23 +3171,23 @@ The public key is used on client computers to authenticate incoming connection r User configuration - + Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3177,43 +3195,43 @@ The public key is used on client computers to authenticate incoming connection r <no feature> - + Basic settings - + Behaviour - + Enforce selected mode for client computers - + Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface - + Background color - + Thumbnail update interval - + ms @@ -3221,137 +3239,149 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Auto + + + Automatically adjust computer icon size + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - + NetworkDiscoveryConfigurationPage Network discovery - + Mode - + Scan network ranges - + e.g. 192.168.1.0/24 - + Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3359,43 +3389,43 @@ The public key is used on client computers to authenticate incoming connection r Network ranges - + Add new group - + Remove selected group - + Groups - + First address - + Last address - + Add new network range - + Remove selected network range - + Parallel scans - + Scan timeout - + ms @@ -3403,60 +3433,60 @@ The public key is used on client computers to authenticate incoming connection r Session scan limit - + Options - + Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + OpenWebsiteDialog Open website - + e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3464,359 +3494,363 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + PowerControlFeaturePlugin Power on - + Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot - + Click this button to reboot all computers. - + Power down - + Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot - + Confirm power down - + Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + PowerDownTimeInputDialog Power down - + Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control - + Open a remote control window for a computer. - + Remote access - + Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command - + RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + + + + %1 - %2 - %3 Remote Access + RemoteAccessWidgetToolBar View only - + Remote control - + Send shortcut - + Fullscreen - + Window - + Ctrl+Alt+Del - + Ctrl+Esc - + Alt+Tab - + Alt+F4 - + Win+Tab - + Win - + Menu - + Alt+Ctrl+F1 - + Connecting %1 - + Connected. - + Screenshot - + Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + ScreenLockFeaturePlugin Lock - + Unlock - + Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot - + Could not open screenshot file %1 for writing. - + ScreenshotFeaturePlugin Screenshot - + Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3830,31 +3864,39 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: - + Computer: - + Date: - + Time: - + Show - + Delete - + + + + Screenshot + + + + Do you really want to delete all selected screenshots? + @@ -3865,124 +3907,124 @@ Please save your work and close all programs. Autostart - + Hide tray icon - + Start service - + Stopped - + Stop service - + State: - + Network - + Demo server port - + Enable firewall exception - + Allow connections from localhost only - + Internal VNC server port - + VNC server - + Plugin: - + Restart %1 Service - + All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running - + Feature manager port - + Primary service port - + Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - + Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -3990,338 +4032,388 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + ServiceControlPlugin Service is running - + Service is not running - + Configure and control Veyon service - + Register Veyon Service - + Unregister Veyon Service - + Start Veyon Service - + Stop Veyon Service - + Restart Veyon Service - + Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! - + Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + SystemTrayIcon System tray icon - + SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + TextMessageDialog Send text message - + Use the field below to type your message which will be sent to all selected users. - + TextMessageFeaturePlugin Text message - + Use this function to send a text message to all users e.g. to assign them new tasks. - + Message from teacher - + Send a message to a user - + UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username - + Password - + UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control - + VeyonCore [OK] - + [FAIL] - + Invalid command! - + Available commands: - + Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! - + Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4329,111 +4421,111 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_pl.ts b/translations/veyon_pl.ts index 39f4f866d..47a31fb75 100644 --- a/translations/veyon_pl.ts +++ b/translations/veyon_pl.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -457,10 +459,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Private key file base directory Katalog z plikami kluczy prywatnych - - ... - ... - Available authentication keys Dostępne klucze uwierzytelniające @@ -801,7 +799,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org @@ -816,7 +814,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -1271,10 +1269,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Computer offline or switched off Komputer nie połączony z siecią lub wyłączony - - Service unreachable or not running - Usługa jest niedostępna lub nie uruchomiona - Authentication failed or access denied Uwierzytelnienie nie powiodło się lub dostęp jest zabroniony @@ -1295,6 +1289,14 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Location: %1 Lokalizacja: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1599,51 +1601,59 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Demo - + Demo Share your screen or allow a user to share his screen with other users. - + Udostępnij swój ekran lub zezwól użytkownikowi na udostępnienie jego ekranu innym użytkownikom. Full screen demo - + Demo pełnoekranowe Share your own screen in fullscreen mode - + Udostępnij swój ekran w trybie pełnoekranowym In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + W tym trybie ekran jest wyświetlany w trybie pełnoekranowym na wszystkich komputerach, podczas gdy urządzenia wejściowe użytkowników są zablokowane. Share your own screen in a window - + Udostępnij swój ekran w oknie Share selected user's screen in fullscreen mode - + Udostępnij ekran wybranego użytkownika w trybie pełnoekranowym In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + W tym trybie ekran wybranego użytkownika jest wyświetlany w trybie pełnoekranowym na wszystkich komputerach, podczas gdy urządzenia wejściowe użytkowników są zablokowane. Share selected user's screen in a window - + Udostępnij ekran wybranego użytkownika w oknie In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + W tym trybie ekran wybranego użytkownika jest wyświetlany w oknie na wszystkich komputerach. Użytkownicy mogą w razie potrzeby przełączać się do innych okien. Please select a user screen to share. - + Wybierz ekran użytkownika do udostępnienia. Please select only one user screen to share. - + Wybierz tylko jeden ekran użytkownika do udostępnienia. + + + All screens + + + + Screen %1 [%2] + @@ -1845,10 +1855,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Destination directory Katalog docelowy - - ... - ... - Default source directory Domyślny katalog źródłowy @@ -2145,7 +2151,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2155,7 +2161,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2165,7 +2171,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2174,7 +2180,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree @@ -2294,7 +2300,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc computer containers - + groups of user @@ -2371,7 +2377,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc The %1 has been queried successfully and %2 entries were found. Zapytanie o %1 zakończyło się powodzeniem i znaleziono %2 wpisów. -  LDAP test failed @@ -2602,7 +2608,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: @@ -2646,11 +2652,11 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Filter for computer containers - + Computer containers or OUs - + Connection security @@ -2738,7 +2744,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Location attribute in computer objects - + List all entries of a location @@ -2783,7 +2789,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) Nazwy hostów przechowywane jako w pełni kwalifikowane nazwy domen (FQDN, np. myhost.example.org) -  Computer hostname attribute @@ -2814,7 +2820,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory @@ -2850,11 +2856,11 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server @@ -3162,6 +3168,18 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Authentication Uwierzytelnienie + + Slideshow + Pokaz slajdów + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3319,15 +3337,27 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Auto + + + Automatically adjust computer icon size + @@ -3671,6 +3701,10 @@ Zapisz swoją pracę i zamknij wszystkie programy. %1 - %2 Remote Access %1 -%2 dostęp zdalny + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3798,7 +3832,7 @@ Zapisz swoją pracę i zamknij wszystkie programy. To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - Aby odzyskać pełną uwagę wszystkich użytkowników, możesz zablokować ich komputery za pomocą tego przycisku. W tym trybie wszystkie urządzenia wejściowe są zablokowane, podczas gdy pulpit jest nadal widoczny.  + Aby odzyskać pełną uwagę wszystkich użytkowników, możesz zablokować ich komputery za pomocą tego przycisku. W tym trybie wszystkie urządzenia wejściowe są zablokowane, podczas gdy pulpit jest nadal widoczny.  @@ -3880,6 +3914,14 @@ Zapisz swoją pracę i zamknij wszystkie programy. Delete Usuń + + Screenshot + Zrzut ekranu + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3987,7 +4029,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) @@ -3995,11 +4037,11 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Network port numbers - + Veyon server - + Internal VNC server @@ -4015,7 +4057,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Miscellaneous network settings - + @@ -4103,6 +4145,56 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Komendy dotyczące funkcjonalności powłoki + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + Następny + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4114,7 +4206,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) @@ -4461,4 +4553,4 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Veyon Master - \ No newline at end of file + diff --git a/translations/veyon_pt_BR.ts b/translations/veyon_pt_BR.ts index 9515a116b..c615dd10f 100644 --- a/translations/veyon_pt_BR.ts +++ b/translations/veyon_pt_BR.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -138,15 +140,15 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups @@ -265,7 +267,7 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Authenticated via method - + @@ -320,7 +322,7 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Authentication method - + @@ -457,10 +459,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Private key file base directory Diretório base do arquivo de chave privada - - ... - ... - Available authentication keys Chaves de autenticação disponíveis @@ -505,7 +503,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? @@ -517,7 +515,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -529,7 +527,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please select a key which to set the access group for! - + @@ -544,15 +542,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" @@ -564,7 +562,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! @@ -616,15 +614,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! @@ -632,11 +630,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! @@ -644,11 +642,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". @@ -656,7 +654,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key "%1" is now accessible by user group "%2". - + <N/A> @@ -695,7 +693,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Set user group allowed to access a key - + KEY @@ -707,7 +705,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME @@ -719,19 +717,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE @@ -739,27 +737,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -767,7 +765,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key file - + @@ -786,14 +784,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -801,11 +799,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -816,7 +814,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -866,7 +864,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -874,7 +872,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Logon - + @@ -885,7 +883,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter the Veyon password: - + Authentication error @@ -893,22 +891,22 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + @@ -919,14 +917,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -965,7 +963,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Builtin directory - + Locations & computers @@ -985,7 +983,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location @@ -1000,15 +998,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1028,7 +1026,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Specified object not found. - + File "%1" does not exist! @@ -1036,7 +1034,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Can't open file "%1" for reading! - + Unknown argument "%1". @@ -1044,11 +1042,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None @@ -1068,27 +1066,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID @@ -1096,39 +1094,39 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE @@ -1136,47 +1134,47 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1188,19 +1186,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT @@ -1208,7 +1206,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name @@ -1216,7 +1214,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Remove an object by UUID - + "Room 01" @@ -1271,10 +1269,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Computer offline or switched off Computador offline ou desligado - - Service unreachable or not running - Serviço inacessível ou parado - Authentication failed or access denied Falha na autenticação ou acesso negado @@ -1293,7 +1287,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + @@ -1312,11 +1314,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error @@ -1324,18 +1326,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1354,7 +1356,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Location detection failed - + Computer name;Hostname;User @@ -1362,7 +1364,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1377,19 +1379,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1459,7 +1461,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. @@ -1510,23 +1512,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1576,7 +1578,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Slow down thumbnail updates while demo is running - + @@ -1599,51 +1601,59 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1744,7 +1754,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom program - + Open website "%1" @@ -1752,7 +1762,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom website - + @@ -1771,7 +1781,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom website - + Open file manager @@ -1779,7 +1789,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Start learning tool - + Play tutorial video @@ -1787,19 +1797,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom program - + Handout - + Texts to read - + generic-student-user - + @@ -1843,15 +1853,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Destination directory - - - - ... - ... + Default source directory - + Options @@ -1859,18 +1865,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + @@ -1889,11 +1895,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files @@ -1912,7 +1918,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç FileTransferFileDialog Select one or more files to transfer - + @@ -1923,27 +1929,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -2070,7 +2076,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Write to logging system of operating system - + Authentication @@ -2093,7 +2099,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LdapBrowseDialog Browse LDAP - + @@ -2113,7 +2119,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed @@ -2123,7 +2129,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful @@ -2141,7 +2147,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2151,7 +2157,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2161,7 +2167,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2211,7 +2217,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User login name attribute - + group members @@ -2235,23 +2241,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses @@ -2263,15 +2269,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç computer locations - + Computer location attribute - + Location name attribute - + users @@ -2291,7 +2297,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç computer containers - + groups of user @@ -2303,7 +2309,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer @@ -2315,27 +2321,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups @@ -2343,11 +2349,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2357,7 +2363,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2369,21 +2375,21 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: @@ -2646,23 +2652,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None @@ -2678,95 +2684,95 @@ A chave pública é usada no computadores clientes para autenticar as requisiç e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2774,31 +2780,31 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + @@ -2821,113 +2827,113 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses - + Add new network range - + Remove selected network range - + ID - + Valid until - + Licensee - + Information - + Installation ID - + Addons available for licensing - + Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + @@ -2941,7 +2947,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LocationDialog Select location - + enter search filter... @@ -3107,7 +3113,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Align computers to grid - + %1 Configurator @@ -3119,40 +3125,52 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication Autenticação + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3226,7 +3244,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Thumbnail update interval - + ms @@ -3242,83 +3260,95 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Auto + + + Automatically adjust computer icon size + @@ -3333,38 +3363,38 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This mode allows you to monitor all computers at one or more locations. - + NetworkDiscoveryConfigurationPage Network discovery - + Mode - + Scan network ranges - + e.g. 192.168.1.0/24 - + Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3372,43 +3402,43 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Network ranges - + Add new group - + Remove selected group - + Groups - + First address - + Last address - + Add new network range - + Remove selected network range - + Parallel scans - + Scan timeout - + ms @@ -3416,7 +3446,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Session scan limit - + Options @@ -3424,14 +3454,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3442,15 +3472,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3458,18 +3488,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3477,23 +3507,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3544,7 +3574,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS @@ -3552,45 +3582,45 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3601,15 +3631,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3651,14 +3681,18 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + + + + %1 - %2 - %3 Remote Access + @@ -3729,7 +3763,7 @@ Please save your work and close all programs. Exit - + @@ -3748,15 +3782,15 @@ Please save your work and close all programs. Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3779,15 +3813,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3806,7 +3840,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3869,6 +3903,14 @@ Please save your work and close all programs. Delete Excluir + + Screenshot + Captura de tela + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3951,51 +3993,51 @@ Please save your work and close all programs. Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - + Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4003,30 +4045,30 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + @@ -4076,7 +4118,7 @@ Typically this is required to support terminal servers. ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4084,11 +4126,61 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + @@ -4102,22 +4194,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4170,11 +4262,11 @@ Typically this is required to support terminal servers. Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + @@ -4192,11 +4284,11 @@ Typically this is required to support terminal servers. UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4211,27 +4303,27 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4274,46 +4366,46 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + @@ -4334,7 +4426,7 @@ Typically this is required to support terminal servers. WindowsPlatformConfigurationPage Windows - + General @@ -4346,47 +4438,47 @@ Typically this is required to support terminal servers. Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4400,31 +4492,31 @@ Typically this is required to support terminal servers. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + @@ -4446,7 +4538,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_pt_PT.ts b/translations/veyon_pt_PT.ts index 1670fb503..d4b52c3ef 100644 --- a/translations/veyon_pt_PT.ts +++ b/translations/veyon_pt_PT.ts @@ -454,10 +454,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory - - ... - ... - Available authentication keys @@ -1265,10 +1261,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off - - Service unreachable or not running - - Authentication failed or access denied @@ -1289,6 +1281,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1639,6 +1639,14 @@ The public key is used on client computers to authenticate incoming connection r Please select only one user screen to share. + + All screens + + + + Screen %1 [%2] + + DesktopAccessDialog @@ -1839,10 +1847,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - ... - ... - Default source directory @@ -3142,6 +3146,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication + + Adjust size of computer icons automatically + + + + Slideshow + + + + Spotlight + + MasterConfigurationPage @@ -3309,6 +3325,18 @@ The public key is used on client computers to authenticate incoming connection r Hide local session + + Auto + + + + Thumbnail aspect ratio + + + + Automatically adjust computer icon size + + MonitoringMode @@ -3649,6 +3677,10 @@ Please save your work and close all programs. %1 - %2 Remote Access + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3858,6 +3890,14 @@ Please save your work and close all programs. Delete + + Screenshot + + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4080,6 +4120,56 @@ Typically this is required to support terminal servers. + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon diff --git a/translations/veyon_ru.ts b/translations/veyon_ru.ts index fb963d22d..67cc2b6e2 100644 --- a/translations/veyon_ru.ts +++ b/translations/veyon_ru.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -457,10 +459,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory Каталог, содержащий закрытые ключи - - ... - ... - Available authentication keys Доступные ключи аутентификации @@ -1271,10 +1269,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off Компьютер в автономном режиме или выключен - - Service unreachable or not running - Сервис недоступен или не работает - Authentication failed or access denied Ошибка аутентификации или доступ запрещен @@ -1295,6 +1289,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 Место: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1599,51 +1601,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1843,15 +1853,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - - - ... - ... + Default source directory - + Options @@ -1859,11 +1865,11 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + @@ -3167,6 +3173,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication Аутентификация + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3324,15 +3342,27 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Авто + + + Automatically adjust computer icon size + @@ -3676,6 +3706,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 — %2, удалённый доступ + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3795,15 +3829,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3885,6 +3919,14 @@ Please save your work and close all programs. Delete Удалить + + Screenshot + Скриншот + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3984,7 +4026,7 @@ Typically this is required to support terminal servers. Maximum session count - + Sessions @@ -3992,27 +4034,27 @@ Typically this is required to support terminal servers. Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4020,7 +4062,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4108,6 +4150,56 @@ Typically this is required to support terminal servers. Команды для возможностей оболочки + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4466,4 +4558,4 @@ Typically this is required to support terminal servers. Veyon Мастер - \ No newline at end of file + diff --git a/translations/veyon_sl.ts b/translations/veyon_sl.ts index 4b4ae8832..7c759f917 100644 --- a/translations/veyon_sl.ts +++ b/translations/veyon_sl.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -265,7 +267,7 @@ If you're interested in translating Veyon into your local or another langua Authenticated via method - + @@ -327,7 +329,7 @@ If you're interested in translating Veyon into your local or another langua AndroidPlatformConfigurationPage Android - + General @@ -457,10 +459,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Private key file base directory Imenik datoteke z zasebnim ključem - - ... - ... - Available authentication keys Razpoložljivi ključi za preverjanje pristnosti @@ -759,7 +757,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -793,7 +791,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti AuthLdapConfigurationWidget LDAP authentication - + General @@ -801,11 +799,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -816,7 +814,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -866,7 +864,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -874,7 +872,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Logon - + @@ -885,7 +883,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please enter the Veyon password: - + Authentication error @@ -893,22 +891,22 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + @@ -926,7 +924,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti AuthenticationPageTab Enabled - + Test @@ -1271,10 +1269,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Computer offline or switched off Računalnik je brez povezave ali izklopljen - - Service unreachable or not running - Storitev ni dosegljiva ali se ne izvaja - Authentication failed or access denied Preverjanje pristnosti ni uspelo ali je dostop zavrnjen @@ -1295,6 +1289,14 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Location: %1 Lokacija: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1316,26 +1318,26 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1377,19 +1379,19 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1522,11 +1524,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1576,7 +1578,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Slow down thumbnail updates while demo is running - + @@ -1599,51 +1601,59 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1767,7 +1777,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please complete all tasks within the next 5 minutes. - + Custom website @@ -1775,15 +1785,15 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Open file manager - + Start learning tool - + Play tutorial video - + Custom program @@ -1791,15 +1801,15 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Handout - + Texts to read - + generic-student-user - + @@ -1843,15 +1853,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Destination directory - - - - ... - ... + Default source directory - + Options @@ -1859,11 +1865,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Remember last source directory - + Create destination directory if it does not exist - + @@ -2086,7 +2092,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Configure - + @@ -2301,7 +2307,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti computer containers - + groups of user @@ -2341,7 +2347,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Computer groups filter - + Computer locations identification @@ -2353,11 +2359,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2847,31 +2853,31 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + @@ -2906,19 +2912,19 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Information - + Installation ID - + Addons available for licensing - + Addon - + @@ -2929,19 +2935,19 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + @@ -3167,6 +3173,18 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Authentication Preverjanje pristnosti + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3320,19 +3338,31 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Samodejno + + + Automatically adjust computer icon size + @@ -3456,15 +3486,15 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3472,18 +3502,18 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3491,23 +3521,23 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3582,29 +3612,29 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3615,15 +3645,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3665,7 +3695,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3674,6 +3704,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 - %2 oddaljen dostop + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3743,7 +3777,7 @@ Please save your work and close all programs. Exit - + @@ -3762,15 +3796,15 @@ Please save your work and close all programs. Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3793,15 +3827,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3820,7 +3854,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3883,6 +3917,14 @@ Please save your work and close all programs. Delete Briši + + Screenshot + Zaslonska slika + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3974,35 +4016,35 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server @@ -4018,7 +4060,7 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Miscellaneous network settings - + @@ -4106,6 +4148,56 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Ukazi za funkcionalnosti lupine + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4128,11 +4220,11 @@ Običajno je to potrebno za podporo terminalskih strežnikov. TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4207,11 +4299,11 @@ Običajno je to potrebno za podporo terminalskih strežnikov. UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4226,27 +4318,27 @@ Običajno je to potrebno za podporo terminalskih strežnikov. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4317,7 +4409,7 @@ Običajno je to potrebno za podporo terminalskih strežnikov. WARNING - + Authentication test @@ -4349,7 +4441,7 @@ Običajno je to potrebno za podporo terminalskih strežnikov. WindowsPlatformConfigurationPage Windows - + General @@ -4361,23 +4453,23 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism @@ -4385,23 +4477,23 @@ Običajno je to potrebno za podporo terminalskih strežnikov. User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4415,31 +4507,31 @@ Običajno je to potrebno za podporo terminalskih strežnikov. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + @@ -4464,4 +4556,4 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Veyon Master - \ No newline at end of file + diff --git a/translations/veyon_sr.ts b/translations/veyon_sr.ts index 78bc3e729..ddb84026e 100644 --- a/translations/veyon_sr.ts +++ b/translations/veyon_sr.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -265,7 +267,7 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili Authenticated via method - + @@ -457,10 +459,6 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Private key file base directory Osnovni direktorijum datoteka privatnih ključeva - - ... - ... - Available authentication keys Dostupni ključevi za proveru autentičnosti @@ -793,7 +791,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z AuthLdapConfigurationWidget LDAP authentication - + General @@ -801,11 +799,11 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -816,7 +814,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -910,7 +908,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Simple password - + @@ -928,7 +926,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u AuthenticationPageTab Enabled - + Test @@ -1273,10 +1271,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Computer offline or switched off Računar nije mreži ili je isključen - - Service unreachable or not running - Usluga nedostupna ili ne radi - Authentication failed or access denied Autentifikacija nije uspela ili je pristup odbijen @@ -1297,6 +1291,14 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Location: %1 Lokacija: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1330,14 +1332,14 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Active connections: - + ComputerGroupSelector Group %1 - + @@ -1379,19 +1381,19 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1528,7 +1530,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not configure the firewall configuration for the %1 Service. - + @@ -1601,51 +1603,59 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1845,15 +1855,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Destination directory - - - - ... - ... + Default source directory - + Options @@ -1861,11 +1867,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Remember last source directory - + Create destination directory if it does not exist - + @@ -2343,7 +2349,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Computer groups filter - + Computer locations identification @@ -2355,11 +2361,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2865,7 +2871,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2873,7 +2879,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u LDAP bind - + @@ -3169,6 +3175,18 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Authentication Autentifikacija + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3322,19 +3340,31 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Automatski + + + Automatically adjust computer icon size + @@ -3481,11 +3511,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3493,23 +3523,23 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3669,7 +3699,7 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. RemoteAccessPage Remote access: %1 - + @@ -3678,6 +3708,10 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. %1 - %2 Remote Access %1 - %2 Daljinski pristup + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3801,11 +3835,11 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3824,7 +3858,7 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Could not open screenshot file %1 for writing. - + @@ -3887,6 +3921,14 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Delete Pobrisati + + Screenshot + Snimka ekrana + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3986,27 +4028,27 @@ Obično je ovo zahtevano kao podrška trminal serverima. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server @@ -4022,7 +4064,7 @@ Obično je ovo zahtevano kao podrška trminal serverima. Miscellaneous network settings - + @@ -4110,6 +4152,56 @@ Obično je ovo zahtevano kao podrška trminal serverima. Komande za funkcije ljuske - shell + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4405,7 +4497,7 @@ Obično je ovo zahtevano kao podrška trminal serverima. Use input device interception driver - + @@ -4468,4 +4560,4 @@ Obično je ovo zahtevano kao podrška trminal serverima. Veyon Master - \ No newline at end of file + diff --git a/translations/veyon_sv.ts b/translations/veyon_sv.ts index 94e653c84..c8f5169c7 100644 --- a/translations/veyon_sv.ts +++ b/translations/veyon_sv.ts @@ -454,10 +454,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory - - ... - ... - Available authentication keys @@ -1265,10 +1261,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off - - Service unreachable or not running - - Authentication failed or access denied @@ -1289,6 +1281,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1639,6 +1639,14 @@ The public key is used on client computers to authenticate incoming connection r Please select only one user screen to share. + + All screens + + + + Screen %1 [%2] + + DesktopAccessDialog @@ -1839,10 +1847,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - - ... - ... - Default source directory @@ -3142,6 +3146,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication Autentisering + + Adjust size of computer icons automatically + + + + Slideshow + + + + Spotlight + + MasterConfigurationPage @@ -3309,6 +3325,18 @@ The public key is used on client computers to authenticate incoming connection r Hide local session + + Auto + + + + Thumbnail aspect ratio + + + + Automatically adjust computer icon size + + MonitoringMode @@ -3649,6 +3677,10 @@ Please save your work and close all programs. %1 - %2 Remote Access + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3858,6 +3890,14 @@ Please save your work and close all programs. Delete Ta bort + + Screenshot + + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4080,6 +4120,56 @@ Typically this is required to support terminal servers. + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon diff --git a/translations/veyon_th.ts b/translations/veyon_th.ts index 34e256f95..409c3b2df 100644 --- a/translations/veyon_th.ts +++ b/translations/veyon_th.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -33,7 +35,7 @@ Current language not translated yet (or native English). If you're interested in translating Veyon into your local or another language or want to improve an existing translation, please contact a Veyon developer! - + About %1 %2 @@ -48,11 +50,11 @@ If you're interested in translating Veyon into your local or another langua AccessControlPage Computer access control - + Grant access to every authenticated user (default) - + Test @@ -60,15 +62,15 @@ If you're interested in translating Veyon into your local or another langua Process access control rules - + User groups authorized for computer access - + Please add the groups whose members should be authorized to access computers in your Veyon network. - + Authorized user groups @@ -84,23 +86,23 @@ If you're interested in translating Veyon into your local or another langua Access control rules - + Add access control rule - + Remove access control rule - + Move selected rule down - + Move selected rule up - + Edit selected rule @@ -112,7 +114,7 @@ If you're interested in translating Veyon into your local or another langua Please enter a user login name whose access permissions to test: - + Access allowed @@ -120,7 +122,7 @@ If you're interested in translating Veyon into your local or another langua The specified user is allowed to access computers with this configuration. - + Access denied @@ -128,7 +130,7 @@ If you're interested in translating Veyon into your local or another langua The specified user is not allowed to access computers with this configuration. - + Enable usage of domain groups @@ -136,26 +138,26 @@ If you're interested in translating Veyon into your local or another langua User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups - + AccessControlRuleEditDialog Edit access control rule - + General @@ -163,7 +165,7 @@ If you're interested in translating Veyon into your local or another langua enter a short name for the rule here - + Rule name: @@ -171,7 +173,7 @@ If you're interested in translating Veyon into your local or another langua enter a description for the rule here - + Rule description: @@ -179,7 +181,7 @@ If you're interested in translating Veyon into your local or another langua Invert all conditions ("is/has" interpreted as "is/has not") - + Conditions @@ -191,19 +193,19 @@ If you're interested in translating Veyon into your local or another langua Accessing computer is localhost - + Accessing user is logged on user - + Accessing user is already connected - + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Action @@ -243,7 +245,7 @@ If you're interested in translating Veyon into your local or another langua Always process rule and ignore conditions - + No user logged on @@ -251,46 +253,46 @@ If you're interested in translating Veyon into your local or another langua Accessing user has one or more groups in common with local (logged on) user - + Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + AccessControlRulesTestDialog Access control rules test - + Accessing user: - + Local computer: - + Accessing computer: - + Please enter the following user and computer information in order to test the configured ruleset. - + Local user: - + Connected users: @@ -298,15 +300,15 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario is allowed. - + The access in the given scenario is denied. - + The access in the given scenario needs permission of the logged on user. - + ERROR: Unknown action @@ -318,7 +320,7 @@ If you're interested in translating Veyon into your local or another langua Authentication method - + @@ -336,15 +338,15 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationDialog Authentication keys - + Introduction - + Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. @@ -360,7 +362,7 @@ If you're interested in translating Veyon into your local or another langua Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -368,11 +370,11 @@ If you're interested in translating Veyon into your local or another langua Public key file base directory - + Private key file base directory - + ... @@ -380,7 +382,7 @@ If you're interested in translating Veyon into your local or another langua Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. @@ -410,22 +412,22 @@ The public key is used on client computers to authenticate incoming connection r Set access group - + AuthKeysConfigurationWidget Authentication keys - + Introduction - + Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. @@ -441,7 +443,7 @@ The public key is used on client computers to authenticate incoming connection r Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -449,19 +451,15 @@ The public key is used on client computers to authenticate incoming connection r Public key file base directory - + Private key file base directory - - - - ... - ... + Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. @@ -491,7 +489,7 @@ The public key is used on client computers to authenticate incoming connection r Set access group - + Key files (*.pem) @@ -499,15 +497,15 @@ The public key is used on client computers to authenticate incoming connection r Authentication key name - + Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? - + Please select a key to delete! @@ -515,7 +513,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -523,11 +521,11 @@ The public key is used on client computers to authenticate incoming connection r Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + @@ -542,15 +540,15 @@ The public key is used on client computers to authenticate incoming connection r Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" @@ -570,11 +568,11 @@ The public key is used on client computers to authenticate incoming connection r Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. @@ -582,79 +580,79 @@ The public key is used on client computers to authenticate incoming connection r Failed to write output file. - + Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. - + File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. - + Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> @@ -677,87 +675,87 @@ The public key is used on client computers to authenticate incoming connection r List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP - + This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -765,7 +763,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -784,14 +782,14 @@ The public key is used on client computers to authenticate incoming connection r Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -799,22 +797,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -830,18 +828,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -857,14 +855,14 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -872,18 +870,18 @@ The public key is used on client computers to authenticate incoming connection r Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error @@ -891,29 +889,29 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. @@ -924,7 +922,7 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPageTab Enabled - + Test @@ -963,7 +961,7 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - + Locations & computers @@ -983,7 +981,7 @@ The public key is used on client computers to authenticate incoming connection r The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location @@ -994,19 +992,19 @@ The public key is used on client computers to authenticate incoming connection r BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1026,7 +1024,7 @@ The public key is used on client computers to authenticate incoming connection r Specified object not found. - + File "%1" does not exist! @@ -1034,19 +1032,19 @@ The public key is used on client computers to authenticate incoming connection r Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None @@ -1058,7 +1056,7 @@ The public key is used on client computers to authenticate incoming connection r Root - + Invalid @@ -1066,35 +1064,35 @@ The public key is used on client computers to authenticate incoming connection r Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer @@ -1106,91 +1104,91 @@ The public key is used on client computers to authenticate incoming connection r Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room @@ -1202,19 +1200,19 @@ The public key is used on client computers to authenticate incoming connection r OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" @@ -1226,11 +1224,11 @@ The public key is used on client computers to authenticate incoming connection r HOST ADDRESS - + MAC ADDRESS - + @@ -1251,11 +1249,11 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected @@ -1269,13 +1267,9 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off คอมพิวเตอร์ออฟไลน์หรือปิดเครื่องอยู่ - - Service unreachable or not running - ไม่สามารถเข้าถึงเซอร์วิสได้ หรือไม่ได้ทำงาน - Authentication failed or access denied - + Disconnected @@ -1291,14 +1285,22 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + + + + [no user] + + + + Veyon Server unreachable or not running + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1310,30 +1312,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1344,23 +1346,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1371,23 +1373,23 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + @@ -1406,11 +1408,11 @@ The public key is used on client computers to authenticate incoming connection r Save computer/user list - + Select output filename - + CSV files (*.csv) @@ -1422,109 +1424,109 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. - + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1542,7 +1544,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms @@ -1550,7 +1552,7 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit @@ -1558,7 +1560,7 @@ The public key is used on client computers to authenticate incoming connection r Use multithreading (experimental) - + MB @@ -1566,7 +1568,7 @@ The public key is used on client computers to authenticate incoming connection r Update interval - + s @@ -1574,7 +1576,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1593,78 +1595,86 @@ The public key is used on client computers to authenticate incoming connection r In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + DesktopAccessDialog Desktop access dialog - + Confirm desktop access - + Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + @@ -1683,7 +1693,7 @@ The public key is used on client computers to authenticate incoming connection r Path - + Add new program @@ -1695,11 +1705,11 @@ The public key is used on client computers to authenticate incoming connection r Predefined websites - + Remove selected website - + URL @@ -1730,7 +1740,7 @@ The public key is used on client computers to authenticate incoming connection r Start programs and services in user desktop - + Click this button to run a program on all computers. @@ -1773,15 +1783,15 @@ The public key is used on client computers to authenticate incoming connection r Open file manager - + Start learning tool - + Play tutorial video - + Custom program @@ -1789,15 +1799,15 @@ The public key is used on client computers to authenticate incoming connection r Handout - + Texts to read - + generic-student-user - + @@ -1826,7 +1836,7 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + @@ -1837,19 +1847,15 @@ The public key is used on client computers to authenticate incoming connection r Directories - + Destination directory - - - - ... - ... + Default source directory - + Options @@ -1857,18 +1863,18 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + @@ -1937,11 +1943,11 @@ The public key is used on client computers to authenticate incoming connection r Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1964,11 +1970,11 @@ The public key is used on client computers to authenticate incoming connection r Logging - + Log file directory - + ... @@ -1976,7 +1982,7 @@ The public key is used on client computers to authenticate incoming connection r Log level - + Nothing @@ -1984,71 +1990,71 @@ The public key is used on client computers to authenticate incoming connection r Only critical messages - + Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB @@ -2056,7 +2062,7 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x @@ -2068,7 +2074,7 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - + Authentication @@ -2084,52 +2090,52 @@ The public key is used on client computers to authenticate incoming connection r Configure - + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed @@ -2139,7 +2145,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2149,66 +2155,66 @@ The public key is used on client computers to authenticate incoming connection r The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members @@ -2216,7 +2222,7 @@ The public key is used on client computers to authenticate incoming connection r Group member attribute - + Group not found @@ -2224,75 +2230,75 @@ The public key is used on client computers to authenticate incoming connection r Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users - + user groups - + computers - + computer groups - + computer containers - + groups of user - + User not found @@ -2300,51 +2306,51 @@ The public key is used on client computers to authenticate incoming connection r Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2354,7 +2360,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2362,7 +2368,7 @@ The public key is used on client computers to authenticate incoming connection r The %1 has been queried successfully and %2 entries were found. - + LDAP test failed @@ -2372,11 +2378,11 @@ The public key is used on client computers to authenticate incoming connection r Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful @@ -2386,25 +2392,25 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2419,31 +2425,31 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org @@ -2451,31 +2457,31 @@ The public key is used on client computers to authenticate incoming connection r Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users @@ -2487,39 +2493,39 @@ The public key is used on client computers to authenticate incoming connection r Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings @@ -2527,39 +2533,39 @@ The public key is used on client computers to authenticate incoming connection r Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2567,87 +2573,87 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) @@ -2655,7 +2661,7 @@ The public key is used on client computers to authenticate incoming connection r Custom CA certificate file - + None @@ -2691,43 +2697,43 @@ The public key is used on client computers to authenticate incoming connection r Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations @@ -2735,15 +2741,15 @@ The public key is used on client computers to authenticate incoming connection r Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): @@ -2751,15 +2757,15 @@ The public key is used on client computers to authenticate incoming connection r Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2767,97 +2773,97 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command - + Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + LicensingConfigurationPage Licensing - + Installed licenses @@ -2865,11 +2871,11 @@ The public key is used on client computers to authenticate incoming connection r Add new network range - + Remove selected network range - + ID @@ -2885,30 +2891,30 @@ The public key is used on client computers to authenticate incoming connection r Information - + Installation ID - + Addons available for licensing - + Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication @@ -2916,18 +2922,18 @@ The public key is used on client computers to authenticate incoming connection r Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + @@ -2938,18 +2944,18 @@ The public key is used on client computers to authenticate incoming connection r enter search filter... - + MainToolBar Configuration - + Disable balloon tooltips - + Show icons only @@ -2960,11 +2966,11 @@ The public key is used on client computers to authenticate incoming connection r MainWindow MainWindow - + toolBar - + General @@ -3004,7 +3010,7 @@ The public key is used on client computers to authenticate incoming connection r Configuration not writable - + Load settings from file @@ -3016,11 +3022,11 @@ The public key is used on client computers to authenticate incoming connection r Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator @@ -3028,15 +3034,15 @@ The public key is used on client computers to authenticate incoming connection r Service - + Master - + Access control - + About Veyon @@ -3044,7 +3050,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3052,7 +3058,7 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) @@ -3060,7 +3066,7 @@ The public key is used on client computers to authenticate incoming connection r The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3068,7 +3074,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3076,7 +3082,7 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. @@ -3084,27 +3090,27 @@ The public key is used on client computers to authenticate incoming connection r Reset configuration - + Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - + Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges @@ -3112,7 +3118,7 @@ The public key is used on client computers to authenticate incoming connection r Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers @@ -3120,7 +3126,7 @@ The public key is used on client computers to authenticate incoming connection r &Save settings to file - + &View @@ -3146,12 +3152,24 @@ The public key is used on client computers to authenticate incoming connection r Authentication การยืนยันตัวตน + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage Directories - + ... @@ -3159,23 +3177,23 @@ The public key is used on client computers to authenticate incoming connection r User configuration - + Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3191,11 +3209,11 @@ The public key is used on client computers to authenticate incoming connection r Behaviour - + Enforce selected mode for client computers - + Hide local computer @@ -3203,7 +3221,7 @@ The public key is used on client computers to authenticate incoming connection r Hide computer filter field - + Actions such as rebooting or powering down computers @@ -3219,7 +3237,7 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail update interval - + ms @@ -3227,11 +3245,11 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name @@ -3247,7 +3265,7 @@ The public key is used on client computers to authenticate incoming connection r Computer thumbnail caption - + Text color @@ -3271,7 +3289,7 @@ The public key is used on client computers to authenticate incoming connection r Allow adding hidden locations manually - + Hide empty locations @@ -3279,39 +3297,51 @@ The public key is used on client computers to authenticate incoming connection r Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + + + + Automatically adjust computer icon size + @@ -3322,11 +3352,11 @@ The public key is used on client computers to authenticate incoming connection r Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - + @@ -3349,15 +3379,15 @@ The public key is used on client computers to authenticate incoming connection r Scan all subnets of computer - + Scan custom subnet - + Scan sessions on local computer - + Test @@ -3389,11 +3419,11 @@ The public key is used on client computers to authenticate incoming connection r Add new network range - + Remove selected network range - + Parallel scans @@ -3409,7 +3439,7 @@ The public key is used on client computers to authenticate incoming connection r Session scan limit - + Options @@ -3417,7 +3447,7 @@ The public key is used on client computers to authenticate incoming connection r Reverse lookup discovered IP addresses to host names - + @@ -3458,11 +3488,11 @@ The public key is used on client computers to authenticate incoming connection r PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3470,23 +3500,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3529,7 +3559,7 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? @@ -3541,23 +3571,23 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now @@ -3577,7 +3607,7 @@ The public key is used on client computers to authenticate incoming connection r The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. @@ -3595,7 +3625,7 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes @@ -3622,7 +3652,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Remote access @@ -3634,25 +3664,29 @@ Please save your work and close all programs. Please enter the hostname or IP address of the computer to access: - + Show help about command - + RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + + + + %1 - %2 - %3 Remote Access + @@ -3730,7 +3764,7 @@ Please save your work and close all programs. RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3773,15 +3807,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3792,7 +3826,7 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3800,7 +3834,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3819,11 +3853,11 @@ Please save your work and close all programs. Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3837,7 +3871,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3863,6 +3897,14 @@ Please save your work and close all programs. Delete ลบ + + Screenshot + ภาพหน้าจอ + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3876,7 +3918,7 @@ Please save your work and close all programs. Hide tray icon - + Start service @@ -3892,7 +3934,7 @@ Please save your work and close all programs. State: - + Network @@ -3900,7 +3942,7 @@ Please save your work and close all programs. Demo server port - + Enable firewall exception @@ -3928,7 +3970,7 @@ Please save your work and close all programs. All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running @@ -3936,16 +3978,16 @@ Please save your work and close all programs. Feature manager port - + Primary service port - + Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection @@ -3953,7 +3995,7 @@ Typically this is required to support terminal servers. Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked @@ -3961,35 +4003,35 @@ Typically this is required to support terminal servers. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -3997,7 +4039,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4059,18 +4101,18 @@ Typically this is required to support terminal servers. Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4078,40 +4120,90 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + + + + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + SystemTrayIcon System tray icon - + SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4122,7 +4214,7 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + @@ -4148,11 +4240,11 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) @@ -4168,29 +4260,29 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer - + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4205,11 +4297,11 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off @@ -4229,7 +4321,7 @@ Typically this is required to support terminal servers. User session control - + @@ -4248,15 +4340,15 @@ Typically this is required to support terminal servers. Available commands: - + Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! @@ -4264,39 +4356,39 @@ Typically this is required to support terminal servers. Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test @@ -4321,14 +4413,14 @@ Typically this is required to support terminal servers. WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4336,7 +4428,7 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock @@ -4344,11 +4436,11 @@ Typically this is required to support terminal servers. Hide taskbar - + Hide start menu - + Hide desktop @@ -4360,34 +4452,34 @@ Typically this is required to support terminal servers. Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + @@ -4414,22 +4506,22 @@ Typically this is required to support terminal servers. The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension @@ -4440,7 +4532,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_tr.ts b/translations/veyon_tr.ts index 15c615cf9..f0cafedf9 100644 --- a/translations/veyon_tr.ts +++ b/translations/veyon_tr.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -457,10 +459,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Private key file base directory Özel anahtar dizin yolu - - ... - ... - Available authentication keys Kullanılabilir yetkilendirme anahtarları @@ -1140,11 +1138,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 @@ -1271,10 +1269,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Computer offline or switched off Bilgisayar çevrim dışı veya kapalı - - Service unreachable or not running - Hizmet erişilebilir değil veya çalışmıyor - Authentication failed or access denied Yetkilendirme başarısız veya erişim reddedildi @@ -1295,6 +1289,14 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Location: %1 Konum: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1599,51 +1601,59 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1843,15 +1853,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Destination directory - - - - ... - ... + Default source directory - + Options @@ -1859,11 +1865,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Remember last source directory - + Create destination directory if it does not exist - + @@ -2157,7 +2163,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2167,7 +2173,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2249,11 +2255,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute @@ -2309,7 +2315,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer @@ -2321,7 +2327,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed @@ -2329,7 +2335,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries @@ -2363,7 +2369,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2381,7 +2387,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and @@ -2648,7 +2654,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Computer containers or OUs - + Connection security @@ -2696,11 +2702,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) @@ -2724,7 +2730,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do e.g. cn or displayName - + Computer locations identification @@ -2736,7 +2742,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Location attribute in computer objects - + List all entries of a location @@ -2760,7 +2766,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter the name of a computer location (wildcards allowed): - + Enter location name @@ -2768,7 +2774,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter the name of a location whose entries to query: - + Browse @@ -2780,7 +2786,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute @@ -2788,7 +2794,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter a computer hostname to query: - + Enter hostname @@ -2796,7 +2802,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter a computer hostname whose group memberships to query: - + User login name attribute @@ -2804,7 +2810,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Configured attribute for user login name or computer hostname (OpenLDAP) - + @@ -2827,31 +2833,31 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server @@ -3159,6 +3165,18 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Authentication Kimlik + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3316,15 +3334,27 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + Kendiliğinden + + + Automatically adjust computer icon size + @@ -3668,6 +3698,10 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.%1 - %2 Remote Access %1 -%2 Uzaktan Erişim + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3787,15 +3821,15 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3877,6 +3911,14 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.Delete Sil + + Screenshot + Ekran görüntüsü + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3976,35 +4018,35 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4012,7 +4054,7 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir. Miscellaneous network settings - + @@ -4100,6 +4142,56 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.Kabuk işlevleri için komutlar + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4458,4 +4550,4 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.Veyon Usta - \ No newline at end of file + diff --git a/translations/veyon_uk.ts b/translations/veyon_uk.ts index 58fa3ad5f..b2525e127 100644 --- a/translations/veyon_uk.ts +++ b/translations/veyon_uk.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -454,10 +456,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory Основний каталог файлів закритих ключів - - ... - ... - Available authentication keys Доступні ключі розпізнавання @@ -1265,10 +1263,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off Комп’ютер перебуває поза мережею або його вимкнено - - Service unreachable or not running - Служба недоступна або її не запущено - Authentication failed or access denied Не пройдено розпізнавання або заборонено доступ @@ -1289,6 +1283,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 Місце: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1639,6 +1641,14 @@ The public key is used on client computers to authenticate incoming connection r Please select only one user screen to share. Будь ласка, виберіть лише один екран користувача для оприлюднення. + + All screens + Усі екрани + + + Screen %1 [%2] + Екран %1 [%2] + DesktopAccessDialog @@ -1839,10 +1849,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory Каталог призначення - - ... - ... - Default source directory Типовий каталог початкових даних @@ -3163,6 +3169,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication Розпізнавання + + Slideshow + Показ слайдів + + + Spotlight + Акцент + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3320,16 +3338,28 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail spacing - + Інтервали між мініатюрами px - + пк Hide local session Приховати локальний сеанс + + Thumbnail aspect ratio + Співвідношення розмірів мініатюри + + + Auto + Авто + + + Automatically adjust computer icon size + + MonitoringMode @@ -3672,6 +3702,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 — %2, віддалений доступ + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3881,6 +3915,14 @@ Please save your work and close all programs. Delete Вилучити + + Screenshot + Знімок вікна + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4104,6 +4146,56 @@ Typically this is required to support terminal servers. Команди для можливостей оболонки + + SlideshowPanel + + Previous + Назад + + + Start/pause + Старт/Пауза + + + Next + Далі + + + Duration: + Тривалість: + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + Додайте комп'ютери клацанням середньої кнопки миші або натисканням першої кнопки нижче. + + + Add selected computers + Додати позначені комп'ютери + + + Remove selected computers + Вилучити позначені комп'ютери + + + Update computers in realtime + Оновлювати комп'ютери у реальному часу + + + Spotlight + Акцент + + + Please select at least one computer to add. + Будь ласка, позначте принаймні один комп'ютер для додавання. + + + Please select at least one computer to remove. + Будь ласка, позначте принаймні один комп'ютер для вилучення. + + SystemTrayIcon @@ -4462,4 +4554,4 @@ Typically this is required to support terminal servers. Головний комп'ютер Veyon (Veyon Master) - \ No newline at end of file + diff --git a/translations/veyon_vi.ts b/translations/veyon_vi.ts index 67a902902..c11680782 100644 --- a/translations/veyon_vi.ts +++ b/translations/veyon_vi.ts @@ -457,10 +457,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Private key file base directory Thư mục cơ sở tập tin khóa riêng - - ... - ... - Available authentication keys Khóa xác thực khả dụng @@ -1271,10 +1267,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Computer offline or switched off - - Service unreachable or not running - - Authentication failed or access denied @@ -1295,6 +1287,14 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Location: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1645,6 +1645,14 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Please select only one user screen to share. + + All screens + + + + Screen %1 [%2] + + DesktopAccessDialog @@ -1845,10 +1853,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Destination directory - - ... - ... - Default source directory @@ -3148,6 +3152,18 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Authentication + + Adjust size of computer icons automatically + + + + Slideshow + + + + Spotlight + + MasterConfigurationPage @@ -3315,6 +3331,18 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Hide local session + + Auto + + + + Thumbnail aspect ratio + + + + Automatically adjust computer icon size + + MonitoringMode @@ -3655,6 +3683,10 @@ Please save your work and close all programs. %1 - %2 Remote Access + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3864,6 +3896,14 @@ Please save your work and close all programs. Delete + + Screenshot + + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4086,6 +4126,56 @@ Typically this is required to support terminal servers. + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon diff --git a/translations/veyon_zh_CN.ts b/translations/veyon_zh_CN.ts index 6b03b892f..4271e1e30 100644 --- a/translations/veyon_zh_CN.ts +++ b/translations/veyon_zh_CN.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -265,7 +267,7 @@ If you're interested in translating Veyon into your local or another langua Authenticated via method - + @@ -458,10 +460,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory 私钥文件主目录 - - ... - ... - Available authentication keys 可用的验证密钥 @@ -803,11 +801,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -818,7 +816,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -910,7 +908,7 @@ The public key is used on client computers to authenticate incoming connection r Simple password - + @@ -1050,7 +1048,7 @@ The public key is used on client computers to authenticate incoming connection r Unclassified object "%1" with ID "%2" -  ID 为 "%2" 的未分类对象 "%1" +  ID 为 "%2" 的未分类对象 "%1" None @@ -1273,10 +1271,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off 计算机离线或者已关机 - - Service unreachable or not running - 服务无法访问或未运行 - Authentication failed or access denied 验证失败或访问被拒绝 @@ -1297,6 +1291,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 地点:%1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1337,7 +1339,7 @@ The public key is used on client computers to authenticate incoming connection r ComputerGroupSelector Group %1 - + @@ -1528,7 +1530,7 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Service. - + @@ -1601,51 +1603,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + + + + All screens + + + + Screen %1 [%2] + @@ -1847,10 +1857,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory 目标文件夹 - - ... - ... - Default source directory 默认源目录 @@ -2343,7 +2349,7 @@ The public key is used on client computers to authenticate incoming connection r Computer groups filter - + Computer locations identification @@ -2355,11 +2361,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2865,7 +2871,7 @@ The public key is used on client computers to authenticate incoming connection r Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2873,7 +2879,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP bind - + @@ -3169,6 +3175,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication 验证 + + Slideshow + + + + Spotlight + + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3322,19 +3340,31 @@ The public key is used on client computers to authenticate incoming connection r Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + + + + Thumbnail aspect ratio + + + + Auto + 自动 + + + Automatically adjust computer icon size + @@ -3481,11 +3511,11 @@ The public key is used on client computers to authenticate incoming connection r PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3501,15 +3531,15 @@ The public key is used on client computers to authenticate incoming connection r UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3669,7 +3699,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3678,6 +3708,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 - %2 远程访问 + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3805,7 +3839,7 @@ Please save your work and close all programs. To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3824,7 +3858,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3887,6 +3921,14 @@ Please save your work and close all programs. Delete 删除 + + Screenshot + 屏幕截图 + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -3986,35 +4028,35 @@ Typically this is required to support terminal servers. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4022,7 +4064,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4110,6 +4152,56 @@ Typically this is required to support terminal servers. shell功能的命令 + + SlideshowPanel + + Previous + + + + Start/pause + + + + Next + + + + Duration: + + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + + + + Add selected computers + + + + Remove selected computers + + + + Update computers in realtime + + + + Spotlight + + + + Please select at least one computer to add. + + + + Please select at least one computer to remove. + + + SystemTrayIcon @@ -4401,11 +4493,11 @@ Typically this is required to support terminal servers. Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4465,7 +4557,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - \ No newline at end of file + diff --git a/translations/veyon_zh_TW.ts b/translations/veyon_zh_TW.ts index b76e94a40..7f385265c 100644 --- a/translations/veyon_zh_TW.ts +++ b/translations/veyon_zh_TW.ts @@ -1,4 +1,6 @@ - + + + AboutDialog @@ -457,10 +459,6 @@ The public key is used on client computers to authenticate incoming connection r Private key file base directory 私密金鑰檔基礎目錄 - - ... - ... - Available authentication keys 可用身份驗證金鑰 @@ -1271,10 +1269,6 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off 電腦離線或關機 - - Service unreachable or not running - 服務無法存取或未執行 - Authentication failed or access denied 身份驗證失敗或存取拒絕 @@ -1295,6 +1289,14 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 位置: %1 + + [no user] + + + + Veyon Server unreachable or not running + + ComputerControlServer @@ -1599,51 +1601,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + 演示 Share your screen or allow a user to share his screen with other users. - + 共用螢幕或允許使用者與其他使用者共用其螢幕。 Full screen demo - + 全螢幕演示 Share your own screen in fullscreen mode - + 以全螢幕模式共用您自己的螢幕 In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + 在此模式下,使用者的輸入裝置鎖定時,您的螢幕以全螢幕模式在所有電腦上顯示。 Share your own screen in a window - + 在視窗共用您自己的螢幕 Share selected user's screen in fullscreen mode - + 以全螢幕模式共用選取使用者的螢幕 In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + 在此模式下,使用者的輸入裝置鎖定時,選取使用者的螢幕以全螢幕模式在所有電腦上顯示。 Share selected user's screen in a window - + 在視窗共用選取使用者的螢幕 In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + 在此模式下,選取使用者的螢幕顯示在所有電腦的視窗中。 使用者能夠根據需要切換到其它視窗。 Please select a user screen to share. - + 請選取要共用的使用者螢幕。 Please select only one user screen to share. - + 請只選取一個使用者螢幕進行共用。 + + + All screens + 所有螢幕 + + + Screen %1 [%2] + 螢幕 %1 [%2] @@ -1845,10 +1855,6 @@ The public key is used on client computers to authenticate incoming connection r Destination directory 目的地目錄 - - ... - ... - Default source directory 預設來源目錄 @@ -3167,6 +3173,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication 身份驗證 + + Slideshow + 投影片 + + + Spotlight + 聚光燈 + + + Adjust size of computer icons automatically + + MasterConfigurationPage @@ -3324,16 +3342,28 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail spacing - + 縮圖間距 px - + px Hide local session 隱藏本機工作階段 + + Thumbnail aspect ratio + 縮圖外觀比例 + + + Auto + 自動 + + + Automatically adjust computer icon size + + MonitoringMode @@ -3676,6 +3706,10 @@ Please save your work and close all programs. %1 - %2 Remote Access %1 - %2 遠端存取 + + %1 - %2 - %3 Remote Access + + RemoteAccessWidgetToolBar @@ -3885,6 +3919,14 @@ Please save your work and close all programs. Delete 刪除 + + Screenshot + 螢幕快照 + + + Do you really want to delete all selected screenshots? + + ServiceConfigurationPage @@ -4108,6 +4150,56 @@ Typically this is required to support terminal servers. 殼層功能的命令 + + SlideshowPanel + + Previous + 上一頁 + + + Start/pause + 開始/暫停 + + + Next + 下一頁 + + + Duration: + 持續時間: + + + + SpotlightPanel + + Add computers by clicking with the middle mouse button or clicking the first button below. + 使用滑鼠中鍵按一下或按下以下的第一個按鈕來加入電腦。 + + + Add selected computers + 加入選取的電腦 + + + Remove selected computers + 移除選取的電腦 + + + Update computers in realtime + 即時更新電腦 + + + Spotlight + 聚光燈 + + + Please select at least one computer to add. + 請選擇至少一台電腦來加入。 + + + Please select at least one computer to remove. + 請選擇至少一台電腦來移除。 + + SystemTrayIcon @@ -4466,4 +4558,4 @@ Typically this is required to support terminal servers. Veyon Master - \ No newline at end of file + From 574a95ff66063c18ae8cf84b977ee411190df56f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 1 Dec 2020 13:57:35 +0100 Subject: [PATCH 0750/1765] CI: Windows: use ninja instead of make --- .ci/windows/build.sh | 7 +++---- cmake/modules/WindowsInstaller.cmake | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh index 78b28dda8..6715d53fb 100755 --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -2,7 +2,6 @@ set -e -CPUS=$(nproc) BASEDIR=$(pwd) BUILDDIR=/tmp/build-$1 @@ -12,14 +11,14 @@ rm -rf $BUILDDIR mkdir $BUILDDIR cd $BUILDDIR -cmake $BASEDIR -DCMAKE_TOOLCHAIN_FILE=$BASEDIR/cmake/modules/Win${1}Toolchain.cmake -DCMAKE_MODULE_PATH=$BASEDIR/cmake/modules/ $CMAKE_FLAGS +cmake $BASEDIR -DCMAKE_TOOLCHAIN_FILE=$BASEDIR/cmake/modules/Win${1}Toolchain.cmake -DCMAKE_MODULE_PATH=$BASEDIR/cmake/modules/ -G Ninja $CMAKE_FLAGS echo Building on $CPUS CPUs if [ -z "$2" ] ; then - make windows-binaries -j$CPUS + ninja windows-binaries else - make ${@:2} -j$CPUS + ninja ${@:2} fi mv veyon-*win* $BASEDIR diff --git a/cmake/modules/WindowsInstaller.cmake b/cmake/modules/WindowsInstaller.cmake index 73b4d9b6a..bde297f96 100644 --- a/cmake/modules/WindowsInstaller.cmake +++ b/cmake/modules/WindowsInstaller.cmake @@ -12,7 +12,7 @@ else() endif() add_custom_target(windows-binaries - COMMAND +env ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --config $ + COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --config $ COMMAND rm -rf ${WINDOWS_INSTALL_FILES}* COMMAND mkdir -p ${WINDOWS_INSTALL_FILES}/interception COMMAND cp ${CMAKE_SOURCE_DIR}/3rdparty/interception/* ${WINDOWS_INSTALL_FILES}/interception From b674a46f4c030ad50f657a6bcc953eff3903acbd Mon Sep 17 00:00:00 2001 From: SlrG Date: Wed, 2 Dec 2020 23:32:42 +0100 Subject: [PATCH 0751/1765] make spotlight panel auto show and hide --- master/src/MainWindow.cpp | 5 +++++ master/src/SpotlightPanel.cpp | 25 +++++++++++++++++++++++++ master/src/SpotlightPanel.h | 5 +++++ 3 files changed, 35 insertions(+) diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 78c88e724..801b482af 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -218,6 +218,11 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : connect( ui->alignComputersButton, &QToolButton::clicked, ui->computerMonitoringWidget, &ComputerMonitoringWidget::alignComputers ); + // connect spotlight panel visibility to spotlight panel button checked state + connect( spotlightPanel, &SpotlightPanel::visibilityChanged, + ui->spotlightPanelButton, [this](bool isVisible) { + ui->spotlightPanelButton->setChecked (isVisible); + } ); // create the main toolbar ui->toolBar->layout()->setSpacing( 2 ); diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index 7fea3a39d..d5de72906 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -85,6 +85,24 @@ void SpotlightPanel::resizeEvent( QResizeEvent* event ) +void SpotlightPanel::hideEvent(QHideEvent* event) +{ + Q_EMIT visibilityChanged( false ); + + QWidget::hideEvent( event ); +} + + + +void SpotlightPanel::showEvent(QShowEvent* event) +{ + Q_EMIT visibilityChanged( true ); + + QWidget::showEvent( event ); +} + + + void SpotlightPanel::add() { const auto selectedComputerControlInterfaces = m_globalComputerMonitoringWidget->selectedComputerControlInterfaces(); @@ -108,6 +126,8 @@ void SpotlightPanel::add() // due to a bug in QListView force relayout of all items to show decorations (thumbnails) properly updateIconSize(); } + + show(); } @@ -127,6 +147,11 @@ void SpotlightPanel::remove() m_model->remove( m_model->data( index, SpotlightModel::ControlInterfaceRole ) .value() ); } + + if( m_model->rowCount() <= 0 ) + { + hide(); + } } diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index 12945cad5..649e0761e 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -42,8 +42,13 @@ class SpotlightPanel : public QWidget QWidget* parent = nullptr ); ~SpotlightPanel() override; +Q_SIGNALS: + void visibilityChanged( bool isVisible ); + protected: void resizeEvent( QResizeEvent* event ) override; + void hideEvent( QHideEvent* event) override; + void showEvent( QShowEvent* event) override; private: void add(); From d717ed8f477ad590bb14bb8ef6f8ce071f95bf63 Mon Sep 17 00:00:00 2001 From: Kevin Tee Date: Mon, 30 Nov 2020 03:25:36 +0700 Subject: [PATCH 0752/1765] Add openSUSE installation --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index b657b4a3a..5f6d92b5d 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,16 @@ This PPA contains official Veyon packages for Ubuntu suitable for use both on de sudo add-apt-repository ppa:veyon/stable sudo apt-get update + +### openSUSE + +Veyon is available on official openSUSE Tumbleweed repository. + + sudo zypper in veyon + +For openSUSE Leap 15.2, use the unofficial package from Education repository. + + https://software.opensuse.org/package/veyon?search_term=veyon ## Join development From 24932d5368ce23f83d7d66036b041adb70101593 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Dec 2020 08:04:35 +0100 Subject: [PATCH 0753/1765] SpotlightPanel: fix crash when removing multiple computers --- master/src/SpotlightPanel.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index d5de72906..8241ffb5c 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -134,7 +134,7 @@ void SpotlightPanel::add() void SpotlightPanel::remove() { - const auto selection = ui->monitoringWidget->selectionModel()->selectedIndexes(); + auto selection = ui->monitoringWidget->selectionModel()->selectedIndexes(); if( selection.isEmpty() ) { QMessageBox::information( this, tr("Spotlight"), @@ -142,10 +142,12 @@ void SpotlightPanel::remove() return; } - for( const auto& index : selection ) + while( selection.isEmpty() == false ) { - m_model->remove( m_model->data( index, SpotlightModel::ControlInterfaceRole ) + m_model->remove( m_model->data( selection.first(), SpotlightModel::ControlInterfaceRole ) .value() ); + + selection = ui->monitoringWidget->selectionModel()->selectedIndexes(); } if( m_model->rowCount() <= 0 ) From 558e4794e5438c8ed62002fe2d6e6e8c74013996 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Dec 2020 08:10:18 +0100 Subject: [PATCH 0754/1765] 3rdparty: update submodules --- 3rdparty/kitemmodels | 2 +- 3rdparty/kldap | 2 +- 3rdparty/libvncserver | 2 +- 3rdparty/ultravnc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/3rdparty/kitemmodels b/3rdparty/kitemmodels index 1d2606f23..b220857e4 160000 --- a/3rdparty/kitemmodels +++ b/3rdparty/kitemmodels @@ -1 +1 @@ -Subproject commit 1d2606f230574992a3518cdb6eebad206ff983df +Subproject commit b220857e40a8481fcc07b138183fc03a374f535e diff --git a/3rdparty/kldap b/3rdparty/kldap index 2e42f0f14..2fa181c03 160000 --- a/3rdparty/kldap +++ b/3rdparty/kldap @@ -1 +1 @@ -Subproject commit 2e42f0f145b70c8b45539c80efefb1fda903ccfe +Subproject commit 2fa181c03872fcd0c0107b5da5e3641586dc5ba4 diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index 4bef2a0bb..c82b3abb3 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit 4bef2a0bbf0d368e8b7e46fad628aad5966517c1 +Subproject commit c82b3abb369983cd737190331b897814a580a980 diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 881241e34..2609a6a4b 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 881241e3497bf1c75879699f67489c2031186e6a +Subproject commit 2609a6a4b7a716f0fab356570412bfdae1d99ad0 From 0ea3e80a8364959d1a57ac5dfe84bcb6e2ffb6bd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Dec 2020 14:30:04 +0100 Subject: [PATCH 0755/1765] Add headless VNC server plugin This VNC server is mainly used for testing. It can can also be used for clients on which only Veyon features should be launched without the posssibility to view screen contents. --- plugins/vncserver/CMakeLists.txt | 1 + plugins/vncserver/headless/CMakeLists.txt | 16 ++ .../headless/HeadlessVncConfiguration.h | 34 ++++ .../vncserver/headless/HeadlessVncServer.cpp | 146 ++++++++++++++++++ .../vncserver/headless/HeadlessVncServer.h | 113 ++++++++++++++ 5 files changed, 310 insertions(+) create mode 100644 plugins/vncserver/headless/CMakeLists.txt create mode 100644 plugins/vncserver/headless/HeadlessVncConfiguration.h create mode 100644 plugins/vncserver/headless/HeadlessVncServer.cpp create mode 100644 plugins/vncserver/headless/HeadlessVncServer.h diff --git a/plugins/vncserver/CMakeLists.txt b/plugins/vncserver/CMakeLists.txt index e9bb0c4c5..cb9f1289e 100644 --- a/plugins/vncserver/CMakeLists.txt +++ b/plugins/vncserver/CMakeLists.txt @@ -7,3 +7,4 @@ add_subdirectory(x11vnc-builtin) endif() add_subdirectory(external) +add_subdirectory(headless) diff --git a/plugins/vncserver/headless/CMakeLists.txt b/plugins/vncserver/headless/CMakeLists.txt new file mode 100644 index 000000000..b049d8883 --- /dev/null +++ b/plugins/vncserver/headless/CMakeLists.txt @@ -0,0 +1,16 @@ +include(BuildVeyonPlugin) + +find_package(LibVNCServer 0.9.8) + +if(LibVNCServer_FOUND) + +build_veyon_plugin(headless-vnc-server + HeadlessVncServer.cpp + HeadlessVncServer.h + HeadlessVncConfiguration.h +) + +target_link_libraries(headless-vnc-server LibVNC::LibVNCServer) + +endif() + diff --git a/plugins/vncserver/headless/HeadlessVncConfiguration.h b/plugins/vncserver/headless/HeadlessVncConfiguration.h new file mode 100644 index 000000000..40ab071b2 --- /dev/null +++ b/plugins/vncserver/headless/HeadlessVncConfiguration.h @@ -0,0 +1,34 @@ +/* + * HeadlessVncConfiguration.h - headless VNC server specific configuration values + * + * Copyright (c) 2020 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include + +#include "Configuration/Proxy.h" + +#define FOREACH_HEADLESS_VNC_CONFIG_PROPERTY(OP) \ + OP( HeadlessVncConfiguration, m_configuration, QColor, backgroundColor, setBackgroundColor, "BackgroundColor", "HeadlessVncServer", QColor(QStringLiteral("#198cb3")), Configuration::Property::Flag::Advanced ) + +DECLARE_CONFIG_PROXY(HeadlessVncConfiguration, FOREACH_HEADLESS_VNC_CONFIG_PROPERTY) diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp new file mode 100644 index 000000000..1a23c3d42 --- /dev/null +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -0,0 +1,146 @@ +/* + * HeadlessVncServer.cpp - implementation of HeadlessVncServer class + * + * Copyright (c) 2020 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +extern "C" { +#include "rfb/rfb.h" +} + +#include "HeadlessVncServer.h" +#include "VeyonConfiguration.h" + + +struct HeadlessVncScreen +{ + ~HeadlessVncScreen() + { + delete[] passwords[0]; + } + + rfbScreenInfoPtr rfbScreen{nullptr}; + std::array passwords{}; + QImage framebuffer; + +}; + + +HeadlessVncServer::HeadlessVncServer( QObject* parent ) : + QObject( parent ), + m_configuration( &VeyonCore::config() ) +{ +} + + + +void HeadlessVncServer::prepareServer() +{ +} + + + +bool HeadlessVncServer::runServer( int serverPort, const Password& password ) +{ + HeadlessVncScreen screen; + + if( initScreen( &screen ) == false || + initVncServer( serverPort, password, &screen ) == false ) + { + return false; + } + + while( true ) + { + QThread::msleep( DefaultSleepTime ); + + rfbProcessEvents( screen.rfbScreen, 0 ); + } + + rfbShutdownServer( screen.rfbScreen, true ); + rfbScreenCleanup( screen.rfbScreen ); + + return true; +} + + + +bool HeadlessVncServer::initScreen( HeadlessVncScreen* screen ) +{ + screen->framebuffer = QImage( DefaultFramebufferWidth, DefaultFramebufferHeight, QImage::Format_RGB32 ); + screen->framebuffer.fill( m_configuration.backgroundColor() ); + + return true; +} + + + +bool HeadlessVncServer::initVncServer( int serverPort, const VncServerPluginInterface::Password& password, + HeadlessVncScreen* screen ) +{ + auto rfbScreen = rfbGetScreen( nullptr, nullptr, + screen->framebuffer.width(), screen->framebuffer.height(), + 8, 3, 4 ); + + if( rfbScreen == nullptr ) + { + return false; + } + + screen->passwords[0] = qstrdup( password.toByteArray().constData() ); + + rfbScreen->desktopName = "VeyonVNC"; + rfbScreen->frameBuffer = reinterpret_cast( screen->framebuffer.bits() ); + rfbScreen->port = serverPort; + + rfbScreen->authPasswdData = screen->passwords.data(); + rfbScreen->passwordCheck = rfbCheckPasswordByList; + + rfbScreen->serverFormat.redShift = 16; + rfbScreen->serverFormat.greenShift = 8; + rfbScreen->serverFormat.blueShift = 0; + + rfbScreen->serverFormat.redMax = 255; + rfbScreen->serverFormat.greenMax = 255; + rfbScreen->serverFormat.blueMax = 255; + + rfbScreen->serverFormat.trueColour = true; + rfbScreen->serverFormat.bitsPerPixel = 32; + + rfbScreen->alwaysShared = true; + rfbScreen->handleEventsEagerly = true; + rfbScreen->deferUpdateTime = 5; + + rfbScreen->screenData = screen; + + rfbScreen->cursor = nullptr; + + rfbInitServer( rfbScreen ); + + rfbMarkRectAsModified( rfbScreen, 0, 0, rfbScreen->width, rfbScreen->height ); + + screen->rfbScreen = rfbScreen; + + return true; +} + + +IMPLEMENT_CONFIG_PROXY(HeadlessVncConfiguration) diff --git a/plugins/vncserver/headless/HeadlessVncServer.h b/plugins/vncserver/headless/HeadlessVncServer.h new file mode 100644 index 000000000..560f265eb --- /dev/null +++ b/plugins/vncserver/headless/HeadlessVncServer.h @@ -0,0 +1,113 @@ +/* + * HeadlessVncServer.h - declaration of HeadlessVncServer class + * + * Copyright (c) 2020 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "PluginInterface.h" +#include "VncServerPluginInterface.h" +#include "HeadlessVncConfiguration.h" + +struct HeadlessVncScreen; + +class HeadlessVncServer : public QObject, VncServerPluginInterface, PluginInterface +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.HeadlessVncServer") + Q_INTERFACES(PluginInterface VncServerPluginInterface) +public: + explicit HeadlessVncServer( QObject* parent = nullptr ); + + Plugin::Uid uid() const override + { + return QStringLiteral("f626f759-7691-45c0-bd4a-37171d98d219"); + } + + QVersionNumber version() const override + { + return QVersionNumber( 1, 0 ); + } + + QString name() const override + { + return QStringLiteral( "HeadlessVncServer" ); + } + + QString description() const override + { + return tr( "Headless VNC server" ); + } + + QString vendor() const override + { + return QStringLiteral( "Veyon Community" ); + } + + QString copyright() const override + { + return QStringLiteral( "Tobias Junghans" ); + } + + Plugin::Flags flags() const override + { + return Plugin::NoFlags; + } + + virtual QStringList supportedSessionTypes() const override + { + return {}; + } + + QWidget* configurationWidget() override + { + return nullptr; + } + + void prepareServer() override; + + bool runServer( int serverPort, const Password& password ) override; + + int configuredServerPort() override + { + return -1; + } + + Password configuredPassword() override + { + return {}; + } + +private: + static constexpr auto DefaultFramebufferWidth = 640; + static constexpr auto DefaultFramebufferHeight = 480; + static constexpr auto DefaultSleepTime = 25; + + bool initScreen( HeadlessVncScreen* screen ); + bool initVncServer( int serverPort, const VncServerPluginInterface::Password& password, + HeadlessVncScreen* screen ); + + bool handleScreenChanges( HeadlessVncScreen* screen ); + + HeadlessVncConfiguration m_configuration; + +}; From c10844f53aa4a01e72717cf08f3fc75ee3fa3473 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 7 Dec 2020 14:20:49 +0100 Subject: [PATCH 0756/1765] 3rdparty: update submodules Fixes CVE-2020-29074 in x11vnc. --- 3rdparty/kitemmodels | 2 +- 3rdparty/kldap | 2 +- 3rdparty/x11vnc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/3rdparty/kitemmodels b/3rdparty/kitemmodels index b220857e4..a502b1b98 160000 --- a/3rdparty/kitemmodels +++ b/3rdparty/kitemmodels @@ -1 +1 @@ -Subproject commit b220857e40a8481fcc07b138183fc03a374f535e +Subproject commit a502b1b986416775a6eee2aacba68cffa95e9061 diff --git a/3rdparty/kldap b/3rdparty/kldap index 2fa181c03..4a6da650c 160000 --- a/3rdparty/kldap +++ b/3rdparty/kldap @@ -1 +1 @@ -Subproject commit 2fa181c03872fcd0c0107b5da5e3641586dc5ba4 +Subproject commit 4a6da650c366e7c688bc64591f4f910de8528946 diff --git a/3rdparty/x11vnc b/3rdparty/x11vnc index 9268ae76e..4a56ce2f9 160000 --- a/3rdparty/x11vnc +++ b/3rdparty/x11vnc @@ -1 +1 @@ -Subproject commit 9268ae76e77c68e68b9ffba7907c9960007e30e6 +Subproject commit 4a56ce2f931266759f35955881a4335b68f51142 From 727b688af6294d1c039902ea23c26ed4c7656f3e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 10 Dec 2020 11:54:39 +0100 Subject: [PATCH 0757/1765] HeadlessVncServer: also set IPv6 port --- plugins/vncserver/headless/HeadlessVncServer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp index 1a23c3d42..2f7cc0dbb 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.cpp +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -110,6 +110,7 @@ bool HeadlessVncServer::initVncServer( int serverPort, const VncServerPluginInte rfbScreen->desktopName = "VeyonVNC"; rfbScreen->frameBuffer = reinterpret_cast( screen->framebuffer.bits() ); rfbScreen->port = serverPort; + rfbScreen->ipv6port = serverPort; rfbScreen->authPasswdData = screen->passwords.data(); rfbScreen->passwordCheck = rfbCheckPasswordByList; From 0c6cfef2ea8e839e299df3ab8b442c1dfa35787a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 10 Dec 2020 12:00:49 +0100 Subject: [PATCH 0758/1765] LdapDirectory: add warning on invalid location groups --- plugins/ldap/common/LdapDirectory.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index 32e4baa63..d96f2d0f9 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -405,7 +405,18 @@ QStringList LdapDirectory::computerLocationEntries( const QString& locationName m_defaultSearchScope ); } - auto memberComputers = groupMembers( computerGroups( locationName ).value( 0 ) ); + const auto groups = computerGroups( locationName ); + if( groups.size() != 1 ) + { + vWarning() << "location" << locationName << "does not resolve to exactly one computer group:" << groups; + } + + if( groups.isEmpty() ) + { + return {}; + } + + auto memberComputers = groupMembers( groups.value( 0 ) ); // computer filter configured? if( m_computersFilter.isEmpty() == false ) From 13d3591bf065f9e2f7580b05619c6f50333cc162 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 10 Dec 2020 15:29:05 +0100 Subject: [PATCH 0759/1765] 3rdparty: ddengine: update to 1.3.2 --- 3rdparty/ddengine/README.md | 2 +- 3rdparty/ddengine/ddengine.dll | Bin 251744 -> 253280 bytes 3rdparty/ddengine/ddengine64.dll | Bin 329056 -> 330080 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ddengine/README.md b/3rdparty/ddengine/README.md index 43eb50f37..89b37e01c 100644 --- a/3rdparty/ddengine/README.md +++ b/3rdparty/ddengine/README.md @@ -1,7 +1,7 @@ DeskDupEngine ------------- -DLL files taken from https://www.uvnc.eu/download/1222/UltraVnc_1_2_24_ALL.zip +DLL files taken from https://www.uvnc.eu/download/132/UltraVnc_1_3_2_ALL.zip and distributed with Veyon as is. Permission has been granted by Rudi De Vos via e-mail on 2018-09-16. diff --git a/3rdparty/ddengine/ddengine.dll b/3rdparty/ddengine/ddengine.dll index 95cb24be83f2d211c0bfeedfd1af2b08ad963ad0..9c6a9ddaa96a9cfd216364dc7619e73c1ec5c481 100644 GIT binary patch delta 60948 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 YTx?kKg}`tubE?moG`JxGaltVSI}suv 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
  • oe7x^?{ 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 bZB*u4m9^-2_?N36_dLu|`pX&y+JX!Kk#v<6 delta 60127 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 ZIh+WB(lV_2svWn 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%0Ah&XPjo@ZpuCj7~fz-0Gx`k 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 M=$nw#ADH|958)kyD*ylh From ad43cea02b4f38c72ab4654e076e396601eb3113 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 10 Dec 2020 15:30:15 +0100 Subject: [PATCH 0760/1765] RemoteAccessWidget: fix crash without master instance When invoked via CLI there's no VeyonMasterInterface instance. --- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index ab1e86f32..a70ad0e21 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -256,9 +256,9 @@ RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& { const auto openOnMasterScreen = VeyonCore::config().showFeatureWindowsOnSameScreen(); const auto master = VeyonCore::instance()->findChild(); - const auto masterWindow = master->mainWindow(); if( master && openOnMasterScreen ) { + const auto masterWindow = master->mainWindow(); move( masterWindow->x(), masterWindow->y() ); } else { move( 0, 0 ); From 6267f0afc91d5a30dc0e114c9df688650a4e18df Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 10 Dec 2020 15:56:58 +0100 Subject: [PATCH 0761/1765] BuiltinUltraVncServer: add MaxCpu setting Default to 100% instead of the previously hardcoded 40%. --- .../BuiltinUltraVncServer.cpp | 5 ++ .../ultravnc-builtin/UltraVncConfiguration.h | 1 + .../UltraVncConfigurationWidget.ui | 48 +++++++++++++------ 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp index e2f30adac..55156ddad 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp @@ -92,6 +92,11 @@ BOOL ultravnc_veyon_load_int( LPCSTR valname, LONG *out ) *out = vncServerInstance->configuration().ultraVncDeskDupEngineEnabled() ? 1 : 0; return true; } + if( strcmp( valname, "MaxCpu2" ) == 0 ) + { + *out = vncServerInstance->configuration().ultraVncMaxCpu(); + return true; + } if( strcmp( valname, "NewMSLogon" ) == 0 ) { *out = 0; diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h index 09ef34ea6..76ff0b471 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h @@ -32,6 +32,7 @@ OP( UltraVncConfiguration, m_configuration, bool, ultraVncPollFullScreen, setUltraVncPollFullScreen, "PollFullScreen", "UltraVNC", true, Configuration::Property::Flag::Advanced ) \ OP( UltraVncConfiguration, m_configuration, bool, ultraVncLowAccuracy, setUltraVncLowAccuracy, "LowAccuracy", "UltraVNC", true, Configuration::Property::Flag::Advanced ) \ OP( UltraVncConfiguration, m_configuration, bool, ultraVncDeskDupEngineEnabled, setUltraVncDeskDupEngineEnabled, "DeskDupEngine", "UltraVNC", true, Configuration::Property::Flag::Advanced ) \ + OP( UltraVncConfiguration, m_configuration, int, ultraVncMaxCpu, setUltraVncMaxCpu, "MaxCPU", "UltraVNC", 100, Configuration::Property::Flag::Advanced ) \ DECLARE_CONFIG_PROXY(UltraVncConfiguration, FOREACH_ULTRAVNC_CONFIG_PROPERTY) diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.ui b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.ui index a219d302c..3c009ec7d 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.ui +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.ui @@ -18,41 +18,61 @@ 0 - - + + - Poll full screen (leave this enabled per default) + Maximum CPU usage - - - - Enable multi monitor support + + + + % + + + 10 + + + 100 - - + + - Enable capturing of layered (semi-transparent) windows + Low accuracy (turbo mode) - - + + - Low accuracy (turbo mode) + Poll full screen (leave this enabled per default) - + Enable Desktop Duplication Engine on Windows 8 and newer + + + + Enable multi monitor support + + + + + + + Enable capturing of layered (semi-transparent) windows + + + From ed8e10fca2d60e94080470a35c8f1b5ecdadcb0d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 10 Dec 2020 15:59:14 +0100 Subject: [PATCH 0762/1765] 3rdparty: ultravnc: update submodule (UVNC 1.3.2) --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 2609a6a4b..e2a9979c6 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 2609a6a4b7a716f0fab356570412bfdae1d99ad0 +Subproject commit e2a9979c6e4ff79bc91a2313ffcfba571db37b01 From 76b180b33553cf4edb13faf40571f4d7066faab7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Dec 2020 08:06:53 +0100 Subject: [PATCH 0763/1765] NSIS: hide installation details per default --- nsis/veyon.nsi.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index 1ef2ea136..f0716ff7c 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -32,7 +32,7 @@ BrandingText "${APP_NAME} ${VERSION}" XPStyle on InstallDirRegKey "${REG_ROOT}" "${REG_APP_PATH}" "" InstallDir "$PROGRAMFILES64\Veyon" -ShowInstDetails show +ShowInstDetails hide RequestExecutionLevel admin ###################################################################### From f4da960f0a9e6c268b762bb0d671eafeb80e3d51 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Dec 2020 08:07:30 +0100 Subject: [PATCH 0764/1765] LinuxServiceCore: debug server crashes using catchsegv --- plugins/platform/linux/LinuxServiceCore.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 5bce999b8..e76adc463 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -154,7 +155,16 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO auto process = new QProcess( this ); process->setProcessEnvironment( sessionEnvironment ); - process->start( VeyonCore::filesystem().serverFilePath(), QStringList{} ); + + const auto catchsegv{ QStringLiteral("/usr/bin/catchsegv") }; + if( VeyonCore::isDebugging() && QFileInfo::exists( catchsegv ) ) + { + process->start( catchsegv, { VeyonCore::filesystem().serverFilePath() } ); + } + else + { + process->start( VeyonCore::filesystem().serverFilePath(), QStringList{} ); + } m_serverProcesses[sessionPath] = process; } From 28c33a2fdc2dd85cf6a0b60b42a75ba72e5bcc4d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Dec 2020 08:11:41 +0100 Subject: [PATCH 0765/1765] LinuxServiceCore: forward stdout/stderr of server This simplifies debugging since all server (and catchsegv) messages are now available in the system log (e.g. journal of systemd unit). --- plugins/platform/linux/LinuxServiceCore.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index e76adc463..fe2a6ee8a 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -36,6 +36,7 @@ #include "LinuxServiceCore.h" #include "LinuxSessionFunctions.h" #include "ProcessHelper.h" +#include "VeyonConfiguration.h" LinuxServiceCore::LinuxServiceCore( QObject* parent ) : @@ -156,6 +157,11 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO auto process = new QProcess( this ); process->setProcessEnvironment( sessionEnvironment ); + if( VeyonCore::config().logToSystem() ) + { + process->setProcessChannelMode( QProcess::ForwardedChannels ); + } + const auto catchsegv{ QStringLiteral("/usr/bin/catchsegv") }; if( VeyonCore::isDebugging() && QFileInfo::exists( catchsegv ) ) { From e32e68d46b0ee7cbcba48a5cee4fac9a053eadeb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Dec 2020 11:00:29 +0100 Subject: [PATCH 0766/1765] 3rdparty: ultravnc: update submodule (W10 issue) --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index e2a9979c6..d69265b0d 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit e2a9979c6e4ff79bc91a2313ffcfba571db37b01 +Subproject commit d69265b0de80727194370093c53dd0a55e9d1cae From ed17bff2d2702d2e2ede55b1479bcd2cf5465683 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Dec 2020 11:41:49 +0100 Subject: [PATCH 0767/1765] UltraVncConfigurationWidget: mark label as advanced --- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp index cb4975bdc..cb7544478 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp @@ -35,6 +35,8 @@ UltraVncConfigurationWidget::UltraVncConfigurationWidget( UltraVncConfiguration& { ui->setupUi( this ); + Configuration::UiMapping::setFlags( ui->ultraVncMaxCpu, Configuration::Property::Flag::Advanced ); + FOREACH_ULTRAVNC_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); FOREACH_ULTRAVNC_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); } From d4a1657baebcb95062a91f22d83f3362083832f9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Dec 2020 11:56:24 +0100 Subject: [PATCH 0768/1765] FeatureWorkerManager: don't start worker for logon screen sessions --- core/src/FeatureWorkerManager.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index 2c58fa011..2d3ee0b53 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -202,6 +202,13 @@ void FeatureWorkerManager::sendMessageToManagedSystemWorker( const FeatureMessag void FeatureWorkerManager::sendMessageToUnmanagedSessionWorker( const FeatureMessage& message ) { + // don't start worker for logon screen sessions + if( VeyonCore::platform().userFunctions().isAnyUserLoggedOn() == false || + VeyonCore::platform().coreFunctions().activeDesktopName().contains( QStringLiteral("winlogon"), Qt::CaseInsensitive ) ) + { + return; + } + if( isWorkerRunning( message.featureUid() ) == false && startUnmanagedSessionWorker( message.featureUid() ) == false ) { From 9d76a8926b6df759fc246d98bd4eb226b0721b1f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 18 Dec 2020 09:06:23 +0100 Subject: [PATCH 0769/1765] VeyonCore: include header for std::array --- core/src/VeyonCore.h | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 5c5cc49c9..f75c6764d 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -29,6 +29,7 @@ #include #include +#include #include #include #include From 94c628f7d71fabf564da5ab61d6c32dc0506479f Mon Sep 17 00:00:00 2001 From: SlrG Date: Fri, 4 Dec 2020 21:38:35 +0100 Subject: [PATCH 0770/1765] automatically remove last computer if nothing is selected --- master/src/SpotlightPanel.cpp | 13 ++++++++++--- master/src/SpotlightPanel.ui | 3 ++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index 8241ffb5c..3fc871652 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -137,9 +137,16 @@ void SpotlightPanel::remove() auto selection = ui->monitoringWidget->selectionModel()->selectedIndexes(); if( selection.isEmpty() ) { - QMessageBox::information( this, tr("Spotlight"), - tr( "Please select at least one computer to remove.") ); - return; + if( m_model->rowCount() > 0 ) + { + const auto lastIndex = m_model->index(m_model->rowCount() - 1, 0); + ui->monitoringWidget->selectionModel()->select(lastIndex, QItemSelectionModel::Select); + selection = ui->monitoringWidget->selectionModel()->selectedIndexes(); + } else { + QMessageBox::information( this, tr("Spotlight"), + tr( "Please select at least one computer to remove.") ); + return; + } } while( selection.isEmpty() == false ) diff --git a/master/src/SpotlightPanel.ui b/master/src/SpotlightPanel.ui index 6c2fc4b79..bbb1f8c32 100644 --- a/master/src/SpotlightPanel.ui +++ b/master/src/SpotlightPanel.ui @@ -85,7 +85,8 @@ - Add computers by clicking with the middle mouse button or clicking the first button below. + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. Qt::AlignCenter From 91a04a68103e319d59ca109614c9cf1de3b57a16 Mon Sep 17 00:00:00 2001 From: SlrG Date: Mon, 21 Dec 2020 17:33:54 +0100 Subject: [PATCH 0771/1765] add press and hold feature with hard coded ComputerZoomWidget --- master/src/ComputerMonitoringWidget.cpp | 69 ++++++++++++++++++++ master/src/ComputerMonitoringWidget.h | 11 ++++ master/src/ComputerZoomWidget.cpp | 86 +++++++++++++++++++++++++ master/src/ComputerZoomWidget.h | 46 +++++++++++++ 4 files changed, 212 insertions(+) create mode 100644 master/src/ComputerZoomWidget.cpp create mode 100644 master/src/ComputerZoomWidget.h diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index b85223f4e..8c5276539 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -272,6 +272,75 @@ void ComputerMonitoringWidget::runDoubleClickFeature( const QModelIndex& index ) +void ComputerMonitoringWidget::runMousePressAndHoldFeature( ) +{ + const auto selectedInterfaces = selectedComputerControlInterfaces(); + if ( !m_ignoreMousePressAndHoldEvent && + selectedInterfaces.count() > 0 && + selectedInterfaces.count() < 2 && + selectedInterfaces.first()->state() == ComputerControlInterface::State::Connected && + selectedInterfaces.first()->hasValidFramebuffer() ) + { + m_ignoreMousePressAndHoldEvent = true; + delete m_computerZoomWidget; + m_computerZoomWidget = new ComputerZoomWidget( selectedInterfaces.first() ); + QApplication::setOverrideCursor(Qt::BlankCursor); + } +} + + + +void ComputerMonitoringWidget::stopMousePressAndHoldFeature( ) +{ + delete m_computerZoomWidget; + m_computerZoomWidget = nullptr; + QApplication::restoreOverrideCursor(); +} + + + +void ComputerMonitoringWidget::mousePressEvent( QMouseEvent* event ) +{ + if( event->buttons() == Qt::LeftButton && indexAt(event->pos()).isValid() ) + { + if( !m_ignoreMousePressAndHoldEvent ) + { + m_mousePressAndHold.setInterval( 500 ); + m_mousePressAndHold.start(); + connect(&m_mousePressAndHold, &QTimer::timeout, this, &ComputerMonitoringWidget::runMousePressAndHoldFeature ); + } + } + QListView::mousePressEvent( event ); +} + + + +void ComputerMonitoringWidget::mouseReleaseEvent( QMouseEvent* event ) +{ + m_mousePressAndHold.stop(); + if ( m_ignoreMousePressAndHoldEvent ) + { + stopMousePressAndHoldFeature(); + } + m_ignoreMousePressAndHoldEvent = false; + QListView::mouseReleaseEvent( event ); +} + + + +void ComputerMonitoringWidget::mouseMoveEvent( QMouseEvent* event ) +{ + m_mousePressAndHold.stop(); + if ( m_ignoreMousePressAndHoldEvent ) + { + stopMousePressAndHoldFeature(); + } + m_ignoreMousePressAndHoldEvent = false; + QListView::mouseMoveEvent( event ); +} + + + void ComputerMonitoringWidget::resizeEvent( QResizeEvent* event ) { FlexibleListView::resizeEvent( event ); diff --git a/master/src/ComputerMonitoringWidget.h b/master/src/ComputerMonitoringWidget.h index d3d73979e..b5a2ae177 100644 --- a/master/src/ComputerMonitoringWidget.h +++ b/master/src/ComputerMonitoringWidget.h @@ -26,6 +26,7 @@ #include "ComputerMonitoringView.h" #include "FlexibleListView.h" +#include "ComputerZoomWidget.h" #include @@ -52,6 +53,8 @@ class ComputerMonitoringWidget : public FlexibleListView, public ComputerMonitor m_ignoreWheelEvent = enabled; } + QTimer m_mousePressAndHold; + private: void setColors( const QColor& backgroundColor, const QColor& textColor ) override; QJsonArray saveComputerPositions() override; @@ -65,15 +68,23 @@ class ComputerMonitoringWidget : public FlexibleListView, public ComputerMonitor void addSubFeaturesToMenu( const Feature& parentFeature, const FeatureList& subFeatures, const QString& label ); void runDoubleClickFeature( const QModelIndex& index ); + void runMousePressAndHoldFeature( ); + void stopMousePressAndHoldFeature( ); + void mousePressEvent( QMouseEvent* event ) override; + void mouseReleaseEvent( QMouseEvent* event ) override; + void mouseMoveEvent( QMouseEvent * event ) override; void resizeEvent( QResizeEvent* event ) override; void showEvent( QShowEvent* event ) override; void wheelEvent( QWheelEvent* event ) override; QMenu* m_featureMenu{}; + bool m_ignoreMousePressAndHoldEvent{false}; bool m_ignoreWheelEvent{false}; bool m_ignoreResizeEvent{false}; + ComputerZoomWidget* m_computerZoomWidget{nullptr}; + Q_SIGNALS: void computerScreenSizeAdjusted( int size ); diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp new file mode 100644 index 000000000..bcc58f010 --- /dev/null +++ b/master/src/ComputerZoomWidget.cpp @@ -0,0 +1,86 @@ +/* + * ComputerZoomWidget.cpp - fullscreen preview widget + * + * Copyright (c) 2006-2020 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include +#include +#include +#include + +#include "ComputerControlInterface.h" +#include "ComputerZoomWidget.h" +#include "VeyonConfiguration.h" +#include "VeyonMasterInterface.h" +#include "PlatformCoreFunctions.h" +#include "VncViewWidget.h" + + +ComputerZoomWidget::ComputerZoomWidget(const ComputerControlInterface::Pointer& computerControlInterface ) : + QWidget( nullptr ), + m_computerControlInterface( computerControlInterface ), + m_vncView( new VncViewWidget( computerControlInterface->computer().hostAddress(), -1, this, VncView::RemoteControlMode ) ) +{ + const auto openOnMasterScreen = VeyonCore::config().showFeatureWindowsOnSameScreen(); + const auto master = VeyonCore::instance()->findChild(); + const auto masterWindow = master->mainWindow(); + if( master && openOnMasterScreen ) + { + move( masterWindow->x(), masterWindow->y() ); + } else { + move( 0, 0 ); + } + + updateComputerZoomWidgetTitle(); + connect( m_computerControlInterface.data(), &ComputerControlInterface::userChanged, this, &ComputerZoomWidget::updateComputerZoomWidgetTitle ); + + setWindowIcon( QPixmap( QStringLiteral(":/remoteaccess/kmag.png") ) ); + setAttribute( Qt::WA_DeleteOnClose, true ); + + m_vncView->move( 0, 0 ); + + showMaximized(); + VeyonCore::platform().coreFunctions().raiseWindow( this, false ); +} + + + +ComputerZoomWidget::~ComputerZoomWidget() +{ + delete m_vncView; +} + + + +void ComputerZoomWidget::updateComputerZoomWidgetTitle() +{ + if ( m_computerControlInterface->userFullName().isEmpty() ) + { + setWindowTitle( tr( "%1 - %2 Computer Zoom Widget" ).arg( m_computerControlInterface->computer().name(), + VeyonCore::applicationName() ) ); + } else + { + setWindowTitle( tr( "%1 - %2 - %3 Computer Zoom Widget" ).arg( m_computerControlInterface->userFullName(), + m_computerControlInterface->computer().name(), + VeyonCore::applicationName() ) ); + } +} diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h new file mode 100644 index 000000000..5b0a9f6f1 --- /dev/null +++ b/master/src/ComputerZoomWidget.h @@ -0,0 +1,46 @@ +/* + * ComputerZoomWidget.h - fullscreen preview widget + * + * Copyright (c) 2006-2020 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "ComputerControlInterface.h" + +#include + +class VncViewWidget; + +class ComputerZoomWidget : public QWidget +{ + Q_OBJECT +public: + ComputerZoomWidget( const ComputerControlInterface::Pointer& computerControlInterface ); + ~ComputerZoomWidget() override; + +private: + void updateComputerZoomWidgetTitle(); + + ComputerControlInterface::Pointer m_computerControlInterface; + VncViewWidget* m_vncView; + +} ; From 4c7e66ff31ba2a5ea8e0b06100ffad46cc1a5a78 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 13 Jan 2021 09:02:59 +0100 Subject: [PATCH 0772/1765] 3rdparty: update submodules --- 3rdparty/kitemmodels | 2 +- 3rdparty/kldap | 2 +- 3rdparty/ultravnc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/3rdparty/kitemmodels b/3rdparty/kitemmodels index a502b1b98..328eac84b 160000 --- a/3rdparty/kitemmodels +++ b/3rdparty/kitemmodels @@ -1 +1 @@ -Subproject commit a502b1b986416775a6eee2aacba68cffa95e9061 +Subproject commit 328eac84b34e5dd44316469942732e51d13a2182 diff --git a/3rdparty/kldap b/3rdparty/kldap index 4a6da650c..497435947 160000 --- a/3rdparty/kldap +++ b/3rdparty/kldap @@ -1 +1 @@ -Subproject commit 4a6da650c366e7c688bc64591f4f910de8528946 +Subproject commit 4974359470669f8a2fcb017a2cbc6974aa8e6f3a diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index d69265b0d..66a235f5f 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit d69265b0de80727194370093c53dd0a55e9d1cae +Subproject commit 66a235f5f5313e9e3176c3ccde4f290bd91b44bd From 6ec8d928277708b0d705d7cdc33f8f4118b508a7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 13 Jan 2021 09:01:04 +0100 Subject: [PATCH 0773/1765] Update translations --- translations/veyon.ts | 324 +----- translations/veyon_ar.ts | 324 +----- translations/veyon_bg.ts | 537 +++------ translations/veyon_ca_ES.ts | 324 +----- translations/veyon_cs.ts | 481 ++------ translations/veyon_de.ts | 360 +----- translations/veyon_el.ts | 1880 +++++++++++++----------------- translations/veyon_es_ES.ts | 363 +----- translations/veyon_et.ts | 361 +----- translations/veyon_fa.ts | 1734 ++++++++++++---------------- translations/veyon_fr.ts | 361 +----- translations/veyon_he.ts | 1963 ++++++++++++++----------------- translations/veyon_hu.ts | 513 ++------- translations/veyon_id.ts | 1561 +++++++++++-------------- translations/veyon_it.ts | 358 +----- translations/veyon_ja.ts | 1661 +++++++++++---------------- translations/veyon_ko.ts | 523 ++------- translations/veyon_lt.ts | 809 +++++-------- translations/veyon_lv.ts | 1678 ++++++++++++--------------- translations/veyon_mn.ts | 324 +----- translations/veyon_nl.ts | 1056 +++++++---------- translations/veyon_no_NO.ts | 2170 +++++++++++++++-------------------- translations/veyon_pl.ts | 437 ++----- translations/veyon_pt_BR.ts | 1097 +++++++----------- translations/veyon_pt_PT.ts | 324 +----- translations/veyon_ru.ts | 451 ++------ translations/veyon_sl.ts | 659 ++++------- translations/veyon_sr.ts | 507 ++------ translations/veyon_sv.ts | 324 +----- translations/veyon_th.ts | 1549 ++++++++++--------------- translations/veyon_tr.ts | 511 ++------- translations/veyon_uk.ts | 358 +----- translations/veyon_vi.ts | 327 +----- translations/veyon_zh_CN.ts | 490 ++------ translations/veyon_zh_TW.ts | 361 +----- 35 files changed, 8782 insertions(+), 18278 deletions(-) diff --git a/translations/veyon.ts b/translations/veyon.ts index 79ff2447d..70274b2a9 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -80,10 +80,6 @@ If you're interested in translating Veyon into your local or another langua All groups - - ... - - Access control rules @@ -323,95 +319,6 @@ If you're interested in translating Veyon into your local or another langua - - AndroidPlatformConfigurationPage - - Android - - - - General - - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - - - - Public key file base directory - - - - Private key file base directory - - - - ... - - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - - - - Delete key - - - - Import key - - - - Export key - - - - Set access group - - - AuthKeysConfigurationWidget @@ -1388,10 +1295,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - - Computer search @@ -1421,6 +1324,17 @@ The public key is used on client computers to authenticate incoming connection r + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1552,10 +1466,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit - - Use multithreading (experimental) - - MB @@ -1970,10 +1880,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory - - ... - - Log level @@ -2070,20 +1976,11 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system + + + HeadlessVncServer - Authentication - - - - Method: - - - - Test - - - - Configure + Headless VNC server @@ -2853,53 +2750,6 @@ The public key is used on client computers to authenticate incoming connection r - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - - - LinuxPlatformConfigurationPage @@ -3094,10 +2944,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - - Adjust optimal size - - Align computers to grid @@ -3165,10 +3011,6 @@ The public key is used on client computers to authenticate incoming connection r Directories - - ... - - User configuration @@ -3301,10 +3143,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location - - Automatically adjust computer thumbnail size - - Automatically open computer select panel @@ -3337,6 +3175,10 @@ The public key is used on client computers to authenticate incoming connection r Automatically adjust computer icon size + + Open feature windows on the same screen as the main window + + MonitoringMode @@ -3353,97 +3195,6 @@ The public key is used on client computers to authenticate incoming connection r - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - - - NetworkObjectTreeModel @@ -3929,14 +3680,6 @@ Please save your work and close all programs. State: - - Network - - - - Demo server port - - Enable firewall exception @@ -3945,10 +3688,6 @@ Please save your work and close all programs. Allow connections from localhost only - - Internal VNC server port - - VNC server @@ -3969,14 +3708,6 @@ Please save your work and close all programs. Running - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -3986,10 +3717,6 @@ Typically this is required to support terminal servers. Show notification on remote connection - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked @@ -4141,10 +3868,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers @@ -4169,6 +3892,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4255,6 +3983,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer + + Maximum CPU usage + + UserConfig diff --git a/translations/veyon_ar.ts b/translations/veyon_ar.ts index 66dfa46fa..1d7fd4de1 100644 --- a/translations/veyon_ar.ts +++ b/translations/veyon_ar.ts @@ -78,10 +78,6 @@ If you're interested in translating Veyon into your local or another langua All groups جميع المجموعات - - ... - ... - Access control rules قواعد التحكم في الوصول @@ -321,95 +317,6 @@ If you're interested in translating Veyon into your local or another langua - - AndroidPlatformConfigurationPage - - Android - - - - General - عام - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - - - - Public key file base directory - دليل ملفات المفاتيح العامة الأساسي - - - Private key file base directory - دليل ملفات المفاتيح الخاصة الأساسي - - - ... - ... - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - - - - Delete key - - - - Import key - - - - Export key - - - - Set access group - - - AuthKeysConfigurationWidget @@ -1386,10 +1293,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - - Computer search @@ -1419,6 +1322,17 @@ The public key is used on client computers to authenticate incoming connection r + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1550,10 +1464,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit - - Use multithreading (experimental) - - MB @@ -1968,10 +1878,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory دليل ملف الدخول - - ... - ... - Log level مستوى الدخول @@ -2068,20 +1974,11 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system + + + HeadlessVncServer - Authentication - توثيق - - - Method: - - - - Test - إختبار - - - Configure + Headless VNC server @@ -2851,53 +2748,6 @@ The public key is used on client computers to authenticate incoming connection r - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - - - LinuxPlatformConfigurationPage @@ -3092,10 +2942,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - - Adjust optimal size - - Align computers to grid @@ -3163,10 +3009,6 @@ The public key is used on client computers to authenticate incoming connection r Directories أدلة - - ... - ... - User configuration @@ -3299,10 +3141,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location - - Automatically adjust computer thumbnail size - - Automatically open computer select panel @@ -3335,6 +3173,10 @@ The public key is used on client computers to authenticate incoming connection r Automatically adjust computer icon size + + Open feature windows on the same screen as the main window + + MonitoringMode @@ -3351,97 +3193,6 @@ The public key is used on client computers to authenticate incoming connection r - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - إختبار - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - - - NetworkObjectTreeModel @@ -3927,14 +3678,6 @@ Please save your work and close all programs. State: بيان:‏ - - Network - شبكة - - - Demo server port - منفذ خادم العرض - Enable firewall exception تمكين إستثناء الجدار الناري @@ -3943,10 +3686,6 @@ Please save your work and close all programs. Allow connections from localhost only السماح بالتوصيل من المضيف المحلي فقط - - Internal VNC server port - - VNC server @@ -3967,14 +3706,6 @@ Please save your work and close all programs. Running تشغيل - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -3984,10 +3715,6 @@ Typically this is required to support terminal servers. Show notification on remote connection - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked @@ -4139,10 +3866,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers @@ -4167,6 +3890,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4253,6 +3981,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer + + Maximum CPU usage + + UserConfig diff --git a/translations/veyon_bg.ts b/translations/veyon_bg.ts index 040a1943f..3afab2c5a 100644 --- a/translations/veyon_bg.ts +++ b/translations/veyon_bg.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ If you're interested in translating Veyon into your local or another langua All groups Всички групи - - ... - ... - Access control rules Правила за контрол на достъпа @@ -267,7 +261,7 @@ If you're interested in translating Veyon into your local or another langua Authenticated via method - + @@ -322,99 +316,7 @@ If you're interested in translating Veyon into your local or another langua Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - - - - General - Общи настройки - - - - AuthKeysConfigurationDialog - - Authentication keys - Authentication keys - - - Introduction - Introduction - - - Please perform the following steps to set up key file authentication: - Please perform the following steps to set up key file authentication: - - - 1) Create a key pair on the master computer. - 1) Create a key pair on the master computer. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Set an access group whose members should be allowed to access other computers. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Export the public key and import it on all client computers with the same name. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - Key file directories - Key file directories - - - Public key file base directory - Public key file base directory - - - Private key file base directory - Private key file base directory - - - ... - ... - - - Available authentication keys - Available authentication keys - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - Create key pair - Create key pair - - - Delete key - Delete key - - - Import key - Import key - - - Export key - Export key - - - Set access group - Set access group + @@ -757,7 +659,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -765,7 +667,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -791,7 +693,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -799,11 +701,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -814,7 +716,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -864,7 +766,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -872,7 +774,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + @@ -883,7 +785,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the Veyon password: - + Authentication error @@ -891,29 +793,29 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. @@ -924,7 +826,7 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPageTab Enabled - + Test @@ -1291,11 +1193,11 @@ The public key is used on client computers to authenticate incoming connection r [no user] - + Veyon Server unreachable or not running - + @@ -1330,14 +1232,14 @@ The public key is used on client computers to authenticate incoming connection r Active connections: - + ComputerGroupSelector Group %1 - + @@ -1379,27 +1281,23 @@ The public key is used on client computers to authenticate incoming connection r Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - Computer management - Computer search Computer search @@ -1429,6 +1327,17 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1528,7 +1437,7 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Service. - + @@ -1560,10 +1469,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit Memory limit - - Use multithreading (experimental) - Use multithreading (experimental) - MB MB @@ -1601,59 +1506,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1853,11 +1758,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Default source directory - + Options @@ -1865,11 +1770,11 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + @@ -1978,10 +1883,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Log file directory - - ... - ... - Log level Log level @@ -2078,21 +1979,12 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system Write to logging system of operating system + + + HeadlessVncServer - Authentication - Authentication - - - Method: - Method: - - - Test - Тест - - - Configure - + Headless VNC server + @@ -2347,7 +2239,7 @@ The public key is used on client computers to authenticate incoming connection r Computer groups filter - + Computer locations identification @@ -2359,11 +2251,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2869,62 +2761,15 @@ The public key is used on client computers to authenticate incoming connection r Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + @@ -3121,10 +2966,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers Search users and computers - - Adjust optimal size - Adjust optimal size - Align computers to grid Align computers to grid @@ -3174,16 +3015,16 @@ The public key is used on client computers to authenticate incoming connection r Authentication - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3192,10 +3033,6 @@ The public key is used on client computers to authenticate incoming connection r Directories Directories - - ... - ... - User configuration User configuration @@ -3328,41 +3165,41 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location Automatically select current location - - Automatically adjust computer thumbnail size - Automatically adjust computer thumbnail size - Automatically open computer select panel Automatically open computer select panel Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Auto + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3380,97 +3217,6 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Тест - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - ms - - - Session scan limit - - - - Options - Options - - - Reverse lookup discovered IP addresses to host names - - - NetworkObjectTreeModel @@ -3509,11 +3255,11 @@ The public key is used on client computers to authenticate incoming connection r PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3521,23 +3267,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3697,7 +3443,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3708,7 +3454,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + @@ -3829,15 +3575,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3856,7 +3602,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3921,11 +3667,11 @@ Please save your work and close all programs. Screenshot - Screenshot + Screenshot Do you really want to delete all selected screenshots? - + @@ -3958,14 +3704,6 @@ Please save your work and close all programs. State: State: - - Network - Network - - - Demo server port - Demo server port - Enable firewall exception Enable firewall exception @@ -3974,10 +3712,6 @@ Please save your work and close all programs. Allow connections from localhost only Allow connections from localhost only - - Internal VNC server port - Internal VNC server port - VNC server VNC server @@ -3998,14 +3732,6 @@ Please save your work and close all programs. Running Running - - Feature manager port - Feature manager port - - - Primary service port - Primary service port - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4016,45 +3742,41 @@ Typically this is required to support terminal servers. Show notification on remote connection Show notification on remote connection - - Multi session mode (for terminal and remote desktop servers) - Multi session mode (for terminal and remote desktop servers) - Show notification when an unauthorized access is blocked Show notification when an unauthorized access is blocked Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4062,7 +3784,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4154,50 +3876,51 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4285,6 +4008,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer Enable Desktop Duplication Engine on Windows 8 and newer + + Maximum CPU usage + + UserConfig @@ -4495,7 +4222,7 @@ Typically this is required to support terminal servers. Use input device interception driver - + @@ -4555,7 +4282,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_ca_ES.ts b/translations/veyon_ca_ES.ts index 2b6250f1e..7545c9b24 100644 --- a/translations/veyon_ca_ES.ts +++ b/translations/veyon_ca_ES.ts @@ -78,10 +78,6 @@ If you're interested in translating Veyon into your local or another langua All groups Tots els grups - - ... - ... - Access control rules @@ -321,95 +317,6 @@ If you're interested in translating Veyon into your local or another langua - - AndroidPlatformConfigurationPage - - Android - - - - General - General - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - - - - Public key file base directory - Carpeta del fitxer de la clau pública - - - Private key file base directory - Carpeta del fitxer de la clau privada - - - ... - ... - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - - - - Delete key - - - - Import key - - - - Export key - - - - Set access group - - - AuthKeysConfigurationWidget @@ -1386,10 +1293,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - - Computer search @@ -1419,6 +1322,17 @@ The public key is used on client computers to authenticate incoming connection r + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1550,10 +1464,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit - - Use multithreading (experimental) - - MB @@ -1968,10 +1878,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Carpeta dels fitxers de registre - - ... - ... - Log level Nivell de registre @@ -2068,20 +1974,11 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system + + + HeadlessVncServer - Authentication - Autentificació - - - Method: - - - - Test - Comprova - - - Configure + Headless VNC server @@ -2851,53 +2748,6 @@ The public key is used on client computers to authenticate incoming connection r - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - - - LinuxPlatformConfigurationPage @@ -3092,10 +2942,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - - Adjust optimal size - - Align computers to grid @@ -3163,10 +3009,6 @@ The public key is used on client computers to authenticate incoming connection r Directories Carpetes - - ... - ... - User configuration @@ -3299,10 +3141,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location - - Automatically adjust computer thumbnail size - - Automatically open computer select panel @@ -3335,6 +3173,10 @@ The public key is used on client computers to authenticate incoming connection r Automatically adjust computer icon size + + Open feature windows on the same screen as the main window + + MonitoringMode @@ -3351,97 +3193,6 @@ The public key is used on client computers to authenticate incoming connection r - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Comprova - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - - - NetworkObjectTreeModel @@ -3927,14 +3678,6 @@ Please save your work and close all programs. State: Estat: - - Network - Xarxa - - - Demo server port - Port del servidor demo - Enable firewall exception Activar excepció en el tallafocs @@ -3943,10 +3686,6 @@ Please save your work and close all programs. Allow connections from localhost only Permet connexions només des d'aquest equip - - Internal VNC server port - - VNC server @@ -3967,14 +3706,6 @@ Please save your work and close all programs. Running Funcionant - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -3984,10 +3715,6 @@ Typically this is required to support terminal servers. Show notification on remote connection - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked @@ -4139,10 +3866,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers @@ -4167,6 +3890,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4253,6 +3981,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer + + Maximum CPU usage + + UserConfig diff --git a/translations/veyon_cs.ts b/translations/veyon_cs.ts index b2df2437c..dadf7a4ed 100644 --- a/translations/veyon_cs.ts +++ b/translations/veyon_cs.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně All groups Všechny skupiny - - ... - - Access control rules Pravidla řízení přístupu @@ -267,7 +261,7 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně Authenticated via method - + @@ -322,99 +316,7 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Obecné - - - - AuthKeysConfigurationDialog - - Authentication keys - Ověřovací klíče - - - Introduction - Úvod - - - Please perform the following steps to set up key file authentication: - Pro nastavení ověřování souborem s klíčem proveďte následující kroky: - - - 1) Create a key pair on the master computer. - 1) Vytvořte dvojici klíčů na řídícím počítači. - - - 2) Set an access group whose members should be allowed to access other computers. - 2( Nastavte přístupovou skupinu jejíž členům by mělo být umožněno přistupovat k ostatním počítačům. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Exportujte veřejnou část klíče a importujte ji na všechny klientské počítače pod stejným názvem. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Nahlédněte do <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Příručky správy Veyon</a> pro další informace. - - - Key file directories - Složky souboru s klíčem - - - Public key file base directory - Základní složka pro veřejnou část klíče - - - Private key file base directory - Základní složka pro soukromou část klíče - - - ... - - - - Available authentication keys - Ověřovací klíče k dispozici - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Dvojice ověřovacích klíčů je tvořena propojovacími šifrovacími klíči, soukromým a veřejným. -Soukromá část umožňuje uživatelům na hlavním počítači přistupovat ke klientským počítačům. -Je důležité aby pouze pověření uživatelé mohli číst soubor se soukromou částí klíče. -Veřejná část je použita na klientských počítačích pro ověření příchozího požadavku na připojení. - - - Create key pair - Vytvořit dvojici klíčů - - - Delete key - Smazat klíč - - - Import key - Importovat klíč - - - Export key - Exportovat klíč - - - Set access group - Nastavit přístupovou skupinu + @@ -765,7 +667,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Key file - + @@ -791,7 +693,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří AuthLdapConfigurationWidget LDAP authentication - + General @@ -799,11 +701,11 @@ Veřejná část je použita na klientských počítačích pro ověření pří Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -814,7 +716,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -872,7 +774,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Logon - + @@ -906,7 +808,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Simple password - + @@ -924,7 +826,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří AuthenticationPageTab Enabled - + Test @@ -1291,11 +1193,11 @@ Veřejná část je použita na klientských počítačích pro ověření pří [no user] - + Veyon Server unreachable or not running - + @@ -1396,10 +1298,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří ComputerSelectPanel - - Computer management - Správa počítače - Computer search Vyhledání počítače @@ -1429,6 +1327,17 @@ Veřejná část je použita na klientských počítačích pro ověření pří Nedaří se zapsat seznam počítačů a uživatelů do %1! Zkontrolujte přístupová práva souboru. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1528,7 +1437,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří Could not configure the firewall configuration for the %1 Service. - + @@ -1560,10 +1469,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Memory limit Paměťový limit - - Use multithreading (experimental) - Provozovat vícevláknově (experimentální) - MB MB @@ -1601,59 +1506,59 @@ Veřejná část je použita na klientských počítačích pro ověření pří Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1853,11 +1758,11 @@ Veřejná část je použita na klientských počítačích pro ověření pří Destination directory - + Default source directory - + Options @@ -1865,11 +1770,11 @@ Veřejná část je použita na klientských počítačích pro ověření pří Remember last source directory - + Create destination directory if it does not exist - + @@ -1978,10 +1883,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Log file directory Složka pro soubor se záznamy událostí - - ... - - Log level Úroveň podrobností záznamu událostí @@ -2078,21 +1979,12 @@ Veřejná část je použita na klientských počítačích pro ověření pří Write to logging system of operating system Zapisovat do systému záznamu událostí operačního systému + + + HeadlessVncServer - Authentication - Ověření - - - Method: - Metoda: - - - Test - Vyzkoušet funkčnost - - - Configure - Nastavit + Headless VNC server + @@ -2873,54 +2765,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří LDAP bind - - - - - LicensingConfigurationPage - - Licensing - Licencování - - - Installed licenses - Nainstalované licence - - - Add new network range - Přidat nový síťový rozsah - - - Remove selected network range - Odebrat označený síťový rozsah - - - ID - Identif. - - - Valid until - Platné do - - - Licensee - Držitel licence - - - Information - Informace - - - Installation ID - Identifikátor instalace - - - Addons available for licensing - Doplňky které je možné si licencovat - - - Addon - Doplněk + @@ -3117,10 +2962,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Search users and computers Hledání uživatelů a počítačů - - Adjust optimal size - Upravit optimální velikost - Align computers to grid Zarovnat počítače do mřížky @@ -3170,16 +3011,16 @@ Veřejná část je použita na klientských počítačích pro ověření pří Ověření - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3188,10 +3029,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Directories Složky - - ... - - User configuration Nastavení uživatele @@ -3324,10 +3161,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Automatically select current location Automaticky vybrat stávající umístění - - Automatically adjust computer thumbnail size - Automaticky přizpůsobit velikost náhledu počítače - Automatically open computer select panel Automaticky otevřít panel výběru počítače @@ -3338,27 +3171,31 @@ Veřejná část je použita na klientských počítačích pro ověření pří Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Automaticky + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3376,97 +3213,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Tento režim umožňuje monitorovat veškeré počítače v jednom a více umístěních. - - NetworkDiscoveryConfigurationPage - - Network discovery - Prozkoumávání sítě - - - Mode - Režim - - - Scan network ranges - Skenovat síťové rozsahy - - - e.g. 192.168.1.0/24 - např. 192.168.1.0/24 - - - Scan all subnets of computer - Skenovat všechny podsítě počítače - - - Scan custom subnet - Skenovat uživatelsky určenou podsíť - - - Scan sessions on local computer - Skenovací relace na tomto počítači - - - Test - Vyzkoušet funkčnost - - - Network ranges - Síťové rozsahy - - - Add new group - Přidat novou skupinu - - - Remove selected group - Odebrat označenou skupinu - - - Groups - Skupiny - - - First address - První adresa - - - Last address - Poslední adresa - - - Add new network range - Přidat nový síťový rozsah - - - Remove selected network range - Odebrat označený síťový rozsah - - - Parallel scans - Souběžné skeny - - - Scan timeout - Časový limit skenování - - - ms - ms - - - Session scan limit - Limit skenu relace - - - Options - Volby - - - Reverse lookup discovered IP addresses to host names - Překládat objevené IP adresy na názvy strojů - - NetworkObjectTreeModel @@ -3525,7 +3271,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří UID - + Plugin-related CLI operations @@ -3704,7 +3450,7 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. %1 - %2 - %3 Remote Access - + @@ -3829,11 +3575,11 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3852,7 +3598,7 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Could not open screenshot file %1 for writing. - + @@ -3917,11 +3663,11 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Screenshot - Snímek obrazovky + Snímek obrazovky Do you really want to delete all selected screenshots? - + @@ -3954,14 +3700,6 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. State: Stav: - - Network - Síť - - - Demo server port - Port ukázkového serveru - Enable firewall exception Vytvořit výjimku na bráně firewall @@ -3970,10 +3708,6 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Allow connections from localhost only Umožnit připojení pouze v rámci tohoto počítače (localhost) - - Internal VNC server port - Port vnitřního VNC serveru - VNC server VNC server @@ -3994,14 +3728,6 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Running Spuštěné - - Feature manager port - Port správce funkce - - - Primary service port - Port hlavní služby - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4012,45 +3738,41 @@ Typicky je toto třeba na terminálových serverech. Show notification on remote connection Zobrazovat upozornění na připojení na dálku - - Multi session mode (for terminal and remote desktop servers) - Režim vícero relací (pro terminály a servery pro vzdálenou plochu) - Show notification when an unauthorized access is blocked Zobrazit oznámení když je zablokován nepověřený přístup Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4058,7 +3780,7 @@ Typicky je toto třeba na terminálových serverech. Miscellaneous network settings - + @@ -4150,50 +3872,51 @@ Typicky je toto třeba na terminálových serverech. SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4281,6 +4004,10 @@ Typicky je toto třeba na terminálových serverech. Enable Desktop Duplication Engine on Windows 8 and newer Zapnout Desktop Duplication Engine na Windows 8 a novějších + + Maximum CPU usage + + UserConfig @@ -4491,7 +4218,7 @@ Typicky je toto třeba na terminálových serverech. Use input device interception driver - + @@ -4554,4 +4281,4 @@ Typicky je toto třeba na terminálových serverech. Veyon – hlavní - + \ No newline at end of file diff --git a/translations/veyon_de.ts b/translations/veyon_de.ts index 8c3e4c986..30fce184d 100644 --- a/translations/veyon_de.ts +++ b/translations/veyon_de.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -80,10 +78,6 @@ If you're interested in translating Veyon into your local or another langua All groups Alle Gruppen - - ... - ... - Access control rules Zugriffskontrollregeln @@ -323,97 +317,6 @@ If you're interested in translating Veyon into your local or another langua Authentifizierungsmethode - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Allgemein - - - - AuthKeysConfigurationDialog - - Authentication keys - Authentifizierungsschlüssel - - - Introduction - Einführung - - - Please perform the following steps to set up key file authentication: - Bitte führen Sie die folgenden Schritte durch, um die Schlüsseldatei-Authentifizierung einzurichten: - - - 1) Create a key pair on the master computer. - 1) Schlüsselpaar auf dem Master-Computer erzeugen. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Zugriffsgruppe festlegen, deren Mitgliedern der Zugriff auf andere Computer erlaubt werden soll. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Öffentlichen Schlüssel exportieren und auf allen Client-Computern mit dem selben Namen importieren. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Weitere Informationen entnehmen Sie bitte dem <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon-Administrationshandbuch</a>. - - - Key file directories - Schlüsseldateiverzeichnis - - - Public key file base directory - Basisverzeichnis der öffentlichen Schlüsseldatei - - - Private key file base directory - Basisverzeichnis der privaten Schlüsseldatei - - - ... - ... - - - Available authentication keys - Verfügbare Authentifizierungsschlüssel - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Ein Authentifizierungsschlüsselpaar besteht aus zwei zueinander gehörigen Teilen, einem privaten und einem öffentlichen Schlüsselteil. -Mit Hilfe des privaten Schlüssels können Nutzer auf dem Mastercomputer auf Clientcomputer zugreifen. Es ist wichtig, dass nur autorisierte Nutzer Lesezugriff auf die private Schlüsseldatei besitzen. -Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede eingehende Verbindungsanfrage zu prüfen, ob diese autorisiert ist. - - - Create key pair - Schlüsselpaar erzeugen - - - Delete key - Schlüssel löschen - - - Import key - Schlüssel importieren - - - Export key - Schlüssel exportieren - - - Set access group - Zugriffsgruppe setzen - - AuthKeysConfigurationWidget @@ -1287,11 +1190,11 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e [no user] - + [Kein Benutzer] Veyon Server unreachable or not running - + Veyon-Server nicht erreichbar oder läuft nicht @@ -1392,10 +1295,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e ComputerSelectPanel - - Computer management - Computerverwaltung - Computer search Computersuche @@ -1425,6 +1324,17 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Die Computer- und Benutzerliste konnte nicht in die Datei %1 geschrieben werden. Bitte überprüfen Sie die Dateizugriffsrechte. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1556,10 +1466,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Memory limit Speicherlimit - - Use multithreading (experimental) - Multithreading benutzen (experimentell) - MB MB @@ -1974,10 +1880,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Log file directory Logdateiverzeichnis - - ... - ... - Log level Loglevel @@ -2074,21 +1976,12 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Write to logging system of operating system In Ereignisprotokollierung des Betriebssystems schreiben + + + HeadlessVncServer - Authentication - Authentifizierung - - - Method: - Methode: - - - Test - Testen - - - Configure - Konfigurieren + Headless VNC server + Headless VNC-Server @@ -2876,53 +2769,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e LDAP-Bind - - LicensingConfigurationPage - - Licensing - Lizenzierung - - - Installed licenses - Installierte Lizenzen - - - Add new network range - Neuen Netzwerkbereich hinzufügen - - - Remove selected network range - Gewählten Netzwerkbereich entfernen - - - ID - ID - - - Valid until - Gültig bis - - - Licensee - Lizenznehmer - - - Information - Informationen - - - Installation ID - Installations-ID - - - Addons available for licensing - Lizenzierbare Erweiterungen - - - Addon - Erweiterung - - LinuxPlatformConfigurationPage @@ -3117,10 +2963,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Search users and computers Benutzer und Computer suchen - - Adjust optimal size - Optimale Größe einstellen - Align computers to grid Computer an Gitter ausrichten @@ -3169,6 +3011,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Authentication Authentifizierung + + Adjust size of computer icons automatically + Größe der Computer-Icons automatisch anpassen + Slideshow Diashow @@ -3177,10 +3023,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Spotlight Scheinwerfer - - Adjust size of computer icons automatically - - MasterConfigurationPage @@ -3188,10 +3030,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Directories Verzeichnisse - - ... - ... - User configuration Benutzerkonfiguration @@ -3324,10 +3162,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Automatically select current location Automatisch aktuellen Standort auswählen - - Automatically adjust computer thumbnail size - Automatisch die Größe der Computer-Miniaturbilder anpassen - Automatically open computer select panel Automatisch Computerauswahlbedienfeld öffnen @@ -3348,17 +3182,21 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Hide local session Lokale Sitzung ausblenden + + Auto + Auto + Thumbnail aspect ratio Seitenverhältnis Miniaturbilder - Auto - Auto + Automatically adjust computer icon size + Automatisch die Größe der Computer-Icons anpassen - Automatically adjust computer icon size - + Open feature windows on the same screen as the main window + Funktionsfenster auf dem gleichen Bildschirm wie der des Hauptfensters öffnen @@ -3376,97 +3214,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Dieser Modus erlaubt es Ihnen, alle Computer an einem oder mehreren Standorten zu beobachten. - - NetworkDiscoveryConfigurationPage - - Network discovery - Netzwerkerkennung - - - Mode - Modus - - - Scan network ranges - Netzwerkbereiche scannen - - - e.g. 192.168.1.0/24 - z.B. 192.168.1.0/24 - - - Scan all subnets of computer - Alle Subnetze des Computers scannen - - - Scan custom subnet - Benutzerdefiniertes Subnetz scannen - - - Scan sessions on local computer - Sitzungen auf lokalem Computer scannen - - - Test - Testen - - - Network ranges - Netzwerkbereiche - - - Add new group - Neue Gruppe hinzufügen - - - Remove selected group - Gewählte Gruppe entfernen - - - Groups - Gruppen - - - First address - Erste Adresse - - - Last address - Letzte Adresse - - - Add new network range - Neuen Netzwerkbereich hinzufügen - - - Remove selected network range - Gewählten Netzwerkbereich entfernen - - - Parallel scans - Parallele Scans - - - Scan timeout - Scan-Timeout - - - ms - ms - - - Session scan limit - Limit für Sitzungsscan - - - Options - Optionen - - - Reverse lookup discovered IP addresses to host names - Gefundene IP-Adressen in Hostnamen rückwärts auflösen - - NetworkObjectTreeModel @@ -3704,7 +3451,7 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Fernzugriff @@ -3917,11 +3664,11 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Screenshot - Bildschirmfoto + Bildschirmfoto Do you really want to delete all selected screenshots? - + Möchten Sie wirklich alle ausgewählten Screenshots löschen? @@ -3954,14 +3701,6 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. State: Status: - - Network - Netzwerk - - - Demo server port - Demoserver-Port - Enable firewall exception Firewall-Ausnahme aktivieren @@ -3970,10 +3709,6 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Allow connections from localhost only Nur Verbindungen vom lokalen Computer erlauben - - Internal VNC server port - Port des internen VNC-Servers - VNC server VNC-Server @@ -3994,14 +3729,6 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Running Läuft - - Feature manager port - Funktionsverwalter-Port - - - Primary service port - Primärer Dienst-Port - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4012,10 +3739,6 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Show notification on remote connection Benachrichtigung bei Fernzugriff anzeigen - - Multi session mode (for terminal and remote desktop servers) - Mehrfachsitzungsmodus (für Terminal- und Remote-Desktop-Server) - Show notification when an unauthorized access is blocked Benachrichtigung bei unerlaubtem Zugriff anzeigen @@ -4167,10 +3890,6 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - Computer durch Klick mit der mittleren Maustaste oder mit Hilfe des ersten Buttons hinzufügen. - Add selected computers Gewählte Computer hinzufügen @@ -4195,6 +3914,11 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Please select at least one computer to remove. Bitte wählen Sie mindestens einen zu entfernenden Computer aus. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4281,6 +4005,10 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Enable Desktop Duplication Engine on Windows 8 and newer Desktop-Duplication-Engine unter Windows 8 und neuer aktivieren + + Maximum CPU usage + Maximale CPU-Auslastung + UserConfig @@ -4554,4 +4282,4 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Veyon Master - + \ No newline at end of file diff --git a/translations/veyon_el.ts b/translations/veyon_el.ts index aede69349..5335e7302 100644 --- a/translations/veyon_el.ts +++ b/translations/veyon_el.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -35,7 +33,7 @@ Current language not translated yet (or native English). If you're interested in translating Veyon into your local or another language or want to improve an existing translation, please contact a Veyon developer! - + About %1 %2 @@ -50,11 +48,11 @@ If you're interested in translating Veyon into your local or another langua AccessControlPage Computer access control - + Grant access to every authenticated user (default) - + Test @@ -62,7 +60,7 @@ If you're interested in translating Veyon into your local or another langua Process access control rules - + User groups authorized for computer access @@ -80,21 +78,17 @@ If you're interested in translating Veyon into your local or another langua All groups Όλες οι ομάδες - - ... - ... - Access control rules - + Add access control rule - + Remove access control rule - + Move selected rule down @@ -134,30 +128,30 @@ If you're interested in translating Veyon into your local or another langua Enable usage of domain groups - + User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups - + AccessControlRuleEditDialog Edit access control rule - + General @@ -193,19 +187,19 @@ If you're interested in translating Veyon into your local or another langua Accessing computer is localhost - + Accessing user is logged on user - + Accessing user is already connected - + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Action @@ -221,7 +215,7 @@ If you're interested in translating Veyon into your local or another langua Ask logged on user for permission - + None (rule disabled) @@ -229,15 +223,15 @@ If you're interested in translating Veyon into your local or another langua Accessing user - + Accessing computer - + Local (logged on) user - + Local computer @@ -245,38 +239,38 @@ If you're interested in translating Veyon into your local or another langua Always process rule and ignore conditions - + No user logged on - + Accessing user has one or more groups in common with local (logged on) user - + Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + AccessControlRulesTestDialog Access control rules test - + Accessing user: - + Local computer: @@ -284,11 +278,11 @@ If you're interested in translating Veyon into your local or another langua Accessing computer: - + Please enter the following user and computer information in order to test the configured ruleset. - + Local user: @@ -300,19 +294,19 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario is allowed. - + The access in the given scenario is denied. - + The access in the given scenario needs permission of the logged on user. - + ERROR: Unknown action - + Test result @@ -320,103 +314,14 @@ If you're interested in translating Veyon into your local or another langua Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - - - - General - Γενικά - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - Εισαγωγή - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - - - - Public key file base directory - - - - Private key file base directory - - - - ... - ... - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - - - - Delete key - Διαγραφή κλειδιού - - - Import key - Εισαγωγή κλειδιού - - - Export key - Εξαγωγή κλειδιού - - - Set access group - + AuthKeysConfigurationWidget Authentication keys - + Introduction @@ -424,50 +329,50 @@ The public key is used on client computers to authenticate incoming connection r Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories - + Public key file base directory - + Private key file base directory - + Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair - + Delete key @@ -483,7 +388,7 @@ The public key is used on client computers to authenticate incoming connection r Set access group - + Key files (*.pem) @@ -491,15 +396,15 @@ The public key is used on client computers to authenticate incoming connection r Authentication key name - + Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? - + Please select a key to delete! @@ -507,7 +412,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -515,11 +420,11 @@ The public key is used on client computers to authenticate incoming connection r Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + @@ -530,234 +435,234 @@ The public key is used on client computers to authenticate incoming connection r Key name contains invalid characters! - + Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" - + Failed to create public or private key! - + Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. - + Failed to write output file. - + Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. - + File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. - + Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> - + Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key - + List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP - + This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -768,22 +673,22 @@ The public key is used on client computers to authenticate incoming connection r Type - + Access group - + Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -791,22 +696,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -818,22 +723,22 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - + Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -845,78 +750,78 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - + Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error - + Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -955,54 +860,54 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - + Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type - + Name @@ -1010,7 +915,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + MAC address @@ -1018,287 +923,287 @@ The public key is used on client computers to authenticate incoming connection r Specified object not found. - + File "%1" does not exist! - + Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None - + Computer - + Root - + Invalid - + Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected - + Establishing connection - + Computer offline or switched off - + Authentication failed or access denied - + Disconnected - + No user logged on - + Logged on user: %1 - + Location: %1 - + [no user] - + Veyon Server unreachable or not running - + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error - + Remote access @@ -1306,30 +1211,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1340,23 +1245,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1367,178 +1272,185 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - Διαχείριση υπολογιστή - Computer search Αναζήτηση υπολογιστή Add location - + Save computer/user list - + Select output filename - + CSV files (*.csv) - + File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + + + + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + DemoClient %1 Demo - + DemoConfigurationPage Demo server - + Tunables - + ms @@ -1546,15 +1458,11 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit - - - - Use multithreading (experimental) - + MB @@ -1570,7 +1478,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1589,74 +1497,74 @@ The public key is used on client computers to authenticate incoming connection r In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + DesktopAccessDialog Desktop access dialog - + Confirm desktop access - + Never for this session @@ -1668,18 +1576,18 @@ The public key is used on client computers to authenticate incoming connection r The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1687,35 +1595,35 @@ The public key is used on client computers to authenticate incoming connection r Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL - + New program - + New website - + @@ -1734,27 +1642,27 @@ The public key is used on client computers to authenticate incoming connection r Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + @@ -1765,43 +1673,43 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + @@ -1830,14 +1738,14 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories @@ -1845,103 +1753,103 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1970,10 +1878,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Φάκελος αρχείου καταγραφής - - ... - ... - Log level Λεπτομέρεια αρχείου καταγραφής @@ -2000,7 +1904,7 @@ The public key is used on client computers to authenticate incoming connection r Debug messages and everything else - + Limit log file size @@ -2008,19 +1912,19 @@ The public key is used on client computers to authenticate incoming connection r Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: @@ -2032,11 +1936,11 @@ The public key is used on client computers to authenticate incoming connection r The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. @@ -2048,7 +1952,7 @@ The public key is used on client computers to authenticate incoming connection r Could not remove all log files. - + MB @@ -2056,7 +1960,7 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x @@ -2068,147 +1972,138 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - - - - Authentication - - - - Method: - - - - Test - Δοκιμή + + + + HeadlessVncServer - Configure - + Headless VNC server + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members @@ -2216,7 +2111,7 @@ The public key is used on client computers to authenticate incoming connection r Group member attribute - + Group not found @@ -2224,51 +2119,51 @@ The public key is used on client computers to authenticate incoming connection r Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users @@ -2288,123 +2183,123 @@ The public key is used on client computers to authenticate incoming connection r computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2423,143 +2318,143 @@ The public key is used on client computers to authenticate incoming connection r Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2567,199 +2462,199 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None - + TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2767,42 +2662,42 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2810,135 +2705,88 @@ The public key is used on client computers to authenticate incoming connection r Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + @@ -2949,7 +2797,7 @@ The public key is used on client computers to authenticate incoming connection r Disable balloon tooltips - + Show icons only @@ -2960,11 +2808,11 @@ The public key is used on client computers to authenticate incoming connection r MainWindow MainWindow - + toolBar - + General @@ -2992,7 +2840,7 @@ The public key is used on client computers to authenticate incoming connection r L&oad settings from file - + Ctrl+O @@ -3004,11 +2852,11 @@ The public key is used on client computers to authenticate incoming connection r Configuration not writable - + Load settings from file - + Save settings to file @@ -3024,7 +2872,7 @@ The public key is used on client computers to authenticate incoming connection r Veyon Configurator - + Service @@ -3032,7 +2880,7 @@ The public key is used on client computers to authenticate incoming connection r Master - + Access control @@ -3052,15 +2900,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3068,7 +2916,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3076,11 +2924,11 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3088,75 +2936,71 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - - - - Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3165,29 +3009,25 @@ The public key is used on client computers to authenticate incoming connection r Directories Φάκελοι - - ... - ... - User configuration - + Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3195,7 +3035,7 @@ The public key is used on client computers to authenticate incoming connection r <no feature> - + Basic settings @@ -3207,7 +3047,7 @@ The public key is used on client computers to authenticate incoming connection r Enforce selected mode for client computers - + Hide local computer @@ -3215,11 +3055,11 @@ The public key is used on client computers to authenticate incoming connection r Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3227,11 +3067,11 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Thumbnail update interval - + ms @@ -3239,216 +3079,125 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Αυτόματα + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Δοκιμή - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - ms - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3459,15 +3208,15 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3475,18 +3224,18 @@ The public key is used on client computers to authenticate incoming connection r Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3494,34 +3243,34 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + PowerControlFeaturePlugin Power on - + Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3533,15 +3282,15 @@ The public key is used on client computers to authenticate incoming connection r Power down - + Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot @@ -3549,95 +3298,95 @@ The public key is used on client computers to authenticate incoming connection r Confirm power down - + Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + PowerDownTimeInputDialog Power down - + Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control @@ -3657,7 +3406,7 @@ Please save your work and close all programs. Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3668,18 +3417,18 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 - %3 Remote Access - + @@ -3750,14 +3499,14 @@ Please save your work and close all programs. Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3765,19 +3514,19 @@ Please save your work and close all programs. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3792,23 +3541,23 @@ Please save your work and close all programs. Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3819,7 +3568,7 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3827,7 +3576,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3838,19 +3587,19 @@ Please save your work and close all programs. Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3864,7 +3613,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3892,11 +3641,11 @@ Please save your work and close all programs. Screenshot - Στιγμιότυπο + Στιγμιότυπο Do you really want to delete all selected screenshots? - + @@ -3929,133 +3678,109 @@ Please save your work and close all programs. State: Κατάσταση: - - Network - Δίκτυο - - - Demo server port - - Enable firewall exception - + Allow connections from localhost only - - - - Internal VNC server port - + VNC server - + Plugin: - + Restart %1 Service - + All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running Εκτελείται - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - - - - Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server - + Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + @@ -4070,15 +3795,15 @@ Typically this is required to support terminal servers. Configure and control Veyon service - + Register Veyon Service - + Unregister Veyon Service - + Start Veyon Service @@ -4094,80 +3819,81 @@ Typically this is required to support terminal servers. Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! - + Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4181,22 +3907,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4207,7 +3933,7 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + @@ -4233,49 +3959,53 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + + + + Maximum CPU usage + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4290,46 +4020,46 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control - + VeyonCore [OK] - + [FAIL] - + Invalid command! - + Available commands: @@ -4337,83 +4067,83 @@ Typically this is required to support terminal servers. Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! - + Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4421,111 +4151,111 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_es_ES.ts b/translations/veyon_es_ES.ts index 3acac8574..96d6612db 100644 --- a/translations/veyon_es_ES.ts +++ b/translations/veyon_es_ES.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -84,10 +82,6 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla All groups Todos los grupos - - ... - ... - Access control rules Reglas de control de acceso @@ -327,98 +321,6 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla Métodos de autenticación - - AndroidPlatformConfigurationPage - - Android - Android - - - General - General - - - - AuthKeysConfigurationDialog - - Authentication keys - Claves de autenticación - - - Introduction - Introducción - - - Please perform the following steps to set up key file authentication: - Realice los siguientes pasos para configurar la autenticación de archivos de claves: - - - 1) Create a key pair on the master computer. - 1) Crea un par de llaves en la computadora maestra. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Establezca un grupo con acceso cuyos miembros deberían tener acceso a otras computadoras. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Exporte la clave pública e impórtela en todas las computadoras cliente con el mismo nombre. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Consulte el <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Manual de Administrador de Veyon</a> para obtener más información. - - - Key file directories - Directorios de claves - - - Public key file base directory - Directorio base para archivo de clave pública - - - Private key file base directory - Directorio base para archivo de clave privada - - - ... - ... - - - Available authentication keys - Claves de autenticación disponibles - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Un par de claves de autenticación consta de dos claves criptográficas acopladas, una privada y otra pública. -Una clave privada permite a los usuarios de la computadora maestra acceder a las computadoras cliente. -Es importante que solo los usuarios autorizados tengan acceso de lectura al archivo de clave privada. -La clave pública se usa en las computadoras cliente para autenticar la solicitud de conexión entrante. - - - Create key pair - Crear par de claves - - - Delete key - Borrar clave - - - Import key - Importar clave - - - Export key - Exportar clave - - - Set access group - Establecer el grupo de acceso - - AuthKeysConfigurationWidget @@ -1293,18 +1195,18 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu [no user] - + [ningún usuario] Veyon Server unreachable or not running - + Veyon Server es inaccesible o no se está ejecutando ComputerControlServer %1 Service %2 at %3:%4 -  Servicio %1 %2 en %3:%4 +  Servicio %1 %2 en %3:%4 Authentication error @@ -1398,10 +1300,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu ComputerSelectPanel - - Computer management - Gestión de equipo - Computer search Búsqueda de equipos @@ -1431,6 +1329,17 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu No se pudo escribir la lista de equipos y usuarios en %1. Por favor, compruebe los permisos de acceso al archivo. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1562,10 +1471,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Memory limit Límite de memoria - - Use multithreading (experimental) - Utilizar multithreading (experimental) - MB MB @@ -1980,10 +1885,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Log file directory Directorio de registro - - ... - ... - Log level Nivel de registro @@ -2080,21 +1981,12 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Write to logging system of operating system Escribir en el sistema de registro del sistema operativo + + + HeadlessVncServer - Authentication - Autenticación - - - Method: - Método: - - - Test - Comprobar - - - Configure - Configurar + Headless VNC server + Servidor VNC headless @@ -2882,53 +2774,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Enlace LDAP - - LicensingConfigurationPage - - Licensing - Licencias - - - Installed licenses - Licencias instaladas - - - Add new network range - Añadir nuevo rango de red - - - Remove selected network range - Eliminar el rango de red seleccionado - - - ID - ID - - - Valid until - Válido hasta - - - Licensee - Licencia - - - Information - Información - - - Installation ID - ID de instalación - - - Addons available for licensing - Complementos disponibles para licenciar - - - Addon - Complemento - - LinuxPlatformConfigurationPage @@ -3123,10 +2968,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Search users and computers Buscar usuarios y equipos - - Adjust optimal size - Ajustar el tamaño óptimo - Align computers to grid Alinear equipos a la rejilla @@ -3175,6 +3016,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Authentication Autenticación + + Adjust size of computer icons automatically + Ajustar el tamaño de los iconos de la computadora automáticamente + Slideshow Diapositivas @@ -3183,10 +3028,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Spotlight Foco - - Adjust size of computer icons automatically - - MasterConfigurationPage @@ -3194,10 +3035,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Directories Directorios - - ... - ... - User configuration Configuración de usuario @@ -3330,10 +3167,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Automatically select current location Seleccionar automáticamente la ubicación actual - - Automatically adjust computer thumbnail size - Ajustar automáticamente el tamaño de la miniatura del equipo - Automatically open computer select panel Abrir automáticamente el panel de selección de equipo @@ -3354,17 +3187,21 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Hide local session Ocultar sesión local + + Auto + Auto + Thumbnail aspect ratio Relación de aspecto de la miniatura - Auto - Auto + Automatically adjust computer icon size + Ajustar automáticamente el tamaño del icono de la computadora - Automatically adjust computer icon size - + Open feature windows on the same screen as the main window + Abrir ventanas de funciones en la misma pantalla que la ventana principal @@ -3382,97 +3219,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Este modo le permite monitorear todos los equipos en una o más ubicaciones. - - NetworkDiscoveryConfigurationPage - - Network discovery - Detección de redes - - - Mode - Modo - - - Scan network ranges - Analizar rangos de red - - - e.g. 192.168.1.0/24 - ej. 192.168.1.0/24 - - - Scan all subnets of computer - Analizar todas las subredes del equipo - - - Scan custom subnet - Analizar subred personalizada - - - Scan sessions on local computer - Analizar sesiones en un equipo local - - - Test - Comprobar - - - Network ranges - Rangos de red - - - Add new group - Añadir nuevo grupo - - - Remove selected group - Eliminar grupo seleccionado - - - Groups - Grupos - - - First address - Primera dirección - - - Last address - Última dirección - - - Add new network range - Añadir nuevo rango de red - - - Remove selected network range - Eliminar el rango de red seleccionado - - - Parallel scans - Análisis paralelos - - - Scan timeout - Tiempo de espera de análisis - - - ms - ms - - - Session scan limit - Límite de análisis de sesión - - - Options - Opciones - - - Reverse lookup discovered IP addresses to host names - Búsqueda inversa de direcciones IP descubiertas a nombres de host - - NetworkObjectTreeModel @@ -3710,7 +3456,7 @@ Por favor guarde su trabajo y cierre todos los programas. %1 - %2 - %3 Remote Access - + Acceso Remoto %1 - %2 - %3 @@ -3923,11 +3669,11 @@ Por favor guarde su trabajo y cierre todos los programas. Screenshot - Captura + Captura Do you really want to delete all selected screenshots? - + ¿Realmente desea eliminar todas las capturas de pantalla seleccionadas? @@ -3960,14 +3706,6 @@ Por favor guarde su trabajo y cierre todos los programas. State: Estado: - - Network - Red - - - Demo server port - Puerto de servidor demo - Enable firewall exception Habilitar excepción en el cortafuegos @@ -3976,10 +3714,6 @@ Por favor guarde su trabajo y cierre todos los programas. Allow connections from localhost only Solo permitir conexiones desde equipo local - - Internal VNC server port - Puerto del servidor VNC interno - VNC server Servidor VNC @@ -4000,14 +3734,6 @@ Por favor guarde su trabajo y cierre todos los programas. Running Funcionando - - Feature manager port - Puerto del administrador de funciones - - - Primary service port - Puerto de servicio principal - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4018,10 +3744,6 @@ Por lo general, esto es necesario para admitir servidores de terminales.Show notification on remote connection Mostrar notificación en conexión remota - - Multi session mode (for terminal and remote desktop servers) - Modo de sesión múltiple (para servidores de terminales y de escritorio remoto) - Show notification when an unauthorized access is blocked Mostrar notificación cuando un acceso no autorizado está bloqueado @@ -4173,10 +3895,6 @@ Por lo general, esto es necesario para admitir servidores de terminales. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - Añada computadoras haciendo clic con el botón central del ratón o haciendo clic en el primer botón a continuación. - Add selected computers Añadir las computadoras seleccionadas @@ -4201,6 +3919,11 @@ Por lo general, esto es necesario para admitir servidores de terminales.Please select at least one computer to remove. Seleccione al menos una computadora para eliminar. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4287,6 +4010,10 @@ Por lo general, esto es necesario para admitir servidores de terminales.Enable Desktop Duplication Engine on Windows 8 and newer Habilitar duplicación de escritorio en Windows 8 y versiones posteriores + + Maximum CPU usage + Uso máximo de CPU + UserConfig @@ -4560,4 +4287,4 @@ Por lo general, esto es necesario para admitir servidores de terminales.Veyon Master - + \ No newline at end of file diff --git a/translations/veyon_et.ts b/translations/veyon_et.ts index 431408771..84b2a87fb 100644 --- a/translations/veyon_et.ts +++ b/translations/veyon_et.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ If you're interested in translating Veyon into your local or another langua All groups Kõik grupid - - ... - ... - Access control rules Juurdepääsu reeglid @@ -325,98 +319,6 @@ If you're interested in translating Veyon into your local or another langua Autentimismeetod - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Üldine - - - - AuthKeysConfigurationDialog - - Authentication keys - Autentimisvõtmed - - - Introduction - Juhend - - - Please perform the following steps to set up key file authentication: - Võtmefaili autentimise seadistamiseks toimige järgmiselt: - - - 1) Create a key pair on the master computer. - 1) Looge põhiarvutis võtmepaar. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Määrake juurdepääsugrupp, mille liikmetel peaks olema juurdepääs teistele arvutitele. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Eksportige avalik võti ja importige see kõigisse samanimelistesse klientarvutitesse. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Lisateavet leiate <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon administraatori käsiraamatust</a>. - - - Key file directories - Võtmefailide kataloogid - - - Public key file base directory - Avaliku võtme failibaasi kataloog - - - Private key file base directory - Privaatvõtme failibaasi kataloog - - - ... - ... - - - Available authentication keys - Saadaval olevad autentimisvõtmed - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Autentimisvõtmete paar koosneb kahest ühendatud krüptovõtmest, privaatsest ja avalikust võtmest. -Privaatvõti võimaldab peaarvuti kasutajatel pääseda juurde klientarvutitele. -On oluline, et ainult volitatud kasutajatel oleks juurdepääs privaatvõtme failile. -Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu autentimiseks. - - - Create key pair - Loo võtmepaar - - - Delete key - Kustuta võti - - - Import key - Impordi võti - - - Export key - Ekspordi võti - - - Set access group - Määra juurdepääsugrupp - - AuthKeysConfigurationWidget @@ -1291,11 +1193,11 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten [no user] - + [ükski kasutaja] Veyon Server unreachable or not running - + Veyon Server pole kättesaadav või ei tööta @@ -1396,10 +1298,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten ComputerSelectPanel - - Computer management - Arvuti haldus - Computer search Arvuti otsing @@ -1429,6 +1327,17 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Arvutit ja kasutajate loendi %1 kirjutamine nurjus! Kontrollige failidele juurdepääsu õigusi. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1560,10 +1469,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Memory limit Mälupiirang - - Use multithreading (experimental) - Use multithreading (experimental) - MB MB @@ -1978,10 +1883,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Log file directory Logifailide kataloog - - ... - ... - Log level Logi tase @@ -2078,21 +1979,12 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Write to logging system of operating system Kirjutage operatsioonisüsteemi logimissüsteemi + + + HeadlessVncServer - Authentication - Autentimine - - - Method: - Meetod: - - - Test - Test - - - Configure - Seadistamine + Headless VNC server + @@ -2880,53 +2772,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten LDAP sidumine - - LicensingConfigurationPage - - Licensing - Litsenseerimine - - - Installed licenses - Installitud litsentsid - - - Add new network range - Lisa uus võrguvahemik - - - Remove selected network range - Eemalda valitud võrguvahemik - - - ID - ID - - - Valid until - Kehtiv kuni - - - Licensee - Licensee - - - Information - Info - - - Installation ID - Installitud ID - - - Addons available for licensing - Litsentsimiseks saadaval olevad lisad - - - Addon - Lisa - - LinuxPlatformConfigurationPage @@ -3121,10 +2966,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Search users and computers Otsige kasutajaid ja arvuteid - - Adjust optimal size - Reguleerige optimaalset suurust - Align computers to grid Joondage arvutid @@ -3173,6 +3014,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Authentication Autentimine + + Adjust size of computer icons automatically + Kohandage arvuti ikoonide suurust automaatselt + Slideshow Slaidiseanss @@ -3181,10 +3026,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Spotlight Tähelepanu keskpunktis - - Adjust size of computer icons automatically - - MasterConfigurationPage @@ -3192,10 +3033,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Directories Kataloogid - - ... - ... - User configuration Kasutaja konfiguratsioon @@ -3328,10 +3165,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Automatically select current location Valige praegune asukoht automaatselt - - Automatically adjust computer thumbnail size - Reguleerige arvuti pisipildi suurust automaatselt - Automatically open computer select panel Avage arvuti valimispaneel automaatselt @@ -3352,17 +3185,21 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Hide local session Peida kohalik seanss + + Auto + Auto + Thumbnail aspect ratio Pisipildi kuvasuhe - Auto - Auto + Automatically adjust computer icon size + Reguleerige arvuti ikooni suurust automaatselt - Automatically adjust computer icon size - + Open feature windows on the same screen as the main window + @@ -3380,97 +3217,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten See režiim võimaldab teil jälgida kõiki arvuteid ühes või mitmes kohas. - - NetworkDiscoveryConfigurationPage - - Network discovery - Võrgu avastamine - - - Mode - Režiim - - - Scan network ranges - Skannige võrgu vahemikke - - - e.g. 192.168.1.0/24 - Näiteks 192.168.1.0/24 - - - Scan all subnets of computer - Skaneeri kõiki arvuti alamvõrke - - - Scan custom subnet - Skaneeri kasutaja alamvõrku - - - Scan sessions on local computer - Skaneerige seansid kohalikus arvutis - - - Test - Test - - - Network ranges - Võrgu vahemikud - - - Add new group - Lisa uus grupp - - - Remove selected group - Eemalda valitud grupp - - - Groups - Grupid - - - First address - Esimene aadress - - - Last address - Viimane aadress - - - Add new network range - Lisa uus võrguvahemik - - - Remove selected network range - Eemalda valitud võrguvahemik - - - Parallel scans - Paralleelsed skaneerimised - - - Scan timeout - Skannimise ajalõpp - - - ms - ms - - - Session scan limit - Seansi skannimise limiit - - - Options - Valikud - - - Reverse lookup discovered IP addresses to host names - Pöördotsing avastas hostinimedele IP-aadressid - - NetworkObjectTreeModel @@ -3708,7 +3454,7 @@ Salvestage oma töö ja sulgege kõik programmid. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Kaugjuurdepääs @@ -3921,11 +3667,11 @@ Salvestage oma töö ja sulgege kõik programmid. Screenshot - Ekraanipilt + Ekraanipilt Do you really want to delete all selected screenshots? - + Kas soovite tõesti kõik valitud ekraanipildid kustutada? @@ -3958,14 +3704,6 @@ Salvestage oma töö ja sulgege kõik programmid. State: Seisund: - - Network - Võrk - - - Demo server port - Demo serveri port - Enable firewall exception Luba tulemüüri erisused @@ -3974,10 +3712,6 @@ Salvestage oma töö ja sulgege kõik programmid. Allow connections from localhost only Luba ühendused ainult localhostilt - - Internal VNC server port - Sisemise VNC serveri port - VNC server VNC server @@ -3998,14 +3732,6 @@ Salvestage oma töö ja sulgege kõik programmid. Running Käib - - Feature manager port - Funktsioonihalduri port - - - Primary service port - Esmane teenuse port - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4016,10 +3742,6 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Show notification on remote connection Kuva teated kaugühenduse korral - - Multi session mode (for terminal and remote desktop servers) - Mitme seansi režiim (terminali ja kaugtöölaua serverite jaoks) - Show notification when an unauthorized access is blocked Kuva teade, kui volitamata juurdepääs on blokeeritud @@ -4171,10 +3893,6 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - Arvutite lisamiseks klõpsake hiire keskmise nupuga või klõpsake allolevat esimest nuppu. - Add selected computers Lisage valitud arvutid @@ -4199,6 +3917,11 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Please select at least one computer to remove. Valige eemaldamiseks vähemalt üks arvuti. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4285,6 +4008,10 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Enable Desktop Duplication Engine on Windows 8 and newer Luba töölaua laiendamismootor Windows 8 ja uuemates versioonides + + Maximum CPU usage + + UserConfig @@ -4558,4 +4285,4 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Veyon Master - + \ No newline at end of file diff --git a/translations/veyon_fa.ts b/translations/veyon_fa.ts index cb40ae7c9..5b415e843 100644 --- a/translations/veyon_fa.ts +++ b/translations/veyon_fa.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -81,10 +79,6 @@ If you're interested in translating Veyon into your local or another langua All groups تمام گروه ها - - ... - ... - Access control rules قوانین کنترل دسترسی @@ -151,7 +145,7 @@ If you're interested in translating Veyon into your local or another langua Restrict access to members of specific user groups - + @@ -258,15 +252,15 @@ If you're interested in translating Veyon into your local or another langua Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + @@ -321,96 +315,7 @@ If you're interested in translating Veyon into your local or another langua Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - - - - General - عمومی - - - - AuthKeysConfigurationDialog - - Authentication keys - کلیدهای احراز هویت - - - Introduction - معرفی - - - Please perform the following steps to set up key file authentication: - لطفا مراحل زیر را برای راه اندازی احراز هویت فایل کلید انجام دهید: - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - دایرکتوری فایل های کلیدها - - - Public key file base directory - دایرکتوری پایگاه داده کلید عمومی - - - Private key file base directory - فایل پایگاه داده فایل خصوصی - - - ... - ... - - - Available authentication keys - کلیدهای تأیید موجود - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - ایجاد جفت کلید - - - Delete key - حذف کلید - - - Import key - وارد کردن کلید - - - Export key - صادرکردن کلید - - - Set access group - تعیین گروه دسترسی + @@ -429,19 +334,19 @@ The public key is used on client computers to authenticate incoming connection r 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -464,7 +369,7 @@ The public key is used on client computers to authenticate incoming connection r A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair @@ -527,230 +432,230 @@ The public key is used on client computers to authenticate incoming connection r AuthKeysManager Please check your permissions. - + Key name contains invalid characters! - + Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" - + Failed to create public or private key! - + Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. - + Failed to write output file. - + Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. - + File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. - + Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> - + Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key - + List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP - + This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -758,33 +663,33 @@ The public key is used on client computers to authenticate incoming connection r Key file - + AuthKeysTableModel Name - + Type - + Access group - + Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -792,22 +697,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -823,18 +728,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -850,14 +755,14 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -865,18 +770,18 @@ The public key is used on client computers to authenticate incoming connection r Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error @@ -884,22 +789,22 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + @@ -910,14 +815,14 @@ The public key is used on client computers to authenticate incoming connection r Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -928,302 +833,302 @@ The public key is used on client computers to authenticate incoming connection r BuiltinDirectoryConfigurationPage Computers - + Name - + Host address/IP - + MAC address - + Add new computer - + Remove selected computer - + New computer - + Builtin directory - + Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type - + Name - + Host address - + MAC address - + Specified object not found. - + File "%1" does not exist! - + Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None - + Computer - + Root - + Invalid - + Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + @@ -1280,15 +1185,15 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + [no user] - + Veyon Server unreachable or not running - + @@ -1303,34 +1208,34 @@ The public key is used on client computers to authenticate incoming connection r Remote access - + User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1349,57 +1254,53 @@ The public key is used on client computers to authenticate incoming connection r Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + ComputerMonitoring Computers - + Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - مدیریت کامپیوتر - Computer search جستجوی رایانه Add location - + Save computer/user list @@ -1422,6 +1323,17 @@ The public key is used on client computers to authenticate incoming connection r لیست کامپیوتر و کاربران را به٪ 1 نمی توان نوشت! لطفا مجوز دسترسی به فایل را بررسی کنید. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1454,7 +1366,7 @@ The public key is used on client computers to authenticate incoming connection r Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. @@ -1505,23 +1417,23 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1539,7 +1451,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms @@ -1553,10 +1465,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit محدودیت حافظه - - Use multithreading (experimental) - استفاده از Multithreading (تجربی) - MB مگابایت @@ -1571,7 +1479,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1594,59 +1502,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1676,47 +1584,47 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name - + Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL - + New program - + New website - + @@ -1743,66 +1651,66 @@ The public key is used on client computers to authenticate incoming connection r Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + @@ -1838,7 +1746,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferConfigurationPage File transfer - + Directories @@ -1846,103 +1754,103 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1971,10 +1879,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory دایرکتوری فایل ثبت فعالیت - - ... - ... - Log level سطح ورود @@ -2017,39 +1921,39 @@ The public key is used on client computers to authenticate incoming connection r Network object directory - + Backend: - + Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB @@ -2057,362 +1961,353 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x - + seconds - + Write to logging system of operating system - - - - Authentication - - - - Method: - - - - Test - تست + + + + HeadlessVncServer - Configure - + Headless VNC server + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users - + user groups - + computers - + computer groups - + computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + LdapConfigurationPage Basic settings - + General @@ -2420,147 +2315,147 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2568,199 +2463,199 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None - + TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2768,42 +2663,42 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2811,161 +2706,114 @@ The public key is used on client computers to authenticate incoming connection r Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + MainToolBar Configuration - + Disable balloon tooltips - + Show icons only - + MainWindow MainWindow - + toolBar - + General @@ -2973,71 +2821,71 @@ The public key is used on client computers to authenticate incoming connection r &File - + &Help - + &Quit - + Ctrl+Q - + Ctrl+S - + L&oad settings from file - + Ctrl+O - + About Qt - + Configuration not writable - + Load settings from file - + Save settings to file - + Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service - + Master - + Access control - + About Veyon @@ -3045,7 +2893,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3053,15 +2901,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3069,7 +2917,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3077,11 +2925,11 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3089,19 +2937,15 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - - - - Adjust optimal size - + Align computers to grid - + %1 Configurator @@ -3109,55 +2953,55 @@ The public key is used on client computers to authenticate incoming connection r Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3166,29 +3010,25 @@ The public key is used on client computers to authenticate incoming connection r Directories فهرست راهنما - - ... - ... - User configuration پیکربندی کاربران Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3196,19 +3036,19 @@ The public key is used on client computers to authenticate incoming connection r <no feature> - + Basic settings - + Behaviour - + Enforce selected mode for client computers - + Hide local computer @@ -3216,11 +3056,11 @@ The public key is used on client computers to authenticate incoming connection r Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3228,11 +3068,11 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Thumbnail update interval - + ms @@ -3240,110 +3080,110 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + - Thumbnail aspect ratio - + Auto + - Auto - + Thumbnail aspect ratio + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + MonitoringMode Monitoring - + Builtin monitoring mode @@ -3351,105 +3191,14 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - تست - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - ام اس - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3460,15 +3209,15 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3476,61 +3225,61 @@ The public key is used on client computers to authenticate incoming connection r Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name - + Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + PowerControlFeaturePlugin Power on - + Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot - + Click this button to reboot all computers. - + Power down @@ -3538,77 +3287,77 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot - + Confirm power down - + Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3619,42 +3368,42 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control - + Open a remote control window for a computer. - + Remote access - + Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: @@ -3669,18 +3418,18 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 - %3 Remote Access - + @@ -3691,39 +3440,39 @@ Please save your work and close all programs. Remote control - + Send shortcut - + Fullscreen - + Window - + Ctrl+Alt+Del - + Ctrl+Esc - + Alt+Tab - + Alt+F4 - + Win+Tab - + Win @@ -3735,7 +3484,7 @@ Please save your work and close all programs. Alt+Ctrl+F1 - + Connecting %1 @@ -3747,38 +3496,38 @@ Please save your work and close all programs. Screenshot - + Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3793,53 +3542,53 @@ Please save your work and close all programs. Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot - + Could not open screenshot file %1 for writing. - + ScreenshotFeaturePlugin Screenshot - + Use this function to take a screenshot of selected computers. - + Screenshots taken @@ -3893,11 +3642,11 @@ Please save your work and close all programs. Screenshot - + Do you really want to delete all selected screenshots? - + @@ -3908,11 +3657,11 @@ Please save your work and close all programs. Autostart - + Hide tray icon - + Start service @@ -3928,15 +3677,7 @@ Please save your work and close all programs. State: - - - - Network - شبکه - - - Demo server port - + Enable firewall exception @@ -3946,10 +3687,6 @@ Please save your work and close all programs. Allow connections from localhost only اجازه ارتباط فقط برای کامپیوتر محلی - - Internal VNC server port - پورت سرور VNC داخلی - VNC server سرور vnc @@ -3970,62 +3707,50 @@ Please save your work and close all programs. Running در حال اجرا - - Feature manager port - پورت مدیریت ویژگی - - - Primary service port - پورت خدمات اصلی - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - - - - Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4033,30 +3758,30 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + @@ -4106,69 +3831,70 @@ Typically this is required to support terminal servers. ShellCommandLinePlugin Run command file - + File "%1" does not exist! - + Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4182,22 +3908,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4246,15 +3972,19 @@ Typically this is required to support terminal servers. Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + + + + Maximum CPU usage + @@ -4272,11 +4002,11 @@ Typically this is required to support terminal servers. UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4291,27 +4021,27 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4354,46 +4084,46 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + @@ -4414,7 +4144,7 @@ Typically this is required to support terminal servers. WindowsPlatformConfigurationPage Windows - + General @@ -4422,51 +4152,51 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4480,31 +4210,31 @@ Typically this is required to support terminal servers. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + @@ -4526,7 +4256,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_fr.ts b/translations/veyon_fr.ts index a85663183..4919aedca 100644 --- a/translations/veyon_fr.ts +++ b/translations/veyon_fr.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, All groups Tous les groupes - - ... - ... - Access control rules Règles du contrôle d'accès @@ -325,98 +319,6 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Méthode d'authentification - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Général - - - - AuthKeysConfigurationDialog - - Authentication keys - Clés d'authentification - - - Introduction - Introduction - - - Please perform the following steps to set up key file authentication: - Veuillez suivre les indications suivantes pour configurer la clé d'authentification: - - - 1) Create a key pair on the master computer. - 1) Créer une paire de clé sur l'ordinateur maître. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Définissez un groupe d'accès dont les membres sont autorisés pour accéder aux autres ordinateurs. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Exporter la clé publique et importer la avec le même nom sur tous les ordinateurs clients . - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Veuillez vous référer au <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Manuel Administrateur Veyon</a> pour plus d'informations. - - - Key file directories - Répertoires de fichier clé - - - Public key file base directory - Répertoire de base des clés d'accès publiques - - - Private key file base directory - Répertoire de base des clés d'accès privées - - - ... - ... - - - Available authentication keys - Clés d'authentification disponibles - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Une paire de clé d'authentification, consiste en deux clés cryptographiques couplées, une clé privée et une autre publique. -La clé privée permet aux utilisateurs de l'ordinateur maitre d'accéder aux ordinateurs clients. -Il est important que seuls les utilisateurs autorisés aient l'accès en lecture sur la clé privée. -La clé publique est utilisée sur les ordinateurs clients pour l'authentification des demandes de connexions. - - - Create key pair - Créer paire de clé - - - Delete key - Supprimer clé - - - Import key - Importer clé - - - Export key - Exporter clé - - - Set access group - Établir groupe d'accès - - AuthKeysConfigurationWidget @@ -1291,11 +1193,11 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif [no user] - + [aucun utilisateur] Veyon Server unreachable or not running - + Serveur Veyon inaccessible ou ne fonctionne pas @@ -1396,10 +1298,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif ComputerSelectPanel - - Computer management - Gestion ordinateur - Computer search Recherche d'ordinateur @@ -1429,6 +1327,17 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Impossible d'écrire la liste des ordinateurs et des utilisateurs dans %1! Vérifiez le fichier des permissions d'accès. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1560,10 +1469,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Memory limit Limite de mémoire - - Use multithreading (experimental) - Utiliser le multithreading (expérimental) - MB MB @@ -1978,10 +1883,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Log file directory Répertoire du fichier de journalisation - - ... - ... - Log level Niveau de journalisation @@ -2078,21 +1979,12 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Write to logging system of operating system Écrire dans le système de journalisation du système d'exploitation + + + HeadlessVncServer - Authentication - Authentification - - - Method: - Méthode: - - - Test - Test - - - Configure - Configurer + Headless VNC server + Serveur VNC sans périphériques @@ -2880,53 +2772,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Liaison LDAP - - LicensingConfigurationPage - - Licensing - Licence - - - Installed licenses - Licences installées - - - Add new network range - Ajouter une nouvelle plage réseau - - - Remove selected network range - Supprimer la plage réseau sélectionnée - - - ID - ID - - - Valid until - Valable jusqu'à - - - Licensee - Licencié - - - Information - Information - - - Installation ID - Identité installation - - - Addons available for licensing - Extensions disponibles pour licence - - - Addon - Extension - - LinuxPlatformConfigurationPage @@ -3121,10 +2966,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Search users and computers Chercher des utilisateurs et des ordinateurs - - Adjust optimal size - Ajuster la taille optimale - Align computers to grid Aligner les ordinateurs sur la grille @@ -3173,6 +3014,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Authentication Authentification + + Adjust size of computer icons automatically + Ajuster automatiquement la taille des icônes d'ordinateur + Slideshow Diaporama @@ -3181,10 +3026,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Spotlight Focalisation - - Adjust size of computer icons automatically - - MasterConfigurationPage @@ -3192,10 +3033,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Directories Répertoires - - ... - ... - User configuration Configuration utilisateur @@ -3328,10 +3165,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Automatically select current location Sélectionner automatiquement la localisation courante - - Automatically adjust computer thumbnail size - Ajuster automatiquement la taille des prévues ordinateurs - Automatically open computer select panel Ouvrir automatiquement le panneau de sélection ordinateur @@ -3352,17 +3185,21 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Hide local session Masquer la session locale + + Auto + Auto + Thumbnail aspect ratio Rapport hauteur / largeur de la miniature - Auto - Auto + Automatically adjust computer icon size + Ajuster automatiquement la taille de l'icône de l'ordinateur - Automatically adjust computer icon size - + Open feature windows on the same screen as the main window + Ouvrir les fenêtres de fonctionnalités sur le même écran que la fenêtre principale @@ -3380,97 +3217,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Ce mode vous permet de surveiller tous les ordinateurs d'un ou de plusieurs emplacements. - - NetworkDiscoveryConfigurationPage - - Network discovery - Découverte du réseau - - - Mode - Mode - - - Scan network ranges - Scanner des plages réseau - - - e.g. 192.168.1.0/24 - ex: 192.168.1.0/24 - - - Scan all subnets of computer - Scanner tous les sous-réseaux de l'ordinateur - - - Scan custom subnet - Scanner un sous-réseau personnalisé - - - Scan sessions on local computer - Scanner les sessions sur l'ordinateur local - - - Test - Test - - - Network ranges - Plages réseau - - - Add new group - Ajouter un nouveau groupe - - - Remove selected group - Supprimer le groupe sélectionné - - - Groups - Groupes - - - First address - Première adresse - - - Last address - Dernière adresse - - - Add new network range - Ajouter une nouvelle plage réseau - - - Remove selected network range - Supprimer la plage réseau sélectionnée - - - Parallel scans - Scans parallèles - - - Scan timeout - Analyse temps mort - - - ms - ms - - - Session scan limit - Limite d'analyse de session - - - Options - Options - - - Reverse lookup discovered IP addresses to host names - Recherche inversée des adresses IP découvertes en noms d'hôte - - NetworkObjectTreeModel @@ -3708,7 +3454,7 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Accès à distance @@ -3921,11 +3667,11 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Screenshot - Capture d'écran + Capture d'écran Do you really want to delete all selected screenshots? - + Voulez-vous vraiment supprimer toutes les captures d'écran sélectionnées? @@ -3958,14 +3704,6 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. State: État : - - Network - Réseau - - - Demo server port - Port du serveur de démonstration - Enable firewall exception Autoriser une exception pour le pare-feu @@ -3974,10 +3712,6 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Allow connections from localhost only Autoriser les connexions seulement à partir de l'hôte local - - Internal VNC server port - Port du serveur interne VNC - VNC server Serveur VNC @@ -3998,14 +3732,6 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Running En cours d’exécution - - Feature manager port - Port du gestionnaire de fonction - - - Primary service port - Port de service primaire - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4016,10 +3742,6 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Show notification on remote connection Afficher la notification sur la connexion à distance - - Multi session mode (for terminal and remote desktop servers) - Mode multi-session (pour les serveurs de bureau terminaux et distants) - Show notification when an unauthorized access is blocked Afficher une notification quand un accès non autorisé est bloqué @@ -4171,10 +3893,6 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - Ajoutez des ordinateurs en cliquant avec le bouton central de la souris ou en cliquant sur le premier bouton ci-dessous. - Add selected computers Ajouter les ordinateurs sélectionnés @@ -4199,6 +3917,11 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Please select at least one computer to remove. Veuillez sélectionner au moins un ordinateur à supprimer. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4285,6 +4008,10 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Enable Desktop Duplication Engine on Windows 8 and newer Activer le processus de duplication du bureau sur Windows 8 ou supérieur + + Maximum CPU usage + Utilisation maximale du processeur + UserConfig @@ -4558,4 +4285,4 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Veyon Maître - + \ No newline at end of file diff --git a/translations/veyon_he.ts b/translations/veyon_he.ts index 397cc0489..0d9fdff75 100644 --- a/translations/veyon_he.ts +++ b/translations/veyon_he.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -80,10 +78,6 @@ If you're interested in translating Veyon into your local or another langua All groups כל הקבוצות - - ... - ... - Access control rules כללי בקרת גישה @@ -138,19 +132,19 @@ If you're interested in translating Veyon into your local or another langua User groups backend: - + שרת קבוצות משתמשים: Missing user groups backend - + חסר שרת קבוצות משתמשים No default user groups plugin was found. Please check your installation! - + לא נמצא פלאגין של קבוצות משתמשים. בדוק את ההתקנה שלך! Restrict access to members of specific user groups - + הגבל הרשאה לחברי קבוצה מסוימת @@ -181,31 +175,31 @@ If you're interested in translating Veyon into your local or another langua Invert all conditions ("is/has" interpreted as "is/has not") - + הפוך את כל התנאים (מקיים\קיים הופך ללא מקיים\קיים) Conditions - + תנאים is member of group - + חבר קבוצה Accessing computer is localhost - + המחשב הניגש הוא המקומי Accessing user is logged on user - + משתמש ניגש מחובר כמשתמש Accessing user is already connected - + משתמש ניגש כבר מחובר If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + אם יותר מאחד התנאים מופעל, כל אחד מהתנאים צריך להתקיים על מנת לקיים את התנאי ("וגם" לוגי). אם רק אחד מהתנאים צריך להתקיים ("או" לוגי), יש ליצור מספר כללי גישה. Action @@ -225,19 +219,19 @@ If you're interested in translating Veyon into your local or another langua None (rule disabled) - + אין (כלל מושבת) Accessing user - + משתמש ניגש Accessing computer - + מחשב ניגש Local (logged on) user - + משתמש מקומי (מחובר) Local computer @@ -245,7 +239,7 @@ If you're interested in translating Veyon into your local or another langua Always process rule and ignore conditions - + תמיד הפעל את החור והתעלם מהתנאים No user logged on @@ -253,30 +247,30 @@ If you're interested in translating Veyon into your local or another langua Accessing user has one or more groups in common with local (logged on) user - + משתמש ניגש בעל אחת או יותר קבוצות במשותף עם המשתמש המקומי (המחובר) Accessing computer and local computer are at the same location - + מחשב ניגש ומחשב מקומי נמצאים באותו מיקום is located at - + ממוקם ב Authenticated via method - + התחברות באמצעות שיטה AccessControlRulesTestDialog Access control rules test - + בדיקת כללי גישה Accessing user: - + משתמש ניגש: Local computer: @@ -288,7 +282,7 @@ If you're interested in translating Veyon into your local or another langua Please enter the following user and computer information in order to test the configured ruleset. - + אנא הזן את המשתמש הבא ואת המידע אודות המחשב על מנת לבדוק את קבוצת החוקים. Local user: @@ -300,396 +294,310 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario is allowed. - + הגישה במקרה הניתן מאופשרת. The access in the given scenario is denied. - + הגישה במקרה הניתן נדחית. The access in the given scenario needs permission of the logged on user. - + הגישה במקרה הניתן דורשת הרשאה מצד המשתמש המחובר. ERROR: Unknown action - + שגיאה: פעולה לא ידועה Test result - + תוצאות בדיקה Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - אנדרואיד - - - General - כללי - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - - - - Public key file base directory - - - - Private key file base directory - - - - ... - ... - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - - - - Delete key - - - - Import key - - - - Export key - - - - Set access group - + שיטת התחברות AuthKeysConfigurationWidget Authentication keys - + מפתחות התחברות Introduction - + מבוא Please perform the following steps to set up key file authentication: - + יש לעקוב אחר הלשבים הבאים על מנת להגדיר התחברות באמצעות מפתחות: 1) Create a key pair on the master computer. - + 1) צור זוג מפתחות על מחשב המאסטר 2) Set an access group whose members should be allowed to access other computers. - + 2) הגדר קבוצת גישה אשר חבריה אמורים לגשת למחשבים אחרים. 3) Export the public key and import it on all client computers with the same name. - + 3) ייצא את המפתח הפומבי וייבא אותו בכל אחד ממחשבי הלקוחות עם שם זהה. Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + אנה פנה אל <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">המדריך למנהל של Veyon</a> למידע נוסף. Key file directories - + נתיבים של קבצי מפתחות Public key file base directory - + נתיב בסיס למפתחות פומביים Private key file base directory - + נתיב בסיס למפתחות פרטיים Available authentication keys - + מפתחות התחברות זמינים An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + זוג מפתחות אימות כולל זוג מפתחות קריפטוגרפיים, מפתח פרטי ומפתח פומבי. +מפתח פרט מאפשר למשתמשים על מחשב המאסטר לגשת לכל שאר מחשבי הלקוח. +זה חשוב שרק מחשבים מורשים יוכלו לקרוא את המפתח הפרטי. +המפתח הפומבי משמש במחשבי לקוח על מנת שיוכלו לאמת בקשות לחיבורים נכנסים. Create key pair - + יצירת זוג מפתחות Delete key - + מחק מפתח Import key - + ייבא מפתח Export key - + ייצא מפתח Set access group - + הגדר קבוצת גישה Key files (*.pem) - + קבצי מפתחות (*.pem) Authentication key name - + שם מפתח אימות Please enter the name of the user group or role for which to create an authentication key pair: - + אנא הכניסו את שם קבוצת המשתמשים או התפקיד עבורם יש ליצור את זוג המפתחות Do you really want to delete authentication key "%1/%2"? - + אתה בטוח שברצונך למחוק את המפתח "%1/%2"? Please select a key to delete! - + נא לבחור מפתח למחיקה! Please enter the name of the user group or role for which to import the authentication key: - + נא להזין את שם קבוצת המשתמשים או התפקיד עבורם יש לייבא את מפתח האימות: Please select a key to export! - + יש לבחור מפתח לייצוא! Please select a user group which to grant access to key "%1": - + נא לבחור קבוצת משתמשים עבורה יש לתת גישה למפתח "%1": Please select a key which to set the access group for! - + נא לבחור מפתח עבורו יש להגדיר את קבוצת הגישה! AuthKeysManager Please check your permissions. - + בדוק את ההרשאות שלך. Key name contains invalid characters! - + שם מפתח כולל תווים לא חוקיים! Invalid key type specified! Please specify "%1" or "%2". - + סוג מפתח לא חוקי נבחר! נא לבחור "%1" או "%2". Specified key does not exist! Please use the "list" command to list all installed keys. - + המפתח שנבחר אינו קיים. אנא השתמש בפקודה "list" על מנת למנות את כל המפתחות המותקנים. One or more key files already exist! Please delete them using the "delete" command. - + אחד או יותר מהמפתחות כבר קיימים! השתמשו בפקודה "delete" ומחקו אותם ראשית. Creating new key pair for "%1" - + יוצר מפתח חדש עבור "%1" Failed to create public or private key! - + לא ניתן היה ליצור מפתח פומבי או פרטי! Newly created key pair has been saved to "%1" and "%2". - + זוג המפתחות שנוצרו נשמרו ל"%1" ול""%2". Could not remove key file "%1"! - + לא ניתן היה להסיר את קובץ המפתח "%1"! Could not remove key file directory "%1"! - + לא ניתן היה להסיר את נתיב המפתחות "%1"! Failed to create directory for output file. - + לא ניתן היה ליצור נתיב לקובץ הפלט. File "%1" already exists. - + הקובץ "%1" כבר קיים. Failed to write output file. - + לא ניתן היה לכתוב את קובץ הפלט. Key "%1/%2" has been exported to "%3" successfully. - + המפתח "%1/%2" יוצא בהצלחה ל"%3". Failed read input file. - + לא ניתן היה לקלוט את קובץ הקלט File "%1" does not contain a valid private key! - + הקובץ "%1" לא כולל מפתח פרטי תקין! File "%1" does not contain a valid public key! - + הקובץ "%1" לא כולל מפתח פומבי תקין! Failed to create directory for key file. - + לא ניתן היה ליצור נתיב לקובץ המפתח. Failed to write key file "%1". - + כתיבת קובץ המפתח "%1" נכשלה. Failed to set permissions for key file "%1"! - + הגדרת ההרשאות לקובץ המפתח "%1" נכשלה. Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + המפתח "%1\%2" יובר בהצלחה. יש לבדוק את הרשאות הקובץ "%3" על מנת למנוע גישה לא מורשית. Failed to convert private key to public key - + לא ניתן היה להמיר מפתח פרטי למפתח פומבי. Failed to create directory for private key file "%1". - + יצירת הנתיב למפתח הפרטי "%1" נכשלה. Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> - + Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key - + List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP @@ -697,67 +605,67 @@ The public key is used on client computers to authenticate incoming connection r This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -776,14 +684,14 @@ The public key is used on client computers to authenticate incoming connection r Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -791,22 +699,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -822,18 +730,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -849,33 +757,33 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error @@ -883,40 +791,40 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -955,31 +863,31 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - + Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + @@ -998,7 +906,7 @@ The public key is used on client computers to authenticate incoming connection r Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1010,7 +918,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + MAC address @@ -1018,31 +926,31 @@ The public key is used on client computers to authenticate incoming connection r Specified object not found. - + File "%1" does not exist! - + Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None - + Computer @@ -1050,220 +958,220 @@ The public key is used on client computers to authenticate incoming connection r Root - + Invalid - + Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected - + Establishing connection - + Computer offline or switched off - + Authentication failed or access denied - + Disconnected @@ -1279,22 +1187,22 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + [no user] - + Veyon Server unreachable or not running - + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1306,30 +1214,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1340,23 +1248,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1371,34 +1279,30 @@ The public key is used on client computers to authenticate incoming connection r Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - - Computer search - + Add location - + Save computer/user list @@ -1406,7 +1310,7 @@ The public key is used on client computers to authenticate incoming connection r Select output filename - + CSV files (*.csv) @@ -1414,120 +1318,131 @@ The public key is used on client computers to authenticate incoming connection r File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + + + + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + DemoClient %1 Demo - + @@ -1538,39 +1453,35 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms - + Key frame interval - + Memory limit הגבלת זיכרון - - Use multithreading (experimental) - - MB - + Update interval - + s - + Slow down thumbnail updates while demo is running - + @@ -1585,67 +1496,67 @@ The public key is used on client computers to authenticate incoming connection r Give a demonstration by screen broadcasting - + In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1661,26 +1572,26 @@ The public key is used on client computers to authenticate incoming connection r Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1692,31 +1603,31 @@ The public key is used on client computers to authenticate incoming connection r Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL - + New program - + New website - + @@ -1731,96 +1642,96 @@ The public key is used on client computers to authenticate incoming connection r Click this button to open a website on all computers. - + Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: - + Password: @@ -1831,118 +1742,118 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories - + Destination directory - + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1961,27 +1872,23 @@ The public key is used on client computers to authenticate incoming connection r Veyon - + Logging - + Log file directory - - - - ... - ... + Log level - + Nothing - + Only critical messages @@ -1989,79 +1896,79 @@ The public key is used on client computers to authenticate incoming connection r Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB - + Rotate log files - + x - + seconds @@ -2069,207 +1976,198 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - - - - Authentication - - - - Method: - - - - Test - בדיקה + + + + HeadlessVncServer - Configure - + Headless VNC server + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users @@ -2289,11 +2187,11 @@ The public key is used on client computers to authenticate incoming connection r computer containers - + groups of user - + User not found @@ -2301,111 +2199,111 @@ The public key is used on client computers to authenticate incoming connection r Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2420,107 +2318,107 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings @@ -2528,39 +2426,39 @@ The public key is used on client computers to authenticate incoming connection r Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2568,15 +2466,15 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name @@ -2584,83 +2482,83 @@ The public key is used on client computers to authenticate incoming connection r Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None - + TLS @@ -2672,95 +2570,95 @@ The public key is used on client computers to authenticate incoming connection r e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2768,178 +2666,131 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command - + Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + אימות משתמש Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + @@ -2950,11 +2801,11 @@ The public key is used on client computers to authenticate incoming connection r Disable balloon tooltips - + Show icons only - + @@ -2965,7 +2816,7 @@ The public key is used on client computers to authenticate incoming connection r toolBar - + General @@ -2973,39 +2824,39 @@ The public key is used on client computers to authenticate incoming connection r &File - + &Help - + &Quit - + Ctrl+Q - + Ctrl+S - + L&oad settings from file - + Ctrl+O - + About Qt - + Configuration not writable - + Load settings from file @@ -3017,27 +2868,27 @@ The public key is used on client computers to authenticate incoming connection r Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service - + Master - + Access control - + About Veyon @@ -3045,7 +2896,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3053,15 +2904,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3069,7 +2920,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3077,11 +2928,11 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3089,86 +2940,78 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers חפש משתמשים ומחשבים - - Adjust optimal size - - Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + MasterConfigurationPage Directories - - - - ... - ... + User configuration @@ -3176,19 +3019,19 @@ The public key is used on client computers to authenticate incoming connection r Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3196,7 +3039,7 @@ The public key is used on client computers to authenticate incoming connection r <no feature> - + Basic settings @@ -3204,23 +3047,23 @@ The public key is used on client computers to authenticate incoming connection r Behaviour - + Enforce selected mode for client computers - + Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3228,228 +3071,137 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Thumbnail update interval - + ms - + Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + - Thumbnail aspect ratio - + Auto + - Auto - + Thumbnail aspect ratio + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - בדיקה - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3460,34 +3212,34 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3495,23 +3247,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3522,7 +3274,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3530,7 +3282,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to reboot all computers. - + Power down @@ -3538,11 +3290,11 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot @@ -3554,61 +3306,61 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3619,26 +3371,26 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control @@ -3646,7 +3398,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Remote access @@ -3654,33 +3406,33 @@ Please save your work and close all programs. Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command - + RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 - %3 Remote Access - + @@ -3695,7 +3447,7 @@ Please save your work and close all programs. Send shortcut - + Fullscreen @@ -3727,11 +3479,11 @@ Please save your work and close all programs. Win - + Menu - + Alt+Ctrl+F1 @@ -3739,7 +3491,7 @@ Please save your work and close all programs. Connecting %1 - + Connected. @@ -3751,76 +3503,76 @@ Please save your work and close all programs. Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + לדוגמה VLC ScreenLockFeaturePlugin Lock - + נעילה Unlock - + שחרור Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + נעל מכשירי קלט Unlock input devices - + שחרר מכשירי קלט To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + לא ידוע Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3828,7 +3580,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3839,19 +3591,19 @@ Please save your work and close all programs. Use this function to take a screenshot of selected computers. - + Screenshots taken - + צילום מסך בוצע Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3865,7 +3617,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3885,7 +3637,7 @@ Please save your work and close all programs. Show - + הצג Delete @@ -3893,11 +3645,11 @@ Please save your work and close all programs. Screenshot - צילום מסך + צילום מסך Do you really want to delete all selected screenshots? - + @@ -3908,11 +3660,11 @@ Please save your work and close all programs. Autostart - + הפעלה אוטומטית Hide tray icon - + הסתרת סמליל מגש Start service @@ -3920,7 +3672,7 @@ Please save your work and close all programs. Stopped - + נעצר Stop service @@ -3928,104 +3680,80 @@ Please save your work and close all programs. State: - - - - Network - - - - Demo server port - + מצב: Enable firewall exception - + הפעל חריגה בחומת אש Allow connections from localhost only - - - - Internal VNC server port - + אפשר חיבורים ממחשב מקומי בלבד VNC server - + שרת VNC Plugin: - + תוסף Restart %1 Service - + הפעל מחדש את השירות %1 All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running - - - - Feature manager port - - - - Primary service port - + רץ Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - - - - Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + מספרי מפתחים (פורטים) Veyon server - + שרת Veyon Internal VNC server - + שרת VNC פנימי Feature manager - + מנהל מאפיינים Demo server @@ -4033,171 +3761,172 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + שליטה בשירות ServiceControlPlugin Service is running - + שירות רץ Service is not running - + שירות לא רץ Configure and control Veyon service - + הגדר ושלוט בשירות Veyon Register Veyon Service - + הוסף שירות Veyon Unregister Veyon Service - + מחק שירות Veyon Start Veyon Service - + הפעל שירות Veyon Stop Veyon Service - + עצור שירות Veyon Restart Veyon Service - + הפעל מחדש את שירות Veyon Query status of Veyon Service - + בדוק מצד של שירות Veyon Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! - + Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + הקודם Start/pause - + הפעל\השהה Next - + הבא Duration: - + משך זמן: SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + הוספצ מחשבים נבחרים Remove selected computers - + הסרת מחשבים נבחרים Update computers in realtime - + עדכון מחשבים בזמן אמת Spotlight - + Please select at least one computer to add. - + נא לבחור לפחות מחשב אחד להוספה. Please select at least one computer to remove. - + נא לבחור לפחות מחשב אחד להסדרה. + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + SystemTrayIcon System tray icon - + סמליל של מגש מערכת SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + ברירת מחדל (קבוצות משתמשים של מערכת) TestingCommandLinePlugin Test internal Veyon components and functions - + בדוק רכיבים פנימיים ופונקציות פנימיות של Veyon Commands for testing internal components and functions of Veyon - + פקודות לבדיקת רכיבים פנימיים של Veyon @@ -4208,7 +3937,7 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + השתמש בשדה מטה על מנת להקליד את ההודעה שתישלח לכל המשתמשים @@ -4219,7 +3948,7 @@ Typically this is required to support terminal servers. Use this function to send a text message to all users e.g. to assign them new tasks. - + השתמש באפשרות זאת על מנת לשלוח הודעה לכל המשתמשים - לדוגמה, לתת משימה חדשה Message from teacher @@ -4234,27 +3963,31 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + אפשר לכידה של חלונות בעלי שכבות (שקופים חלקית) Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + דיוק נמוך (מצב טורבו) Builtin UltraVNC server configuration - + הגדרות שרת UltraVNC בנוי Enable multi monitor support - + הפעל תמיכה במספר מסכים Enable Desktop Duplication Engine on Windows 8 and newer - + הפעל מנוע שכפול שולחן עבודה על ווינדוס 8 ומעלה + + + Maximum CPU usage + @@ -4265,18 +3998,18 @@ Typically this is required to support terminal servers. Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + התחברות משתמש Please enter a username and password for automatic login on all computers. - + נא להזין שם משתמש וסיסמה להתחברות אוטומטית בכל המחשבים Username @@ -4291,130 +4024,130 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + התחברות Click this button to log in a specific user on all computers. - + לחץ על כפתור זה על מנת לחבר משתמש מסוים Log off - + ניתוק Click this button to log off users from all computers. - + לחץ על כפתור זה על מנת לנתק את כל המשתמשים מכל המחשבים. Confirm user logoff - + וידוא ניתוק משתמש Do you really want to log off the selected users? - + אתה באמת רוצה לנתק את המשתמשים הנבחרים? User session control - + VeyonCore [OK] - + [הצלחה] [FAIL] - + [כישלון] Invalid command! - + פקודה לא תקינה! Available commands: - + פקודות זמינות Invalid arguments given - + ארגומנט לא תקין ניתן Not enough arguments given - use "%1 help" for more information - + Unknown result! - + תוצאה לא ידועה! Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + תוסף אינו מורשה INFO - + מידע ERROR - + שגיאה USAGE - + שימוש DESCRIPTION - + הסבר EXAMPLES - + דוגמות WARNING - + אזהרה Authentication test - + בדיקת התחברות VeyonServiceControl Veyon Service - + שירות Veyon VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + ווינדוס General @@ -4422,111 +4155,111 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + נעילת מסך Hide taskbar - + הסתר את שורת המשימות Hide start menu - + הסתר תפריט "התחל" Hide desktop - + הסתר שולחן עבודה User authentication - + אימות משתמש Use alternative user authentication mechanism - + השתמש במנגנון התחברות משתמש אלטרנטיבי User login - + התחברות משתמש Input start delay - + עיכוב התחלת הקלט Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + וודא התראה משפטית (הודעה שקופצת לפני שמשתמש מתחבר) Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + התוסף ממש פונקציות אבסטרקטיות של פלטפורמת Windows WindowsServiceControl The service "%1" is already installed. - + השירות "%1" כבר מותקן. The service "%1" could not be installed. - + השירות "%1" לא הותקן. The service "%1" has been installed successfully. - + השירות "%1" הותקן בהצלחה. The service "%1" could not be uninstalled. - + השירות "%1" לא יכול היה להימחק. The service "%1" has been uninstalled successfully. - + השירות "%1" נמחק בהצלחה. The start type of service "%1" could not be changed. - + סוג ההפעלה של השירות "%1" לא יכול היה לעבור שינוי. Service "%1" could not be found. - + השירות "%1" לא יכול היה להימצא. X11VncConfigurationWidget Builtin x11vnc server configuration - + הגדרת שרת x11vnc המובנה Custom x11vnc parameters: - + פרמטרים מותאמים אישית של x11vnc: Do not use X Damage extension - + אין להשתמש בהרחבה X Damage main Veyon Master - + Veyon מאסטר - + \ No newline at end of file diff --git a/translations/veyon_hu.ts b/translations/veyon_hu.ts index aa5987552..e6c0725c6 100644 --- a/translations/veyon_hu.ts +++ b/translations/veyon_hu.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő All groups Összes csoport - - ... - ... - Access control rules Hozzáférési szabályok @@ -267,7 +261,7 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő Authenticated via method - + @@ -325,98 +319,6 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő Hitelesítési mód - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Általános - - - - AuthKeysConfigurationDialog - - Authentication keys - Hitelesítési kulcs - - - Introduction - Bevezetés - - - Please perform the following steps to set up key file authentication: - Kérem, hajtsd végre a következő lépéseket a kulcsfájl-hitelesítés beállításához: - - - 1) Create a key pair on the master computer. - 1) Hozz létre egy kulcspárt a mesterszámítógépen. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Állíts be egy hozzáférési csoportot, amelynek tagjai hozzáférhetnek a többi számítógéphez. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Exportáld a nyilvános kulcsot , majd importáld ugyanazon a néven az összes számítógépre. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Kérem, további információkért olvassa le a <a href="https://veyon.readthedocs.io/en/latest/admin/index.html"> Veyon üzemeltetői leírást </a>. - - - Key file directories - Kulcsfájlok mappái - - - Public key file base directory - Publikus kulcsfájl alapmappája - - - Private key file base directory - Privát kulcsfájl alapmappája - - - ... - ... - - - Available authentication keys - Elérhető hitelesítési kulcsok - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - A hitelesítési kulcspár kettő összetartozó kriptográfiai kulcsból áll, egy privát és egy publikus kulcsból. -A privát kulcs használatával a mester számítógép felhasználói hozzáférhetnek a kliens számítógépekhez. -Fontos, hogy csak hitelesített felhasználóknak legyen olvasási hozzáférése a privát kulcsfájlhoz. -A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcsolatkérések hitelesítéséhez. - - - Create key pair - Kulcspár létrehozása - - - Delete key - Kulcs törlése - - - Import key - Kulcs importálása - - - Export key - Kulcs exportálása - - - Set access group - Hozzáférési csoport beállítása - - AuthKeysConfigurationWidget @@ -765,7 +667,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Key file - + @@ -791,7 +693,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso AuthLdapConfigurationWidget LDAP authentication - + General @@ -799,11 +701,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -814,7 +716,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -872,7 +774,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Logon - + @@ -906,7 +808,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Simple password - + @@ -924,7 +826,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso AuthenticationPageTab Enabled - + Test @@ -1291,11 +1193,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso [no user] - + Veyon Server unreachable or not running - + @@ -1330,14 +1232,14 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Active connections: - + ComputerGroupSelector Group %1 - + @@ -1379,27 +1281,23 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - Számítógép-kezelés - Computer search Számítógép keresése @@ -1429,6 +1327,17 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Nem sikerült a számítógép- és a felhasználólista kiírása ide: %1. Ellenőrizd a hozzáférési jogosultságaidat. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1528,7 +1437,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Could not configure the firewall configuration for the %1 Service. - + @@ -1560,10 +1469,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Memory limit Memóriakorlát - - Use multithreading (experimental) - Többszálúság használata (kísérleti) - MB MB @@ -1601,59 +1506,59 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1853,11 +1758,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Destination directory - + Default source directory - + Options @@ -1865,11 +1770,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Remember last source directory - + Create destination directory if it does not exist - + @@ -1978,10 +1883,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Log file directory Naplófájl mappája - - ... - ... - Log level Naplózás szintje @@ -2078,21 +1979,12 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Write to logging system of operating system Írás az operációs rendszer naplózási rendszerébe + + + HeadlessVncServer - Authentication - Hitelesítés - - - Method: - Módszer: - - - Test - Tesztelés - - - Configure - Konfiguráció + Headless VNC server + @@ -2347,7 +2239,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Computer groups filter - + Computer locations identification @@ -2359,11 +2251,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2869,7 +2761,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2877,54 +2769,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso LDAP bind - - - - - LicensingConfigurationPage - - Licensing - Licencelés - - - Installed licenses - Telepített licencek - - - Add new network range - Új hálózati tartomány hozzáadása - - - Remove selected network range - Kiválasztott hálózati tartomány eltávolítása - - - ID - ID - - - Valid until - Érvényes eddig - - - Licensee - Licencelő - - - Information - Információ - - - Installation ID - Telepítésazonosító - - - Addons available for licensing - Licencelhető - - - Addon - Bővítmény + @@ -3121,10 +2966,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Search users and computers Felhasználók és számítógépek keresse - - Adjust optimal size - Optimális méretűre állítás - Align computers to grid Számítógépek rácsba illesztése @@ -3174,16 +3015,16 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Hitelesítés - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3192,10 +3033,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Directories Mappák - - ... - ... - User configuration Felhasználói konfigurációk @@ -3328,41 +3165,41 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Automatically select current location Jelenlegi helyszín automatikus kiválasztása - - Automatically adjust computer thumbnail size - Számítógépek indexképének automatikus méretezése - Automatically open computer select panel Számítógépkiválasztási-panel automatikus megnyitása Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Automatikus + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3380,97 +3217,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Ez az alapértelmezett mód, ami lehetővé teszi, hogy monitorozd az egy vagy több helyszínen lévő összes számítógépet. - - NetworkDiscoveryConfigurationPage - - Network discovery - Hálózat felderítése - - - Mode - Mód - - - Scan network ranges - Hálózati tartományok átvizsgálása - - - e.g. 192.168.1.0/24 - pl. 192.168.1.0/24 - - - Scan all subnets of computer - A számítógép összes alhálózatának átvizsgálása - - - Scan custom subnet - Egyéni alhálózat átvizsgálása - - - Scan sessions on local computer - A helyi számítógép munkameneteinek átvizsgálása - - - Test - Tesztelés - - - Network ranges - Hálózati tartományok - - - Add new group - Új csoport hozzáadása - - - Remove selected group - Kiválasztott csoport eltávolítása - - - Groups - Csoportok - - - First address - Első cím - - - Last address - Utolsó cím - - - Add new network range - Új hálózati tartomány hozzáadása - - - Remove selected network range - Kiválasztott hálózati tartomány eltávolítása - - - Parallel scans - Párhuzamos átvizsgálások - - - Scan timeout - Átvizsgálási időtúllépés - - - ms - ms - - - Session scan limit - Átvizsgálás munkamenetének korlátja - - - Options - Lehetőség - - - Reverse lookup discovered IP addresses to host names - A fordított keresés IP-címeket talált a kiszolgálónevekhez - - NetworkObjectTreeModel @@ -3509,11 +3255,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3521,23 +3267,23 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3695,7 +3441,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3706,7 +3452,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + @@ -3831,11 +3577,11 @@ Please save your work and close all programs. Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3854,7 +3600,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3919,11 +3665,11 @@ Please save your work and close all programs. Screenshot - Képernyőkép + Képernyőkép Do you really want to delete all selected screenshots? - + @@ -3956,14 +3702,6 @@ Please save your work and close all programs. State: Állapot: - - Network - Hálózat - - - Demo server port - Demó szerver port - Enable firewall exception Fűzfal-kivétel bekapcsolása @@ -3972,10 +3710,6 @@ Please save your work and close all programs. Allow connections from localhost only Kapcsolatok engedélyezése csak a localhost-ból - - Internal VNC server port - Belső VNC szerver port - VNC server VNC szerver @@ -3996,14 +3730,6 @@ Please save your work and close all programs. Running Jelenleg fut - - Feature manager port - Szolgáltatáskezelő port - - - Primary service port - Elsődleges szolgáltatási port - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4013,37 +3739,33 @@ Typically this is required to support terminal servers. Show notification on remote connection Távoli csatlakozás esetén értesítés megjelenítése - - Multi session mode (for terminal and remote desktop servers) - Többmunka-menetes mód (terminál és távoli asztal szerverekhez) - Show notification when an unauthorized access is blocked Értesítés jelenjen meg amikor egy nem hitelesített hozzáférést blokkolunk. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server @@ -4059,7 +3781,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4151,50 +3873,51 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4282,6 +4005,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer Asztalduplikációs motor bekapcsolása Windows 8 vagy újabb rendszeren + + Maximum CPU usage + + UserConfig @@ -4492,7 +4219,7 @@ Typically this is required to support terminal servers. Use input device interception driver - + @@ -4552,7 +4279,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_id.ts b/translations/veyon_id.ts index d88375f7b..3ad4be3ab 100644 --- a/translations/veyon_id.ts +++ b/translations/veyon_id.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a All groups Semua grup - - ... - ... - Access control rules Aturan kontrol akses @@ -325,98 +319,6 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Metode autentikasi - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Umum - - - - AuthKeysConfigurationDialog - - Authentication keys - Kunci otentikasi - - - Introduction - Perkenalan - - - Please perform the following steps to set up key file authentication: - Silakan lakukan langkah-langkah berikut untuk mengatur otentikasi file utama: - - - 1) Create a key pair on the master computer. - 1) Buat pasangan kunci di komputer master. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Tetapkan grup akses yang anggotanya harus diizinkan untuk mengakses komputer lain. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Ekspor kunci publik dan impor pada semua komputer klien dengan nama yang sama. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - Direktori berkas kunci - - - Public key file base directory - Direktori basis berkas kunci publik - - - Private key file base directory - Direktori basis file kunci pribadi - - - ... - ... - - - Available authentication keys - Kunci autentikasi tersedia - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Sepasang kunci otentikasi terdiri dari dua kunci kriptografi yang digabungkan, kunci pribadi dan kunci publik. -Kunci privat memungkinkan pengguna pada komputer master untuk mengakses komputer klien. -Penting bahwa hanya pengguna yang berwenang yang memiliki akses baca ke file kunci pribadi. -Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan koneksi masuk. - - - Create key pair - Buat pasangan kunci - - - Delete key - Hapus kunci - - - Import key - Impor kunci - - - Export key - Ekspor kunci - - - Set access group - Setel grup akses - - AuthKeysConfigurationWidget @@ -445,7 +347,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -515,7 +417,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -523,11 +425,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + @@ -542,15 +444,15 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" @@ -562,7 +464,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! @@ -586,7 +488,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. @@ -594,11 +496,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. @@ -606,55 +508,55 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> @@ -662,14 +564,14 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key @@ -705,7 +607,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME @@ -717,19 +619,19 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE @@ -741,31 +643,31 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -791,7 +693,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone AuthLdapConfigurationWidget LDAP authentication - + General @@ -799,11 +701,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -814,7 +716,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -830,7 +732,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Logon failed with given username and password. Please try again! - + @@ -841,7 +743,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter your username and password in order to access computers. - + Username @@ -857,22 +759,22 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + @@ -883,7 +785,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter the Veyon password: - + Authentication error @@ -891,40 +793,40 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -963,7 +865,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Builtin directory - + Locations & computers @@ -1002,11 +904,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1046,7 +948,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Unclassified object "%1" with ID "%2" - + None @@ -1058,7 +960,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Root - + Invalid @@ -1066,7 +968,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Error while parsing line %1. - + Network object directory which stores objects in local configuration @@ -1078,7 +980,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone No format string or regular expression specified! - + Can't open file "%1" for writing! @@ -1086,7 +988,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone No format string specified! - + Object UUID @@ -1106,7 +1008,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Dump all or individual locations and computers - + List all locations and computers @@ -1134,47 +1036,47 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1186,65 +1088,65 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + @@ -1263,15 +1165,15 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Establishing connection - + Computer offline or switched off - + Authentication failed or access denied - + Disconnected @@ -1283,26 +1185,26 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Logged on user: %1 - + Location: %1 - + [no user] - + Veyon Server unreachable or not running - + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1310,34 +1212,34 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Remote access - + User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1356,11 +1258,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. @@ -1379,54 +1281,61 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - - Computer search - + Add location - + Save computer/user list - + Select output filename - + CSV files (*.csv) - + File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + + + + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + @@ -1485,7 +1394,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please specify a valid key. - + Specified key does not exist in current configuration! @@ -1493,11 +1402,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon @@ -1508,34 +1417,34 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + DemoClient %1 Demo - + @@ -1546,7 +1455,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Tunables - + ms @@ -1554,15 +1463,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Key frame interval - + Memory limit - - - - Use multithreading (experimental) - + MB @@ -1570,97 +1475,97 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Update interval - + s - + Slow down thumbnail updates while demo is running - + DemoFeaturePlugin Stop demo - + Window demo - + Give a demonstration by screen broadcasting - + In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + DesktopAccessDialog Desktop access dialog - + Confirm desktop access @@ -1676,18 +1581,18 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1695,23 +1600,23 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL @@ -1719,133 +1624,133 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone New program - + New website - + DesktopServicesFeaturePlugin Run program - + Open website - + Click this button to open a website on all computers. - + Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: - + Password: - + FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories @@ -1853,11 +1758,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Destination directory - + Default source directory - + Options @@ -1865,25 +1770,25 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options @@ -1891,65 +1796,65 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1960,67 +1865,63 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Language: - + Use system language setting - + Veyon - + Logging - + Log file directory - - - - ... - ... + Log level - + Nothing - + Only critical messages - + Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory @@ -2032,31 +1933,31 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB @@ -2064,42 +1965,33 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Rotate log files - + x - + seconds - + Write to logging system of operating system - - - - Authentication - - - - Method: - - - - Test - Tes + + + + HeadlessVncServer - Configure - + Headless VNC server + LdapBrowseDialog Browse LDAP - + @@ -2113,27 +2005,27 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. @@ -2141,130 +2033,130 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations @@ -2272,147 +2164,147 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Computer location attribute - + Location name attribute - + users - + user groups - + computers - + computer groups - + computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2427,147 +2319,147 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2575,75 +2467,75 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security @@ -2655,15 +2547,15 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone System defaults - + Never (insecure!) - + Custom CA certificate file - + None @@ -2679,23 +2571,23 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) @@ -2707,31 +2599,31 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location @@ -2743,11 +2635,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name @@ -2755,7 +2647,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter the name of a computer location (wildcards allowed): - + Enter location name @@ -2763,11 +2655,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2775,42 +2667,42 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2818,11 +2710,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) @@ -2834,101 +2726,54 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - Perizinan - - - Installed licenses - Lisensi ter install - - - Add new network range - Tambahkan rentang jaringan baru - - - Remove selected network range - Hapus rentang jaringan terpilih - - - ID - ID - - - Valid until - Berlaku hingga - - - Licensee - Penerima lisensi - - - Information - Informasi - - - Installation ID - ID instalasi - - - Addons available for licensing - Addons tersedia untuk perizinan - - - Addon - Tambahan + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + @@ -2942,11 +2787,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LocationDialog Select location - + enter search filter... - + @@ -2968,11 +2813,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone MainWindow MainWindow - + toolBar - + General @@ -3000,7 +2845,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone L&oad settings from file - + Ctrl+O @@ -3040,11 +2885,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Master - + Access control - + About Veyon @@ -3052,7 +2897,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Auto - + About @@ -3060,7 +2905,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone %1 Configurator %2 - + JSON files (*.json) @@ -3068,7 +2913,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3084,11 +2929,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3102,21 +2947,17 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Search users and computers Cari pengguna dan komputer - - Adjust optimal size - - Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. @@ -3124,47 +2965,47 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3173,10 +3014,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Directories Direktori - - ... - ... - User configuration Konfigurasi pengguna @@ -3203,7 +3040,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone <no feature> - + Basic settings @@ -3215,7 +3052,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Enforce selected mode for client computers - + Hide local computer @@ -3239,7 +3076,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Thumbnail update interval - + ms @@ -3247,7 +3084,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Program start - + Modes and features @@ -3267,7 +3104,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Computer thumbnail caption - + Text color @@ -3291,7 +3128,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Allow adding hidden locations manually - + Hide empty locations @@ -3299,202 +3136,111 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + - Thumbnail aspect ratio - + Auto + - Auto - + Thumbnail aspect ratio + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - Pendeteksian jaringan - - - Mode - Mode - - - Scan network ranges - Pindai rentang jaringan - - - e.g. 192.168.1.0/24 - contoh: 192.168.1.0/24 - - - Scan all subnets of computer - Pindai semua subnet komputer - - - Scan custom subnet - Pindai subnet tertentu - - - Scan sessions on local computer - Pindai sesi pada komputer lokal - - - Test - Tes - - - Network ranges - Rentang jaringan - - - Add new group - Tambah grup baru - - - Remove selected group - Hapus grup terpilih - - - Groups - Grup - - - First address - Alamat pertama - - - Last address - Alamat terakhir - - - Add new network range - Tambahkan rentang jaringan baru - - - Remove selected network range - Hapus rentang jaringan terpilih - - - Parallel scans - Pemindaian paralel - - - Scan timeout - Waktu pemindaian habis - - - ms - ms - - - Session scan limit - Batas sesi pemindaian - - - Options - Opsi - - - Reverse lookup discovered IP addresses to host names - Reverse lookup menemukan alamat IP ke nama host + NetworkObjectTreeModel Locations/Computers - + OpenWebsiteDialog Open website - + e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3502,23 +3248,23 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3529,7 +3275,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3545,35 +3291,35 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot - + Confirm power down - + Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. @@ -3581,41 +3327,41 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3626,46 +3372,46 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control - + Open a remote control window for a computer. - + Remote access - + Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3676,33 +3422,33 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 - %3 Remote Access - + RemoteAccessWidgetToolBar View only - + Remote control - + Send shortcut - + Fullscreen @@ -3746,7 +3492,7 @@ Please save your work and close all programs. Connecting %1 - + Connected. @@ -3758,14 +3504,14 @@ Please save your work and close all programs. Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3773,19 +3519,19 @@ Please save your work and close all programs. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3800,34 +3546,34 @@ Please save your work and close all programs. Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3835,7 +3581,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3846,19 +3592,19 @@ Please save your work and close all programs. Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3872,7 +3618,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3900,11 +3646,11 @@ Please save your work and close all programs. Screenshot - Tangkapan layar + Tangkapan layar Do you really want to delete all selected screenshots? - + @@ -3937,29 +3683,17 @@ Please save your work and close all programs. State: Status: - - Network - Jaringan - - - Demo server port - - Enable firewall exception Aktifkan pengecualian firewall Allow connections from localhost only - - - - Internal VNC server port - + VNC server - + Plugin: @@ -3967,44 +3701,32 @@ Please save your work and close all programs. Restart %1 Service - + All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running Berjalan - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - - - - Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions @@ -4012,27 +3734,27 @@ Typically this is required to support terminal servers. Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4040,7 +3762,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4102,18 +3824,18 @@ Typically this is required to support terminal servers. Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4121,61 +3843,62 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4189,22 +3912,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4215,18 +3938,18 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + TextMessageFeaturePlugin Text message - + Use this function to send a text message to all users e.g. to assign them new tasks. - + Message from teacher @@ -4241,49 +3964,53 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + + + + Maximum CPU usage + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4298,31 +4025,31 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control - + @@ -4345,11 +4072,11 @@ Typically this is required to support terminal servers. Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! @@ -4361,7 +4088,7 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed @@ -4369,31 +4096,31 @@ Typically this is required to support terminal servers. INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + @@ -4407,21 +4134,21 @@ Typically this is required to support terminal servers. VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4429,51 +4156,51 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4487,53 +4214,53 @@ Typically this is required to support terminal servers. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_it.ts b/translations/veyon_it.ts index 46fb75b29..3ae71ca11 100644 --- a/translations/veyon_it.ts +++ b/translations/veyon_it.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche All groups Tutti i gruppi - - ... - ... - Access control rules Regole di controllo d'accesso @@ -325,95 +319,6 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche Metodo di autenticazione - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Generale - - - - AuthKeysConfigurationDialog - - Authentication keys - Chiavi di autenticazione - - - Introduction - Introduzione - - - Please perform the following steps to set up key file authentication: - Effettuare le seguenti operazioni per configurare l'autenticazione del file chiave: - - - 1) Create a key pair on the master computer. - 1) Creare una coppia di chiavi sul computer master. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Impostare un gruppo di accesso i cui membri dovrebbero poter accedere ad altri computer. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Esportare la chiave pubblica e importarla su tutti i computer client con lo stesso nome. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Per ulteriori informazioni, consultare il <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Manuale dell'amministratore di Veyon</a>. - - - Key file directories - Cartelle per i file delle chiavi - - - Public key file base directory - Cartella chiave Pubblica - - - Private key file base directory - Cartella chiave Privata - - - ... - ... - - - Available authentication keys - Chiavi di autenticazione disponibili - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Una coppia di chiavi di autenticazione è composta da due chiavi crittografiche accoppiate, una privata e una chiave pubblica. Una chiave privata consente agli utenti del computer master di accedere ai computer client. È importante che solo gli utenti autorizzati abbiano accesso in lettura al file della chiave privata. La chiave pubblica viene utilizzata sui computer client per autenticare la richiesta di connessione in entrata. - - - Create key pair - Crea una coppia di chiavi - - - Delete key - Cancella la chiave - - - Import key - Importa la chiave - - - Export key - Esporta la chiave - - - Set access group - Imposta il gruppo di accesso - - AuthKeysConfigurationWidget @@ -1285,11 +1190,11 @@ The public key is used on client computers to authenticate incoming connection r [no user] - + [nessun utente] Veyon Server unreachable or not running - + Veyon Server irraggiungibile o non in esecuzione @@ -1390,10 +1295,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - Gestione del computer - Computer search Ricerca computer @@ -1423,6 +1324,17 @@ The public key is used on client computers to authenticate incoming connection r Impossibile scrivere l'elenco computer e utenti su %1! Controllare i permessi di accesso al file. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1554,10 +1466,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit Limite memoria - - Use multithreading (experimental) - Utilizzo multithreading (sperimentale) - MB MB @@ -1972,10 +1880,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Cartella per il Log file - - ... - ... - Log level Livello di Log @@ -2072,21 +1976,12 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system Scrivi nel sistema di log del sistema operativo + + + HeadlessVncServer - Authentication - Autenticazione - - - Method: - Metodo: - - - Test - Prova - - - Configure - Configurazione + Headless VNC server + Server VNC headless @@ -2864,53 +2759,6 @@ The public key is used on client computers to authenticate incoming connection r Bind LDAP - - LicensingConfigurationPage - - Licensing - Licenze - - - Installed licenses - Licenze installate - - - Add new network range - Aggiungi un nuovo intervallo di rete - - - Remove selected network range - Rimuovi l'intervallo di rete selezionato - - - ID - ID - - - Valid until - Valido fino a - - - Licensee - Licenziatario - - - Information - Informazioni - - - Installation ID - ID installazione - - - Addons available for licensing - Componenti aggiuntivi disponibili per la licenza - - - Addon - Componente aggiuntivo - - LinuxPlatformConfigurationPage @@ -3105,10 +2953,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers Cerca utenti e computer - - Adjust optimal size - Sistema dimensione ottimale - Align computers to grid Allinea i computer alla griglia @@ -3157,6 +3001,10 @@ The public key is used on client computers to authenticate incoming connection r Authentication Autenticazione + + Adjust size of computer icons automatically + Regola automaticamente la dimensione delle icone del computer + Slideshow Presentazione @@ -3165,10 +3013,6 @@ The public key is used on client computers to authenticate incoming connection r Spotlight Spotlight - - Adjust size of computer icons automatically - - MasterConfigurationPage @@ -3176,10 +3020,6 @@ The public key is used on client computers to authenticate incoming connection r Directories Cartelle - - ... - ... - User configuration Configurazione utente @@ -3312,10 +3152,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location Seleziona automaticamente la posizione corrente - - Automatically adjust computer thumbnail size - Regola automaticamente le dimensioni della miniatura del computer - Automatically open computer select panel Apri automaticamente il pannello di selezione del computer @@ -3336,17 +3172,21 @@ The public key is used on client computers to authenticate incoming connection r Hide local session Nascondi sessione locale + + Auto + Automatico + Thumbnail aspect ratio Proporzioni delle miniature - Auto - Automatico + Automatically adjust computer icon size + Regola automaticamente la dimensione dell'icona del computer - Automatically adjust computer icon size - + Open feature windows on the same screen as the main window + Apri le finestre delle funzioni sulla stessa schermata della finestra principale @@ -3364,97 +3204,6 @@ The public key is used on client computers to authenticate incoming connection r Questa modalità consente di monitorare tutti i computer in una o più posizioni. - - NetworkDiscoveryConfigurationPage - - Network discovery - Individuazione della rete - - - Mode - Modalità - - - Scan network ranges - Scansione intervalli di rete - - - e.g. 192.168.1.0/24 - per esempio: 192.168.1.0/24 - - - Scan all subnets of computer - Analizza tutte le subnet del computer - - - Scan custom subnet - Scansione subnet personalizzata - - - Scan sessions on local computer - Scansione delle sessioni sul computer locale - - - Test - Prova - - - Network ranges - Gamme di rete - - - Add new group - Aggiungi nuovo gruppo - - - Remove selected group - Rimuovi il gruppo selezionato - - - Groups - Gruppi - - - First address - Primo indirizzo - - - Last address - Ultimo indirizzo - - - Add new network range - Aggiungi un nuovo intervallo di rete - - - Remove selected network range - Rimuovi l'intervallo di rete selezionato - - - Parallel scans - Scansioni parallele - - - Scan timeout - Scansione terminata - - - ms - ms - - - Session scan limit - Limite di scansione di sessione - - - Options - Opzioni - - - Reverse lookup discovered IP addresses to host names - La ricerca inversa ha scoperto gli indirizzi IP nei nomi host - - NetworkObjectTreeModel @@ -3692,7 +3441,7 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Accesso Remoto @@ -3905,11 +3654,11 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Screenshot - Screenshot + Screenshot Do you really want to delete all selected screenshots? - + Vuoi davvero eliminare tutti gli screenshot selezionati? @@ -3942,14 +3691,6 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. State: Stato: - - Network - Rete - - - Demo server port - Porta per la modalità Presentazione - Enable firewall exception Abilita le eccezioni del firewall @@ -3958,10 +3699,6 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Allow connections from localhost only Consenti connessioni solo da questo computer 'localhost' - - Internal VNC server port - Porta interna server VNC - VNC server Server VNC @@ -3982,14 +3719,6 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Running In esecuzione - - Feature manager port - Porta manager funzionalita' - - - Primary service port - Porta servizio primario - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -3999,10 +3728,6 @@ Typically this is required to support terminal servers. Show notification on remote connection Mostra notifica sulla connessione remota - - Multi session mode (for terminal and remote desktop servers) - Modalità multi sessione (per terminali e server desktop remoti) - Show notification when an unauthorized access is blocked Mostra notifica quando viene bloccato un accesso non autorizzato @@ -4154,10 +3879,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - Aggiungi computer facendo clic con il pulsante centrale del mouse o facendo clic sul primo pulsante in basso. - Add selected computers Aggiungi computer selezionati @@ -4182,6 +3903,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. Seleziona almeno un computer da rimuovere. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4268,6 +3994,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer Abilita motore di duplicazione Desktop su versioni di Windows 8 e successive + + Maximum CPU usage + Utilizzo massimo della CPU + UserConfig @@ -4541,4 +4271,4 @@ Typically this is required to support terminal servers. Veyon Master - + \ No newline at end of file diff --git a/translations/veyon_ja.ts b/translations/veyon_ja.ts index 64155c6df..a8a2d347d 100644 --- a/translations/veyon_ja.ts +++ b/translations/veyon_ja.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ If you're interested in translating Veyon into your local or another langua All groups すべてのグループ - - ... - ... - Access control rules アクセスコントロールルール @@ -268,7 +262,7 @@ If you're interested in translating Veyon into your local or another langua Authenticated via method - + @@ -323,99 +317,7 @@ If you're interested in translating Veyon into your local or another langua Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - Android - - - General - 一般 - - - - AuthKeysConfigurationDialog - - Authentication keys - 認証キー - - - Introduction - 紹介 - - - Please perform the following steps to set up key file authentication: - キーファイル認証を設定するために以下の手順を追ってください - - - 1) Create a key pair on the master computer. - 1.マスターPCで認証キーを作成 - - - 2) Set an access group whose members should be allowed to access other computers. - 2.他のコンピューターへのアクセスを許可するメンバーのグループを設定 - - - 3) Export the public key and import it on all client computers with the same name. - 3.パブリックキーをエクスポートし、すべてのクライアントPCに同じ名前でインポートしてください。 - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - 詳細は<a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon管理者マニュアル</a>を確認してください。 - - - Key file directories - キーファイルの場所: - - - Public key file base directory - パブリックキーのファイルの場所 - - - Private key file base directory - プライベートキーのファイルの場所 - - - ... - ... - - - Available authentication keys - 使用可能な認証キー - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - 1つの認証キーのペアは、プライベートキーとパブリックキーの2つの暗号キーで構成されています。 -プライベートキーを使用すると、マスターコンピューターのユーザーがクライアントPCにアクセスすることができます。 -許可されたユーザーのみがプライベートキーを読む権限があるようにしてください。 -パブリックキーはクライアントPCが他からのアクセス要求を認証するために使用します。 - - - Create key pair - キーを作成 - - - Delete key - キーを削除 - - - Import key - キーをインポート - - - Export key - キーをエクスポート - - - Set access group - アクセスグループを設定 + @@ -766,7 +668,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -792,7 +694,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -800,11 +702,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -815,7 +717,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -873,7 +775,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + @@ -907,25 +809,25 @@ The public key is used on client computers to authenticate incoming connection r Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -1139,15 +1041,15 @@ The public key is used on client computers to authenticate incoming connection r FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room @@ -1159,23 +1061,23 @@ The public key is used on client computers to authenticate incoming connection r Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1187,96 +1089,96 @@ The public key is used on client computers to authenticate incoming connection r PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected - + Establishing connection - + Computer offline or switched off - + Authentication failed or access denied - + Disconnected - + No user logged on @@ -1284,26 +1186,26 @@ The public key is used on client computers to authenticate incoming connection r Logged on user: %1 - + Location: %1 - + [no user] - + Veyon Server unreachable or not running - + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1315,30 +1217,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1349,23 +1251,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1376,167 +1278,174 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - - Computer search - + Add location - + Save computer/user list - + Select output filename - + CSV files (*.csv) - + File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + + + + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + DemoClient %1 Demo - + @@ -1547,7 +1456,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms @@ -1555,38 +1464,34 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit - - - - Use multithreading (experimental) - + MB - + Update interval - + s - + Slow down thumbnail updates while demo is running - + DemoFeaturePlugin Stop demo - + Window demo @@ -1594,7 +1499,7 @@ The public key is used on client computers to authenticate incoming connection r Give a demonstration by screen broadcasting - + In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. @@ -1602,66 +1507,66 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + DesktopAccessDialog Desktop access dialog - + Confirm desktop access @@ -1669,26 +1574,26 @@ The public key is used on client computers to authenticate incoming connection r Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1696,23 +1601,23 @@ The public key is used on client computers to authenticate incoming connection r Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL @@ -1720,11 +1625,11 @@ The public key is used on client computers to authenticate incoming connection r New program - + New website - + @@ -1735,15 +1640,15 @@ The public key is used on client computers to authenticate incoming connection r Open website - + Click this button to open a website on all computers. - + Start programs and services in user desktop - + Click this button to run a program on all computers. @@ -1759,42 +1664,42 @@ The public key is used on client computers to authenticate incoming connection r Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program @@ -1802,51 +1707,51 @@ The public key is used on client computers to authenticate incoming connection r Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: - + Password: - + FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories @@ -1854,11 +1759,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Default source directory - + Options @@ -1866,25 +1771,25 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options @@ -1892,49 +1797,49 @@ The public key is used on client computers to authenticate incoming connection r Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer @@ -1942,15 +1847,15 @@ The public key is used on client computers to authenticate incoming connection r Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1961,28 +1866,24 @@ The public key is used on client computers to authenticate incoming connection r Language: - + Use system language setting - + Veyon - + Logging - + Log file directory ログファイルのディレクトリ - - ... - ... - Log level ログレベル @@ -2005,27 +1906,27 @@ The public key is used on client computers to authenticate incoming connection r Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory - + Backend: @@ -2033,43 +1934,43 @@ The public key is used on client computers to authenticate incoming connection r Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB - + Rotate log files - + x - + seconds @@ -2077,187 +1978,178 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - - - - Authentication - 認証 - - - Method: - - - - Test - テスト + + + + HeadlessVncServer - Configure - + Headless VNC server + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses @@ -2265,162 +2157,162 @@ The public key is used on client computers to authenticate incoming connection r Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users - + user groups - + computers - + computer groups - + computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + LdapConfigurationPage Basic settings - + General @@ -2428,147 +2320,147 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2576,95 +2468,95 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None @@ -2672,103 +2564,103 @@ The public key is used on client computers to authenticate incoming connection r TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2776,42 +2668,42 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2819,11 +2711,11 @@ The public key is used on client computers to authenticate incoming connection r Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) @@ -2835,23 +2727,23 @@ The public key is used on client computers to authenticate incoming connection r Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2859,110 +2751,63 @@ The public key is used on client computers to authenticate incoming connection r LDAP bind - - - - - LicensingConfigurationPage - - Licensing - ライセンス - - - Installed licenses - インストールされているライセンス - - - Add new network range - 新しいネットワーク範囲を追加 - - - Remove selected network range - 選択したネットワーク範囲を削除 - - - ID - ID - - - Valid until - まで有効 - - - Licensee - ライセンス - - - Information - 情報 - - - Installation ID - インストールID - - - Addons available for licensing - ライセンスで利用可能なアドオン - - - Addon - アドオン + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + MainToolBar Configuration - + Disable balloon tooltips - + Show icons only - + @@ -2985,67 +2830,67 @@ The public key is used on client computers to authenticate incoming connection r &Help - + &Quit - + Ctrl+Q - + Ctrl+S - + L&oad settings from file - + Ctrl+O - + About Qt - + Configuration not writable - + Load settings from file - + Save settings to file - + Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service - + Master - + Access control - + About Veyon @@ -3053,7 +2898,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3061,15 +2906,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3077,95 +2922,91 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots - + Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration - + Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - - - - Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication 認証 - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3174,61 +3015,57 @@ The public key is used on client computers to authenticate incoming connection r Directories ディレクトリ - - ... - ... - User configuration - + Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots - + <no feature> - + Basic settings - + Behaviour - + Enforce selected mode for client computers - + Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3236,11 +3073,11 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Thumbnail update interval - + ms @@ -3248,254 +3085,163 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + - Thumbnail aspect ratio - + Auto + - Auto - + Thumbnail aspect ratio + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. このモードでは、全てのコンピューターを1つ以上の場所でモニターできるようになります。 - - NetworkDiscoveryConfigurationPage - - Network discovery - ネットワーク発見 - - - Mode - モード - - - Scan network ranges - ネットワーク範囲をスキャンする - - - e.g. 192.168.1.0/24 - e.g. 192.168.1.0/24 - - - Scan all subnets of computer - コンピュータのすべてのサブネットをスキャンする - - - Scan custom subnet - カスタムサブネットをスキャンする - - - Scan sessions on local computer - ローカルコンピューターでのセッションのスキャン - - - Test - テスト - - - Network ranges - ネットワーク範囲 - - - Add new group - 新しいグループを追加 - - - Remove selected group - 選択したグループを削除 - - - Groups - グループ - - - First address - 最初のアドレス - - - Last address - 最後のアドレス - - - Add new network range - 新しいネットワーク範囲を追加 - - - Remove selected network range - 選択したネットワーク範囲を削除 - - - Parallel scans - 並列スキャン - - - Scan timeout - スキャンのタイムアウト - - - ms - ms - - - Session scan limit - セッションスキャン制限 - - - Options - オプション - - - Reverse lookup discovered IP addresses to host names - 検出されたIPアドレスをホスト名に逆引き - - NetworkObjectTreeModel Locations/Computers - + OpenWebsiteDialog Open website - + e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3503,23 +3249,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3530,23 +3276,23 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot - + Click this button to reboot all computers. - + Power down - + Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer @@ -3554,7 +3300,7 @@ The public key is used on client computers to authenticate incoming connection r Confirm reboot - + Confirm power down @@ -3562,23 +3308,23 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! @@ -3586,27 +3332,27 @@ The public key is used on client computers to authenticate incoming connection r Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? @@ -3617,26 +3363,26 @@ The public key is used on client computers to authenticate incoming connection r The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + PowerDownTimeInputDialog Power down - + Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3655,7 +3401,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Remote access @@ -3663,11 +3409,11 @@ Please save your work and close all programs. Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3678,25 +3424,25 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 - %3 Remote Access - + RemoteAccessWidgetToolBar View only - + Remote control @@ -3704,7 +3450,7 @@ Please save your work and close all programs. Send shortcut - + Fullscreen @@ -3712,82 +3458,82 @@ Please save your work and close all programs. Window - + Ctrl+Alt+Del - + Ctrl+Esc - + Alt+Tab - + Alt+F4 - + Win+Tab - + Win - + Menu - + Alt+Ctrl+F1 - + Connecting %1 - + Connected. - + Screenshot - + Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3810,103 +3556,103 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot - + Could not open screenshot file %1 for writing. - + ScreenshotFeaturePlugin Screenshot - + Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + ScreenshotManagementPage Screenshots - + ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: - + Computer: - + Date: - + Time: - + Show - + Delete - + Screenshot - + Do you really want to delete all selected screenshots? - + @@ -3939,33 +3685,21 @@ Please save your work and close all programs. State: 状態: - - Network - - - - Demo server port - デモサーバーのポート - Enable firewall exception - + Allow connections from localhost only - - - - Internal VNC server port - + VNC server - + Plugin: - + Restart %1 Service @@ -3973,32 +3707,20 @@ Please save your work and close all programs. All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running - - - - Feature manager port - - - - Primary service port - + Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - - - - Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked @@ -4006,35 +3728,35 @@ Typically this is required to support terminal servers. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4042,80 +3764,80 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + ServiceControlPlugin Service is running - + Service is not running - + Configure and control Veyon service - + Register Veyon Service - + Unregister Veyon Service - + Start Veyon Service - + Stop Veyon Service - + Restart Veyon Service - + Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4123,112 +3845,113 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + SystemTrayIcon System tray icon - + SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + TextMessageDialog Send text message - + Use the field below to type your message which will be sent to all selected users. - + TextMessageFeaturePlugin Text message - + Use this function to send a text message to all users e.g. to assign them new tasks. - + Message from teacher @@ -4236,56 +3959,60 @@ Typically this is required to support terminal servers. Send a message to a user - + UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + + + + Maximum CPU usage + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4300,27 +4027,27 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4331,99 +4058,99 @@ Typically this is required to support terminal servers. VeyonCore [OK] - + [FAIL] - + Invalid command! - + Available commands: - + Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! - + Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4431,7 +4158,7 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock @@ -4439,103 +4166,103 @@ Typically this is required to support terminal servers. Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_ko.ts b/translations/veyon_ko.ts index aa73ca2c2..4334137ae 100644 --- a/translations/veyon_ko.ts +++ b/translations/veyon_ko.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 All groups 모든 그룹 - - ... - ... - Access control rules 접근 제어 규칙 @@ -267,7 +261,7 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 Authenticated via method - + @@ -322,99 +316,7 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - Android - - - General - 일반사항 - - - - AuthKeysConfigurationDialog - - Authentication keys - 인증 키 - - - Introduction - 소개 - - - Please perform the following steps to set up key file authentication: - 키 파일 인증을 설정하기 위해 다음 단계들을 실행하세요: - - - 1) Create a key pair on the master computer. - 1) 마스터 컴퓨터에서 키페어를 생성하시오. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) 다른 컴퓨터에 접근을 허용할 멤버가 속한 그룹을 설정하세요. - - - 3) Export the public key and import it on all client computers with the same name. - 3) 공개키를 내보내고 그키를 같은 이름을 가진 모든 클라이언트 컴퓨터에서 읽어들이기. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - 더 자세한 정보는 <a href="https://veyon.readthedocs.io/en/latest/admin/index.html"> Veyon 관리자 매뉴얼을 참조하세요 </a> . - - - Key file directories - 키 파일 폴더 - - - Public key file base directory - 공개 키 화일 기본 폴더 - - - Private key file base directory - 개인 키 화일 기본 폴더 - - - ... - ... - - - Available authentication keys - 사용 가능한 인증키들 - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - 인증 키는 두 부분으로 구성되어 있습니다, 공개 키 파트와 개인 키 파트. -개인 키를 사용하여 마스터 컴퓨터에서 클라이언트 컴퓨터에 접속할 수 있습니다. -오직 승인된 사용자만 개인 키 화일을 읽을 수 있도록 하는 것이 아주 중요합니다. -공개 키 파트는 클라이언트 컴퓨터에서 사용되며 들어오는 연결 요청이 허가된 것인지 검증하는데 사용됩니다. - - - Create key pair - 키 페어 생성 - - - Delete key - 키 삭제 - - - Import key - 키 불러오기 - - - Export key - 키 내보내기 - - - Set access group - 접근 그룹 설정 + @@ -765,7 +667,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -791,7 +693,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -799,11 +701,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -814,7 +716,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -872,7 +774,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + @@ -906,7 +808,7 @@ The public key is used on client computers to authenticate incoming connection r Simple password - + @@ -924,7 +826,7 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPageTab Enabled - + Test @@ -1291,11 +1193,11 @@ The public key is used on client computers to authenticate incoming connection r [no user] - + Veyon Server unreachable or not running - + @@ -1330,14 +1232,14 @@ The public key is used on client computers to authenticate incoming connection r Active connections: - + ComputerGroupSelector Group %1 - + @@ -1379,27 +1281,23 @@ The public key is used on client computers to authenticate incoming connection r Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - 컴퓨터 관리 - Computer search 컴퓨터 검색 @@ -1429,6 +1327,17 @@ The public key is used on client computers to authenticate incoming connection r 컴퓨터와 사용자 리스트를 %1에 저장하지 못함. 접근 권한을 확인하세요. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1528,7 +1437,7 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Service. - + @@ -1560,10 +1469,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit 메모리 한계 - - Use multithreading (experimental) - 멀티쓰레딩 사용(개발중임) - MB MB @@ -1601,59 +1506,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1853,11 +1758,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Default source directory - + Options @@ -1865,11 +1770,11 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + @@ -1978,10 +1883,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory 로그 화일 폴더 - - ... - ... - Log level 로그 수준 @@ -2078,21 +1979,12 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system 운영체계의 로깅시스템에 기록 + + + HeadlessVncServer - Authentication - 인증 - - - Method: - 방법: - - - Test - 테스트 - - - Configure - 설정 + Headless VNC server + @@ -2345,7 +2237,7 @@ The public key is used on client computers to authenticate incoming connection r Computer groups filter - + Computer locations identification @@ -2357,11 +2249,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2867,7 +2759,7 @@ The public key is used on client computers to authenticate incoming connection r Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2875,54 +2767,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP bind - - - - - LicensingConfigurationPage - - Licensing - Licensing - - - Installed licenses - 설치된 라이센스 - - - Add new network range - 새로운 네트워크 범위 추가 - - - Remove selected network range - 선택된 네트워크 범위 삭제 - - - ID - ID - - - Valid until - 다음 기간동안 유효함 - - - Licensee - 사용권자 - - - Information - 정보 - - - Installation ID - 설치 ID - - - Addons available for licensing - 라이센싱 가능한 애드온들 - - - Addon - 애드온 + @@ -3119,10 +2964,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers 사용자 또는 컴퓨터 검색 - - Adjust optimal size - 최적 크기로 조정 - Align computers to grid 컴퓨터를 그리드에 맞춤 @@ -3172,16 +3013,16 @@ The public key is used on client computers to authenticate incoming connection r 인증 - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3190,10 +3031,6 @@ The public key is used on client computers to authenticate incoming connection r Directories 디렉토리 - - ... - ... - User configuration 사용자 설정 @@ -3326,41 +3163,41 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location 자동으로 현재 위치를 선택 - - Automatically adjust computer thumbnail size - 컴퓨터 썸네일 사진 크기를 자동조정 - Automatically open computer select panel 컴퓨터 선택 패너을 자동으로 열기 Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto 자동 + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3378,97 +3215,6 @@ The public key is used on client computers to authenticate incoming connection r 이모드는 하나 또는 많은 위치에 있는 모든 컴퓨터들의 모니터를 가능하게 합니다. - - NetworkDiscoveryConfigurationPage - - Network discovery - 네트워크 발견 - - - Mode - 모드 - - - Scan network ranges - 네트워크 범위 검색 - - - e.g. 192.168.1.0/24 - e.g. 192.168.1.0/24 - - - Scan all subnets of computer - 컴퓨터의 모든 서브넷 검색 - - - Scan custom subnet - 사용자 서브넷 검색 - - - Scan sessions on local computer - 로컬 컴퓨터 스캔 세션 - - - Test - 테스트 - - - Network ranges - 네트워크 범위 - - - Add new group - 새 그룹 추가 - - - Remove selected group - 선택된 그룹 삭제 - - - Groups - 그룹 - - - First address - 첫번째 주소 - - - Last address - 마지막 주소 - - - Add new network range - 새로운 네트워크 범위 추가 - - - Remove selected network range - 선택된 네트워크 범위 삭제 - - - Parallel scans - 병행 스캔 - - - Scan timeout - 시간 시간 초과 - - - ms - ms - - - Session scan limit - 세션 스캔 제한 - - - Options - 옵션 - - - Reverse lookup discovered IP addresses to host names - 발견된 IP 주소를 호스트 이름으로 검색하기 - - NetworkObjectTreeModel @@ -3507,11 +3253,11 @@ The public key is used on client computers to authenticate incoming connection r PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3519,23 +3265,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3695,7 +3441,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3706,7 +3452,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + @@ -3827,15 +3573,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3854,7 +3600,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3919,11 +3665,11 @@ Please save your work and close all programs. Screenshot - 화면캡쳐 + 화면캡쳐 Do you really want to delete all selected screenshots? - + @@ -3956,14 +3702,6 @@ Please save your work and close all programs. State: 상태: - - Network - 네트워크 - - - Demo server port - 데모 서버 포트 - Enable firewall exception 방화벽 예외 적용 활성화 @@ -3972,10 +3710,6 @@ Please save your work and close all programs. Allow connections from localhost only 로컬 호스트 연결만 허용함 - - Internal VNC server port - 내부 VNC server 포트 - VNC server VNC server @@ -3996,14 +3730,6 @@ Please save your work and close all programs. Running 실행중 - - Feature manager port - 속성 관리 포트 - - - Primary service port - 주 서비스 포트 - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4014,45 +3740,41 @@ Typically this is required to support terminal servers. Show notification on remote connection 원격 연결이면 알림 보이기 - - Multi session mode (for terminal and remote desktop servers) - 멀티세션 모드 (터미널 또는 원격 데스크탑 서버용) - Show notification when an unauthorized access is blocked 허가되지 않은 접속이 차단되었을때 알려줌 Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4060,7 +3782,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4152,50 +3874,51 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4283,6 +4006,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer 윈도8 또는 상위버전에서 데스크탑 복제엔진 활성화 + + Maximum CPU usage + + UserConfig @@ -4489,11 +4216,11 @@ Typically this is required to support terminal servers. Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4553,7 +4280,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_lt.ts b/translations/veyon_lt.ts index 7b4e0ac4b..80f6a84cf 100644 --- a/translations/veyon_lt.ts +++ b/translations/veyon_lt.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -81,10 +79,6 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p All groups Visos grupės - - ... - ... - Access control rules Prieigos valdymas @@ -266,7 +260,7 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p Authenticated via method - + Autorizuotas panaudojant: @@ -324,98 +318,6 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p Autorizavimo metodas - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Pagrindinis - - - - AuthKeysConfigurationDialog - - Authentication keys - Prieigos raktai - - - Introduction - Įvadas - - - Please perform the following steps to set up key file authentication: - Atlikite šiuos veiksmus, kad nustatytumėte prieigą naudojant rakto failą - - - 1) Create a key pair on the master computer. - 1) Sukurkite raktų porą pagrindiniame kompiuteryje - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Nustatykite prieigos grupę, kurios nariams bus leista pasiekti kitus kompiuterius. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Eksportuokite viešajį raktą ir importuokite visuose klientų kompiuteriuose naudojant tą patį vardą. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Daugiau informacijos galite rasti <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administratoriaus Instrukcijoje</a> - - - Key file directories - Direktorija raktų failams - - - Public key file base directory - Katalogas kuriame saugomas viešas raktas - - - Private key file base directory - Katalogas kuriame saugomas privatus raktas - - - ... - ... - - - Available authentication keys - Galimi autorizavimo raktai - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Autorizavimo raktų pora susideda iš dviejų kriptografinių raktų privataus ir viešojo. -Privatus raktas leidžia pagrindiniam kompiuteriui pasiekti klientų kompiuterius -Svarbu, kad tik autorizuoti vartotojai turetų prieigą prie privataus rakto failo -Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio užklausą. - - - Create key pair - Sukurti raktų porą - - - Delete key - Ištrinti raktą - - - Import key - Importuoti raktą - - - Export key - Eksportuoti raktą - - - Set access group - Nustatyti prieigos grupę - - AuthKeysConfigurationWidget @@ -790,7 +692,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u AuthLdapConfigurationWidget LDAP authentication - + LDAP autorizavimas General @@ -798,11 +700,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -813,7 +715,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -871,7 +773,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Logon - + Prisijungimas @@ -905,7 +807,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Simple password - + Slaptažodis @@ -923,7 +825,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u AuthenticationPageTab Enabled - + Įgalintas Test @@ -1290,11 +1192,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u [no user] - + [vartotojo nėra] Veyon Server unreachable or not running - + Veyon Serveris nepasiekiamas ar nepaleistas @@ -1351,7 +1253,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed @@ -1363,7 +1265,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1382,7 +1284,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Unselect all - + Atžymėti visus Add to group @@ -1395,10 +1297,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u ComputerSelectPanel - - Computer management - Kompiuterio valdymas - Computer search Kompiuterio paieška @@ -1425,18 +1323,29 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not write the computer and users list to %1! Please check the file access permissions. - + + + + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file @@ -1448,23 +1357,23 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! @@ -1472,7 +1381,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please specify a valid filename for the configuration export. - + Output file is not writable! @@ -1488,7 +1397,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Specified key does not exist in current configuration! - + Please specify a valid value. @@ -1500,34 +1409,34 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1559,10 +1468,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Memory limit Atminties riba - - Use multithreading (experimental) - Naudoti daugiasluoksniavimą (eksperimentinis) - MB MB @@ -1596,63 +1501,63 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Demonstracija Share your screen or allow a user to share his screen with other users. - + Dalintis savo ekranu, ar leisti vartotojui dalintis savo ekranu su kitais vartotojais. Full screen demo - + Pilno ekrano demonstracija. Share your own screen in fullscreen mode - + Dalintis savo ekranu pilno ekrano režime. In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Šiame režime jūsų ekranas rodomas visiems kompiuteriams pilnojo ekrano režimu. Visuose kompiuteriuose įvesties įrenginiai yra užblokuoti. Share your own screen in a window - + Dalintis savo ekranu lange. Share selected user's screen in fullscreen mode - + Dalintis pasirinkto vartotojo ekranu pilnojo ekrano režime In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Šiame režime bus rodomas pasirinkto vartotojo ekranas visiems vartotojams pilnojo ekrano režimu. Visuose kompiuteriuose įvesties įrenginiai yra užblokuoti. Share selected user's screen in a window - + Dalintis pasirinkto vartotojo ekranu lange. In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Pasirinkite vartotoją kurio ekranu dalinsitės Please select only one user screen to share. - + Pasirinkite tik vieną vartotoją kurio ekranu dalinsitės All screens - + Visi ekranai Screen %1 [%2] - + @@ -1852,11 +1757,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Destination directory - + Default source directory - + Options @@ -1864,11 +1769,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Remember last source directory - + Create destination directory if it does not exist - + @@ -1977,10 +1882,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Log file directory Įvykių žurnalo direktorija - - ... - ... - Log level Įvykių žurnalo lygmuo @@ -2077,21 +1978,12 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Write to logging system of operating system Įrašyti į operacinės sistemos įvykių žurnalą + + + HeadlessVncServer - Authentication - Autorizavimas - - - Method: - Metodas: - - - Test - Testuoti - - - Configure - Konfigūruoti + Headless VNC server + @@ -2118,7 +2010,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed @@ -2128,7 +2020,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful @@ -2146,7 +2038,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2156,7 +2048,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2166,7 +2058,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2204,7 +2096,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u computer group tree - + Computer group tree @@ -2232,7 +2124,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects @@ -2248,15 +2140,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses @@ -2268,7 +2160,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u computer locations - + Computer location attribute @@ -2296,7 +2188,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u computer containers - + groups of user @@ -2308,7 +2200,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer @@ -2320,7 +2212,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed @@ -2328,19 +2220,19 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups @@ -2348,11 +2240,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2362,7 +2254,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2370,17 +2262,17 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and @@ -2388,31 +2280,31 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2459,7 +2351,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext @@ -2511,11 +2403,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute @@ -2527,7 +2419,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. uid or sAMAccountName - + Advanced settings @@ -2575,7 +2467,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter a user login name (wildcards allowed) which to query: - + Enter group name @@ -2599,7 +2491,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter a user login name whose group memberships to query: - + Enter computer IP address @@ -2611,7 +2503,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u (only if different from group tree) - + Computer group tree @@ -2623,7 +2515,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. room or computerLab - + Integration tests @@ -2635,15 +2527,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security @@ -2679,23 +2571,23 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) @@ -2723,19 +2615,19 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations @@ -2743,19 +2635,19 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name @@ -2763,7 +2655,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter the name of a location whose entries to query: - + Browse @@ -2775,15 +2667,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname @@ -2791,7 +2683,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter a computer hostname whose group memberships to query: - + User login name attribute @@ -2799,18 +2691,18 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2818,39 +2710,39 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2858,54 +2750,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + @@ -2916,7 +2761,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Custom PAM service for user authentication - + User authentication @@ -2928,14 +2773,14 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + @@ -2946,7 +2791,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u enter search filter... - + @@ -2957,11 +2802,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Disable balloon tooltips - + Show icons only - + @@ -3040,7 +2885,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Master - + Access control @@ -3052,7 +2897,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Auto - + About @@ -3060,15 +2905,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3076,7 +2921,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3088,7 +2933,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration @@ -3096,35 +2941,31 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers Ieškoti naudotojų bei kompiuterių - - Adjust optimal size - - Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file @@ -3136,15 +2977,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers @@ -3155,16 +2996,16 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Autorizavimas - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3173,17 +3014,13 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Directories Katalogai - - ... - ... - User configuration Naudotojo konfigūravimas Feature on computer double click: - + Features @@ -3203,7 +3040,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u <no feature> - + Basic settings @@ -3219,15 +3056,15 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface @@ -3247,11 +3084,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Program start - + Modes and features - + User and computer name @@ -3291,7 +3128,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Allow adding hidden locations manually - + Hide empty locations @@ -3307,149 +3144,58 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + - Thumbnail aspect ratio - + Auto + - Auto - + Thumbnail aspect ratio + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Testuoti - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - ms - - - Session scan limit - - - - Options - Nustatymai - - - Reverse lookup discovered IP addresses to host names - + @@ -3471,7 +3217,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Remember and add to website menu - + e.g. www.veyon.io @@ -3479,7 +3225,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter the URL of the website to open: - + Name: @@ -3490,11 +3236,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3502,23 +3248,23 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3529,7 +3275,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3545,7 +3291,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer @@ -3565,11 +3311,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS @@ -3585,11 +3331,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now @@ -3601,21 +3347,21 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3626,7 +3372,7 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes @@ -3645,7 +3391,7 @@ Please save your work and close all programs. Open a remote view for a computer without interaction. - + Remote control @@ -3653,7 +3399,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Remote access @@ -3665,7 +3411,7 @@ Please save your work and close all programs. Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3676,18 +3422,18 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 - %3 Remote Access - + @@ -3702,7 +3448,7 @@ Please save your work and close all programs. Send shortcut - + Fullscreen @@ -3765,7 +3511,7 @@ Please save your work and close all programs. RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3781,7 +3527,7 @@ Please save your work and close all programs. Remember and add to program menu - + e.g. VLC @@ -3804,19 +3550,19 @@ Please save your work and close all programs. To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3827,7 +3573,7 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3835,7 +3581,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3846,19 +3592,19 @@ Please save your work and close all programs. Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3872,7 +3618,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3900,11 +3646,11 @@ Please save your work and close all programs. Screenshot - Ekrano vaizdas + Ekrano nuotrauka Do you really want to delete all selected screenshots? - + @@ -3937,14 +3683,6 @@ Please save your work and close all programs. State: Būsena: - - Network - Tinklas - - - Demo server port - Prezaentacinio serverio šliuzas - Enable firewall exception Įjungti ugnesienės išimtį @@ -3953,10 +3691,6 @@ Please save your work and close all programs. Allow connections from localhost only Leisti prisijungimus tik vietiniam tinkle - - Internal VNC server port - Vidinio VNC serverio prievadas - VNC server VNC serveris @@ -3977,54 +3711,42 @@ Please save your work and close all programs. Running Veikia - - Feature manager port - Funkcijų valdymo prievadas - - - Primary service port - Pagrindinės tarnybos šliuzas - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection Rodyti pranešimą nuotoliniame kompiuteryje - - Multi session mode (for terminal and remote desktop servers) - Daugelio sesijų darbo rėžimas (naudojant terminalą ir remote desktop serverius) - Show notification when an unauthorized access is blocked Rodyti pranešimą, kai neautorizuota prieiga užblokuota Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server @@ -4040,7 +3762,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4106,7 +3828,7 @@ Typically this is required to support terminal servers. Commands for configuring and controlling Veyon Service - + @@ -4132,50 +3854,51 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4189,7 +3912,7 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) @@ -4263,6 +3986,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer Įgalinti darbalaukio dubliavimo variklį Windows 8 ar naujesnėje versijoje + + Maximum CPU usage + + UserConfig @@ -4302,7 +4029,7 @@ Typically this is required to support terminal servers. Click this button to log in a specific user on all computers. - + Log off @@ -4465,15 +4192,15 @@ Typically this is required to support terminal servers. Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4536,4 +4263,4 @@ Typically this is required to support terminal servers. Veyon Master - + \ No newline at end of file diff --git a/translations/veyon_lv.ts b/translations/veyon_lv.ts index c3a16a58f..55e1265c2 100644 --- a/translations/veyon_lv.ts +++ b/translations/veyon_lv.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l All groups Visas grupas - - ... - ... - Access control rules Piekļuves kontroles noteikumi @@ -132,27 +126,27 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l The specified user is not allowed to access computers with this configuration. - + Enable usage of domain groups - + User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups - + @@ -183,7 +177,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Invert all conditions ("is/has" interpreted as "is/has not") - + Conditions @@ -195,19 +189,19 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Accessing computer is localhost - + Accessing user is logged on user - + Accessing user is already connected - + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Action @@ -247,7 +241,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Always process rule and ignore conditions - + No user logged on @@ -255,19 +249,19 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Accessing user has one or more groups in common with local (logged on) user - + Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + @@ -290,7 +284,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Please enter the following user and computer information in order to test the configured ruleset. - + Local user: @@ -310,7 +304,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l The access in the given scenario needs permission of the logged on user. - + ERROR: Unknown action @@ -322,96 +316,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - - - - General - Vispārīgi - - - - AuthKeysConfigurationDialog - - Authentication keys - Autorizācijas atslēga - - - Introduction - Ievads - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - Atslēgfaila mapes - - - Public key file base directory - Publisko atslēgfailu atrašanās mape - - - Private key file base directory - Privāto atslēgfailu atrašanās mape - - - ... - ... - - - Available authentication keys - Pieejamās autentifikācijas atslēgas - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - Izveidot atslēgu - - - Delete key - Dzēst atslēgu - - - Import key - Iegult atslēgu - - - Export key - Izgult atslēgu - - - Set access group - Veidot piekļuves grupu + @@ -426,23 +331,23 @@ The public key is used on client computers to authenticate incoming connection r Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -465,7 +370,7 @@ The public key is used on client computers to authenticate incoming connection r A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair @@ -497,11 +402,11 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? - + Please select a key to delete! @@ -509,7 +414,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -517,11 +422,11 @@ The public key is used on client computers to authenticate incoming connection r Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + @@ -532,43 +437,43 @@ The public key is used on client computers to authenticate incoming connection r Key name contains invalid characters! - + Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" - + Failed to create public or private key! - + Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. @@ -580,7 +485,7 @@ The public key is used on client computers to authenticate incoming connection r Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. @@ -588,11 +493,11 @@ The public key is used on client computers to authenticate incoming connection r File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. @@ -608,47 +513,47 @@ The public key is used on client computers to authenticate incoming connection r Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> @@ -663,7 +568,7 @@ The public key is used on client computers to authenticate incoming connection r AuthKeysPlugin Create new authentication key pair - + Delete authentication key @@ -671,23 +576,23 @@ The public key is used on client computers to authenticate incoming connection r List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY @@ -699,7 +604,7 @@ The public key is used on client computers to authenticate incoming connection r This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME @@ -711,19 +616,19 @@ The public key is used on client computers to authenticate incoming connection r This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE @@ -735,31 +640,31 @@ The public key is used on client computers to authenticate incoming connection r Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -785,7 +690,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -793,22 +698,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -824,18 +729,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -851,33 +756,33 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error @@ -885,40 +790,40 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -961,27 +866,27 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + @@ -992,15 +897,15 @@ The public key is used on client computers to authenticate incoming connection r Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1028,19 +933,19 @@ The public key is used on client computers to authenticate incoming connection r Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None @@ -1064,23 +969,23 @@ The public key is used on client computers to authenticate incoming connection r Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID @@ -1092,35 +997,35 @@ The public key is used on client computers to authenticate incoming connection r Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE @@ -1128,47 +1033,47 @@ The public key is used on client computers to authenticate incoming connection r LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1180,47 +1085,47 @@ The public key is used on client computers to authenticate incoming connection r PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS @@ -1231,14 +1136,14 @@ The public key is used on client computers to authenticate incoming connection r BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + BuiltinX11VncServer Builtin VNC server (x11vnc) - + @@ -1261,11 +1166,11 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off - + Authentication failed or access denied - + Disconnected @@ -1277,26 +1182,26 @@ The public key is used on client computers to authenticate incoming connection r Logged on user: %1 - + Location: %1 - + [no user] - + Veyon Server unreachable or not running - + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1308,30 +1213,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1342,23 +1247,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1369,38 +1274,34 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - Datora pārvaldība - Computer search Datora meklēšana Add location - + Save computer/user list @@ -1420,109 +1321,120 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. - + + + + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1548,16 +1460,12 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit Atmiņas limits - - Use multithreading (experimental) - - MB MB @@ -1572,7 +1480,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1591,97 +1499,97 @@ The public key is used on client computers to authenticate incoming connection r In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + DesktopAccessDialog Desktop access dialog - + Confirm desktop access - + Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1701,11 +1609,11 @@ The public key is used on client computers to authenticate incoming connection r Predefined websites - + Remove selected website - + URL @@ -1713,18 +1621,18 @@ The public key is used on client computers to authenticate incoming connection r New program - + New website - + DesktopServicesFeaturePlugin Run program - + Open website @@ -1732,15 +1640,15 @@ The public key is used on client computers to authenticate incoming connection r Click this button to open a website on all computers. - + Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" @@ -1748,80 +1656,80 @@ The public key is used on client computers to authenticate incoming connection r Custom program - + Open website "%1" - + Custom website - + DocumentationFigureCreator Teacher - + Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: - + Password: @@ -1832,14 +1740,14 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories @@ -1847,11 +1755,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Default source directory - + Options @@ -1859,25 +1767,25 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options @@ -1885,72 +1793,72 @@ The public key is used on client computers to authenticate incoming connection r Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + GeneralConfigurationPage User interface - + Language: @@ -1958,7 +1866,7 @@ The public key is used on client computers to authenticate incoming connection r Use system language setting - + Veyon @@ -1972,37 +1880,33 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Žurnālfaila mape - - ... - ... - Log level - + Nothing - + Only critical messages - + Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size @@ -2010,23 +1914,23 @@ The public key is used on client computers to authenticate incoming connection r Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: - + %1 service @@ -2034,15 +1938,15 @@ The public key is used on client computers to authenticate incoming connection r The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error @@ -2050,7 +1954,7 @@ The public key is used on client computers to authenticate incoming connection r Could not remove all log files. - + MB @@ -2058,7 +1962,7 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x @@ -2070,147 +1974,138 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - - - - Authentication - Autentifikācija - - - Method: - - - - Test - Tests + + + + HeadlessVncServer - Configure - + Headless VNC server + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members @@ -2218,7 +2113,7 @@ The public key is used on client computers to authenticate incoming connection r Group member attribute - + Group not found @@ -2226,51 +2121,51 @@ The public key is used on client computers to authenticate incoming connection r Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users @@ -2290,11 +2185,11 @@ The public key is used on client computers to authenticate incoming connection r computer containers - + groups of user - + User not found @@ -2302,118 +2197,118 @@ The public key is used on client computers to authenticate incoming connection r Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + LdapConfigurationPage Basic settings - + General @@ -2421,147 +2316,147 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2569,7 +2464,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name @@ -2577,7 +2472,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter a group name whose members to query: - + Enter computer name @@ -2585,43 +2480,43 @@ The public key is used on client computers to authenticate incoming connection r Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups @@ -2629,23 +2524,23 @@ The public key is used on client computers to authenticate incoming connection r e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults @@ -2653,11 +2548,11 @@ The public key is used on client computers to authenticate incoming connection r Never (insecure!) - + Custom CA certificate file - + None @@ -2665,103 +2560,103 @@ The public key is used on client computers to authenticate incoming connection r TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2769,42 +2664,42 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command @@ -2812,131 +2707,84 @@ The public key is used on client computers to authenticate incoming connection r Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... @@ -2947,26 +2795,26 @@ The public key is used on client computers to authenticate incoming connection r MainToolBar Configuration - + Disable balloon tooltips - + Show icons only - + MainWindow MainWindow - + toolBar - + General @@ -2994,7 +2842,7 @@ The public key is used on client computers to authenticate incoming connection r L&oad settings from file - + Ctrl+O @@ -3002,31 +2850,31 @@ The public key is used on client computers to authenticate incoming connection r About Qt - + Configuration not writable - + Load settings from file - + Save settings to file - + Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service @@ -3034,11 +2882,11 @@ The public key is used on client computers to authenticate incoming connection r Master - + Access control - + About Veyon @@ -3046,7 +2894,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3054,15 +2902,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) - + The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3070,7 +2918,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3078,27 +2926,23 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration - + Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - - - - Adjust optimal size - Pielāgot labākajam izmēram + Align computers to grid @@ -3106,59 +2950,59 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication Autentifikācija - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3167,17 +3011,13 @@ The public key is used on client computers to authenticate incoming connection r Directories Mapes - - ... - ... - User configuration - + Feature on computer double click: - + Features @@ -3201,39 +3041,39 @@ The public key is used on client computers to authenticate incoming connection r Basic settings - + Behaviour - + Enforce selected mode for client computers - + Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface - + Background color - + Thumbnail update interval - + ms @@ -3241,216 +3081,125 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + - Thumbnail aspect ratio - + Auto + - Auto - + Thumbnail aspect ratio + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Tests - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - ms - - - Session scan limit - - - - Options - Iespējas - - - Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3461,34 +3210,34 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3496,23 +3245,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3523,7 +3272,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot @@ -3531,7 +3280,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to reboot all computers. - + Power down @@ -3539,7 +3288,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer @@ -3563,7 +3312,7 @@ The public key is used on client computers to authenticate incoming connection r Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS @@ -3571,45 +3320,45 @@ The public key is used on client computers to authenticate incoming connection r This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3620,15 +3369,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3655,11 +3404,11 @@ Please save your work and close all programs. Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command @@ -3670,7 +3419,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3681,7 +3430,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + @@ -3752,14 +3501,14 @@ Please save your work and close all programs. Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3767,19 +3516,19 @@ Please save your work and close all programs. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3794,23 +3543,23 @@ Please save your work and close all programs. Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3821,7 +3570,7 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3829,7 +3578,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3866,7 +3615,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3894,11 +3643,11 @@ Please save your work and close all programs. Screenshot - Ekrānšāviņš + Ekrānšāviņš Do you really want to delete all selected screenshots? - + @@ -3929,15 +3678,7 @@ Please save your work and close all programs. State: - - - - Network - Tīkls - - - Demo server port - Demonstrējuma servera ports + Enable firewall exception @@ -3945,11 +3686,7 @@ Please save your work and close all programs. Allow connections from localhost only - - - - Internal VNC server port - Iekšējais VNC servera ports + VNC server @@ -3965,68 +3702,56 @@ Please save your work and close all programs. All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running Darbojas - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - - - - Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4034,7 +3759,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4072,7 +3797,7 @@ Typically this is required to support terminal servers. Configure and control Veyon service - + Register Veyon Service @@ -4096,11 +3821,11 @@ Typically this is required to support terminal servers. Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + @@ -4115,61 +3840,62 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4183,22 +3909,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4209,7 +3935,7 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + @@ -4220,7 +3946,7 @@ Typically this is required to support terminal servers. Use this function to send a text message to all users e.g. to assign them new tasks. - + Message from teacher @@ -4235,11 +3961,11 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) @@ -4247,15 +3973,19 @@ Typically this is required to support terminal servers. Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + + + + Maximum CPU usage + @@ -4266,18 +3996,18 @@ Typically this is required to support terminal servers. Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4292,31 +4022,31 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control - + @@ -4339,11 +4069,11 @@ Typically this is required to support terminal servers. Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! @@ -4355,7 +4085,7 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed @@ -4371,23 +4101,23 @@ Typically this is required to support terminal servers. USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + @@ -4408,14 +4138,14 @@ Typically this is required to support terminal servers. WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4423,111 +4153,111 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_mn.ts b/translations/veyon_mn.ts index fed29788d..49c6d6638 100644 --- a/translations/veyon_mn.ts +++ b/translations/veyon_mn.ts @@ -78,10 +78,6 @@ If you're interested in translating Veyon into your local or another langua All groups Бүх групп - - ... - ... - Access control rules @@ -321,95 +317,6 @@ If you're interested in translating Veyon into your local or another langua - - AndroidPlatformConfigurationPage - - Android - - - - General - Ерөнхий - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - - - - Public key file base directory - Нийтийн түлхүүрийг агуулсан сан - - - Private key file base directory - Хувийн түлхүүрийг агуулсан сан - - - ... - ... - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - - - - Delete key - - - - Import key - - - - Export key - - - - Set access group - - - AuthKeysConfigurationWidget @@ -1386,10 +1293,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - - Computer search @@ -1419,6 +1322,17 @@ The public key is used on client computers to authenticate incoming connection r + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1550,10 +1464,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit - - Use multithreading (experimental) - - MB @@ -1968,10 +1878,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Нэвтрэх файлын сан - - ... - ... - Log level Нэвтрэх түвшин @@ -2068,20 +1974,11 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system + + + HeadlessVncServer - Authentication - Баталгаажуулалт - - - Method: - - - - Test - Тест - - - Configure + Headless VNC server @@ -2851,53 +2748,6 @@ The public key is used on client computers to authenticate incoming connection r - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - - - LinuxPlatformConfigurationPage @@ -3092,10 +2942,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - - Adjust optimal size - - Align computers to grid @@ -3163,10 +3009,6 @@ The public key is used on client computers to authenticate incoming connection r Directories Каталоги - - ... - ... - User configuration @@ -3299,10 +3141,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location - - Automatically adjust computer thumbnail size - - Automatically open computer select panel @@ -3335,6 +3173,10 @@ The public key is used on client computers to authenticate incoming connection r Automatically adjust computer icon size + + Open feature windows on the same screen as the main window + + MonitoringMode @@ -3351,97 +3193,6 @@ The public key is used on client computers to authenticate incoming connection r - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Тест - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - - - NetworkObjectTreeModel @@ -3927,14 +3678,6 @@ Please save your work and close all programs. State: Төлөв: - - Network - Сүлжээ - - - Demo server port - Демо серверийн порт - Enable firewall exception Онцгой хамгаалалтыг идэвхжүүлэх @@ -3943,10 +3686,6 @@ Please save your work and close all programs. Allow connections from localhost only Зөвхөн дотоод холболтууддаа зөвшөөрөх - - Internal VNC server port - - VNC server @@ -3967,14 +3706,6 @@ Please save your work and close all programs. Running Ажиллуулах - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -3984,10 +3715,6 @@ Typically this is required to support terminal servers. Show notification on remote connection - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked @@ -4139,10 +3866,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers @@ -4167,6 +3890,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4253,6 +3981,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer + + Maximum CPU usage + + UserConfig diff --git a/translations/veyon_nl.ts b/translations/veyon_nl.ts index 10d52b4b5..88fbe5ec6 100644 --- a/translations/veyon_nl.ts +++ b/translations/veyon_nl.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an All groups Alle groepen - - ... - ... - Access control rules Toegangscontrole regels @@ -267,7 +261,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Authenticated via method - + @@ -322,96 +316,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Algemeen - - - - AuthKeysConfigurationDialog - - Authentication keys - Authenticatie sleutels - - - Introduction - Inleiding - - - Please perform the following steps to set up key file authentication: - Gelieve volgende stappen te volgen om sleutel authenticatie in te stellen: - - - 1) Create a key pair on the master computer. - 1) Maak een key pair op de master computer. - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - 3) Exporteer de publieke key en importeer deze op alle client computers met dezelfde naam. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - Sleutelbestand folder - - - Public key file base directory - Publieke sleutel basis bestands folder - - - Private key file base directory - Privé sleutel basis bestands folder - - - ... - ... - - - Available authentication keys - Beschikbare authenticatie sleutels - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - key pair aanmaken - - - Delete key - Verwijder key - - - Import key - Importeer key - - - Export key - Exporteer key - - - Set access group - Stel toegangsgroep in + @@ -434,7 +339,7 @@ The public key is used on client computers to authenticate incoming connection r 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. @@ -442,7 +347,7 @@ The public key is used on client computers to authenticate incoming connection r Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -465,7 +370,7 @@ The public key is used on client computers to authenticate incoming connection r A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair @@ -536,11 +441,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. @@ -564,7 +469,7 @@ The public key is used on client computers to authenticate incoming connection r Could not remove key file directory "%1"! - + Failed to create directory for output file. @@ -580,7 +485,7 @@ The public key is used on client computers to authenticate incoming connection r Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. @@ -604,11 +509,11 @@ The public key is used on client computers to authenticate incoming connection r Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key @@ -624,31 +529,31 @@ The public key is used on client computers to authenticate incoming connection r Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> @@ -663,7 +568,7 @@ The public key is used on client computers to authenticate incoming connection r AuthKeysPlugin Create new authentication key pair - + Delete authentication key @@ -671,7 +576,7 @@ The public key is used on client computers to authenticate incoming connection r List authentication keys - + Import public or private key @@ -683,11 +588,11 @@ The public key is used on client computers to authenticate incoming connection r Extract public key from existing private key - + Set user group allowed to access a key - + KEY @@ -699,7 +604,7 @@ The public key is used on client computers to authenticate incoming connection r This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME @@ -711,19 +616,19 @@ The public key is used on client computers to authenticate incoming connection r This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE @@ -735,23 +640,23 @@ The public key is used on client computers to authenticate incoming connection r Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -759,7 +664,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -785,7 +690,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget LDAP authentication - + General @@ -793,11 +698,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -808,7 +713,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -858,7 +763,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -866,7 +771,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + @@ -877,7 +782,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the Veyon password: - + Authentication error @@ -885,22 +790,22 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + @@ -911,14 +816,14 @@ The public key is used on client computers to authenticate incoming connection r Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -957,7 +862,7 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - + Locations & computers @@ -965,19 +870,19 @@ The public key is used on client computers to authenticate incoming connection r Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location @@ -988,7 +893,7 @@ The public key is used on client computers to authenticate incoming connection r BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file @@ -1000,7 +905,7 @@ The public key is used on client computers to authenticate incoming connection r Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1012,7 +917,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + MAC address @@ -1036,11 +941,11 @@ The public key is used on client computers to authenticate incoming connection r Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None @@ -1060,63 +965,63 @@ The public key is used on client computers to authenticate incoming connection r Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location @@ -1132,43 +1037,43 @@ The public key is used on client computers to authenticate incoming connection r FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1180,11 +1085,11 @@ The public key is used on client computers to authenticate incoming connection r PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room @@ -1192,15 +1097,15 @@ The public key is used on client computers to authenticate incoming connection r Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name @@ -1208,19 +1113,19 @@ The public key is used on client computers to authenticate incoming connection r Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS @@ -1249,7 +1154,7 @@ The public key is used on client computers to authenticate incoming connection r Active features: %1 - + Online and connected @@ -1281,15 +1186,15 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + [no user] - + Veyon Server unreachable or not running - + @@ -1308,30 +1213,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1350,15 +1255,15 @@ The public key is used on client computers to authenticate incoming connection r Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1373,34 +1278,30 @@ The public key is used on client computers to authenticate incoming connection r Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - Computer management - Computer search Computer zoeken Add location - + Save computer/user list @@ -1423,6 +1324,17 @@ The public key is used on client computers to authenticate incoming connection r Kon de computer en gebruikerslijst niet schrijven naar% 1! Controleer de toegangsrechten voor het bestand. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1455,7 +1367,7 @@ The public key is used on client computers to authenticate incoming connection r Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. @@ -1506,23 +1418,23 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1554,10 +1466,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit Geheugenlimiet - - Use multithreading (experimental) - Gebruik multithreading (experimenteel) - MB MB @@ -1572,7 +1480,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1595,59 +1503,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1681,7 +1589,7 @@ The public key is used on client computers to authenticate incoming connection r Predefined programs - + Name @@ -1701,7 +1609,7 @@ The public key is used on client computers to authenticate incoming connection r Predefined websites - + Remove selected website @@ -1767,11 +1675,11 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website @@ -1779,15 +1687,15 @@ The public key is used on client computers to authenticate incoming connection r Open file manager - + Start learning tool - + Play tutorial video - + Custom program @@ -1795,15 +1703,15 @@ The public key is used on client computers to authenticate incoming connection r Handout - + Texts to read - + generic-student-user - + @@ -1839,7 +1747,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferConfigurationPage File transfer - + Directories @@ -1847,65 +1755,65 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + @@ -1919,7 +1827,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. @@ -1931,19 +1839,19 @@ The public key is used on client computers to authenticate incoming connection r Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1972,10 +1880,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Logbestand map - - ... - ... - Log level Log niveau @@ -2070,30 +1974,21 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - - - - Authentication - Authenticatie - - - Method: - Methode: - - - Test - Test + + + + HeadlessVncServer - Configure - + Headless VNC server + LdapBrowseDialog Browse LDAP - + @@ -2125,7 +2020,7 @@ The public key is used on client computers to authenticate incoming connection r Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful @@ -2143,7 +2038,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2153,7 +2048,7 @@ The public key is used on client computers to authenticate incoming connection r The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2163,7 +2058,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2213,7 +2108,7 @@ The public key is used on client computers to authenticate incoming connection r User login name attribute - + group members @@ -2237,23 +2132,23 @@ The public key is used on client computers to authenticate incoming connection r Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses @@ -2265,15 +2160,15 @@ The public key is used on client computers to authenticate incoming connection r computer locations - + Computer location attribute - + Location name attribute - + users @@ -2293,7 +2188,7 @@ The public key is used on client computers to authenticate incoming connection r computer containers - + groups of user @@ -2305,7 +2200,7 @@ The public key is used on client computers to authenticate incoming connection r Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer @@ -2317,27 +2212,27 @@ The public key is used on client computers to authenticate incoming connection r Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups @@ -2345,11 +2240,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2359,7 +2254,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2371,21 +2266,21 @@ The public key is used on client computers to authenticate incoming connection r LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: @@ -2708,67 +2603,67 @@ The public key is used on client computers to authenticate incoming connection r Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2776,31 +2671,31 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + @@ -2823,90 +2718,43 @@ The public key is used on client computers to authenticate incoming connection r Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + @@ -2917,19 +2765,19 @@ The public key is used on client computers to authenticate incoming connection r Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + @@ -2943,7 +2791,7 @@ The public key is used on client computers to authenticate incoming connection r LocationDialog Select location - + enter search filter... @@ -3103,10 +2951,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers Zoek gebruikers en computers - - Adjust optimal size - Pas de optimale grootte aan - Align computers to grid Computers uitlijnen op rooster @@ -3121,7 +2965,7 @@ The public key is used on client computers to authenticate incoming connection r Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers @@ -3133,39 +2977,39 @@ The public key is used on client computers to authenticate incoming connection r &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication Authenticatie - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3174,10 +3018,6 @@ The public key is used on client computers to authenticate incoming connection r Directories Mappen - - ... - ... - User configuration Gebruikerconfiguratie @@ -3252,7 +3092,7 @@ The public key is used on client computers to authenticate incoming connection r Modes and features - + User and computer name @@ -3276,11 +3116,11 @@ The public key is used on client computers to authenticate incoming connection r Sort order - + Computer and user name - + Computer locations @@ -3288,63 +3128,63 @@ The public key is used on client computers to authenticate incoming connection r Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Auto + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3359,105 +3199,14 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Test - - - Network ranges - - - - Add new group - Nieuwe groep toevoegen - - - Remove selected group - Geselecteerde groep verwijderen - - - Groups - Groepen - - - First address - Eerste adres - - - Last address - Laatste adres - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - ms - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3468,15 +3217,15 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3484,18 +3233,18 @@ The public key is used on client computers to authenticate incoming connection r Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3503,23 +3252,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3570,7 +3319,7 @@ The public key is used on client computers to authenticate incoming connection r Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS @@ -3578,11 +3327,11 @@ The public key is used on client computers to authenticate incoming connection r This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! @@ -3590,7 +3339,7 @@ The public key is used on client computers to authenticate incoming connection r Commands for controlling power status of computers - + Power down now @@ -3602,7 +3351,7 @@ The public key is used on client computers to authenticate incoming connection r Power down after user confirmation - + Power down after timeout @@ -3610,13 +3359,13 @@ The public key is used on client computers to authenticate incoming connection r The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3627,15 +3376,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3677,7 +3426,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3688,7 +3437,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + @@ -3759,7 +3508,7 @@ Please save your work and close all programs. Exit - + @@ -3778,15 +3527,15 @@ Please save your work and close all programs. Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3809,15 +3558,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3836,7 +3585,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3901,11 +3650,11 @@ Please save your work and close all programs. Screenshot - Schermafbeelding + Schermafbeelding Do you really want to delete all selected screenshots? - + @@ -3938,14 +3687,6 @@ Please save your work and close all programs. State: Staat: - - Network - Netwerk - - - Demo server port - Demo server poort - Enable firewall exception Schakel firewall uitzondering in @@ -3954,10 +3695,6 @@ Please save your work and close all programs. Allow connections from localhost only Sta alleen verbindingen van localhost toe - - Internal VNC server port - Interne VNC server poort - VNC server VNC server @@ -3978,62 +3715,50 @@ Please save your work and close all programs. Running Gestart - - Feature manager port - Feature manager poort - - - Primary service port - Primaire service poort - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection Toon melding bij externe verbinding - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4041,7 +3766,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4060,11 +3785,11 @@ Typically this is required to support terminal servers. Unregistering service %1 - + Service control - + @@ -4114,7 +3839,7 @@ Typically this is required to support terminal servers. ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4122,61 +3847,62 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4190,22 +3916,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4258,11 +3984,15 @@ Typically this is required to support terminal servers. Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + + + + Maximum CPU usage + @@ -4280,11 +4010,11 @@ Typically this is required to support terminal servers. UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4299,27 +4029,27 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4362,39 +4092,39 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + @@ -4422,7 +4152,7 @@ Typically this is required to support terminal servers. WindowsPlatformConfigurationPage Windows - + General @@ -4434,47 +4164,47 @@ Typically this is required to support terminal servers. Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4488,31 +4218,31 @@ Typically this is required to support terminal servers. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + @@ -4534,7 +4264,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_no_NO.ts b/translations/veyon_no_NO.ts index a11119984..e136b6b63 100644 --- a/translations/veyon_no_NO.ts +++ b/translations/veyon_no_NO.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -21,7 +19,7 @@ Contributors - + Version: @@ -29,13 +27,13 @@ Website: - + Current language not translated yet (or native English). If you're interested in translating Veyon into your local or another language or want to improve an existing translation, please contact a Veyon developer! - + About %1 %2 @@ -43,18 +41,18 @@ If you're interested in translating Veyon into your local or another langua Support Veyon project with a donation - + AccessControlPage Computer access control - + Grant access to every authenticated user (default) - + Test @@ -62,102 +60,98 @@ If you're interested in translating Veyon into your local or another langua Process access control rules - + User groups authorized for computer access - + Please add the groups whose members should be authorized to access computers in your Veyon network. - + Authorized user groups - + All groups Alle grupper - - ... - ... - Access control rules - + Add access control rule - + Remove access control rule - + Move selected rule down - + Move selected rule up - + Edit selected rule - + Enter username - + Please enter a user login name whose access permissions to test: - + Access allowed - + The specified user is allowed to access computers with this configuration. - + Access denied - + The specified user is not allowed to access computers with this configuration. - + Enable usage of domain groups - + User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups - + AccessControlRuleEditDialog Edit access control rule - + General @@ -165,51 +159,51 @@ If you're interested in translating Veyon into your local or another langua enter a short name for the rule here - + Rule name: - + enter a description for the rule here - + Rule description: - + Invert all conditions ("is/has" interpreted as "is/has not") - + Conditions - + is member of group - + Accessing computer is localhost - + Accessing user is logged on user - + Accessing user is already connected - + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Action - + Allow access @@ -217,35 +211,35 @@ If you're interested in translating Veyon into your local or another langua Deny access - + Ask logged on user for permission - + None (rule disabled) - + Accessing user - + Accessing computer - + Local (logged on) user - + Local computer - + Always process rule and ignore conditions - + No user logged on @@ -253,42 +247,42 @@ If you're interested in translating Veyon into your local or another langua Accessing user has one or more groups in common with local (logged on) user - + Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + AccessControlRulesTestDialog Access control rules test - + Accessing user: - + Local computer: - + Accessing computer: - + Please enter the following user and computer information in order to test the configured ruleset. - + Local user: @@ -296,468 +290,379 @@ If you're interested in translating Veyon into your local or another langua Connected users: - + The access in the given scenario is allowed. - + The access in the given scenario is denied. - + The access in the given scenario needs permission of the logged on user. - + ERROR: Unknown action - + Test result - + Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - - - - General - Generelt - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - - - - Public key file base directory - - - - Private key file base directory - - - - ... - ... - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - - - - Delete key - - - - Import key - - - - Export key - - - - Set access group - + AuthKeysConfigurationWidget Authentication keys - + Introduction - + Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. - + 2) Set an access group whose members should be allowed to access other computers. - + 3) Export the public key and import it on all client computers with the same name. - + Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories - + Public key file base directory - + Private key file base directory - + Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Create key pair - + Delete key - + Import key - + Export key - + Set access group - + Key files (*.pem) - + Authentication key name - + Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? - + Please select a key to delete! - + Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! - + Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + AuthKeysManager Please check your permissions. - + Key name contains invalid characters! - + Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" - + Failed to create public or private key! - + Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! - + Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. - + Failed to write output file. - + Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. - + File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. - + Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> - + Failed to read key file. - + AuthKeysPlugin Create new authentication key pair - + Delete authentication key - + List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP - + This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication - + Key file - + @@ -768,22 +673,22 @@ The public key is used on client computers to authenticate incoming connection r Type - + Access group - + Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -791,132 +696,132 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username - + Password - + Authentication error - + Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username - + Password - + Authentication error - + Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication - + Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error - + Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -935,74 +840,74 @@ The public key is used on client computers to authenticate incoming connection r Host address/IP - + MAC address - + Add new computer - + Remove selected computer - + New computer - + Builtin directory - + Locations & computers - + Locations - + Add new location - + Remove selected location - + The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location - + BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type - + Name @@ -1010,219 +915,219 @@ The public key is used on client computers to authenticate incoming connection r Host address - + MAC address - + Specified object not found. - + File "%1" does not exist! - + Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None - + Computer - + Root - + Invalid - + Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" - + "Computer 01" - + HOST ADDRESS - + MAC ADDRESS - + @@ -1243,27 +1148,27 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected - + Establishing connection - + Computer offline or switched off - + Authentication failed or access denied - + Disconnected @@ -1279,57 +1184,57 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + [no user] - + Veyon Server unreachable or not running - + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error - + Remote access - + User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1340,23 +1245,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1367,46 +1272,42 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - - Computer search - + Add location - + Save computer/user list - + Select output filename - + CSV files (*.csv) @@ -1414,113 +1315,124 @@ The public key is used on client computers to authenticate incoming connection r File error - + Could not write the computer and users list to %1! Please check the file access permissions. - + + + + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1538,7 +1450,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms @@ -1546,15 +1458,11 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit - - - - Use multithreading (experimental) - + MB @@ -1562,7 +1470,7 @@ The public key is used on client computers to authenticate incoming connection r Update interval - + s @@ -1570,7 +1478,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1581,105 +1489,105 @@ The public key is used on client computers to authenticate incoming connection r Window demo - + Give a demonstration by screen broadcasting - + In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + DesktopAccessDialog Desktop access dialog - + Confirm desktop access - + Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + DesktopServicesConfigurationPage Programs & websites - + Predefined programs - + Name @@ -1687,46 +1595,46 @@ The public key is used on client computers to authenticate incoming connection r Path - + Add new program - + Remove selected program - + Predefined websites - + Remove selected website - + URL - + New program - + New website - + DesktopServicesFeaturePlugin Run program - + Open website - + Click this button to open a website on all computers. @@ -1734,27 +1642,27 @@ The public key is used on client computers to authenticate incoming connection r Start programs and services in user desktop - + Click this button to run a program on all computers. - + Run program "%1" - + Custom program - + Open website "%1" - + Custom website - + @@ -1765,57 +1673,57 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + Please complete all tasks within the next 5 minutes. - + Custom website - + Open file manager - + Start learning tool - + Play tutorial video - + Custom program - + Handout - + Texts to read - + generic-student-user - + ExternalVncServer External VNC server - + ExternalVncServerConfigurationWidget External VNC server configuration - + Port: @@ -1830,125 +1738,125 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + FileTransferConfigurationPage File transfer - + Directories - + Destination directory - + Default source directory - + Options - + Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + FileTransferDialog File transfer - + Options - + Transfer only - + Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files - + Start - + Overwrite existing files - + FileTransferFileDialog Select one or more files to transfer - + FileTransferPlugin File transfer - + Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + GeneralConfigurationPage User interface - + Language: @@ -1956,7 +1864,7 @@ The public key is used on client computers to authenticate incoming connection r Use system language setting - + Veyon @@ -1964,91 +1872,87 @@ The public key is used on client computers to authenticate incoming connection r Logging - + Log file directory - - - - ... - ... + Log level - + Nothing - + Only critical messages - + Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB @@ -2056,7 +1960,7 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x @@ -2068,207 +1972,198 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - - - - Authentication - - - - Method: - - - - Test - Test + + + + HeadlessVncServer - Configure - + Headless VNC server + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed - + Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful - + The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members - + Group member attribute - + Group not found - + Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users @@ -2276,7 +2171,7 @@ The public key is used on client computers to authenticate incoming connection r user groups - + computers @@ -2284,134 +2179,134 @@ The public key is used on client computers to authenticate incoming connection r computer groups - + computer containers - + groups of user - + User not found - + Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed - + Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful - + The %1 has been queried successfully and %2 entries were found. - + LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + LdapConfigurationPage Basic settings - + General @@ -2419,347 +2314,347 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org - + Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users - + e.g. OU=Computers - + Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings - + Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username - + Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None - + TLS - + SSL - + e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2767,204 +2662,157 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command - + Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + LocationDialog Select location - + enter search filter... - + MainToolBar Configuration - + Disable balloon tooltips - + Show icons only - + MainWindow MainWindow - + toolBar - + General @@ -2992,7 +2840,7 @@ The public key is used on client computers to authenticate incoming connection r L&oad settings from file - + Ctrl+O @@ -3000,43 +2848,43 @@ The public key is used on client computers to authenticate incoming connection r About Qt - + Configuration not writable - + Load settings from file - + Save settings to file - + Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator - + Service - + Master - + Access control - + About Veyon @@ -3052,7 +2900,7 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) @@ -3060,15 +2908,15 @@ The public key is used on client computers to authenticate incoming connection r The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied - + According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3076,118 +2924,110 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. - + Reset configuration - + Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - - - - Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges - + Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication - + - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + MasterConfigurationPage Directories - - - - ... - ... + User configuration - + Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3195,43 +3035,43 @@ The public key is used on client computers to authenticate incoming connection r <no feature> - + Basic settings - + Behaviour - + Enforce selected mode for client computers - + Hide local computer - + Hide computer filter field - + Actions such as rebooting or powering down computers - + User interface - + Background color - + Thumbnail update interval - + ms @@ -3239,254 +3079,163 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Auto + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + MonitoringMode Monitoring - + Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Test - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - ms - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + OpenWebsiteDialog Open website - + e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: - + Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3494,363 +3243,363 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + PowerControlFeaturePlugin Power on - + Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Reboot - + Click this button to reboot all computers. - + Power down - + Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Power on/down or reboot a computer - + Confirm reboot - + Confirm power down - + Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? - + Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + PowerDownTimeInputDialog Power down - + Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + RemoteAccessFeaturePlugin Remote view - + Open a remote view for a computer without interaction. - + Remote control - + Open a remote control window for a computer. - + Remote access - + Remote view or control a computer - + Please enter the hostname or IP address of the computer to access: - + Show help about command - + RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 - %3 Remote Access - + RemoteAccessWidgetToolBar View only - + Remote control - + Send shortcut - + Fullscreen - + Window - + Ctrl+Alt+Del - + Ctrl+Esc - + Alt+Tab - + Alt+F4 - + Win+Tab - + Win - + Menu - + Alt+Ctrl+F1 - + Connecting %1 - + Connected. - + Screenshot - + Exit - + RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + Name: - + Remember and add to program menu - + e.g. VLC - + ScreenLockFeaturePlugin Lock - + Unlock - + Lock screen and input devices of a computer - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Screenshot unknown - + Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot - + Could not open screenshot file %1 for writing. - + ScreenshotFeaturePlugin Screenshot - + Use this function to take a screenshot of selected computers. - + Screenshots taken - + Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3864,39 +3613,39 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: - + Computer: - + Date: - + Time: - + Show - + Delete - + Screenshot - + Do you really want to delete all selected screenshots? - + @@ -3907,124 +3656,100 @@ Please save your work and close all programs. Autostart - + Hide tray icon - + Start service - + Stopped - + Stop service - + State: - - - - Network - - - - Demo server port - + Enable firewall exception - + Allow connections from localhost only - - - - Internal VNC server port - + VNC server - + Plugin: - + Restart %1 Service - + All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running - - - - Feature manager port - - - - Primary service port - + Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - - - - Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4032,388 +3757,393 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + ServiceControlPlugin Service is running - + Service is not running - + Configure and control Veyon service - + Register Veyon Service - + Unregister Veyon Service - + Start Veyon Service - + Stop Veyon Service - + Restart Veyon Service - + Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! - + Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + SystemTrayIcon System tray icon - + SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + TextMessageDialog Send text message - + Use the field below to type your message which will be sent to all selected users. - + TextMessageFeaturePlugin Text message - + Use this function to send a text message to all users e.g. to assign them new tasks. - + Message from teacher - + Send a message to a user - + UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) - + Builtin UltraVNC server configuration - + Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + + + + Maximum CPU usage + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username - + Password - + UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control - + VeyonCore [OK] - + [FAIL] - + Invalid command! - + Available commands: - + Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! - + Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + VncViewWidget Establishing connection to %1 ... - + WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4421,111 +4151,111 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension - + main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_pl.ts b/translations/veyon_pl.ts index 47a31fb75..27d8c2f67 100644 --- a/translations/veyon_pl.ts +++ b/translations/veyon_pl.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne All groups Wszystkie grupy - - ... - ... - Access control rules Reguły dostępu @@ -325,98 +319,6 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne Metoda uwierzytelnienia - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Ogólne - - - - AuthKeysConfigurationDialog - - Authentication keys - Klucze uwierzytelniające - - - Introduction - Wprowadzenie - - - Please perform the following steps to set up key file authentication: - Wykonaj poniższe kroki w celu ustawienia pliku klucza uwierzytelniającego: - - - 1) Create a key pair on the master computer. - )1 Stwórz parę kluczy uwierzytelniających na głównym komputerze. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Utwórz grupę użytkowników którzy mają mieć dostęp do innych komputerów. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Wyeksportuj klucz publiczny i zaimportuj go na wszystkich komputerach klienckich z taką samą nazwą. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Więcej informacji można znaleźć w <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Podręczniku administratora Veyon</a>. - - - Key file directories - Lokalizacja plików kluczy - - - Public key file base directory - Katalog z plikami kluczy publicznych - - - Private key file base directory - Katalog z plikami kluczy prywatnych - - - ... - ... - - - Available authentication keys - Dostępne klucze uwierzytelniające - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Para kluczy uwierzytelniających składa się z dwóch kluczy kryptograficznych, prywatnego i publicznego. -Klucz prywatny umożliwia użytkownikom komputera głównego dostęp do komputerów klienta. -Ważne jest, aby jedynie autoryzowani użytkownicy mogli odczytać plik klucza prywatnego. -Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połączeń przychodzących. - - - Create key pair - Stwórz parę kluczy - - - Delete key - Usuń klucz - - - Import key - Importuj klucz - - - Export key - Eksportuj klucz - - - Set access group - Ustaw grupę dostępu - - AuthKeysConfigurationWidget @@ -799,7 +701,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org @@ -814,7 +716,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -1291,11 +1193,11 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc [no user] - + Veyon Server unreachable or not running - + @@ -1396,10 +1298,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc ComputerSelectPanel - - Computer management - Zarządzanie komputerem - Computer search Znajdź komputer @@ -1429,6 +1327,17 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Nie można zapisać listy komputerów i użytkowników w %1! Sprawdź prawa dostępu do pliku + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1560,10 +1469,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Memory limit Limit pamięci - - Use multithreading (experimental) - Użyj wielowątkowości (eksperymentalne) - MB MB @@ -1649,11 +1554,11 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc All screens - + Screen %1 [%2] - + @@ -1978,10 +1883,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Log file directory Katalog plików dziennika logowania - - ... - ... - Log level Poziom logowania @@ -2078,21 +1979,12 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Write to logging system of operating system Zapisz w logach systemu operacyjnego + + + HeadlessVncServer - Authentication - Uwierzytelnienie - - - Method: - Metoda: - - - Test - Test - - - Configure - Konfiguruj + Headless VNC server + @@ -2151,7 +2043,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2161,7 +2053,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2171,7 +2063,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2180,7 +2072,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree @@ -2300,7 +2192,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc computer containers - + groups of user @@ -2377,7 +2269,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc The %1 has been queried successfully and %2 entries were found. Zapytanie o %1 zakończyło się powodzeniem i znaleziono %2 wpisów. -  LDAP test failed @@ -2608,7 +2500,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: @@ -2652,11 +2544,11 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Filter for computer containers - + Computer containers or OUs - + Connection security @@ -2744,7 +2636,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Location attribute in computer objects - + List all entries of a location @@ -2789,7 +2681,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) Nazwy hostów przechowywane jako w pełni kwalifikowane nazwy domen (FQDN, np. myhost.example.org) -  Computer hostname attribute @@ -2820,7 +2712,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory @@ -2856,11 +2748,11 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server @@ -2875,53 +2767,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Powiąż z LDAP - - LicensingConfigurationPage - - Licensing - Licencjonowanie - - - Installed licenses - Zainstalowane licencje - - - Add new network range - Dodaj nowy zakres sieci - - - Remove selected network range - Usuń wybrany zakres sieci - - - ID - Identyfikator - - - Valid until - Ważne do - - - Licensee - Właściciel - - - Information - Informacja - - - Installation ID - Identyfikator instalacji - - - Addons available for licensing - Dostępne dodatki do licencjonowania - - - Addon - Addon - - LinuxPlatformConfigurationPage @@ -3116,10 +2961,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Search users and computers Wyszukaj użytkowników i komputery - - Adjust optimal size - Dopasuj optymalny rozmiar - Align computers to grid Dopasuj komputery w siatkę @@ -3168,17 +3009,17 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Authentication Uwierzytelnienie + + Adjust size of computer icons automatically + + Slideshow Pokaz slajdów Spotlight - - - - Adjust size of computer icons automatically - + @@ -3187,10 +3028,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Directories Lokalizacje - - ... - ... - User configuration Konfiguracja użytkownika @@ -3323,10 +3160,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Automatically select current location Automatycznie wybierz bieżącą lokalizację - - Automatically adjust computer thumbnail size - Automatycznie dostosuj rozmiar miniatury komputera - Automatically open computer select panel Automatycznie otwórz panel wyboru komputera @@ -3337,27 +3170,31 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Auto + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3375,97 +3212,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Ten tryb umożliwia monitorowanie wszystkich komputerów w co najmniej jednej lokalizacji. - - NetworkDiscoveryConfigurationPage - - Network discovery - Wykrywanie sieci - - - Mode - Tryb - - - Scan network ranges - Skanuj zakresy sieci - - - e.g. 192.168.1.0/24 - np. 192.168.1.0/24 - - - Scan all subnets of computer - Przeskanuj wszystkie podsieci - - - Scan custom subnet - Skanuj zdefiniowaną podsieć - - - Scan sessions on local computer - Skanuj sesje na lokalnym komputerze - - - Test - Test - - - Network ranges - Zakresy sieci - - - Add new group - Dodaj nową grupę - - - Remove selected group - Usuń wybraną grupę - - - Groups - Grupy - - - First address - Pierwszy adres - - - Last address - Ostatni adres - - - Add new network range - Dodaj nowy zakres sieci - - - Remove selected network range - Usuń wybrany zakres sieci - - - Parallel scans - Skanowanie równoległe - - - Scan timeout - Upłynął limit czasu skanowania - - - ms - ms - - - Session scan limit - Limit skanowania sesji - - - Options - Opcje - - - Reverse lookup discovered IP addresses to host names - Odwrócone wyszukiwanie adresów IP na nazwy hostów - - NetworkObjectTreeModel @@ -3703,7 +3449,7 @@ Zapisz swoją pracę i zamknij wszystkie programy. %1 - %2 - %3 Remote Access - + @@ -3832,7 +3578,7 @@ Zapisz swoją pracę i zamknij wszystkie programy. To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - Aby odzyskać pełną uwagę wszystkich użytkowników, możesz zablokować ich komputery za pomocą tego przycisku. W tym trybie wszystkie urządzenia wejściowe są zablokowane, podczas gdy pulpit jest nadal widoczny.  + Aby odzyskać pełną uwagę wszystkich użytkowników, możesz zablokować ich komputery za pomocą tego przycisku. W tym trybie wszystkie urządzenia wejściowe są zablokowane, podczas gdy pulpit jest nadal widoczny.  @@ -3916,11 +3662,11 @@ Zapisz swoją pracę i zamknij wszystkie programy. Screenshot - Zrzut ekranu + Zrzut ekranu Do you really want to delete all selected screenshots? - + @@ -3953,14 +3699,6 @@ Zapisz swoją pracę i zamknij wszystkie programy. State: Stan - - Network - Sieć - - - Demo server port - port serwera demo - Enable firewall exception Uruchom wyjątki w zaporze sieciowej @@ -3969,10 +3707,6 @@ Zapisz swoją pracę i zamknij wszystkie programy. Allow connections from localhost only Zezwalaj tylko na połączenia z localhosta - - Internal VNC server port - Wewnętrzny port VNC - VNC server Serwer VNC @@ -3993,14 +3727,6 @@ Zapisz swoją pracę i zamknij wszystkie programy. Running Uruchomiona - - Feature manager port - Port managera - - - Primary service port - Główny port usługi - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4011,10 +3737,6 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Show notification on remote connection Pokaż powiadomienie o zdalnym połączeniu - - Multi session mode (for terminal and remote desktop servers) - Tryb wielu sesji (dla serwerów terminalowych i zdalnych pulpitów) - Show notification when an unauthorized access is blocked Pokaż powiadomienie, gdy zostanie zablokowany nieautoryzowany dostęp @@ -4029,7 +3751,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) @@ -4037,11 +3759,11 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Network port numbers - + Veyon server - + Internal VNC server @@ -4057,7 +3779,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Miscellaneous network settings - + @@ -4149,11 +3871,11 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. SlideshowPanel Previous - + Start/pause - + Next @@ -4161,38 +3883,39 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4206,7 +3929,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) @@ -4280,6 +4003,10 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Enable Desktop Duplication Engine on Windows 8 and newer Włącz mechanizm kopiowania pulpitu w systemie Windows 8 i nowszych + + Maximum CPU usage + + UserConfig @@ -4553,4 +4280,4 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Veyon Master - + \ No newline at end of file diff --git a/translations/veyon_pt_BR.ts b/translations/veyon_pt_BR.ts index c615dd10f..22f714039 100644 --- a/translations/veyon_pt_BR.ts +++ b/translations/veyon_pt_BR.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi All groups Todos os grupos - - ... - ... - Access control rules Regras de controle de acesso @@ -140,15 +134,15 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups @@ -267,7 +261,7 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Authenticated via method - + @@ -322,99 +316,7 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Geral - - - - AuthKeysConfigurationDialog - - Authentication keys - Chaves de autenticação - - - Introduction - Introdução - - - Please perform the following steps to set up key file authentication: - Por favor, realize os passos a seguir para configurar a autenticação por arquivo chave: - - - 1) Create a key pair on the master computer. - 1) Crie um par de chaves no computador master. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Defina um grupo de acesso, cujos membros devem ter permissão para acessar outros computadores. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Exporte a chave pública e importe ela, com o mesmo nome, nos computadores clientes. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Por favor, consulte o <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Manual de administração do Veyon </a> para mais informações. - - - Key file directories - Diretórios do arquivo chave - - - Public key file base directory - Diretório base do arquivo de chave pública - - - Private key file base directory - Diretório base do arquivo de chave privada - - - ... - ... - - - Available authentication keys - Chaves de autenticação disponíveis - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Um par de chaves de autenticação consiste em duas chaves criptografadas, uma chave privada e uma chave pública. -A chave privada concede acesso ao computador cliente através do computador master. -É importante que somente usuários autorizados tenham acesso de leitura ao arquivo da chave privada. -A chave pública é usada no computadores clientes para autenticar as requisições de conexão do computador master. - - - Create key pair - Criar um par de chaves - - - Delete key - Apagar chave - - - Import key - Importar chave - - - Export key - Exportar chave - - - Set access group - Definir grupo de acesso + @@ -503,7 +405,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? @@ -515,7 +417,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -527,7 +429,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please select a key which to set the access group for! - + @@ -542,15 +444,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" @@ -562,7 +464,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Newly created key pair has been saved to "%1" and "%2". - + Could not remove key file "%1"! @@ -614,15 +516,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! @@ -630,11 +532,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! @@ -642,11 +544,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". @@ -654,7 +556,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key "%1" is now accessible by user group "%2". - + <N/A> @@ -693,7 +595,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Set user group allowed to access a key - + KEY @@ -705,7 +607,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME @@ -717,19 +619,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE @@ -737,27 +639,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -765,7 +667,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key file - + @@ -784,14 +686,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -799,11 +701,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -814,7 +716,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -864,7 +766,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -872,7 +774,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Logon - + @@ -883,7 +785,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter the Veyon password: - + Authentication error @@ -891,22 +793,22 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + @@ -917,14 +819,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Authentication is set up properly on this computer. - + AuthenticationPageTab Enabled - + Test @@ -963,7 +865,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Builtin directory - + Locations & computers @@ -983,7 +885,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location @@ -998,15 +900,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1026,7 +928,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Specified object not found. - + File "%1" does not exist! @@ -1034,7 +936,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Can't open file "%1" for reading! - + Unknown argument "%1". @@ -1042,11 +944,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None @@ -1066,27 +968,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID @@ -1094,39 +996,39 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Parent UUID - + Add a location or computer - + Clear all locations and computers - + Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE @@ -1134,47 +1036,47 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE @@ -1186,19 +1088,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room - + Add a computer to room %1 - + OBJECT @@ -1206,7 +1108,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name @@ -1214,7 +1116,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Remove an object by UUID - + "Room 01" @@ -1287,15 +1189,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Location: %1 - + [no user] - + Veyon Server unreachable or not running - + @@ -1314,11 +1216,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error @@ -1326,18 +1228,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1356,7 +1258,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Location detection failed - + Computer name;Hostname;User @@ -1364,7 +1266,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1379,27 +1281,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - Gerenciamento de computadores - Computer search Pesquisa de computador @@ -1429,6 +1327,17 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Não foi possível salvar a lista de computadores e usuários em %1! Verifique as permissões de acesso ao arquivo. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1461,7 +1370,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. @@ -1512,23 +1421,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1560,10 +1469,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Memory limit Limite de memória - - Use multithreading (experimental) - Utilizar multithreading (experimental) - MB MB @@ -1578,7 +1483,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Slow down thumbnail updates while demo is running - + @@ -1601,59 +1506,59 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1754,7 +1659,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom program - + Open website "%1" @@ -1762,7 +1667,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom website - + @@ -1781,7 +1686,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom website - + Open file manager @@ -1789,7 +1694,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Start learning tool - + Play tutorial video @@ -1797,19 +1702,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom program - + Handout - + Texts to read - + generic-student-user - + @@ -1853,11 +1758,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Destination directory - + Default source directory - + Options @@ -1865,18 +1770,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + @@ -1895,11 +1800,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Transfer and open file(s) with associated program - + Transfer and open destination folder - + Files @@ -1918,7 +1823,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç FileTransferFileDialog Select one or more files to transfer - + @@ -1929,27 +1834,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Click this button to transfer files from your computer to all computers. - + Select one or more files to transfer - + Transfer files to remote computer - + Received file "%1". - + Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1978,10 +1883,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Log file directory Diretório de arquivo de log - - ... - ... - Log level Nível de log @@ -2076,30 +1977,21 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Write to logging system of operating system - - - - Authentication - Autenticação - - - Method: - Método: - - - Test - Teste + + + + HeadlessVncServer - Configure - Configurar + Headless VNC server + LdapBrowseDialog Browse LDAP - + @@ -2119,7 +2011,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed @@ -2129,7 +2021,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful @@ -2147,7 +2039,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2157,7 +2049,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2167,7 +2059,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2217,7 +2109,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User login name attribute - + group members @@ -2241,23 +2133,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses @@ -2269,15 +2161,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç computer locations - + Computer location attribute - + Location name attribute - + users @@ -2297,7 +2189,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç computer containers - + groups of user @@ -2309,7 +2201,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer @@ -2321,27 +2213,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups @@ -2349,11 +2241,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2363,7 +2255,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2375,21 +2267,21 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: @@ -2652,23 +2544,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) - + Custom CA certificate file - + None @@ -2684,95 +2576,95 @@ A chave pública é usada no computadores clientes para autenticar as requisiç e.g. (objectClass=computer) - + e.g. (objectClass=group) - + e.g. (objectClass=person) - + e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2780,31 +2672,31 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + @@ -2827,113 +2719,66 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + @@ -2947,7 +2792,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LocationDialog Select location - + enter search filter... @@ -3107,13 +2952,9 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Search users and computers Buscar usuários e computadores - - Adjust optimal size - Ajustar janelas e seus tamanhos - Align computers to grid - + %1 Configurator @@ -3125,51 +2966,51 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers - + &Save settings to file - + &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication Autenticação - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3178,10 +3019,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Directories Diretórios - - ... - ... - User configuration Configuração de usuário @@ -3244,7 +3081,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Thumbnail update interval - + ms @@ -3260,95 +3097,95 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User and computer name - + Only user name - + Only computer name - + Computer thumbnail caption - + Text color - + Sort order - + Computer and user name - + Computer locations - + Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Auto + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3363,105 +3200,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Teste - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - ms - - - Session scan limit - - - - Options - Opções - - - Reverse lookup discovered IP addresses to host names - + NetworkObjectTreeModel Locations/Computers - + @@ -3472,15 +3218,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3488,18 +3234,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3507,23 +3253,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3574,7 +3320,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS @@ -3582,45 +3328,45 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3631,15 +3377,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3681,18 +3427,18 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 - %3 Remote Access - + @@ -3763,7 +3509,7 @@ Please save your work and close all programs. Exit - + @@ -3782,15 +3528,15 @@ Please save your work and close all programs. Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3813,15 +3559,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3840,7 +3586,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3905,11 +3651,11 @@ Please save your work and close all programs. Screenshot - Captura de tela + Captura de tela Do you really want to delete all selected screenshots? - + @@ -3942,14 +3688,6 @@ Please save your work and close all programs. State: Estado: - - Network - Rede - - - Demo server port - Exibir porta do servidor - Enable firewall exception Habilitar exceção de firewall @@ -3958,10 +3696,6 @@ Please save your work and close all programs. Allow connections from localhost only Permitir conexões de localhost apenas - - Internal VNC server port - Porta do servidor VNC interno - VNC server Servidor VNC @@ -3982,62 +3716,50 @@ Please save your work and close all programs. Running Em execução - - Feature manager port - Porta de gerenciador de funcionalidades - - - Primary service port - Porta de serviço primário - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection - - - - Multi session mode (for terminal and remote desktop servers) - + Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4045,30 +3767,30 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + ServiceControl Starting service %1 - + Stopping service %1 - + Registering service %1 - + Unregistering service %1 - + Service control - + @@ -4118,7 +3840,7 @@ Typically this is required to support terminal servers. ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4126,61 +3848,62 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4194,22 +3917,22 @@ Typically this is required to support terminal servers. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4262,11 +3985,15 @@ Typically this is required to support terminal servers. Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + + + + Maximum CPU usage + @@ -4284,11 +4011,11 @@ Typically this is required to support terminal servers. UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4303,27 +4030,27 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4366,46 +4093,46 @@ Typically this is required to support terminal servers. No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + VeyonServiceControl Veyon Service - + @@ -4426,7 +4153,7 @@ Typically this is required to support terminal servers. WindowsPlatformConfigurationPage Windows - + General @@ -4438,47 +4165,47 @@ Typically this is required to support terminal servers. Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4492,31 +4219,31 @@ Typically this is required to support terminal servers. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + @@ -4538,7 +4265,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_pt_PT.ts b/translations/veyon_pt_PT.ts index d4b52c3ef..e1681be7e 100644 --- a/translations/veyon_pt_PT.ts +++ b/translations/veyon_pt_PT.ts @@ -80,10 +80,6 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma All groups Todos os grupos - - ... - ... - Access control rules Regras de controlo do acesso @@ -323,95 +319,6 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma - - AndroidPlatformConfigurationPage - - Android - - - - General - Geral - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - - - - Public key file base directory - - - - Private key file base directory - - - - ... - ... - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - - - - Delete key - - - - Import key - - - - Export key - - - - Set access group - - - AuthKeysConfigurationWidget @@ -1388,10 +1295,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - - Computer search @@ -1421,6 +1324,17 @@ The public key is used on client computers to authenticate incoming connection r + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1552,10 +1466,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit - - Use multithreading (experimental) - - MB @@ -1970,10 +1880,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory - - ... - ... - Log level @@ -2070,20 +1976,11 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system + + + HeadlessVncServer - Authentication - - - - Method: - - - - Test - Teste - - - Configure + Headless VNC server @@ -2853,53 +2750,6 @@ The public key is used on client computers to authenticate incoming connection r - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - - - LinuxPlatformConfigurationPage @@ -3094,10 +2944,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - - Adjust optimal size - - Align computers to grid @@ -3165,10 +3011,6 @@ The public key is used on client computers to authenticate incoming connection r Directories - - ... - ... - User configuration @@ -3301,10 +3143,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location - - Automatically adjust computer thumbnail size - - Automatically open computer select panel @@ -3337,6 +3175,10 @@ The public key is used on client computers to authenticate incoming connection r Automatically adjust computer icon size + + Open feature windows on the same screen as the main window + + MonitoringMode @@ -3353,97 +3195,6 @@ The public key is used on client computers to authenticate incoming connection r - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Teste - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - - - NetworkObjectTreeModel @@ -3929,14 +3680,6 @@ Please save your work and close all programs. State: - - Network - - - - Demo server port - - Enable firewall exception @@ -3945,10 +3688,6 @@ Please save your work and close all programs. Allow connections from localhost only - - Internal VNC server port - - VNC server @@ -3969,14 +3708,6 @@ Please save your work and close all programs. Running - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -3986,10 +3717,6 @@ Typically this is required to support terminal servers. Show notification on remote connection - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked @@ -4141,10 +3868,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers @@ -4169,6 +3892,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4255,6 +3983,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer + + Maximum CPU usage + + UserConfig diff --git a/translations/veyon_ru.ts b/translations/veyon_ru.ts index 67cc2b6e2..ae8503e57 100644 --- a/translations/veyon_ru.ts +++ b/translations/veyon_ru.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ If you're interested in translating Veyon into your local or another langua All groups Все группы - - ... - ... - Access control rules Правила контроля доступа @@ -325,98 +319,6 @@ If you're interested in translating Veyon into your local or another langua Метод проверки подлинности - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Главное - - - - AuthKeysConfigurationDialog - - Authentication keys - Ключи аутентификации - - - Introduction - Вступление - - - Please perform the following steps to set up key file authentication: - Для настройки проверки подлинности ключа выполните следующие действия: - - - 1) Create a key pair on the master computer. - 1) Создайте ключевую пару на главном компьютере. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Установите группу доступа, члены которой должны иметь доступ к другим компьютерам. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Экспортируйте открытый ключ и импортируйте его на всех клиентских компьютерах с тем же именем. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Дополнительную информацию см.<a href="https://veyon.readthedocs.io/en/latest/admin/index.html">В Руководстве администратора Veyon</a>. - - - Key file directories - Файловый каталог с ключами - - - Public key file base directory - Каталог, содержащий открытые ключи - - - Private key file base directory - Каталог, содержащий закрытые ключи - - - ... - ... - - - Available authentication keys - Доступные ключи аутентификации - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Ключевая пара аутентификации состоит из двух связанных криптографических ключей, частного и открытого ключа. -Закрытый ключ позволяет пользователям на главном компьютере обращаться к клиентским компьютерам. -Важно, чтобы только авторизованные пользователи имели доступ к чтению в файл закрытого ключа. -Открытый ключ используется на клиентских компьютерах для аутентификации входящего запроса на соединение. - - - Create key pair - Создать ключевую пару - - - Delete key - Удалить ключ - - - Import key - Импорт ключа - - - Export key - Экспорт ключа - - - Set access group - Установить группу доступа - - AuthKeysConfigurationWidget @@ -1291,11 +1193,11 @@ The public key is used on client computers to authenticate incoming connection r [no user] - + Veyon Server unreachable or not running - + @@ -1396,10 +1298,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - Управление компьютером - Computer search Компьютерный поиск @@ -1429,6 +1327,17 @@ The public key is used on client computers to authenticate incoming connection r Не удалось записать список компьютеров и пользователей в %1! Пожалуйста, проверьте права доступа к файлу. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1560,10 +1469,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit Предел памяти - - Use multithreading (experimental) - Использовать многопоточность (экспериментально) - MB МБ @@ -1601,59 +1506,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1853,11 +1758,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Default source directory - + Options @@ -1865,11 +1770,11 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + @@ -1978,10 +1883,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Каталог, содержащий файл журнала - - ... - ... - Log level Уровень журналирования @@ -2078,21 +1979,12 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system Записывать в журнал операционной системы + + + HeadlessVncServer - Authentication - Аутентификация - - - Method: - Метод: - - - Test - Тестировать - - - Configure - Конфигурация + Headless VNC server + @@ -2880,53 +2772,6 @@ The public key is used on client computers to authenticate incoming connection r Связывание LDAP - - LicensingConfigurationPage - - Licensing - Лицензирование - - - Installed licenses - Установленные лицензии - - - Add new network range - Добавить новый диапазон сети - - - Remove selected network range - Удалить выделенный диапазон сети - - - ID - Идентификатор - - - Valid until - В силе до - - - Licensee - Лицензиат - - - Information - Информация - - - Installation ID - Ид. установки - - - Addons available for licensing - Дополнения, доступные для лицензирования - - - Addon - Дополнение - - LinuxPlatformConfigurationPage @@ -3121,10 +2966,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers Поиск пользователей и компьютеров - - Adjust optimal size - Скорректировать оптимальный размер - Align computers to grid Выравнивать компьютеры по сетке @@ -3174,16 +3015,16 @@ The public key is used on client computers to authenticate incoming connection r Аутентификация - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3192,10 +3033,6 @@ The public key is used on client computers to authenticate incoming connection r Directories Каталоги - - ... - ... - User configuration Пользовательская конфигурация @@ -3328,10 +3165,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location Автоматически выбирать текущее место - - Automatically adjust computer thumbnail size - Автоматически корректировать размер миниатюры компьютера - Automatically open computer select panel Автоматически открыть панель выбора компьютера @@ -3342,27 +3175,31 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Авто + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3380,97 +3217,6 @@ The public key is used on client computers to authenticate incoming connection r В этом режиме вы можете наблюдать за всеми компьютерами в одном или нескольких местах. - - NetworkDiscoveryConfigurationPage - - Network discovery - Обнаружение сети - - - Mode - Режим - - - Scan network ranges - Сканировать диапазоны сети - - - e.g. 192.168.1.0/24 - Например: 192.168.1.0/24 - - - Scan all subnets of computer - Сканировать все подсети компьютера - - - Scan custom subnet - Сканировать нетипичную подсеть - - - Scan sessions on local computer - Сканировать сеансы на локальном компьютере - - - Test - Тестировать - - - Network ranges - Диапазоны сети - - - Add new group - Добавить новую группу - - - Remove selected group - Удалить выделенную группу - - - Groups - Группы - - - First address - Первый адрес - - - Last address - Последний адрес - - - Add new network range - Добавить новый диапазон сети - - - Remove selected network range - Удалить выделенный диапазон сети - - - Parallel scans - Параллельное сканирование - - - Scan timeout - Время ожидания сканирования - - - ms - мс - - - Session scan limit - Ограничение сканирования сеансов - - - Options - Параметры - - - Reverse lookup discovered IP addresses to host names - Обратным поиском определены IP-адреса для названий узлов - - NetworkObjectTreeModel @@ -3708,7 +3454,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + @@ -3829,15 +3575,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3921,11 +3667,11 @@ Please save your work and close all programs. Screenshot - Скриншот + Скриншот Do you really want to delete all selected screenshots? - + @@ -3958,14 +3704,6 @@ Please save your work and close all programs. State: Состояние: - - Network - Сеть - - - Demo server port - Порт демонстрационного сервера - Enable firewall exception Включить исключения брандмауэра @@ -3974,10 +3712,6 @@ Please save your work and close all programs. Allow connections from localhost only Разрешить только локальные подключения - - Internal VNC server port - Порт внутреннего сервера VNC - VNC server VNC-сервер @@ -3998,14 +3732,6 @@ Please save your work and close all programs. Running Работает - - Feature manager port - Порт управления функциями - - - Primary service port - Порт основного сервиса - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4016,17 +3742,13 @@ Typically this is required to support terminal servers. Show notification on remote connection Показывать оповещение по удалённому доступу - - Multi session mode (for terminal and remote desktop servers) - Режим со многими сеансами (для сервера-терминала и сервера удалённого рабочего стола) - Show notification when an unauthorized access is blocked Показывать оповещения, когда программа блокирует неавторизованный доступ Maximum session count - + Sessions @@ -4034,27 +3756,27 @@ Typically this is required to support terminal servers. Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4062,7 +3784,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4154,50 +3876,51 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4285,6 +4008,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer Включить двигатель дублирования рабочего стола в Windows 8 и более новых версиях + + Maximum CPU usage + + UserConfig @@ -4558,4 +4285,4 @@ Typically this is required to support terminal servers. Veyon Мастер - + \ No newline at end of file diff --git a/translations/veyon_sl.ts b/translations/veyon_sl.ts index 7c759f917..03723408e 100644 --- a/translations/veyon_sl.ts +++ b/translations/veyon_sl.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ If you're interested in translating Veyon into your local or another langua All groups Vse skupine - - ... - ... - Access control rules Pravila za nadzor dostopa @@ -267,7 +261,7 @@ If you're interested in translating Veyon into your local or another langua Authenticated via method - + @@ -325,98 +319,6 @@ If you're interested in translating Veyon into your local or another langua Metoda overjanja - - AndroidPlatformConfigurationPage - - Android - - - - General - Splošno - - - - AuthKeysConfigurationDialog - - Authentication keys - Ključi preverjanja pristnosti - - - Introduction - Uvod - - - Please perform the following steps to set up key file authentication: - Če želite nastaviti overjanje datotek ključa, naredite naslednje: - - - 1) Create a key pair on the master computer. - 1) Ustvarite par ključev na glavnem računalniku. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Nastavite skupino za dostop, katere člani bi morali imeti dostop do drugih računalnikov. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Izvozite javni ključ in ga uvozite v vse odjemalske računalnike z istim imenom. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Prosimo, obiščite <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon skrbniški priročnik</a> za več informacij. - - - Key file directories - Imeniki datoteke ključa - - - Public key file base directory - Imenik datoteke z javnim ključem - - - Private key file base directory - Imenik datoteke z zasebnim ključem - - - ... - ... - - - Available authentication keys - Razpoložljivi ključi za preverjanje pristnosti - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Par ključev za preverjanje pristnosti je sestavljen iz dveh povezanih kriptografskih ključev, zasebnega in javnega ključa. -Zasebni ključ omogoča uporabnikom na glavnem računalniku dostop do odjemalskih računalnikov. -Pomembno je, da imajo samo pooblaščeni uporabniki dostop do datoteke zasebnega ključa. -Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti dohodne povezave. - - - Create key pair - Ustvari par ključev - - - Delete key - Izbriši ključ - - - Import key - Uvozi ključ - - - Export key - Izvozi ključ - - - Set access group - Nastavite skupino za dostop - - AuthKeysConfigurationWidget @@ -757,7 +659,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -791,7 +693,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti AuthLdapConfigurationWidget LDAP authentication - + General @@ -799,11 +701,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -814,7 +716,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -864,7 +766,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -872,7 +774,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Logon - + @@ -883,7 +785,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please enter the Veyon password: - + Authentication error @@ -891,22 +793,22 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + @@ -924,7 +826,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti AuthenticationPageTab Enabled - + Test @@ -1291,11 +1193,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti [no user] - + Veyon Server unreachable or not running - + @@ -1318,26 +1220,26 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1379,27 +1281,23 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - Upravljanje računalnika - Computer search Preišči računalnik @@ -1429,6 +1327,17 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Računalnika in uporabnikov ni mogoče vpisati v seznam %1! Preverite dovoljenja za dostop do datotek. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1524,11 +1433,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1560,10 +1469,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Memory limit Omejitev pomnilnika - - Use multithreading (experimental) - Uporabite večnitnostnost (eksperimentalno) - MB MB @@ -1578,7 +1483,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Slow down thumbnail updates while demo is running - + @@ -1601,59 +1506,59 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1777,7 +1682,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please complete all tasks within the next 5 minutes. - + Custom website @@ -1785,15 +1690,15 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Open file manager - + Start learning tool - + Play tutorial video - + Custom program @@ -1801,15 +1706,15 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Handout - + Texts to read - + generic-student-user - + @@ -1853,11 +1758,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Destination directory - + Default source directory - + Options @@ -1865,11 +1770,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Remember last source directory - + Create destination directory if it does not exist - + @@ -1978,10 +1883,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Log file directory Imenik datoteke dnevnikov - - ... - ... - Log level Nivo beleženja @@ -2078,21 +1979,12 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Write to logging system of operating system Zapiši v sistem beleženja operacijskega sistema + + + HeadlessVncServer - Authentication - Preverjanje pristnosti - - - Method: - Metoda: - - - Test - Preizkus - - - Configure - + Headless VNC server + @@ -2307,7 +2199,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti computer containers - + groups of user @@ -2347,7 +2239,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Computer groups filter - + Computer locations identification @@ -2359,11 +2251,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2853,78 +2745,31 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - Licenciranje - - - Installed licenses - Nameščene licence - - - Add new network range - Dodajte novo omrežno območje - - - Remove selected network range - Odstranite izbrano omrežno območje - - - ID - ID - - - Valid until - Veljavno do - - - Licensee - Licenca - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + @@ -2935,19 +2780,19 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Custom PAM service for user authentication - + User authentication - + Session management - + Display manager users - + @@ -3121,10 +2966,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Search users and computers Iskanje uporabnikov in računalnikov - - Adjust optimal size - Prilagodi optimalno velikost - Align computers to grid Poravnaj računalnike z mrežo @@ -3174,16 +3015,16 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Preverjanje pristnosti - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3192,10 +3033,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Directories Imeniki - - ... - ... - User configuration Uporabniška konfiguracija @@ -3328,41 +3165,41 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Automatically select current location Samodejno izberi trenutno lokacijo - - Automatically adjust computer thumbnail size - Samodejno prilagodi velikost računalniške sličice - Automatically open computer select panel Samodejno odpri izbrano okno računalnika Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Samodejno + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3380,97 +3217,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Ta način omogoča nadzor vseh računalnikov na eni ali več lokacijah. - - NetworkDiscoveryConfigurationPage - - Network discovery - Odkrivanje omrežja - - - Mode - Način - - - Scan network ranges - Preglej obsege omrežja - - - e.g. 192.168.1.0/24 - npr. 192.168.1.0/24 - - - Scan all subnets of computer - Preglej vsa podomrežja računalnika - - - Scan custom subnet - Preglej podomrežje po meri - - - Scan sessions on local computer - Preglej seje na lokalnem računalniku - - - Test - Preizkus - - - Network ranges - Območja omrežja - - - Add new group - Dodaj novo skupino - - - Remove selected group - Odstrani izbrano skupino - - - Groups - Skupine - - - First address - Prvi naslov - - - Last address - Zadnji naslov - - - Add new network range - Dodajte novo omrežno območje - - - Remove selected network range - Odstranite izbrano omrežno območje - - - Parallel scans - Vzporedno skeniranje - - - Scan timeout - Časovna omejitev skeniranja - - - ms - ms - - - Session scan limit - Meja skeniranja seje - - - Options - Možnosti - - - Reverse lookup discovered IP addresses to host names - Povratno iskanje je odkrilo naslove IP za imena gostiteljev - - NetworkObjectTreeModel @@ -3486,15 +3232,15 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3502,18 +3248,18 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Name: - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3521,23 +3267,23 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3612,29 +3358,29 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Power down now - + Install updates and power down - + Power down after user confirmation - + Power down after timeout - + The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + @@ -3645,15 +3391,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3695,7 +3441,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3706,7 +3452,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + @@ -3777,7 +3523,7 @@ Please save your work and close all programs. Exit - + @@ -3796,15 +3542,15 @@ Please save your work and close all programs. Name: - + Remember and add to program menu - + e.g. VLC - + @@ -3827,15 +3573,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3854,7 +3600,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3919,11 +3665,11 @@ Please save your work and close all programs. Screenshot - Zaslonska slika + Zaslonska slika Do you really want to delete all selected screenshots? - + @@ -3956,14 +3702,6 @@ Please save your work and close all programs. State: Stanje: - - Network - Omrežje - - - Demo server port - Vrata strežnika za predavanja - Enable firewall exception Omogoči izjemo požarnega zidu @@ -3972,10 +3710,6 @@ Please save your work and close all programs. Allow connections from localhost only Omogočite povezave samo z lokalnega gostitelja - - Internal VNC server port - Vrata notranjega strežnika VNC - VNC server VNC strežnik @@ -3996,14 +3730,6 @@ Please save your work and close all programs. Running V teku - - Feature manager port - Vrata upravitelja funkcij - - - Primary service port - Primarna vrata storitve - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4014,37 +3740,33 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Show notification on remote connection Prikaži obvestilo o oddaljeni povezavi - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked - + Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server @@ -4060,7 +3782,7 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Miscellaneous network settings - + @@ -4152,50 +3874,51 @@ Običajno je to potrebno za podporo terminalskih strežnikov. SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4220,11 +3943,11 @@ Običajno je to potrebno za podporo terminalskih strežnikov. TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4283,6 +4006,10 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Enable Desktop Duplication Engine on Windows 8 and newer Omogoči pogon za podvajanje namizja računalnika na Windows 8 in novejših + + Maximum CPU usage + + UserConfig @@ -4299,11 +4026,11 @@ Običajno je to potrebno za podporo terminalskih strežnikov. UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4318,27 +4045,27 @@ Običajno je to potrebno za podporo terminalskih strežnikov. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4409,7 +4136,7 @@ Običajno je to potrebno za podporo terminalskih strežnikov. WARNING - + Authentication test @@ -4441,7 +4168,7 @@ Običajno je to potrebno za podporo terminalskih strežnikov. WindowsPlatformConfigurationPage Windows - + General @@ -4453,23 +4180,23 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism @@ -4477,23 +4204,23 @@ Običajno je to potrebno za podporo terminalskih strežnikov. User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4507,31 +4234,31 @@ Običajno je to potrebno za podporo terminalskih strežnikov. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + @@ -4556,4 +4283,4 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Veyon Master - + \ No newline at end of file diff --git a/translations/veyon_sr.ts b/translations/veyon_sr.ts index ddb84026e..ab76381d6 100644 --- a/translations/veyon_sr.ts +++ b/translations/veyon_sr.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili All groups Sve grupe - - ... - ... - Access control rules Pravila kotrole pristupa @@ -267,7 +261,7 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili Authenticated via method - + @@ -325,98 +319,6 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili Način provere autentifikacije - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Opšte - - - - AuthKeysConfigurationDialog - - Authentication keys - Ključevi za autentifikaciju - - - Introduction - Uvod - - - Please perform the following steps to set up key file authentication: - Molimo vas da izvršite sledeće korake za podešavanje provjere autentičnosti datoteka: - - - 1) Create a key pair on the master computer. - 1) Na glavnom računaru napravite par ključeva. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Postavite pristupnu grupu čiji članovi trebaju imati pristup drugim računarima. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Izvezite javni ključ i uvezite ga na sve računare klijenta sa istim nazivom. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Više informacija potražite u Priručniku za administratore Veyon.<a href="https://veyon.readthedocs.io/en/latest/admin/index.html"> - - - Key file directories - Ključne datoteke direktorijuma - - - Public key file base directory - Osnovni direktorijum datoteka javnih ključeva - - - Private key file base directory - Osnovni direktorijum datoteka privatnih ključeva - - - ... - ... - - - Available authentication keys - Dostupni ključevi za proveru autentičnosti - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Par ključeva za autentifikaciju sastoji se od dva povezana kriptografska ključa, privatnog i javnog ključa. -Privatni ključ omogućava korisnicima na matičnom računaru pristup klijentima. -Važno je da su samo ovlašćeni korisnici pročitali pristup datoteci privatnog ključa. -Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva za povezivanje. - - - Create key pair - Kreirajte par ključeva - - - Delete key - Obriši ključ - - - Import key - Uvozni ključ - - - Export key - Izvozni ključ - - - Set access group - Podesite grupu pristupa - - AuthKeysConfigurationWidget @@ -791,7 +693,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z AuthLdapConfigurationWidget LDAP authentication - + General @@ -799,11 +701,11 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -814,7 +716,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -908,7 +810,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Simple password - + @@ -926,7 +828,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u AuthenticationPageTab Enabled - + Test @@ -1293,11 +1195,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u [no user] - + Veyon Server unreachable or not running - + @@ -1332,14 +1234,14 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Active connections: - + ComputerGroupSelector Group %1 - + @@ -1381,27 +1283,23 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - Upravljanje računarom - Computer search Pretraživanje računara @@ -1431,6 +1329,17 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Ne može se zapisati lista računara i korisnika na% 1! Proverite dozvole za pristup datoteci. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1530,7 +1439,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not configure the firewall configuration for the %1 Service. - + @@ -1562,10 +1471,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Memory limit Memorijski limit - - Use multithreading (experimental) - Koristite višeslojno (eksperimentalno) - MB MB @@ -1603,59 +1508,59 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1855,11 +1760,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Destination directory - + Default source directory - + Options @@ -1867,11 +1772,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Remember last source directory - + Create destination directory if it does not exist - + @@ -1980,10 +1885,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Log file directory Dnevnik datoteka direktorijuma - - ... - ... - Log level Nivo zapisa @@ -2080,21 +1981,12 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Write to logging system of operating system Zapisati u sistem za prijavu operativnog sistema + + + HeadlessVncServer - Authentication - Autentifikacija - - - Method: - Metod: - - - Test - Test - - - Configure - Konfiguracija + Headless VNC server + @@ -2349,7 +2241,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Computer groups filter - + Computer locations identification @@ -2361,11 +2253,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2871,7 +2763,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2879,54 +2771,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u LDAP bind - - - - - LicensingConfigurationPage - - Licensing - Licenciranje - - - Installed licenses - Instalirane licence - - - Add new network range - Dodajte novi opseg mreže - - - Remove selected network range - Uklonite odabrani mrežni raspon - - - ID - ID - - - Valid until - Ispravno do - - - Licensee - Imalac licence - - - Information - Informacija - - - Installation ID - ID instalacije - - - Addons available for licensing - Dostupni dodaci za licenciranje - - - Addon - Dodaj + @@ -3123,10 +2968,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Search users and computers Pretražite korisnike i računare - - Adjust optimal size - Podesite optimalnu veličinu - Align computers to grid Poravnajte računare po mreži @@ -3176,16 +3017,16 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Autentifikacija - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3194,10 +3035,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Directories Direktorijumi - - ... - ... - User configuration Korisnička konfiguracija @@ -3330,41 +3167,41 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Automatically select current location Automatski odaberite trenutnu lokaciju - - Automatically adjust computer thumbnail size - Automatski prilagodite veličinu sličica računara - Automatically open computer select panel Automatski otvorite panel za odabir računara Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Automatski + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3382,97 +3219,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Ovaj način rada omogućuje vam praćenje svih računara na jednoj ili više lokacija. - - NetworkDiscoveryConfigurationPage - - Network discovery - Otkrivanje mreže - - - Mode - Mod - - - Scan network ranges - Skeniranje mrežnih opsega - - - e.g. 192.168.1.0/24 - npr. 192.168.1.0/24 - - - Scan all subnets of computer - Skeniranje svih podmreža računara - - - Scan custom subnet - Skeniranje prilagođjene podmreže - - - Scan sessions on local computer - Skeniranje sesija na lokalnom računaru - - - Test - Test - - - Network ranges - Raspon mreže - - - Add new group - Dodaj novu grupu - - - Remove selected group - Ukloni obeleženu grupu - - - Groups - Grupe - - - First address - Prva adresa - - - Last address - Poslednja adresa - - - Add new network range - Dodajte novi opseg mreže - - - Remove selected network range - Uklonite odabrani mrežni raspon - - - Parallel scans - Paralelno skeniranje - - - Scan timeout - Istek vremena skeniranja - - - ms - ms - - - Session scan limit - Granica sesija skeniranja - - - Options - Opcije - - - Reverse lookup discovered IP addresses to host names - Obrnutim pretraživanjem otkrivene IP adrese za imena hosta - - NetworkObjectTreeModel @@ -3511,11 +3257,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3523,23 +3269,23 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3699,7 +3445,7 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. RemoteAccessPage Remote access: %1 - + @@ -3710,7 +3456,7 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. %1 - %2 - %3 Remote Access - + @@ -3835,11 +3581,11 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3858,7 +3604,7 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Could not open screenshot file %1 for writing. - + @@ -3923,11 +3669,11 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Screenshot - Snimka ekrana + Snimka ekrana Do you really want to delete all selected screenshots? - + @@ -3960,14 +3706,6 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. State: Stanje: - - Network - Mreža - - - Demo server port - Demo server port - Enable firewall exception Uključi firewall izuzetak @@ -3976,10 +3714,6 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Allow connections from localhost only Dozvoli samo konekcije od lokalnog kompjutera - - Internal VNC server port - Unutrašnji VNC server port - VNC server VNC server @@ -4000,14 +3734,6 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Running Pokrenut - - Feature manager port - Port za upravljanje ksrakteristika - - - Primary service port - Glavni servisni port - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4018,37 +3744,33 @@ Obično je ovo zahtevano kao podrška trminal serverima. Show notification on remote connection Prikaži obaveštenje na daljinskoj vezi - - Multi session mode (for terminal and remote desktop servers) - Više sesijski način (za terminal i daljinske desktop servere) - Show notification when an unauthorized access is blocked Prikaži obavest kada je zabranjeni pristup blokiran. Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server @@ -4064,7 +3786,7 @@ Obično je ovo zahtevano kao podrška trminal serverima. Miscellaneous network settings - + @@ -4156,50 +3878,51 @@ Obično je ovo zahtevano kao podrška trminal serverima. SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4287,6 +4010,10 @@ Obično je ovo zahtevano kao podrška trminal serverima. Enable Desktop Duplication Engine on Windows 8 and newer Uključi Desktop Duplication Engine- mogućnost dupliciranja desktopa na Windows 8 i novijim + + Maximum CPU usage + + UserConfig @@ -4497,7 +4224,7 @@ Obično je ovo zahtevano kao podrška trminal serverima. Use input device interception driver - + @@ -4560,4 +4287,4 @@ Obično je ovo zahtevano kao podrška trminal serverima. Veyon Master - + \ No newline at end of file diff --git a/translations/veyon_sv.ts b/translations/veyon_sv.ts index c8f5169c7..ceee22c10 100644 --- a/translations/veyon_sv.ts +++ b/translations/veyon_sv.ts @@ -80,10 +80,6 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an All groups Alla grupper - - ... - ... - Access control rules Åtkomstregler @@ -323,95 +319,6 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an - - AndroidPlatformConfigurationPage - - Android - - - - General - Allmänt - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - - - - 2) Set an access group whose members should be allowed to access other computers. - - - - 3) Export the public key and import it on all client computers with the same name. - - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - - - - Public key file base directory - - - - Private key file base directory - - - - ... - ... - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - - - - Create key pair - - - - Delete key - - - - Import key - - - - Export key - - - - Set access group - - - AuthKeysConfigurationWidget @@ -1388,10 +1295,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - - Computer search @@ -1421,6 +1324,17 @@ The public key is used on client computers to authenticate incoming connection r + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1552,10 +1466,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit - - Use multithreading (experimental) - - MB @@ -1970,10 +1880,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Loggfilskatalog - - ... - ... - Log level Loggnivå @@ -2070,20 +1976,11 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system + + + HeadlessVncServer - Authentication - Autentisering - - - Method: - - - - Test - Test - - - Configure + Headless VNC server @@ -2853,53 +2750,6 @@ The public key is used on client computers to authenticate incoming connection r - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - - - LinuxPlatformConfigurationPage @@ -3094,10 +2944,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - - Adjust optimal size - - Align computers to grid @@ -3165,10 +3011,6 @@ The public key is used on client computers to authenticate incoming connection r Directories - - ... - ... - User configuration @@ -3301,10 +3143,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location - - Automatically adjust computer thumbnail size - - Automatically open computer select panel @@ -3337,6 +3175,10 @@ The public key is used on client computers to authenticate incoming connection r Automatically adjust computer icon size + + Open feature windows on the same screen as the main window + + MonitoringMode @@ -3353,97 +3195,6 @@ The public key is used on client computers to authenticate incoming connection r - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Test - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - - - NetworkObjectTreeModel @@ -3929,14 +3680,6 @@ Please save your work and close all programs. State: Tillstånd: - - Network - Nätverk - - - Demo server port - Serverport för demo - Enable firewall exception Aktivera brandväggsundantag @@ -3945,10 +3688,6 @@ Please save your work and close all programs. Allow connections from localhost only - - Internal VNC server port - - VNC server @@ -3969,14 +3708,6 @@ Please save your work and close all programs. Running Kör - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -3986,10 +3717,6 @@ Typically this is required to support terminal servers. Show notification on remote connection - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked @@ -4141,10 +3868,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers @@ -4169,6 +3892,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4255,6 +3983,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer + + Maximum CPU usage + + UserConfig diff --git a/translations/veyon_th.ts b/translations/veyon_th.ts index 409c3b2df..2c4c0c16e 100644 --- a/translations/veyon_th.ts +++ b/translations/veyon_th.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -35,7 +33,7 @@ Current language not translated yet (or native English). If you're interested in translating Veyon into your local or another language or want to improve an existing translation, please contact a Veyon developer! - + About %1 %2 @@ -50,11 +48,11 @@ If you're interested in translating Veyon into your local or another langua AccessControlPage Computer access control - + Grant access to every authenticated user (default) - + Test @@ -62,15 +60,15 @@ If you're interested in translating Veyon into your local or another langua Process access control rules - + User groups authorized for computer access - + Please add the groups whose members should be authorized to access computers in your Veyon network. - + Authorized user groups @@ -80,29 +78,25 @@ If you're interested in translating Veyon into your local or another langua All groups กลุ่มทั้งหมด - - ... - ... - Access control rules - + Add access control rule - + Remove access control rule - + Move selected rule down - + Move selected rule up - + Edit selected rule @@ -114,7 +108,7 @@ If you're interested in translating Veyon into your local or another langua Please enter a user login name whose access permissions to test: - + Access allowed @@ -122,7 +116,7 @@ If you're interested in translating Veyon into your local or another langua The specified user is allowed to access computers with this configuration. - + Access denied @@ -130,7 +124,7 @@ If you're interested in translating Veyon into your local or another langua The specified user is not allowed to access computers with this configuration. - + Enable usage of domain groups @@ -138,26 +132,26 @@ If you're interested in translating Veyon into your local or another langua User groups backend: - + Missing user groups backend - + No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups - + AccessControlRuleEditDialog Edit access control rule - + General @@ -165,7 +159,7 @@ If you're interested in translating Veyon into your local or another langua enter a short name for the rule here - + Rule name: @@ -173,7 +167,7 @@ If you're interested in translating Veyon into your local or another langua enter a description for the rule here - + Rule description: @@ -181,7 +175,7 @@ If you're interested in translating Veyon into your local or another langua Invert all conditions ("is/has" interpreted as "is/has not") - + Conditions @@ -193,19 +187,19 @@ If you're interested in translating Veyon into your local or another langua Accessing computer is localhost - + Accessing user is logged on user - + Accessing user is already connected - + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Action @@ -245,7 +239,7 @@ If you're interested in translating Veyon into your local or another langua Always process rule and ignore conditions - + No user logged on @@ -253,46 +247,46 @@ If you're interested in translating Veyon into your local or another langua Accessing user has one or more groups in common with local (logged on) user - + Accessing computer and local computer are at the same location - + is located at - + Authenticated via method - + AccessControlRulesTestDialog Access control rules test - + Accessing user: - + Local computer: - + Accessing computer: - + Please enter the following user and computer information in order to test the configured ruleset. - + Local user: - + Connected users: @@ -300,15 +294,15 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario is allowed. - + The access in the given scenario is denied. - + The access in the given scenario needs permission of the logged on user. - + ERROR: Unknown action @@ -320,114 +314,22 @@ If you're interested in translating Veyon into your local or another langua Authentication method - - - - - AndroidPlatformConfigurationPage - - Android - แอนดรอยด์ - - - General - ทั่วไป - - - - AuthKeysConfigurationDialog - - Authentication keys - - - - Introduction - - - - Please perform the following steps to set up key file authentication: - - - - 1) Create a key pair on the master computer. - 1) สร้างคู่กุญแจบนคอมพิวเตอร์หลัก - - - 2) Set an access group whose members should be allowed to access other computers. - 2) ตั้งกลุ่มการเข้าถึง โดยสมาชิกใดบ้างที่จะสามารถเข้าถึงคอมพิวเตอร์เครื่องอื่นได้ - - - 3) Export the public key and import it on all client computers with the same name. - 3) ส่งออกไฟล์กุญแจสาธารณะ และนำเข้าลงในเครื่องคอมพิวเตอร์ลูกข่ายโดยใช้ชื่อไฟล์เดียวกัน - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - - - - Key file directories - ไดเรกทอรีเก็บไฟล์กุญแจ - - - Public key file base directory - - - - Private key file base directory - - - - ... - ... - - - Available authentication keys - - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - คู่กุญแจยืนยันตัวตนนั้นจะประกอบด้วยกุญแจคริปโตกราฟิกสองดอกกุญแจสาธารณะและกุญแจส่วนตัว -กุญแจส่วนตัวจะอนุญาตให้ผู้ใช้งานในเครื่องมาสเตอร์ในการการเข้าถึงเครื่องลูกข่าย -ซึ่งเป็นสิ่งที่สำคัญว่า ต้องกำหนดให้ผู้ใช้ที่ได้รับการอนุญาตเท่านั้นที่จะสามารถอ่านไฟล์กุญแจส่วนตัวได้ -ไฟล์กุญแจสาธารณะจะใช้บนเครื่องลูกข่ายเพื่อรับการยืนยันตัวตนจากการร้องขอการเชื่อมต่อที่เข้ามา - - - Create key pair - สร้างคู่กุญแจ - - - Delete key - ลบกุญแจ - - - Import key - นำเข้ากุญแจ - - - Export key - ส่งออกกุญแจ - - - Set access group - + AuthKeysConfigurationWidget Authentication keys - + Introduction - + Please perform the following steps to set up key file authentication: - + 1) Create a key pair on the master computer. @@ -443,7 +345,7 @@ The public key is used on client computers to authenticate incoming connection r Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Key file directories @@ -451,15 +353,15 @@ The public key is used on client computers to authenticate incoming connection r Public key file base directory - + Private key file base directory - + Available authentication keys - + An authentication key pair consist of two coupled cryptographic keys, a private and a public key. @@ -489,7 +391,7 @@ The public key is used on client computers to authenticate incoming connection r Set access group - + Key files (*.pem) @@ -497,15 +399,15 @@ The public key is used on client computers to authenticate incoming connection r Authentication key name - + Please enter the name of the user group or role for which to create an authentication key pair: - + Do you really want to delete authentication key "%1/%2"? - + Please select a key to delete! @@ -513,7 +415,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to import the authentication key: - + Please select a key to export! @@ -521,11 +423,11 @@ The public key is used on client computers to authenticate incoming connection r Please select a user group which to grant access to key "%1": - + Please select a key which to set the access group for! - + @@ -540,15 +442,15 @@ The public key is used on client computers to authenticate incoming connection r Invalid key type specified! Please specify "%1" or "%2". - + Specified key does not exist! Please use the "list" command to list all installed keys. - + One or more key files already exist! Please delete them using the "delete" command. - + Creating new key pair for "%1" @@ -568,11 +470,11 @@ The public key is used on client computers to authenticate incoming connection r Could not remove key file directory "%1"! - + Failed to create directory for output file. - + File "%1" already exists. @@ -580,79 +482,79 @@ The public key is used on client computers to authenticate incoming connection r Failed to write output file. - + Key "%1/%2" has been exported to "%3" successfully. - + Failed read input file. - + File "%1" does not contain a valid private key! - + File "%1" does not contain a valid public key! - + Failed to create directory for key file. - + Failed to write key file "%1". - + Failed to set permissions for key file "%1"! - + Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Failed to convert private key to public key - + Failed to create directory for private key file "%1". - + Failed to save private key in file "%1"! - + Failed to set permissions for private key file "%1"! - + Failed to create directory for public key file "%1". - + Failed to save public key in file "%1"! - + Failed to set permissions for public key file "%1"! - + Failed to set owner of key file "%1" to "%2". - + Failed to set permissions for key file "%1". - + Key "%1" is now accessible by user group "%2". - + <N/A> @@ -675,87 +577,87 @@ The public key is used on client computers to authenticate incoming connection r List authentication keys - + Import public or private key - + Export public or private key - + Extract public key from existing private key - + Set user group allowed to access a key - + KEY - + ACCESS GROUP - + This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + NAME - + FILE - + This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Please specify the command to display help for! - + TYPE - + PAIR ID - + Commands for managing authentication keys - + This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Key file authentication @@ -763,7 +665,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + @@ -782,14 +684,14 @@ The public key is used on client computers to authenticate incoming connection r Pair ID - + AuthLdapConfigurationWidget LDAP authentication - + General @@ -797,22 +699,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + AuthLdapDialog Veyon Logon - + Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -828,18 +730,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonDialog Veyon Logon - + Please enter your username and password in order to access computers. - + Username @@ -855,14 +757,14 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Logon authentication @@ -870,18 +772,18 @@ The public key is used on client computers to authenticate incoming connection r Logon - + AuthSimpleDialog Veyon Logon - + Please enter the Veyon password: - + Authentication error @@ -889,29 +791,29 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Simple password authentication - + Simple password - + AuthenticationPage Authentication methods - + Authentication is set up properly on this computer. @@ -922,7 +824,7 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPageTab Enabled - + Test @@ -961,7 +863,7 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - + Locations & computers @@ -981,7 +883,7 @@ The public key is used on client computers to authenticate incoming connection r The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + New location @@ -992,19 +894,19 @@ The public key is used on client computers to authenticate incoming connection r BuiltinDirectoryPlugin Show help for specific command - + Import objects from given file - + Export objects to given file - + Invalid type specified. Valid values are "%1" or "%2". - + Type @@ -1024,7 +926,7 @@ The public key is used on client computers to authenticate incoming connection r Specified object not found. - + File "%1" does not exist! @@ -1032,19 +934,19 @@ The public key is used on client computers to authenticate incoming connection r Can't open file "%1" for reading! - + Unknown argument "%1". - + Computer "%1" (host address: "%2" MAC address: "%3") - + Unclassified object "%1" with ID "%2" - + None @@ -1056,7 +958,7 @@ The public key is used on client computers to authenticate incoming connection r Root - + Invalid @@ -1064,35 +966,35 @@ The public key is used on client computers to authenticate incoming connection r Error while parsing line %1. - + Network object directory which stores objects in local configuration - + Commands for managing the builtin network object directory - + No format string or regular expression specified! - + Can't open file "%1" for writing! - + No format string specified! - + Object UUID - + Parent UUID - + Add a location or computer @@ -1104,91 +1006,91 @@ The public key is used on client computers to authenticate incoming connection r Dump all or individual locations and computers - + List all locations and computers - + Remove a location or computer - + Location "%1" - + Builtin (computers and locations in local configuration) - + Location - + FILE - + LOCATION - + FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Import simple CSV file to a single room - + Import CSV file with location name in first column - + Import text file with with key/value pairs using regular expressions - + Import arbitrarily formatted data - + Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Export all objects to a CSV file - + Export all computers in a specific location to a CSV file - + TYPE - + NAME - + PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Add a room @@ -1200,19 +1102,19 @@ The public key is used on client computers to authenticate incoming connection r OBJECT - + Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Remove a computer by name - + Remove an object by UUID - + "Room 01" @@ -1224,11 +1126,11 @@ The public key is used on client computers to authenticate incoming connection r HOST ADDRESS - + MAC ADDRESS - + @@ -1249,11 +1151,11 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel Host/IP address: %1 - + Active features: %1 - + Online and connected @@ -1269,7 +1171,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication failed or access denied - + Disconnected @@ -1285,22 +1187,22 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + [no user] - + Veyon Server unreachable or not running - + ComputerControlServer %1 Service %2 at %3:%4 - + Authentication error @@ -1312,30 +1214,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Access control error - + User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Active connections: - + ComputerGroupSelector Group %1 - + @@ -1346,23 +1248,23 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Location detection failed - + Computer name;Hostname;User - + Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + @@ -1373,31 +1275,27 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Select all - + Unselect all - + Add to group - + Remove from group - + ComputerSelectPanel - - Computer management - การจัดการคอมพิวเตอร์ - Computer search การค้นหาคอมพิวเตอร์ @@ -1408,11 +1306,11 @@ The public key is used on client computers to authenticate incoming connection r Save computer/user list - + Select output filename - + CSV files (*.csv) @@ -1424,109 +1322,120 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. - + + + + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + ConfigCommands Clear system-wide Veyon configuration - + List all configuration keys and values - + Import configuration from given file - + Export configuration to given file - + Read and output configuration value for given key - + Write given value to given configuration key - + Unset (remove) given configuration key - + Upgrade and save configuration of program and plugins - + Please specify an existing configuration file to import. - + Configuration file is not readable! - + Please specify a valid filename for the configuration export. - + Output file is not writable! - + Output directory is not writable! - + Please specify a valid key. - + Specified key does not exist in current configuration! - + Please specify a valid value. - + Configure Veyon at command line - + Commands for managing the configuration of Veyon - + ConfigurationManager Could not modify the autostart property for the %1 Service. - + Could not configure the firewall configuration for the %1 Server. - + Could not configure the firewall configuration for the %1 Worker. - + Configuration is not writable. Please check your permissions! - + Could not apply platform-specific configuration settings. - + Could not configure the firewall configuration for the %1 Service. - + @@ -1544,7 +1453,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + ms @@ -1552,23 +1461,19 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + Memory limit จำกัดหน่วยความจำ - - Use multithreading (experimental) - - MB MB Update interval - + s @@ -1576,7 +1481,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + @@ -1595,86 +1500,86 @@ The public key is used on client computers to authenticate incoming connection r In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + DesktopAccessDialog Desktop access dialog - + Confirm desktop access - + Never for this session - + Always for this session - + The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + @@ -1693,7 +1598,7 @@ The public key is used on client computers to authenticate incoming connection r Path - + Add new program @@ -1705,11 +1610,11 @@ The public key is used on client computers to authenticate incoming connection r Predefined websites - + Remove selected website - + URL @@ -1740,7 +1645,7 @@ The public key is used on client computers to authenticate incoming connection r Start programs and services in user desktop - + Click this button to run a program on all computers. @@ -1783,15 +1688,15 @@ The public key is used on client computers to authenticate incoming connection r Open file manager - + Start learning tool - + Play tutorial video - + Custom program @@ -1799,15 +1704,15 @@ The public key is used on client computers to authenticate incoming connection r Handout - + Texts to read - + generic-student-user - + @@ -1836,7 +1741,7 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - + @@ -1847,15 +1752,15 @@ The public key is used on client computers to authenticate incoming connection r Directories - + Destination directory - + Default source directory - + Options @@ -1863,18 +1768,18 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Create destination directory if it does not exist - + FileTransferController Could not open file "%1" for reading! Please check your permissions! - + @@ -1943,11 +1848,11 @@ The public key is used on client computers to authenticate incoming connection r Could not receive file "%1" as it already exists. - + Could not receive file "%1" as it could not be opened for writing! - + @@ -1970,19 +1875,15 @@ The public key is used on client computers to authenticate incoming connection r Logging - + Log file directory - - - - ... - ... + Log level - + Nothing @@ -1990,71 +1891,71 @@ The public key is used on client computers to authenticate incoming connection r Only critical messages - + Errors and critical messages - + Warnings and errors - + Information, warnings and errors - + Debug messages and everything else - + Limit log file size - + Clear all log files - + Log to standard error output - + Network object directory - + Backend: - + Update interval: - + %1 service - + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Log files cleared - + All log files were cleared successfully. - + Error - + Could not remove all log files. - + MB @@ -2062,7 +1963,7 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + x @@ -2074,68 +1975,59 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - - - - Authentication - การยืนยันตัวตน - - - Method: - วิธีการ: - - - Test - ทดสอบ + + + + HeadlessVncServer - Configure - + Headless VNC server + LdapBrowseDialog Browse LDAP - + LdapClient LDAP error description: %1 - + LdapConfiguration LDAP connection failed - + Could not connect to the LDAP server. Please check the server parameters. %1 - + LDAP bind failed - + Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful - + Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + LDAP base DN test failed @@ -2145,7 +2037,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2155,66 +2047,66 @@ The public key is used on client computers to authenticate incoming connection r The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed - + Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful - + The LDAP naming context has been queried successfully. The following base DN was found: %1 - + user tree - + User tree - + group tree - + Group tree - + computer tree - + Computer tree - + computer group tree - + Computer group tree - + user objects - + User login name attribute - + group members @@ -2222,7 +2114,7 @@ The public key is used on client computers to authenticate incoming connection r Group member attribute - + Group not found @@ -2230,75 +2122,75 @@ The public key is used on client computers to authenticate incoming connection r Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + computer objects - + Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses - + Computer MAC address attribute - + computer locations - + Computer location attribute - + Location name attribute - + users - + user groups - + computers - + computer groups - + computer containers - + groups of user - + User not found @@ -2306,51 +2198,51 @@ The public key is used on client computers to authenticate incoming connection r Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer - + Computer not found - + Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups - + Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2360,7 +2252,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2368,7 +2260,7 @@ The public key is used on client computers to authenticate incoming connection r The %1 has been queried successfully and %2 entries were found. - + LDAP test failed @@ -2378,11 +2270,11 @@ The public key is used on client computers to authenticate incoming connection r Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful @@ -2392,25 +2284,25 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully: %3 - + LDAP filter test failed - + Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + LDAP filter test successful - + %1 %2 have been queried successfully using the configured filter. - + @@ -2425,31 +2317,31 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Bind DN - + Bind password - + Anonymous bind - + Use bind credentials - + Base DN - + Fixed base DN - + e.g. dc=example,dc=org @@ -2457,31 +2349,31 @@ The public key is used on client computers to authenticate incoming connection r Discover base DN by naming context - + e.g. namingContexts or defaultNamingContext - + Environment settings - + Object trees - + Computer tree - + e.g. OU=Groups - + User tree - + e.g. OU=Users @@ -2493,39 +2385,39 @@ The public key is used on client computers to authenticate incoming connection r Group tree - + Perform recursive search operations in object trees - + Object attributes - + e.g. hwAddress - + e.g. member or memberUid - + e.g. dNSHostName - + Computer MAC address attribute - + Group member attribute - + e.g. uid or sAMAccountName - + Advanced settings @@ -2533,39 +2425,39 @@ The public key is used on client computers to authenticate incoming connection r Optional object filters - + Filter for user groups - + Filter for users - + Filter for computer groups - + Group member identification - + Distinguished name (Samba/AD) - + List all groups of a user - + List all groups of a computer - + Get computer object by IP address - + Enter username @@ -2573,87 +2465,87 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Enter group name - + Please enter a group name whose members to query: - + Enter computer name - + Enter computer DN - + Please enter the DN of a computer whose MAC address to query: - + Please enter a user login name whose group memberships to query: - + Enter computer IP address - + Please enter a computer IP address which to resolve to an computer object: - + (only if different from group tree) - + Computer group tree - + Filter for computers - + e.g. room or computerLab - + Integration tests - + Computer groups - + e.g. name or description - + Filter for computer containers - + Computer containers or OUs - + Connection security - + TLS certificate verification - + System defaults - + Never (insecure!) @@ -2661,7 +2553,7 @@ The public key is used on client computers to authenticate incoming connection r Custom CA certificate file - + None @@ -2697,43 +2589,43 @@ The public key is used on client computers to authenticate incoming connection r Certificate files (*.pem) - + Encryption protocol - + Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations @@ -2741,15 +2633,15 @@ The public key is used on client computers to authenticate incoming connection r Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): @@ -2757,15 +2649,15 @@ The public key is used on client computers to authenticate incoming connection r Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2773,148 +2665,101 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + LdapPlugin Auto-configure the base DN via naming context - + Query objects from LDAP directory - + Show help about command - + Commands for configuring and testing LDAP/AD integration - + Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - - - - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - ใบอนุญาตที่ติดตั้งอยู่ - - - Add new network range - - - - Remove selected network range - - - - ID - ID - - - Valid until - ใช้ได้จนถึง - - - Licensee - ผู้ขอรับใบอนุญาต - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - + LinuxPlatformConfigurationPage Linux - + Custom PAM service for user authentication - + User authentication @@ -2922,18 +2767,18 @@ The public key is used on client computers to authenticate incoming connection r Session management - + Display manager users - + LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + @@ -2944,18 +2789,18 @@ The public key is used on client computers to authenticate incoming connection r enter search filter... - + MainToolBar Configuration - + Disable balloon tooltips - + Show icons only @@ -2966,11 +2811,11 @@ The public key is used on client computers to authenticate incoming connection r MainWindow MainWindow - + toolBar - + General @@ -3010,7 +2855,7 @@ The public key is used on client computers to authenticate incoming connection r Configuration not writable - + Load settings from file @@ -3022,11 +2867,11 @@ The public key is used on client computers to authenticate incoming connection r Unsaved settings - + There are unsaved settings. Quit anyway? - + Veyon Configurator @@ -3034,15 +2879,15 @@ The public key is used on client computers to authenticate incoming connection r Service - + Master - + Access control - + About Veyon @@ -3050,7 +2895,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + About @@ -3058,7 +2903,7 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + JSON files (*.json) @@ -3066,7 +2911,7 @@ The public key is used on client computers to authenticate incoming connection r The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Access denied @@ -3074,7 +2919,7 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Screenshots @@ -3082,7 +2927,7 @@ The public key is used on client computers to authenticate incoming connection r Feature active - + The feature "%1" is still active. Please stop it before closing %2. @@ -3090,27 +2935,23 @@ The public key is used on client computers to authenticate incoming connection r Reset configuration - + Do you really want to reset the local configuration and revert all settings to their defaults? - + Search users and computers - - - - Adjust optimal size - + Align computers to grid - + %1 Configurator - + Insufficient privileges @@ -3118,7 +2959,7 @@ The public key is used on client computers to authenticate incoming connection r Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers @@ -3126,7 +2967,7 @@ The public key is used on client computers to authenticate incoming connection r &Save settings to file - + &View @@ -3153,47 +2994,43 @@ The public key is used on client computers to authenticate incoming connection r การยืนยันตัวตน - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + MasterConfigurationPage Directories - - - - ... - ... + User configuration - + Feature on computer double click: - + Features - + All features - + Disabled features - + Screenshots @@ -3209,11 +3046,11 @@ The public key is used on client computers to authenticate incoming connection r Behaviour - + Enforce selected mode for client computers - + Hide local computer @@ -3221,7 +3058,7 @@ The public key is used on client computers to authenticate incoming connection r Hide computer filter field - + Actions such as rebooting or powering down computers @@ -3237,7 +3074,7 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail update interval - + ms @@ -3245,11 +3082,11 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Modes and features - + User and computer name @@ -3265,7 +3102,7 @@ The public key is used on client computers to authenticate incoming connection r Computer thumbnail caption - + Text color @@ -3289,7 +3126,7 @@ The public key is used on client computers to authenticate incoming connection r Allow adding hidden locations manually - + Hide empty locations @@ -3297,51 +3134,51 @@ The public key is used on client computers to authenticate incoming connection r Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - - - - Automatically adjust computer thumbnail size - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + - Thumbnail aspect ratio - + Auto + - Auto - + Thumbnail aspect ratio + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3352,102 +3189,11 @@ The public key is used on client computers to authenticate incoming connection r Builtin monitoring mode - + This mode allows you to monitor all computers at one or more locations. - - - - - NetworkDiscoveryConfigurationPage - - Network discovery - การค้นพบเครือข่าย - - - Mode - โหมด - - - Scan network ranges - สแกนระยะเครือข่าย - - - e.g. 192.168.1.0/24 - เช่น 192.168.1.0/24 - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - ทดสอบ - - - Network ranges - ระยะเครือข่าย - - - Add new group - เพิ่มกลุ่มใหม่ - - - Remove selected group - ลบกลุ่มที่เลือก - - - Groups - กลุ่ม - - - First address - ที่อยู่แรก - - - Last address - ที่อยู่สุดท้าย - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - สแกนคู่ขนาน - - - Scan timeout - กำหนดการหมดเวลาการสแกน - - - ms - ms - - - Session scan limit - - - - Options - ตัวเลือก - - - Reverse lookup discovered IP addresses to host names - + @@ -3488,11 +3234,11 @@ The public key is used on client computers to authenticate incoming connection r PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3500,23 +3246,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3559,7 +3305,7 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - + Do you really want to power down the selected computer? @@ -3571,23 +3317,23 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS - + This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! - + Commands for controlling power status of computers - + Power down now @@ -3607,7 +3353,7 @@ The public key is used on client computers to authenticate incoming connection r The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. @@ -3625,7 +3371,7 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes @@ -3652,7 +3398,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Remote access @@ -3664,29 +3410,29 @@ Please save your work and close all programs. Please enter the hostname or IP address of the computer to access: - + Show help about command - + RemoteAccessPage Remote access: %1 - + RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 - %3 Remote Access - + @@ -3764,7 +3510,7 @@ Please save your work and close all programs. RunProgramDialog Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - + Run programs @@ -3807,15 +3553,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3826,7 +3572,7 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Screenshot @@ -3834,7 +3580,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3853,11 +3599,11 @@ Please save your work and close all programs. Screenshot of %1 computer have been taken successfully. - + Take screenshots of computers and save them locally. - + @@ -3871,7 +3617,7 @@ Please save your work and close all programs. ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + User: @@ -3899,11 +3645,11 @@ Please save your work and close all programs. Screenshot - ภาพหน้าจอ + ภาพหน้าจอ Do you really want to delete all selected screenshots? - + @@ -3918,7 +3664,7 @@ Please save your work and close all programs. Hide tray icon - + Start service @@ -3934,15 +3680,7 @@ Please save your work and close all programs. State: - - - - Network - เครือข่าย - - - Demo server port - + Enable firewall exception @@ -3952,10 +3690,6 @@ Please save your work and close all programs. Allow connections from localhost only อนุญาตการเชื่อมต่อจาก localhost เท่านั้น - - Internal VNC server port - พอร์ตของเซิฟเวอร์ VNC ภายใน - VNC server เซิฟเวอร์ VNC @@ -3970,68 +3704,56 @@ Please save your work and close all programs. All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Running กำลังทำงาน - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection แสดงการแจ้งเตือนเมื่อมีการเชื่อมต่อจากระยะไกล - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked แสดงการแจ้งเตือนเมื่อการเข้าถึงที่ไม่ได้รับอนุญาตถูกบล็อก Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4039,7 +3761,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4101,18 +3823,18 @@ Typically this is required to support terminal servers. Query status of Veyon Service - + Commands for configuring and controlling Veyon Service - + ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -4120,90 +3842,91 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + SystemTrayIcon System tray icon - + SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4214,7 +3937,7 @@ Typically this is required to support terminal servers. Use the field below to type your message which will be sent to all selected users. - + @@ -4240,11 +3963,11 @@ Typically this is required to support terminal servers. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + Poll full screen (leave this enabled per default) - + Low accuracy (turbo mode) @@ -4260,29 +3983,33 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer - + + + + Maximum CPU usage + UserConfig No write access - + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4297,11 +4024,11 @@ Typically this is required to support terminal servers. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off @@ -4321,7 +4048,7 @@ Typically this is required to support terminal servers. User session control - + @@ -4340,15 +4067,15 @@ Typically this is required to support terminal servers. Available commands: - + Invalid arguments given - + Not enough arguments given - use "%1 help" for more information - + Unknown result! @@ -4356,39 +4083,39 @@ Typically this is required to support terminal servers. Available modules: - + No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test @@ -4413,14 +4140,14 @@ Typically this is required to support terminal servers. WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + WindowsPlatformConfigurationPage Windows - + General @@ -4428,7 +4155,7 @@ Typically this is required to support terminal servers. Enable SAS generation by software (Ctrl+Alt+Del) - + Screen lock @@ -4436,11 +4163,11 @@ Typically this is required to support terminal servers. Hide taskbar - + Hide start menu - + Hide desktop @@ -4452,34 +4179,34 @@ Typically this is required to support terminal servers. Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + @@ -4506,22 +4233,22 @@ Typically this is required to support terminal servers. The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + X11VncConfigurationWidget Builtin x11vnc server configuration - + Custom x11vnc parameters: - + Do not use X Damage extension @@ -4532,7 +4259,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_tr.ts b/translations/veyon_tr.ts index f0cafedf9..f25c3092a 100644 --- a/translations/veyon_tr.ts +++ b/translations/veyon_tr.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v All groups Tüm kümeler - - ... - ... - Access control rules Erişim denetim kuralları @@ -325,98 +319,6 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v Kimlik doğrulama yöntemi - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Genel - - - - AuthKeysConfigurationDialog - - Authentication keys - Yetkilendirme anahtarları - - - Introduction - Giriş - - - Please perform the following steps to set up key file authentication: - Anahtar dosyası yetkilendirmesi için lütfen bu adımları gerçekleştirin: - - - 1) Create a key pair on the master computer. - 1) Ana bilgisayarda anahtar çifti oluşturun. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Diğer bilgisayarlara giriş yetkisi olan bir giriş grubu oluşturun. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Genel anahtarı dışarı verin ve tüm katılımcı bilgisayarlara aynı isimle ekleyin. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Lütfen <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Yönetici Kılavuzuna </a> daha fazla bilgi için göz atın. - - - Key file directories - Anahtar dosyası dizinleri - - - Public key file base directory - Genel anahtar dizin yolu - - - Private key file base directory - Özel anahtar dizin yolu - - - ... - ... - - - Available authentication keys - Kullanılabilir yetkilendirme anahtarları - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Bir kimlik doğrulama anahtarı çifti, özel ve genel anahtar olmak üzere iki bağlantılı şifreleme anahtarından oluşur. -Özel anahtar, ana bilgisayardaki kullanıcıların istemci bilgisayarlara erişmesine olanak tanır. -Özel anahtar dosyasına yalnızca yetkili kullanıcıların okuma erişimi olması önemlidir. -Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini doğrulamak için kullanılır. - - - Create key pair - Anahtar çifti oluştur - - - Delete key - Anahtarı sil - - - Import key - Anahtarı içe aktar - - - Export key - Anahtarı dışa aktar - - - Set access group - Erişim grubunu ayarla - - AuthKeysConfigurationWidget @@ -1138,11 +1040,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do FORMAT-STRING-WITH-PLACEHOLDERS - + REGULAR-EXPRESSION-WITH-PLACEHOLDER - + Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 @@ -1291,11 +1193,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do [no user] - + Veyon Server unreachable or not running - + @@ -1396,10 +1298,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do ComputerSelectPanel - - Computer management - Bilgisayar yönetimi - Computer search Bilgisayar ara @@ -1429,6 +1327,17 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Bilgisayar ve kullanıcı listesi %1 konumuna yazılamadı! Lütfen dosya erişim izinlerini gözden geçirin. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1560,10 +1469,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Memory limit Bellek sınırı - - Use multithreading (experimental) - Çoklu iş parçacığı kullanımı (deneysel) - MB MB @@ -1601,59 +1506,59 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1853,11 +1758,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Destination directory - + Default source directory - + Options @@ -1865,11 +1770,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Remember last source directory - + Create destination directory if it does not exist - + @@ -1978,10 +1883,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Log file directory Günlük dosyası dizini - - ... - ... - Log level Günlükleme düzeyi @@ -2078,21 +1979,12 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Write to logging system of operating system İşletim sisteminin günlükleme sistemine yaz + + + HeadlessVncServer - Authentication - Kimlik - - - Method: - Yöntem: - - - Test - Sına - - - Configure - Yapılandır + Headless VNC server + @@ -2163,7 +2055,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2173,7 +2065,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2255,11 +2147,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute @@ -2315,7 +2207,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer @@ -2327,7 +2219,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed @@ -2335,7 +2227,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries @@ -2369,7 +2261,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2387,7 +2279,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and @@ -2654,7 +2546,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Computer containers or OUs - + Connection security @@ -2702,11 +2594,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do e.g. (objectClass=room) or (objectClass=computerLab) - + e.g. (objectClass=container) or (objectClass=organizationalUnit) - + Certificate files (*.pem) @@ -2730,7 +2622,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do e.g. cn or displayName - + Computer locations identification @@ -2742,7 +2634,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Location attribute in computer objects - + List all entries of a location @@ -2766,7 +2658,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter the name of a computer location (wildcards allowed): - + Enter location name @@ -2774,7 +2666,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter the name of a location whose entries to query: - + Browse @@ -2786,7 +2678,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute @@ -2794,7 +2686,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter a computer hostname to query: - + Enter hostname @@ -2802,7 +2694,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter a computer hostname whose group memberships to query: - + User login name attribute @@ -2810,7 +2702,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Configured attribute for user login name or computer hostname (OpenLDAP) - + @@ -2833,31 +2725,31 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server @@ -2872,53 +2764,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do LDAP bağlaması - - LicensingConfigurationPage - - Licensing - Lisans - - - Installed licenses - Kurulu lisanslar - - - Add new network range - Yeni Ağ aralığı ekle - - - Remove selected network range - Seçili Ağ aralığını sil - - - ID - ID - - - Valid until - Geçerli tarih - - - Licensee - Lisans - - - Information - Bilgi - - - Installation ID - Kurulum ID - - - Addons available for licensing - Bu lisans için kullanılabilir eklentiler - - - Addon - Eklenti - - LinuxPlatformConfigurationPage @@ -3113,10 +2958,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Search users and computers Kullanıcı ve bilgisayarları ara - - Adjust optimal size - En uygun boyuta ayarla - Align computers to grid Bilgisayarları ızgaraya hizala @@ -3166,16 +3007,16 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Kimlik - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3184,10 +3025,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Directories Dizinler - - ... - ... - User configuration Kullanıcı yapılandırması @@ -3320,10 +3157,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Automatically select current location Geçerli konumu otomatik olarak seç - - Automatically adjust computer thumbnail size - Bilgisayarın küçük resim boyutunu otomatik olarak ayarla - Automatically open computer select panel Bilgisayar seçme panelini otomatik olarak aç @@ -3334,27 +3167,31 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto Kendiliğinden + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3372,97 +3209,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Bu mod, bir veya daha fazla konumdaki tüm bilgisayarları izlemenizi sağlar. - - NetworkDiscoveryConfigurationPage - - Network discovery - Ağ keşfi - - - Mode - Kip - - - Scan network ranges - Ağ aralıklarını tara - - - e.g. 192.168.1.0/24 - Örnek: 192.168.1.0/24 - - - Scan all subnets of computer - Bilgisayarın tüm alt ağlarını tara - - - Scan custom subnet - Özel alt ağ taraması - - - Scan sessions on local computer - Yerel bilgisayardaki oturumları tara - - - Test - Sına - - - Network ranges - Ağ aralıkları - - - Add new group - Yeni grup ekle - - - Remove selected group - Seçilen grubu kaldır - - - Groups - Gruplar - - - First address - İlk adres - - - Last address - Son adres - - - Add new network range - Yeni Ağ aralığı ekle - - - Remove selected network range - Seçili Ağ aralığını sil - - - Parallel scans - Paralel tarama - - - Scan timeout - Tarama süre limiti - - - ms - ms - - - Session scan limit - Oturum tarama limiti - - - Options - Seçenekler - - - Reverse lookup discovered IP addresses to host names - Keşfedilen IP adreslerinden sunucu adlarına doğru ters arama - - NetworkObjectTreeModel @@ -3700,7 +3446,7 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. %1 - %2 - %3 Remote Access - + @@ -3821,15 +3567,15 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3913,11 +3659,11 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. Screenshot - Ekran görüntüsü + Ekran görüntüsü Do you really want to delete all selected screenshots? - + @@ -3950,14 +3696,6 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.State: Durum: - - Network - - - - Demo server port - Tanıtım sunucusu bağlantı noktası - Enable firewall exception Güvenlik duvarı özel durumu etkinleştir @@ -3966,10 +3704,6 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.Allow connections from localhost only Yalnızca yerel sunucu bağlantılarına izin ver - - Internal VNC server port - Dahili VNC sunucu bağlantı noktası - VNC server VNC sunucusu @@ -3990,14 +3724,6 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.Running Çalışıyor - - Feature manager port - Özellik yöneticisi bağlantı noktası - - - Primary service port - Birincil hizmet bağlantı noktası - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4008,45 +3734,41 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.Show notification on remote connection Uzak bağlantıda bildirim göster - - Multi session mode (for terminal and remote desktop servers) - Çoklu oturum modu (terminal ve uzak masaüstü sunucuları için) - Show notification when an unauthorized access is blocked Yetkisiz erişim engellendiğinde bildirim göster Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4054,7 +3776,7 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir. Miscellaneous network settings - + @@ -4146,50 +3868,51 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4277,6 +4000,10 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.Enable Desktop Duplication Engine on Windows 8 and newer Windows 8 ve daha yeni sürümlerde Masaüstü Çoğaltma Altyapısını etkinleştir + + Maximum CPU usage + + UserConfig @@ -4550,4 +4277,4 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.Veyon Usta - + \ No newline at end of file diff --git a/translations/veyon_uk.ts b/translations/veyon_uk.ts index b2525e127..1ef333628 100644 --- a/translations/veyon_uk.ts +++ b/translations/veyon_uk.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ If you're interested in translating Veyon into your local or another langua All groups Всі групи - - ... - ... - Access control rules Правила керування доступом @@ -325,95 +319,6 @@ If you're interested in translating Veyon into your local or another langua Метод розпізнавання - - AndroidPlatformConfigurationPage - - Android - Android - - - General - Загальні - - - - AuthKeysConfigurationDialog - - Authentication keys - Ключі розпізнавання - - - Introduction - Вступ - - - Please perform the following steps to set up key file authentication: - Будь ласка, виконайте такі кроки, щоб налаштувати файл ключа розпізнавання: - - - 1) Create a key pair on the master computer. - 1) Створіть пару ключів на основному комп'ютері. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Встановіть групу доступу, учасникам якої буде дозволено доступу до інших комп'ютерів. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Експортуйте відкритий ключ і імпортуйте його на всіх клієнтські комп'ютери із однаковою назвою. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Будь ласка, ознайомтеся із <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Підручником із адміністрування Veyon</a>, щоб дізнатися більше. - - - Key file directories - Каталоги файлів ключів - - - Public key file base directory - Основний каталог файлів відкритих ключів - - - Private key file base directory - Основний каталог файлів закритих ключів - - - ... - ... - - - Available authentication keys - Доступні ключі розпізнавання - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Пара ключів для розпізнавання складається із поєднаних між собою криптографічних ключів, закритого і відкритого. За допомогою закритого ключа користувачі на основному комп'ютері можуть отримувати доступу до клієнтських комп'ютерів. Важливо, щоб право на читання файла закритого ключа мали лише уповноважені на це користувачі. Відкритий ключ використовується на клієнтських комп'ютерах для розпізнавання вхідних запитів щодо з'єднання. - - - Create key pair - Створити пару ключів - - - Delete key - Вилучити ключ - - - Import key - Імпорт ключа - - - Export key - Експортувати ключ - - - Set access group - Встановити групу доступу - - AuthKeysConfigurationWidget @@ -1285,11 +1190,11 @@ The public key is used on client computers to authenticate incoming connection r [no user] - + [немає користувача] Veyon Server unreachable or not running - + Сервер Veyon є недоступним або сервер не запущено @@ -1390,10 +1295,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - Керування комп'ютерами - Computer search Пошук комп’ютера @@ -1423,6 +1324,17 @@ The public key is used on client computers to authenticate incoming connection r Не вдалося записати список комп’ютерів і користувачів до %1! Будь ласка, перевірте, чи є у вас належні права для доступу до цього файла. + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1554,10 +1466,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit Межа пам’яті - - Use multithreading (experimental) - Використовувати багатопоточність (експериментальне) - MB МБ @@ -1972,10 +1880,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory Каталог файла журналу - - ... - ... - Log level Рівень журналювання @@ -2072,21 +1976,12 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system Записувати до журналу операційної системи + + + HeadlessVncServer - Authentication - Розпізнавання - - - Method: - Метод: - - - Test - Перевірити - - - Configure - Налаштувати + Headless VNC server + Автоматичний сервер VNC @@ -2876,53 +2771,6 @@ The public key is used on client computers to authenticate incoming connection r Прив'язка до LDAP - - LicensingConfigurationPage - - Licensing - Ліцензування - - - Installed licenses - Встановлені ліцензії - - - Add new network range - Додати новий діапазон мережі - - - Remove selected network range - Вилучити позначений діапазон мережі - - - ID - Ідентифікатор - - - Valid until - Чинний до - - - Licensee - Ліцензіат - - - Information - Інформація - - - Installation ID - Ід. встановлення - - - Addons available for licensing - Додатки, які доступні до ліцензування - - - Addon - Додаток - - LinuxPlatformConfigurationPage @@ -3117,10 +2965,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers Пошук користувачів і комп'ютерів - - Adjust optimal size - Скоригувати оптимальний розмір - Align computers to grid Вирівняти комп'ютери за ґраткою @@ -3169,6 +3013,10 @@ The public key is used on client computers to authenticate incoming connection r Authentication Розпізнавання + + Adjust size of computer icons automatically + Автоматично коригувати розмір піктограм комп'ютерів + Slideshow Показ слайдів @@ -3177,10 +3025,6 @@ The public key is used on client computers to authenticate incoming connection r Spotlight Акцент - - Adjust size of computer icons automatically - - MasterConfigurationPage @@ -3188,10 +3032,6 @@ The public key is used on client computers to authenticate incoming connection r Directories Каталоги - - ... - ... - User configuration Налаштування користувачів @@ -3324,10 +3164,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location Автоматично вибирати поточне місце - - Automatically adjust computer thumbnail size - Автоматично коригувати розмір мініатюри комп'ютера - Automatically open computer select panel Автоматично відкрити панель вибору комп'ютера @@ -3348,17 +3184,21 @@ The public key is used on client computers to authenticate incoming connection r Hide local session Приховати локальний сеанс + + Auto + Авто + Thumbnail aspect ratio Співвідношення розмірів мініатюри - Auto - Авто + Automatically adjust computer icon size + Автоматично коригувати розмір піктограм комп'ютерів - Automatically adjust computer icon size - + Open feature windows on the same screen as the main window + Відкривати вікна додатків на тому самому екрані, що і головне вікно @@ -3376,97 +3216,6 @@ The public key is used on client computers to authenticate incoming connection r У цьому режимі ви можете спостерігати за усіма комп'ютерами у одному або декількох місцях. - - NetworkDiscoveryConfigurationPage - - Network discovery - Виявлення мережі - - - Mode - Режим - - - Scan network ranges - Сканувати діапазони мережі - - - e.g. 192.168.1.0/24 - Приклад: 192.168.1.0/24 - - - Scan all subnets of computer - Сканувати усі підмережі комп'ютера - - - Scan custom subnet - Сканувати нетипову підмережу - - - Scan sessions on local computer - Сканувати сеанси на локальному комп'ютері - - - Test - Перевірити - - - Network ranges - Діапазони мережі - - - Add new group - Додати нову групу - - - Remove selected group - Вилучити позначену групу - - - Groups - Групи - - - First address - Перша адреса - - - Last address - Остання адреса - - - Add new network range - Додати новий діапазон мережі - - - Remove selected network range - Вилучити позначений діапазон мережі - - - Parallel scans - Паралельне сканування - - - Scan timeout - Час очікування на сканування - - - ms - мс - - - Session scan limit - Обмеження сканування сеансів - - - Options - Параметри - - - Reverse lookup discovered IP addresses to host names - Зворотним пошуком визначено IP-адреси для назв вузлів - - NetworkObjectTreeModel @@ -3704,7 +3453,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + %1 — %2 — %3, віддалений доступ @@ -3917,11 +3666,11 @@ Please save your work and close all programs. Screenshot - Знімок вікна + Знімок вікна Do you really want to delete all selected screenshots? - + Справді хочете вилучити усі позначені знімки вікон? @@ -3954,14 +3703,6 @@ Please save your work and close all programs. State: Стан: - - Network - Мережа - - - Demo server port - Порт демосервера - Enable firewall exception Увімкнути виключення брандмауера @@ -3970,10 +3711,6 @@ Please save your work and close all programs. Allow connections from localhost only Дозволити з’єднання лише з локального вузла - - Internal VNC server port - Порт внутрішнього сервера VNC - VNC server Сервер VNC @@ -3994,14 +3731,6 @@ Please save your work and close all programs. Running Запущено - - Feature manager port - Порт керування можливостями - - - Primary service port - Порт основної служби - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4012,10 +3741,6 @@ Typically this is required to support terminal servers. Show notification on remote connection Показувати сповіщення щодо віддаленого з'єднання - - Multi session mode (for terminal and remote desktop servers) - Режим із багатьма сеансами (для сервера-термінала та сервера віддаленої стільниці) - Show notification when an unauthorized access is blocked Показувати сповіщення, коли програма блокує неуповноважений доступ @@ -4167,10 +3892,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - Додайте комп'ютери клацанням середньої кнопки миші або натисканням першої кнопки нижче. - Add selected computers Додати позначені комп'ютери @@ -4195,6 +3916,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. Будь ласка, позначте принаймні один комп'ютер для вилучення. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4281,6 +4007,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer Увімкнути рушій дублювання стільниці у Windows 8 та новіших версіях + + Maximum CPU usage + Максимальне використання процесора + UserConfig @@ -4554,4 +4284,4 @@ Typically this is required to support terminal servers. Головний комп'ютер Veyon (Veyon Master) - + \ No newline at end of file diff --git a/translations/veyon_vi.ts b/translations/veyon_vi.ts index c11680782..3a2065531 100644 --- a/translations/veyon_vi.ts +++ b/translations/veyon_vi.ts @@ -80,10 +80,6 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa All groups Tất cả các nhóm - - ... - ... - Access control rules Quy tắc điều khiển truy cập @@ -323,98 +319,6 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa - - AndroidPlatformConfigurationPage - - Android - - - - General - Chung - - - - AuthKeysConfigurationDialog - - Authentication keys - Khóa xác thực - - - Introduction - Giới thiệu - - - Please perform the following steps to set up key file authentication: - Vui lòng thực hiện các bước sau để thiết lập xác thực tập tin khóa: - - - 1) Create a key pair on the master computer. - 1) Tạo một cặp khóa trên máy tính chủ. - - - 2) Set an access group whose members should be allowed to access other computers. - 2) Thiết lập một nhóm truy cập mà các thành viên sẽ được phép truy cập vào các máy tính khác. - - - 3) Export the public key and import it on all client computers with the same name. - 3) Xuất khóa công và nhập nó trên tất cả các máy tính khách với cùng tên. - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - Vui lòng tham khảo <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Hướng dẫn quản trị Veyon</a>để biết thêm thông tin. - - - Key file directories - Thư mục tập tin khóa - - - Public key file base directory - Thư mục cơ sở tập tin khóa công - - - Private key file base directory - Thư mục cơ sở tập tin khóa riêng - - - ... - ... - - - Available authentication keys - Khóa xác thực khả dụng - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - Một cặp khóa xác thực bao gồm hai khóa mật mã, một khóa riêng và một khóa công. -Một khóa riêng cho phép người dùng trên máy tính chủ truy cập vào các máy tính khách. -Điều quan trọng đó là chỉ những người dùng được cấp quyền mới có truy cập đọc vào tập tin khóa riêng. -Khóa công được sử dụng trên các máy tính khách để xác thực yêu cầu kết nối đến. - - - Create key pair - Tặp cặp khóa - - - Delete key - Xóa khóa - - - Import key - Nhập khóa - - - Export key - Xuất khóa - - - Set access group - Đặt nhóm truy cập - - AuthKeysConfigurationWidget @@ -1394,10 +1298,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực ComputerSelectPanel - - Computer management - - Computer search @@ -1427,6 +1327,17 @@ Khóa công được sử dụng trên các máy tính khách để xác thực + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1558,10 +1469,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Memory limit - - Use multithreading (experimental) - - MB @@ -1976,10 +1883,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Log file directory - - ... - ... - Log level @@ -2076,20 +1979,11 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Write to logging system of operating system + + + HeadlessVncServer - Authentication - - - - Method: - - - - Test - Kiểm tra - - - Configure + Headless VNC server @@ -2859,53 +2753,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - - LicensingConfigurationPage - - Licensing - - - - Installed licenses - - - - Add new network range - - - - Remove selected network range - - - - ID - - - - Valid until - - - - Licensee - - - - Information - - - - Installation ID - - - - Addons available for licensing - - - - Addon - - - LinuxPlatformConfigurationPage @@ -3100,10 +2947,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Search users and computers - - Adjust optimal size - - Align computers to grid @@ -3171,10 +3014,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Directories - - ... - ... - User configuration @@ -3307,10 +3146,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Automatically select current location - - Automatically adjust computer thumbnail size - - Automatically open computer select panel @@ -3343,6 +3178,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Automatically adjust computer icon size + + Open feature windows on the same screen as the main window + + MonitoringMode @@ -3359,97 +3198,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - - NetworkDiscoveryConfigurationPage - - Network discovery - - - - Mode - - - - Scan network ranges - - - - e.g. 192.168.1.0/24 - - - - Scan all subnets of computer - - - - Scan custom subnet - - - - Scan sessions on local computer - - - - Test - Kiểm tra - - - Network ranges - - - - Add new group - - - - Remove selected group - - - - Groups - - - - First address - - - - Last address - - - - Add new network range - - - - Remove selected network range - - - - Parallel scans - - - - Scan timeout - - - - ms - - - - Session scan limit - - - - Options - - - - Reverse lookup discovered IP addresses to host names - - - NetworkObjectTreeModel @@ -3935,14 +3683,6 @@ Please save your work and close all programs. State: - - Network - - - - Demo server port - - Enable firewall exception @@ -3951,10 +3691,6 @@ Please save your work and close all programs. Allow connections from localhost only - - Internal VNC server port - - VNC server @@ -3975,14 +3711,6 @@ Please save your work and close all programs. Running - - Feature manager port - - - - Primary service port - - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -3992,10 +3720,6 @@ Typically this is required to support terminal servers. Show notification on remote connection - - Multi session mode (for terminal and remote desktop servers) - - Show notification when an unauthorized access is blocked @@ -4147,10 +3871,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers @@ -4175,6 +3895,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4261,6 +3986,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer + + Maximum CPU usage + + UserConfig diff --git a/translations/veyon_zh_CN.ts b/translations/veyon_zh_CN.ts index 4271e1e30..2538facbb 100644 --- a/translations/veyon_zh_CN.ts +++ b/translations/veyon_zh_CN.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ If you're interested in translating Veyon into your local or another langua All groups 所有群组 - - ... - ... - Access control rules 访问控制规则 @@ -267,7 +261,7 @@ If you're interested in translating Veyon into your local or another langua Authenticated via method - + @@ -325,99 +319,6 @@ If you're interested in translating Veyon into your local or another langua 验证模式 - - AndroidPlatformConfigurationPage - - Android - 安卓 - - - General - 常规 - - - - AuthKeysConfigurationDialog - - Authentication keys - 验证密钥 - - - Introduction - 介绍 - - - Please perform the following steps to set up key file authentication: - 请按以下步骤设置密钥文件验证: - - - 1) Create a key pair on the master computer. - 1)在主计算机上创建密钥对。 - - - 2) Set an access group whose members should be allowed to access other computers. - 2)设置一个访问组,其成员应该被允许访问其他计算机。 - - - 3) Export the public key and import it on all client computers with the same name. - 3)将公钥其导入到具有相同名称的所有客户端计算机上。 - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - 请访问链接 <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon 管理员手册</a> 以获得更多信息。 - - - Key file directories - 密钥文件目录 - - - Public key file base directory - 公钥文件主目录 - - - Private key file base directory - 私钥文件主目录 - - - ... - ... - - - Available authentication keys - 可用的验证密钥 - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - 密钥包括两部分,私钥和公钥。 -私钥允许主机上的用户访问客户机。 -重要:只有经过验证的用户才可以读取私钥文件。 -公钥存放于客户端电脑,用以验证前来访问的请求。 - - - - Create key pair - 创建密钥对 - - - Delete key - 删除密钥 - - - Import key - 导入密钥 - - - Export key - 导出密钥 - - - Set access group - 设置访问组 - - AuthKeysConfigurationWidget @@ -801,11 +702,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + @@ -816,7 +717,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Username @@ -908,7 +809,7 @@ The public key is used on client computers to authenticate incoming connection r Simple password - + @@ -1048,7 +949,7 @@ The public key is used on client computers to authenticate incoming connection r Unclassified object "%1" with ID "%2" -  ID 为 "%2" 的未分类对象 "%1" +  ID 为 "%2" 的未分类对象 "%1" None @@ -1293,11 +1194,11 @@ The public key is used on client computers to authenticate incoming connection r [no user] - + Veyon Server unreachable or not running - + @@ -1339,7 +1240,7 @@ The public key is used on client computers to authenticate incoming connection r ComputerGroupSelector Group %1 - + @@ -1398,10 +1299,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - 计算机管理 - Computer search 搜索计算机 @@ -1431,6 +1328,17 @@ The public key is used on client computers to authenticate incoming connection r 无法将计算机和用户列表写入 %1!请检查文件访问权限。 + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1530,7 +1438,7 @@ The public key is used on client computers to authenticate incoming connection r Could not configure the firewall configuration for the %1 Service. - + @@ -1562,10 +1470,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit 内存限制 - - Use multithreading (experimental) - 使用多线程(实验) - MB MB @@ -1603,59 +1507,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Share your screen or allow a user to share his screen with other users. - + Full screen demo - + Share your own screen in fullscreen mode - + In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share your own screen in a window - + Share selected user's screen in fullscreen mode - + In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Share selected user's screen in a window - + In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Please select a user screen to share. - + Please select only one user screen to share. - + All screens - + Screen %1 [%2] - + @@ -1980,10 +1884,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory 日志文件存放目录 - - ... - ... - Log level 日志级别 @@ -2080,21 +1980,12 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system 写入操作系统的日志记录系统 + + + HeadlessVncServer - Authentication - 验证 - - - Method: - 方法: - - - Test - 测试 - - - Configure - 配置 + Headless VNC server + @@ -2349,7 +2240,7 @@ The public key is used on client computers to authenticate incoming connection r Computer groups filter - + Computer locations identification @@ -2361,11 +2252,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2871,7 +2762,7 @@ The public key is used on client computers to authenticate incoming connection r Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2879,54 +2770,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP bind - - - - - LicensingConfigurationPage - - Licensing - 许可 - - - Installed licenses - 已安装的许可证 - - - Add new network range - 添加新的网络范围 - - - Remove selected network range - 移除选中的网络范围 - - - ID - ID - - - Valid until - 有效期至 - - - Licensee - 被许可人 - - - Information - 信息 - - - Installation ID - 安装ID - - - Addons available for licensing - 需要许可证的可用插件 - - - Addon - 插件 + @@ -3123,10 +2967,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers 搜索用户和计算机 - - Adjust optimal size - 调整最佳尺寸 - Align computers to grid 将计算机图标与网格对齐 @@ -3176,16 +3016,16 @@ The public key is used on client computers to authenticate incoming connection r 验证 - Slideshow - + Adjust size of computer icons automatically + - Spotlight - + Slideshow + - Adjust size of computer icons automatically - + Spotlight + @@ -3194,10 +3034,6 @@ The public key is used on client computers to authenticate incoming connection r Directories 文件夹 - - ... - ... - User configuration 用户配置 @@ -3330,41 +3166,41 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location 自动选择当前地点 - - Automatically adjust computer thumbnail size - 自动调整计算机缩略图大小 - Automatically open computer select panel 自动打开计算机选择面板 Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - - - - Thumbnail aspect ratio - + Auto 自动 + + Thumbnail aspect ratio + + Automatically adjust computer icon size - + + + + Open feature windows on the same screen as the main window + @@ -3382,97 +3218,6 @@ The public key is used on client computers to authenticate incoming connection r 此模式允许您在一个或多个地点监控所有计算机。 - - NetworkDiscoveryConfigurationPage - - Network discovery - 网络发现 - - - Mode - 模式 - - - Scan network ranges - 扫描网络范围 - - - e.g. 192.168.1.0/24 - 例如: 192.168.1.0/24 - - - Scan all subnets of computer - 扫描计算机的所有子网 - - - Scan custom subnet - 扫描指定的子网 - - - Scan sessions on local computer - 扫描会话在本地计算机上 - - - Test - 测试 - - - Network ranges - 网络范围 - - - Add new group - 添加新的组 - - - Remove selected group - 移除选中的组 - - - Groups - - - - First address - 第一个地址 - - - Last address - 最后一个地址 - - - Add new network range - 添加新的网络范围 - - - Remove selected network range - 移除选中的网络范围 - - - Parallel scans - 并行扫描 - - - Scan timeout - 扫描超时 - - - ms - 毫秒 - - - Session scan limit - 会话扫描限制 - - - Options - 首选项 - - - Reverse lookup discovered IP addresses to host names - 反向查找已发现的IP地址到主机名 - - NetworkObjectTreeModel @@ -3511,11 +3256,11 @@ The public key is used on client computers to authenticate incoming connection r PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3531,15 +3276,15 @@ The public key is used on client computers to authenticate incoming connection r UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3699,7 +3444,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3710,7 +3455,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + @@ -3839,7 +3584,7 @@ Please save your work and close all programs. To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3858,7 +3603,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3923,11 +3668,11 @@ Please save your work and close all programs. Screenshot - 屏幕截图 + 屏幕截图 Do you really want to delete all selected screenshots? - + @@ -3960,14 +3705,6 @@ Please save your work and close all programs. State: 状态: - - Network - 网络 - - - Demo server port - 演示服务端口 - Enable firewall exception 开启防火墙例外设定 @@ -3976,10 +3713,6 @@ Please save your work and close all programs. Allow connections from localhost only 只允许本地连接 - - Internal VNC server port - 内部 VNC 服务器端口 - VNC server VNC 服务 @@ -4000,14 +3733,6 @@ Please save your work and close all programs. Running 正在运行 - - Feature manager port - 功能管理器端口 - - - Primary service port - 主服务端口 - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4018,45 +3743,41 @@ Typically this is required to support terminal servers. Show notification on remote connection 在远程连接上显示通知 - - Multi session mode (for terminal and remote desktop servers) - 多会话模式(适用于终端及远程桌面服务器) - Show notification when an unauthorized access is blocked 当未授权访问被阻止时显示通知 Maximum session count - + Sessions - + Single session mode (create server instance for local/physical session only) - + Multi session mode (create server instance for each local and remote desktop session) - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -4064,7 +3785,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + @@ -4156,50 +3877,51 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - - Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Please select at least one computer to remove. - + + + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + @@ -4287,6 +4009,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer 启用Windows 8及更新操作系统上的桌面拷贝引擎 + + Maximum CPU usage + + UserConfig @@ -4493,11 +4219,11 @@ Typically this is required to support terminal servers. Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4557,7 +4283,7 @@ Typically this is required to support terminal servers. main Veyon Master - + - + \ No newline at end of file diff --git a/translations/veyon_zh_TW.ts b/translations/veyon_zh_TW.ts index 7f385265c..e60bfb558 100644 --- a/translations/veyon_zh_TW.ts +++ b/translations/veyon_zh_TW.ts @@ -1,6 +1,4 @@ - - - + AboutDialog @@ -82,10 +80,6 @@ If you're interested in translating Veyon into your local or another langua All groups 所有群組 - - ... - ... - Access control rules 存取控制規則 @@ -325,98 +319,6 @@ If you're interested in translating Veyon into your local or another langua 身份驗證方法 - - AndroidPlatformConfigurationPage - - Android - Android - - - General - 一般 - - - - AuthKeysConfigurationDialog - - Authentication keys - 身份驗證金鑰 - - - Introduction - 介紹 - - - Please perform the following steps to set up key file authentication: - 請執行以下步驟以設定金鑰檔身份驗證: - - - 1) Create a key pair on the master computer. - 1) 在主電腦上建立金鑰對。 - - - 2) Set an access group whose members should be allowed to access other computers. - 2) 設定一個存取群組,應該允許其成員存取其它電腦。 - - - 3) Export the public key and import it on all client computers with the same name. - 3) 匯出公開金鑰並將其匯入到具有相同名稱的所有用戶端電腦上。 - - - Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - 請參閱 <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon 管理員手冊</a>,取得更多資訊。 - - - Key file directories - 金鑰檔目錄 - - - Public key file base directory - 公開金鑰檔基礎目錄 - - - Private key file base directory - 私密金鑰檔基礎目錄 - - - ... - ... - - - Available authentication keys - 可用身份驗證金鑰 - - - An authentication key pair consist of two coupled cryptographic keys, a private and a public key. -A private key allows users on the master computer to access client computers. -It is important that only authorized users have read access to the private key file. -The public key is used on client computers to authenticate incoming connection request. - 身份驗證金鑰配對由兩個耦合的加密金鑰,一個私有金鑰和一個公開金鑰組成。 -私密金鑰允許主機電腦上的使用者存取用戶端電腦。 -重要的是,只有授權使用者才能對私密金鑰檔進行讀取存取。 -公開金鑰用於用戶端電腦以驗證傳入連線請求。 - - - Create key pair - 建立金鑰配對 - - - Delete key - 刪除金鑰 - - - Import key - 匯入金鑰 - - - Export key - 匯出金鑰 - - - Set access group - 設定存取群組 - - AuthKeysConfigurationWidget @@ -1291,11 +1193,11 @@ The public key is used on client computers to authenticate incoming connection r [no user] - + [沒有使用者] Veyon Server unreachable or not running - + 無法連線 Veyon 伺服器或未執行 @@ -1396,10 +1298,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel - - Computer management - 電腦管理 - Computer search 電腦搜尋 @@ -1429,6 +1327,17 @@ The public key is used on client computers to authenticate incoming connection r 無法寫入電腦和使用者清單到 %1! 請檢查檔案的存取權限。 + + ComputerZoomWidget + + %1 - %2 Computer Zoom Widget + + + + %1 - %2 - %3 Computer Zoom Widget + + + ConfigCommands @@ -1560,10 +1469,6 @@ The public key is used on client computers to authenticate incoming connection r Memory limit 記憶體限制 - - Use multithreading (experimental) - 使用多執行緒 (實驗性) - MB MB @@ -1978,10 +1883,6 @@ The public key is used on client computers to authenticate incoming connection r Log file directory 紀錄檔目錄 - - ... - ... - Log level 紀錄等級 @@ -2078,21 +1979,12 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system 寫入到作業系統的記錄系統 + + + HeadlessVncServer - Authentication - 身份驗證 - - - Method: - 方式: - - - Test - 測試 - - - Configure - 組態 + Headless VNC server + 無標題 VNC 伺服器 @@ -2880,53 +2772,6 @@ The public key is used on client computers to authenticate incoming connection r LDAP 繫結 - - LicensingConfigurationPage - - Licensing - 授權 - - - Installed licenses - 已安裝的授權 - - - Add new network range - 加入新的網路範圍 - - - Remove selected network range - 移除選取的網路範圍 - - - ID - ID - - - Valid until - 有效期至 - - - Licensee - 授權 - - - Information - 資訊 - - - Installation ID - 安裝 ID - - - Addons available for licensing - 授權的附加元件可用 - - - Addon - 附加元件 - - LinuxPlatformConfigurationPage @@ -3121,10 +2966,6 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers 搜尋使用者和電腦 - - Adjust optimal size - 調整最佳大小 - Align computers to grid 將電腦對齊格線 @@ -3173,6 +3014,10 @@ The public key is used on client computers to authenticate incoming connection r Authentication 身份驗證 + + Adjust size of computer icons automatically + 自動調整電腦圖示的大小 + Slideshow 投影片 @@ -3181,10 +3026,6 @@ The public key is used on client computers to authenticate incoming connection r Spotlight 聚光燈 - - Adjust size of computer icons automatically - - MasterConfigurationPage @@ -3192,10 +3033,6 @@ The public key is used on client computers to authenticate incoming connection r Directories 目錄 - - ... - ... - User configuration 使用者組態 @@ -3328,10 +3165,6 @@ The public key is used on client computers to authenticate incoming connection r Automatically select current location 自動選取目前位置 - - Automatically adjust computer thumbnail size - 自動調整電腦縮圖大小 - Automatically open computer select panel 自動開啟電腦選取面板 @@ -3352,17 +3185,21 @@ The public key is used on client computers to authenticate incoming connection r Hide local session 隱藏本機工作階段 + + Auto + 自動 + Thumbnail aspect ratio 縮圖外觀比例 - Auto - 自動 + Automatically adjust computer icon size + 自動調整電腦圖示大小 - Automatically adjust computer icon size - + Open feature windows on the same screen as the main window + 在與主視窗同一螢幕上開啟功能視窗 @@ -3380,97 +3217,6 @@ The public key is used on client computers to authenticate incoming connection r 這個模式允許您監視在一個或數個位置的所有電腦。 - - NetworkDiscoveryConfigurationPage - - Network discovery - 網路探索 - - - Mode - 模式 - - - Scan network ranges - 掃描網路範圍 - - - e.g. 192.168.1.0/24 - 例如: 192.168.1.0/24 - - - Scan all subnets of computer - 掃描電腦的所有子網路 - - - Scan custom subnet - 掃描自訂子網路 - - - Scan sessions on local computer - 掃描本機電腦上的工作階段 - - - Test - 測試 - - - Network ranges - 網路範圍 - - - Add new group - 加入新群組 - - - Remove selected group - 移除選取的群組 - - - Groups - 群組 - - - First address - 第一個位址 - - - Last address - 最後位址 - - - Add new network range - 加入新的網路範圍 - - - Remove selected network range - 移除選取的網路範圍 - - - Parallel scans - 並行掃描 - - - Scan timeout - 掃描逾時 - - - ms - 毫秒 - - - Session scan limit - 工作階段掃描限制 - - - Options - 選項 - - - Reverse lookup discovered IP addresses to host names - 反向對應發現的主機名稱的 IP 位址 - - NetworkObjectTreeModel @@ -3708,7 +3454,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 遠端存取 @@ -3921,11 +3667,11 @@ Please save your work and close all programs. Screenshot - 螢幕快照 + 螢幕快照 Do you really want to delete all selected screenshots? - + 您真的要刪除所有的螢幕快照嗎? @@ -3958,14 +3704,6 @@ Please save your work and close all programs. State: 狀態: - - Network - 網路 - - - Demo server port - 示範伺服器連接埠 - Enable firewall exception 啟用防火牆例外 @@ -3974,10 +3712,6 @@ Please save your work and close all programs. Allow connections from localhost only 只允許來自 localhost 的連線 - - Internal VNC server port - 內部 VNC 伺服器埠 - VNC server VNC 伺服器 @@ -3998,14 +3732,6 @@ Please save your work and close all programs. Running 執行中 - - Feature manager port - 功能管理員埠 - - - Primary service port - 主服務埠 - Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. @@ -4016,10 +3742,6 @@ Typically this is required to support terminal servers. Show notification on remote connection 遠端連線時顯示通知 - - Multi session mode (for terminal and remote desktop servers) - 多工作階段模式 (適用於終端機和遠端桌面伺服器) - Show notification when an unauthorized access is blocked 未授權的存取已封鎖時顯示通知 @@ -4171,10 +3893,6 @@ Typically this is required to support terminal servers. SpotlightPanel - - Add computers by clicking with the middle mouse button or clicking the first button below. - 使用滑鼠中鍵按一下或按下以下的第一個按鈕來加入電腦。 - Add selected computers 加入選取的電腦 @@ -4199,6 +3917,11 @@ Typically this is required to support terminal servers. Please select at least one computer to remove. 請選擇至少一台電腦來移除。 + + Add computers by clicking with the middle mouse button or clicking the first button below. +The second button will remove the selected computer. If nothing is selected the last one will be removed. + + SystemTrayIcon @@ -4285,6 +4008,10 @@ Typically this is required to support terminal servers. Enable Desktop Duplication Engine on Windows 8 and newer 在 Windows 8 和以上啟用「桌面複製引擎」 + + Maximum CPU usage + 最大 CPU 使用率 + UserConfig @@ -4558,4 +4285,4 @@ Typically this is required to support terminal servers. Veyon Master - + \ No newline at end of file From f0e0920bf4d1eb31f80c643b83c182b414488019 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 13 Jan 2021 09:06:15 +0100 Subject: [PATCH 0774/1765] Core: add Lockable --- core/src/Lockable.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 core/src/Lockable.h diff --git a/core/src/Lockable.h b/core/src/Lockable.h new file mode 100644 index 000000000..09de5cb5c --- /dev/null +++ b/core/src/Lockable.h @@ -0,0 +1,44 @@ +/* + * Lockable.h - header file for Lockable + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#pragma once + +#include + +class Lockable +{ +public: + virtual void lock() + { + m_mutex.lock(); + } + + virtual void unlock() + { + m_mutex.unlock(); + } + +private: + QMutex m_mutex{QMutex::Recursive}; + +}; From 7128f758d7a70a19cc98cfdfa20de2c20ecc263a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 13 Jan 2021 09:06:22 +0100 Subject: [PATCH 0775/1765] Core: add LockingPointer --- core/src/LockingPointer.h | 62 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 core/src/LockingPointer.h diff --git a/core/src/LockingPointer.h b/core/src/LockingPointer.h new file mode 100644 index 000000000..8def73c2d --- /dev/null +++ b/core/src/LockingPointer.h @@ -0,0 +1,62 @@ +/* + * LockingPointer.h - smart pointer for lockables + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#pragma once + +template +class LockingPointer +{ +public: + LockingPointer( T lockable ) : m_lockable( lockable ) + { + if( m_lockable ) + { + m_lockable->lock(); + } + } + + ~LockingPointer() + { + if( m_lockable ) + { + m_lockable->unlock(); + } + } + + LockingPointer( LockingPointer&& lockingPointer ) : m_lockable( lockingPointer.m_lockable ) + { + lockingPointer.m_lockable = nullptr; + } + + LockingPointer( LockingPointer const& ) = delete; + LockingPointer& operator=( LockingPointer const& ) = delete; + + T operator->() const + { + return m_lockable; + } + +private: + T m_lockable; +}; + From 8549b3fe45472007b6f0a70f30ed7cf1b7eb17a1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 13 Jan 2021 09:10:20 +0100 Subject: [PATCH 0776/1765] ComputerControlInterface: inherit from Lockable --- core/src/ComputerControlInterface.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 4a9d74e30..dcc2b3820 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -31,6 +31,7 @@ #include "Computer.h" #include "Feature.h" +#include "Lockable.h" #include "VeyonCore.h" #include "VncConnection.h" @@ -40,7 +41,7 @@ class FeatureMessage; class VncConnection; class VeyonConnection; -class VEYON_CORE_EXPORT ComputerControlInterface : public QObject +class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockable { Q_OBJECT public: From 1f112a2b35c681fd977c0adb6bdd8851f9e9da99 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 13 Jan 2021 09:10:33 +0100 Subject: [PATCH 0777/1765] FeatureManager: make all methods const --- core/src/FeatureManager.cpp | 12 ++++++------ core/src/FeatureManager.h | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 00145d95e..54add9bb9 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -114,7 +114,7 @@ Plugin::Uid FeatureManager::pluginUid( const Feature& feature ) const void FeatureManager::controlFeature( Feature::Uid featureUid, FeatureProviderInterface::Operation operation, const QVariantMap& arguments, - const ComputerControlInterfaceList& computerControlInterfaces ) + const ComputerControlInterfaceList& computerControlInterfaces ) const { for( auto featureInterface : qAsConst( m_featurePluginInterfaces ) ) { @@ -126,7 +126,7 @@ void FeatureManager::controlFeature( Feature::Uid featureUid, void FeatureManager::startFeature( VeyonMasterInterface& master, const Feature& feature, - const ComputerControlInterfaceList& computerControlInterfaces ) + const ComputerControlInterfaceList& computerControlInterfaces ) const { vDebug() << "feature" << feature.name() << feature.uid() << computerControlInterfaces; @@ -148,7 +148,7 @@ void FeatureManager::startFeature( VeyonMasterInterface& master, void FeatureManager::stopFeature( VeyonMasterInterface& master, const Feature& feature, - const ComputerControlInterfaceList& computerControlInterfaces ) + const ComputerControlInterfaceList& computerControlInterfaces ) const { vDebug() << "feature" << feature.name() << feature.uid() << computerControlInterfaces; @@ -169,7 +169,7 @@ void FeatureManager::stopFeature( VeyonMasterInterface& master, bool FeatureManager::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, - const FeatureMessage& message ) + const FeatureMessage& message ) const { vDebug() << "feature" << message.featureUid() << "command" << message.command() @@ -192,7 +192,7 @@ bool FeatureManager::handleFeatureMessage( ComputerControlInterface::Pointer com bool FeatureManager::handleFeatureMessage( VeyonServerInterface& server, const MessageContext& messageContext, - const FeatureMessage& message ) + const FeatureMessage& message ) const { vDebug() << "feature" << message.featureUid() << "command" << message.command() @@ -219,7 +219,7 @@ bool FeatureManager::handleFeatureMessage( VeyonServerInterface& server, -bool FeatureManager::handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) +bool FeatureManager::handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) const { vDebug() << "feature" << message.featureUid() << "command" << message.command() diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index a2b94345c..e2a350ab9 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -55,21 +55,21 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject void controlFeature( Feature::Uid featureUid, FeatureProviderInterface::Operation operation, const QVariantMap& arguments, - const ComputerControlInterfaceList& computerControlInterfaces ); + const ComputerControlInterfaceList& computerControlInterfaces ) const; void startFeature( VeyonMasterInterface& master, const Feature& feature, - const ComputerControlInterfaceList& computerControlInterfaces ); + const ComputerControlInterfaceList& computerControlInterfaces ) const; void stopFeature( VeyonMasterInterface& master, const Feature& feature, - const ComputerControlInterfaceList& computerControlInterfaces ); + const ComputerControlInterfaceList& computerControlInterfaces ) const; bool handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, - const FeatureMessage& message ); + const FeatureMessage& message ) const; bool handleFeatureMessage( VeyonServerInterface& server, const MessageContext& messageContext, - const FeatureMessage& message ); - bool handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ); + const FeatureMessage& message ) const; + bool handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) const; private: FeatureList m_features{}; From 8d7ab2c0da18016f31b42b4b4f52e477ba915e33 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 13 Jan 2021 15:28:02 +0100 Subject: [PATCH 0778/1765] ComputerControlInterface: lock for self-updating --- core/src/ComputerControlInterface.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 8d3d7e887..ed6d905a4 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -310,6 +310,8 @@ void ComputerControlInterface::restartConnection() void ComputerControlInterface::updateState() { + lock(); + if( m_vncConnection ) { switch( m_vncConnection->state() ) @@ -327,12 +329,16 @@ void ComputerControlInterface::updateState() { m_state = State::Disconnected; } + + unlock(); } void ComputerControlInterface::updateUser() { + lock(); + if( m_vncConnection && m_connection && state() == State::Connected ) { if( userLoginName().isEmpty() ) @@ -344,12 +350,16 @@ void ComputerControlInterface::updateUser() { setUserInformation( {}, {}, -1 ); } + + unlock(); } void ComputerControlInterface::updateActiveFeatures() { + lock(); + if( m_vncConnection && m_connection && state() == State::Connected ) { VeyonCore::builtinFeatures().featureControl().queryActiveFeatures( { weakPointer() } ); @@ -358,6 +368,8 @@ void ComputerControlInterface::updateActiveFeatures() { setActiveFeatures( {} ); } + + unlock(); } From 079f50f1e7b1fbda866f29293679ead7080499d7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 14 Jan 2021 08:53:56 +0100 Subject: [PATCH 0779/1765] PlatformSessionManager: omit error message for certain components --- plugins/platform/common/PlatformSessionManager.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index 317963f23..0e122dfad 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -119,7 +119,12 @@ PlatformSessionManager::SessionId PlatformSessionManager::resolveSessionId( cons socket.connectToServer( serverName(), QLocalSocket::ReadOnly ); if( socket.waitForConnected( ServerConnectTimeout ) == false ) { - vCritical() << "could not read session map"; + if( VeyonCore::component() != VeyonCore::Component::CLI && + VeyonCore::component() != VeyonCore::Component::Configurator ) + { + vCritical() << "could not read session map"; + } + return PlatformSessionFunctions::InvalidSessionId; } From 54ddec4f43802cbc99c507d92fafb178cef32dbb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 15 Jan 2021 09:28:00 +0100 Subject: [PATCH 0780/1765] Configurator: embed config pages into scrollarea This makes the Configurator fully usable on computers with small screen resolutions. Closes #700. --- configurator/src/MainWindow.cpp | 46 ++++++++++++++++++------ configurator/src/MainWindow.h | 7 ++-- configurator/src/MainWindow.ui | 62 +++++++++++++++++++++++---------- 3 files changed, 85 insertions(+), 30 deletions(-) diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index c4b0fbc49..5b354d805 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "Configuration/JsonStore.h" #include "Configuration/UiMapping.h" @@ -81,12 +82,18 @@ MainWindow::MainWindow( QWidget* parent ) : ui->viewModeStandard->setChecked( true ); connect( viewModeGroup, &QActionGroup::triggered, this, &MainWindow::updateView ); - switchToStandardView(); connect( ui->actionAboutQt, &QAction::triggered, QApplication::instance(), &QApplication::aboutQt ); connect( &VeyonCore::config(), &VeyonConfiguration::configurationChanged, this, &MainWindow::configurationChanged ); + connect( ui->configPages, &QStackedWidget::currentChanged, this, &MainWindow::updateSizes ); + + resize( ui->pageSelector->width() + ui->generalConfigurationPage->minimumSizeHint().width(), + ui->generalConfigurationPage->minimumSizeHint().height() ); + + updateView(); + VeyonCore::enforceBranding( this ); } @@ -137,16 +144,11 @@ void MainWindow::apply() -void MainWindow::updateView() +void MainWindow::resizeEvent( QResizeEvent* event ) { - if( ui->viewModeAdvanced->isChecked() ) - { - switchToAdvancedView(); - } - else - { - switchToStandardView(); - } + QMainWindow::resizeEvent( event ); + + updateSizes(); } @@ -235,6 +237,30 @@ void MainWindow::aboutVeyon() +void MainWindow::updateSizes() +{ + ui->configPages->setMinimumSize( ui->scrollArea->width() - ui->scrollArea->verticalScrollBar()->width(), + ui->configPages->currentWidget()->minimumSizeHint().height() ); +} + + + +void MainWindow::updateView() +{ + if( ui->viewModeAdvanced->isChecked() ) + { + switchToAdvancedView(); + } + else + { + switchToStandardView(); + } + + QTimer::singleShot( 0, this, &MainWindow::updateSizes ); +} + + + void MainWindow::switchToStandardView() { const auto widgets = findChildren(); diff --git a/configurator/src/MainWindow.h b/configurator/src/MainWindow.h index 3a38331df..540289ac9 100644 --- a/configurator/src/MainWindow.h +++ b/configurator/src/MainWindow.h @@ -42,7 +42,8 @@ class MainWindow : public QMainWindow void reset( bool onlyUI = false ); void apply(); - void updateView(); +protected: + void resizeEvent( QResizeEvent* event ) override; private Q_SLOTS: void configurationChanged(); @@ -52,8 +53,10 @@ private Q_SLOTS: void resetConfiguration(); void aboutVeyon(); - private: + void updateSizes(); + void updateView(); + void switchToStandardView(); void switchToAdvancedView(); diff --git a/configurator/src/MainWindow.ui b/configurator/src/MainWindow.ui index 9cd4c1632..861ccc4b8 100644 --- a/configurator/src/MainWindow.ui +++ b/configurator/src/MainWindow.ui @@ -10,19 +10,7 @@ :/configurator/veyon-configurator.png:/configurator/veyon-configurator.png - - - - - 0 - - - - - - - - + @@ -117,14 +105,42 @@ - - - - QDialogButtonBox::Apply|QDialogButtonBox::Reset + + + + Qt::ScrollBarAlwaysOff - + true + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 1 + + + + + + + + + + @@ -134,6 +150,16 @@ + + + + QDialogButtonBox::Apply|QDialogButtonBox::Reset + + + true + + + From c8804a8cb03fc671f89fa3c4ed59648a4c6d2996 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 15 Jan 2021 09:30:28 +0100 Subject: [PATCH 0781/1765] Configurator: clean up MainWindow.ui --- configurator/src/MainWindow.ui | 6 ------ 1 file changed, 6 deletions(-) diff --git a/configurator/src/MainWindow.ui b/configurator/src/MainWindow.ui index 861ccc4b8..072223951 100644 --- a/configurator/src/MainWindow.ui +++ b/configurator/src/MainWindow.ui @@ -306,12 +306,6 @@

    ServiceConfigurationPage.h
    1 - - AuthenticationPage - QWidget -
    authenticationpage.h
    - 1 -
    From 8305c0dca703159d27e7e8b1f2247739c8249f20 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 15 Jan 2021 09:38:28 +0100 Subject: [PATCH 0782/1765] Configurator: save/restore window geometry --- configurator/src/MainWindow.cpp | 42 ++++++++++++++++++--------------- configurator/src/MainWindow.h | 8 +++++-- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index 5b354d805..d9ff92cdf 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include "Configuration/JsonStore.h" #include "Configuration/UiMapping.h" @@ -92,6 +93,8 @@ MainWindow::MainWindow( QWidget* parent ) : resize( ui->pageSelector->width() + ui->generalConfigurationPage->minimumSizeHint().width(), ui->generalConfigurationPage->minimumSizeHint().height() ); + restoreGeometry( QSettings{}.value( windowGeometryKey() ).toByteArray() ); + updateView(); VeyonCore::enforceBranding( this ); @@ -144,6 +147,26 @@ void MainWindow::apply() +void MainWindow::closeEvent( QCloseEvent* event ) +{ + if( m_configChanged && + QMessageBox::question( this, tr( "Unsaved settings" ), + tr( "There are unsaved settings. Quit anyway?" ), + QMessageBox::Yes | QMessageBox::No ) != + QMessageBox::Yes ) + { + event->ignore(); + return; + } + + QSettings{}.setValue( windowGeometryKey(), saveGeometry() ); + + event->accept(); + QMainWindow::closeEvent( event ); +} + + + void MainWindow::resizeEvent( QResizeEvent* event ) { QMainWindow::resizeEvent( event ); @@ -372,22 +395,3 @@ void MainWindow::loadConfigurationPagePlugins() ui->pageSelector->setMinimumSize( ui->pageSelector->sizeHintForColumn(0) + 3 * ui->pageSelector->spacing(), ui->pageSelector->minimumHeight() ); } - - - -void MainWindow::closeEvent( QCloseEvent *closeEvent ) -{ - if( m_configChanged && - QMessageBox::question( this, tr( "Unsaved settings" ), - tr( "There are unsaved settings. " - "Quit anyway?" ), - QMessageBox::Yes | QMessageBox::No ) != - QMessageBox::Yes ) - { - closeEvent->ignore(); - return; - } - - closeEvent->accept(); - QMainWindow::closeEvent( closeEvent ); -} diff --git a/configurator/src/MainWindow.h b/configurator/src/MainWindow.h index 540289ac9..20d7cc7fc 100644 --- a/configurator/src/MainWindow.h +++ b/configurator/src/MainWindow.h @@ -43,6 +43,7 @@ class MainWindow : public QMainWindow void apply(); protected: + void closeEvent( QCloseEvent* event ) override; void resizeEvent( QResizeEvent* event ) override; private Q_SLOTS: @@ -54,6 +55,11 @@ private Q_SLOTS: void aboutVeyon(); private: + static QString windowGeometryKey() + { + return QStringLiteral("Configurator/WindowGeometry"); + } + void updateSizes(); void updateView(); @@ -63,8 +69,6 @@ private Q_SLOTS: bool applyConfiguration(); void loadConfigurationPagePlugins(); - void closeEvent( QCloseEvent *closeEvent ) override; - Ui::MainWindow *ui; bool m_configChanged; From 49be31e37416bd0a147de56e4baaff5ed8401416 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 15 Jan 2021 09:55:23 +0100 Subject: [PATCH 0783/1765] LdapClient: add cn() --- plugins/ldap/common/LdapClient.h | 5 +++++ plugins/ldap/common/LdapConfiguration.h | 4 ++-- plugins/ldap/common/LdapDirectory.cpp | 8 ++++---- plugins/ldap/common/LdapNetworkObjectDirectory.cpp | 4 ++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index fc13c3cf9..36f30e9a8 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -121,6 +121,11 @@ class LDAP_COMMON_EXPORT LdapClient : public QObject static QStringList toRDNs( const QString& dn ); + static QString cn() + { + return QStringLiteral("cn"); + } + private: static constexpr int LdapQueryTimeout = 3000; static constexpr int LdapConnectionTimeout = 60*1000; diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index 783f263ed..16261c922 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -48,11 +48,11 @@ OP( LdapConfiguration, m_configuration, bool, recursiveSearchOperations, setRecursiveSearchOperations, "RecursiveSearchOperations", "LDAP", false, Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, userLoginNameAttribute, setUserLoginNameAttribute, "UserLoginNameAttribute", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, groupMemberAttribute, setGroupMemberAttribute, "GroupMemberAttribute", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ - OP( LdapConfiguration, m_configuration, QString, computerDisplayNameAttribute, setComputerDisplayNameAttribute, "ComputerDisplayNameAttribute", "LDAP", QStringLiteral("cn"), Configuration::Property::Flag::Standard ) \ + OP( LdapConfiguration, m_configuration, QString, computerDisplayNameAttribute, setComputerDisplayNameAttribute, "ComputerDisplayNameAttribute", "LDAP", LdapClient::cn(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, computerHostNameAttribute, setComputerHostNameAttribute, "ComputerHostNameAttribute", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, bool, computerHostNameAsFQDN, setComputerHostNameAsFQDN, "ComputerHostNameAsFQDN", "LDAP", false, Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, computerMacAddressAttribute, setComputerMacAddressAttribute, "ComputerMacAddressAttribute", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ - OP( LdapConfiguration, m_configuration, QString, locationNameAttribute, setLocationNameAttribute, "LocationNameAttribute", "LDAP", QStringLiteral("cn"), Configuration::Property::Flag::Standard ) \ + OP( LdapConfiguration, m_configuration, QString, locationNameAttribute, setLocationNameAttribute, "LocationNameAttribute", "LDAP", LdapClient::cn(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, usersFilter, setUsersFilter, "UsersFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, userGroupsFilter, setUserGroupsFilter, "UserGroupsFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, computersFilter, setComputersFilter, "ComputersFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index d96f2d0f9..f19156d04 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -51,12 +51,12 @@ LdapDirectory::LdapDirectory( const LdapConfiguration& configuration, QObject* p if( m_computerDisplayNameAttribute.isEmpty() ) { - m_computerDisplayNameAttribute = QStringLiteral("cn"); + m_computerDisplayNameAttribute = LdapClient::cn(); } if( m_locationNameAttribute.isEmpty() ) { - m_locationNameAttribute = QStringLiteral("cn"); + m_locationNameAttribute = LdapClient::cn(); } m_usersFilter = m_configuration.usersFilter(); @@ -178,7 +178,7 @@ QStringList LdapDirectory::users( const QString& filterValue ) QStringList LdapDirectory::groups( const QString& filterValue ) { return m_client.queryDistinguishedNames( groupsDn(), - LdapClient::constructQueryFilter( QStringLiteral( "cn" ), filterValue ), + LdapClient::constructQueryFilter( LdapClient::cn(), filterValue ), m_defaultSearchScope ); } @@ -187,7 +187,7 @@ QStringList LdapDirectory::groups( const QString& filterValue ) QStringList LdapDirectory::userGroups( const QString& filterValue ) { return m_client.queryDistinguishedNames( groupsDn(), - LdapClient::constructQueryFilter( QStringLiteral( "cn" ), filterValue, m_userGroupsFilter ), + LdapClient::constructQueryFilter( LdapClient::cn(), filterValue, m_userGroupsFilter ), m_defaultSearchScope ); } diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index 0d2759df5..b9da996a3 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -194,13 +194,13 @@ NetworkObject LdapNetworkObjectDirectory::computerToObject( LdapDirectory* direc auto displayNameAttribute = directory->computerDisplayNameAttribute(); if( displayNameAttribute.isEmpty() ) { - displayNameAttribute = QStringLiteral("cn"); + displayNameAttribute = LdapClient::cn(); } auto hostNameAttribute = directory->computerHostNameAttribute(); if( hostNameAttribute.isEmpty() ) { - hostNameAttribute = QStringLiteral("cn"); + hostNameAttribute = LdapClient::cn(); } QStringList computerAttributes{ displayNameAttribute, hostNameAttribute }; From d07e4c3a0bba60e871d25973a10909952d2e380e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 15 Jan 2021 09:57:29 +0100 Subject: [PATCH 0784/1765] LdapDirectory: drop unused computerDisplayName() --- plugins/ldap/common/LdapDirectory.cpp | 8 -------- plugins/ldap/common/LdapDirectory.h | 1 - 2 files changed, 9 deletions(-) diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index f19156d04..2ab3baa1f 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -330,14 +330,6 @@ QString LdapDirectory::userLoginName( const QString& userDn ) -QString LdapDirectory::computerDisplayName( const QString& computerDn ) -{ - return m_client.queryAttributeValues( computerDn, m_computerDisplayNameAttribute ).value( 0 ); - -} - - - QString LdapDirectory::computerHostName( const QString& computerDn ) { if( computerDn.isEmpty() ) diff --git a/plugins/ldap/common/LdapDirectory.h b/plugins/ldap/common/LdapDirectory.h index 728c6c4ff..36e81c70d 100644 --- a/plugins/ldap/common/LdapDirectory.h +++ b/plugins/ldap/common/LdapDirectory.h @@ -72,7 +72,6 @@ class LDAP_COMMON_EXPORT LdapDirectory : public QObject QStringList locationsOfComputer( const QString& computerDn ); QString userLoginName( const QString& userDn ); - QString computerDisplayName( const QString& computerDn ); QString computerHostName( const QString& computerDn ); QString computerMacAddress( const QString& computerDn ); QString groupMemberUserIdentification( const QString& userDn ); From e413bfdfb7d1fa00527e34e86940f2b0530ab8f0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 15 Jan 2021 10:01:28 +0100 Subject: [PATCH 0785/1765] LdapNetworkObjectDirectory: fallback to CN If either the display or hostname value of a computer is empty, fall back to the common name of the object. This is an improved version of #599 so credits also go to NJJJCAustin. Closes #599. --- .../common/LdapNetworkObjectDirectory.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index b9da996a3..051131a01 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -203,7 +203,7 @@ NetworkObject LdapNetworkObjectDirectory::computerToObject( LdapDirectory* direc hostNameAttribute = LdapClient::cn(); } - QStringList computerAttributes{ displayNameAttribute, hostNameAttribute }; + QStringList computerAttributes{ LdapClient::cn(), displayNameAttribute, hostNameAttribute }; auto macAddressAttribute = directory->computerMacAddressAttribute(); if( macAddressAttribute.isEmpty() == false ) @@ -219,10 +219,21 @@ NetworkObject LdapNetworkObjectDirectory::computerToObject( LdapDirectory* direc { const auto& computerDn = computers.firstKey(); const auto& computer = computers.first(); - const auto displayName = computer[displayNameAttribute].value( 0 ); + + auto displayName = computer[displayNameAttribute].value( 0 ); + auto hostName = computer[hostNameAttribute].value( 0 ); + + if( displayName.isEmpty() ) + { + displayName = computer[LdapClient::cn()].value( 0 ); + } + if( hostName.isEmpty() ) + { + hostName = computer[LdapClient::cn()].value( 0 ); + } + NetworkObject::Properties properties; - properties[NetworkObject::propertyKey(NetworkObject::Property::HostAddress)] = - computer[hostNameAttribute].value( 0 ); + properties[NetworkObject::propertyKey(NetworkObject::Property::HostAddress)] = hostName; if( macAddressAttribute.isEmpty() == false ) { properties[NetworkObject::propertyKey(NetworkObject::Property::MacAddress)] = From 893a28e18fa8b0b9a4af3059747c9a01cc276a2c Mon Sep 17 00:00:00 2001 From: Mike Gabriel Date: Wed, 3 Feb 2021 21:00:44 +0100 Subject: [PATCH 0786/1765] BuiltinX11VncServer: add missing retval Regression fix for e6ddf9a9. --- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index 0bb6516fc..02d4cf219 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -96,7 +96,7 @@ bool BuiltinX11VncServer::runServer( int serverPort, const Password& password ) if( tempFile.open() == false ) // Flawfinder: ignore { vCritical() << "Could not create temporary file!"; - return; + return false; } tempFile.write( password.toByteArray() ); tempFile.close(); From 0cbd498c0f15fde7214799b4d0fdfb7be351eb73 Mon Sep 17 00:00:00 2001 From: Mike Gabriel Date: Wed, 3 Feb 2021 21:09:52 +0100 Subject: [PATCH 0787/1765] veyon-master.1: fix application name in headline Application name must not contain blanks. --- master/veyon-master.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/veyon-master.1 b/master/veyon-master.1 index ebd2a0602..f7735c3d0 100644 --- a/master/veyon-master.1 +++ b/master/veyon-master.1 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH VEYON MASTER 1 2018-12-07 Veyon +.TH VEYON-MASTER 1 2018-12-07 Veyon .SH NAME veyon-master \- Veyon Master Application .SH SYNOPSIS From 9273d4ec0abbbcf8416b070d321cc15a8c9b0307 Mon Sep 17 00:00:00 2001 From: Mike Gabriel Date: Wed, 3 Feb 2021 21:12:10 +0100 Subject: [PATCH 0788/1765] LinuxCoreFunctions: drop kdesudo/gksudo support These tools have long gone and have been replaced by pkexec. --- plugins/platform/linux/LinuxCoreFunctions.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index eb7bff1f0..342c7aab6 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -239,18 +239,6 @@ bool LinuxCoreFunctions::runProgramAsAdmin( const QString& program, const QStrin { const auto commandLine = QStringList( program ) + parameters; - const auto desktop = QProcessEnvironment::systemEnvironment().value( QStringLiteral("XDG_CURRENT_DESKTOP") ); - if( desktop == QLatin1String("KDE") && - QStandardPaths::findExecutable( QStringLiteral("kdesudo") ).isEmpty() == false ) - { - return QProcess::execute( QStringLiteral("kdesudo"), QStringList( QStringLiteral("--") ) + commandLine ) == 0; - } - - if( QStandardPaths::findExecutable( QStringLiteral("gksudo") ).isEmpty() == false ) - { - return QProcess::execute( QStringLiteral("gksudo"), QStringList( QStringLiteral("--") ) + commandLine ) == 0; - } - return QProcess::execute( QStringLiteral("pkexec"), commandLine ) == 0; } From 1a9eee2d41bdd6d0a98ef6c9736779a3223b1918 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Feb 2021 10:47:32 +0100 Subject: [PATCH 0789/1765] MonitoringMode: add missing export macro --- core/src/MonitoringMode.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 7dae88120..c41e3e21f 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -26,7 +26,7 @@ #include "FeatureProviderInterface.h" -class MonitoringMode : public QObject, FeatureProviderInterface, PluginInterface +class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterface, PluginInterface { Q_OBJECT Q_INTERFACES(FeatureProviderInterface PluginInterface) From b6d5819e4cbfb7d698bc347e3980b6a15e2737cf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Feb 2021 11:15:58 +0100 Subject: [PATCH 0790/1765] CI: drop openSUSE 15.1 builds --- .ci/linux.opensuse.15.1/Dockerfile | 18 ------------------ .ci/linux.opensuse.15.1/script.sh | 6 ------ .travis.yml | 1 - 3 files changed, 25 deletions(-) delete mode 100644 .ci/linux.opensuse.15.1/Dockerfile delete mode 100755 .ci/linux.opensuse.15.1/script.sh diff --git a/.ci/linux.opensuse.15.1/Dockerfile b/.ci/linux.opensuse.15.1/Dockerfile deleted file mode 100644 index a90ca1351..000000000 --- a/.ci/linux.opensuse.15.1/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM opensuse/leap:15.1 -MAINTAINER Tobias Junghans - -RUN \ - zypper --gpg-auto-import-keys install -y git gcc-c++ make cmake rpm-build fakeroot \ - libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel \ - libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ - libfakekey-devel \ - libjpeg8-devel \ - zlib-devel \ - libpng16-devel libpng16-compat-devel \ - libopenssl-devel \ - procps-devel \ - pam-devel lzo-devel \ - libqca-qt5-devel libqca-qt5-plugins \ - cyrus-sasl-devel \ - openldap2-devel - diff --git a/.ci/linux.opensuse.15.1/script.sh b/.ci/linux.opensuse.15.1/script.sh deleted file mode 100755 index c1c29d5bd..000000000 --- a/.ci/linux.opensuse.15.1/script.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -set -e - -$1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "opensuse-15.1" diff --git a/.travis.yml b/.travis.yml index d0a88642e..d99573000 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,6 @@ matrix: - env: TARGET_OS=debian.stretch - env: TARGET_OS=debian.buster - env: TARGET_OS=fedora.31 - - env: TARGET_OS=opensuse.15.1 - env: TARGET_OS=opensuse.15.2 - env: TARGET_OS=ubuntu.bionic - env: TARGET_OS=ubuntu.focal From 64fbc202597ebc82ebbec892eaba7568aef2b75a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Feb 2021 11:17:15 +0100 Subject: [PATCH 0791/1765] CI: bump to CentOS 7.9 (20.09) --- .ci/{linux.centos.7.8 => linux.centos.7.9}/Dockerfile | 2 +- .ci/{linux.centos.7.8 => linux.centos.7.9}/script.sh | 0 .travis.yml | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename .ci/{linux.centos.7.8 => linux.centos.7.9}/Dockerfile (96%) rename .ci/{linux.centos.7.8 => linux.centos.7.9}/script.sh (100%) diff --git a/.ci/linux.centos.7.8/Dockerfile b/.ci/linux.centos.7.9/Dockerfile similarity index 96% rename from .ci/linux.centos.7.8/Dockerfile rename to .ci/linux.centos.7.9/Dockerfile index 35bd5369d..a8e01f35b 100644 --- a/.ci/linux.centos.7.8/Dockerfile +++ b/.ci/linux.centos.7.9/Dockerfile @@ -1,4 +1,4 @@ -FROM centos:7.8.2003 +FROM centos:7.9.2009 MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.centos.7.8/script.sh b/.ci/linux.centos.7.9/script.sh similarity index 100% rename from .ci/linux.centos.7.8/script.sh rename to .ci/linux.centos.7.9/script.sh diff --git a/.travis.yml b/.travis.yml index d99573000..f0312ef18 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ dist: bionic sudo: required matrix: include: - - env: TARGET_OS=centos.7.8 + - env: TARGET_OS=centos.7.9 - env: TARGET_OS=centos.8.2 - env: TARGET_OS=debian.stretch - env: TARGET_OS=debian.buster From 940404b7f3c35efe933b9edde5adccfc9271e425 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Feb 2021 11:19:01 +0100 Subject: [PATCH 0792/1765] CI: bump to CentOS 8.3 (20.11) --- .ci/{linux.centos.8.2 => linux.centos.8.3}/Dockerfile | 4 ++-- .ci/{linux.centos.8.2 => linux.centos.8.3}/script.sh | 0 .travis.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename .ci/{linux.centos.8.2 => linux.centos.8.3}/Dockerfile (91%) rename .ci/{linux.centos.8.2 => linux.centos.8.3}/script.sh (100%) diff --git a/.ci/linux.centos.8.2/Dockerfile b/.ci/linux.centos.8.3/Dockerfile similarity index 91% rename from .ci/linux.centos.8.2/Dockerfile rename to .ci/linux.centos.8.3/Dockerfile index 6786e0694..fc8bbf564 100644 --- a/.ci/linux.centos.8.2/Dockerfile +++ b/.ci/linux.centos.8.3/Dockerfile @@ -1,9 +1,9 @@ -FROM centos:8.2.2004 +FROM centos:8.3.2011 MAINTAINER Tobias Junghans RUN \ yum --enablerepo=extras install -y epel-release dnf-plugins-core && \ - yum config-manager --set-enabled PowerTools && \ + yum config-manager --set-enabled powertools && \ dnf install -y https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm && \ yum install -y git gcc-c++ make cmake rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel \ diff --git a/.ci/linux.centos.8.2/script.sh b/.ci/linux.centos.8.3/script.sh similarity index 100% rename from .ci/linux.centos.8.2/script.sh rename to .ci/linux.centos.8.3/script.sh diff --git a/.travis.yml b/.travis.yml index f0312ef18..25ce819b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ sudo: required matrix: include: - env: TARGET_OS=centos.7.9 - - env: TARGET_OS=centos.8.2 + - env: TARGET_OS=centos.8.3 - env: TARGET_OS=debian.stretch - env: TARGET_OS=debian.buster - env: TARGET_OS=fedora.31 From 4bb43d6dfee7bd708ccb83bb297e16a505cc926a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Feb 2021 11:53:17 +0100 Subject: [PATCH 0793/1765] CI: bump to Fedora 32 --- .ci/{linux.fedora.31 => linux.fedora.32}/Dockerfile | 2 +- .ci/{linux.fedora.31 => linux.fedora.32}/script.sh | 0 .travis.yml | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename .ci/{linux.fedora.31 => linux.fedora.32}/Dockerfile (97%) rename .ci/{linux.fedora.31 => linux.fedora.32}/script.sh (100%) diff --git a/.ci/linux.fedora.31/Dockerfile b/.ci/linux.fedora.32/Dockerfile similarity index 97% rename from .ci/linux.fedora.31/Dockerfile rename to .ci/linux.fedora.32/Dockerfile index fbc5c43b4..f9ae2820e 100644 --- a/.ci/linux.fedora.31/Dockerfile +++ b/.ci/linux.fedora.32/Dockerfile @@ -1,4 +1,4 @@ -FROM fedora:31 +FROM fedora:32 MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.fedora.31/script.sh b/.ci/linux.fedora.32/script.sh similarity index 100% rename from .ci/linux.fedora.31/script.sh rename to .ci/linux.fedora.32/script.sh diff --git a/.travis.yml b/.travis.yml index 25ce819b6..755ca44b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ matrix: - env: TARGET_OS=centos.8.3 - env: TARGET_OS=debian.stretch - env: TARGET_OS=debian.buster - - env: TARGET_OS=fedora.31 + - env: TARGET_OS=fedora.32 - env: TARGET_OS=opensuse.15.2 - env: TARGET_OS=ubuntu.bionic - env: TARGET_OS=ubuntu.focal From 38dce6bad717718f2551c2d9757807e40156a778 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Feb 2021 10:47:51 +0100 Subject: [PATCH 0794/1765] cmake: replace Cotire with builtin PCH/UB support The precompiled header and unity build support in CMake 3.16 is way better than Cotire and further reduces compile times by reusing precompiled headers. --- 3rdparty/ultravnc | 2 +- CMakeLists.txt | 12 +- cmake/modules/BuildVeyonApplication.cmake | 3 + cmake/modules/BuildVeyonPlugin.cmake | 6 +- cmake/modules/CotireVeyon.cmake | 10 - cmake/modules/cotire.cmake | 4191 ----------------- configurator/CMakeLists.txt | 2 - core/CMakeLists.txt | 10 +- core/src/{Cotire.h => PrecompiledHeader.h} | 8 + core/src/VncView.cpp | 5 +- master/CMakeLists.txt | 2 - plugins/ldap/common/CMakeLists.txt | 1 - plugins/ldap/kldap/CMakeLists.txt | 2 - plugins/platform/linux/CMakeLists.txt | 10 +- plugins/platform/linux/LinuxCoreFunctions.h | 1 + plugins/platform/windows/CMakeLists.txt | 3 + .../vncserver/ultravnc-builtin/CMakeLists.txt | 2 + .../ultravnc-builtin/vnchooks/CMakeLists.txt | 11 +- .../vncserver/x11vnc-builtin/CMakeLists.txt | 4 +- server/CMakeLists.txt | 2 - worker/CMakeLists.txt | 2 - 21 files changed, 58 insertions(+), 4231 deletions(-) delete mode 100644 cmake/modules/CotireVeyon.cmake delete mode 100644 cmake/modules/cotire.cmake rename core/src/{Cotire.h => PrecompiledHeader.h} (77%) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 66a235f5f..071b0149d 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 66a235f5f5313e9e3176c3ccde4f290bd91b44bd +Subproject commit 071b0149dcee002b383bbb71d75501afa78cdf63 diff --git a/CMakeLists.txt b/CMakeLists.txt index c2c75e71f..3507e539a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,6 @@ include(CheckFunctionExists) include(CheckSymbolExists) include(CheckTypeSize) include(GNUInstallDirs) -include(CotireVeyon) include(ConfigureFiles) include(SetDefaultTargetProperties) @@ -198,12 +197,20 @@ else() endif() option(WITH_LTO "Build with link-time optimization" ON) -option(WITH_PCH "Reduce compile time by using precompiled headers" ON) +option(WITH_PCH "Reduce compile time by using precompiled headers (requires CMake >= 3.16)" ON) +option(WITH_UNITY_BUILD "Reduce compile time by using cmake unity builds (requires CMake >= 3.16)" ON) option(WITH_SANITIZERS "Build with thread and UB sanitizers" OFF) option(WITH_MODEL_TESTERS "Build with model testers (turn on for debugging only)" OFF) option(WITH_CORE_ONLY "Build core library only" OFF) option(WITH_ADDONS "Build add-ons" OFF) +if(${CMAKE_VERSION} VERSION_LESS "3.16.0") + set(WITH_PCH OFF) + set(WITH_UNITY_BUILD OFF) +elseif(WITH_UNITY_BUILD) + set(CMAKE_UNITY_BUILD ON) +endif() + if(WITH_SANITIZERS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fsanitize=undefined") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fsanitize=undefined") @@ -327,5 +334,6 @@ message("\n" "* Compile flags : ${CMAKE_C_FLAGS} (CXX: ${CMAKE_CXX_FLAGS})\n" "* Link-time optimization : ${WITH_LTO}\n" "* Use precompiled headers : ${WITH_PCH}\n" +"* Use unity build : ${WITH_UNITY_BUILD}\n" "* Build with sanitizers : ${WITH_SANITIZERS}\n" ) diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index 866d8d11b..8583f8dec 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -15,5 +15,8 @@ macro(build_veyon_application APPLICATION_NAME) target_compile_options(${APPLICATION_NAME} PRIVATE ${VEYON_COMPILE_OPTIONS}) set_property(TARGET ${APPLICATION_NAME} PROPERTY POSITION_INDEPENDENT_CODE TRUE) set_default_target_properties(${APPLICATION_NAME}) + if(WITH_PCH) + target_precompile_headers(${APPLICATION_NAME} REUSE_FROM veyon-pch) + endif() endmacro() diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index 263f3022a..a78fef746 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -6,7 +6,6 @@ include(SetDefaultTargetProperties) macro(build_veyon_plugin PLUGIN_NAME) - add_library(${PLUGIN_NAME} MODULE ${ARGN}) target_include_directories(${PLUGIN_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) @@ -17,7 +16,8 @@ macro(build_veyon_plugin PLUGIN_NAME) set_target_properties(${PLUGIN_NAME} PROPERTIES PREFIX "") set_target_properties(${PLUGIN_NAME} PROPERTIES LINK_FLAGS "-Wl,-no-undefined") install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION ${VEYON_INSTALL_PLUGIN_DIR}) - - cotire_veyon(${PLUGIN_NAME}) + if(WITH_PCH) + target_precompile_headers(${PLUGIN_NAME} REUSE_FROM veyon-pch) + endif() endmacro() diff --git a/cmake/modules/CotireVeyon.cmake b/cmake/modules/CotireVeyon.cmake deleted file mode 100644 index 94d7e2fd5..000000000 --- a/cmake/modules/CotireVeyon.cmake +++ /dev/null @@ -1,10 +0,0 @@ -include(cotire) -macro(cotire_veyon TARGET_NAME) - if(WITH_PCH AND NOT VEYON_DEBUG) - get_target_property(_targetType ${TARGET_NAME} TYPE) - if(NOT VEYON_BUILD_ANDROID OR NOT _targetType STREQUAL "EXECUTABLE") - set_target_properties(${TARGET_NAME} PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT "${PROJECT_SOURCE_DIR}/core/src/Cotire.h") - cotire(${TARGET_NAME}) - endif() - endif() -endmacro() diff --git a/cmake/modules/cotire.cmake b/cmake/modules/cotire.cmake deleted file mode 100644 index 58e00c8d7..000000000 --- a/cmake/modules/cotire.cmake +++ /dev/null @@ -1,4191 +0,0 @@ -# - cotire (compile time reducer) -# -# See the cotire manual for usage hints. -# -#============================================================================= -# Copyright 2012-2018 Sascha Kratky -# -# Permission is hereby granted, free of charge, to any person -# obtaining a copy of this software and associated documentation -# files (the "Software"), to deal in the Software without -# restriction, including without limitation the rights to use, -# copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the -# Software is furnished to do so, subject to the following -# conditions: -# -# The above copyright notice and this permission notice shall be -# included in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -#============================================================================= - -if(__COTIRE_INCLUDED) - return() -endif() -set(__COTIRE_INCLUDED TRUE) - -# call cmake_minimum_required, but prevent modification of the CMake policy stack in include mode -# cmake_minimum_required also sets the policy version as a side effect, which we have to avoid -if (NOT CMAKE_SCRIPT_MODE_FILE) - cmake_policy(PUSH) -endif() -cmake_minimum_required(VERSION 2.8.12) -if (NOT CMAKE_SCRIPT_MODE_FILE) - cmake_policy(POP) -endif() - -set (COTIRE_CMAKE_MODULE_FILE "${CMAKE_CURRENT_LIST_FILE}") -set (COTIRE_CMAKE_MODULE_VERSION "1.8.0") - -# activate select policies -if (POLICY CMP0025) - # Compiler id for Apple Clang is now AppleClang - cmake_policy(SET CMP0025 NEW) -endif() - -if (POLICY CMP0026) - # disallow use of the LOCATION target property - cmake_policy(SET CMP0026 NEW) -endif() - -if (POLICY CMP0038) - # targets may not link directly to themselves - cmake_policy(SET CMP0038 NEW) -endif() - -if (POLICY CMP0039) - # utility targets may not have link dependencies - cmake_policy(SET CMP0039 NEW) -endif() - -if (POLICY CMP0040) - # target in the TARGET signature of add_custom_command() must exist - cmake_policy(SET CMP0040 NEW) -endif() - -if (POLICY CMP0045) - # error on non-existent target in get_target_property - cmake_policy(SET CMP0045 NEW) -endif() - -if (POLICY CMP0046) - # error on non-existent dependency in add_dependencies - cmake_policy(SET CMP0046 NEW) -endif() - -if (POLICY CMP0049) - # do not expand variables in target source entries - cmake_policy(SET CMP0049 NEW) -endif() - -if (POLICY CMP0050) - # disallow add_custom_command SOURCE signatures - cmake_policy(SET CMP0050 NEW) -endif() - -if (POLICY CMP0051) - # include TARGET_OBJECTS expressions in a target's SOURCES property - cmake_policy(SET CMP0051 NEW) -endif() - -if (POLICY CMP0053) - # simplify variable reference and escape sequence evaluation - cmake_policy(SET CMP0053 NEW) -endif() - -if (POLICY CMP0054) - # only interpret if() arguments as variables or keywords when unquoted - cmake_policy(SET CMP0054 NEW) -endif() - -if (POLICY CMP0055) - # strict checking for break() command - cmake_policy(SET CMP0055 NEW) -endif() - -include(CMakeParseArguments) -include(ProcessorCount) - -function (cotire_get_configuration_types _configsVar) - set (_configs "") - if (CMAKE_CONFIGURATION_TYPES) - list (APPEND _configs ${CMAKE_CONFIGURATION_TYPES}) - endif() - if (CMAKE_BUILD_TYPE) - list (APPEND _configs "${CMAKE_BUILD_TYPE}") - endif() - if (_configs) - list (REMOVE_DUPLICATES _configs) - set (${_configsVar} ${_configs} PARENT_SCOPE) - else() - set (${_configsVar} "None" PARENT_SCOPE) - endif() -endfunction() - -function (cotire_get_source_file_extension _sourceFile _extVar) - # get_filename_component returns extension from first occurrence of . in file name - # this function computes the extension from last occurrence of . in file name - string (FIND "${_sourceFile}" "." _index REVERSE) - if (_index GREATER -1) - math (EXPR _index "${_index} + 1") - string (SUBSTRING "${_sourceFile}" ${_index} -1 _sourceExt) - else() - set (_sourceExt "") - endif() - set (${_extVar} "${_sourceExt}" PARENT_SCOPE) -endfunction() - -macro (cotire_check_is_path_relative_to _path _isRelativeVar) - set (${_isRelativeVar} FALSE) - if (IS_ABSOLUTE "${_path}") - foreach (_dir ${ARGN}) - file (RELATIVE_PATH _relPath "${_dir}" "${_path}") - if (NOT _relPath OR (NOT IS_ABSOLUTE "${_relPath}" AND NOT "${_relPath}" MATCHES "^\\.\\.")) - set (${_isRelativeVar} TRUE) - break() - endif() - endforeach() - endif() -endmacro() - -function (cotire_filter_language_source_files _language _target _sourceFilesVar _excludedSourceFilesVar _cotiredSourceFilesVar) - if (CMAKE_${_language}_SOURCE_FILE_EXTENSIONS) - set (_languageExtensions "${CMAKE_${_language}_SOURCE_FILE_EXTENSIONS}") - else() - set (_languageExtensions "") - endif() - if (CMAKE_${_language}_IGNORE_EXTENSIONS) - set (_ignoreExtensions "${CMAKE_${_language}_IGNORE_EXTENSIONS}") - else() - set (_ignoreExtensions "") - endif() - if (COTIRE_UNITY_SOURCE_EXCLUDE_EXTENSIONS) - set (_excludeExtensions "${COTIRE_UNITY_SOURCE_EXCLUDE_EXTENSIONS}") - else() - set (_excludeExtensions "") - endif() - if (COTIRE_DEBUG AND _languageExtensions) - message (STATUS "${_language} source file extensions: ${_languageExtensions}") - endif() - if (COTIRE_DEBUG AND _ignoreExtensions) - message (STATUS "${_language} ignore extensions: ${_ignoreExtensions}") - endif() - if (COTIRE_DEBUG AND _excludeExtensions) - message (STATUS "${_language} exclude extensions: ${_excludeExtensions}") - endif() - if (CMAKE_VERSION VERSION_LESS "3.1.0") - set (_allSourceFiles ${ARGN}) - else() - # as of CMake 3.1 target sources may contain generator expressions - # since we cannot obtain required property information about source files added - # through generator expressions at configure time, we filter them out - string (GENEX_STRIP "${ARGN}" _allSourceFiles) - endif() - set (_filteredSourceFiles "") - set (_excludedSourceFiles "") - foreach (_sourceFile ${_allSourceFiles}) - get_source_file_property(_sourceIsHeaderOnly "${_sourceFile}" HEADER_FILE_ONLY) - get_source_file_property(_sourceIsExternal "${_sourceFile}" EXTERNAL_OBJECT) - get_source_file_property(_sourceIsSymbolic "${_sourceFile}" SYMBOLIC) - if (NOT _sourceIsHeaderOnly AND NOT _sourceIsExternal AND NOT _sourceIsSymbolic) - cotire_get_source_file_extension("${_sourceFile}" _sourceExt) - if (_sourceExt) - list (FIND _ignoreExtensions "${_sourceExt}" _ignoreIndex) - if (_ignoreIndex LESS 0) - list (FIND _excludeExtensions "${_sourceExt}" _excludeIndex) - if (_excludeIndex GREATER -1) - list (APPEND _excludedSourceFiles "${_sourceFile}") - else() - list (FIND _languageExtensions "${_sourceExt}" _sourceIndex) - if (_sourceIndex GREATER -1) - # consider source file unless it is excluded explicitly - get_source_file_property(_sourceIsExcluded "${_sourceFile}" COTIRE_EXCLUDED) - if (_sourceIsExcluded) - list (APPEND _excludedSourceFiles "${_sourceFile}") - else() - list (APPEND _filteredSourceFiles "${_sourceFile}") - endif() - else() - get_source_file_property(_sourceLanguage "${_sourceFile}" LANGUAGE) - if ("${_sourceLanguage}" STREQUAL "${_language}") - # add to excluded sources, if file is not ignored and has correct language without having the correct extension - list (APPEND _excludedSourceFiles "${_sourceFile}") - endif() - endif() - endif() - endif() - endif() - endif() - endforeach() - # separate filtered source files from already cotired ones - # the COTIRE_TARGET property of a source file may be set while a target is being processed by cotire - set (_sourceFiles "") - set (_cotiredSourceFiles "") - foreach (_sourceFile ${_filteredSourceFiles}) - get_source_file_property(_sourceIsCotired "${_sourceFile}" COTIRE_TARGET) - if (_sourceIsCotired) - list (APPEND _cotiredSourceFiles "${_sourceFile}") - else() - get_source_file_property(_sourceCompileFlags "${_sourceFile}" COMPILE_FLAGS) - if (_sourceCompileFlags) - # add to excluded sources, if file has custom compile flags - list (APPEND _excludedSourceFiles "${_sourceFile}") - else() - get_source_file_property(_sourceCompileOptions "${_sourceFile}" COMPILE_OPTIONS) - if (_sourceCompileOptions) - # add to excluded sources, if file has list of custom compile options - list (APPEND _excludedSourceFiles "${_sourceFile}") - else() - list (APPEND _sourceFiles "${_sourceFile}") - endif() - endif() - endif() - endforeach() - if (COTIRE_DEBUG) - if (_sourceFiles) - message (STATUS "Filtered ${_target} ${_language} sources: ${_sourceFiles}") - endif() - if (_excludedSourceFiles) - message (STATUS "Excluded ${_target} ${_language} sources: ${_excludedSourceFiles}") - endif() - if (_cotiredSourceFiles) - message (STATUS "Cotired ${_target} ${_language} sources: ${_cotiredSourceFiles}") - endif() - endif() - set (${_sourceFilesVar} ${_sourceFiles} PARENT_SCOPE) - set (${_excludedSourceFilesVar} ${_excludedSourceFiles} PARENT_SCOPE) - set (${_cotiredSourceFilesVar} ${_cotiredSourceFiles} PARENT_SCOPE) -endfunction() - -function (cotire_get_objects_with_property_on _filteredObjectsVar _property _type) - set (_filteredObjects "") - foreach (_object ${ARGN}) - get_property(_isSet ${_type} "${_object}" PROPERTY ${_property} SET) - if (_isSet) - get_property(_propertyValue ${_type} "${_object}" PROPERTY ${_property}) - if (_propertyValue) - list (APPEND _filteredObjects "${_object}") - endif() - endif() - endforeach() - set (${_filteredObjectsVar} ${_filteredObjects} PARENT_SCOPE) -endfunction() - -function (cotire_get_objects_with_property_off _filteredObjectsVar _property _type) - set (_filteredObjects "") - foreach (_object ${ARGN}) - get_property(_isSet ${_type} "${_object}" PROPERTY ${_property} SET) - if (_isSet) - get_property(_propertyValue ${_type} "${_object}" PROPERTY ${_property}) - if (NOT _propertyValue) - list (APPEND _filteredObjects "${_object}") - endif() - endif() - endforeach() - set (${_filteredObjectsVar} ${_filteredObjects} PARENT_SCOPE) -endfunction() - -function (cotire_get_source_file_property_values _valuesVar _property) - set (_values "") - foreach (_sourceFile ${ARGN}) - get_source_file_property(_propertyValue "${_sourceFile}" ${_property}) - if (_propertyValue) - list (APPEND _values "${_propertyValue}") - endif() - endforeach() - set (${_valuesVar} ${_values} PARENT_SCOPE) -endfunction() - -function (cotire_resolve_config_properties _configurations _propertiesVar) - set (_properties "") - foreach (_property ${ARGN}) - if ("${_property}" MATCHES "") - foreach (_config ${_configurations}) - string (TOUPPER "${_config}" _upperConfig) - string (REPLACE "" "${_upperConfig}" _configProperty "${_property}") - list (APPEND _properties ${_configProperty}) - endforeach() - else() - list (APPEND _properties ${_property}) - endif() - endforeach() - set (${_propertiesVar} ${_properties} PARENT_SCOPE) -endfunction() - -function (cotire_copy_set_properties _configurations _type _source _target) - cotire_resolve_config_properties("${_configurations}" _properties ${ARGN}) - foreach (_property ${_properties}) - get_property(_isSet ${_type} ${_source} PROPERTY ${_property} SET) - if (_isSet) - get_property(_propertyValue ${_type} ${_source} PROPERTY ${_property}) - set_property(${_type} ${_target} PROPERTY ${_property} "${_propertyValue}") - endif() - endforeach() -endfunction() - -function (cotire_get_target_usage_requirements _target _config _targetRequirementsVar) - set (_targetRequirements "") - get_target_property(_librariesToProcess ${_target} LINK_LIBRARIES) - while (_librariesToProcess) - # remove from head - list (GET _librariesToProcess 0 _library) - list (REMOVE_AT _librariesToProcess 0) - if (_library MATCHES "^\\$<\\$:([A-Za-z0-9_:-]+)>$") - set (_library "${CMAKE_MATCH_1}") - elseif (_config STREQUAL "None" AND _library MATCHES "^\\$<\\$:([A-Za-z0-9_:-]+)>$") - set (_library "${CMAKE_MATCH_1}") - endif() - if (TARGET ${_library}) - list (FIND _targetRequirements ${_library} _index) - if (_index LESS 0) - list (APPEND _targetRequirements ${_library}) - # BFS traversal of transitive libraries - get_target_property(_libraries ${_library} INTERFACE_LINK_LIBRARIES) - if (_libraries) - list (APPEND _librariesToProcess ${_libraries}) - list (REMOVE_DUPLICATES _librariesToProcess) - endif() - endif() - endif() - endwhile() - set (${_targetRequirementsVar} ${_targetRequirements} PARENT_SCOPE) -endfunction() - -function (cotire_filter_compile_flags _language _flagFilter _matchedOptionsVar _unmatchedOptionsVar) - if (WIN32 AND CMAKE_${_language}_COMPILER_ID MATCHES "MSVC|Intel") - set (_flagPrefix "[/-]") - else() - set (_flagPrefix "--?") - endif() - set (_optionFlag "") - set (_matchedOptions "") - set (_unmatchedOptions "") - foreach (_compileFlag ${ARGN}) - if (_compileFlag) - if (_optionFlag AND NOT "${_compileFlag}" MATCHES "^${_flagPrefix}") - # option with separate argument - list (APPEND _matchedOptions "${_compileFlag}") - set (_optionFlag "") - elseif ("${_compileFlag}" MATCHES "^(${_flagPrefix})(${_flagFilter})$") - # remember option - set (_optionFlag "${CMAKE_MATCH_2}") - elseif ("${_compileFlag}" MATCHES "^(${_flagPrefix})(${_flagFilter})(.+)$") - # option with joined argument - list (APPEND _matchedOptions "${CMAKE_MATCH_3}") - set (_optionFlag "") - else() - # flush remembered option - if (_optionFlag) - list (APPEND _matchedOptions "${_optionFlag}") - set (_optionFlag "") - endif() - # add to unfiltered options - list (APPEND _unmatchedOptions "${_compileFlag}") - endif() - endif() - endforeach() - if (_optionFlag) - list (APPEND _matchedOptions "${_optionFlag}") - endif() - if (COTIRE_DEBUG AND _matchedOptions) - message (STATUS "Filter ${_flagFilter} matched: ${_matchedOptions}") - endif() - if (COTIRE_DEBUG AND _unmatchedOptions) - message (STATUS "Filter ${_flagFilter} unmatched: ${_unmatchedOptions}") - endif() - set (${_matchedOptionsVar} ${_matchedOptions} PARENT_SCOPE) - set (${_unmatchedOptionsVar} ${_unmatchedOptions} PARENT_SCOPE) -endfunction() - -function (cotire_is_target_supported _target _isSupportedVar) - if (NOT TARGET "${_target}") - set (${_isSupportedVar} FALSE PARENT_SCOPE) - return() - endif() - get_target_property(_imported ${_target} IMPORTED) - if (_imported) - set (${_isSupportedVar} FALSE PARENT_SCOPE) - return() - endif() - get_target_property(_targetType ${_target} TYPE) - if (NOT _targetType MATCHES "EXECUTABLE|(STATIC|SHARED|MODULE|OBJECT)_LIBRARY") - set (${_isSupportedVar} FALSE PARENT_SCOPE) - return() - endif() - set (${_isSupportedVar} TRUE PARENT_SCOPE) -endfunction() - -function (cotire_get_target_compile_flags _config _language _target _flagsVar) - string (TOUPPER "${_config}" _upperConfig) - # collect options from CMake language variables - set (_compileFlags "") - if (CMAKE_${_language}_FLAGS) - set (_compileFlags "${_compileFlags} ${CMAKE_${_language}_FLAGS}") - endif() - if (CMAKE_${_language}_FLAGS_${_upperConfig}) - set (_compileFlags "${_compileFlags} ${CMAKE_${_language}_FLAGS_${_upperConfig}}") - endif() - if (_target) - # add target compile flags - get_target_property(_targetflags ${_target} COMPILE_FLAGS) - if (_targetflags) - set (_compileFlags "${_compileFlags} ${_targetflags}") - endif() - endif() - if (UNIX) - separate_arguments(_compileFlags UNIX_COMMAND "${_compileFlags}") - elseif(WIN32) - separate_arguments(_compileFlags WINDOWS_COMMAND "${_compileFlags}") - else() - separate_arguments(_compileFlags) - endif() - # target compile options - if (_target) - get_target_property(_targetOptions ${_target} COMPILE_OPTIONS) - if (_targetOptions) - list (APPEND _compileFlags ${_targetOptions}) - endif() - endif() - # interface compile options from linked library targets - if (_target) - set (_linkedTargets "") - cotire_get_target_usage_requirements(${_target} ${_config} _linkedTargets) - foreach (_linkedTarget ${_linkedTargets}) - get_target_property(_targetOptions ${_linkedTarget} INTERFACE_COMPILE_OPTIONS) - if (_targetOptions) - list (APPEND _compileFlags ${_targetOptions}) - endif() - endforeach() - endif() - # handle language standard properties - if (CMAKE_${_language}_STANDARD_DEFAULT) - # used compiler supports language standard levels - if (_target) - get_target_property(_targetLanguageStandard ${_target} ${_language}_STANDARD) - if (_targetLanguageStandard) - set (_type "EXTENSION") - get_property(_isSet TARGET ${_target} PROPERTY ${_language}_EXTENSIONS SET) - if (_isSet) - get_target_property(_targetUseLanguageExtensions ${_target} ${_language}_EXTENSIONS) - if (NOT _targetUseLanguageExtensions) - set (_type "STANDARD") - endif() - endif() - if (CMAKE_${_language}${_targetLanguageStandard}_${_type}_COMPILE_OPTION) - list (APPEND _compileFlags "${CMAKE_${_language}${_targetLanguageStandard}_${_type}_COMPILE_OPTION}") - endif() - endif() - endif() - endif() - # handle the POSITION_INDEPENDENT_CODE target property - if (_target) - get_target_property(_targetPIC ${_target} POSITION_INDEPENDENT_CODE) - if (_targetPIC) - get_target_property(_targetType ${_target} TYPE) - if (_targetType STREQUAL "EXECUTABLE" AND CMAKE_${_language}_COMPILE_OPTIONS_PIE) - list (APPEND _compileFlags "${CMAKE_${_language}_COMPILE_OPTIONS_PIE}") - list (APPEND _compileFlags "${CMAKE_${_language}_COMPILE_OPTIONS_PIC}") - elseif (CMAKE_${_language}_COMPILE_OPTIONS_PIC) - list (APPEND _compileFlags "${CMAKE_${_language}_COMPILE_OPTIONS_PIC}") - endif() - endif() - endif() - # handle visibility target properties - if (_target) - get_target_property(_targetVisibility ${_target} ${_language}_VISIBILITY_PRESET) - if (_targetVisibility AND CMAKE_${_language}_COMPILE_OPTIONS_VISIBILITY) - list (APPEND _compileFlags "${CMAKE_${_language}_COMPILE_OPTIONS_VISIBILITY}${_targetVisibility}") - endif() - get_target_property(_targetVisibilityInlines ${_target} VISIBILITY_INLINES_HIDDEN) - if (_targetVisibilityInlines AND CMAKE_${_language}_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN) - list (APPEND _compileFlags "${CMAKE_${_language}_COMPILE_OPTIONS_VISIBILITY_INLINES_HIDDEN}") - endif() - endif() - # platform specific flags - if (APPLE) - get_target_property(_architectures ${_target} OSX_ARCHITECTURES_${_upperConfig}) - if (NOT _architectures) - get_target_property(_architectures ${_target} OSX_ARCHITECTURES) - endif() - if (_architectures) - foreach (_arch ${_architectures}) - list (APPEND _compileFlags "-arch" "${_arch}") - endforeach() - endif() - if (CMAKE_OSX_SYSROOT) - if (CMAKE_${_language}_SYSROOT_FLAG) - list (APPEND _compileFlags "${CMAKE_${_language}_SYSROOT_FLAG}" "${CMAKE_OSX_SYSROOT}") - else() - list (APPEND _compileFlags "-isysroot" "${CMAKE_OSX_SYSROOT}") - endif() - endif() - if (CMAKE_OSX_DEPLOYMENT_TARGET) - if (CMAKE_${_language}_OSX_DEPLOYMENT_TARGET_FLAG) - list (APPEND _compileFlags "${CMAKE_${_language}_OSX_DEPLOYMENT_TARGET_FLAG}${CMAKE_OSX_DEPLOYMENT_TARGET}") - else() - list (APPEND _compileFlags "-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") - endif() - endif() - endif() - if (COTIRE_DEBUG AND _compileFlags) - message (STATUS "Target ${_target} compile flags: ${_compileFlags}") - endif() - set (${_flagsVar} ${_compileFlags} PARENT_SCOPE) -endfunction() - -function (cotire_get_target_include_directories _config _language _target _includeDirsVar _systemIncludeDirsVar) - set (_includeDirs "") - set (_systemIncludeDirs "") - # default include dirs - if (CMAKE_INCLUDE_CURRENT_DIR) - list (APPEND _includeDirs "${CMAKE_CURRENT_BINARY_DIR}") - list (APPEND _includeDirs "${CMAKE_CURRENT_SOURCE_DIR}") - endif() - set (_targetFlags "") - cotire_get_target_compile_flags("${_config}" "${_language}" "${_target}" _targetFlags) - # parse additional include directories from target compile flags - if (CMAKE_INCLUDE_FLAG_${_language}) - string (STRIP "${CMAKE_INCLUDE_FLAG_${_language}}" _includeFlag) - string (REGEX REPLACE "^[-/]+" "" _includeFlag "${_includeFlag}") - if (_includeFlag) - set (_dirs "") - cotire_filter_compile_flags("${_language}" "${_includeFlag}" _dirs _ignore ${_targetFlags}) - if (_dirs) - list (APPEND _includeDirs ${_dirs}) - endif() - endif() - endif() - # parse additional system include directories from target compile flags - if (CMAKE_INCLUDE_SYSTEM_FLAG_${_language}) - string (STRIP "${CMAKE_INCLUDE_SYSTEM_FLAG_${_language}}" _includeFlag) - string (REGEX REPLACE "^[-/]+" "" _includeFlag "${_includeFlag}") - if (_includeFlag) - set (_dirs "") - cotire_filter_compile_flags("${_language}" "${_includeFlag}" _dirs _ignore ${_targetFlags}) - if (_dirs) - list (APPEND _systemIncludeDirs ${_dirs}) - endif() - endif() - endif() - # target include directories - get_directory_property(_dirs DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" INCLUDE_DIRECTORIES) - if (_target) - get_target_property(_targetDirs ${_target} INCLUDE_DIRECTORIES) - if (_targetDirs) - list (APPEND _dirs ${_targetDirs}) - endif() - get_target_property(_targetDirs ${_target} INTERFACE_SYSTEM_INCLUDE_DIRECTORIES) - if (_targetDirs) - list (APPEND _systemIncludeDirs ${_targetDirs}) - endif() - endif() - # interface include directories from linked library targets - if (_target) - set (_linkedTargets "") - cotire_get_target_usage_requirements(${_target} ${_config} _linkedTargets) - foreach (_linkedTarget ${_linkedTargets}) - get_target_property(_linkedTargetType ${_linkedTarget} TYPE) - if (CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE AND NOT CMAKE_VERSION VERSION_LESS "3.4.0" AND - _linkedTargetType MATCHES "(STATIC|SHARED|MODULE|OBJECT)_LIBRARY") - # CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE refers to CMAKE_CURRENT_BINARY_DIR and CMAKE_CURRENT_SOURCE_DIR - # at the time, when the target was created. These correspond to the target properties BINARY_DIR and SOURCE_DIR - # which are only available with CMake 3.4 or later. - get_target_property(_targetDirs ${_linkedTarget} BINARY_DIR) - if (_targetDirs) - list (APPEND _dirs ${_targetDirs}) - endif() - get_target_property(_targetDirs ${_linkedTarget} SOURCE_DIR) - if (_targetDirs) - list (APPEND _dirs ${_targetDirs}) - endif() - endif() - get_target_property(_targetDirs ${_linkedTarget} INTERFACE_INCLUDE_DIRECTORIES) - if (_targetDirs) - list (APPEND _dirs ${_targetDirs}) - endif() - get_target_property(_targetDirs ${_linkedTarget} INTERFACE_SYSTEM_INCLUDE_DIRECTORIES) - if (_targetDirs) - list (APPEND _systemIncludeDirs ${_targetDirs}) - endif() - endforeach() - endif() - if (dirs) - list (REMOVE_DUPLICATES _dirs) - endif() - list (LENGTH _includeDirs _projectInsertIndex) - foreach (_dir ${_dirs}) - if (CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE) - cotire_check_is_path_relative_to("${_dir}" _isRelative "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}") - if (_isRelative) - list (LENGTH _includeDirs _len) - if (_len EQUAL _projectInsertIndex) - list (APPEND _includeDirs "${_dir}") - else() - list (INSERT _includeDirs _projectInsertIndex "${_dir}") - endif() - math (EXPR _projectInsertIndex "${_projectInsertIndex} + 1") - else() - list (APPEND _includeDirs "${_dir}") - endif() - else() - list (APPEND _includeDirs "${_dir}") - endif() - endforeach() - list (REMOVE_DUPLICATES _includeDirs) - list (REMOVE_DUPLICATES _systemIncludeDirs) - if (CMAKE_${_language}_IMPLICIT_INCLUDE_DIRECTORIES) - list (REMOVE_ITEM _includeDirs ${CMAKE_${_language}_IMPLICIT_INCLUDE_DIRECTORIES}) - endif() - if (WIN32 AND NOT MINGW) - # convert Windows paths in include directories to CMake paths - if (_includeDirs) - set (_paths "") - foreach (_dir ${_includeDirs}) - file (TO_CMAKE_PATH "${_dir}" _path) - list (APPEND _paths "${_path}") - endforeach() - set (_includeDirs ${_paths}) - endif() - if (_systemIncludeDirs) - set (_paths "") - foreach (_dir ${_systemIncludeDirs}) - file (TO_CMAKE_PATH "${_dir}" _path) - list (APPEND _paths "${_path}") - endforeach() - set (_systemIncludeDirs ${_paths}) - endif() - endif() - if (COTIRE_DEBUG AND _includeDirs) - message (STATUS "Target ${_target} include dirs: ${_includeDirs}") - endif() - set (${_includeDirsVar} ${_includeDirs} PARENT_SCOPE) - if (COTIRE_DEBUG AND _systemIncludeDirs) - message (STATUS "Target ${_target} system include dirs: ${_systemIncludeDirs}") - endif() - set (${_systemIncludeDirsVar} ${_systemIncludeDirs} PARENT_SCOPE) -endfunction() - -function (cotire_get_target_export_symbol _target _exportSymbolVar) - set (_exportSymbol "") - get_target_property(_targetType ${_target} TYPE) - get_target_property(_enableExports ${_target} ENABLE_EXPORTS) - if (_targetType MATCHES "(SHARED|MODULE)_LIBRARY" OR - (_targetType STREQUAL "EXECUTABLE" AND _enableExports)) - get_target_property(_exportSymbol ${_target} DEFINE_SYMBOL) - if (NOT _exportSymbol) - set (_exportSymbol "${_target}_EXPORTS") - endif() - string (MAKE_C_IDENTIFIER "${_exportSymbol}" _exportSymbol) - endif() - set (${_exportSymbolVar} ${_exportSymbol} PARENT_SCOPE) -endfunction() - -function (cotire_get_target_compile_definitions _config _language _target _definitionsVar) - string (TOUPPER "${_config}" _upperConfig) - set (_configDefinitions "") - # CMAKE_INTDIR for multi-configuration build systems - if (NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".") - list (APPEND _configDefinitions "CMAKE_INTDIR=\"${_config}\"") - endif() - # target export define symbol - cotire_get_target_export_symbol("${_target}" _defineSymbol) - if (_defineSymbol) - list (APPEND _configDefinitions "${_defineSymbol}") - endif() - # directory compile definitions - get_directory_property(_definitions DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMPILE_DEFINITIONS) - if (_definitions) - list (APPEND _configDefinitions ${_definitions}) - endif() - get_directory_property(_definitions DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMPILE_DEFINITIONS_${_upperConfig}) - if (_definitions) - list (APPEND _configDefinitions ${_definitions}) - endif() - # target compile definitions - get_target_property(_definitions ${_target} COMPILE_DEFINITIONS) - if (_definitions) - list (APPEND _configDefinitions ${_definitions}) - endif() - get_target_property(_definitions ${_target} COMPILE_DEFINITIONS_${_upperConfig}) - if (_definitions) - list (APPEND _configDefinitions ${_definitions}) - endif() - # interface compile definitions from linked library targets - set (_linkedTargets "") - cotire_get_target_usage_requirements(${_target} ${_config} _linkedTargets) - foreach (_linkedTarget ${_linkedTargets}) - get_target_property(_definitions ${_linkedTarget} INTERFACE_COMPILE_DEFINITIONS) - if (_definitions) - list (APPEND _configDefinitions ${_definitions}) - endif() - endforeach() - # parse additional compile definitions from target compile flags - # and do not look at directory compile definitions, which we already handled - set (_targetFlags "") - cotire_get_target_compile_flags("${_config}" "${_language}" "${_target}" _targetFlags) - cotire_filter_compile_flags("${_language}" "D" _definitions _ignore ${_targetFlags}) - if (_definitions) - list (APPEND _configDefinitions ${_definitions}) - endif() - list (REMOVE_DUPLICATES _configDefinitions) - if (COTIRE_DEBUG AND _configDefinitions) - message (STATUS "Target ${_target} compile definitions: ${_configDefinitions}") - endif() - set (${_definitionsVar} ${_configDefinitions} PARENT_SCOPE) -endfunction() - -function (cotire_get_target_compiler_flags _config _language _target _compilerFlagsVar) - # parse target compile flags omitting compile definitions and include directives - set (_targetFlags "") - cotire_get_target_compile_flags("${_config}" "${_language}" "${_target}" _targetFlags) - set (_flagFilter "D") - if (CMAKE_INCLUDE_FLAG_${_language}) - string (STRIP "${CMAKE_INCLUDE_FLAG_${_language}}" _includeFlag) - string (REGEX REPLACE "^[-/]+" "" _includeFlag "${_includeFlag}") - if (_includeFlag) - set (_flagFilter "${_flagFilter}|${_includeFlag}") - endif() - endif() - if (CMAKE_INCLUDE_SYSTEM_FLAG_${_language}) - string (STRIP "${CMAKE_INCLUDE_SYSTEM_FLAG_${_language}}" _includeFlag) - string (REGEX REPLACE "^[-/]+" "" _includeFlag "${_includeFlag}") - if (_includeFlag) - set (_flagFilter "${_flagFilter}|${_includeFlag}") - endif() - endif() - set (_compilerFlags "") - cotire_filter_compile_flags("${_language}" "${_flagFilter}" _ignore _compilerFlags ${_targetFlags}) - if (COTIRE_DEBUG AND _compilerFlags) - message (STATUS "Target ${_target} compiler flags: ${_compilerFlags}") - endif() - set (${_compilerFlagsVar} ${_compilerFlags} PARENT_SCOPE) -endfunction() - -function (cotire_add_sys_root_paths _pathsVar) - if (APPLE) - if (CMAKE_OSX_SYSROOT AND CMAKE_${_language}_HAS_ISYSROOT) - foreach (_path IN LISTS ${_pathsVar}) - if (IS_ABSOLUTE "${_path}") - get_filename_component(_path "${CMAKE_OSX_SYSROOT}/${_path}" ABSOLUTE) - if (EXISTS "${_path}") - list (APPEND ${_pathsVar} "${_path}") - endif() - endif() - endforeach() - endif() - endif() - set (${_pathsVar} ${${_pathsVar}} PARENT_SCOPE) -endfunction() - -function (cotire_get_source_extra_properties _sourceFile _pattern _resultVar) - set (_extraProperties ${ARGN}) - set (_result "") - if (_extraProperties) - list (FIND _extraProperties "${_sourceFile}" _index) - if (_index GREATER -1) - math (EXPR _index "${_index} + 1") - list (LENGTH _extraProperties _len) - math (EXPR _len "${_len} - 1") - foreach (_index RANGE ${_index} ${_len}) - list (GET _extraProperties ${_index} _value) - if (_value MATCHES "${_pattern}") - list (APPEND _result "${_value}") - else() - break() - endif() - endforeach() - endif() - endif() - set (${_resultVar} ${_result} PARENT_SCOPE) -endfunction() - -function (cotire_get_source_compile_definitions _config _language _sourceFile _definitionsVar) - set (_compileDefinitions "") - if (NOT CMAKE_SCRIPT_MODE_FILE) - string (TOUPPER "${_config}" _upperConfig) - get_source_file_property(_definitions "${_sourceFile}" COMPILE_DEFINITIONS) - if (_definitions) - list (APPEND _compileDefinitions ${_definitions}) - endif() - get_source_file_property(_definitions "${_sourceFile}" COMPILE_DEFINITIONS_${_upperConfig}) - if (_definitions) - list (APPEND _compileDefinitions ${_definitions}) - endif() - endif() - cotire_get_source_extra_properties("${_sourceFile}" "^[a-zA-Z0-9_]+(=.*)?$" _definitions ${ARGN}) - if (_definitions) - list (APPEND _compileDefinitions ${_definitions}) - endif() - if (COTIRE_DEBUG AND _compileDefinitions) - message (STATUS "Source ${_sourceFile} compile definitions: ${_compileDefinitions}") - endif() - set (${_definitionsVar} ${_compileDefinitions} PARENT_SCOPE) -endfunction() - -function (cotire_get_source_files_compile_definitions _config _language _definitionsVar) - set (_configDefinitions "") - foreach (_sourceFile ${ARGN}) - cotire_get_source_compile_definitions("${_config}" "${_language}" "${_sourceFile}" _sourceDefinitions) - if (_sourceDefinitions) - list (APPEND _configDefinitions "${_sourceFile}" ${_sourceDefinitions} "-") - endif() - endforeach() - set (${_definitionsVar} ${_configDefinitions} PARENT_SCOPE) -endfunction() - -function (cotire_get_source_undefs _sourceFile _property _sourceUndefsVar) - set (_sourceUndefs "") - if (NOT CMAKE_SCRIPT_MODE_FILE) - get_source_file_property(_undefs "${_sourceFile}" ${_property}) - if (_undefs) - list (APPEND _sourceUndefs ${_undefs}) - endif() - endif() - cotire_get_source_extra_properties("${_sourceFile}" "^[a-zA-Z0-9_]+$" _undefs ${ARGN}) - if (_undefs) - list (APPEND _sourceUndefs ${_undefs}) - endif() - if (COTIRE_DEBUG AND _sourceUndefs) - message (STATUS "Source ${_sourceFile} ${_property} undefs: ${_sourceUndefs}") - endif() - set (${_sourceUndefsVar} ${_sourceUndefs} PARENT_SCOPE) -endfunction() - -function (cotire_get_source_files_undefs _property _sourceUndefsVar) - set (_sourceUndefs "") - foreach (_sourceFile ${ARGN}) - cotire_get_source_undefs("${_sourceFile}" ${_property} _undefs) - if (_undefs) - list (APPEND _sourceUndefs "${_sourceFile}" ${_undefs} "-") - endif() - endforeach() - set (${_sourceUndefsVar} ${_sourceUndefs} PARENT_SCOPE) -endfunction() - -macro (cotire_set_cmd_to_prologue _cmdVar) - set (${_cmdVar} "${CMAKE_COMMAND}") - if (COTIRE_DEBUG) - list (APPEND ${_cmdVar} "--warn-uninitialized") - endif() - list (APPEND ${_cmdVar} "-DCOTIRE_BUILD_TYPE:STRING=$") - if (XCODE) - list (APPEND ${_cmdVar} "-DXCODE:BOOL=TRUE") - endif() - if (COTIRE_VERBOSE) - list (APPEND ${_cmdVar} "-DCOTIRE_VERBOSE:BOOL=ON") - elseif("${CMAKE_GENERATOR}" MATCHES "Makefiles") - list (APPEND ${_cmdVar} "-DCOTIRE_VERBOSE:BOOL=$(VERBOSE)") - endif() -endmacro() - -function (cotire_init_compile_cmd _cmdVar _language _compilerLauncher _compilerExe _compilerArg1) - if (NOT _compilerLauncher) - set (_compilerLauncher ${CMAKE_${_language}_COMPILER_LAUNCHER}) - endif() - if (NOT _compilerExe) - set (_compilerExe "${CMAKE_${_language}_COMPILER}") - endif() - if (NOT _compilerArg1) - set (_compilerArg1 ${CMAKE_${_language}_COMPILER_ARG1}) - endif() - if (WIN32) - file (TO_NATIVE_PATH "${_compilerExe}" _compilerExe) - endif() - string (STRIP "${_compilerArg1}" _compilerArg1) - if ("${CMAKE_GENERATOR}" MATCHES "Make|Ninja") - # compiler launcher is only supported for Makefile and Ninja - set (${_cmdVar} ${_compilerLauncher} "${_compilerExe}" ${_compilerArg1} PARENT_SCOPE) - else() - set (${_cmdVar} "${_compilerExe}" ${_compilerArg1} PARENT_SCOPE) - endif() -endfunction() - -macro (cotire_add_definitions_to_cmd _cmdVar _language) - foreach (_definition ${ARGN}) - if (WIN32 AND CMAKE_${_language}_COMPILER_ID MATCHES "MSVC|Intel") - list (APPEND ${_cmdVar} "/D${_definition}") - else() - list (APPEND ${_cmdVar} "-D${_definition}") - endif() - endforeach() -endmacro() - -function (cotire_add_includes_to_cmd _cmdVar _language _includesVar _systemIncludesVar) - set (_includeDirs ${${_includesVar}} ${${_systemIncludesVar}}) - if (_includeDirs) - list (REMOVE_DUPLICATES _includeDirs) - foreach (_include ${_includeDirs}) - if (WIN32 AND CMAKE_${_language}_COMPILER_ID MATCHES "MSVC|Intel") - file (TO_NATIVE_PATH "${_include}" _include) - list (APPEND ${_cmdVar} "${CMAKE_INCLUDE_FLAG_${_language}}${CMAKE_INCLUDE_FLAG_SEP_${_language}}${_include}") - else() - set (_index -1) - if ("${CMAKE_INCLUDE_SYSTEM_FLAG_${_language}}" MATCHES ".+") - list (FIND ${_systemIncludesVar} "${_include}" _index) - endif() - if (_index GREATER -1) - list (APPEND ${_cmdVar} "${CMAKE_INCLUDE_SYSTEM_FLAG_${_language}}${CMAKE_INCLUDE_FLAG_SEP_${_language}}${_include}") - else() - list (APPEND ${_cmdVar} "${CMAKE_INCLUDE_FLAG_${_language}}${CMAKE_INCLUDE_FLAG_SEP_${_language}}${_include}") - endif() - endif() - endforeach() - endif() - set (${_cmdVar} ${${_cmdVar}} PARENT_SCOPE) -endfunction() - -function (cotire_add_frameworks_to_cmd _cmdVar _language _includesVar _systemIncludesVar) - if (APPLE) - set (_frameworkDirs "") - foreach (_include ${${_includesVar}}) - if (IS_ABSOLUTE "${_include}" AND _include MATCHES "\\.framework$") - get_filename_component(_frameworkDir "${_include}" DIRECTORY) - list (APPEND _frameworkDirs "${_frameworkDir}") - endif() - endforeach() - set (_systemFrameworkDirs "") - foreach (_include ${${_systemIncludesVar}}) - if (IS_ABSOLUTE "${_include}" AND _include MATCHES "\\.framework$") - get_filename_component(_frameworkDir "${_include}" DIRECTORY) - list (APPEND _systemFrameworkDirs "${_frameworkDir}") - endif() - endforeach() - if (_systemFrameworkDirs) - list (APPEND _frameworkDirs ${_systemFrameworkDirs}) - endif() - if (_frameworkDirs) - list (REMOVE_DUPLICATES _frameworkDirs) - foreach (_frameworkDir ${_frameworkDirs}) - set (_index -1) - if ("${CMAKE_${_language}_SYSTEM_FRAMEWORK_SEARCH_FLAG}" MATCHES ".+") - list (FIND _systemFrameworkDirs "${_frameworkDir}" _index) - endif() - if (_index GREATER -1) - list (APPEND ${_cmdVar} "${CMAKE_${_language}_SYSTEM_FRAMEWORK_SEARCH_FLAG}${_frameworkDir}") - else() - list (APPEND ${_cmdVar} "${CMAKE_${_language}_FRAMEWORK_SEARCH_FLAG}${_frameworkDir}") - endif() - endforeach() - endif() - endif() - set (${_cmdVar} ${${_cmdVar}} PARENT_SCOPE) -endfunction() - -macro (cotire_add_compile_flags_to_cmd _cmdVar) - foreach (_flag ${ARGN}) - list (APPEND ${_cmdVar} "${_flag}") - endforeach() -endmacro() - -function (cotire_check_file_up_to_date _fileIsUpToDateVar _file) - if (EXISTS "${_file}") - set (_triggerFile "") - foreach (_dependencyFile ${ARGN}) - if (EXISTS "${_dependencyFile}") - # IS_NEWER_THAN returns TRUE if both files have the same timestamp - # thus we do the comparison in both directions to exclude ties - if ("${_dependencyFile}" IS_NEWER_THAN "${_file}" AND - NOT "${_file}" IS_NEWER_THAN "${_dependencyFile}") - set (_triggerFile "${_dependencyFile}") - break() - endif() - endif() - endforeach() - if (_triggerFile) - if (COTIRE_VERBOSE) - get_filename_component(_fileName "${_file}" NAME) - message (STATUS "${_fileName} update triggered by ${_triggerFile} change.") - endif() - set (${_fileIsUpToDateVar} FALSE PARENT_SCOPE) - else() - if (COTIRE_VERBOSE) - get_filename_component(_fileName "${_file}" NAME) - message (STATUS "${_fileName} is up-to-date.") - endif() - set (${_fileIsUpToDateVar} TRUE PARENT_SCOPE) - endif() - else() - if (COTIRE_VERBOSE) - get_filename_component(_fileName "${_file}" NAME) - message (STATUS "${_fileName} does not exist yet.") - endif() - set (${_fileIsUpToDateVar} FALSE PARENT_SCOPE) - endif() -endfunction() - -macro (cotire_find_closest_relative_path _headerFile _includeDirs _relPathVar) - set (${_relPathVar} "") - foreach (_includeDir ${_includeDirs}) - if (IS_DIRECTORY "${_includeDir}") - file (RELATIVE_PATH _relPath "${_includeDir}" "${_headerFile}") - if (NOT IS_ABSOLUTE "${_relPath}" AND NOT "${_relPath}" MATCHES "^\\.\\.") - string (LENGTH "${${_relPathVar}}" _closestLen) - string (LENGTH "${_relPath}" _relLen) - if (_closestLen EQUAL 0 OR _relLen LESS _closestLen) - set (${_relPathVar} "${_relPath}") - endif() - endif() - elseif ("${_includeDir}" STREQUAL "${_headerFile}") - # if path matches exactly, return short non-empty string - set (${_relPathVar} "1") - break() - endif() - endforeach() -endmacro() - -macro (cotire_check_header_file_location _headerFile _insideIncludeDirs _outsideIncludeDirs _headerIsInside) - # check header path against ignored and honored include directories - cotire_find_closest_relative_path("${_headerFile}" "${_insideIncludeDirs}" _insideRelPath) - if (_insideRelPath) - # header is inside, but could be become outside if there is a shorter outside match - cotire_find_closest_relative_path("${_headerFile}" "${_outsideIncludeDirs}" _outsideRelPath) - if (_outsideRelPath) - string (LENGTH "${_insideRelPath}" _insideRelPathLen) - string (LENGTH "${_outsideRelPath}" _outsideRelPathLen) - if (_outsideRelPathLen LESS _insideRelPathLen) - set (${_headerIsInside} FALSE) - else() - set (${_headerIsInside} TRUE) - endif() - else() - set (${_headerIsInside} TRUE) - endif() - else() - # header is outside - set (${_headerIsInside} FALSE) - endif() -endmacro() - -macro (cotire_check_ignore_header_file_path _headerFile _headerIsIgnoredVar) - if (NOT EXISTS "${_headerFile}") - set (${_headerIsIgnoredVar} TRUE) - elseif (IS_DIRECTORY "${_headerFile}") - set (${_headerIsIgnoredVar} TRUE) - elseif ("${_headerFile}" MATCHES "\\.\\.|[_-]fixed" AND "${_headerFile}" MATCHES "\\.h$") - # heuristic: ignore C headers with embedded parent directory references or "-fixed" or "_fixed" in path - # these often stem from using GCC #include_next tricks, which may break the precompiled header compilation - # with the error message "error: no include path in which to search for header.h" - set (${_headerIsIgnoredVar} TRUE) - else() - set (${_headerIsIgnoredVar} FALSE) - endif() -endmacro() - -macro (cotire_check_ignore_header_file_ext _headerFile _ignoreExtensionsVar _headerIsIgnoredVar) - # check header file extension - cotire_get_source_file_extension("${_headerFile}" _headerFileExt) - set (${_headerIsIgnoredVar} FALSE) - if (_headerFileExt) - list (FIND ${_ignoreExtensionsVar} "${_headerFileExt}" _index) - if (_index GREATER -1) - set (${_headerIsIgnoredVar} TRUE) - endif() - endif() -endmacro() - -macro (cotire_parse_line _line _headerFileVar _headerDepthVar) - if (MSVC) - # cl.exe /showIncludes produces different output, depending on the language pack used, e.g.: - # English: "Note: including file: C:\directory\file" - # German: "Hinweis: Einlesen der Datei: C:\directory\file" - # We use a very general regular expression, relying on the presence of the : characters - if (_line MATCHES "( +)([a-zA-Z]:[^:]+)$") - string (LENGTH "${CMAKE_MATCH_1}" ${_headerDepthVar}) - get_filename_component(${_headerFileVar} "${CMAKE_MATCH_2}" ABSOLUTE) - else() - set (${_headerFileVar} "") - set (${_headerDepthVar} 0) - endif() - else() - if (_line MATCHES "^(\\.+) (.*)$") - # GCC like output - string (LENGTH "${CMAKE_MATCH_1}" ${_headerDepthVar}) - if (IS_ABSOLUTE "${CMAKE_MATCH_2}") - set (${_headerFileVar} "${CMAKE_MATCH_2}") - else() - get_filename_component(${_headerFileVar} "${CMAKE_MATCH_2}" REALPATH) - endif() - else() - set (${_headerFileVar} "") - set (${_headerDepthVar} 0) - endif() - endif() -endmacro() - -function (cotire_parse_includes _language _scanOutput _ignoredIncludeDirs _honoredIncludeDirs _ignoredExtensions _selectedIncludesVar _unparsedLinesVar) - if (WIN32) - # prevent CMake macro invocation errors due to backslash characters in Windows paths - string (REPLACE "\\" "/" _scanOutput "${_scanOutput}") - endif() - # canonize slashes - string (REPLACE "//" "/" _scanOutput "${_scanOutput}") - # prevent semicolon from being interpreted as a line separator - string (REPLACE ";" "\\;" _scanOutput "${_scanOutput}") - # then separate lines - string (REGEX REPLACE "\n" ";" _scanOutput "${_scanOutput}") - list (LENGTH _scanOutput _len) - # remove duplicate lines to speed up parsing - list (REMOVE_DUPLICATES _scanOutput) - list (LENGTH _scanOutput _uniqueLen) - if (COTIRE_VERBOSE OR COTIRE_DEBUG) - message (STATUS "Scanning ${_uniqueLen} unique lines of ${_len} for includes") - if (_ignoredExtensions) - message (STATUS "Ignored extensions: ${_ignoredExtensions}") - endif() - if (_ignoredIncludeDirs) - message (STATUS "Ignored paths: ${_ignoredIncludeDirs}") - endif() - if (_honoredIncludeDirs) - message (STATUS "Included paths: ${_honoredIncludeDirs}") - endif() - endif() - set (_sourceFiles ${ARGN}) - set (_selectedIncludes "") - set (_unparsedLines "") - # stack keeps track of inside/outside project status of processed header files - set (_headerIsInsideStack "") - foreach (_line IN LISTS _scanOutput) - if (_line) - cotire_parse_line("${_line}" _headerFile _headerDepth) - if (_headerFile) - cotire_check_header_file_location("${_headerFile}" "${_ignoredIncludeDirs}" "${_honoredIncludeDirs}" _headerIsInside) - if (COTIRE_DEBUG) - message (STATUS "${_headerDepth}: ${_headerFile} ${_headerIsInside}") - endif() - # update stack - list (LENGTH _headerIsInsideStack _stackLen) - if (_headerDepth GREATER _stackLen) - math (EXPR _stackLen "${_stackLen} + 1") - foreach (_index RANGE ${_stackLen} ${_headerDepth}) - list (APPEND _headerIsInsideStack ${_headerIsInside}) - endforeach() - else() - foreach (_index RANGE ${_headerDepth} ${_stackLen}) - list (REMOVE_AT _headerIsInsideStack -1) - endforeach() - list (APPEND _headerIsInsideStack ${_headerIsInside}) - endif() - if (COTIRE_DEBUG) - message (STATUS "${_headerIsInsideStack}") - endif() - # header is a candidate if it is outside project - if (NOT _headerIsInside) - # get parent header file's inside/outside status - if (_headerDepth GREATER 1) - math (EXPR _index "${_headerDepth} - 2") - list (GET _headerIsInsideStack ${_index} _parentHeaderIsInside) - else() - set (_parentHeaderIsInside TRUE) - endif() - # select header file if parent header file is inside project - # (e.g., a project header file that includes a standard header file) - if (_parentHeaderIsInside) - cotire_check_ignore_header_file_path("${_headerFile}" _headerIsIgnored) - if (NOT _headerIsIgnored) - cotire_check_ignore_header_file_ext("${_headerFile}" _ignoredExtensions _headerIsIgnored) - if (NOT _headerIsIgnored) - list (APPEND _selectedIncludes "${_headerFile}") - else() - # fix header's inside status on stack, it is ignored by extension now - list (REMOVE_AT _headerIsInsideStack -1) - list (APPEND _headerIsInsideStack TRUE) - endif() - endif() - if (COTIRE_DEBUG) - message (STATUS "${_headerFile} ${_ignoredExtensions} ${_headerIsIgnored}") - endif() - endif() - endif() - else() - if (MSVC) - # for cl.exe do not keep unparsed lines which solely consist of a source file name - string (FIND "${_sourceFiles}" "${_line}" _index) - if (_index LESS 0) - list (APPEND _unparsedLines "${_line}") - endif() - else() - list (APPEND _unparsedLines "${_line}") - endif() - endif() - endif() - endforeach() - list (REMOVE_DUPLICATES _selectedIncludes) - set (${_selectedIncludesVar} ${_selectedIncludes} PARENT_SCOPE) - set (${_unparsedLinesVar} ${_unparsedLines} PARENT_SCOPE) -endfunction() - -function (cotire_scan_includes _includesVar) - set(_options "") - set(_oneValueArgs COMPILER_ID COMPILER_EXECUTABLE COMPILER_ARG1 COMPILER_VERSION LANGUAGE UNPARSED_LINES SCAN_RESULT) - set(_multiValueArgs COMPILE_DEFINITIONS COMPILE_FLAGS INCLUDE_DIRECTORIES SYSTEM_INCLUDE_DIRECTORIES - IGNORE_PATH INCLUDE_PATH IGNORE_EXTENSIONS INCLUDE_PRIORITY_PATH COMPILER_LAUNCHER) - cmake_parse_arguments(_option "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN}) - set (_sourceFiles ${_option_UNPARSED_ARGUMENTS}) - if (NOT _option_LANGUAGE) - set (_option_LANGUAGE "CXX") - endif() - if (NOT _option_COMPILER_ID) - set (_option_COMPILER_ID "${CMAKE_${_option_LANGUAGE}_ID}") - endif() - if (NOT _option_COMPILER_VERSION) - set (_option_COMPILER_VERSION "${CMAKE_${_option_LANGUAGE}_COMPILER_VERSION}") - endif() - cotire_init_compile_cmd(_cmd "${_option_LANGUAGE}" "${_option_COMPILER_LAUNCHER}" "${_option_COMPILER_EXECUTABLE}" "${_option_COMPILER_ARG1}") - cotire_add_definitions_to_cmd(_cmd "${_option_LANGUAGE}" ${_option_COMPILE_DEFINITIONS}) - cotire_add_compile_flags_to_cmd(_cmd ${_option_COMPILE_FLAGS}) - cotire_add_includes_to_cmd(_cmd "${_option_LANGUAGE}" _option_INCLUDE_DIRECTORIES _option_SYSTEM_INCLUDE_DIRECTORIES) - cotire_add_frameworks_to_cmd(_cmd "${_option_LANGUAGE}" _option_INCLUDE_DIRECTORIES _option_SYSTEM_INCLUDE_DIRECTORIES) - cotire_add_makedep_flags("${_option_LANGUAGE}" "${_option_COMPILER_ID}" "${_option_COMPILER_VERSION}" _cmd) - # only consider existing source files for scanning - set (_existingSourceFiles "") - foreach (_sourceFile ${_sourceFiles}) - if (EXISTS "${_sourceFile}") - list (APPEND _existingSourceFiles "${_sourceFile}") - endif() - endforeach() - if (NOT _existingSourceFiles) - set (${_includesVar} "" PARENT_SCOPE) - return() - endif() - # add source files to be scanned - if (WIN32) - foreach (_sourceFile ${_existingSourceFiles}) - file (TO_NATIVE_PATH "${_sourceFile}" _sourceFileNative) - list (APPEND _cmd "${_sourceFileNative}") - endforeach() - else() - list (APPEND _cmd ${_existingSourceFiles}) - endif() - if (COTIRE_VERBOSE) - message (STATUS "execute_process: ${_cmd}") - endif() - if (MSVC_IDE OR _option_COMPILER_ID MATCHES "MSVC") - # cl.exe messes with the output streams unless the environment variable VS_UNICODE_OUTPUT is cleared - unset (ENV{VS_UNICODE_OUTPUT}) - endif() - execute_process( - COMMAND ${_cmd} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE _result - OUTPUT_QUIET - ERROR_VARIABLE _output) - if (_result) - message (STATUS "Result ${_result} scanning includes of ${_existingSourceFiles}.") - endif() - cotire_parse_includes( - "${_option_LANGUAGE}" "${_output}" - "${_option_IGNORE_PATH}" "${_option_INCLUDE_PATH}" - "${_option_IGNORE_EXTENSIONS}" - _includes _unparsedLines - ${_sourceFiles}) - if (_option_INCLUDE_PRIORITY_PATH) - set (_sortedIncludes "") - foreach (_priorityPath ${_option_INCLUDE_PRIORITY_PATH}) - foreach (_include ${_includes}) - string (FIND ${_include} ${_priorityPath} _position) - if (_position GREATER -1) - list (APPEND _sortedIncludes ${_include}) - endif() - endforeach() - endforeach() - if (_sortedIncludes) - list (INSERT _includes 0 ${_sortedIncludes}) - list (REMOVE_DUPLICATES _includes) - endif() - endif() - set (${_includesVar} ${_includes} PARENT_SCOPE) - if (_option_UNPARSED_LINES) - set (${_option_UNPARSED_LINES} ${_unparsedLines} PARENT_SCOPE) - endif() - if (_option_SCAN_RESULT) - set (${_option_SCAN_RESULT} ${_result} PARENT_SCOPE) - endif() -endfunction() - -macro (cotire_append_undefs _contentsVar) - set (_undefs ${ARGN}) - if (_undefs) - list (REMOVE_DUPLICATES _undefs) - foreach (_definition ${_undefs}) - list (APPEND ${_contentsVar} "#undef ${_definition}") - endforeach() - endif() -endmacro() - -macro (cotire_comment_str _language _commentText _commentVar) - if ("${_language}" STREQUAL "CMAKE") - set (${_commentVar} "# ${_commentText}") - else() - set (${_commentVar} "/* ${_commentText} */") - endif() -endmacro() - -function (cotire_write_file _language _file _contents _force) - get_filename_component(_moduleName "${COTIRE_CMAKE_MODULE_FILE}" NAME) - cotire_comment_str("${_language}" "${_moduleName} ${COTIRE_CMAKE_MODULE_VERSION} generated file" _header1) - cotire_comment_str("${_language}" "${_file}" _header2) - set (_contents "${_header1}\n${_header2}\n${_contents}") - if (COTIRE_DEBUG) - message (STATUS "${_contents}") - endif() - if (_force OR NOT EXISTS "${_file}") - file (WRITE "${_file}" "${_contents}") - else() - file (READ "${_file}" _oldContents) - if (NOT "${_oldContents}" STREQUAL "${_contents}") - file (WRITE "${_file}" "${_contents}") - else() - if (COTIRE_DEBUG) - message (STATUS "${_file} unchanged") - endif() - endif() - endif() -endfunction() - -function (cotire_generate_unity_source _unityFile) - set(_options "") - set(_oneValueArgs LANGUAGE) - set(_multiValueArgs - DEPENDS SOURCES_COMPILE_DEFINITIONS - PRE_UNDEFS SOURCES_PRE_UNDEFS POST_UNDEFS SOURCES_POST_UNDEFS PROLOGUE EPILOGUE) - cmake_parse_arguments(_option "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN}) - if (_option_DEPENDS) - cotire_check_file_up_to_date(_unityFileIsUpToDate "${_unityFile}" ${_option_DEPENDS}) - if (_unityFileIsUpToDate) - return() - endif() - endif() - set (_sourceFiles ${_option_UNPARSED_ARGUMENTS}) - if (NOT _option_PRE_UNDEFS) - set (_option_PRE_UNDEFS "") - endif() - if (NOT _option_SOURCES_PRE_UNDEFS) - set (_option_SOURCES_PRE_UNDEFS "") - endif() - if (NOT _option_POST_UNDEFS) - set (_option_POST_UNDEFS "") - endif() - if (NOT _option_SOURCES_POST_UNDEFS) - set (_option_SOURCES_POST_UNDEFS "") - endif() - set (_contents "") - if (_option_PROLOGUE) - list (APPEND _contents ${_option_PROLOGUE}) - endif() - if (_option_LANGUAGE AND _sourceFiles) - if ("${_option_LANGUAGE}" STREQUAL "CXX") - list (APPEND _contents "#ifdef __cplusplus") - elseif ("${_option_LANGUAGE}" STREQUAL "C") - list (APPEND _contents "#ifndef __cplusplus") - endif() - endif() - set (_compileUndefinitions "") - foreach (_sourceFile ${_sourceFiles}) - cotire_get_source_compile_definitions( - "${_option_CONFIGURATION}" "${_option_LANGUAGE}" "${_sourceFile}" _compileDefinitions - ${_option_SOURCES_COMPILE_DEFINITIONS}) - cotire_get_source_undefs("${_sourceFile}" COTIRE_UNITY_SOURCE_PRE_UNDEFS _sourcePreUndefs ${_option_SOURCES_PRE_UNDEFS}) - cotire_get_source_undefs("${_sourceFile}" COTIRE_UNITY_SOURCE_POST_UNDEFS _sourcePostUndefs ${_option_SOURCES_POST_UNDEFS}) - if (_option_PRE_UNDEFS) - list (APPEND _compileUndefinitions ${_option_PRE_UNDEFS}) - endif() - if (_sourcePreUndefs) - list (APPEND _compileUndefinitions ${_sourcePreUndefs}) - endif() - if (_compileUndefinitions) - cotire_append_undefs(_contents ${_compileUndefinitions}) - set (_compileUndefinitions "") - endif() - if (_sourcePostUndefs) - list (APPEND _compileUndefinitions ${_sourcePostUndefs}) - endif() - if (_option_POST_UNDEFS) - list (APPEND _compileUndefinitions ${_option_POST_UNDEFS}) - endif() - foreach (_definition ${_compileDefinitions}) - if (_definition MATCHES "^([a-zA-Z0-9_]+)=(.+)$") - list (APPEND _contents "#define ${CMAKE_MATCH_1} ${CMAKE_MATCH_2}") - list (INSERT _compileUndefinitions 0 "${CMAKE_MATCH_1}") - else() - list (APPEND _contents "#define ${_definition}") - list (INSERT _compileUndefinitions 0 "${_definition}") - endif() - endforeach() - # use absolute path as source file location - get_filename_component(_sourceFileLocation "${_sourceFile}" ABSOLUTE) - if (WIN32) - file (TO_NATIVE_PATH "${_sourceFileLocation}" _sourceFileLocation) - endif() - list (APPEND _contents "#include \"${_sourceFileLocation}\"") - endforeach() - if (_compileUndefinitions) - cotire_append_undefs(_contents ${_compileUndefinitions}) - set (_compileUndefinitions "") - endif() - if (_option_LANGUAGE AND _sourceFiles) - list (APPEND _contents "#endif") - endif() - if (_option_EPILOGUE) - list (APPEND _contents ${_option_EPILOGUE}) - endif() - list (APPEND _contents "") - string (REPLACE ";" "\n" _contents "${_contents}") - if (COTIRE_VERBOSE) - message ("${_contents}") - endif() - cotire_write_file("${_option_LANGUAGE}" "${_unityFile}" "${_contents}" TRUE) -endfunction() - -function (cotire_generate_prefix_header _prefixFile) - set(_options "") - set(_oneValueArgs LANGUAGE COMPILER_EXECUTABLE COMPILER_ARG1 COMPILER_ID COMPILER_VERSION) - set(_multiValueArgs DEPENDS COMPILE_DEFINITIONS COMPILE_FLAGS - INCLUDE_DIRECTORIES SYSTEM_INCLUDE_DIRECTORIES IGNORE_PATH INCLUDE_PATH - IGNORE_EXTENSIONS INCLUDE_PRIORITY_PATH COMPILER_LAUNCHER) - cmake_parse_arguments(_option "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN}) - if (NOT _option_COMPILER_ID) - set (_option_COMPILER_ID "${CMAKE_${_option_LANGUAGE}_ID}") - endif() - if (NOT _option_COMPILER_VERSION) - set (_option_COMPILER_VERSION "${CMAKE_${_option_LANGUAGE}_COMPILER_VERSION}") - endif() - if (_option_DEPENDS) - cotire_check_file_up_to_date(_prefixFileIsUpToDate "${_prefixFile}" ${_option_DEPENDS}) - if (_prefixFileIsUpToDate) - # create empty log file - set (_unparsedLinesFile "${_prefixFile}.log") - file (WRITE "${_unparsedLinesFile}" "") - return() - endif() - endif() - set (_prologue "") - set (_epilogue "") - if (_option_COMPILER_ID MATCHES "Clang") - set (_prologue "#pragma clang system_header") - elseif (_option_COMPILER_ID MATCHES "GNU") - set (_prologue "#pragma GCC system_header") - elseif (_option_COMPILER_ID MATCHES "MSVC") - set (_prologue "#pragma warning(push, 0)") - set (_epilogue "#pragma warning(pop)") - elseif (_option_COMPILER_ID MATCHES "Intel") - # Intel compiler requires hdrstop pragma to stop generating PCH file - set (_epilogue "#pragma hdrstop") - endif() - set (_sourceFiles ${_option_UNPARSED_ARGUMENTS}) - cotire_scan_includes(_selectedHeaders ${_sourceFiles} - LANGUAGE "${_option_LANGUAGE}" - COMPILER_LAUNCHER "${_option_COMPILER_LAUNCHER}" - COMPILER_EXECUTABLE "${_option_COMPILER_EXECUTABLE}" - COMPILER_ARG1 "${_option_COMPILER_ARG1}" - COMPILER_ID "${_option_COMPILER_ID}" - COMPILER_VERSION "${_option_COMPILER_VERSION}" - COMPILE_DEFINITIONS ${_option_COMPILE_DEFINITIONS} - COMPILE_FLAGS ${_option_COMPILE_FLAGS} - INCLUDE_DIRECTORIES ${_option_INCLUDE_DIRECTORIES} - SYSTEM_INCLUDE_DIRECTORIES ${_option_SYSTEM_INCLUDE_DIRECTORIES} - IGNORE_PATH ${_option_IGNORE_PATH} - INCLUDE_PATH ${_option_INCLUDE_PATH} - IGNORE_EXTENSIONS ${_option_IGNORE_EXTENSIONS} - INCLUDE_PRIORITY_PATH ${_option_INCLUDE_PRIORITY_PATH} - UNPARSED_LINES _unparsedLines - SCAN_RESULT _scanResult) - cotire_generate_unity_source("${_prefixFile}" - PROLOGUE ${_prologue} EPILOGUE ${_epilogue} LANGUAGE "${_option_LANGUAGE}" ${_selectedHeaders}) - set (_unparsedLinesFile "${_prefixFile}.log") - if (_unparsedLines) - if (COTIRE_VERBOSE OR _scanResult OR NOT _selectedHeaders) - list (LENGTH _unparsedLines _skippedLineCount) - if (WIN32) - file (TO_NATIVE_PATH "${_unparsedLinesFile}" _unparsedLinesLogPath) - else() - set (_unparsedLinesLogPath "${_unparsedLinesFile}") - endif() - message (STATUS "${_skippedLineCount} line(s) skipped, see ${_unparsedLinesLogPath}") - endif() - string (REPLACE ";" "\n" _unparsedLines "${_unparsedLines}") - endif() - file (WRITE "${_unparsedLinesFile}" "${_unparsedLines}\n") -endfunction() - -function (cotire_add_makedep_flags _language _compilerID _compilerVersion _flagsVar) - set (_flags ${${_flagsVar}}) - if (_compilerID MATCHES "MSVC") - # cl.exe options used - # /nologo suppresses display of sign-on banner - # /TC treat all files named on the command line as C source files - # /TP treat all files named on the command line as C++ source files - # /EP preprocess to stdout without #line directives - # /showIncludes list include files - set (_sourceFileTypeC "/TC") - set (_sourceFileTypeCXX "/TP") - if (_flags) - # append to list - list (APPEND _flags /nologo "${_sourceFileType${_language}}" /EP /showIncludes) - else() - # return as a flag string - set (_flags "${_sourceFileType${_language}} /EP /showIncludes") - endif() - elseif (_compilerID MATCHES "GNU") - # GCC options used - # -H print the name of each header file used - # -E invoke preprocessor - # -fdirectives-only do not expand macros, requires GCC >= 4.3 - if (_flags) - # append to list - list (APPEND _flags -H -E) - if (NOT "${_compilerVersion}" VERSION_LESS "4.3.0") - list (APPEND _flags -fdirectives-only) - endif() - else() - # return as a flag string - set (_flags "-H -E") - if (NOT "${_compilerVersion}" VERSION_LESS "4.3.0") - set (_flags "${_flags} -fdirectives-only") - endif() - endif() - elseif (_compilerID MATCHES "Clang") - if (UNIX) - # Clang options used - # -H print the name of each header file used - # -E invoke preprocessor - # -fno-color-diagnostics do not print diagnostics in color - # -Eonly just run preprocessor, no output - if (_flags) - # append to list - list (APPEND _flags -H -E -fno-color-diagnostics -Xclang -Eonly) - else() - # return as a flag string - set (_flags "-H -E -fno-color-diagnostics -Xclang -Eonly") - endif() - elseif (WIN32) - # Clang-cl.exe options used - # /TC treat all files named on the command line as C source files - # /TP treat all files named on the command line as C++ source files - # /EP preprocess to stdout without #line directives - # -H print the name of each header file used - # -fno-color-diagnostics do not print diagnostics in color - # -Eonly just run preprocessor, no output - set (_sourceFileTypeC "/TC") - set (_sourceFileTypeCXX "/TP") - if (_flags) - # append to list - list (APPEND _flags "${_sourceFileType${_language}}" /EP -fno-color-diagnostics -Xclang -H -Xclang -Eonly) - else() - # return as a flag string - set (_flags "${_sourceFileType${_language}} /EP -fno-color-diagnostics -Xclang -H -Xclang -Eonly") - endif() - endif() - elseif (_compilerID MATCHES "Intel") - if (WIN32) - # Windows Intel options used - # /nologo do not display compiler version information - # /QH display the include file order - # /EP preprocess to stdout, omitting #line directives - # /TC process all source or unrecognized file types as C source files - # /TP process all source or unrecognized file types as C++ source files - set (_sourceFileTypeC "/TC") - set (_sourceFileTypeCXX "/TP") - if (_flags) - # append to list - list (APPEND _flags /nologo "${_sourceFileType${_language}}" /EP /QH) - else() - # return as a flag string - set (_flags "${_sourceFileType${_language}} /EP /QH") - endif() - else() - # Linux / Mac OS X Intel options used - # -H print the name of each header file used - # -EP preprocess to stdout, omitting #line directives - # -Kc++ process all source or unrecognized file types as C++ source files - if (_flags) - # append to list - if ("${_language}" STREQUAL "CXX") - list (APPEND _flags -Kc++) - endif() - list (APPEND _flags -H -EP) - else() - # return as a flag string - if ("${_language}" STREQUAL "CXX") - set (_flags "-Kc++ ") - endif() - set (_flags "${_flags}-H -EP") - endif() - endif() - else() - message (FATAL_ERROR "cotire: unsupported ${_language} compiler ${_compilerID} version ${_compilerVersion}.") - endif() - set (${_flagsVar} ${_flags} PARENT_SCOPE) -endfunction() - -function (cotire_add_pch_compilation_flags _language _compilerID _compilerVersion _prefixFile _pchFile _hostFile _flagsVar) - set (_flags ${${_flagsVar}}) - if (_compilerID MATCHES "MSVC") - file (TO_NATIVE_PATH "${_prefixFile}" _prefixFileNative) - file (TO_NATIVE_PATH "${_pchFile}" _pchFileNative) - file (TO_NATIVE_PATH "${_hostFile}" _hostFileNative) - # cl.exe options used - # /Yc creates a precompiled header file - # /Fp specifies precompiled header binary file name - # /FI forces inclusion of file - # /TC treat all files named on the command line as C source files - # /TP treat all files named on the command line as C++ source files - # /Zs syntax check only - # /Zm precompiled header memory allocation scaling factor - set (_sourceFileTypeC "/TC") - set (_sourceFileTypeCXX "/TP") - if (_flags) - # append to list - list (APPEND _flags /nologo "${_sourceFileType${_language}}" - "/Yc${_prefixFileNative}" "/Fp${_pchFileNative}" "/FI${_prefixFileNative}" /Zs "${_hostFileNative}") - if (COTIRE_PCH_MEMORY_SCALING_FACTOR) - list (APPEND _flags "/Zm${COTIRE_PCH_MEMORY_SCALING_FACTOR}") - endif() - else() - # return as a flag string - set (_flags "/Yc\"${_prefixFileNative}\" /Fp\"${_pchFileNative}\" /FI\"${_prefixFileNative}\"") - if (COTIRE_PCH_MEMORY_SCALING_FACTOR) - set (_flags "${_flags} /Zm${COTIRE_PCH_MEMORY_SCALING_FACTOR}") - endif() - endif() - elseif (_compilerID MATCHES "GNU") - # GCC options used - # -x specify the source language - # -c compile but do not link - # -o place output in file - # note that we cannot use -w to suppress all warnings upon pre-compiling, because turning off a warning may - # alter compile flags as a side effect (e.g., -Wwrite-string implies -fconst-strings) - set (_xLanguage_C "c-header") - set (_xLanguage_CXX "c++-header") - if (_flags) - # append to list - list (APPEND _flags -x "${_xLanguage_${_language}}" -c "${_prefixFile}" -o "${_pchFile}") - else() - # return as a flag string - set (_flags "-x ${_xLanguage_${_language}} -c \"${_prefixFile}\" -o \"${_pchFile}\"") - endif() - elseif (_compilerID MATCHES "Clang") - if (UNIX) - # Clang options used - # -x specify the source language - # -c compile but do not link - # -o place output in file - # -fno-pch-timestamp disable inclusion of timestamp in precompiled headers (clang 4.0.0+) - set (_xLanguage_C "c-header") - set (_xLanguage_CXX "c++-header") - if (_flags) - # append to list - list (APPEND _flags -x "${_xLanguage_${_language}}" -c "${_prefixFile}" -o "${_pchFile}") - if (NOT "${_compilerVersion}" VERSION_LESS "4.0.0") - list (APPEND _flags -Xclang -fno-pch-timestamp) - endif() - else() - # return as a flag string - set (_flags "-x ${_xLanguage_${_language}} -c \"${_prefixFile}\" -o \"${_pchFile}\"") - if (NOT "${_compilerVersion}" VERSION_LESS "4.0.0") - set (_flags "${_flags} -Xclang -fno-pch-timestamp") - endif() - endif() - elseif (WIN32) - # Clang-cl.exe options used - # /Yc creates a precompiled header file - # /Fp specifies precompiled header binary file name - # /FI forces inclusion of file - # /Zs syntax check only - # /TC treat all files named on the command line as C source files - # /TP treat all files named on the command line as C++ source files - set (_sourceFileTypeC "/TC") - set (_sourceFileTypeCXX "/TP") - if (_flags) - # append to list - list (APPEND _flags "${_sourceFileType${_language}}" - "/Yc${_prefixFile}" "/Fp${_pchFile}" "/FI${_prefixFile}" /Zs "${_hostFile}") - else() - # return as a flag string - set (_flags "/Yc\"${_prefixFile}\" /Fp\"${_pchFile}\" /FI\"${_prefixFile}\"") - endif() - endif() - elseif (_compilerID MATCHES "Intel") - if (WIN32) - file (TO_NATIVE_PATH "${_prefixFile}" _prefixFileNative) - file (TO_NATIVE_PATH "${_pchFile}" _pchFileNative) - file (TO_NATIVE_PATH "${_hostFile}" _hostFileNative) - # Windows Intel options used - # /nologo do not display compiler version information - # /Yc create a precompiled header (PCH) file - # /Fp specify a path or file name for precompiled header files - # /FI tells the preprocessor to include a specified file name as the header file - # /TC process all source or unrecognized file types as C source files - # /TP process all source or unrecognized file types as C++ source files - # /Zs syntax check only - # /Wpch-messages enable diagnostics related to pre-compiled headers (requires Intel XE 2013 Update 2) - set (_sourceFileTypeC "/TC") - set (_sourceFileTypeCXX "/TP") - if (_flags) - # append to list - list (APPEND _flags /nologo "${_sourceFileType${_language}}" - "/Yc" "/Fp${_pchFileNative}" "/FI${_prefixFileNative}" /Zs "${_hostFileNative}") - if (NOT "${_compilerVersion}" VERSION_LESS "13.1.0") - list (APPEND _flags "/Wpch-messages") - endif() - else() - # return as a flag string - set (_flags "/Yc /Fp\"${_pchFileNative}\" /FI\"${_prefixFileNative}\"") - if (NOT "${_compilerVersion}" VERSION_LESS "13.1.0") - set (_flags "${_flags} /Wpch-messages") - endif() - endif() - else() - # Linux / Mac OS X Intel options used - # -pch-dir location for precompiled header files - # -pch-create name of the precompiled header (PCH) to create - # -Kc++ process all source or unrecognized file types as C++ source files - # -fsyntax-only check only for correct syntax - # -Wpch-messages enable diagnostics related to pre-compiled headers (requires Intel XE 2013 Update 2) - get_filename_component(_pchDir "${_pchFile}" DIRECTORY) - get_filename_component(_pchName "${_pchFile}" NAME) - set (_xLanguage_C "c-header") - set (_xLanguage_CXX "c++-header") - set (_pchSuppressMessages FALSE) - if ("${CMAKE_${_language}_FLAGS}" MATCHES ".*-Wno-pch-messages.*") - set(_pchSuppressMessages TRUE) - endif() - if (_flags) - # append to list - if ("${_language}" STREQUAL "CXX") - list (APPEND _flags -Kc++) - endif() - list (APPEND _flags -include "${_prefixFile}" -pch-dir "${_pchDir}" -pch-create "${_pchName}" -fsyntax-only "${_hostFile}") - if (NOT "${_compilerVersion}" VERSION_LESS "13.1.0") - if (NOT _pchSuppressMessages) - list (APPEND _flags -Wpch-messages) - endif() - endif() - else() - # return as a flag string - set (_flags "-include \"${_prefixFile}\" -pch-dir \"${_pchDir}\" -pch-create \"${_pchName}\"") - if (NOT "${_compilerVersion}" VERSION_LESS "13.1.0") - if (NOT _pchSuppressMessages) - set (_flags "${_flags} -Wpch-messages") - endif() - endif() - endif() - endif() - else() - message (FATAL_ERROR "cotire: unsupported ${_language} compiler ${_compilerID} version ${_compilerVersion}.") - endif() - set (${_flagsVar} ${_flags} PARENT_SCOPE) -endfunction() - -function (cotire_add_prefix_pch_inclusion_flags _language _compilerID _compilerVersion _prefixFile _pchFile _flagsVar) - set (_flags ${${_flagsVar}}) - if (_compilerID MATCHES "MSVC") - file (TO_NATIVE_PATH "${_prefixFile}" _prefixFileNative) - # cl.exe options used - # /Yu uses a precompiled header file during build - # /Fp specifies precompiled header binary file name - # /FI forces inclusion of file - # /Zm precompiled header memory allocation scaling factor - if (_pchFile) - file (TO_NATIVE_PATH "${_pchFile}" _pchFileNative) - if (_flags) - # append to list - list (APPEND _flags "/Yu${_prefixFileNative}" "/Fp${_pchFileNative}" "/FI${_prefixFileNative}") - if (COTIRE_PCH_MEMORY_SCALING_FACTOR) - list (APPEND _flags "/Zm${COTIRE_PCH_MEMORY_SCALING_FACTOR}") - endif() - else() - # return as a flag string - set (_flags "/Yu\"${_prefixFileNative}\" /Fp\"${_pchFileNative}\" /FI\"${_prefixFileNative}\"") - if (COTIRE_PCH_MEMORY_SCALING_FACTOR) - set (_flags "${_flags} /Zm${COTIRE_PCH_MEMORY_SCALING_FACTOR}") - endif() - endif() - else() - # no precompiled header, force inclusion of prefix header - if (_flags) - # append to list - list (APPEND _flags "/FI${_prefixFileNative}") - else() - # return as a flag string - set (_flags "/FI\"${_prefixFileNative}\"") - endif() - endif() - elseif (_compilerID MATCHES "GNU") - # GCC options used - # -include process include file as the first line of the primary source file - # -Winvalid-pch warns if precompiled header is found but cannot be used - # note: ccache requires the -include flag to be used in order to process precompiled header correctly - if (_flags) - # append to list - list (APPEND _flags -Winvalid-pch -include "${_prefixFile}") - else() - # return as a flag string - set (_flags "-Winvalid-pch -include \"${_prefixFile}\"") - endif() - elseif (_compilerID MATCHES "Clang") - if (UNIX) - # Clang options used - # -include process include file as the first line of the primary source file - # note: ccache requires the -include flag to be used in order to process precompiled header correctly - if (_flags) - # append to list - list (APPEND _flags -include "${_prefixFile}") - else() - # return as a flag string - set (_flags "-include \"${_prefixFile}\"") - endif() - elseif (WIN32) - # Clang-cl.exe options used - # /Yu uses a precompiled header file during build - # /Fp specifies precompiled header binary file name - # /FI forces inclusion of file - if (_pchFile) - if (_flags) - # append to list - list (APPEND _flags "/Yu${_prefixFile}" "/Fp${_pchFile}" "/FI${_prefixFile}") - else() - # return as a flag string - set (_flags "/Yu\"${_prefixFile}\" /Fp\"${_pchFile}\" /FI\"${_prefixFile}\"") - endif() - else() - # no precompiled header, force inclusion of prefix header - if (_flags) - # append to list - list (APPEND _flags "/FI${_prefixFile}") - else() - # return as a flag string - set (_flags "/FI\"${_prefixFile}\"") - endif() - endif() - endif() - elseif (_compilerID MATCHES "Intel") - if (WIN32) - file (TO_NATIVE_PATH "${_prefixFile}" _prefixFileNative) - # Windows Intel options used - # /Yu use a precompiled header (PCH) file - # /Fp specify a path or file name for precompiled header files - # /FI tells the preprocessor to include a specified file name as the header file - # /Wpch-messages enable diagnostics related to pre-compiled headers (requires Intel XE 2013 Update 2) - if (_pchFile) - file (TO_NATIVE_PATH "${_pchFile}" _pchFileNative) - if (_flags) - # append to list - list (APPEND _flags "/Yu" "/Fp${_pchFileNative}" "/FI${_prefixFileNative}") - if (NOT "${_compilerVersion}" VERSION_LESS "13.1.0") - list (APPEND _flags "/Wpch-messages") - endif() - else() - # return as a flag string - set (_flags "/Yu /Fp\"${_pchFileNative}\" /FI\"${_prefixFileNative}\"") - if (NOT "${_compilerVersion}" VERSION_LESS "13.1.0") - set (_flags "${_flags} /Wpch-messages") - endif() - endif() - else() - # no precompiled header, force inclusion of prefix header - if (_flags) - # append to list - list (APPEND _flags "/FI${_prefixFileNative}") - else() - # return as a flag string - set (_flags "/FI\"${_prefixFileNative}\"") - endif() - endif() - else() - # Linux / Mac OS X Intel options used - # -pch-dir location for precompiled header files - # -pch-use name of the precompiled header (PCH) to use - # -include process include file as the first line of the primary source file - # -Wpch-messages enable diagnostics related to pre-compiled headers (requires Intel XE 2013 Update 2) - if (_pchFile) - get_filename_component(_pchDir "${_pchFile}" DIRECTORY) - get_filename_component(_pchName "${_pchFile}" NAME) - set (_pchSuppressMessages FALSE) - if ("${CMAKE_${_language}_FLAGS}" MATCHES ".*-Wno-pch-messages.*") - set(_pchSuppressMessages TRUE) - endif() - if (_flags) - # append to list - list (APPEND _flags -include "${_prefixFile}" -pch-dir "${_pchDir}" -pch-use "${_pchName}") - if (NOT "${_compilerVersion}" VERSION_LESS "13.1.0") - if (NOT _pchSuppressMessages) - list (APPEND _flags -Wpch-messages) - endif() - endif() - else() - # return as a flag string - set (_flags "-include \"${_prefixFile}\" -pch-dir \"${_pchDir}\" -pch-use \"${_pchName}\"") - if (NOT "${_compilerVersion}" VERSION_LESS "13.1.0") - if (NOT _pchSuppressMessages) - set (_flags "${_flags} -Wpch-messages") - endif() - endif() - endif() - else() - # no precompiled header, force inclusion of prefix header - if (_flags) - # append to list - list (APPEND _flags -include "${_prefixFile}") - else() - # return as a flag string - set (_flags "-include \"${_prefixFile}\"") - endif() - endif() - endif() - else() - message (FATAL_ERROR "cotire: unsupported ${_language} compiler ${_compilerID} version ${_compilerVersion}.") - endif() - set (${_flagsVar} ${_flags} PARENT_SCOPE) -endfunction() - -function (cotire_precompile_prefix_header _prefixFile _pchFile _hostFile) - set(_options "") - set(_oneValueArgs COMPILER_EXECUTABLE COMPILER_ARG1 COMPILER_ID COMPILER_VERSION LANGUAGE) - set(_multiValueArgs COMPILE_DEFINITIONS COMPILE_FLAGS INCLUDE_DIRECTORIES SYSTEM_INCLUDE_DIRECTORIES SYS COMPILER_LAUNCHER) - cmake_parse_arguments(_option "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN}) - if (NOT _option_LANGUAGE) - set (_option_LANGUAGE "CXX") - endif() - if (NOT _option_COMPILER_ID) - set (_option_COMPILER_ID "${CMAKE_${_option_LANGUAGE}_ID}") - endif() - if (NOT _option_COMPILER_VERSION) - set (_option_COMPILER_VERSION "${CMAKE_${_option_LANGUAGE}_COMPILER_VERSION}") - endif() - cotire_init_compile_cmd(_cmd "${_option_LANGUAGE}" "${_option_COMPILER_LAUNCHER}" "${_option_COMPILER_EXECUTABLE}" "${_option_COMPILER_ARG1}") - cotire_add_definitions_to_cmd(_cmd "${_option_LANGUAGE}" ${_option_COMPILE_DEFINITIONS}) - cotire_add_compile_flags_to_cmd(_cmd ${_option_COMPILE_FLAGS}) - cotire_add_includes_to_cmd(_cmd "${_option_LANGUAGE}" _option_INCLUDE_DIRECTORIES _option_SYSTEM_INCLUDE_DIRECTORIES) - cotire_add_frameworks_to_cmd(_cmd "${_option_LANGUAGE}" _option_INCLUDE_DIRECTORIES _option_SYSTEM_INCLUDE_DIRECTORIES) - cotire_add_pch_compilation_flags( - "${_option_LANGUAGE}" "${_option_COMPILER_ID}" "${_option_COMPILER_VERSION}" - "${_prefixFile}" "${_pchFile}" "${_hostFile}" _cmd) - if (COTIRE_VERBOSE) - message (STATUS "execute_process: ${_cmd}") - endif() - if (MSVC_IDE OR _option_COMPILER_ID MATCHES "MSVC") - # cl.exe messes with the output streams unless the environment variable VS_UNICODE_OUTPUT is cleared - unset (ENV{VS_UNICODE_OUTPUT}) - elseif (_option_COMPILER_ID MATCHES "Clang" AND _option_COMPILER_VERSION VERSION_LESS "4.0.0") - if (_option_COMPILER_LAUNCHER MATCHES "ccache" OR - _option_COMPILER_EXECUTABLE MATCHES "ccache") - # Newer versions of Clang embed a compilation timestamp into the precompiled header binary, - # which results in "file has been modified since the precompiled header was built" errors if ccache is used. - # We work around the problem by disabling ccache upon pre-compiling the prefix header. - set (ENV{CCACHE_DISABLE} "true") - endif() - endif() - execute_process( - COMMAND ${_cmd} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE _result) - if (_result) - message (FATAL_ERROR "cotire: error ${_result} precompiling ${_prefixFile}.") - endif() -endfunction() - -function (cotire_check_precompiled_header_support _language _target _msgVar) - set (_unsupportedCompiler - "Precompiled headers not supported for ${_language} compiler ${CMAKE_${_language}_COMPILER_ID}") - if (CMAKE_${_language}_COMPILER_ID MATCHES "MSVC") - # PCH supported since Visual Studio C++ 6.0 - # and CMake does not support an earlier version - set (${_msgVar} "" PARENT_SCOPE) - elseif (CMAKE_${_language}_COMPILER_ID MATCHES "GNU") - # GCC PCH support requires version >= 3.4 - if ("${CMAKE_${_language}_COMPILER_VERSION}" VERSION_LESS "3.4.0") - set (${_msgVar} "${_unsupportedCompiler} version ${CMAKE_${_language}_COMPILER_VERSION}." PARENT_SCOPE) - else() - set (${_msgVar} "" PARENT_SCOPE) - endif() - elseif (CMAKE_${_language}_COMPILER_ID MATCHES "Clang") - if (UNIX) - # all Unix Clang versions have PCH support - set (${_msgVar} "" PARENT_SCOPE) - elseif (WIN32) - # only clang-cl is supported under Windows - get_filename_component(_compilerName "${CMAKE_${_language}_COMPILER}" NAME_WE) - if (NOT _compilerName MATCHES "cl$") - set (${_msgVar} "${_unsupportedCompiler} version ${CMAKE_${_language}_COMPILER_VERSION}. Use clang-cl instead." PARENT_SCOPE) - endif() - endif() - elseif (CMAKE_${_language}_COMPILER_ID MATCHES "Intel") - # Intel PCH support requires version >= 8.0.0 - if ("${CMAKE_${_language}_COMPILER_VERSION}" VERSION_LESS "8.0.0") - set (${_msgVar} "${_unsupportedCompiler} version ${CMAKE_${_language}_COMPILER_VERSION}." PARENT_SCOPE) - else() - set (${_msgVar} "" PARENT_SCOPE) - endif() - else() - set (${_msgVar} "${_unsupportedCompiler}." PARENT_SCOPE) - endif() - # check if ccache is used as a compiler launcher - get_target_property(_launcher ${_target} ${_language}_COMPILER_LAUNCHER) - get_filename_component(_realCompilerExe "${CMAKE_${_language}_COMPILER}" REALPATH) - if (_realCompilerExe MATCHES "ccache" OR _launcher MATCHES "ccache") - # verify that ccache configuration is compatible with precompiled headers - # always check environment variable CCACHE_SLOPPINESS, because earlier versions of ccache - # do not report the "sloppiness" setting correctly upon printing ccache configuration - if (DEFINED ENV{CCACHE_SLOPPINESS}) - if (NOT "$ENV{CCACHE_SLOPPINESS}" MATCHES "pch_defines" OR - NOT "$ENV{CCACHE_SLOPPINESS}" MATCHES "time_macros") - set (${_msgVar} - "ccache requires the environment variable CCACHE_SLOPPINESS to be set to \"pch_defines,time_macros\"." - PARENT_SCOPE) - endif() - else() - if (_realCompilerExe MATCHES "ccache") - set (_ccacheExe "${_realCompilerExe}") - else() - set (_ccacheExe "${_launcher}") - endif() - execute_process( - COMMAND "${_ccacheExe}" "--print-config" - WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" - RESULT_VARIABLE _result - OUTPUT_VARIABLE _ccacheConfig OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET) - if (_result) - set (${_msgVar} "ccache configuration cannot be determined." PARENT_SCOPE) - elseif (NOT _ccacheConfig MATCHES "sloppiness.*=.*time_macros" OR - NOT _ccacheConfig MATCHES "sloppiness.*=.*pch_defines") - set (${_msgVar} - "ccache requires configuration setting \"sloppiness\" to be set to \"pch_defines,time_macros\"." - PARENT_SCOPE) - endif() - endif() - endif() - if (APPLE) - # PCH compilation not supported by GCC / Clang for multi-architecture builds (e.g., i386, x86_64) - cotire_get_configuration_types(_configs) - foreach (_config ${_configs}) - set (_targetFlags "") - cotire_get_target_compile_flags("${_config}" "${_language}" "${_target}" _targetFlags) - cotire_filter_compile_flags("${_language}" "arch" _architectures _ignore ${_targetFlags}) - list (LENGTH _architectures _numberOfArchitectures) - if (_numberOfArchitectures GREATER 1) - string (REPLACE ";" ", " _architectureStr "${_architectures}") - set (${_msgVar} - "Precompiled headers not supported on Darwin for multi-architecture builds (${_architectureStr})." - PARENT_SCOPE) - break() - endif() - endforeach() - endif() -endfunction() - -macro (cotire_get_intermediate_dir _cotireDir) - # ${CMAKE_CFG_INTDIR} may reference a build-time variable when using a generator which supports configuration types - get_filename_component(${_cotireDir} "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${COTIRE_INTDIR}" ABSOLUTE) -endmacro() - -macro (cotire_setup_file_extension_variables) - set (_unityFileExt_C ".c") - set (_unityFileExt_CXX ".cxx") - set (_prefixFileExt_C ".h") - set (_prefixFileExt_CXX ".hxx") - set (_prefixSourceFileExt_C ".c") - set (_prefixSourceFileExt_CXX ".cxx") -endmacro() - -function (cotire_make_single_unity_source_file_path _language _target _unityFileVar) - cotire_setup_file_extension_variables() - if (NOT DEFINED _unityFileExt_${_language}) - set (${_unityFileVar} "" PARENT_SCOPE) - return() - endif() - set (_unityFileBaseName "${_target}_${_language}${COTIRE_UNITY_SOURCE_FILENAME_SUFFIX}") - set (_unityFileName "${_unityFileBaseName}${_unityFileExt_${_language}}") - cotire_get_intermediate_dir(_baseDir) - set (_unityFile "${_baseDir}/${_unityFileName}") - set (${_unityFileVar} "${_unityFile}" PARENT_SCOPE) -endfunction() - -function (cotire_make_unity_source_file_paths _language _target _maxIncludes _unityFilesVar) - cotire_setup_file_extension_variables() - if (NOT DEFINED _unityFileExt_${_language}) - set (${_unityFileVar} "" PARENT_SCOPE) - return() - endif() - set (_unityFileBaseName "${_target}_${_language}${COTIRE_UNITY_SOURCE_FILENAME_SUFFIX}") - cotire_get_intermediate_dir(_baseDir) - set (_startIndex 0) - set (_index 0) - set (_unityFiles "") - set (_sourceFiles ${ARGN}) - foreach (_sourceFile ${_sourceFiles}) - get_source_file_property(_startNew "${_sourceFile}" COTIRE_START_NEW_UNITY_SOURCE) - math (EXPR _unityFileCount "${_index} - ${_startIndex}") - if (_startNew OR (_maxIncludes GREATER 0 AND NOT _unityFileCount LESS _maxIncludes)) - if (_index GREATER 0) - # start new unity file segment - math (EXPR _endIndex "${_index} - 1") - set (_unityFileName "${_unityFileBaseName}_${_startIndex}_${_endIndex}${_unityFileExt_${_language}}") - list (APPEND _unityFiles "${_baseDir}/${_unityFileName}") - endif() - set (_startIndex ${_index}) - endif() - math (EXPR _index "${_index} + 1") - endforeach() - list (LENGTH _sourceFiles _numberOfSources) - if (_startIndex EQUAL 0) - # there is only a single unity file - cotire_make_single_unity_source_file_path(${_language} ${_target} _unityFiles) - elseif (_startIndex LESS _numberOfSources) - # end with final unity file segment - math (EXPR _endIndex "${_index} - 1") - set (_unityFileName "${_unityFileBaseName}_${_startIndex}_${_endIndex}${_unityFileExt_${_language}}") - list (APPEND _unityFiles "${_baseDir}/${_unityFileName}") - endif() - set (${_unityFilesVar} ${_unityFiles} PARENT_SCOPE) - if (COTIRE_DEBUG AND _unityFiles) - message (STATUS "unity files: ${_unityFiles}") - endif() -endfunction() - -function (cotire_unity_to_prefix_file_path _language _target _unityFile _prefixFileVar) - cotire_setup_file_extension_variables() - if (NOT DEFINED _unityFileExt_${_language}) - set (${_prefixFileVar} "" PARENT_SCOPE) - return() - endif() - set (_unityFileBaseName "${_target}_${_language}${COTIRE_UNITY_SOURCE_FILENAME_SUFFIX}") - set (_prefixFileBaseName "${_target}_${_language}${COTIRE_PREFIX_HEADER_FILENAME_SUFFIX}") - string (REPLACE "${_unityFileBaseName}" "${_prefixFileBaseName}" _prefixFile "${_unityFile}") - string (REGEX REPLACE "${_unityFileExt_${_language}}$" "${_prefixFileExt_${_language}}" _prefixFile "${_prefixFile}") - set (${_prefixFileVar} "${_prefixFile}" PARENT_SCOPE) -endfunction() - -function (cotire_prefix_header_to_source_file_path _language _prefixHeaderFile _prefixSourceFileVar) - cotire_setup_file_extension_variables() - if (NOT DEFINED _prefixSourceFileExt_${_language}) - set (${_prefixSourceFileVar} "" PARENT_SCOPE) - return() - endif() - string (REGEX REPLACE "${_prefixFileExt_${_language}}$" "${_prefixSourceFileExt_${_language}}" _prefixSourceFile "${_prefixHeaderFile}") - set (${_prefixSourceFileVar} "${_prefixSourceFile}" PARENT_SCOPE) -endfunction() - -function (cotire_make_prefix_file_name _language _target _prefixFileBaseNameVar _prefixFileNameVar) - cotire_setup_file_extension_variables() - if (NOT _language) - set (_prefixFileBaseName "${_target}${COTIRE_PREFIX_HEADER_FILENAME_SUFFIX}") - set (_prefixFileName "${_prefixFileBaseName}${_prefixFileExt_C}") - elseif (DEFINED _prefixFileExt_${_language}) - set (_prefixFileBaseName "${_target}_${_language}${COTIRE_PREFIX_HEADER_FILENAME_SUFFIX}") - set (_prefixFileName "${_prefixFileBaseName}${_prefixFileExt_${_language}}") - else() - set (_prefixFileBaseName "") - set (_prefixFileName "") - endif() - set (${_prefixFileBaseNameVar} "${_prefixFileBaseName}" PARENT_SCOPE) - set (${_prefixFileNameVar} "${_prefixFileName}" PARENT_SCOPE) -endfunction() - -function (cotire_make_prefix_file_path _language _target _prefixFileVar) - cotire_make_prefix_file_name("${_language}" "${_target}" _prefixFileBaseName _prefixFileName) - set (${_prefixFileVar} "" PARENT_SCOPE) - if (_prefixFileName) - if (NOT _language) - set (_language "C") - endif() - if (CMAKE_${_language}_COMPILER_ID MATCHES "GNU|Clang|Intel|MSVC") - cotire_get_intermediate_dir(_baseDir) - set (${_prefixFileVar} "${_baseDir}/${_prefixFileName}" PARENT_SCOPE) - endif() - endif() -endfunction() - -function (cotire_make_pch_file_path _language _target _pchFileVar) - cotire_make_prefix_file_name("${_language}" "${_target}" _prefixFileBaseName _prefixFileName) - set (${_pchFileVar} "" PARENT_SCOPE) - if (_prefixFileBaseName AND _prefixFileName) - cotire_check_precompiled_header_support("${_language}" "${_target}" _msg) - if (NOT _msg) - if (XCODE) - # For Xcode, we completely hand off the compilation of the prefix header to the IDE - return() - endif() - cotire_get_intermediate_dir(_baseDir) - if (CMAKE_${_language}_COMPILER_ID MATCHES "MSVC") - # MSVC uses the extension .pch added to the prefix header base name - set (${_pchFileVar} "${_baseDir}/${_prefixFileBaseName}.pch" PARENT_SCOPE) - elseif (CMAKE_${_language}_COMPILER_ID MATCHES "Clang") - # Clang looks for a precompiled header corresponding to the prefix header with the extension .pch appended - set (${_pchFileVar} "${_baseDir}/${_prefixFileName}.pch" PARENT_SCOPE) - elseif (CMAKE_${_language}_COMPILER_ID MATCHES "GNU") - # GCC looks for a precompiled header corresponding to the prefix header with the extension .gch appended - set (${_pchFileVar} "${_baseDir}/${_prefixFileName}.gch" PARENT_SCOPE) - elseif (CMAKE_${_language}_COMPILER_ID MATCHES "Intel") - # Intel uses the extension .pchi added to the prefix header base name - set (${_pchFileVar} "${_baseDir}/${_prefixFileBaseName}.pchi" PARENT_SCOPE) - endif() - endif() - endif() -endfunction() - -function (cotire_select_unity_source_files _unityFile _sourcesVar) - set (_sourceFiles ${ARGN}) - if (_sourceFiles AND "${_unityFile}" MATCHES "${COTIRE_UNITY_SOURCE_FILENAME_SUFFIX}_([0-9]+)_([0-9]+)") - set (_startIndex ${CMAKE_MATCH_1}) - set (_endIndex ${CMAKE_MATCH_2}) - list (LENGTH _sourceFiles _numberOfSources) - if (NOT _startIndex LESS _numberOfSources) - math (EXPR _startIndex "${_numberOfSources} - 1") - endif() - if (NOT _endIndex LESS _numberOfSources) - math (EXPR _endIndex "${_numberOfSources} - 1") - endif() - set (_files "") - foreach (_index RANGE ${_startIndex} ${_endIndex}) - list (GET _sourceFiles ${_index} _file) - list (APPEND _files "${_file}") - endforeach() - else() - set (_files ${_sourceFiles}) - endif() - set (${_sourcesVar} ${_files} PARENT_SCOPE) -endfunction() - -function (cotire_get_unity_source_dependencies _language _target _dependencySourcesVar) - set (_dependencySources "") - # depend on target's generated source files - get_target_property(_targetSourceFiles ${_target} SOURCES) - cotire_get_objects_with_property_on(_generatedSources GENERATED SOURCE ${_targetSourceFiles}) - if (_generatedSources) - # but omit all generated source files that have the COTIRE_EXCLUDED property set to true - cotire_get_objects_with_property_on(_excludedGeneratedSources COTIRE_EXCLUDED SOURCE ${_generatedSources}) - if (_excludedGeneratedSources) - list (REMOVE_ITEM _generatedSources ${_excludedGeneratedSources}) - endif() - # and omit all generated source files that have the COTIRE_DEPENDENCY property set to false explicitly - cotire_get_objects_with_property_off(_excludedNonDependencySources COTIRE_DEPENDENCY SOURCE ${_generatedSources}) - if (_excludedNonDependencySources) - list (REMOVE_ITEM _generatedSources ${_excludedNonDependencySources}) - endif() - if (_generatedSources) - list (APPEND _dependencySources ${_generatedSources}) - endif() - endif() - if (COTIRE_DEBUG AND _dependencySources) - message (STATUS "${_language} ${_target} unity source dependencies: ${_dependencySources}") - endif() - set (${_dependencySourcesVar} ${_dependencySources} PARENT_SCOPE) -endfunction() - -function (cotire_get_prefix_header_dependencies _language _target _dependencySourcesVar) - set (_dependencySources "") - # depend on target source files marked with custom COTIRE_DEPENDENCY property - get_target_property(_targetSourceFiles ${_target} SOURCES) - cotire_get_objects_with_property_on(_dependencySources COTIRE_DEPENDENCY SOURCE ${_targetSourceFiles}) - if (COTIRE_DEBUG AND _dependencySources) - message (STATUS "${_language} ${_target} prefix header dependencies: ${_dependencySources}") - endif() - set (${_dependencySourcesVar} ${_dependencySources} PARENT_SCOPE) -endfunction() - -function (cotire_generate_target_script _language _configurations _target _targetScriptVar _targetConfigScriptVar) - set (_targetSources ${ARGN}) - cotire_get_prefix_header_dependencies(${_language} ${_target} COTIRE_TARGET_PREFIX_DEPENDS ${_targetSources}) - cotire_get_unity_source_dependencies(${_language} ${_target} COTIRE_TARGET_UNITY_DEPENDS ${_targetSources}) - # set up variables to be configured - set (COTIRE_TARGET_LANGUAGE "${_language}") - get_target_property(COTIRE_TARGET_IGNORE_PATH ${_target} COTIRE_PREFIX_HEADER_IGNORE_PATH) - cotire_add_sys_root_paths(COTIRE_TARGET_IGNORE_PATH) - get_target_property(COTIRE_TARGET_INCLUDE_PATH ${_target} COTIRE_PREFIX_HEADER_INCLUDE_PATH) - cotire_add_sys_root_paths(COTIRE_TARGET_INCLUDE_PATH) - get_target_property(COTIRE_TARGET_PRE_UNDEFS ${_target} COTIRE_UNITY_SOURCE_PRE_UNDEFS) - get_target_property(COTIRE_TARGET_POST_UNDEFS ${_target} COTIRE_UNITY_SOURCE_POST_UNDEFS) - get_target_property(COTIRE_TARGET_MAXIMUM_NUMBER_OF_INCLUDES ${_target} COTIRE_UNITY_SOURCE_MAXIMUM_NUMBER_OF_INCLUDES) - get_target_property(COTIRE_TARGET_INCLUDE_PRIORITY_PATH ${_target} COTIRE_PREFIX_HEADER_INCLUDE_PRIORITY_PATH) - cotire_get_source_files_undefs(COTIRE_UNITY_SOURCE_PRE_UNDEFS COTIRE_TARGET_SOURCES_PRE_UNDEFS ${_targetSources}) - cotire_get_source_files_undefs(COTIRE_UNITY_SOURCE_POST_UNDEFS COTIRE_TARGET_SOURCES_POST_UNDEFS ${_targetSources}) - set (COTIRE_TARGET_CONFIGURATION_TYPES "${_configurations}") - foreach (_config ${_configurations}) - string (TOUPPER "${_config}" _upperConfig) - cotire_get_target_include_directories( - "${_config}" "${_language}" "${_target}" COTIRE_TARGET_INCLUDE_DIRECTORIES_${_upperConfig} COTIRE_TARGET_SYSTEM_INCLUDE_DIRECTORIES_${_upperConfig}) - cotire_get_target_compile_definitions( - "${_config}" "${_language}" "${_target}" COTIRE_TARGET_COMPILE_DEFINITIONS_${_upperConfig}) - cotire_get_target_compiler_flags( - "${_config}" "${_language}" "${_target}" COTIRE_TARGET_COMPILE_FLAGS_${_upperConfig}) - cotire_get_source_files_compile_definitions( - "${_config}" "${_language}" COTIRE_TARGET_SOURCES_COMPILE_DEFINITIONS_${_upperConfig} ${_targetSources}) - endforeach() - get_target_property(COTIRE_TARGET_${_language}_COMPILER_LAUNCHER ${_target} ${_language}_COMPILER_LAUNCHER) - # set up COTIRE_TARGET_SOURCES - set (COTIRE_TARGET_SOURCES "") - foreach (_sourceFile ${_targetSources}) - get_source_file_property(_generated "${_sourceFile}" GENERATED) - if (_generated) - # use absolute paths for generated files only, retrieving the LOCATION property is an expensive operation - get_source_file_property(_sourceLocation "${_sourceFile}" LOCATION) - list (APPEND COTIRE_TARGET_SOURCES "${_sourceLocation}") - else() - list (APPEND COTIRE_TARGET_SOURCES "${_sourceFile}") - endif() - endforeach() - # copy variable definitions to cotire target script - get_cmake_property(_vars VARIABLES) - string (REGEX MATCHALL "COTIRE_[A-Za-z0-9_]+" _matchVars "${_vars}") - # omit COTIRE_*_INIT variables - string (REGEX MATCHALL "COTIRE_[A-Za-z0-9_]+_INIT" _initVars "${_matchVars}") - if (_initVars) - list (REMOVE_ITEM _matchVars ${_initVars}) - endif() - # omit COTIRE_VERBOSE which is passed as a CMake define on command line - list (REMOVE_ITEM _matchVars COTIRE_VERBOSE) - set (_contents "") - set (_contentsHasGeneratorExpressions FALSE) - foreach (_var IN LISTS _matchVars ITEMS - XCODE MSVC CMAKE_GENERATOR CMAKE_BUILD_TYPE CMAKE_CONFIGURATION_TYPES - CMAKE_${_language}_COMPILER_ID CMAKE_${_language}_COMPILER_VERSION - CMAKE_${_language}_COMPILER_LAUNCHER CMAKE_${_language}_COMPILER CMAKE_${_language}_COMPILER_ARG1 - CMAKE_INCLUDE_FLAG_${_language} CMAKE_INCLUDE_FLAG_SEP_${_language} - CMAKE_INCLUDE_SYSTEM_FLAG_${_language} - CMAKE_${_language}_FRAMEWORK_SEARCH_FLAG - CMAKE_${_language}_SYSTEM_FRAMEWORK_SEARCH_FLAG - CMAKE_${_language}_SOURCE_FILE_EXTENSIONS) - if (DEFINED ${_var}) - string (REPLACE "\"" "\\\"" _value "${${_var}}") - set (_contents "${_contents}set (${_var} \"${_value}\")\n") - if (NOT _contentsHasGeneratorExpressions) - if ("${_value}" MATCHES "\\$<.*>") - set (_contentsHasGeneratorExpressions TRUE) - endif() - endif() - endif() - endforeach() - # generate target script file - get_filename_component(_moduleName "${COTIRE_CMAKE_MODULE_FILE}" NAME) - set (_targetCotireScript "${CMAKE_CURRENT_BINARY_DIR}/${_target}_${_language}_${_moduleName}") - cotire_write_file("CMAKE" "${_targetCotireScript}" "${_contents}" FALSE) - if (_contentsHasGeneratorExpressions) - # use file(GENERATE ...) to expand generator expressions in the target script at CMake generate-time - set (_configNameOrNoneGeneratorExpression "$<$:None>$<$>:$>") - set (_targetCotireConfigScript "${CMAKE_CURRENT_BINARY_DIR}/${_target}_${_language}_${_configNameOrNoneGeneratorExpression}_${_moduleName}") - file (GENERATE OUTPUT "${_targetCotireConfigScript}" INPUT "${_targetCotireScript}") - else() - set (_targetCotireConfigScript "${_targetCotireScript}") - endif() - set (${_targetScriptVar} "${_targetCotireScript}" PARENT_SCOPE) - set (${_targetConfigScriptVar} "${_targetCotireConfigScript}" PARENT_SCOPE) -endfunction() - -function (cotire_setup_pch_file_compilation _language _target _targetScript _prefixFile _pchFile _hostFile) - set (_sourceFiles ${ARGN}) - if (CMAKE_${_language}_COMPILER_ID MATCHES "MSVC|Intel" OR - (WIN32 AND CMAKE_${_language}_COMPILER_ID MATCHES "Clang")) - # for MSVC, Intel and Clang-cl, we attach the precompiled header compilation to the host file - # the remaining files include the precompiled header, see cotire_setup_pch_file_inclusion - if (_sourceFiles) - set (_flags "") - cotire_add_pch_compilation_flags( - "${_language}" "${CMAKE_${_language}_COMPILER_ID}" "${CMAKE_${_language}_COMPILER_VERSION}" - "${_prefixFile}" "${_pchFile}" "${_hostFile}" _flags) - set_property (SOURCE ${_hostFile} APPEND_STRING PROPERTY COMPILE_FLAGS " ${_flags} ") - set_property (SOURCE ${_hostFile} APPEND PROPERTY OBJECT_OUTPUTS "${_pchFile}") - # make object file generated from host file depend on prefix header - set_property (SOURCE ${_hostFile} APPEND PROPERTY OBJECT_DEPENDS "${_prefixFile}") - # mark host file as cotired to prevent it from being used in another cotired target - set_property (SOURCE ${_hostFile} PROPERTY COTIRE_TARGET "${_target}") - endif() - elseif ("${CMAKE_GENERATOR}" MATCHES "Make|Ninja") - # for makefile based generator, we add a custom command to precompile the prefix header - if (_targetScript) - cotire_set_cmd_to_prologue(_cmds) - list (APPEND _cmds -P "${COTIRE_CMAKE_MODULE_FILE}" "precompile" "${_targetScript}" "${_prefixFile}" "${_pchFile}" "${_hostFile}") - if (MSVC_IDE) - file (TO_NATIVE_PATH "${_pchFile}" _pchFileLogPath) - else() - file (RELATIVE_PATH _pchFileLogPath "${CMAKE_BINARY_DIR}" "${_pchFile}") - endif() - # make precompiled header compilation depend on the actual compiler executable used to force - # re-compilation when the compiler executable is updated. This prevents "created by a different GCC executable" - # warnings when the precompiled header is included. - get_filename_component(_realCompilerExe "${CMAKE_${_language}_COMPILER}" ABSOLUTE) - if (COTIRE_DEBUG) - message (STATUS "add_custom_command: OUTPUT ${_pchFile} ${_cmds} DEPENDS ${_prefixFile} ${_realCompilerExe} IMPLICIT_DEPENDS ${_language} ${_prefixFile}") - endif() - set_property (SOURCE "${_pchFile}" PROPERTY GENERATED TRUE) - add_custom_command( - OUTPUT "${_pchFile}" - COMMAND ${_cmds} - DEPENDS "${_prefixFile}" "${_realCompilerExe}" - IMPLICIT_DEPENDS ${_language} "${_prefixFile}" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Building ${_language} precompiled header ${_pchFileLogPath}" - VERBATIM) - endif() - endif() -endfunction() - -function (cotire_setup_pch_file_inclusion _language _target _wholeTarget _prefixFile _pchFile _hostFile) - if (CMAKE_${_language}_COMPILER_ID MATCHES "MSVC|Intel" OR - (WIN32 AND CMAKE_${_language}_COMPILER_ID MATCHES "Clang")) - # for MSVC, Intel and clang-cl, we include the precompiled header in all but the host file - # the host file does the precompiled header compilation, see cotire_setup_pch_file_compilation - set (_sourceFiles ${ARGN}) - list (LENGTH _sourceFiles _numberOfSourceFiles) - if (_numberOfSourceFiles GREATER 0) - # mark sources as cotired to prevent them from being used in another cotired target - set_source_files_properties(${_sourceFiles} PROPERTIES COTIRE_TARGET "${_target}") - set (_flags "") - cotire_add_prefix_pch_inclusion_flags( - "${_language}" "${CMAKE_${_language}_COMPILER_ID}" "${CMAKE_${_language}_COMPILER_VERSION}" - "${_prefixFile}" "${_pchFile}" _flags) - set_property (SOURCE ${_sourceFiles} APPEND_STRING PROPERTY COMPILE_FLAGS " ${_flags} ") - # make object files generated from source files depend on precompiled header - set_property (SOURCE ${_sourceFiles} APPEND PROPERTY OBJECT_DEPENDS "${_pchFile}") - endif() - elseif ("${CMAKE_GENERATOR}" MATCHES "Make|Ninja") - set (_sourceFiles ${_hostFile} ${ARGN}) - if (NOT _wholeTarget) - # for makefile based generator, we force the inclusion of the prefix header for a subset - # of the source files, if this is a multi-language target or has excluded files - set (_flags "") - cotire_add_prefix_pch_inclusion_flags( - "${_language}" "${CMAKE_${_language}_COMPILER_ID}" "${CMAKE_${_language}_COMPILER_VERSION}" - "${_prefixFile}" "${_pchFile}" _flags) - set_property (SOURCE ${_sourceFiles} APPEND_STRING PROPERTY COMPILE_FLAGS " ${_flags} ") - # mark sources as cotired to prevent them from being used in another cotired target - set_source_files_properties(${_sourceFiles} PROPERTIES COTIRE_TARGET "${_target}") - endif() - # make object files generated from source files depend on precompiled header - set_property (SOURCE ${_sourceFiles} APPEND PROPERTY OBJECT_DEPENDS "${_pchFile}") - endif() -endfunction() - -function (cotire_setup_prefix_file_inclusion _language _target _prefixFile) - set (_sourceFiles ${ARGN}) - # force the inclusion of the prefix header for the given source files - set (_flags "") - set (_pchFile "") - cotire_add_prefix_pch_inclusion_flags( - "${_language}" "${CMAKE_${_language}_COMPILER_ID}" "${CMAKE_${_language}_COMPILER_VERSION}" - "${_prefixFile}" "${_pchFile}" _flags) - set_property (SOURCE ${_sourceFiles} APPEND_STRING PROPERTY COMPILE_FLAGS " ${_flags} ") - # mark sources as cotired to prevent them from being used in another cotired target - set_source_files_properties(${_sourceFiles} PROPERTIES COTIRE_TARGET "${_target}") - # make object files generated from source files depend on prefix header - set_property (SOURCE ${_sourceFiles} APPEND PROPERTY OBJECT_DEPENDS "${_prefixFile}") -endfunction() - -function (cotire_get_first_set_property_value _propertyValueVar _type _object) - set (_properties ${ARGN}) - foreach (_property ${_properties}) - get_property(_propertyValue ${_type} "${_object}" PROPERTY ${_property}) - if (_propertyValue) - set (${_propertyValueVar} ${_propertyValue} PARENT_SCOPE) - return() - endif() - endforeach() - set (${_propertyValueVar} "" PARENT_SCOPE) -endfunction() - -function (cotire_setup_combine_command _language _targetScript _joinedFile _cmdsVar) - set (_files ${ARGN}) - set (_filesPaths "") - foreach (_file ${_files}) - get_filename_component(_filePath "${_file}" ABSOLUTE) - list (APPEND _filesPaths "${_filePath}") - endforeach() - cotire_set_cmd_to_prologue(_prefixCmd) - list (APPEND _prefixCmd -P "${COTIRE_CMAKE_MODULE_FILE}" "combine") - if (_targetScript) - list (APPEND _prefixCmd "${_targetScript}") - endif() - list (APPEND _prefixCmd "${_joinedFile}" ${_filesPaths}) - if (COTIRE_DEBUG) - message (STATUS "add_custom_command: OUTPUT ${_joinedFile} COMMAND ${_prefixCmd} DEPENDS ${_files}") - endif() - set_property (SOURCE "${_joinedFile}" PROPERTY GENERATED TRUE) - if (MSVC_IDE) - file (TO_NATIVE_PATH "${_joinedFile}" _joinedFileLogPath) - else() - file (RELATIVE_PATH _joinedFileLogPath "${CMAKE_BINARY_DIR}" "${_joinedFile}") - endif() - get_filename_component(_joinedFileBaseName "${_joinedFile}" NAME_WE) - get_filename_component(_joinedFileExt "${_joinedFile}" EXT) - if (_language AND _joinedFileBaseName MATCHES "${COTIRE_UNITY_SOURCE_FILENAME_SUFFIX}$") - set (_comment "Generating ${_language} unity source ${_joinedFileLogPath}") - elseif (_language AND _joinedFileBaseName MATCHES "${COTIRE_PREFIX_HEADER_FILENAME_SUFFIX}$") - if (_joinedFileExt MATCHES "^\\.c") - set (_comment "Generating ${_language} prefix source ${_joinedFileLogPath}") - else() - set (_comment "Generating ${_language} prefix header ${_joinedFileLogPath}") - endif() - else() - set (_comment "Generating ${_joinedFileLogPath}") - endif() - add_custom_command( - OUTPUT "${_joinedFile}" - COMMAND ${_prefixCmd} - DEPENDS ${_files} - COMMENT "${_comment}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - VERBATIM) - list (APPEND ${_cmdsVar} COMMAND ${_prefixCmd}) - set (${_cmdsVar} ${${_cmdsVar}} PARENT_SCOPE) -endfunction() - -function (cotire_setup_target_pch_usage _languages _target _wholeTarget) - if (XCODE) - # for Xcode, we attach a pre-build action to generate the unity sources and prefix headers - set (_prefixFiles "") - foreach (_language ${_languages}) - get_property(_prefixFile TARGET ${_target} PROPERTY COTIRE_${_language}_PREFIX_HEADER) - if (_prefixFile) - list (APPEND _prefixFiles "${_prefixFile}") - endif() - endforeach() - set (_cmds ${ARGN}) - list (LENGTH _prefixFiles _numberOfPrefixFiles) - if (_numberOfPrefixFiles GREATER 1) - # we also generate a generic, single prefix header which includes all language specific prefix headers - set (_language "") - set (_targetScript "") - cotire_make_prefix_file_path("${_language}" ${_target} _prefixHeader) - cotire_setup_combine_command("${_language}" "${_targetScript}" "${_prefixHeader}" _cmds ${_prefixFiles}) - else() - set (_prefixHeader "${_prefixFiles}") - endif() - if (COTIRE_DEBUG) - message (STATUS "add_custom_command: TARGET ${_target} PRE_BUILD ${_cmds}") - endif() - # because CMake PRE_BUILD command does not support dependencies, - # we check dependencies explicity in cotire script mode when the pre-build action is run - add_custom_command( - TARGET "${_target}" - PRE_BUILD ${_cmds} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Updating target ${_target} prefix headers" - VERBATIM) - # make Xcode precompile the generated prefix header with ProcessPCH and ProcessPCH++ - set_target_properties(${_target} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES") - set_target_properties(${_target} PROPERTIES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${_prefixHeader}") - elseif ("${CMAKE_GENERATOR}" MATCHES "Make|Ninja") - # for makefile based generator, we force inclusion of the prefix header for all target source files - # if this is a single-language target without any excluded files - if (_wholeTarget) - set (_language "${_languages}") - # for MSVC, Intel and clang-cl, precompiled header inclusion is always done on the source file level - # see cotire_setup_pch_file_inclusion - if (NOT CMAKE_${_language}_COMPILER_ID MATCHES "MSVC|Intel" AND NOT - (WIN32 AND CMAKE_${_language}_COMPILER_ID MATCHES "Clang")) - get_property(_prefixFile TARGET ${_target} PROPERTY COTIRE_${_language}_PREFIX_HEADER) - if (_prefixFile) - get_property(_pchFile TARGET ${_target} PROPERTY COTIRE_${_language}_PRECOMPILED_HEADER) - set (_options COMPILE_OPTIONS) - cotire_add_prefix_pch_inclusion_flags( - "${_language}" "${CMAKE_${_language}_COMPILER_ID}" "${CMAKE_${_language}_COMPILER_VERSION}" - "${_prefixFile}" "${_pchFile}" _options) - set_property(TARGET ${_target} APPEND PROPERTY ${_options}) - endif() - endif() - endif() - endif() -endfunction() - -function (cotire_setup_unity_generation_commands _language _target _targetScript _targetConfigScript _unityFiles _cmdsVar) - set (_dependencySources "") - cotire_get_unity_source_dependencies(${_language} ${_target} _dependencySources ${ARGN}) - foreach (_unityFile ${_unityFiles}) - set_property (SOURCE "${_unityFile}" PROPERTY GENERATED TRUE) - # set up compiled unity source dependencies via OBJECT_DEPENDS - # this ensures that missing source files are generated before the unity file is compiled - if (COTIRE_DEBUG AND _dependencySources) - message (STATUS "${_unityFile} OBJECT_DEPENDS ${_dependencySources}") - endif() - if (_dependencySources) - # the OBJECT_DEPENDS property requires a list of full paths - set (_objectDependsPaths "") - foreach (_sourceFile ${_dependencySources}) - get_source_file_property(_sourceLocation "${_sourceFile}" LOCATION) - list (APPEND _objectDependsPaths "${_sourceLocation}") - endforeach() - set_property (SOURCE "${_unityFile}" PROPERTY OBJECT_DEPENDS ${_objectDependsPaths}) - endif() - if (WIN32 AND CMAKE_${_language}_COMPILER_ID MATCHES "MSVC|Intel") - # unity file compilation results in potentially huge object file, - # thus use /bigobj by default unter cl.exe and Windows Intel - set_property (SOURCE "${_unityFile}" APPEND_STRING PROPERTY COMPILE_FLAGS "/bigobj") - endif() - cotire_set_cmd_to_prologue(_unityCmd) - list (APPEND _unityCmd -P "${COTIRE_CMAKE_MODULE_FILE}" "unity" "${_targetConfigScript}" "${_unityFile}") - if (CMAKE_VERSION VERSION_LESS "3.1.0") - set (_unityCmdDepends "${_targetScript}") - else() - # CMake 3.1.0 supports generator expressions in arguments to DEPENDS - set (_unityCmdDepends "${_targetConfigScript}") - endif() - if (MSVC_IDE) - file (TO_NATIVE_PATH "${_unityFile}" _unityFileLogPath) - else() - file (RELATIVE_PATH _unityFileLogPath "${CMAKE_BINARY_DIR}" "${_unityFile}") - endif() - if (COTIRE_DEBUG) - message (STATUS "add_custom_command: OUTPUT ${_unityFile} COMMAND ${_unityCmd} DEPENDS ${_unityCmdDepends}") - endif() - add_custom_command( - OUTPUT "${_unityFile}" - COMMAND ${_unityCmd} - DEPENDS ${_unityCmdDepends} - COMMENT "Generating ${_language} unity source ${_unityFileLogPath}" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - VERBATIM) - list (APPEND ${_cmdsVar} COMMAND ${_unityCmd}) - endforeach() - set (${_cmdsVar} ${${_cmdsVar}} PARENT_SCOPE) -endfunction() - -function (cotire_setup_prefix_generation_command _language _target _targetScript _prefixFile _unityFiles _cmdsVar) - set (_sourceFiles ${ARGN}) - set (_dependencySources "") - cotire_get_prefix_header_dependencies(${_language} ${_target} _dependencySources ${_sourceFiles}) - cotire_set_cmd_to_prologue(_prefixCmd) - list (APPEND _prefixCmd -P "${COTIRE_CMAKE_MODULE_FILE}" "prefix" "${_targetScript}" "${_prefixFile}" ${_unityFiles}) - set_property (SOURCE "${_prefixFile}" PROPERTY GENERATED TRUE) - # make prefix header generation depend on the actual compiler executable used to force - # re-generation when the compiler executable is updated. This prevents "file not found" - # errors for compiler version specific system header files. - get_filename_component(_realCompilerExe "${CMAKE_${_language}_COMPILER}" ABSOLUTE) - if (COTIRE_DEBUG) - message (STATUS "add_custom_command: OUTPUT ${_prefixFile} COMMAND ${_prefixCmd} DEPENDS ${_unityFile} ${_dependencySources} ${_realCompilerExe}") - endif() - if (MSVC_IDE) - file (TO_NATIVE_PATH "${_prefixFile}" _prefixFileLogPath) - else() - file (RELATIVE_PATH _prefixFileLogPath "${CMAKE_BINARY_DIR}" "${_prefixFile}") - endif() - get_filename_component(_prefixFileExt "${_prefixFile}" EXT) - if (_prefixFileExt MATCHES "^\\.c") - set (_comment "Generating ${_language} prefix source ${_prefixFileLogPath}") - else() - set (_comment "Generating ${_language} prefix header ${_prefixFileLogPath}") - endif() - # prevent pre-processing errors upon generating the prefix header when a target's generated include file does not yet exist - # we do not add a file-level dependency for the target's generated files though, because we only want to depend on their existence - # thus we make the prefix header generation depend on a custom helper target which triggers the generation of the files - set (_preTargetName "${_target}${COTIRE_PCH_TARGET_SUFFIX}_pre") - if (TARGET ${_preTargetName}) - # custom helper target has already been generated while processing a different language - list (APPEND _dependencySources ${_preTargetName}) - else() - get_target_property(_targetSourceFiles ${_target} SOURCES) - cotire_get_objects_with_property_on(_generatedSources GENERATED SOURCE ${_targetSourceFiles}) - if (_generatedSources) - add_custom_target("${_preTargetName}" DEPENDS ${_generatedSources}) - cotire_init_target("${_preTargetName}") - list (APPEND _dependencySources ${_preTargetName}) - endif() - endif() - add_custom_command( - OUTPUT "${_prefixFile}" "${_prefixFile}.log" - COMMAND ${_prefixCmd} - DEPENDS ${_unityFiles} ${_dependencySources} "${_realCompilerExe}" - COMMENT "${_comment}" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - VERBATIM) - list (APPEND ${_cmdsVar} COMMAND ${_prefixCmd}) - set (${_cmdsVar} ${${_cmdsVar}} PARENT_SCOPE) -endfunction() - -function (cotire_setup_prefix_generation_from_unity_command _language _target _targetScript _prefixFile _unityFiles _cmdsVar) - set (_sourceFiles ${ARGN}) - if (CMAKE_${_language}_COMPILER_ID MATCHES "GNU|Clang") - # GNU and Clang require indirect compilation of the prefix header to make them honor the system_header pragma - cotire_prefix_header_to_source_file_path(${_language} "${_prefixFile}" _prefixSourceFile) - else() - set (_prefixSourceFile "${_prefixFile}") - endif() - cotire_setup_prefix_generation_command( - ${_language} ${_target} "${_targetScript}" - "${_prefixSourceFile}" "${_unityFiles}" ${_cmdsVar} ${_sourceFiles}) - if (CMAKE_${_language}_COMPILER_ID MATCHES "GNU|Clang") - # set up generation of a prefix source file which includes the prefix header - cotire_setup_combine_command(${_language} "${_targetScript}" "${_prefixFile}" _cmds ${_prefixSourceFile}) - endif() - set (${_cmdsVar} ${${_cmdsVar}} PARENT_SCOPE) -endfunction() - -function (cotire_setup_prefix_generation_from_provided_command _language _target _targetScript _prefixFile _cmdsVar) - set (_prefixHeaderFiles ${ARGN}) - if (CMAKE_${_language}_COMPILER_ID MATCHES "GNU|Clang") - # GNU and Clang require indirect compilation of the prefix header to make them honor the system_header pragma - cotire_prefix_header_to_source_file_path(${_language} "${_prefixFile}" _prefixSourceFile) - else() - set (_prefixSourceFile "${_prefixFile}") - endif() - cotire_setup_combine_command(${_language} "${_targetScript}" "${_prefixSourceFile}" _cmds ${_prefixHeaderFiles}) - if (CMAKE_${_language}_COMPILER_ID MATCHES "GNU|Clang") - # set up generation of a prefix source file which includes the prefix header - cotire_setup_combine_command(${_language} "${_targetScript}" "${_prefixFile}" _cmds ${_prefixSourceFile}) - endif() - set (${_cmdsVar} ${${_cmdsVar}} PARENT_SCOPE) -endfunction() - -function (cotire_init_cotire_target_properties _target) - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_ENABLE_PRECOMPILED_HEADER SET) - if (NOT _isSet) - set_property(TARGET ${_target} PROPERTY COTIRE_ENABLE_PRECOMPILED_HEADER TRUE) - endif() - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_ADD_UNITY_BUILD SET) - if (NOT _isSet) - set_property(TARGET ${_target} PROPERTY COTIRE_ADD_UNITY_BUILD TRUE) - endif() - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_ADD_CLEAN SET) - if (NOT _isSet) - set_property(TARGET ${_target} PROPERTY COTIRE_ADD_CLEAN FALSE) - endif() - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_PREFIX_HEADER_IGNORE_PATH SET) - if (NOT _isSet) - set_property(TARGET ${_target} PROPERTY COTIRE_PREFIX_HEADER_IGNORE_PATH "${CMAKE_SOURCE_DIR}") - cotire_check_is_path_relative_to("${CMAKE_BINARY_DIR}" _isRelative "${CMAKE_SOURCE_DIR}") - if (NOT _isRelative) - set_property(TARGET ${_target} APPEND PROPERTY COTIRE_PREFIX_HEADER_IGNORE_PATH "${CMAKE_BINARY_DIR}") - endif() - endif() - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_PREFIX_HEADER_INCLUDE_PATH SET) - if (NOT _isSet) - set_property(TARGET ${_target} PROPERTY COTIRE_PREFIX_HEADER_INCLUDE_PATH "") - endif() - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_PREFIX_HEADER_INCLUDE_PRIORITY_PATH SET) - if (NOT _isSet) - set_property(TARGET ${_target} PROPERTY COTIRE_PREFIX_HEADER_INCLUDE_PRIORITY_PATH "") - endif() - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_UNITY_SOURCE_PRE_UNDEFS SET) - if (NOT _isSet) - set_property(TARGET ${_target} PROPERTY COTIRE_UNITY_SOURCE_PRE_UNDEFS "") - endif() - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_UNITY_SOURCE_POST_UNDEFS SET) - if (NOT _isSet) - set_property(TARGET ${_target} PROPERTY COTIRE_UNITY_SOURCE_POST_UNDEFS "") - endif() - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_UNITY_LINK_LIBRARIES_INIT SET) - if (NOT _isSet) - set_property(TARGET ${_target} PROPERTY COTIRE_UNITY_LINK_LIBRARIES_INIT "COPY_UNITY") - endif() - get_property(_isSet TARGET ${_target} PROPERTY COTIRE_UNITY_SOURCE_MAXIMUM_NUMBER_OF_INCLUDES SET) - if (NOT _isSet) - if (COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES) - set_property(TARGET ${_target} PROPERTY COTIRE_UNITY_SOURCE_MAXIMUM_NUMBER_OF_INCLUDES "${COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES}") - else() - set_property(TARGET ${_target} PROPERTY COTIRE_UNITY_SOURCE_MAXIMUM_NUMBER_OF_INCLUDES "") - endif() - endif() -endfunction() - -function (cotire_make_target_message _target _languages _disableMsg _targetMsgVar) - get_target_property(_targetUsePCH ${_target} COTIRE_ENABLE_PRECOMPILED_HEADER) - get_target_property(_targetAddSCU ${_target} COTIRE_ADD_UNITY_BUILD) - string (REPLACE ";" " " _languagesStr "${_languages}") - math (EXPR _numberOfExcludedFiles "${ARGC} - 4") - if (_numberOfExcludedFiles EQUAL 0) - set (_excludedStr "") - elseif (COTIRE_VERBOSE OR _numberOfExcludedFiles LESS 4) - string (REPLACE ";" ", " _excludedStr "excluding ${ARGN}") - else() - set (_excludedStr "excluding ${_numberOfExcludedFiles} files") - endif() - set (_targetMsg "") - if (NOT _languages) - set (_targetMsg "Target ${_target} cannot be cotired.") - if (_disableMsg) - set (_targetMsg "${_targetMsg} ${_disableMsg}") - endif() - elseif (NOT _targetUsePCH AND NOT _targetAddSCU) - set (_targetMsg "${_languagesStr} target ${_target} cotired without unity build and precompiled header.") - if (_disableMsg) - set (_targetMsg "${_targetMsg} ${_disableMsg}") - endif() - elseif (NOT _targetUsePCH) - if (_excludedStr) - set (_targetMsg "${_languagesStr} target ${_target} cotired without precompiled header ${_excludedStr}.") - else() - set (_targetMsg "${_languagesStr} target ${_target} cotired without precompiled header.") - endif() - if (_disableMsg) - set (_targetMsg "${_targetMsg} ${_disableMsg}") - endif() - elseif (NOT _targetAddSCU) - if (_excludedStr) - set (_targetMsg "${_languagesStr} target ${_target} cotired without unity build ${_excludedStr}.") - else() - set (_targetMsg "${_languagesStr} target ${_target} cotired without unity build.") - endif() - if (_disableMsg) - set (_targetMsg "${_targetMsg} ${_disableMsg}") - endif() - else() - if (_excludedStr) - set (_targetMsg "${_languagesStr} target ${_target} cotired ${_excludedStr}.") - else() - set (_targetMsg "${_languagesStr} target ${_target} cotired.") - endif() - endif() - set (${_targetMsgVar} "${_targetMsg}" PARENT_SCOPE) -endfunction() - -function (cotire_choose_target_languages _target _targetLanguagesVar _wholeTargetVar) - set (_languages ${ARGN}) - set (_allSourceFiles "") - set (_allExcludedSourceFiles "") - set (_allCotiredSourceFiles "") - set (_targetLanguages "") - set (_pchEligibleTargetLanguages "") - get_target_property(_targetType ${_target} TYPE) - get_target_property(_targetSourceFiles ${_target} SOURCES) - get_target_property(_targetUsePCH ${_target} COTIRE_ENABLE_PRECOMPILED_HEADER) - get_target_property(_targetAddSCU ${_target} COTIRE_ADD_UNITY_BUILD) - set (_disableMsg "") - foreach (_language ${_languages}) - get_target_property(_prefixHeader ${_target} COTIRE_${_language}_PREFIX_HEADER) - get_target_property(_unityBuildFile ${_target} COTIRE_${_language}_UNITY_SOURCE) - if (_prefixHeader OR _unityBuildFile) - message (STATUS "cotire: target ${_target} has already been cotired.") - set (${_targetLanguagesVar} "" PARENT_SCOPE) - return() - endif() - if (_targetUsePCH AND "${_language}" MATCHES "^C|CXX$" AND DEFINED CMAKE_${_language}_COMPILER_ID) - if (CMAKE_${_language}_COMPILER_ID) - cotire_check_precompiled_header_support("${_language}" "${_target}" _disableMsg) - if (_disableMsg) - set (_targetUsePCH FALSE) - endif() - endif() - endif() - set (_sourceFiles "") - set (_excludedSources "") - set (_cotiredSources "") - cotire_filter_language_source_files(${_language} ${_target} _sourceFiles _excludedSources _cotiredSources ${_targetSourceFiles}) - if (_sourceFiles OR _excludedSources OR _cotiredSources) - list (APPEND _targetLanguages ${_language}) - endif() - if (_sourceFiles) - list (APPEND _allSourceFiles ${_sourceFiles}) - endif() - list (LENGTH _sourceFiles _numberOfSources) - if (NOT _numberOfSources LESS ${COTIRE_MINIMUM_NUMBER_OF_TARGET_SOURCES}) - list (APPEND _pchEligibleTargetLanguages ${_language}) - endif() - if (_excludedSources) - list (APPEND _allExcludedSourceFiles ${_excludedSources}) - endif() - if (_cotiredSources) - list (APPEND _allCotiredSourceFiles ${_cotiredSources}) - endif() - endforeach() - set (_targetMsgLevel STATUS) - if (NOT _targetLanguages) - string (REPLACE ";" " or " _languagesStr "${_languages}") - set (_disableMsg "No ${_languagesStr} source files.") - set (_targetUsePCH FALSE) - set (_targetAddSCU FALSE) - endif() - if (_targetUsePCH) - if (_allCotiredSourceFiles) - cotire_get_source_file_property_values(_cotireTargets COTIRE_TARGET ${_allCotiredSourceFiles}) - list (REMOVE_DUPLICATES _cotireTargets) - string (REPLACE ";" ", " _cotireTargetsStr "${_cotireTargets}") - set (_disableMsg "Target sources already include a precompiled header for target(s) ${_cotireTargets}.") - set (_disableMsg "${_disableMsg} Set target property COTIRE_ENABLE_PRECOMPILED_HEADER to FALSE for targets ${_target},") - set (_disableMsg "${_disableMsg} ${_cotireTargetsStr} to get a workable build system.") - set (_targetMsgLevel SEND_ERROR) - set (_targetUsePCH FALSE) - elseif (NOT _pchEligibleTargetLanguages) - set (_disableMsg "Too few applicable sources.") - set (_targetUsePCH FALSE) - elseif (XCODE AND _allExcludedSourceFiles) - # for Xcode, we cannot apply the precompiled header to individual sources, only to the whole target - set (_disableMsg "Exclusion of source files not supported for generator Xcode.") - set (_targetUsePCH FALSE) - elseif (XCODE AND "${_targetType}" STREQUAL "OBJECT_LIBRARY") - # for Xcode, we cannot apply the required PRE_BUILD action to generate the prefix header to an OBJECT_LIBRARY target - set (_disableMsg "Required PRE_BUILD action not supported for OBJECT_LIBRARY targets for generator Xcode.") - set (_targetUsePCH FALSE) - endif() - endif() - if (_targetAddSCU) - # disable unity builds if automatic Qt processing is used - get_target_property(_targetAutoMoc ${_target} AUTOMOC) - get_target_property(_targetAutoUic ${_target} AUTOUIC) - get_target_property(_targetAutoRcc ${_target} AUTORCC) - if (_targetAutoMoc OR _targetAutoUic OR _targetAutoRcc) - if (_disableMsg) - set (_disableMsg "${_disableMsg} Target uses automatic CMake Qt processing.") - else() - set (_disableMsg "Target uses automatic CMake Qt processing.") - endif() - set (_targetAddSCU FALSE) - endif() - endif() - set_property(TARGET ${_target} PROPERTY COTIRE_ENABLE_PRECOMPILED_HEADER ${_targetUsePCH}) - set_property(TARGET ${_target} PROPERTY COTIRE_ADD_UNITY_BUILD ${_targetAddSCU}) - cotire_make_target_message(${_target} "${_targetLanguages}" "${_disableMsg}" _targetMsg ${_allExcludedSourceFiles}) - if (_targetMsg) - if (NOT DEFINED COTIREMSG_${_target}) - set (COTIREMSG_${_target} "") - endif() - if (COTIRE_VERBOSE OR NOT "${_targetMsgLevel}" STREQUAL "STATUS" OR - NOT "${COTIREMSG_${_target}}" STREQUAL "${_targetMsg}") - # cache message to avoid redundant messages on re-configure - set (COTIREMSG_${_target} "${_targetMsg}" CACHE INTERNAL "${_target} cotire message.") - message (${_targetMsgLevel} "${_targetMsg}") - endif() - endif() - list (LENGTH _targetLanguages _numberOfLanguages) - if (_numberOfLanguages GREATER 1 OR _allExcludedSourceFiles) - set (${_wholeTargetVar} FALSE PARENT_SCOPE) - else() - set (${_wholeTargetVar} TRUE PARENT_SCOPE) - endif() - set (${_targetLanguagesVar} ${_targetLanguages} PARENT_SCOPE) -endfunction() - -function (cotire_compute_unity_max_number_of_includes _target _maxIncludesVar) - set (_sourceFiles ${ARGN}) - get_target_property(_maxIncludes ${_target} COTIRE_UNITY_SOURCE_MAXIMUM_NUMBER_OF_INCLUDES) - if (_maxIncludes MATCHES "(-j|--parallel|--jobs) ?([0-9]*)") - if (DEFINED CMAKE_MATCH_2) - set (_numberOfThreads "${CMAKE_MATCH_2}") - else() - set (_numberOfThreads "") - endif() - if (NOT _numberOfThreads) - # use all available cores - ProcessorCount(_numberOfThreads) - endif() - list (LENGTH _sourceFiles _numberOfSources) - math (EXPR _maxIncludes "(${_numberOfSources} + ${_numberOfThreads} - 1) / ${_numberOfThreads}") - elseif (NOT _maxIncludes MATCHES "[0-9]+") - set (_maxIncludes 0) - endif() - if (COTIRE_DEBUG) - message (STATUS "${_target} unity source max includes: ${_maxIncludes}") - endif() - set (${_maxIncludesVar} ${_maxIncludes} PARENT_SCOPE) -endfunction() - -function (cotire_process_target_language _language _configurations _target _wholeTarget _cmdsVar) - set (${_cmdsVar} "" PARENT_SCOPE) - get_target_property(_targetSourceFiles ${_target} SOURCES) - set (_sourceFiles "") - set (_excludedSources "") - set (_cotiredSources "") - cotire_filter_language_source_files(${_language} ${_target} _sourceFiles _excludedSources _cotiredSources ${_targetSourceFiles}) - if (NOT _sourceFiles AND NOT _cotiredSources) - return() - endif() - set (_cmds "") - # check for user provided unity source file list - get_property(_unitySourceFiles TARGET ${_target} PROPERTY COTIRE_${_language}_UNITY_SOURCE_INIT) - if (NOT _unitySourceFiles) - set (_unitySourceFiles ${_sourceFiles} ${_cotiredSources}) - endif() - cotire_generate_target_script( - ${_language} "${_configurations}" ${_target} _targetScript _targetConfigScript ${_unitySourceFiles}) - # set up unity files for parallel compilation - cotire_compute_unity_max_number_of_includes(${_target} _maxIncludes ${_unitySourceFiles}) - cotire_make_unity_source_file_paths(${_language} ${_target} ${_maxIncludes} _unityFiles ${_unitySourceFiles}) - list (LENGTH _unityFiles _numberOfUnityFiles) - if (_numberOfUnityFiles EQUAL 0) - return() - elseif (_numberOfUnityFiles GREATER 1) - cotire_setup_unity_generation_commands( - ${_language} ${_target} "${_targetScript}" "${_targetConfigScript}" "${_unityFiles}" _cmds ${_unitySourceFiles}) - endif() - # set up single unity file for prefix header generation - cotire_make_single_unity_source_file_path(${_language} ${_target} _unityFile) - cotire_setup_unity_generation_commands( - ${_language} ${_target} "${_targetScript}" "${_targetConfigScript}" "${_unityFile}" _cmds ${_unitySourceFiles}) - cotire_make_prefix_file_path(${_language} ${_target} _prefixFile) - # set up prefix header - if (_prefixFile) - # check for user provided prefix header files - get_property(_prefixHeaderFiles TARGET ${_target} PROPERTY COTIRE_${_language}_PREFIX_HEADER_INIT) - if (_prefixHeaderFiles) - cotire_setup_prefix_generation_from_provided_command( - ${_language} ${_target} "${_targetConfigScript}" "${_prefixFile}" _cmds ${_prefixHeaderFiles}) - else() - cotire_setup_prefix_generation_from_unity_command( - ${_language} ${_target} "${_targetConfigScript}" "${_prefixFile}" "${_unityFile}" _cmds ${_unitySourceFiles}) - endif() - # check if selected language has enough sources at all - list (LENGTH _sourceFiles _numberOfSources) - if (_numberOfSources LESS ${COTIRE_MINIMUM_NUMBER_OF_TARGET_SOURCES}) - set (_targetUsePCH FALSE) - else() - get_target_property(_targetUsePCH ${_target} COTIRE_ENABLE_PRECOMPILED_HEADER) - endif() - if (_targetUsePCH) - cotire_make_pch_file_path(${_language} ${_target} _pchFile) - if (_pchFile) - # first file in _sourceFiles is passed as the host file - cotire_setup_pch_file_compilation( - ${_language} ${_target} "${_targetConfigScript}" "${_prefixFile}" "${_pchFile}" ${_sourceFiles}) - cotire_setup_pch_file_inclusion( - ${_language} ${_target} ${_wholeTarget} "${_prefixFile}" "${_pchFile}" ${_sourceFiles}) - endif() - elseif (_prefixHeaderFiles) - # user provided prefix header must be included unconditionally - cotire_setup_prefix_file_inclusion(${_language} ${_target} "${_prefixFile}" ${_sourceFiles}) - endif() - endif() - # mark target as cotired for language - set_property(TARGET ${_target} PROPERTY COTIRE_${_language}_UNITY_SOURCE "${_unityFiles}") - if (_prefixFile) - set_property(TARGET ${_target} PROPERTY COTIRE_${_language}_PREFIX_HEADER "${_prefixFile}") - if (_targetUsePCH AND _pchFile) - set_property(TARGET ${_target} PROPERTY COTIRE_${_language}_PRECOMPILED_HEADER "${_pchFile}") - endif() - endif() - set (${_cmdsVar} ${_cmds} PARENT_SCOPE) -endfunction() - -function (cotire_setup_clean_target _target) - set (_cleanTargetName "${_target}${COTIRE_CLEAN_TARGET_SUFFIX}") - if (NOT TARGET "${_cleanTargetName}") - cotire_set_cmd_to_prologue(_cmds) - get_filename_component(_outputDir "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}" ABSOLUTE) - list (APPEND _cmds -P "${COTIRE_CMAKE_MODULE_FILE}" "cleanup" "${_outputDir}" "${COTIRE_INTDIR}" "${_target}") - add_custom_target(${_cleanTargetName} - COMMAND ${_cmds} - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Cleaning up target ${_target} cotire generated files" - VERBATIM) - cotire_init_target("${_cleanTargetName}") - endif() -endfunction() - -function (cotire_setup_pch_target _languages _configurations _target) - if ("${CMAKE_GENERATOR}" MATCHES "Make|Ninja") - # for makefile based generators, we add a custom target to trigger the generation of the cotire related files - set (_dependsFiles "") - foreach (_language ${_languages}) - set (_props COTIRE_${_language}_PREFIX_HEADER COTIRE_${_language}_UNITY_SOURCE) - if (NOT CMAKE_${_language}_COMPILER_ID MATCHES "MSVC|Intel" AND NOT - (WIN32 AND CMAKE_${_language}_COMPILER_ID MATCHES "Clang")) - # MSVC, Intel and clang-cl only create precompiled header as a side effect - list (INSERT _props 0 COTIRE_${_language}_PRECOMPILED_HEADER) - endif() - cotire_get_first_set_property_value(_dependsFile TARGET ${_target} ${_props}) - if (_dependsFile) - list (APPEND _dependsFiles "${_dependsFile}") - endif() - endforeach() - if (_dependsFiles) - set (_pchTargetName "${_target}${COTIRE_PCH_TARGET_SUFFIX}") - add_custom_target("${_pchTargetName}" DEPENDS ${_dependsFiles}) - cotire_init_target("${_pchTargetName}") - cotire_add_to_pch_all_target(${_pchTargetName}) - endif() - else() - # for other generators, we add the "clean all" target to clean up the precompiled header - cotire_setup_clean_all_target() - endif() -endfunction() - -function (cotire_filter_object_libraries _target _objectLibrariesVar) - set (_objectLibraries "") - foreach (_source ${ARGN}) - if (_source MATCHES "^\\$$") - list (APPEND _objectLibraries "${_source}") - endif() - endforeach() - set (${_objectLibrariesVar} ${_objectLibraries} PARENT_SCOPE) -endfunction() - -function (cotire_collect_unity_target_sources _target _languages _unityTargetSourcesVar) - get_target_property(_targetSourceFiles ${_target} SOURCES) - set (_unityTargetSources ${_targetSourceFiles}) - foreach (_language ${_languages}) - get_property(_unityFiles TARGET ${_target} PROPERTY COTIRE_${_language}_UNITY_SOURCE) - if (_unityFiles) - # remove source files that are included in the unity source - set (_sourceFiles "") - set (_excludedSources "") - set (_cotiredSources "") - cotire_filter_language_source_files(${_language} ${_target} _sourceFiles _excludedSources _cotiredSources ${_targetSourceFiles}) - if (_sourceFiles OR _cotiredSources) - list (REMOVE_ITEM _unityTargetSources ${_sourceFiles} ${_cotiredSources}) - endif() - # add unity source files instead - list (APPEND _unityTargetSources ${_unityFiles}) - endif() - endforeach() - # handle object libraries which are part of the target's sources - get_target_property(_linkLibrariesStrategy ${_target} COTIRE_UNITY_LINK_LIBRARIES_INIT) - if ("${_linkLibrariesStrategy}" MATCHES "^COPY_UNITY$") - cotire_filter_object_libraries(${_target} _objectLibraries ${_targetSourceFiles}) - if (_objectLibraries) - cotire_map_libraries("${_linkLibrariesStrategy}" _unityObjectLibraries ${_objectLibraries}) - list (REMOVE_ITEM _unityTargetSources ${_objectLibraries}) - list (APPEND _unityTargetSources ${_unityObjectLibraries}) - endif() - endif() - set (${_unityTargetSourcesVar} ${_unityTargetSources} PARENT_SCOPE) -endfunction() - -function (cotire_setup_unity_target_pch_usage _languages _target) - foreach (_language ${_languages}) - get_property(_unityFiles TARGET ${_target} PROPERTY COTIRE_${_language}_UNITY_SOURCE) - if (_unityFiles) - get_property(_userPrefixFile TARGET ${_target} PROPERTY COTIRE_${_language}_PREFIX_HEADER_INIT) - get_property(_prefixFile TARGET ${_target} PROPERTY COTIRE_${_language}_PREFIX_HEADER) - if (_userPrefixFile AND _prefixFile) - # user provided prefix header must be included unconditionally by unity sources - cotire_setup_prefix_file_inclusion(${_language} ${_target} "${_prefixFile}" ${_unityFiles}) - endif() - endif() - endforeach() -endfunction() - -function (cotire_setup_unity_build_target _languages _configurations _target) - get_target_property(_unityTargetName ${_target} COTIRE_UNITY_TARGET_NAME) - if (NOT _unityTargetName) - set (_unityTargetName "${_target}${COTIRE_UNITY_BUILD_TARGET_SUFFIX}") - endif() - # determine unity target sub type - get_target_property(_targetType ${_target} TYPE) - if ("${_targetType}" STREQUAL "EXECUTABLE") - set (_unityTargetSubType "") - elseif (_targetType MATCHES "(STATIC|SHARED|MODULE|OBJECT)_LIBRARY") - set (_unityTargetSubType "${CMAKE_MATCH_1}") - else() - message (WARNING "cotire: target ${_target} has unknown target type ${_targetType}.") - return() - endif() - # determine unity target sources - set (_unityTargetSources "") - cotire_collect_unity_target_sources(${_target} "${_languages}" _unityTargetSources) - # prevent AUTOMOC, AUTOUIC and AUTORCC properties from being set when the unity target is created - set (CMAKE_AUTOMOC OFF) - set (CMAKE_AUTOUIC OFF) - set (CMAKE_AUTORCC OFF) - if (COTIRE_DEBUG) - message (STATUS "add target ${_targetType} ${_unityTargetName} ${_unityTargetSubType} EXCLUDE_FROM_ALL ${_unityTargetSources}") - endif() - # generate unity target - if ("${_targetType}" STREQUAL "EXECUTABLE") - add_executable(${_unityTargetName} ${_unityTargetSubType} EXCLUDE_FROM_ALL ${_unityTargetSources}) - else() - add_library(${_unityTargetName} ${_unityTargetSubType} EXCLUDE_FROM_ALL ${_unityTargetSources}) - endif() - # copy output location properties - set (_outputDirProperties - ARCHIVE_OUTPUT_DIRECTORY ARCHIVE_OUTPUT_DIRECTORY_ - LIBRARY_OUTPUT_DIRECTORY LIBRARY_OUTPUT_DIRECTORY_ - RUNTIME_OUTPUT_DIRECTORY RUNTIME_OUTPUT_DIRECTORY_) - if (COTIRE_UNITY_OUTPUT_DIRECTORY) - set (_setDefaultOutputDir TRUE) - if (IS_ABSOLUTE "${COTIRE_UNITY_OUTPUT_DIRECTORY}") - set (_outputDir "${COTIRE_UNITY_OUTPUT_DIRECTORY}") - else() - # append relative COTIRE_UNITY_OUTPUT_DIRECTORY to target's actual output directory - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} ${_outputDirProperties}) - cotire_resolve_config_properties("${_configurations}" _properties ${_outputDirProperties}) - foreach (_property ${_properties}) - get_property(_outputDir TARGET ${_target} PROPERTY ${_property}) - if (_outputDir) - get_filename_component(_outputDir "${_outputDir}/${COTIRE_UNITY_OUTPUT_DIRECTORY}" ABSOLUTE) - set_property(TARGET ${_unityTargetName} PROPERTY ${_property} "${_outputDir}") - set (_setDefaultOutputDir FALSE) - endif() - endforeach() - if (_setDefaultOutputDir) - get_filename_component(_outputDir "${CMAKE_CURRENT_BINARY_DIR}/${COTIRE_UNITY_OUTPUT_DIRECTORY}" ABSOLUTE) - endif() - endif() - if (_setDefaultOutputDir) - set_target_properties(${_unityTargetName} PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY "${_outputDir}" - LIBRARY_OUTPUT_DIRECTORY "${_outputDir}" - RUNTIME_OUTPUT_DIRECTORY "${_outputDir}") - endif() - else() - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - ${_outputDirProperties}) - endif() - # copy output name - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - ARCHIVE_OUTPUT_NAME ARCHIVE_OUTPUT_NAME_ - LIBRARY_OUTPUT_NAME LIBRARY_OUTPUT_NAME_ - OUTPUT_NAME OUTPUT_NAME_ - RUNTIME_OUTPUT_NAME RUNTIME_OUTPUT_NAME_ - PREFIX _POSTFIX SUFFIX - IMPORT_PREFIX IMPORT_SUFFIX) - # copy compile stuff - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - COMPILE_DEFINITIONS COMPILE_DEFINITIONS_ - COMPILE_FLAGS COMPILE_OPTIONS - Fortran_FORMAT Fortran_MODULE_DIRECTORY - INCLUDE_DIRECTORIES - INTERPROCEDURAL_OPTIMIZATION INTERPROCEDURAL_OPTIMIZATION_ - POSITION_INDEPENDENT_CODE - C_COMPILER_LAUNCHER CXX_COMPILER_LAUNCHER - C_INCLUDE_WHAT_YOU_USE CXX_INCLUDE_WHAT_YOU_USE - C_VISIBILITY_PRESET CXX_VISIBILITY_PRESET VISIBILITY_INLINES_HIDDEN - C_CLANG_TIDY CXX_CLANG_TIDY) - # copy compile features - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - C_EXTENSIONS C_STANDARD C_STANDARD_REQUIRED - CXX_EXTENSIONS CXX_STANDARD CXX_STANDARD_REQUIRED - COMPILE_FEATURES) - # copy interface stuff - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - COMPATIBLE_INTERFACE_BOOL COMPATIBLE_INTERFACE_NUMBER_MAX COMPATIBLE_INTERFACE_NUMBER_MIN - COMPATIBLE_INTERFACE_STRING - INTERFACE_COMPILE_DEFINITIONS INTERFACE_COMPILE_FEATURES INTERFACE_COMPILE_OPTIONS - INTERFACE_INCLUDE_DIRECTORIES INTERFACE_SOURCES - INTERFACE_POSITION_INDEPENDENT_CODE INTERFACE_SYSTEM_INCLUDE_DIRECTORIES - INTERFACE_AUTOUIC_OPTIONS NO_SYSTEM_FROM_IMPORTED) - # copy link stuff - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - BUILD_WITH_INSTALL_RPATH BUILD_WITH_INSTALL_NAME_DIR - INSTALL_RPATH INSTALL_RPATH_USE_LINK_PATH SKIP_BUILD_RPATH - LINKER_LANGUAGE LINK_DEPENDS LINK_DEPENDS_NO_SHARED - LINK_FLAGS LINK_FLAGS_ - LINK_INTERFACE_LIBRARIES LINK_INTERFACE_LIBRARIES_ - LINK_INTERFACE_MULTIPLICITY LINK_INTERFACE_MULTIPLICITY_ - LINK_SEARCH_START_STATIC LINK_SEARCH_END_STATIC - STATIC_LIBRARY_FLAGS STATIC_LIBRARY_FLAGS_ - NO_SONAME SOVERSION VERSION - LINK_WHAT_YOU_USE BUILD_RPATH) - # copy cmake stuff - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - IMPLICIT_DEPENDS_INCLUDE_TRANSFORM RULE_LAUNCH_COMPILE RULE_LAUNCH_CUSTOM RULE_LAUNCH_LINK) - # copy Apple platform specific stuff - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - BUNDLE BUNDLE_EXTENSION FRAMEWORK FRAMEWORK_VERSION INSTALL_NAME_DIR - MACOSX_BUNDLE MACOSX_BUNDLE_INFO_PLIST MACOSX_FRAMEWORK_INFO_PLIST MACOSX_RPATH - OSX_ARCHITECTURES OSX_ARCHITECTURES_ PRIVATE_HEADER PUBLIC_HEADER RESOURCE XCTEST - IOS_INSTALL_COMBINED XCODE_EXPLICIT_FILE_TYPE XCODE_PRODUCT_TYPE) - # copy Windows platform specific stuff - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - GNUtoMS - COMPILE_PDB_NAME COMPILE_PDB_NAME_ - COMPILE_PDB_OUTPUT_DIRECTORY COMPILE_PDB_OUTPUT_DIRECTORY_ - PDB_NAME PDB_NAME_ PDB_OUTPUT_DIRECTORY PDB_OUTPUT_DIRECTORY_ - VS_DESKTOP_EXTENSIONS_VERSION VS_DOTNET_REFERENCES VS_DOTNET_TARGET_FRAMEWORK_VERSION - VS_GLOBAL_KEYWORD VS_GLOBAL_PROJECT_TYPES VS_GLOBAL_ROOTNAMESPACE - VS_IOT_EXTENSIONS_VERSION VS_IOT_STARTUP_TASK - VS_KEYWORD VS_MOBILE_EXTENSIONS_VERSION - VS_SCC_AUXPATH VS_SCC_LOCALPATH VS_SCC_PROJECTNAME VS_SCC_PROVIDER - VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION - VS_WINRT_COMPONENT VS_WINRT_EXTENSIONS VS_WINRT_REFERENCES - WIN32_EXECUTABLE WINDOWS_EXPORT_ALL_SYMBOLS - DEPLOYMENT_REMOTE_DIRECTORY VS_CONFIGURATION_TYPE - VS_SDK_REFERENCES VS_USER_PROPS VS_DEBUGGER_WORKING_DIRECTORY) - # copy Android platform specific stuff - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - ANDROID_API ANDROID_API_MIN ANDROID_GUI - ANDROID_ANT_ADDITIONAL_OPTIONS ANDROID_ARCH ANDROID_ASSETS_DIRECTORIES - ANDROID_JAR_DEPENDENCIES ANDROID_JAR_DIRECTORIES ANDROID_JAVA_SOURCE_DIR - ANDROID_NATIVE_LIB_DEPENDENCIES ANDROID_NATIVE_LIB_DIRECTORIES - ANDROID_PROCESS_MAX ANDROID_PROGUARD ANDROID_PROGUARD_CONFIG_PATH - ANDROID_SECURE_PROPS_PATH ANDROID_SKIP_ANT_STEP ANDROID_STL_TYPE) - # copy CUDA platform specific stuff - cotire_copy_set_properties("${_configurations}" TARGET ${_target} ${_unityTargetName} - CUDA_PTX_COMPILATION CUDA_SEPARABLE_COMPILATION CUDA_RESOLVE_DEVICE_SYMBOLS - CUDA_EXTENSIONS CUDA_STANDARD CUDA_STANDARD_REQUIRED) - # use output name from original target - get_target_property(_targetOutputName ${_unityTargetName} OUTPUT_NAME) - if (NOT _targetOutputName) - set_property(TARGET ${_unityTargetName} PROPERTY OUTPUT_NAME "${_target}") - endif() - # use export symbol from original target - cotire_get_target_export_symbol("${_target}" _defineSymbol) - if (_defineSymbol) - set_property(TARGET ${_unityTargetName} PROPERTY DEFINE_SYMBOL "${_defineSymbol}") - if ("${_targetType}" STREQUAL "EXECUTABLE") - set_property(TARGET ${_unityTargetName} PROPERTY ENABLE_EXPORTS TRUE) - endif() - endif() - # enable parallel compilation for MSVC - if (MSVC AND "${CMAKE_GENERATOR}" MATCHES "Visual Studio") - list (LENGTH _unityTargetSources _numberOfUnityTargetSources) - if (_numberOfUnityTargetSources GREATER 1) - set_property(TARGET ${_unityTargetName} APPEND PROPERTY COMPILE_OPTIONS "/MP") - endif() - endif() - cotire_init_target(${_unityTargetName}) - cotire_add_to_unity_all_target(${_unityTargetName}) - set_property(TARGET ${_target} PROPERTY COTIRE_UNITY_TARGET_NAME "${_unityTargetName}") -endfunction(cotire_setup_unity_build_target) - -function (cotire_target _target) - set(_options "") - set(_oneValueArgs "") - set(_multiValueArgs LANGUAGES CONFIGURATIONS) - cmake_parse_arguments(_option "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN}) - if (NOT _option_LANGUAGES) - get_property (_option_LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) - endif() - if (NOT _option_CONFIGURATIONS) - cotire_get_configuration_types(_option_CONFIGURATIONS) - endif() - # check if cotire can be applied to target at all - cotire_is_target_supported(${_target} _isSupported) - if (NOT _isSupported) - get_target_property(_imported ${_target} IMPORTED) - get_target_property(_targetType ${_target} TYPE) - if (_imported) - message (WARNING "cotire: imported ${_targetType} target ${_target} cannot be cotired.") - else() - message (STATUS "cotire: ${_targetType} target ${_target} cannot be cotired.") - endif() - return() - endif() - # resolve alias - get_target_property(_aliasName ${_target} ALIASED_TARGET) - if (_aliasName) - if (COTIRE_DEBUG) - message (STATUS "${_target} is an alias. Applying cotire to aliased target ${_aliasName} instead.") - endif() - set (_target ${_aliasName}) - endif() - # check if target needs to be cotired for build type - # when using configuration types, the test is performed at build time - cotire_init_cotire_target_properties(${_target}) - if (NOT CMAKE_CONFIGURATION_TYPES) - if (CMAKE_BUILD_TYPE) - list (FIND _option_CONFIGURATIONS "${CMAKE_BUILD_TYPE}" _index) - else() - list (FIND _option_CONFIGURATIONS "None" _index) - endif() - if (_index EQUAL -1) - if (COTIRE_DEBUG) - message (STATUS "CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} not cotired (${_option_CONFIGURATIONS})") - endif() - return() - endif() - endif() - # when not using configuration types, immediately create cotire intermediate dir - if (NOT CMAKE_CONFIGURATION_TYPES) - cotire_get_intermediate_dir(_baseDir) - file (MAKE_DIRECTORY "${_baseDir}") - endif() - # choose languages that apply to the target - cotire_choose_target_languages("${_target}" _targetLanguages _wholeTarget ${_option_LANGUAGES}) - if (NOT _targetLanguages) - return() - endif() - set (_cmds "") - foreach (_language ${_targetLanguages}) - cotire_process_target_language("${_language}" "${_option_CONFIGURATIONS}" ${_target} ${_wholeTarget} _cmd) - if (_cmd) - list (APPEND _cmds ${_cmd}) - endif() - endforeach() - get_target_property(_targetAddSCU ${_target} COTIRE_ADD_UNITY_BUILD) - if (_targetAddSCU) - cotire_setup_unity_build_target("${_targetLanguages}" "${_option_CONFIGURATIONS}" ${_target}) - endif() - get_target_property(_targetUsePCH ${_target} COTIRE_ENABLE_PRECOMPILED_HEADER) - if (_targetUsePCH) - cotire_setup_target_pch_usage("${_targetLanguages}" ${_target} ${_wholeTarget} ${_cmds}) - cotire_setup_pch_target("${_targetLanguages}" "${_option_CONFIGURATIONS}" ${_target}) - if (_targetAddSCU) - cotire_setup_unity_target_pch_usage("${_targetLanguages}" ${_target}) - endif() - endif() - get_target_property(_targetAddCleanTarget ${_target} COTIRE_ADD_CLEAN) - if (_targetAddCleanTarget) - cotire_setup_clean_target(${_target}) - endif() -endfunction(cotire_target) - -function (cotire_map_libraries _strategy _mappedLibrariesVar) - set (_mappedLibraries "") - foreach (_library ${ARGN}) - if (_library MATCHES "^\\$$") - set (_libraryName "${CMAKE_MATCH_1}") - set (_linkOnly TRUE) - set (_objectLibrary FALSE) - elseif (_library MATCHES "^\\$$") - set (_libraryName "${CMAKE_MATCH_1}") - set (_linkOnly FALSE) - set (_objectLibrary TRUE) - else() - set (_libraryName "${_library}") - set (_linkOnly FALSE) - set (_objectLibrary FALSE) - endif() - if ("${_strategy}" MATCHES "COPY_UNITY") - cotire_is_target_supported(${_libraryName} _isSupported) - if (_isSupported) - # use target's corresponding unity target, if available - get_target_property(_libraryUnityTargetName ${_libraryName} COTIRE_UNITY_TARGET_NAME) - if (TARGET "${_libraryUnityTargetName}") - if (_linkOnly) - list (APPEND _mappedLibraries "$") - elseif (_objectLibrary) - list (APPEND _mappedLibraries "$") - else() - list (APPEND _mappedLibraries "${_libraryUnityTargetName}") - endif() - else() - list (APPEND _mappedLibraries "${_library}") - endif() - else() - list (APPEND _mappedLibraries "${_library}") - endif() - else() - list (APPEND _mappedLibraries "${_library}") - endif() - endforeach() - list (REMOVE_DUPLICATES _mappedLibraries) - set (${_mappedLibrariesVar} ${_mappedLibraries} PARENT_SCOPE) -endfunction() - -function (cotire_target_link_libraries _target) - cotire_is_target_supported(${_target} _isSupported) - if (NOT _isSupported) - return() - endif() - get_target_property(_unityTargetName ${_target} COTIRE_UNITY_TARGET_NAME) - if (TARGET "${_unityTargetName}") - get_target_property(_linkLibrariesStrategy ${_target} COTIRE_UNITY_LINK_LIBRARIES_INIT) - if (COTIRE_DEBUG) - message (STATUS "unity target ${_unityTargetName} link strategy: ${_linkLibrariesStrategy}") - endif() - if ("${_linkLibrariesStrategy}" MATCHES "^(COPY|COPY_UNITY)$") - get_target_property(_linkLibraries ${_target} LINK_LIBRARIES) - if (_linkLibraries) - cotire_map_libraries("${_linkLibrariesStrategy}" _unityLinkLibraries ${_linkLibraries}) - set_target_properties(${_unityTargetName} PROPERTIES LINK_LIBRARIES "${_unityLinkLibraries}") - if (COTIRE_DEBUG) - message (STATUS "unity target ${_unityTargetName} link libraries: ${_unityLinkLibraries}") - endif() - endif() - get_target_property(_interfaceLinkLibraries ${_target} INTERFACE_LINK_LIBRARIES) - if (_interfaceLinkLibraries) - cotire_map_libraries("${_linkLibrariesStrategy}" _unityLinkInterfaceLibraries ${_interfaceLinkLibraries}) - set_target_properties(${_unityTargetName} PROPERTIES INTERFACE_LINK_LIBRARIES "${_unityLinkInterfaceLibraries}") - if (COTIRE_DEBUG) - message (STATUS "unity target ${_unityTargetName} interface link libraries: ${_unityLinkInterfaceLibraries}") - endif() - endif() - get_target_property(_manualDependencies ${_target} MANUALLY_ADDED_DEPENDENCIES) - if (_manualDependencies) - cotire_map_libraries("${_linkLibrariesStrategy}" _unityManualDependencies ${_manualDependencies}) - if (_unityManualDependencies) - add_dependencies("${_unityTargetName}" ${_unityManualDependencies}) - endif() - endif() - endif() - endif() -endfunction(cotire_target_link_libraries) - -function (cotire_cleanup _binaryDir _cotireIntermediateDirName _targetName) - if (_targetName) - file (GLOB_RECURSE _cotireFiles "${_binaryDir}/${_targetName}*.*") - else() - file (GLOB_RECURSE _cotireFiles "${_binaryDir}/*.*") - endif() - # filter files in intermediate directory - set (_filesToRemove "") - foreach (_file ${_cotireFiles}) - get_filename_component(_dir "${_file}" DIRECTORY) - get_filename_component(_dirName "${_dir}" NAME) - if ("${_dirName}" STREQUAL "${_cotireIntermediateDirName}") - list (APPEND _filesToRemove "${_file}") - endif() - endforeach() - if (_filesToRemove) - if (COTIRE_VERBOSE) - message (STATUS "cleaning up ${_filesToRemove}") - endif() - file (REMOVE ${_filesToRemove}) - endif() -endfunction() - -function (cotire_init_target _targetName) - if (COTIRE_TARGETS_FOLDER) - set_target_properties(${_targetName} PROPERTIES FOLDER "${COTIRE_TARGETS_FOLDER}") - endif() - set_target_properties(${_targetName} PROPERTIES EXCLUDE_FROM_ALL TRUE) - if (MSVC_IDE) - set_target_properties(${_targetName} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD TRUE) - endif() -endfunction() - -function (cotire_add_to_pch_all_target _pchTargetName) - set (_targetName "${COTIRE_PCH_ALL_TARGET_NAME}") - if (NOT TARGET "${_targetName}") - add_custom_target("${_targetName}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - VERBATIM) - cotire_init_target("${_targetName}") - endif() - cotire_setup_clean_all_target() - add_dependencies(${_targetName} ${_pchTargetName}) -endfunction() - -function (cotire_add_to_unity_all_target _unityTargetName) - set (_targetName "${COTIRE_UNITY_BUILD_ALL_TARGET_NAME}") - if (NOT TARGET "${_targetName}") - add_custom_target("${_targetName}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - VERBATIM) - cotire_init_target("${_targetName}") - endif() - cotire_setup_clean_all_target() - add_dependencies(${_targetName} ${_unityTargetName}) -endfunction() - -function (cotire_setup_clean_all_target) - set (_targetName "${COTIRE_CLEAN_ALL_TARGET_NAME}") - if (NOT TARGET "${_targetName}") - cotire_set_cmd_to_prologue(_cmds) - list (APPEND _cmds -P "${COTIRE_CMAKE_MODULE_FILE}" "cleanup" "${CMAKE_BINARY_DIR}" "${COTIRE_INTDIR}") - add_custom_target(${_targetName} - COMMAND ${_cmds} - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - COMMENT "Cleaning up all cotire generated files" - VERBATIM) - cotire_init_target("${_targetName}") - endif() -endfunction() - -function (cotire) - set(_options "") - set(_oneValueArgs "") - set(_multiValueArgs LANGUAGES CONFIGURATIONS) - cmake_parse_arguments(_option "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN}) - set (_targets ${_option_UNPARSED_ARGUMENTS}) - foreach (_target ${_targets}) - if (TARGET ${_target}) - cotire_target(${_target} LANGUAGES ${_option_LANGUAGES} CONFIGURATIONS ${_option_CONFIGURATIONS}) - else() - message (WARNING "cotire: ${_target} is not a target.") - endif() - endforeach() - foreach (_target ${_targets}) - if (TARGET ${_target}) - cotire_target_link_libraries(${_target}) - endif() - endforeach() -endfunction() - -if (CMAKE_SCRIPT_MODE_FILE) - - # cotire is being run in script mode - # locate -P on command args - set (COTIRE_ARGC -1) - foreach (_index RANGE ${CMAKE_ARGC}) - if (COTIRE_ARGC GREATER -1) - set (COTIRE_ARGV${COTIRE_ARGC} "${CMAKE_ARGV${_index}}") - math (EXPR COTIRE_ARGC "${COTIRE_ARGC} + 1") - elseif ("${CMAKE_ARGV${_index}}" STREQUAL "-P") - set (COTIRE_ARGC 0) - endif() - endforeach() - - # include target script if available - if ("${COTIRE_ARGV2}" MATCHES "\\.cmake$") - # the included target scripts sets up additional variables relating to the target (e.g., COTIRE_TARGET_SOURCES) - include("${COTIRE_ARGV2}") - endif() - - if (COTIRE_DEBUG) - message (STATUS "${COTIRE_ARGV0} ${COTIRE_ARGV1} ${COTIRE_ARGV2} ${COTIRE_ARGV3} ${COTIRE_ARGV4} ${COTIRE_ARGV5}") - endif() - - if (NOT COTIRE_BUILD_TYPE) - set (COTIRE_BUILD_TYPE "None") - endif() - string (TOUPPER "${COTIRE_BUILD_TYPE}" _upperConfig) - set (_includeDirs ${COTIRE_TARGET_INCLUDE_DIRECTORIES_${_upperConfig}}) - set (_systemIncludeDirs ${COTIRE_TARGET_SYSTEM_INCLUDE_DIRECTORIES_${_upperConfig}}) - set (_compileDefinitions ${COTIRE_TARGET_COMPILE_DEFINITIONS_${_upperConfig}}) - set (_compileFlags ${COTIRE_TARGET_COMPILE_FLAGS_${_upperConfig}}) - # check if target has been cotired for actual build type COTIRE_BUILD_TYPE - list (FIND COTIRE_TARGET_CONFIGURATION_TYPES "${COTIRE_BUILD_TYPE}" _index) - if (_index GREATER -1) - set (_sources ${COTIRE_TARGET_SOURCES}) - set (_sourcesDefinitions ${COTIRE_TARGET_SOURCES_COMPILE_DEFINITIONS_${_upperConfig}}) - else() - if (COTIRE_DEBUG) - message (STATUS "COTIRE_BUILD_TYPE=${COTIRE_BUILD_TYPE} not cotired (${COTIRE_TARGET_CONFIGURATION_TYPES})") - endif() - set (_sources "") - set (_sourcesDefinitions "") - endif() - set (_targetPreUndefs ${COTIRE_TARGET_PRE_UNDEFS}) - set (_targetPostUndefs ${COTIRE_TARGET_POST_UNDEFS}) - set (_sourcesPreUndefs ${COTIRE_TARGET_SOURCES_PRE_UNDEFS}) - set (_sourcesPostUndefs ${COTIRE_TARGET_SOURCES_POST_UNDEFS}) - - if ("${COTIRE_ARGV1}" STREQUAL "unity") - - if (XCODE) - # executing pre-build action under Xcode, check dependency on target script - set (_dependsOption DEPENDS "${COTIRE_ARGV2}") - else() - # executing custom command, no need to re-check for dependencies - set (_dependsOption "") - endif() - - cotire_select_unity_source_files("${COTIRE_ARGV3}" _sources ${_sources}) - - cotire_generate_unity_source( - "${COTIRE_ARGV3}" ${_sources} - LANGUAGE "${COTIRE_TARGET_LANGUAGE}" - SOURCES_COMPILE_DEFINITIONS ${_sourcesDefinitions} - PRE_UNDEFS ${_targetPreUndefs} - POST_UNDEFS ${_targetPostUndefs} - SOURCES_PRE_UNDEFS ${_sourcesPreUndefs} - SOURCES_POST_UNDEFS ${_sourcesPostUndefs} - ${_dependsOption}) - - elseif ("${COTIRE_ARGV1}" STREQUAL "prefix") - - if (XCODE) - # executing pre-build action under Xcode, check dependency on unity file and prefix dependencies - set (_dependsOption DEPENDS "${COTIRE_ARGV4}" ${COTIRE_TARGET_PREFIX_DEPENDS}) - else() - # executing custom command, no need to re-check for dependencies - set (_dependsOption "") - endif() - - set (_files "") - foreach (_index RANGE 4 ${COTIRE_ARGC}) - if (COTIRE_ARGV${_index}) - list (APPEND _files "${COTIRE_ARGV${_index}}") - endif() - endforeach() - - cotire_generate_prefix_header( - "${COTIRE_ARGV3}" ${_files} - COMPILER_LAUNCHER "${COTIRE_TARGET_${COTIRE_TARGET_LANGUAGE}_COMPILER_LAUNCHER}" - COMPILER_EXECUTABLE "${CMAKE_${COTIRE_TARGET_LANGUAGE}_COMPILER}" - COMPILER_ARG1 ${CMAKE_${COTIRE_TARGET_LANGUAGE}_COMPILER_ARG1} - COMPILER_ID "${CMAKE_${COTIRE_TARGET_LANGUAGE}_COMPILER_ID}" - COMPILER_VERSION "${CMAKE_${COTIRE_TARGET_LANGUAGE}_COMPILER_VERSION}" - LANGUAGE "${COTIRE_TARGET_LANGUAGE}" - IGNORE_PATH "${COTIRE_TARGET_IGNORE_PATH};${COTIRE_ADDITIONAL_PREFIX_HEADER_IGNORE_PATH}" - INCLUDE_PATH ${COTIRE_TARGET_INCLUDE_PATH} - IGNORE_EXTENSIONS "${CMAKE_${COTIRE_TARGET_LANGUAGE}_SOURCE_FILE_EXTENSIONS};${COTIRE_ADDITIONAL_PREFIX_HEADER_IGNORE_EXTENSIONS}" - INCLUDE_PRIORITY_PATH ${COTIRE_TARGET_INCLUDE_PRIORITY_PATH} - INCLUDE_DIRECTORIES ${_includeDirs} - SYSTEM_INCLUDE_DIRECTORIES ${_systemIncludeDirs} - COMPILE_DEFINITIONS ${_compileDefinitions} - COMPILE_FLAGS ${_compileFlags} - ${_dependsOption}) - - elseif ("${COTIRE_ARGV1}" STREQUAL "precompile") - - set (_files "") - foreach (_index RANGE 5 ${COTIRE_ARGC}) - if (COTIRE_ARGV${_index}) - list (APPEND _files "${COTIRE_ARGV${_index}}") - endif() - endforeach() - - cotire_precompile_prefix_header( - "${COTIRE_ARGV3}" "${COTIRE_ARGV4}" "${COTIRE_ARGV5}" - COMPILER_LAUNCHER "${COTIRE_TARGET_${COTIRE_TARGET_LANGUAGE}_COMPILER_LAUNCHER}" - COMPILER_EXECUTABLE "${CMAKE_${COTIRE_TARGET_LANGUAGE}_COMPILER}" - COMPILER_ARG1 ${CMAKE_${COTIRE_TARGET_LANGUAGE}_COMPILER_ARG1} - COMPILER_ID "${CMAKE_${COTIRE_TARGET_LANGUAGE}_COMPILER_ID}" - COMPILER_VERSION "${CMAKE_${COTIRE_TARGET_LANGUAGE}_COMPILER_VERSION}" - LANGUAGE "${COTIRE_TARGET_LANGUAGE}" - INCLUDE_DIRECTORIES ${_includeDirs} - SYSTEM_INCLUDE_DIRECTORIES ${_systemIncludeDirs} - COMPILE_DEFINITIONS ${_compileDefinitions} - COMPILE_FLAGS ${_compileFlags}) - - elseif ("${COTIRE_ARGV1}" STREQUAL "combine") - - if (COTIRE_TARGET_LANGUAGE) - set (_combinedFile "${COTIRE_ARGV3}") - set (_startIndex 4) - else() - set (_combinedFile "${COTIRE_ARGV2}") - set (_startIndex 3) - endif() - set (_files "") - foreach (_index RANGE ${_startIndex} ${COTIRE_ARGC}) - if (COTIRE_ARGV${_index}) - list (APPEND _files "${COTIRE_ARGV${_index}}") - endif() - endforeach() - - if (XCODE) - # executing pre-build action under Xcode, check dependency on files to be combined - set (_dependsOption DEPENDS ${_files}) - else() - # executing custom command, no need to re-check for dependencies - set (_dependsOption "") - endif() - - if (COTIRE_TARGET_LANGUAGE) - cotire_generate_unity_source( - "${_combinedFile}" ${_files} - LANGUAGE "${COTIRE_TARGET_LANGUAGE}" - ${_dependsOption}) - else() - cotire_generate_unity_source("${_combinedFile}" ${_files} ${_dependsOption}) - endif() - - elseif ("${COTIRE_ARGV1}" STREQUAL "cleanup") - - cotire_cleanup("${COTIRE_ARGV2}" "${COTIRE_ARGV3}" "${COTIRE_ARGV4}") - - else() - message (FATAL_ERROR "cotire: unknown command \"${COTIRE_ARGV1}\".") - endif() - -else() - - # cotire is being run in include mode - # set up all variable and property definitions - - if (NOT DEFINED COTIRE_DEBUG_INIT) - if (DEFINED COTIRE_DEBUG) - set (COTIRE_DEBUG_INIT ${COTIRE_DEBUG}) - else() - set (COTIRE_DEBUG_INIT FALSE) - endif() - endif() - option (COTIRE_DEBUG "Enable cotire debugging output?" ${COTIRE_DEBUG_INIT}) - - if (NOT DEFINED COTIRE_VERBOSE_INIT) - if (DEFINED COTIRE_VERBOSE) - set (COTIRE_VERBOSE_INIT ${COTIRE_VERBOSE}) - else() - set (COTIRE_VERBOSE_INIT FALSE) - endif() - endif() - option (COTIRE_VERBOSE "Enable cotire verbose output?" ${COTIRE_VERBOSE_INIT}) - - set (COTIRE_ADDITIONAL_PREFIX_HEADER_IGNORE_EXTENSIONS "inc;inl;ipp" CACHE STRING - "Ignore headers with the listed file extensions from the generated prefix header.") - - set (COTIRE_ADDITIONAL_PREFIX_HEADER_IGNORE_PATH "" CACHE STRING - "Ignore headers from these directories when generating the prefix header.") - - set (COTIRE_UNITY_SOURCE_EXCLUDE_EXTENSIONS "m;mm" CACHE STRING - "Ignore sources with the listed file extensions from the generated unity source.") - - set (COTIRE_MINIMUM_NUMBER_OF_TARGET_SOURCES "2" CACHE STRING - "Minimum number of sources in target required to enable use of precompiled header.") - - if (NOT DEFINED COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES_INIT) - if (DEFINED COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES) - set (COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES_INIT ${COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES}) - elseif ("${CMAKE_GENERATOR}" MATCHES "JOM|Ninja|Visual Studio") - # enable parallelization for generators that run multiple jobs by default - set (COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES_INIT "-j") - else() - set (COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES_INIT "0") - endif() - endif() - set (COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES "${COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES_INIT}" CACHE STRING - "Maximum number of source files to include in a single unity source file.") - - if (NOT COTIRE_PREFIX_HEADER_FILENAME_SUFFIX) - set (COTIRE_PREFIX_HEADER_FILENAME_SUFFIX "_prefix") - endif() - if (NOT COTIRE_UNITY_SOURCE_FILENAME_SUFFIX) - set (COTIRE_UNITY_SOURCE_FILENAME_SUFFIX "_unity") - endif() - if (NOT COTIRE_INTDIR) - set (COTIRE_INTDIR "cotire") - endif() - if (NOT COTIRE_PCH_ALL_TARGET_NAME) - set (COTIRE_PCH_ALL_TARGET_NAME "all_pch") - endif() - if (NOT COTIRE_UNITY_BUILD_ALL_TARGET_NAME) - set (COTIRE_UNITY_BUILD_ALL_TARGET_NAME "all_unity") - endif() - if (NOT COTIRE_CLEAN_ALL_TARGET_NAME) - set (COTIRE_CLEAN_ALL_TARGET_NAME "clean_cotire") - endif() - if (NOT COTIRE_CLEAN_TARGET_SUFFIX) - set (COTIRE_CLEAN_TARGET_SUFFIX "_clean_cotire") - endif() - if (NOT COTIRE_PCH_TARGET_SUFFIX) - set (COTIRE_PCH_TARGET_SUFFIX "_pch") - endif() - if (MSVC) - # MSVC default PCH memory scaling factor of 100 percent (75 MB) is too small for template heavy C++ code - # use a bigger default factor of 170 percent (128 MB) - if (NOT DEFINED COTIRE_PCH_MEMORY_SCALING_FACTOR) - set (COTIRE_PCH_MEMORY_SCALING_FACTOR "170") - endif() - endif() - if (NOT COTIRE_UNITY_BUILD_TARGET_SUFFIX) - set (COTIRE_UNITY_BUILD_TARGET_SUFFIX "_unity") - endif() - if (NOT DEFINED COTIRE_TARGETS_FOLDER) - set (COTIRE_TARGETS_FOLDER "cotire") - endif() - if (NOT DEFINED COTIRE_UNITY_OUTPUT_DIRECTORY) - if ("${CMAKE_GENERATOR}" MATCHES "Ninja") - # generated Ninja build files do not work if the unity target produces the same output file as the cotired target - set (COTIRE_UNITY_OUTPUT_DIRECTORY "unity") - else() - set (COTIRE_UNITY_OUTPUT_DIRECTORY "") - endif() - endif() - - # define cotire cache variables - - define_property( - CACHED_VARIABLE PROPERTY "COTIRE_ADDITIONAL_PREFIX_HEADER_IGNORE_PATH" - BRIEF_DOCS "Ignore headers from these directories when generating the prefix header." - FULL_DOCS - "The variable can be set to a semicolon separated list of include directories." - "If a header file is found in one of these directories or sub-directories, it will be excluded from the generated prefix header." - "If not defined, defaults to empty list." - ) - - define_property( - CACHED_VARIABLE PROPERTY "COTIRE_ADDITIONAL_PREFIX_HEADER_IGNORE_EXTENSIONS" - BRIEF_DOCS "Ignore includes with the listed file extensions from the generated prefix header." - FULL_DOCS - "The variable can be set to a semicolon separated list of file extensions." - "If a header file extension matches one in the list, it will be excluded from the generated prefix header." - "Includes with an extension in CMAKE__SOURCE_FILE_EXTENSIONS are always ignored." - "If not defined, defaults to inc;inl;ipp." - ) - - define_property( - CACHED_VARIABLE PROPERTY "COTIRE_UNITY_SOURCE_EXCLUDE_EXTENSIONS" - BRIEF_DOCS "Exclude sources with the listed file extensions from the generated unity source." - FULL_DOCS - "The variable can be set to a semicolon separated list of file extensions." - "If a source file extension matches one in the list, it will be excluded from the generated unity source file." - "Source files with an extension in CMAKE__IGNORE_EXTENSIONS are always excluded." - "If not defined, defaults to m;mm." - ) - - define_property( - CACHED_VARIABLE PROPERTY "COTIRE_MINIMUM_NUMBER_OF_TARGET_SOURCES" - BRIEF_DOCS "Minimum number of sources in target required to enable use of precompiled header." - FULL_DOCS - "The variable can be set to an integer > 0." - "If a target contains less than that number of source files, cotire will not enable the use of the precompiled header for the target." - "If not defined, defaults to 2." - ) - - define_property( - CACHED_VARIABLE PROPERTY "COTIRE_MAXIMUM_NUMBER_OF_UNITY_INCLUDES" - BRIEF_DOCS "Maximum number of source files to include in a single unity source file." - FULL_DOCS - "This may be set to an integer >= 0." - "If 0, cotire will only create a single unity source file." - "If a target contains more than that number of source files, cotire will create multiple unity source files for it." - "Can be set to \"-j\" to optimize the count of unity source files for the number of available processor cores." - "Can be set to \"-j jobs\" to optimize the number of unity source files for the given number of simultaneous jobs." - "Is used to initialize the target property COTIRE_UNITY_SOURCE_MAXIMUM_NUMBER_OF_INCLUDES." - "Defaults to \"-j\" for the generators Visual Studio, JOM or Ninja. Defaults to 0 otherwise." - ) - - # define cotire directory properties - - define_property( - DIRECTORY PROPERTY "COTIRE_ENABLE_PRECOMPILED_HEADER" - BRIEF_DOCS "Modify build command of cotired targets added in this directory to make use of the generated precompiled header." - FULL_DOCS - "See target property COTIRE_ENABLE_PRECOMPILED_HEADER." - ) - - define_property( - DIRECTORY PROPERTY "COTIRE_ADD_UNITY_BUILD" - BRIEF_DOCS "Add a new target that performs a unity build for cotired targets added in this directory." - FULL_DOCS - "See target property COTIRE_ADD_UNITY_BUILD." - ) - - define_property( - DIRECTORY PROPERTY "COTIRE_ADD_CLEAN" - BRIEF_DOCS "Add a new target that cleans all cotire generated files for cotired targets added in this directory." - FULL_DOCS - "See target property COTIRE_ADD_CLEAN." - ) - - define_property( - DIRECTORY PROPERTY "COTIRE_PREFIX_HEADER_IGNORE_PATH" - BRIEF_DOCS "Ignore headers from these directories when generating the prefix header." - FULL_DOCS - "See target property COTIRE_PREFIX_HEADER_IGNORE_PATH." - ) - - define_property( - DIRECTORY PROPERTY "COTIRE_PREFIX_HEADER_INCLUDE_PATH" - BRIEF_DOCS "Honor headers from these directories when generating the prefix header." - FULL_DOCS - "See target property COTIRE_PREFIX_HEADER_INCLUDE_PATH." - ) - - define_property( - DIRECTORY PROPERTY "COTIRE_PREFIX_HEADER_INCLUDE_PRIORITY_PATH" - BRIEF_DOCS "Header paths matching one of these directories are put at the top of the prefix header." - FULL_DOCS - "See target property COTIRE_PREFIX_HEADER_INCLUDE_PRIORITY_PATH." - ) - - define_property( - DIRECTORY PROPERTY "COTIRE_UNITY_SOURCE_PRE_UNDEFS" - BRIEF_DOCS "Preprocessor undefs to place in the generated unity source file before the inclusion of each source file." - FULL_DOCS - "See target property COTIRE_UNITY_SOURCE_PRE_UNDEFS." - ) - - define_property( - DIRECTORY PROPERTY "COTIRE_UNITY_SOURCE_POST_UNDEFS" - BRIEF_DOCS "Preprocessor undefs to place in the generated unity source file after the inclusion of each source file." - FULL_DOCS - "See target property COTIRE_UNITY_SOURCE_POST_UNDEFS." - ) - - define_property( - DIRECTORY PROPERTY "COTIRE_UNITY_SOURCE_MAXIMUM_NUMBER_OF_INCLUDES" - BRIEF_DOCS "Maximum number of source files to include in a single unity source file." - FULL_DOCS - "See target property COTIRE_UNITY_SOURCE_MAXIMUM_NUMBER_OF_INCLUDES." - ) - - define_property( - DIRECTORY PROPERTY "COTIRE_UNITY_LINK_LIBRARIES_INIT" - BRIEF_DOCS "Define strategy for setting up the unity target's link libraries." - FULL_DOCS - "See target property COTIRE_UNITY_LINK_LIBRARIES_INIT." - ) - - # define cotire target properties - - define_property( - TARGET PROPERTY "COTIRE_ENABLE_PRECOMPILED_HEADER" INHERITED - BRIEF_DOCS "Modify this target's build command to make use of the generated precompiled header." - FULL_DOCS - "If this property is set to TRUE, cotire will modify the build command to make use of the generated precompiled header." - "Irrespective of the value of this property, cotire will setup custom commands to generate the unity source and prefix header for the target." - "For makefile based generators cotire will also set up a custom target to manually invoke the generation of the precompiled header." - "The target name will be set to this target's name with the suffix _pch appended." - "Inherited from directory." - "Defaults to TRUE." - ) - - define_property( - TARGET PROPERTY "COTIRE_ADD_UNITY_BUILD" INHERITED - BRIEF_DOCS "Add a new target that performs a unity build for this target." - FULL_DOCS - "If this property is set to TRUE, cotire creates a new target of the same type that uses the generated unity source file instead of the target sources." - "Most of the relevant target properties will be copied from this target to the new unity build target." - "Target dependencies and linked libraries have to be manually set up for the new unity build target." - "The unity target name will be set to this target's name with the suffix _unity appended." - "Inherited from directory." - "Defaults to TRUE." - ) - - define_property( - TARGET PROPERTY "COTIRE_ADD_CLEAN" INHERITED - BRIEF_DOCS "Add a new target that cleans all cotire generated files for this target." - FULL_DOCS - "If this property is set to TRUE, cotire creates a new target that clean all files (unity source, prefix header, precompiled header)." - "The clean target name will be set to this target's name with the suffix _clean_cotire appended." - "Inherited from directory." - "Defaults to FALSE." - ) - - define_property( - TARGET PROPERTY "COTIRE_PREFIX_HEADER_IGNORE_PATH" INHERITED - BRIEF_DOCS "Ignore headers from these directories when generating the prefix header." - FULL_DOCS - "The property can be set to a list of directories." - "If a header file is found in one of these directories or sub-directories, it will be excluded from the generated prefix header." - "Inherited from directory." - "If not set, this property is initialized to \${CMAKE_SOURCE_DIR};\${CMAKE_BINARY_DIR}." - ) - - define_property( - TARGET PROPERTY "COTIRE_PREFIX_HEADER_INCLUDE_PATH" INHERITED - BRIEF_DOCS "Honor headers from these directories when generating the prefix header." - FULL_DOCS - "The property can be set to a list of directories." - "If a header file is found in one of these directories or sub-directories, it will be included in the generated prefix header." - "If a header file is both selected by COTIRE_PREFIX_HEADER_IGNORE_PATH and COTIRE_PREFIX_HEADER_INCLUDE_PATH," - "the option which yields the closer relative path match wins." - "Inherited from directory." - "If not set, this property is initialized to the empty list." - ) - - define_property( - TARGET PROPERTY "COTIRE_PREFIX_HEADER_INCLUDE_PRIORITY_PATH" INHERITED - BRIEF_DOCS "Header paths matching one of these directories are put at the top of prefix header." - FULL_DOCS - "The property can be set to a list of directories." - "Header file paths matching one of these directories will be inserted at the beginning of the generated prefix header." - "Header files are sorted according to the order of the directories in the property." - "If not set, this property is initialized to the empty list." - ) - - define_property( - TARGET PROPERTY "COTIRE_UNITY_SOURCE_PRE_UNDEFS" INHERITED - BRIEF_DOCS "Preprocessor undefs to place in the generated unity source file before the inclusion of each target source file." - FULL_DOCS - "This may be set to a semicolon-separated list of preprocessor symbols." - "cotire will add corresponding #undef directives to the generated unit source file before each target source file." - "Inherited from directory." - "Defaults to empty string." - ) - - define_property( - TARGET PROPERTY "COTIRE_UNITY_SOURCE_POST_UNDEFS" INHERITED - BRIEF_DOCS "Preprocessor undefs to place in the generated unity source file after the inclusion of each target source file." - FULL_DOCS - "This may be set to a semicolon-separated list of preprocessor symbols." - "cotire will add corresponding #undef directives to the generated unit source file after each target source file." - "Inherited from directory." - "Defaults to empty string." - ) - - define_property( - TARGET PROPERTY "COTIRE_UNITY_SOURCE_MAXIMUM_NUMBER_OF_INCLUDES" INHERITED - BRIEF_DOCS "Maximum number of source files to include in a single unity source file." - FULL_DOCS - "This may be set to an integer > 0." - "If a target contains more than that number of source files, cotire will create multiple unity build files for it." - "If not set, cotire will only create a single unity source file." - "Inherited from directory." - "Defaults to empty." - ) - - define_property( - TARGET PROPERTY "COTIRE__UNITY_SOURCE_INIT" - BRIEF_DOCS "User provided unity source file to be used instead of the automatically generated one." - FULL_DOCS - "If set, cotire will only add the given file(s) to the generated unity source file." - "If not set, cotire will add all the target source files to the generated unity source file." - "The property can be set to a user provided unity source file." - "Defaults to empty." - ) - - define_property( - TARGET PROPERTY "COTIRE__PREFIX_HEADER_INIT" - BRIEF_DOCS "User provided prefix header file to be used instead of the automatically generated one." - FULL_DOCS - "If set, cotire will add the given header file(s) to the generated prefix header file." - "If not set, cotire will generate a prefix header by tracking the header files included by the unity source file." - "The property can be set to a user provided prefix header file (e.g., stdafx.h)." - "Defaults to empty." - ) - - define_property( - TARGET PROPERTY "COTIRE_UNITY_LINK_LIBRARIES_INIT" INHERITED - BRIEF_DOCS "Define strategy for setting up unity target's link libraries." - FULL_DOCS - "If this property is empty or set to NONE, the generated unity target's link libraries have to be set up manually." - "If this property is set to COPY, the unity target's link libraries will be copied from this target." - "If this property is set to COPY_UNITY, the unity target's link libraries will be copied from this target with considering existing unity targets." - "Inherited from directory." - "Defaults to empty." - ) - - define_property( - TARGET PROPERTY "COTIRE__UNITY_SOURCE" - BRIEF_DOCS "Read-only property. The generated unity source file(s)." - FULL_DOCS - "cotire sets this property to the path of the generated single computation unit source file for the target." - "Defaults to empty string." - ) - - define_property( - TARGET PROPERTY "COTIRE__PREFIX_HEADER" - BRIEF_DOCS "Read-only property. The generated prefix header file." - FULL_DOCS - "cotire sets this property to the full path of the generated language prefix header for the target." - "Defaults to empty string." - ) - - define_property( - TARGET PROPERTY "COTIRE__PRECOMPILED_HEADER" - BRIEF_DOCS "Read-only property. The generated precompiled header file." - FULL_DOCS - "cotire sets this property to the full path of the generated language precompiled header binary for the target." - "Defaults to empty string." - ) - - define_property( - TARGET PROPERTY "COTIRE_UNITY_TARGET_NAME" - BRIEF_DOCS "The name of the generated unity build target corresponding to this target." - FULL_DOCS - "This property can be set to the desired name of the unity target that will be created by cotire." - "If not set, the unity target name will be set to this target's name with the suffix _unity appended." - "After this target has been processed by cotire, the property is set to the actual name of the generated unity target." - "Defaults to empty string." - ) - - # define cotire source properties - - define_property( - SOURCE PROPERTY "COTIRE_EXCLUDED" - BRIEF_DOCS "Do not modify source file's build command." - FULL_DOCS - "If this property is set to TRUE, the source file's build command will not be modified to make use of the precompiled header." - "The source file will also be excluded from the generated unity source file." - "Source files that have their COMPILE_FLAGS property set will be excluded by default." - "Defaults to FALSE." - ) - - define_property( - SOURCE PROPERTY "COTIRE_DEPENDENCY" - BRIEF_DOCS "Add this source file to dependencies of the automatically generated prefix header file." - FULL_DOCS - "If this property is set to TRUE, the source file is added to dependencies of the generated prefix header file." - "If the file is modified, cotire will re-generate the prefix header source upon build." - "Defaults to FALSE." - ) - - define_property( - SOURCE PROPERTY "COTIRE_UNITY_SOURCE_PRE_UNDEFS" - BRIEF_DOCS "Preprocessor undefs to place in the generated unity source file before the inclusion of this source file." - FULL_DOCS - "This may be set to a semicolon-separated list of preprocessor symbols." - "cotire will add corresponding #undef directives to the generated unit source file before this file is included." - "Defaults to empty string." - ) - - define_property( - SOURCE PROPERTY "COTIRE_UNITY_SOURCE_POST_UNDEFS" - BRIEF_DOCS "Preprocessor undefs to place in the generated unity source file after the inclusion of this source file." - FULL_DOCS - "This may be set to a semicolon-separated list of preprocessor symbols." - "cotire will add corresponding #undef directives to the generated unit source file after this file is included." - "Defaults to empty string." - ) - - define_property( - SOURCE PROPERTY "COTIRE_START_NEW_UNITY_SOURCE" - BRIEF_DOCS "Start a new unity source file which includes this source file as the first one." - FULL_DOCS - "If this property is set to TRUE, cotire will complete the current unity file and start a new one." - "The new unity source file will include this source file as the first one." - "This property essentially works as a separator for unity source files." - "Defaults to FALSE." - ) - - define_property( - SOURCE PROPERTY "COTIRE_TARGET" - BRIEF_DOCS "Read-only property. Mark this source file as cotired for the given target." - FULL_DOCS - "cotire sets this property to the name of target, that the source file's build command has been altered for." - "Defaults to empty string." - ) - - message (STATUS "cotire ${COTIRE_CMAKE_MODULE_VERSION} loaded.") - -endif() diff --git a/configurator/CMakeLists.txt b/configurator/CMakeLists.txt index aea66ff63..e6ca006b1 100644 --- a/configurator/CMakeLists.txt +++ b/configurator/CMakeLists.txt @@ -13,5 +13,3 @@ if(VEYON_BUILD_LINUX) xdg_install(${CMAKE_CURRENT_BINARY_DIR}/data/veyon-configurator.desktop ${CMAKE_CURRENT_SOURCE_DIR}/data/veyon-configurator.xpm ${CMAKE_CURRENT_SOURCE_DIR}/data/veyon-configurator.png ${CMAKE_CURRENT_SOURCE_DIR}/data/veyon-configurator.svg) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/data/io.veyon.veyon-configurator.policy DESTINATION ${CMAKE_INSTALL_PREFIX}/share/polkit-1/actions) endif() - -cotire_veyon(veyon-configurator) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index e6c54ebd9..e49503558 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -29,6 +29,8 @@ endif() add_library(veyon-core SHARED ${veyoncore_SOURCES} ${core_RESOURCES} ${libvncclient_SOURCES}) +target_compile_definitions(veyon-core PRIVATE XK_KOREAN) + set_default_target_properties(veyon-core) target_compile_options(veyon-core PRIVATE ${VEYON_COMPILE_OPTIONS} -Wno-parentheses) @@ -96,4 +98,10 @@ if(VEYON_BUILD_ANDROID) target_link_libraries(veyon-core Qt5::AndroidExtras) endif() -cotire_veyon(veyon-core) +if(WITH_PCH) + target_precompile_headers(veyon-core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") + + add_library(veyon-pch STATIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") + target_link_libraries(veyon-pch Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) + target_precompile_headers(veyon-pch PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") +endif() diff --git a/core/src/Cotire.h b/core/src/PrecompiledHeader.h similarity index 77% rename from core/src/Cotire.h rename to core/src/PrecompiledHeader.h index c0ccb3af9..3eec61caa 100644 --- a/core/src/Cotire.h +++ b/core/src/PrecompiledHeader.h @@ -1,11 +1,18 @@ #pragma once +#ifdef WIN32 +#include +#include +#endif + +#ifdef __cplusplus #ifdef QT_WIDGETS_LIB #include #include #include #include #endif +#include #include #include #include @@ -19,3 +26,4 @@ #ifdef QT_NETWORK_LIB #include #endif +#endif diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index dfe703fa3..197789026 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -22,9 +22,8 @@ * */ -#define XK_KOREAN -#include "rfb/keysym.h" -#include "rfb/rfbproto.h" +#include +#include #include #include diff --git a/master/CMakeLists.txt b/master/CMakeLists.txt index 92eda0617..04aa660d3 100644 --- a/master/CMakeLists.txt +++ b/master/CMakeLists.txt @@ -26,5 +26,3 @@ make_graphical_app(veyon-master) if(VEYON_BUILD_LINUX) xdg_install(${CMAKE_CURRENT_BINARY_DIR}/data/veyon-master.desktop ${CMAKE_CURRENT_SOURCE_DIR}/data/veyon-master.xpm ${CMAKE_CURRENT_SOURCE_DIR}/data/veyon-master.png ${CMAKE_CURRENT_SOURCE_DIR}/data/veyon-master.svg) endif() - -cotire_veyon(veyon-master) diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index 10e556316..178f41883 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -30,4 +30,3 @@ set_target_properties(ldap-common PROPERTIES LINK_FLAGS "-Wl,-no-undefined") if(NOT WITH_CORE_ONLY) install(TARGETS ldap-common DESTINATION ${VEYON_LIB_DIR}) endif() -cotire_veyon(ldap-common) diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index 3e3e3276e..1005fd43c 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -43,5 +43,3 @@ set_target_properties(kldap-light PROPERTIES LINK_FLAGS "-Wl,-no-undefined") if(NOT WITH_CORE_ONLY) install(TARGETS kldap-light DESTINATION ${VEYON_LIB_DIR}) endif() -cotire_veyon(kldap-light) - diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index 0922c68f8..e0dfd1b7f 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -9,10 +9,10 @@ pkg_check_modules(fakekey libfakekey) include(BuildVeyonPlugin) if(NOT fakekey_FOUND) -set(libfakekey_SOURCES ${libfakekey_DIR}/src/libfakekey.c) -set_source_files_properties(${libfakekey_SOURCES} PROPERTIES - COMPILE_FLAGS "-Wno-deprecated-declarations -Wno-pointer-sign" - COTIRE_EXCLUDED TRUE) + set(libfakekey_SOURCES ${libfakekey_DIR}/src/libfakekey.c) + set_source_files_properties(${libfakekey_SOURCES} PROPERTIES + COMPILE_FLAGS "-Wno-deprecated-declarations -Wno-pointer-sign" + SKIP_PRECOMPILE_HEADERS TRUE) endif() build_veyon_plugin(linux-platform @@ -54,6 +54,8 @@ build_veyon_plugin(linux-platform ${libfakekey_SOURCES} ) +set_source_files_properties(LinuxCoreFunctions.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) + target_include_directories(linux-platform PRIVATE ../common ${libfakekey_DIR} diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index cafba065a..c997db744 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -25,6 +25,7 @@ #pragma once #include +#include #include "PlatformCoreFunctions.h" diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index d3fd86b52..1e532dad6 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -2,6 +2,8 @@ include(BuildVeyonPlugin) add_definitions(-DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0600) +set(WITH_PCH OFF) + build_veyon_plugin(windows-platform WindowsPlatformPlugin.cpp WindowsPlatformConfigurationPage.h @@ -61,3 +63,4 @@ target_include_directories(windows-platform PRIVATE target_link_libraries(windows-platform -lwtsapi32 -lnetapi32 -luserenv -linterception) target_compile_definitions(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) target_compile_options(windows-platform PRIVATE "-Wno-unknown-pragmas") +set_source_files_properties(WindowsNetworkFunctions.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index f921370f0..b3482ac45 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -70,6 +70,8 @@ set(ultravnc_C_SOURCES ${ultravnc_DIR}/winvnc/winvnc/vncauth.c ) +set(WITH_PCH OFF) + build_veyon_plugin(builtin-ultravnc-server BuiltinUltraVncServer.cpp LogoffEventFilter.cpp diff --git a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt index 9f5f2de85..223221cb8 100644 --- a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt @@ -5,10 +5,13 @@ add_custom_command(OUTPUT ${VH_WINRC} -o${VH_WINRC} -i${ultravnc_DIR}/winvnc/vnchooks/vnchooks.rc) -add_library(vnchooks MODULE - ${ultravnc_DIR}/winvnc/vnchooks/VNCHooks.cpp - ${ultravnc_DIR}/winvnc/vnchooks/SharedData.cpp - ${VH_WINRC}) +set(vnchooks_SOURCES + ${ultravnc_DIR}/winvnc/vnchooks/VNCHooks.cpp + ${ultravnc_DIR}/winvnc/vnchooks/SharedData.cpp +) + +add_library(vnchooks MODULE ${vnchooks_SOURCES} ${VH_WINRC}) +set_source_files_properties(${vnchooks_SOURCES} PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) target_compile_options(vnchooks PRIVATE ${VEYON_COMPILE_OPTIONS}) set_default_target_properties(vnchooks) set_target_properties(vnchooks PROPERTIES PREFIX "") diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 174c3ff37..bd30936ce 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -200,10 +200,12 @@ set(x11vnc_SOURCES x11vnc-veyon.c ${x11vnc_DIR}/src/uinput.c ) -set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-format -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros" COTIRE_EXCLUDED TRUE) +set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-format -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros") endif() +set(WITH_PCH OFF) + build_veyon_plugin(builtin-x11vnc-server BuiltinX11VncServer.cpp X11VncConfigurationWidget.cpp diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index a18d18a6d..fd54bad61 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -14,8 +14,6 @@ target_link_libraries(veyon-server Qt5::Widgets ) -cotire_veyon(veyon-server) - if(VEYON_BUILD_ANDROID) set(CMAKE_ANDROID_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") androiddeployqt("veyon-server" "${ANDROID_ADDITIONAL_FIND_ROOT_PATH};${CMAKE_BINARY_DIR}/core;${ANDROID_INSTALL_DIR}") diff --git a/worker/CMakeLists.txt b/worker/CMakeLists.txt index e0d422104..f4c00ff48 100644 --- a/worker/CMakeLists.txt +++ b/worker/CMakeLists.txt @@ -7,5 +7,3 @@ build_veyon_application(veyon-worker ${worker_SOURCES}) add_windows_resource(veyon-worker) make_graphical_app(veyon-worker) - -cotire_veyon(veyon-worker) From aacf84ec70571ca9d7531b7b29cc9012b3b3e22a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 12 Feb 2021 15:49:17 +0100 Subject: [PATCH 0795/1765] CI: add Fedora 33 builds Closes #716. --- .ci/linux.fedora.33/Dockerfile | 18 ++++++++++++++++++ .ci/linux.fedora.33/script.sh | 6 ++++++ .travis.yml | 1 + 3 files changed, 25 insertions(+) create mode 100644 .ci/linux.fedora.33/Dockerfile create mode 100755 .ci/linux.fedora.33/script.sh diff --git a/.ci/linux.fedora.33/Dockerfile b/.ci/linux.fedora.33/Dockerfile new file mode 100644 index 000000000..aed1c1d7c --- /dev/null +++ b/.ci/linux.fedora.33/Dockerfile @@ -0,0 +1,18 @@ +FROM fedora:33 +MAINTAINER Tobias Junghans + +RUN \ + yum install -y git gcc-c++ make cmake rpm-build fakeroot \ + qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel \ + libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ + libfakekey-devel \ + libjpeg-turbo-devel \ + zlib-devel \ + libpng-devel \ + openssl-devel \ + pam-devel \ + procps-devel \ + lzo-devel \ + qca-qt5-devel qca-qt5-ossl \ + cyrus-sasl-devel \ + openldap-devel diff --git a/.ci/linux.fedora.33/script.sh b/.ci/linux.fedora.33/script.sh new file mode 100755 index 000000000..71ab48097 --- /dev/null +++ b/.ci/linux.fedora.33/script.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -e + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-rpm.sh $1 $2 "fc31" diff --git a/.travis.yml b/.travis.yml index 755ca44b5..2cb94b281 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,7 @@ matrix: - env: TARGET_OS=debian.stretch - env: TARGET_OS=debian.buster - env: TARGET_OS=fedora.32 + - env: TARGET_OS=fedora.33 - env: TARGET_OS=opensuse.15.2 - env: TARGET_OS=ubuntu.bionic - env: TARGET_OS=ubuntu.focal From 85761b63d6034fbc51e185910ed72f3127606bc0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 12 Feb 2021 15:51:30 +0100 Subject: [PATCH 0796/1765] HostAddress: don't return incomplete FQDN with empty local domain --- core/src/HostAddress.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index 2ccc711c3..135e343fa 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -161,7 +161,10 @@ QString HostAddress::localFQDN() switch( type ) { case Type::HostName: - return localHostName + QStringLiteral( "." ) + QHostInfo::localDomainName(); + if( QHostInfo::localDomainName().isEmpty() == false ) + { + return localHostName + QStringLiteral( "." ) + QHostInfo::localDomainName(); + } case Type::FullyQualifiedDomainName: return localHostName; From 0ec492d02891a7540c6a97e133ac0d67e5a74f8d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 12 Feb 2021 15:53:43 +0100 Subject: [PATCH 0797/1765] HostAddress: use tryConvert() in localFQDN() --- core/src/HostAddress.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index 135e343fa..73ae08d49 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -170,12 +170,11 @@ QString HostAddress::localFQDN() return localHostName; default: + vWarning() << "Could not determine local host name:" << localHostName; break; } - vWarning() << "Could not determine local host name:" << localHostName; - - return HostAddress( localHostName ).convert( Type::FullyQualifiedDomainName ); + return HostAddress( localHostName ).tryConvert( Type::FullyQualifiedDomainName ); } From 16c3227e79c58c10ba8ab956e9b3d3f1ceb9c87c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 12 Feb 2021 15:54:11 +0100 Subject: [PATCH 0798/1765] HostAddress: return original value on equal type --- core/src/HostAddress.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index 73ae08d49..bdc25f2f3 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -253,8 +253,10 @@ QString HostAddress::toHostName( HostAddress::Type type, const QString& address return fqdnToHostName( hostInfo.hostName() ); } - case Type::Invalid: case Type::HostName: + return address; + + case Type::Invalid: break; } @@ -287,8 +289,10 @@ QString HostAddress::toFQDN( HostAddress::Type type, const QString& address ) return hostInfo.hostName(); } - case Type::Invalid: case Type::FullyQualifiedDomainName: + return address; + + case Type::Invalid: break; } From e16805e46660b38c536a414c0c70c3af1fd1da9b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 12 Feb 2021 16:19:17 +0100 Subject: [PATCH 0799/1765] CI: disable precompiled headers on Fedora 33 There's a bug in cmake 3.18 causing AUTOMOC and precompiled headers not working properly: https://gitlab.kitware.com/cmake/cmake/-/issues/20980 https://gitlab.kitware.com/cmake/cmake/-/issues/20968 --- .ci/linux.fedora.33/script.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.ci/linux.fedora.33/script.sh b/.ci/linux.fedora.33/script.sh index 71ab48097..8b7241830 100755 --- a/.ci/linux.fedora.33/script.sh +++ b/.ci/linux.fedora.33/script.sh @@ -2,5 +2,7 @@ set -e +export CMAKE_FLAGS="-DWITH_PCH=OFF" + $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "fc31" From a9de0484b473670d78d9cfdade51473c1f1b7692 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Feb 2021 09:18:09 +0100 Subject: [PATCH 0800/1765] CCI: make updateActiveFeatures() public --- core/src/ComputerControlInterface.cpp | 36 +++++++++++++-------------- core/src/ComputerControlInterface.h | 3 ++- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index ed6d905a4..3c1b0a02a 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -223,6 +223,24 @@ void ComputerControlInterface::setDesignatedModeFeature( Feature::Uid designated +void ComputerControlInterface::updateActiveFeatures() +{ + lock(); + + if( m_vncConnection && m_connection && state() == State::Connected ) + { + VeyonCore::builtinFeatures().featureControl().queryActiveFeatures( { weakPointer() } ); + } + else + { + setActiveFeatures( {} ); + } + + unlock(); +} + + + void ComputerControlInterface::sendFeatureMessage( const FeatureMessage& featureMessage, bool wake ) { if( m_connection && m_connection->isConnected() ) @@ -356,24 +374,6 @@ void ComputerControlInterface::updateUser() -void ComputerControlInterface::updateActiveFeatures() -{ - lock(); - - if( m_vncConnection && m_connection && state() == State::Connected ) - { - VeyonCore::builtinFeatures().featureControl().queryActiveFeatures( { weakPointer() } ); - } - else - { - setActiveFeatures( {} ); - } - - unlock(); -} - - - void ComputerControlInterface::handleFeatureMessage( const FeatureMessage& message ) { Q_EMIT featureMessageReceived( message, weakPointer() ); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index dcc2b3820..c7c3bf8ec 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -137,6 +137,8 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void setDesignatedModeFeature( Feature::Uid designatedModeFeature ); + void updateActiveFeatures(); + void sendFeatureMessage( const FeatureMessage& featureMessage, bool wake ); bool isMessageQueueEmpty(); @@ -154,7 +156,6 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void updateState(); void updateUser(); - void updateActiveFeatures(); void handleFeatureMessage( const FeatureMessage& message ); From 4ccfb28918bce51b2c5f14eee81001d3df5909ba Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Feb 2021 09:18:56 +0100 Subject: [PATCH 0801/1765] FeatureManager: add updateActiveFeatures() --- core/src/FeatureManager.cpp | 10 ++++++++++ core/src/FeatureManager.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 54add9bb9..688467572 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -168,6 +168,16 @@ void FeatureManager::stopFeature( VeyonMasterInterface& master, +void FeatureManager::updateActiveFeatures( const ComputerControlInterfaceList& computerControlInterfaces ) const +{ + for( const auto& controlInterface : computerControlInterfaces ) + { + controlInterface->updateActiveFeatures(); + } +} + + + bool FeatureManager::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message ) const { diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index e2a350ab9..ba2b73216 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -64,6 +64,8 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) const; + void updateActiveFeatures( const ComputerControlInterfaceList& computerControlInterfaces ) const; + bool handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message ) const; bool handleFeatureMessage( VeyonServerInterface& server, From 9f82b383f706f94a060d2f691f75430271e0d065 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Feb 2021 09:23:55 +0100 Subject: [PATCH 0802/1765] FeatureManager: update active features on change Whenever controlling/starting/stopping a feature, also request an update of active features. --- core/src/FeatureManager.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 688467572..f0c312068 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -120,6 +120,8 @@ void FeatureManager::controlFeature( Feature::Uid featureUid, { featureInterface->controlFeature( featureUid, operation, arguments, computerControlInterfaces ); } + + updateActiveFeatures( computerControlInterfaces ); } @@ -142,6 +144,8 @@ void FeatureManager::startFeature( VeyonMasterInterface& master, controlInterface->setDesignatedModeFeature( feature.uid() ); } } + + updateActiveFeatures( computerControlInterfaces ); } @@ -164,6 +168,8 @@ void FeatureManager::stopFeature( VeyonMasterInterface& master, controlInterface->setDesignatedModeFeature( Feature::Uid() ); } } + + updateActiveFeatures( computerControlInterfaces ); } From 99667b3d6af6009df8c499734f588671ac931591 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Feb 2021 09:26:14 +0100 Subject: [PATCH 0803/1765] CCI: simplify setDesignatedModeFeature() It's up to the caller to also request an update of active features when setting the designated mode feature. --- core/src/ComputerControlInterface.cpp | 9 --------- core/src/ComputerControlInterface.h | 6 +++++- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 3c1b0a02a..27186ccdf 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -214,15 +214,6 @@ void ComputerControlInterface::setActiveFeatures( const FeatureUidList& activeFe -void ComputerControlInterface::setDesignatedModeFeature( Feature::Uid designatedModeFeature ) -{ - m_designatedModeFeature = designatedModeFeature; - - updateActiveFeatures(); -} - - - void ComputerControlInterface::updateActiveFeatures() { lock(); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index c7c3bf8ec..af37ed938 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -125,6 +125,11 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_designatedModeFeature; } + void setDesignatedModeFeature( Feature::Uid designatedModeFeature ) + { + m_designatedModeFeature = designatedModeFeature; + } + const QStringList& groups() const { return m_groups; @@ -135,7 +140,6 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab m_groups = groups; } - void setDesignatedModeFeature( Feature::Uid designatedModeFeature ); void updateActiveFeatures(); From 2d795ea0d7bd4c7409a49aaf50981dac2775a8f2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 19 Feb 2021 15:23:08 +0100 Subject: [PATCH 0804/1765] ScreenshotManagementPanel: use expanded path for FS watcher --- master/src/ScreenshotManagementPanel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ScreenshotManagementPanel.cpp b/master/src/ScreenshotManagementPanel.cpp index 95f1e1c06..9baa60d80 100644 --- a/master/src/ScreenshotManagementPanel.cpp +++ b/master/src/ScreenshotManagementPanel.cpp @@ -43,7 +43,7 @@ ScreenshotManagementPanel::ScreenshotManagementPanel( QWidget *parent ) : VeyonCore::filesystem().ensurePathExists( VeyonCore::config().screenshotDirectory() ); - m_fsWatcher.addPath( VeyonCore::config().screenshotDirectory() ); + m_fsWatcher.addPath( VeyonCore::filesystem().screenshotDirectoryPath() ); connect( &m_fsWatcher, &QFileSystemWatcher::directoryChanged, this, &ScreenshotManagementPanel::updateModel ); m_reloadTimer.setInterval( FsModelResetDelay ); From 9aafc0b50ab55ee364fe7de21b50af6563eaf65c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Feb 2021 17:53:16 +0100 Subject: [PATCH 0805/1765] VncConnection: improve parsing port number for IPv6 Handle more cases by using extensive regex-based heuristics. --- core/src/VncConnection.cpp | 43 +++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 9058a516a..0993dd8bc 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include "PlatformNetworkFunctions.h" @@ -268,26 +269,30 @@ void VncConnection::setHost( const QString& host ) QMutexLocker locker( &m_globalMutex ); m_host = host; - // is IPv6-mapped IPv4 address? - QRegExp rx( QStringLiteral( "::[fF]{4}:(\\d+.\\d+.\\d+.\\d+)" ) ); - if( rx.indexIn( m_host ) == 0 ) - { - // then use plain IPv4 address as libvncclient cannot handle - // IPv6-mapped IPv4 addresses on Windows properly - m_host = rx.cap( 1 ); - } - else if( m_host == QLatin1String( "::1" ) ) - { - m_host = QHostAddress( QHostAddress::LocalHost ).toString(); - } - else if( m_host.count( QLatin1Char(':') ) == 1 ) - { - // hostname + port number? - QRegExp rx2( QStringLiteral("(.*[^:]):(\\d+)$") ); - if( rx2.indexIn( m_host ) == 0 ) + QRegularExpressionMatch match; + if( + // if IPv6-mapped IPv4 address use plain IPv4 address as libvncclient cannot handle IPv6-mapped IPv4 addresses on Windows properly + ( match = QRegularExpression( QStringLiteral("^::[fF]{4}:(\\d+.\\d+.\\d+.\\d+)$") ).match( m_host ) ).hasMatch() || + ( match = QRegularExpression( QStringLiteral("^::[fF]{4}:(\\d+.\\d+.\\d+.\\d+):(\\d+)$") ).match( m_host ) ).hasMatch() || + ( match = QRegularExpression( QStringLiteral("^\\[::[fF]{4}:(\\d+.\\d+.\\d+.\\d+)\\]:(\\d+)$") ).match( m_host ) ).hasMatch() || + // any other IPv6 address with port number + ( match = QRegularExpression( QStringLiteral("^\\[([0-9a-fA-F:]+)\\]:(\\d+)$") ).match( m_host ) ).hasMatch() || + // irregular IPv6 address + port number specification where port number can be identified if > 9999 + ( match = QRegularExpression( QStringLiteral("^([0-9a-fA-F:]+):(\\d{5})$"), QRegularExpression::InvertedGreedinessOption ).match( m_host ) ).hasMatch() || + // any other notation with trailing port number + ( match = QRegularExpression( QStringLiteral("^([^:]+):(\\d+)$") ).match( m_host ) ).hasMatch() + ) + { + const auto matchedHost = match.captured( 1 ); + if( matchedHost.isEmpty() == false ) + { + m_host = matchedHost; + } + + const auto port = match.captured( 2 ).toInt(); + if( port > 0 ) { - m_host = rx2.cap( 1 ); - m_port = rx2.cap( 2 ).toInt(); + m_port = port; } } } From 65e04e43a952df2fd1311ff864bafc8971afe95a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:40:57 +0100 Subject: [PATCH 0806/1765] Configurator: fix page index and margins --- configurator/src/MainWindow.ui | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/configurator/src/MainWindow.ui b/configurator/src/MainWindow.ui index 072223951..9d3410713 100644 --- a/configurator/src/MainWindow.ui +++ b/configurator/src/MainWindow.ui @@ -119,18 +119,18 @@ 0 - 0 + 10 0 - 0 + 10 - 1 + 0 From 60a995db3908649894225ea53bf89bbb4c2541c6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:09:09 +0100 Subject: [PATCH 0807/1765] DemoServerConnection: fix memory leak on error --- plugins/demo/DemoServerConnection.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 45149ee6b..065df241c 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -60,6 +60,8 @@ void DemoServerConnection::run() { vCritical() << "failed to set socket descriptor"; delete m_socket; + m_socket = nullptr; + deleteLater(); return; } From c21969c7a817e6095c396b58d29fcff1602bfe56 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:09:37 +0100 Subject: [PATCH 0808/1765] DemoServerConnection: delete socket directly --- plugins/demo/DemoServerConnection.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 065df241c..4a4f49784 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -76,8 +76,9 @@ void DemoServerConnection::run() exec(); delete m_serverProtocol; + delete m_socket; - m_socket->deleteLater(); + m_socket = nullptr; deleteLater(); } From 47e28a660e9e63fc862abaed2bf9d46d34db4412 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:09:54 +0100 Subject: [PATCH 0809/1765] DemoServer: add debug messages --- plugins/demo/DemoServer.cpp | 4 ++++ plugins/demo/DemoServerConnection.cpp | 2 ++ 2 files changed, 6 insertions(+) diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 6276cc324..6ffd82de8 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -115,6 +115,8 @@ void DemoServer::lockDataForRead() void DemoServer::incomingConnection( qintptr socketDescriptor ) { + vDebug() << socketDescriptor; + m_pendingConnections.append( socketDescriptor ); if( m_vncClientProtocol->state() != VncClientProtocol::State::Running ) @@ -278,6 +280,8 @@ qint64 DemoServer::framebufferUpdateMessageQueueSize() const void DemoServer::start() { + vDebug(); + setVncServerPixelFormat(); setVncServerEncodings(); diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 4a4f49784..795d4865a 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -54,6 +54,8 @@ DemoServerConnection::DemoServerConnection( DemoServer* demoServer, void DemoServerConnection::run() { + vDebug() << m_socketDescriptor; + m_socket = new QTcpSocket; if( m_socket->setSocketDescriptor( m_socketDescriptor ) == false ) From a2315c87c59bf97e9097f075868ba2751be6fb7b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:10:16 +0100 Subject: [PATCH 0810/1765] DemoServer: improve code style --- plugins/demo/DemoServer.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 6ffd82de8..bc0c91e27 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -119,12 +119,10 @@ void DemoServer::incomingConnection( qintptr socketDescriptor ) m_pendingConnections.append( socketDescriptor ); - if( m_vncClientProtocol->state() != VncClientProtocol::State::Running ) + if( m_vncClientProtocol->state() == VncClientProtocol::State::Running ) { - return; + acceptPendingConnections(); } - - acceptPendingConnections(); } From 3cba92a95e4fc63dfb08d9a8fd2a9b1ff4f6c4f9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:11:18 +0100 Subject: [PATCH 0811/1765] VeyonServerInterface: add vncServerBasePort() --- core/src/VeyonServerInterface.h | 2 ++ server/src/ComputerControlServer.h | 4 ++++ server/src/VncServer.cpp | 14 +++++++++++--- server/src/VncServer.h | 1 + 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index 41572445c..50bdb1a08 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -39,4 +39,6 @@ class VeyonServerInterface virtual FeatureWorkerManager& featureWorkerManager() = 0; virtual bool sendFeatureMessageReply( const MessageContext& context, const FeatureMessage& reply ) = 0; + virtual int vncServerBasePort() const = 0; + }; diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index f862cc9d8..599b5c375 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -69,6 +69,10 @@ class ComputerControlServer : public QObject, VncProxyConnectionFactory, VeyonSe return m_featureWorkerManager; } + int vncServerBasePort() const override + { + return m_vncServer.serverBasePort(); + } private: void checkForIncompleteAuthentication( VncServerClient* client ); diff --git a/server/src/VncServer.cpp b/server/src/VncServer.cpp index 756f3655a..5506b2ac0 100644 --- a/server/src/VncServer.cpp +++ b/server/src/VncServer.cpp @@ -105,14 +105,22 @@ void VncServer::prepare() -int VncServer::serverPort() const +int VncServer::serverBasePort() const { + if( m_pluginInterface && m_pluginInterface->configuredServerPort() > 0 ) { - return m_pluginInterface->configuredServerPort() + VeyonCore::sessionId(); + return m_pluginInterface->configuredServerPort(); } - return VeyonCore::config().vncServerPort() + VeyonCore::sessionId(); + return VeyonCore::config().vncServerPort(); +} + + + +int VncServer::serverPort() const +{ + return serverBasePort() + VeyonCore::sessionId(); } diff --git a/server/src/VncServer.h b/server/src/VncServer.h index e5d9a4f74..195f5b4cd 100644 --- a/server/src/VncServer.h +++ b/server/src/VncServer.h @@ -42,6 +42,7 @@ class VncServer : public QThread void prepare(); + int serverBasePort() const; int serverPort() const; Password password() const; From 8b60b4f49f43c570a7178bfcfc80485ad2e44de5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:45:37 +0100 Subject: [PATCH 0812/1765] Demo: fix VNC server port issue When using an external VNC server listening at VNC default ports (e.g. 5900), the demo server must not connect to the port number normally used by the internal VNC server. --- plugins/demo/DemoFeaturePlugin.cpp | 15 ++++++++------- plugins/demo/DemoFeaturePlugin.h | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index beca888cc..83587594f 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -167,7 +167,7 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur return true; } - auto vncServerPort = VeyonCore::config().vncServerPort(); + auto vncServerPortOffset = 0; auto demoServerPort = VeyonCore::config().demoServerPort(); const auto demoServerInterface = master.selectedComputerControlInterfaces().first(); @@ -177,14 +177,14 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur if( primaryServerPort > 0 ) { const auto sessionId = primaryServerPort - VeyonCore::config().veyonServerPort(); - vncServerPort += sessionId; + vncServerPortOffset = sessionId; demoServerPort += sessionId; } // start demo server controlFeature( m_demoServerFeature.uid(), Operation::Start, { - { argToString(Argument::VncServerPort), vncServerPort }, + { argToString(Argument::VncServerPortOffset), vncServerPortOffset }, { argToString(Argument::DemoServerPort), demoServerPort }, }, master.selectedComputerControlInterfaces() ); @@ -266,7 +266,8 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonServerInterface& server, server.featureWorkerManager(). sendMessageToManagedSystemWorker( FeatureMessage{ message } - .addArgument( Argument::VncServerPassword, VeyonCore::authenticationCredentials().internalVncServerPassword().toByteArray() ) ); + .addArgument( Argument::VncServerPassword, VeyonCore::authenticationCredentials().internalVncServerPassword().toByteArray() ) + .addArgument( Argument::VncServerPort, server.vncServerBasePort() + message.argument(Argument::VncServerPortOffset).toInt() ) ); } else if( message.command() != StopDemoServer || server.featureWorkerManager().isWorkerRunning( m_demoServerFeature.uid() ) ) @@ -522,14 +523,14 @@ bool DemoFeaturePlugin::controlDemoServer( Operation operation, const QVariantMa { const auto demoServerPort = arguments.value( argToString(Argument::DemoServerPort), VeyonCore::config().demoServerPort() + VeyonCore::sessionId() ).toInt(); - const auto vncServerPort = arguments.value( argToString(Argument::VncServerPort), - VeyonCore::config().vncServerPort() + VeyonCore::sessionId() ).toInt(); + const auto vncServerPortOffset = arguments.value( argToString(Argument::VncServerPortOffset), + VeyonCore::sessionId() ).toInt(); const auto demoAccessToken = arguments.value( argToString(Argument::DemoAccessToken), accessToken().toByteArray() ).toByteArray(); sendFeatureMessage( FeatureMessage{ m_demoServerFeature.uid(), StartDemoServer } .addArgument( Argument::DemoAccessToken, demoAccessToken ) - .addArgument( Argument::VncServerPort, vncServerPort ) + .addArgument( Argument::VncServerPortOffset, vncServerPortOffset ) .addArgument( Argument::DemoServerPort, demoServerPort ), computerControlInterfaces ); diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index cc16d08fc..35e4e9806 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -56,7 +56,8 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf ViewportX, ViewportY, ViewportWidth, - ViewportHeight + ViewportHeight, + VncServerPortOffset }; Q_ENUM(Argument) From 652f05d695435ca94be302b0049e97cf9875f905 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:15:02 +0100 Subject: [PATCH 0813/1765] Demo: fix viewport for negative screen coordinates On Windows, screens can have negative coordinates when configured to be placed in non-default order (i.e. screen 2 is left of screen 1). The viewport calculation has to be fixed accordingly by using the minimum coordinates as zero point. --- plugins/demo/DemoFeaturePlugin.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 83587594f..42ff69c32 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -505,10 +505,17 @@ QRect DemoFeaturePlugin::viewportFromScreenSelection() const return {}; } + QPoint minimumScreenPosition{}; + for( const auto* screen : m_screens ) + { + minimumScreenPosition.setX( qMin( minimumScreenPosition.x(), screen->geometry().x() ) ); + minimumScreenPosition.setY( qMin( minimumScreenPosition.y(), screen->geometry().y() ) ); + } + const auto screen = m_screens.value( m_screenSelection - 1 ); if( screen ) { - return screen->geometry(); + return screen->geometry().translated( -minimumScreenPosition ); } return {}; From 0b735f4ad5b9681dc2db4c3576632a25ee801c0b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:17:08 +0100 Subject: [PATCH 0814/1765] UltraVncConfigWidget: add flag to label for advanced option --- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp | 1 + .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.ui | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp index cb7544478..ab7bafd32 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp @@ -36,6 +36,7 @@ UltraVncConfigurationWidget::UltraVncConfigurationWidget( UltraVncConfiguration& ui->setupUi( this ); Configuration::UiMapping::setFlags( ui->ultraVncMaxCpu, Configuration::Property::Flag::Advanced ); + Configuration::UiMapping::setFlags( ui->ultraVncMaxCpuLabel, Configuration::Property::Flag::Advanced ); FOREACH_ULTRAVNC_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); FOREACH_ULTRAVNC_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.ui b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.ui index 3c009ec7d..c862e5fb0 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.ui +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.ui @@ -19,7 +19,7 @@ 0 - + Maximum CPU usage From a684c7fab94f757e547f5f6223b5a3f907bb796b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:30:47 +0100 Subject: [PATCH 0815/1765] Demo: explicitely stop client when stopping demo feature Fixes demo client not being stopped when stopping demo via context menu. --- plugins/demo/DemoFeaturePlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 42ff69c32..405a1d421 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -228,7 +228,7 @@ bool DemoFeaturePlugin::stopFeature( VeyonMasterInterface& master, const Feature feature == m_shareOwnScreenWindowFeature || feature == m_shareOwnScreenFullScreenFeature || feature == m_shareUserScreenWindowFeature || feature == m_shareUserScreenFullScreenFeature ) { - controlFeature( feature.uid(), Operation::Stop, {}, computerControlInterfaces ); + controlFeature( m_demoClientWindowFeature.uid(), Operation::Stop, {}, computerControlInterfaces ); controlFeature( m_demoClientWindowFeature.uid(), Operation::Stop, {}, { master.localSessionControlInterface().weakPointer() } ); From 70e58f21d88f651618e98de4588879d0a7312e82 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:33:11 +0100 Subject: [PATCH 0816/1765] FeatureManager: resolve feature name for debug messages --- core/src/FeatureManager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index f0c312068..bb6312377 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -187,7 +187,7 @@ void FeatureManager::updateActiveFeatures( const ComputerControlInterfaceList& c bool FeatureManager::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message ) const { - vDebug() << "feature" << message.featureUid() + vDebug() << "feature" << feature(message.featureUid()).name() << "command" << message.command() << "arguments" << message.arguments(); @@ -210,7 +210,7 @@ bool FeatureManager::handleFeatureMessage( VeyonServerInterface& server, const MessageContext& messageContext, const FeatureMessage& message ) const { - vDebug() << "feature" << message.featureUid() + vDebug() << "feature" << feature(message.featureUid()).name() << "command" << message.command() << "arguments" << message.arguments(); @@ -237,7 +237,7 @@ bool FeatureManager::handleFeatureMessage( VeyonServerInterface& server, bool FeatureManager::handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) const { - vDebug() << "feature" << message.featureUid() + vDebug() << "feature" << feature(message.featureUid()).name() << "command" << message.command() << "arguments" << message.arguments(); From 9d75c0f288fbd56bde684c24742fd12771a473b5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:48:10 +0100 Subject: [PATCH 0817/1765] Master: update splash for 2021 --- master/resources/splash.png | Bin 5460 -> 5466 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/master/resources/splash.png b/master/resources/splash.png index 28264ab87fd19054ac08e567c7fc771476620a3b..03b957ef3ae2df31612a7ecf65b2161c48377277 100644 GIT binary patch literal 5466 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 From 2eb05289111582db85bad346a0bb8016e91645df Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 16:48:49 +0100 Subject: [PATCH 0818/1765] Update copyright --- README.md | 2 +- cli/src/ConfigCommands.cpp | 2 +- cli/src/ConfigCommands.h | 2 +- cli/src/PluginsCommands.cpp | 2 +- cli/src/PluginsCommands.h | 2 +- cli/src/main.cpp | 2 +- cli/veyon-cli.rc.in | 2 +- cli/veyon-wcli.rc.in | 2 +- cmake/modules/BuildVeyonApplication.cmake | 2 +- cmake/modules/BuildVeyonPlugin.cmake | 2 +- cmake/modules/CreateTranslations.cmake | 2 +- cmake/modules/FindLibVNCClient.cmake | 2 +- cmake/modules/FindLibVNCServer.cmake | 2 +- cmake/modules/FindQtTranslations.cmake | 2 +- configurator/src/AccessControlPage.cpp | 2 +- configurator/src/AccessControlPage.h | 2 +- configurator/src/AccessControlRuleEditDialog.cpp | 2 +- configurator/src/AccessControlRuleEditDialog.h | 2 +- configurator/src/AccessControlRuleListModel.cpp | 2 +- configurator/src/AccessControlRuleListModel.h | 2 +- configurator/src/AccessControlRulesTestDialog.cpp | 2 +- configurator/src/AccessControlRulesTestDialog.h | 2 +- configurator/src/AuthenticationPage.cpp | 2 +- configurator/src/AuthenticationPage.h | 2 +- configurator/src/AuthenticationPageTab.cpp | 2 +- configurator/src/AuthenticationPageTab.h | 2 +- configurator/src/GeneralConfigurationPage.cpp | 2 +- configurator/src/GeneralConfigurationPage.h | 2 +- configurator/src/MainWindow.cpp | 2 +- configurator/src/MainWindow.h | 2 +- configurator/src/MasterConfigurationPage.cpp | 2 +- configurator/src/MasterConfigurationPage.h | 2 +- configurator/src/ServiceConfigurationPage.cpp | 2 +- configurator/src/ServiceConfigurationPage.h | 2 +- configurator/src/main.cpp | 2 +- configurator/veyon-configurator.rc.in | 2 +- core/src/AboutDialog.cpp | 2 +- core/src/AboutDialog.h | 2 +- core/src/AboutDialog.ui | 2 +- core/src/AccessControlProvider.cpp | 2 +- core/src/AccessControlProvider.h | 2 +- core/src/AccessControlRule.cpp | 2 +- core/src/AccessControlRule.h | 2 +- core/src/AuthenticationCredentials.h | 2 +- core/src/AuthenticationManager.cpp | 2 +- core/src/AuthenticationManager.h | 2 +- core/src/AuthenticationPluginInterface.cpp | 2 +- core/src/AuthenticationPluginInterface.h | 2 +- core/src/BuiltinFeatures.cpp | 2 +- core/src/BuiltinFeatures.h | 2 +- core/src/CommandLineIO.cpp | 2 +- core/src/CommandLineIO.h | 2 +- core/src/CommandLinePluginInterface.h | 2 +- core/src/Computer.cpp | 2 +- core/src/Computer.h | 2 +- core/src/ComputerControlInterface.cpp | 2 +- core/src/ComputerControlInterface.h | 2 +- core/src/ComputerListModel.cpp | 2 +- core/src/ComputerListModel.h | 2 +- core/src/Configuration/JsonStore.cpp | 2 +- core/src/Configuration/JsonStore.h | 2 +- core/src/Configuration/LocalStore.cpp | 2 +- core/src/Configuration/LocalStore.h | 2 +- core/src/Configuration/Object.cpp | 2 +- core/src/Configuration/Object.h | 2 +- core/src/Configuration/Password.cpp | 2 +- core/src/Configuration/Password.h | 2 +- core/src/Configuration/Property.cpp | 2 +- core/src/Configuration/Property.h | 2 +- core/src/Configuration/Proxy.cpp | 2 +- core/src/Configuration/Proxy.h | 2 +- core/src/Configuration/Store.h | 2 +- core/src/Configuration/UiMapping.cpp | 2 +- core/src/Configuration/UiMapping.h | 2 +- core/src/ConfigurationManager.cpp | 2 +- core/src/ConfigurationManager.h | 2 +- core/src/ConfigurationPage.cpp | 2 +- core/src/ConfigurationPage.h | 2 +- core/src/ConfigurationPagePluginInterface.h | 2 +- core/src/CryptoCore.cpp | 2 +- core/src/CryptoCore.h | 2 +- core/src/DesktopAccessDialog.cpp | 2 +- core/src/DesktopAccessDialog.h | 2 +- core/src/EnumHelper.h | 2 +- core/src/Feature.h | 2 +- core/src/FeatureControl.cpp | 2 +- core/src/FeatureControl.h | 2 +- core/src/FeatureManager.cpp | 2 +- core/src/FeatureManager.h | 2 +- core/src/FeatureMessage.cpp | 2 +- core/src/FeatureMessage.h | 2 +- core/src/FeatureProviderInterface.h | 2 +- core/src/FeatureWorkerManager.cpp | 2 +- core/src/FeatureWorkerManager.h | 2 +- core/src/FileSystemBrowser.cpp | 2 +- core/src/FileSystemBrowser.h | 2 +- core/src/Filesystem.cpp | 2 +- core/src/Filesystem.h | 2 +- core/src/HashList.h | 2 +- core/src/HostAddress.cpp | 2 +- core/src/HostAddress.h | 2 +- core/src/KeyboardShortcutTrapper.h | 2 +- core/src/LockWidget.cpp | 2 +- core/src/LockWidget.h | 2 +- core/src/Logger.cpp | 2 +- core/src/Logger.h | 2 +- core/src/MessageContext.h | 2 +- core/src/MonitoringMode.cpp | 2 +- core/src/MonitoringMode.h | 2 +- core/src/NetworkObject.cpp | 2 +- core/src/NetworkObject.h | 2 +- core/src/NetworkObjectDirectory.cpp | 2 +- core/src/NetworkObjectDirectory.h | 2 +- core/src/NetworkObjectDirectoryManager.cpp | 2 +- core/src/NetworkObjectDirectoryManager.h | 2 +- core/src/NetworkObjectDirectoryPluginInterface.h | 2 +- core/src/NetworkObjectModel.h | 2 +- core/src/ObjectManager.h | 2 +- core/src/PlatformCoreFunctions.h | 2 +- core/src/PlatformFilesystemFunctions.h | 2 +- core/src/PlatformInputDeviceFunctions.h | 2 +- core/src/PlatformNetworkFunctions.h | 2 +- core/src/PlatformPluginInterface.h | 2 +- core/src/PlatformPluginManager.cpp | 2 +- core/src/PlatformPluginManager.h | 2 +- core/src/PlatformServiceFunctions.h | 2 +- core/src/PlatformSessionFunctions.h | 2 +- core/src/PlatformUserFunctions.h | 2 +- core/src/Plugin.h | 2 +- core/src/PluginInterface.h | 2 +- core/src/PluginManager.cpp | 2 +- core/src/PluginManager.h | 2 +- core/src/ProcessHelper.cpp | 2 +- core/src/ProcessHelper.h | 2 +- core/src/ProgressWidget.cpp | 2 +- core/src/ProgressWidget.h | 2 +- core/src/QmlCore.cpp | 2 +- core/src/QmlCore.h | 2 +- core/src/QtCompat.h | 2 +- core/src/Screenshot.cpp | 2 +- core/src/Screenshot.h | 2 +- core/src/ServiceControl.cpp | 2 +- core/src/ServiceControl.h | 2 +- core/src/SocketDevice.h | 2 +- core/src/SystemTrayIcon.cpp | 2 +- core/src/SystemTrayIcon.h | 2 +- core/src/ToolButton.cpp | 2 +- core/src/ToolButton.h | 2 +- core/src/TranslationLoader.cpp | 2 +- core/src/TranslationLoader.h | 2 +- core/src/UserGroupsBackendInterface.h | 2 +- core/src/UserGroupsBackendManager.cpp | 2 +- core/src/UserGroupsBackendManager.h | 2 +- core/src/VariantArrayMessage.cpp | 2 +- core/src/VariantArrayMessage.h | 2 +- core/src/VariantStream.cpp | 2 +- core/src/VariantStream.h | 2 +- core/src/VeyonConfiguration.cpp | 2 +- core/src/VeyonConfiguration.h | 2 +- core/src/VeyonConfigurationProperties.h | 2 +- core/src/VeyonConnection.cpp | 2 +- core/src/VeyonConnection.h | 2 +- core/src/VeyonCore.cpp | 2 +- core/src/VeyonCore.h | 2 +- core/src/VeyonMasterInterface.h | 2 +- core/src/VeyonServerInterface.h | 2 +- core/src/VeyonServiceControl.cpp | 2 +- core/src/VeyonServiceControl.h | 2 +- core/src/VeyonWorkerInterface.h | 2 +- core/src/VncClientProtocol.cpp | 2 +- core/src/VncClientProtocol.h | 2 +- core/src/VncConnection.cpp | 2 +- core/src/VncConnection.h | 2 +- core/src/VncEvents.cpp | 2 +- core/src/VncEvents.h | 2 +- core/src/VncFeatureMessageEvent.cpp | 2 +- core/src/VncFeatureMessageEvent.h | 2 +- core/src/VncServerClient.h | 2 +- core/src/VncServerPluginInterface.h | 2 +- core/src/VncServerProtocol.cpp | 2 +- core/src/VncServerProtocol.h | 2 +- core/src/VncView.cpp | 2 +- core/src/VncView.h | 2 +- core/src/VncViewItem.cpp | 2 +- core/src/VncViewItem.h | 2 +- core/src/VncViewWidget.cpp | 2 +- core/src/VncViewWidget.h | 2 +- master/src/CheckableItemProxyModel.cpp | 2 +- master/src/CheckableItemProxyModel.h | 2 +- master/src/ComputerControlListModel.cpp | 2 +- master/src/ComputerControlListModel.h | 2 +- master/src/ComputerManager.cpp | 2 +- master/src/ComputerManager.h | 2 +- master/src/ComputerMonitoringItem.cpp | 2 +- master/src/ComputerMonitoringItem.h | 2 +- master/src/ComputerMonitoringModel.cpp | 2 +- master/src/ComputerMonitoringModel.h | 2 +- master/src/ComputerMonitoringView.cpp | 2 +- master/src/ComputerMonitoringView.h | 2 +- master/src/ComputerMonitoringWidget.cpp | 2 +- master/src/ComputerMonitoringWidget.h | 2 +- master/src/ComputerSelectModel.cpp | 2 +- master/src/ComputerSelectModel.h | 2 +- master/src/ComputerSelectPanel.cpp | 2 +- master/src/ComputerSelectPanel.h | 2 +- master/src/ComputerZoomWidget.cpp | 2 +- master/src/ComputerZoomWidget.h | 2 +- master/src/DocumentationFigureCreator.cpp | 2 +- master/src/DocumentationFigureCreator.h | 2 +- master/src/FeatureListModel.cpp | 2 +- master/src/FeatureListModel.h | 2 +- master/src/FlexibleListView.cpp | 2 +- master/src/FlexibleListView.h | 2 +- master/src/LocationDialog.cpp | 2 +- master/src/LocationDialog.h | 2 +- master/src/MainToolBar.cpp | 2 +- master/src/MainToolBar.h | 2 +- master/src/MainWindow.cpp | 2 +- master/src/MainWindow.h | 2 +- master/src/NetworkObjectFilterProxyModel.cpp | 2 +- master/src/NetworkObjectFilterProxyModel.h | 2 +- master/src/NetworkObjectOverlayDataModel.cpp | 2 +- master/src/NetworkObjectOverlayDataModel.h | 2 +- master/src/NetworkObjectTreeModel.cpp | 2 +- master/src/NetworkObjectTreeModel.h | 2 +- master/src/RecursiveFilterProxyModel.cpp | 2 +- master/src/RecursiveFilterProxyModel.h | 2 +- master/src/ScreenshotManagementPanel.cpp | 2 +- master/src/ScreenshotManagementPanel.h | 2 +- master/src/SlideshowModel.cpp | 2 +- master/src/SlideshowModel.h | 2 +- master/src/SlideshowPanel.cpp | 2 +- master/src/SlideshowPanel.h | 2 +- master/src/SpotlightModel.cpp | 2 +- master/src/SpotlightModel.h | 2 +- master/src/SpotlightPanel.cpp | 2 +- master/src/SpotlightPanel.h | 2 +- master/src/UserConfig.cpp | 2 +- master/src/UserConfig.h | 2 +- master/src/VeyonMaster.cpp | 2 +- master/src/VeyonMaster.h | 2 +- master/src/main.cpp | 2 +- master/veyon-master.rc.in | 2 +- nsis/veyon.nsi.in | 2 +- plugins/authkeys/AuthKeysConfiguration.h | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.cpp | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.h | 2 +- plugins/authkeys/AuthKeysManager.cpp | 2 +- plugins/authkeys/AuthKeysManager.h | 2 +- plugins/authkeys/AuthKeysPlugin.cpp | 2 +- plugins/authkeys/AuthKeysPlugin.h | 2 +- plugins/authkeys/AuthKeysTableModel.cpp | 2 +- plugins/authkeys/AuthKeysTableModel.h | 2 +- plugins/authlogon/AuthLogonDialog.cpp | 2 +- plugins/authlogon/AuthLogonDialog.h | 2 +- plugins/authlogon/AuthLogonPlugin.cpp | 2 +- plugins/authlogon/AuthLogonPlugin.h | 2 +- plugins/authsimple/AuthSimpleConfiguration.h | 2 +- plugins/authsimple/AuthSimpleDialog.cpp | 2 +- plugins/authsimple/AuthSimpleDialog.h | 2 +- plugins/authsimple/AuthSimplePlugin.cpp | 2 +- plugins/authsimple/AuthSimplePlugin.h | 2 +- plugins/builtindirectory/BuiltinDirectory.cpp | 2 +- plugins/builtindirectory/BuiltinDirectory.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfiguration.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.h | 2 +- plugins/demo/DemoAuthentication.cpp | 2 +- plugins/demo/DemoAuthentication.h | 2 +- plugins/demo/DemoClient.cpp | 2 +- plugins/demo/DemoClient.h | 2 +- plugins/demo/DemoConfiguration.h | 2 +- plugins/demo/DemoConfigurationPage.cpp | 2 +- plugins/demo/DemoConfigurationPage.h | 2 +- plugins/demo/DemoFeaturePlugin.cpp | 2 +- plugins/demo/DemoFeaturePlugin.h | 2 +- plugins/demo/DemoServer.cpp | 2 +- plugins/demo/DemoServer.h | 2 +- plugins/demo/DemoServerConnection.cpp | 2 +- plugins/demo/DemoServerConnection.h | 2 +- plugins/demo/DemoServerProtocol.cpp | 2 +- plugins/demo/DemoServerProtocol.h | 2 +- plugins/desktopservices/DesktopServiceObject.cpp | 2 +- plugins/desktopservices/DesktopServiceObject.h | 2 +- plugins/desktopservices/DesktopServicesConfiguration.h | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.cpp | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.h | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.cpp | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.h | 2 +- plugins/desktopservices/OpenWebsiteDialog.cpp | 2 +- plugins/desktopservices/OpenWebsiteDialog.h | 2 +- plugins/desktopservices/RunProgramDialog.cpp | 2 +- plugins/desktopservices/RunProgramDialog.h | 2 +- plugins/filetransfer/FileReadThread.cpp | 2 +- plugins/filetransfer/FileReadThread.h | 2 +- plugins/filetransfer/FileTransferConfiguration.h | 2 +- plugins/filetransfer/FileTransferConfigurationPage.cpp | 2 +- plugins/filetransfer/FileTransferConfigurationPage.h | 2 +- plugins/filetransfer/FileTransferController.cpp | 2 +- plugins/filetransfer/FileTransferController.h | 2 +- plugins/filetransfer/FileTransferDialog.cpp | 2 +- plugins/filetransfer/FileTransferDialog.h | 2 +- plugins/filetransfer/FileTransferListModel.cpp | 2 +- plugins/filetransfer/FileTransferListModel.h | 2 +- plugins/filetransfer/FileTransferPlugin.cpp | 2 +- plugins/filetransfer/FileTransferPlugin.h | 2 +- plugins/filetransfer/FileTransferUserConfiguration.h | 2 +- plugins/ldap/AuthLdapConfiguration.h | 2 +- plugins/ldap/AuthLdapConfigurationWidget.cpp | 2 +- plugins/ldap/AuthLdapConfigurationWidget.h | 2 +- plugins/ldap/AuthLdapCore.cpp | 2 +- plugins/ldap/AuthLdapCore.h | 2 +- plugins/ldap/AuthLdapDialog.cpp | 2 +- plugins/ldap/AuthLdapDialog.h | 2 +- plugins/ldap/LdapPlugin.cpp | 2 +- plugins/ldap/LdapPlugin.h | 2 +- plugins/ldap/common/LdapBrowseDialog.cpp | 2 +- plugins/ldap/common/LdapBrowseDialog.h | 2 +- plugins/ldap/common/LdapBrowseModel.cpp | 2 +- plugins/ldap/common/LdapBrowseModel.h | 2 +- plugins/ldap/common/LdapClient.cpp | 2 +- plugins/ldap/common/LdapClient.h | 2 +- plugins/ldap/common/LdapCommon.h | 2 +- plugins/ldap/common/LdapConfiguration.cpp | 2 +- plugins/ldap/common/LdapConfiguration.h | 2 +- plugins/ldap/common/LdapConfigurationPage.cpp | 2 +- plugins/ldap/common/LdapConfigurationPage.h | 2 +- plugins/ldap/common/LdapConfigurationTest.cpp | 2 +- plugins/ldap/common/LdapConfigurationTest.h | 2 +- plugins/ldap/common/LdapDirectory.cpp | 2 +- plugins/ldap/common/LdapDirectory.h | 2 +- plugins/ldap/common/LdapNetworkObjectDirectory.cpp | 2 +- plugins/ldap/common/LdapNetworkObjectDirectory.h | 2 +- plugins/ldap/kldap/KLdapIntegration.cpp | 2 +- plugins/ldap/kldap/kldap_export.h | 2 +- plugins/ldap/kldap/klocalizedstring.h | 2 +- plugins/ldap/kldap/ldap_debug.h | 2 +- plugins/platform/common/LogonHelper.cpp | 2 +- plugins/platform/common/LogonHelper.h | 2 +- plugins/platform/common/PersistentLogonCredentials.cpp | 2 +- plugins/platform/common/PersistentLogonCredentials.h | 2 +- plugins/platform/common/PlatformSessionManager.cpp | 2 +- plugins/platform/common/PlatformSessionManager.h | 2 +- plugins/platform/common/ServiceDataManager.cpp | 2 +- plugins/platform/common/ServiceDataManager.h | 2 +- plugins/platform/linux/LinuxCoreFunctions.cpp | 2 +- plugins/platform/linux/LinuxCoreFunctions.h | 2 +- plugins/platform/linux/LinuxDesktopIntegration.h | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.cpp | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.h | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.cpp | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.h | 2 +- plugins/platform/linux/LinuxKeyboardInput.cpp | 2 +- plugins/platform/linux/LinuxKeyboardInput.h | 2 +- plugins/platform/linux/LinuxKeyboardShortcutTrapper.h | 2 +- plugins/platform/linux/LinuxNetworkFunctions.cpp | 2 +- plugins/platform/linux/LinuxNetworkFunctions.h | 2 +- plugins/platform/linux/LinuxPlatformConfiguration.h | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.cpp | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.h | 2 +- plugins/platform/linux/LinuxPlatformPlugin.cpp | 2 +- plugins/platform/linux/LinuxPlatformPlugin.h | 2 +- plugins/platform/linux/LinuxServiceCore.cpp | 2 +- plugins/platform/linux/LinuxServiceCore.h | 2 +- plugins/platform/linux/LinuxServiceFunctions.cpp | 2 +- plugins/platform/linux/LinuxServiceFunctions.h | 2 +- plugins/platform/linux/LinuxSessionFunctions.cpp | 2 +- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- plugins/platform/linux/LinuxUserFunctions.cpp | 2 +- plugins/platform/linux/LinuxUserFunctions.h | 2 +- plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp | 2 +- plugins/platform/windows/DesktopInputController.cpp | 2 +- plugins/platform/windows/DesktopInputController.h | 2 +- plugins/platform/windows/SasEventListener.cpp | 2 +- plugins/platform/windows/SasEventListener.h | 2 +- plugins/platform/windows/WindowsCoreFunctions.cpp | 2 +- plugins/platform/windows/WindowsCoreFunctions.h | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.cpp | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.h | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.cpp | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.h | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.h | 2 +- plugins/platform/windows/WindowsNetworkFunctions.cpp | 2 +- plugins/platform/windows/WindowsNetworkFunctions.h | 2 +- plugins/platform/windows/WindowsPlatformConfiguration.h | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.cpp | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.h | 2 +- plugins/platform/windows/WindowsPlatformPlugin.cpp | 2 +- plugins/platform/windows/WindowsPlatformPlugin.h | 2 +- plugins/platform/windows/WindowsServiceControl.cpp | 2 +- plugins/platform/windows/WindowsServiceControl.h | 2 +- plugins/platform/windows/WindowsServiceCore.cpp | 2 +- plugins/platform/windows/WindowsServiceCore.h | 2 +- plugins/platform/windows/WindowsServiceFunctions.cpp | 2 +- plugins/platform/windows/WindowsServiceFunctions.h | 2 +- plugins/platform/windows/WindowsSessionFunctions.cpp | 2 +- plugins/platform/windows/WindowsSessionFunctions.h | 2 +- plugins/platform/windows/WindowsUserFunctions.cpp | 2 +- plugins/platform/windows/WindowsUserFunctions.h | 2 +- plugins/platform/windows/WtsSessionManager.cpp | 2 +- plugins/platform/windows/WtsSessionManager.h | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.cpp | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.h | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.cpp | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.h | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.h | 2 +- plugins/remoteaccess/RemoteAccessPage.cpp | 2 +- plugins/remoteaccess/RemoteAccessPage.h | 2 +- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- plugins/remoteaccess/RemoteAccessWidget.h | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.cpp | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.cpp | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.h | 2 +- plugins/servicecontrol/ServiceControlPlugin.cpp | 2 +- plugins/servicecontrol/ServiceControlPlugin.h | 2 +- plugins/shell/ShellCommandLinePlugin.cpp | 2 +- plugins/shell/ShellCommandLinePlugin.h | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.cpp | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.h | 2 +- plugins/testing/TestingCommandLinePlugin.cpp | 2 +- plugins/testing/TestingCommandLinePlugin.h | 2 +- plugins/textmessage/TextMessageDialog.cpp | 2 +- plugins/textmessage/TextMessageDialog.h | 2 +- plugins/textmessage/TextMessageFeaturePlugin.cpp | 2 +- plugins/textmessage/TextMessageFeaturePlugin.h | 2 +- plugins/usersessioncontrol/UserLoginDialog.cpp | 2 +- plugins/usersessioncontrol/UserLoginDialog.h | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.cpp | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.h | 2 +- plugins/vncserver/external/ExternalVncServer.cpp | 2 +- plugins/vncserver/external/ExternalVncServer.h | 2 +- plugins/vncserver/external/ExternalVncServerConfiguration.h | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.cpp | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.h | 2 +- plugins/vncserver/headless/HeadlessVncConfiguration.h | 2 +- plugins/vncserver/headless/HeadlessVncServer.cpp | 2 +- plugins/vncserver/headless/HeadlessVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h | 2 +- plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h | 2 +- plugins/vncserver/ultravnc-builtin/vncntlm.cpp | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h | 2 +- project.yml | 2 +- server/src/ComputerControlClient.cpp | 2 +- server/src/ComputerControlClient.h | 2 +- server/src/ComputerControlServer.cpp | 2 +- server/src/ComputerControlServer.h | 2 +- server/src/ServerAccessControlManager.cpp | 2 +- server/src/ServerAccessControlManager.h | 2 +- server/src/ServerAuthenticationManager.cpp | 2 +- server/src/ServerAuthenticationManager.h | 2 +- server/src/VeyonServerProtocol.cpp | 2 +- server/src/VeyonServerProtocol.h | 2 +- server/src/VncProxyConnection.cpp | 2 +- server/src/VncProxyConnection.h | 2 +- server/src/VncProxyConnectionFactory.h | 2 +- server/src/VncProxyServer.cpp | 2 +- server/src/VncProxyServer.h | 2 +- server/src/VncServer.cpp | 2 +- server/src/VncServer.h | 2 +- server/src/main.cpp | 2 +- server/veyon-server.rc.in | 2 +- service/src/main.cpp | 2 +- service/veyon-service.rc.in | 2 +- worker/src/FeatureWorkerManagerConnection.cpp | 2 +- worker/src/FeatureWorkerManagerConnection.h | 2 +- worker/src/VeyonWorker.cpp | 2 +- worker/src/VeyonWorker.h | 2 +- worker/src/main.cpp | 2 +- worker/veyon-worker.rc.in | 2 +- 483 files changed, 483 insertions(+), 483 deletions(-) diff --git a/README.md b/README.md index 5f6d92b5d..9ae371270 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ at their daily work: ## License -Copyright (c) 2004-2020 Tobias Junghans / Veyon Solutions. +Copyright (c) 2004-2021 Tobias Junghans / Veyon Solutions. See the file COPYING for the GNU GENERAL PUBLIC LICENSE. diff --git a/cli/src/ConfigCommands.cpp b/cli/src/ConfigCommands.cpp index 27d6b5296..ffc94b280 100644 --- a/cli/src/ConfigCommands.cpp +++ b/cli/src/ConfigCommands.cpp @@ -1,7 +1,7 @@ /* * ConfigCommands.cpp - implementation of ConfigCommands class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ConfigCommands.h b/cli/src/ConfigCommands.h index c9ef98ce4..dcd3a0ae2 100644 --- a/cli/src/ConfigCommands.h +++ b/cli/src/ConfigCommands.h @@ -1,7 +1,7 @@ /* * ConfigCommands.h - declaration of ConfigCommands class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginsCommands.cpp b/cli/src/PluginsCommands.cpp index 39697b3de..88968a256 100644 --- a/cli/src/PluginsCommands.cpp +++ b/cli/src/PluginsCommands.cpp @@ -1,7 +1,7 @@ /* * PluginsCommands.cpp - implementation of PluginsCommands class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginsCommands.h b/cli/src/PluginsCommands.h index 307fbdb13..a9259bd22 100644 --- a/cli/src/PluginsCommands.h +++ b/cli/src/PluginsCommands.h @@ -1,7 +1,7 @@ /* * PluginsCommands.h - declaration of PluginsCommands class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/main.cpp b/cli/src/main.cpp index a0963c4d2..c9618c4f6 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon CLI * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/veyon-cli.rc.in b/cli/veyon-cli.rc.in index 7e8a5b8f5..b8bc9bc06 100644 --- a/cli/veyon-cli.rc.in +++ b/cli/veyon-cli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-cli.exe\0" END END diff --git a/cli/veyon-wcli.rc.in b/cli/veyon-wcli.rc.in index 07eaa4dda..c3e45a3b8 100644 --- a/cli/veyon-wcli.rc.in +++ b/cli/veyon-wcli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (non-console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-wcli.exe\0" END END diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index 8583f8dec..785cd27f1 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -1,4 +1,4 @@ -# BuildVeyonApplication.cmake - Copyright (c) 2019-2020 Tobias Junghans +# BuildVeyonApplication.cmake - Copyright (c) 2019-2021 Tobias Junghans # # description: build Veyon application # usage: build_veyon_application( ) diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index a78fef746..8696a5d55 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -1,4 +1,4 @@ -# BuildVeyonPlugin.cmake - Copyright (c) 2017-2020 Tobias Junghans +# BuildVeyonPlugin.cmake - Copyright (c) 2017-2021 Tobias Junghans # # description: build Veyon plugin # usage: build_veyon_plugin( ) diff --git a/cmake/modules/CreateTranslations.cmake b/cmake/modules/CreateTranslations.cmake index a112a8e63..17ba3b63f 100644 --- a/cmake/modules/CreateTranslations.cmake +++ b/cmake/modules/CreateTranslations.cmake @@ -1,4 +1,4 @@ -# CreateTranslations.cmake - Copyright (c) 2020 Tobias Junghans +# CreateTranslations.cmake - Copyright (c) 2020-2021 Tobias Junghans # # description: create Qt translation files # usage: create_translations( ) diff --git a/cmake/modules/FindLibVNCClient.cmake b/cmake/modules/FindLibVNCClient.cmake index 950d0aa02..195d8ad7d 100644 --- a/cmake/modules/FindLibVNCClient.cmake +++ b/cmake/modules/FindLibVNCClient.cmake @@ -23,7 +23,7 @@ # The LibVNCClient library #============================================================================= -# SPDX-FileCopyrightText: 2020 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2021 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/cmake/modules/FindLibVNCServer.cmake b/cmake/modules/FindLibVNCServer.cmake index af322c1fc..dfe21df37 100644 --- a/cmake/modules/FindLibVNCServer.cmake +++ b/cmake/modules/FindLibVNCServer.cmake @@ -23,7 +23,7 @@ # The LibVNCServer library #============================================================================= -# SPDX-FileCopyrightText: 2020 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2021 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/cmake/modules/FindQtTranslations.cmake b/cmake/modules/FindQtTranslations.cmake index a57412e96..cf9377d7f 100644 --- a/cmake/modules/FindQtTranslations.cmake +++ b/cmake/modules/FindQtTranslations.cmake @@ -1,4 +1,4 @@ -# FindQtTranslations.cmake - Copyright (c) 2020 Tobias Junghans +# FindQtTranslations.cmake - Copyright (c) 2020-2021 Tobias Junghans # # description: find translation files of Qt and copy them on Windows to current binary dir # usage: find_qt_translations() diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index c9bcdd057..eaae19447 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -1,7 +1,7 @@ /* * AccessControlPage.cpp - implementation of the access control page * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlPage.h b/configurator/src/AccessControlPage.h index 4d02ffea3..dd8bd165a 100644 --- a/configurator/src/AccessControlPage.h +++ b/configurator/src/AccessControlPage.h @@ -1,7 +1,7 @@ /* * AccessControlPage.h - header for the AccessControlPage class * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index 3f336e03d..f4320c3f8 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.cpp - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.h b/configurator/src/AccessControlRuleEditDialog.h index 4d3288818..7450538a7 100644 --- a/configurator/src/AccessControlRuleEditDialog.h +++ b/configurator/src/AccessControlRuleEditDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.h - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.cpp b/configurator/src/AccessControlRuleListModel.cpp index b6d369dbe..6bd950e86 100644 --- a/configurator/src/AccessControlRuleListModel.cpp +++ b/configurator/src/AccessControlRuleListModel.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.cpp - data model for access control rules * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.h b/configurator/src/AccessControlRuleListModel.h index 25bca99f1..3e02d23d7 100644 --- a/configurator/src/AccessControlRuleListModel.h +++ b/configurator/src/AccessControlRuleListModel.h @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.h - data model for access control rules * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index fee8f08cb..8bcf976fb 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.cpp - dialog for testing access control rules * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.h b/configurator/src/AccessControlRulesTestDialog.h index ba5f39a9f..6ea418727 100644 --- a/configurator/src/AccessControlRulesTestDialog.h +++ b/configurator/src/AccessControlRulesTestDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.h - dialog for testing access control rules * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.cpp b/configurator/src/AuthenticationPage.cpp index 5290556f6..fd492af6c 100644 --- a/configurator/src/AuthenticationPage.cpp +++ b/configurator/src/AuthenticationPage.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPage.cpp - implementation of the AuthenticationPage class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.h b/configurator/src/AuthenticationPage.h index 5582b0a11..69e2d2a75 100644 --- a/configurator/src/AuthenticationPage.h +++ b/configurator/src/AuthenticationPage.h @@ -1,7 +1,7 @@ /* * AuthenticationPage.h - header for the AuthenticationPage class * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.cpp b/configurator/src/AuthenticationPageTab.cpp index 6cf73ea99..eb3042521 100644 --- a/configurator/src/AuthenticationPageTab.cpp +++ b/configurator/src/AuthenticationPageTab.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.cpp - implementation of the AuthenticationPageTab class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.h b/configurator/src/AuthenticationPageTab.h index be991f460..eb64509b9 100644 --- a/configurator/src/AuthenticationPageTab.h +++ b/configurator/src/AuthenticationPageTab.h @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.h - header for the AuthenticationPageTab class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index 4180385e0..7adcdeacf 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.cpp - configuration page with general settings * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.h b/configurator/src/GeneralConfigurationPage.h index 464f6a596..1537f7aaa 100644 --- a/configurator/src/GeneralConfigurationPage.h +++ b/configurator/src/GeneralConfigurationPage.h @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.h - configuration page with general settings * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index d9ff92cdf..d32b68c60 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.h b/configurator/src/MainWindow.h index 20d7cc7fc..0ba2db256 100644 --- a/configurator/src/MainWindow.h +++ b/configurator/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of the Veyon Configurator * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index 954b00f22..e264e926a 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.cpp - page for configuring master application * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.h b/configurator/src/MasterConfigurationPage.h index 04c13216f..96d6b1c53 100644 --- a/configurator/src/MasterConfigurationPage.h +++ b/configurator/src/MasterConfigurationPage.h @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.h - header for the MasterConfigurationPage class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index 587385169..5d01269fe 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.h b/configurator/src/ServiceConfigurationPage.h index 2f87ec8ad..578d12a45 100644 --- a/configurator/src/ServiceConfigurationPage.h +++ b/configurator/src/ServiceConfigurationPage.h @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.h - header for the ServiceConfigurationPage class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/main.cpp b/configurator/src/main.cpp index 4f3000c48..e90d40954 100644 --- a/configurator/src/main.cpp +++ b/configurator/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Configurator * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/veyon-configurator.rc.in b/configurator/veyon-configurator.rc.in index 174b7e4c3..ae6df6c6a 100644 --- a/configurator/veyon-configurator.rc.in +++ b/configurator/veyon-configurator.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Configurator\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-configurator.exe\0" END END diff --git a/core/src/AboutDialog.cpp b/core/src/AboutDialog.cpp index 9fb2ad591..fe3f8ae3b 100644 --- a/core/src/AboutDialog.cpp +++ b/core/src/AboutDialog.cpp @@ -1,7 +1,7 @@ /* * AboutDialog.cpp - implementation of AboutDialog * - * Copyright (c) 2011-2020 Tobias Junghans + * Copyright (c) 2011-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.h b/core/src/AboutDialog.h index f73bbf37f..192556196 100644 --- a/core/src/AboutDialog.h +++ b/core/src/AboutDialog.h @@ -1,7 +1,7 @@ /* * AboutDialog.h - declaration of AboutDialog class * - * Copyright (c) 2011-2020 Tobias Junghans + * Copyright (c) 2011-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.ui b/core/src/AboutDialog.ui index 85c563ae9..9209d8048 100644 --- a/core/src/AboutDialog.ui +++ b/core/src/AboutDialog.ui @@ -149,7 +149,7 @@ - Copyright © 2004-2020 Tobias Junghans / Veyon Solutions + Copyright © 2004-2021 Tobias Junghans / Veyon Solutions diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 40635dda7..8295e7624 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -1,7 +1,7 @@ /* * AccessControlProvider.cpp - implementation of the AccessControlProvider class * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index c3dd85299..6b43e7bc9 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -1,7 +1,7 @@ /* * AccessControlProvider.h - declaration of class AccessControlProvider * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.cpp b/core/src/AccessControlRule.cpp index 28e17a0bc..30c64e17a 100644 --- a/core/src/AccessControlRule.cpp +++ b/core/src/AccessControlRule.cpp @@ -1,7 +1,7 @@ /* * AccessControlRule.cpp - implementation of the AccessControlRule class * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index 1bbddef6e..38cad12aa 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -1,7 +1,7 @@ /* * AccessControlRule.h - declaration of class AccessControlRule * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationCredentials.h b/core/src/AuthenticationCredentials.h index 53887d9a0..15f025fcb 100644 --- a/core/src/AuthenticationCredentials.h +++ b/core/src/AuthenticationCredentials.h @@ -1,7 +1,7 @@ /* * AuthenticationCredentials.h - class holding credentials for authentication * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.cpp b/core/src/AuthenticationManager.cpp index 92864c3cd..a0bd40c55 100644 --- a/core/src/AuthenticationManager.cpp +++ b/core/src/AuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * AuthenticationManager.cpp - implementation of AuthenticationManager * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.h b/core/src/AuthenticationManager.h index 93b64ac9c..387f546e1 100644 --- a/core/src/AuthenticationManager.h +++ b/core/src/AuthenticationManager.h @@ -1,7 +1,7 @@ /* * AuthenticationManager.h - header file for AuthenticationManager * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.cpp b/core/src/AuthenticationPluginInterface.cpp index 6a85a48e7..ce59516fc 100644 --- a/core/src/AuthenticationPluginInterface.cpp +++ b/core/src/AuthenticationPluginInterface.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.cpp - interface class for authentication plugins * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.h b/core/src/AuthenticationPluginInterface.h index d44b07a5e..c4831ce1a 100644 --- a/core/src/AuthenticationPluginInterface.h +++ b/core/src/AuthenticationPluginInterface.h @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.h - interface class for authentication plugins * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.cpp b/core/src/BuiltinFeatures.cpp index 18a81262c..3171dfda4 100644 --- a/core/src/BuiltinFeatures.cpp +++ b/core/src/BuiltinFeatures.cpp @@ -1,7 +1,7 @@ /* * BuiltinFeatures.cpp - implementation of BuiltinFeatures class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.h b/core/src/BuiltinFeatures.h index 1cbf83c67..99d6d5d06 100644 --- a/core/src/BuiltinFeatures.h +++ b/core/src/BuiltinFeatures.h @@ -1,7 +1,7 @@ /* * BuiltinFeatures.h - declaration of BuiltinFeatures class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.cpp b/core/src/CommandLineIO.cpp index 6d5e80866..409bba2c0 100644 --- a/core/src/CommandLineIO.cpp +++ b/core/src/CommandLineIO.cpp @@ -1,7 +1,7 @@ /* * CommandLineIO.cpp - text input/output for command line plugins * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.h b/core/src/CommandLineIO.h index 901957575..9586940ae 100644 --- a/core/src/CommandLineIO.h +++ b/core/src/CommandLineIO.h @@ -1,7 +1,7 @@ /* * CommandLineIO.h - text input/output for command line plugins * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLinePluginInterface.h b/core/src/CommandLinePluginInterface.h index 2aabd0e90..7e13ec5f0 100644 --- a/core/src/CommandLinePluginInterface.h +++ b/core/src/CommandLinePluginInterface.h @@ -1,7 +1,7 @@ /* * CommandLinePluginInterface.h - interface class for command line plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.cpp b/core/src/Computer.cpp index 12005b920..9079d1215 100644 --- a/core/src/Computer.cpp +++ b/core/src/Computer.cpp @@ -1,7 +1,7 @@ /* * Computer.cpp - represents a computer and provides control methods and data * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.h b/core/src/Computer.h index 792912331..bda6dded2 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -1,7 +1,7 @@ /* * Computer.h - represents a computer and provides control methods and data * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 27186ccdf..553f97f03 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -1,7 +1,7 @@ /* * ComputerControlInterface.cpp - interface class for controlling a computer * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index af37ed938..245eb2572 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -1,7 +1,7 @@ /* * ComputerControlInterface.h - interface class for controlling a computer * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.cpp b/core/src/ComputerListModel.cpp index 657ec5690..5d5294287 100644 --- a/core/src/ComputerListModel.cpp +++ b/core/src/ComputerListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerListModel.cpp - data model base class for computer objects * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index 8a6765046..43d19cac1 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -1,7 +1,7 @@ /* * ComputerListModel.h - data model base class for computer objects * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.cpp b/core/src/Configuration/JsonStore.cpp index f85c6f6be..a06778f23 100644 --- a/core/src/Configuration/JsonStore.cpp +++ b/core/src/Configuration/JsonStore.cpp @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.cpp - implementation of JsonStore * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.h b/core/src/Configuration/JsonStore.h index 9bc34dc9f..afb453298 100644 --- a/core/src/Configuration/JsonStore.h +++ b/core/src/Configuration/JsonStore.h @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.h - JsonStore class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index 32c55a2b3..17181c02b 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -1,7 +1,7 @@ /* * ConfigurationLocalStore.cpp - implementation of LocalStore * - * Copyright (c) 2009-2020 Tobias Junghans + * Copyright (c) 2009-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.h b/core/src/Configuration/LocalStore.h index 811e45315..d411e6c9d 100644 --- a/core/src/Configuration/LocalStore.h +++ b/core/src/Configuration/LocalStore.h @@ -1,7 +1,7 @@ /* * Configuration/LocalStore.h - LocalStore class * - * Copyright (c) 2009-2020 Tobias Junghans + * Copyright (c) 2009-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.cpp b/core/src/Configuration/Object.cpp index 01a214938..f875eb015 100644 --- a/core/src/Configuration/Object.cpp +++ b/core/src/Configuration/Object.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2020 Tobias Junghans + * Copyright (c) 2009-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.h b/core/src/Configuration/Object.h index b104523b4..923288cca 100644 --- a/core/src/Configuration/Object.h +++ b/core/src/Configuration/Object.h @@ -1,7 +1,7 @@ /* * Configuration/Object.h - ConfigurationObject class * - * Copyright (c) 2009-2020 Tobias Junghans + * Copyright (c) 2009-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.cpp b/core/src/Configuration/Password.cpp index a4b8da116..599ed34fd 100644 --- a/core/src/Configuration/Password.cpp +++ b/core/src/Configuration/Password.cpp @@ -1,7 +1,7 @@ /* * Password.cpp - implementation of Configuration::Password * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.h b/core/src/Configuration/Password.h index f34f4e2ca..34a2575df 100644 --- a/core/src/Configuration/Password.h +++ b/core/src/Configuration/Password.h @@ -1,7 +1,7 @@ /* * Configuration/Password.h - Configuration::Password class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index 0fc07ce98..a5787feca 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2020 Tobias Junghans + * Copyright (c) 2009-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.h b/core/src/Configuration/Property.h index 6026d2b4a..60f63a72a 100644 --- a/core/src/Configuration/Property.h +++ b/core/src/Configuration/Property.h @@ -1,7 +1,7 @@ /* * Configuration/Property.h - Configuration::Property class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.cpp b/core/src/Configuration/Proxy.cpp index 0c914eda9..5446f9845 100644 --- a/core/src/Configuration/Proxy.cpp +++ b/core/src/Configuration/Proxy.cpp @@ -1,7 +1,7 @@ /* * Proxy.cpp - implementation of Configuration::Proxy * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.h b/core/src/Configuration/Proxy.h index 78c7eaddf..8de9431e6 100644 --- a/core/src/Configuration/Proxy.h +++ b/core/src/Configuration/Proxy.h @@ -1,7 +1,7 @@ /* * Configuration/Proxy.h - ConfigurationProxy class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Store.h b/core/src/Configuration/Store.h index 80633727d..cb96dbe4c 100644 --- a/core/src/Configuration/Store.h +++ b/core/src/Configuration/Store.h @@ -1,7 +1,7 @@ /* * Configuration/Store.h - ConfigurationStore class * - * Copyright (c) 2009-2020 Tobias Junghans + * Copyright (c) 2009-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.cpp b/core/src/Configuration/UiMapping.cpp index b9fa56e61..4c3e307ce 100644 --- a/core/src/Configuration/UiMapping.cpp +++ b/core/src/Configuration/UiMapping.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2020 Tobias Junghans + * Copyright (c) 2009-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.h b/core/src/Configuration/UiMapping.h index 0df4bb080..3285e1ab5 100644 --- a/core/src/Configuration/UiMapping.h +++ b/core/src/Configuration/UiMapping.h @@ -1,7 +1,7 @@ /* * Configuration/UiMapping.h - helper macros and functions for connecting config with UI * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.cpp b/core/src/ConfigurationManager.cpp index 771ba144d..89a5901d2 100644 --- a/core/src/ConfigurationManager.cpp +++ b/core/src/ConfigurationManager.cpp @@ -1,7 +1,7 @@ /* * ConfigurationManager.cpp - class for managing Veyon's configuration * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.h b/core/src/ConfigurationManager.h index ce39c314b..c8d817ba6 100644 --- a/core/src/ConfigurationManager.h +++ b/core/src/ConfigurationManager.h @@ -1,7 +1,7 @@ /* * ConfigurationManager.h - class for managing Veyon's configuration * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.cpp b/core/src/ConfigurationPage.cpp index 7a0b9319b..d5dfba408 100644 --- a/core/src/ConfigurationPage.cpp +++ b/core/src/ConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ConfigurationPage.cpp - implementation of configuration page base class * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.h b/core/src/ConfigurationPage.h index 51d62b6f6..3e4d95ac0 100644 --- a/core/src/ConfigurationPage.h +++ b/core/src/ConfigurationPage.h @@ -1,7 +1,7 @@ /* * ConfigurationPage.h - base class for all configuration pages * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPagePluginInterface.h b/core/src/ConfigurationPagePluginInterface.h index c27d78dc9..770289850 100644 --- a/core/src/ConfigurationPagePluginInterface.h +++ b/core/src/ConfigurationPagePluginInterface.h @@ -1,7 +1,7 @@ /* * ConfigurationPagePluginInterface.h - interface class for configuration pages * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index f003e91c4..94db1aa16 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -1,7 +1,7 @@ /* * CryptoCore.cpp - core functions for crypto features * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.h b/core/src/CryptoCore.h index 890e69985..1aca9ff6b 100644 --- a/core/src/CryptoCore.h +++ b/core/src/CryptoCore.h @@ -1,7 +1,7 @@ /* * CryptoCore.h - core functions for crypto features * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index f58f4d5c9..4df73c50b 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.cpp - implementation of DesktopAccessDialog class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.h b/core/src/DesktopAccessDialog.h index 4ae6dae17..a59d10ad2 100644 --- a/core/src/DesktopAccessDialog.h +++ b/core/src/DesktopAccessDialog.h @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.h - declaration of DesktopAccessDialog class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/EnumHelper.h b/core/src/EnumHelper.h index 58374de58..fa50949a9 100644 --- a/core/src/EnumHelper.h +++ b/core/src/EnumHelper.h @@ -1,7 +1,7 @@ /* * EnumHelper.h - helper functions for enumerations * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Feature.h b/core/src/Feature.h index 7e85fa7d0..7ca479f33 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -1,7 +1,7 @@ /* * Feature.h - declaration of the Feature class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureControl.cpp b/core/src/FeatureControl.cpp index 6abe092c2..eae67b5f7 100644 --- a/core/src/FeatureControl.cpp +++ b/core/src/FeatureControl.cpp @@ -1,7 +1,7 @@ /* * FeatureControl.cpp - implementation of FeatureControl class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureControl.h b/core/src/FeatureControl.h index 854c09edb..8bc4bcc30 100644 --- a/core/src/FeatureControl.h +++ b/core/src/FeatureControl.h @@ -1,7 +1,7 @@ /* * FeatureControl.h - declaration of FeatureControl class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index bb6312377..42acfd6c4 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -1,7 +1,7 @@ /* * FeatureManager.cpp - implementation of the FeatureManager class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index ba2b73216..be5a96435 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -1,7 +1,7 @@ /* * FeatureManager.h - header for the FeatureManager class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.cpp b/core/src/FeatureMessage.cpp index 72590f548..fda931edb 100644 --- a/core/src/FeatureMessage.cpp +++ b/core/src/FeatureMessage.cpp @@ -1,7 +1,7 @@ /* * FeatureMessage.cpp - implementation of a message encapsulation class for features * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.h b/core/src/FeatureMessage.h index fb236e742..ffa8085df 100644 --- a/core/src/FeatureMessage.h +++ b/core/src/FeatureMessage.h @@ -1,7 +1,7 @@ /* * FeatureMessage.h - header for a message encapsulation class for features * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index 51cfbe100..78c04c562 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -1,7 +1,7 @@ /* * FeatureProviderInterface.h - interface class for feature plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index 2d3ee0b53..fde398296 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.cpp - class for managing feature worker instances * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.h b/core/src/FeatureWorkerManager.h index 5c15d80ae..123c55f71 100644 --- a/core/src/FeatureWorkerManager.h +++ b/core/src/FeatureWorkerManager.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.h - class for managing feature worker instances * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.cpp b/core/src/FileSystemBrowser.cpp index 6a7102ace..c6cdda1a0 100644 --- a/core/src/FileSystemBrowser.cpp +++ b/core/src/FileSystemBrowser.cpp @@ -1,7 +1,7 @@ /* * FileSystemBrowser.cpp - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.h b/core/src/FileSystemBrowser.h index 123740724..be4625890 100644 --- a/core/src/FileSystemBrowser.h +++ b/core/src/FileSystemBrowser.h @@ -1,7 +1,7 @@ /* * FileSystemBrowser.h - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index 9143f58eb..9cc367ff8 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -1,7 +1,7 @@ /* * Filesystem.cpp - filesystem related query and manipulation functions * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.h b/core/src/Filesystem.h index dcccbf376..918d7488f 100644 --- a/core/src/Filesystem.h +++ b/core/src/Filesystem.h @@ -1,7 +1,7 @@ /* * Filesystem.h - filesystem related query and manipulation functions * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HashList.h b/core/src/HashList.h index a60fe0d0f..f8af96f22 100644 --- a/core/src/HashList.h +++ b/core/src/HashList.h @@ -1,7 +1,7 @@ /* * HashList.h - extended QHash acting like a list * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index bdc25f2f3..b58163e93 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -1,7 +1,7 @@ /* * HostAddress.cpp - implementation of HostAddress class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.h b/core/src/HostAddress.h index e5e27e206..1db2aa07b 100644 --- a/core/src/HostAddress.h +++ b/core/src/HostAddress.h @@ -1,7 +1,7 @@ /* * HostAddress.h - header for HostAddress class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/KeyboardShortcutTrapper.h b/core/src/KeyboardShortcutTrapper.h index d9784698e..f4d972272 100644 --- a/core/src/KeyboardShortcutTrapper.h +++ b/core/src/KeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * KeyboardShortcutTrapper.h - class for trapping system-wide keyboard shortcuts * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index 564c54e5a..9913ccb2d 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -1,7 +1,7 @@ /* * LockWidget.cpp - widget for locking a client * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.h b/core/src/LockWidget.h index 49dc585ab..2b88b74b2 100644 --- a/core/src/LockWidget.h +++ b/core/src/LockWidget.h @@ -1,7 +1,7 @@ /* * LockWidget.h - widget for locking a client * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.cpp b/core/src/Logger.cpp index c3e1eb390..ad7fcb9a5 100644 --- a/core/src/Logger.cpp +++ b/core/src/Logger.cpp @@ -1,7 +1,7 @@ /* * Logger.cpp - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.h b/core/src/Logger.h index d2311e1bc..a7ca82f1a 100644 --- a/core/src/Logger.h +++ b/core/src/Logger.h @@ -1,7 +1,7 @@ /* * Logger.h - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MessageContext.h b/core/src/MessageContext.h index 13f399593..17ac0daa7 100644 --- a/core/src/MessageContext.h +++ b/core/src/MessageContext.h @@ -1,7 +1,7 @@ /* * MessageContext.h - header for transporting context for message I/O * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index ecd8ba767..e5fba3275 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -1,7 +1,7 @@ /* * MonitoringMode.cpp - implementation of MonitoringMode class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index c41e3e21f..e7d4c7a55 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -1,7 +1,7 @@ /* * MonitoringMode.h - header for the MonitoringMode class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.cpp b/core/src/NetworkObject.cpp index aa31d5c7b..ef7362918 100644 --- a/core/src/NetworkObject.cpp +++ b/core/src/NetworkObject.cpp @@ -1,7 +1,7 @@ /* * NetworkObject.cpp - data class representing a network object * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index 9c2ea22ef..8f6c49293 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -1,7 +1,7 @@ /* * NetworkObject.h - data class representing a network object * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index ccf743d67..31d743285 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.cpp - base class for network object directory implementations * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 4a909fb39..723cdede7 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.h - base class for network object directory implementations * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.cpp b/core/src/NetworkObjectDirectoryManager.cpp index 553afd006..854b8329b 100644 --- a/core/src/NetworkObjectDirectoryManager.cpp +++ b/core/src/NetworkObjectDirectoryManager.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.cpp - implementation of NetworkObjectDirectoryManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.h b/core/src/NetworkObjectDirectoryManager.h index 02a378166..7c4f68c0c 100644 --- a/core/src/NetworkObjectDirectoryManager.h +++ b/core/src/NetworkObjectDirectoryManager.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.h - header file for NetworkObjectDirectoryManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryPluginInterface.h b/core/src/NetworkObjectDirectoryPluginInterface.h index 4eb3e8f14..1532da17f 100644 --- a/core/src/NetworkObjectDirectoryPluginInterface.h +++ b/core/src/NetworkObjectDirectoryPluginInterface.h @@ -2,7 +2,7 @@ * NetworkObjectDirectoryPluginInterface.h - plugin interface for network * object directory implementations * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectModel.h b/core/src/NetworkObjectModel.h index 2c25b3364..4f93b8855 100644 --- a/core/src/NetworkObjectModel.h +++ b/core/src/NetworkObjectModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectModel.h - base class for data models providing grouped network objects * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ObjectManager.h b/core/src/ObjectManager.h index a0c84181c..56339d6ea 100644 --- a/core/src/ObjectManager.h +++ b/core/src/ObjectManager.h @@ -1,7 +1,7 @@ /* * ObjectManager.h - header file for ObjectManager * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformCoreFunctions.h b/core/src/PlatformCoreFunctions.h index 88fde5119..688c3eda2 100644 --- a/core/src/PlatformCoreFunctions.h +++ b/core/src/PlatformCoreFunctions.h @@ -1,7 +1,7 @@ /* * PlatformCoreFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformFilesystemFunctions.h b/core/src/PlatformFilesystemFunctions.h index 1dc7c4e3a..f58fff84b 100644 --- a/core/src/PlatformFilesystemFunctions.h +++ b/core/src/PlatformFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * PlatformFilesystemFunctions.h - interface class for platform filesystem * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformInputDeviceFunctions.h b/core/src/PlatformInputDeviceFunctions.h index 5107533a5..9b33f2ee4 100644 --- a/core/src/PlatformInputDeviceFunctions.h +++ b/core/src/PlatformInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformInputDeviceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformNetworkFunctions.h b/core/src/PlatformNetworkFunctions.h index 96325ebba..b3c43c294 100644 --- a/core/src/PlatformNetworkFunctions.h +++ b/core/src/PlatformNetworkFunctions.h @@ -1,7 +1,7 @@ /* * PlatformNetworkFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginInterface.h b/core/src/PlatformPluginInterface.h index 30384c8c1..a646f0581 100644 --- a/core/src/PlatformPluginInterface.h +++ b/core/src/PlatformPluginInterface.h @@ -1,7 +1,7 @@ /* * PlatformPluginInterface.h - interface class for platform plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.cpp b/core/src/PlatformPluginManager.cpp index 09d8f8fec..b120c13a7 100644 --- a/core/src/PlatformPluginManager.cpp +++ b/core/src/PlatformPluginManager.cpp @@ -1,7 +1,7 @@ /* * PlatformPluginManager.cpp - implementation of PlatformPluginManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.h b/core/src/PlatformPluginManager.h index bba4abe27..7c8b0abea 100644 --- a/core/src/PlatformPluginManager.h +++ b/core/src/PlatformPluginManager.h @@ -1,7 +1,7 @@ /* * PlatformPluginManager.h - header file for PlatformPluginManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformServiceFunctions.h b/core/src/PlatformServiceFunctions.h index 125f6cef3..ee20158e4 100644 --- a/core/src/PlatformServiceFunctions.h +++ b/core/src/PlatformServiceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformServiceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 7164e7804..4001f9303 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -1,7 +1,7 @@ /* * PlatformSessionsFunctions.h - interface class for platform session functions * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformUserFunctions.h b/core/src/PlatformUserFunctions.h index e7cc0bd90..bb8fc9a44 100644 --- a/core/src/PlatformUserFunctions.h +++ b/core/src/PlatformUserFunctions.h @@ -1,7 +1,7 @@ /* * PlatformUserFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Plugin.h b/core/src/Plugin.h index 38f104c96..2aa130399 100644 --- a/core/src/Plugin.h +++ b/core/src/Plugin.h @@ -1,7 +1,7 @@ /* * Plugin.h - generic abstraction of a plugin * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginInterface.h b/core/src/PluginInterface.h index f8627164b..1fcaac6f1 100644 --- a/core/src/PluginInterface.h +++ b/core/src/PluginInterface.h @@ -1,7 +1,7 @@ /* * PluginInterface.h - interface class for plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index adcf76056..a8bf22651 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -1,7 +1,7 @@ /* * PluginManager.cpp - implementation of the PluginManager class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.h b/core/src/PluginManager.h index 0500cdbe5..9f52e3de2 100644 --- a/core/src/PluginManager.h +++ b/core/src/PluginManager.h @@ -1,7 +1,7 @@ /* * PluginManager.h - header for the PluginManager class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.cpp b/core/src/ProcessHelper.cpp index 33b9be093..5e86c5c8d 100644 --- a/core/src/ProcessHelper.cpp +++ b/core/src/ProcessHelper.cpp @@ -1,7 +1,7 @@ /* * ProcessHelper.cpp - implementation of ProcessHelper * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.h b/core/src/ProcessHelper.h index 8a17b1b50..c37dad6d6 100644 --- a/core/src/ProcessHelper.h +++ b/core/src/ProcessHelper.h @@ -1,7 +1,7 @@ /* * ProcessHelper.h - header file for ProcessHelper * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProgressWidget.cpp b/core/src/ProgressWidget.cpp index e213b3896..c319e3fa5 100644 --- a/core/src/ProgressWidget.cpp +++ b/core/src/ProgressWidget.cpp @@ -1,7 +1,7 @@ /* * ProgressWidget.cpp - widget with animated progress indicator * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProgressWidget.h b/core/src/ProgressWidget.h index 947925b27..fd0636044 100644 --- a/core/src/ProgressWidget.h +++ b/core/src/ProgressWidget.h @@ -1,7 +1,7 @@ /* * ProgressWidget.h - widget with animated progress indicator * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.cpp b/core/src/QmlCore.cpp index 222172ba1..8271e55e2 100644 --- a/core/src/QmlCore.cpp +++ b/core/src/QmlCore.cpp @@ -1,7 +1,7 @@ /* * QmlCore.cpp - QML-related core functions * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.h b/core/src/QmlCore.h index c6ccd4ac6..79ec3dd82 100644 --- a/core/src/QmlCore.h +++ b/core/src/QmlCore.h @@ -1,7 +1,7 @@ /* * QmlCore.h - QML-related core functions * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QtCompat.h b/core/src/QtCompat.h index 2f5d579bb..15cb72b69 100644 --- a/core/src/QtCompat.h +++ b/core/src/QtCompat.h @@ -1,7 +1,7 @@ /* * QtCompat.h - functions and templates for compatibility with older Qt versions * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index 5052063d5..a1811894f 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -1,7 +1,7 @@ /* * Screenshot.cpp - class representing a screenshot * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.h b/core/src/Screenshot.h index 5b8ed3949..e8299af1b 100644 --- a/core/src/Screenshot.h +++ b/core/src/Screenshot.h @@ -1,7 +1,7 @@ /* * Screenshot.h - class representing a screenshot * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.cpp b/core/src/ServiceControl.cpp index aefd616e6..00aeb83c4 100644 --- a/core/src/ServiceControl.cpp +++ b/core/src/ServiceControl.cpp @@ -1,7 +1,7 @@ /* * ServiceControl.cpp - class for controlling veyon service * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.h b/core/src/ServiceControl.h index 621dbfbb6..ec5de6110 100644 --- a/core/src/ServiceControl.h +++ b/core/src/ServiceControl.h @@ -1,7 +1,7 @@ /* * ServiceControl.h - header for the ServiceControl class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SocketDevice.h b/core/src/SocketDevice.h index 63af98985..ac2e39f16 100644 --- a/core/src/SocketDevice.h +++ b/core/src/SocketDevice.h @@ -1,7 +1,7 @@ /* * SocketDevice.h - SocketDevice abstraction * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index 8fd6385af..729041d01 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -1,7 +1,7 @@ /* * SystemTrayIcon.cpp - implementation of SystemTrayIcon class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.h b/core/src/SystemTrayIcon.h index 7dc634287..bf5eaabe3 100644 --- a/core/src/SystemTrayIcon.h +++ b/core/src/SystemTrayIcon.h @@ -1,7 +1,7 @@ /* * SystemTrayIcon.h - declaration of SystemTrayIcon class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.cpp b/core/src/ToolButton.cpp index b02519b27..92109cb3b 100644 --- a/core/src/ToolButton.cpp +++ b/core/src/ToolButton.cpp @@ -1,7 +1,7 @@ /* * ToolButton.cpp - implementation of Veyon-tool-button * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.h b/core/src/ToolButton.h index 3f1023f28..06aac7366 100644 --- a/core/src/ToolButton.h +++ b/core/src/ToolButton.h @@ -1,7 +1,7 @@ /* * ToolButton.h - declaration of class ToolButton * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.cpp b/core/src/TranslationLoader.cpp index 96fe1818d..2ae782944 100644 --- a/core/src/TranslationLoader.cpp +++ b/core/src/TranslationLoader.cpp @@ -1,7 +1,7 @@ /* * TranslationLoader.cpp - implementation of TranslationLoader class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.h b/core/src/TranslationLoader.h index a8b1481df..183479f13 100644 --- a/core/src/TranslationLoader.h +++ b/core/src/TranslationLoader.h @@ -1,7 +1,7 @@ /* * TranslationLoader.h - declaration of TranslationLoader class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendInterface.h b/core/src/UserGroupsBackendInterface.h index 9a1d24085..57e0e064e 100644 --- a/core/src/UserGroupsBackendInterface.h +++ b/core/src/UserGroupsBackendInterface.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendInterface.h - interface for a UserGroupsBackend * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.cpp b/core/src/UserGroupsBackendManager.cpp index ec5af2214..48f1997d4 100644 --- a/core/src/UserGroupsBackendManager.cpp +++ b/core/src/UserGroupsBackendManager.cpp @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.cpp - implementation of UserGroupsBackendManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.h b/core/src/UserGroupsBackendManager.h index 5d078c9c1..0e4c78b32 100644 --- a/core/src/UserGroupsBackendManager.h +++ b/core/src/UserGroupsBackendManager.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.h - header file for UserGroupsBackendManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.cpp b/core/src/VariantArrayMessage.cpp index d415bd18e..bdf1031d9 100644 --- a/core/src/VariantArrayMessage.cpp +++ b/core/src/VariantArrayMessage.cpp @@ -1,7 +1,7 @@ /* * VariantArrayMessage.cpp - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.h b/core/src/VariantArrayMessage.h index 7396e13a8..0027a6405 100644 --- a/core/src/VariantArrayMessage.h +++ b/core/src/VariantArrayMessage.h @@ -1,7 +1,7 @@ /* * VariantArrayMessage.h - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index ef0440bc0..4436b63f0 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -1,7 +1,7 @@ /* * VariantStream.cpp - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.h b/core/src/VariantStream.h index 50a5441d1..e851230f1 100644 --- a/core/src/VariantStream.h +++ b/core/src/VariantStream.h @@ -1,7 +1,7 @@ /* * VariantStream.h - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index a94bc049a..5eb470e9e 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -2,7 +2,7 @@ * VeyonConfiguration.cpp - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.h b/core/src/VeyonConfiguration.h index c01a1fe01..eaf7a58b3 100644 --- a/core/src/VeyonConfiguration.h +++ b/core/src/VeyonConfiguration.h @@ -2,7 +2,7 @@ * VeyonConfiguration.h - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index a7b77d03e..997859804 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -2,7 +2,7 @@ * VeyonConfigurationProperties.h - definition of every configuration property * stored in global veyon configuration * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 8481c2424..07ff977da 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -1,7 +1,7 @@ /* * VeyonConnection.cpp - implementation of VeyonConnection * - * Copyright (c) 2008-2020 Tobias Junghans + * Copyright (c) 2008-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index ead626eb2..7a8e67e3d 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -1,7 +1,7 @@ /* * VeyonConnection.h - declaration of class VeyonConnection * - * Copyright (c) 2008-2020 Tobias Junghans + * Copyright (c) 2008-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 88487abb5..9bf2556ef 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -1,7 +1,7 @@ /* * VeyonCore.cpp - implementation of Veyon Core * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index f75c6764d..42e452d85 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -1,7 +1,7 @@ /* * VeyonCore.h - declaration of VeyonCore class + basic headers * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonMasterInterface.h b/core/src/VeyonMasterInterface.h index 695e889d0..8815dcf23 100644 --- a/core/src/VeyonMasterInterface.h +++ b/core/src/VeyonMasterInterface.h @@ -1,7 +1,7 @@ /* * VeyonMasterInterface.h - interface class for VeyonMaster * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index 50bdb1a08..c9be3d9a6 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -1,7 +1,7 @@ /* * VeyonServerInterface.h - interface class for VeyonServer * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.cpp b/core/src/VeyonServiceControl.cpp index a87e3ffee..b36212de0 100644 --- a/core/src/VeyonServiceControl.cpp +++ b/core/src/VeyonServiceControl.cpp @@ -1,7 +1,7 @@ /* * VeyonServiceControl.cpp - class for controlling Veyon service * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.h b/core/src/VeyonServiceControl.h index 422200d1b..63c605d17 100644 --- a/core/src/VeyonServiceControl.h +++ b/core/src/VeyonServiceControl.h @@ -1,7 +1,7 @@ /* * VeyonServiceControl.h - class for controlling the Veyon service * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonWorkerInterface.h b/core/src/VeyonWorkerInterface.h index ffb89be5d..08c2327db 100644 --- a/core/src/VeyonWorkerInterface.h +++ b/core/src/VeyonWorkerInterface.h @@ -1,7 +1,7 @@ /* * VeyonWorkerInterface.h - interface class for VeyonWorker * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index a1dd142bd..9872fabd5 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -1,7 +1,7 @@ /* * VncClientProtocol.cpp - implementation of the VncClientProtocol class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index d85a04bef..0b2e0f70d 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -1,7 +1,7 @@ /* * VncClientProtocol.h - header file for the VncClientProtocol class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 0993dd8bc..2926f57c1 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -1,7 +1,7 @@ /* * VncConnection.cpp - implementation of VncConnection class * - * Copyright (c) 2008-2020 Tobias Junghans + * Copyright (c) 2008-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index cda290460..6c7de27cd 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -1,7 +1,7 @@ /* * VncConnection.h - declaration of VncConnection class * - * Copyright (c) 2008-2020 Tobias Junghans + * Copyright (c) 2008-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.cpp b/core/src/VncEvents.cpp index 77af0263c..6cd223497 100644 --- a/core/src/VncEvents.cpp +++ b/core/src/VncEvents.cpp @@ -1,7 +1,7 @@ /* * VncEvents.cpp - implementation of VNC event classes * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.h b/core/src/VncEvents.h index 7024bf704..0027e7cf5 100644 --- a/core/src/VncEvents.h +++ b/core/src/VncEvents.h @@ -1,7 +1,7 @@ /* * VncEvent.h - declaration of VncEvent and subclasses * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.cpp b/core/src/VncFeatureMessageEvent.cpp index 1bc474109..ea298d83e 100644 --- a/core/src/VncFeatureMessageEvent.cpp +++ b/core/src/VncFeatureMessageEvent.cpp @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.cpp - implementation of FeatureMessageEvent * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.h b/core/src/VncFeatureMessageEvent.h index 206d6f8bc..dae2485ff 100644 --- a/core/src/VncFeatureMessageEvent.h +++ b/core/src/VncFeatureMessageEvent.h @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.h - declaration of class FeatureMessageEvent * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerClient.h b/core/src/VncServerClient.h index d7d804581..020e65320 100644 --- a/core/src/VncServerClient.h +++ b/core/src/VncServerClient.h @@ -1,7 +1,7 @@ /* * VncServerClient.h - header file for the VncServerClient class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerPluginInterface.h b/core/src/VncServerPluginInterface.h index 1dfd47504..57478da34 100644 --- a/core/src/VncServerPluginInterface.h +++ b/core/src/VncServerPluginInterface.h @@ -1,7 +1,7 @@ /* * VncServerPluginInterface.h - abstract interface class for VNC server plugins * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index 66bee0ee0..4adbce66d 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VncServerProtocol.cpp - implementation of the VncServerProtocol class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.h b/core/src/VncServerProtocol.h index 6c7b606dd..40e77027b 100644 --- a/core/src/VncServerProtocol.h +++ b/core/src/VncServerProtocol.h @@ -1,7 +1,7 @@ /* * VncServerProtocol.h - header file for the VncServerProtocol class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index 197789026..81ae9add4 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -1,7 +1,7 @@ /* * VncView.cpp - abstract base for all VNC views * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.h b/core/src/VncView.h index 71723544a..4fc8cef6e 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -1,7 +1,7 @@ /* * VncView.h - abstract base for all VNC views * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index 4e82ec28d..4f95d155f 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -1,7 +1,7 @@ /* * VncViewItem.cpp - QtQuick VNC view item * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.h b/core/src/VncViewItem.h index cbbf2fd77..a428fbd1f 100644 --- a/core/src/VncViewItem.h +++ b/core/src/VncViewItem.h @@ -1,7 +1,7 @@ /* * VncViewItem.h - QtQuick VNC view item * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index fafaed60e..3d2cd8156 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -1,7 +1,7 @@ /* * VncViewWidget.cpp - VNC viewer widget * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index 64b708420..08e238652 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -1,7 +1,7 @@ /* * VncViewWidget.h - VNC viewer widget * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.cpp b/master/src/CheckableItemProxyModel.cpp index 03e7201da..b043bccf2 100644 --- a/master/src/CheckableItemProxyModel.cpp +++ b/master/src/CheckableItemProxyModel.cpp @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.cpp - proxy model for overlaying checked property * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.h b/master/src/CheckableItemProxyModel.h index ece4c243f..6fa3a5973 100644 --- a/master/src/CheckableItemProxyModel.h +++ b/master/src/CheckableItemProxyModel.h @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.h - proxy model for overlaying checked property * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index a4d0f0640..605ad2931 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerControlListModel.cpp - data model for computer control objects * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index ced22aa98..c4758f748 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -1,7 +1,7 @@ /* * ComputerControlListModel.h - data model for computer control objects * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index c999d05b7..84f21ff19 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -1,7 +1,7 @@ /* * ComputerManager.cpp - maintains and provides a computer object list * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index 687a9f0b0..e688808f7 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -1,7 +1,7 @@ /* * ComputerManager.h - maintains and provides a computer object list * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.cpp b/master/src/ComputerMonitoringItem.cpp index 7a3accaa6..916a49d2c 100644 --- a/master/src/ComputerMonitoringItem.cpp +++ b/master/src/ComputerMonitoringItem.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.h b/master/src/ComputerMonitoringItem.h index f40e88b78..37d06be2c 100644 --- a/master/src/ComputerMonitoringItem.h +++ b/master/src/ComputerMonitoringItem.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.cpp b/master/src/ComputerMonitoringModel.cpp index d7a7e3f40..720ebb754 100644 --- a/master/src/ComputerMonitoringModel.cpp +++ b/master/src/ComputerMonitoringModel.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringModel.cpp - implementation of ComputerMonitoringModel * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.h b/master/src/ComputerMonitoringModel.h index 214620e2c..251d14849 100644 --- a/master/src/ComputerMonitoringModel.h +++ b/master/src/ComputerMonitoringModel.h @@ -1,7 +1,7 @@ /* * ComputerSortFilterProxyModel.h - header file for ComputerSortFilterProxyModel * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 521fa2bc9..805cb1ce8 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.h b/master/src/ComputerMonitoringView.h index f38fcfe32..266d576ab 100644 --- a/master/src/ComputerMonitoringView.h +++ b/master/src/ComputerMonitoringView.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 8c5276539..c9e1bb762 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.h b/master/src/ComputerMonitoringWidget.h index b5a2ae177..11501d299 100644 --- a/master/src/ComputerMonitoringWidget.h +++ b/master/src/ComputerMonitoringWidget.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.cpp b/master/src/ComputerSelectModel.cpp index d8add827f..64f2ea058 100644 --- a/master/src/ComputerSelectModel.cpp +++ b/master/src/ComputerSelectModel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectModel.cpp - data model for computer selection * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.h b/master/src/ComputerSelectModel.h index baa294c6c..df4490bfe 100644 --- a/master/src/ComputerSelectModel.h +++ b/master/src/ComputerSelectModel.h @@ -1,7 +1,7 @@ /* * ComputerSelectListModel.h - data model for computer selection * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.cpp b/master/src/ComputerSelectPanel.cpp index 9a2c96005..6f8c47599 100644 --- a/master/src/ComputerSelectPanel.cpp +++ b/master/src/ComputerSelectPanel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.cpp - provides a view for a network object tree * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.h b/master/src/ComputerSelectPanel.h index d4447c5ec..56c9d0e68 100644 --- a/master/src/ComputerSelectPanel.h +++ b/master/src/ComputerSelectPanel.h @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.h - provides a view for a network object tree * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index bcc58f010..2b4eabd7a 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.cpp - fullscreen preview widget * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index 5b0a9f6f1..b9ebe606d 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.h - fullscreen preview widget * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index f2ce78dd8..18da54479 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.cpp - helper for creating documentation figures * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index 5a010adc5..61dbf3978 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.h - helper for creating documentation figures * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.cpp b/master/src/FeatureListModel.cpp index 55e497f6a..4be73aa90 100644 --- a/master/src/FeatureListModel.cpp +++ b/master/src/FeatureListModel.cpp @@ -1,7 +1,7 @@ /* * FeatureListModel.cpp - data model for features * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.h b/master/src/FeatureListModel.h index cd645768d..2cd0130e4 100644 --- a/master/src/FeatureListModel.h +++ b/master/src/FeatureListModel.h @@ -1,7 +1,7 @@ /* * FeatureListListModel.h - data model for features * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.cpp b/master/src/FlexibleListView.cpp index f42207c63..1a3481811 100644 --- a/master/src/FlexibleListView.cpp +++ b/master/src/FlexibleListView.cpp @@ -1,7 +1,7 @@ /* * FlexibleListView.cpp - list view with flexible icon positions * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.h b/master/src/FlexibleListView.h index ce1cb95c1..bdd11c199 100644 --- a/master/src/FlexibleListView.h +++ b/master/src/FlexibleListView.h @@ -1,7 +1,7 @@ /* * FlexibleListView.h - list view with flexible icon positions * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.cpp b/master/src/LocationDialog.cpp index b5b18d3fe..73226eddd 100644 --- a/master/src/LocationDialog.cpp +++ b/master/src/LocationDialog.cpp @@ -1,7 +1,7 @@ /* * LocationDialog.cpp - header file for LocationDialog * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.h b/master/src/LocationDialog.h index f2b10b50d..e4d202203 100644 --- a/master/src/LocationDialog.h +++ b/master/src/LocationDialog.h @@ -1,7 +1,7 @@ /* * LocationDialog.h - header file for LocationDialog * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.cpp b/master/src/MainToolBar.cpp index e3386fadb..3504053fb 100644 --- a/master/src/MainToolBar.cpp +++ b/master/src/MainToolBar.cpp @@ -1,7 +1,7 @@ /* * MainToolBar.cpp - MainToolBar for MainWindow * - * Copyright (c) 2007-2020 Tobias Junghans + * Copyright (c) 2007-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.h b/master/src/MainToolBar.h index 4b75594ff..8a69af202 100644 --- a/master/src/MainToolBar.h +++ b/master/src/MainToolBar.h @@ -1,7 +1,7 @@ /* * MainToolBar.h - MainToolBar for MainWindow * - * Copyright (c) 2007-2020 Tobias Junghans + * Copyright (c) 2007-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 801b482af..47580e2f0 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2004-2020 Tobias Junghans + * Copyright (c) 2004-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.h b/master/src/MainWindow.h index ba51cf2cc..1466a745e 100644 --- a/master/src/MainWindow.h +++ b/master/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of Veyon Master Application * - * Copyright (c) 2004-2020 Tobias Junghans + * Copyright (c) 2004-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index ec652bc73..1ce8830a2 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.cpp - implementation of NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.h b/master/src/NetworkObjectFilterProxyModel.h index 7e3e6901b..058c47d6e 100644 --- a/master/src/NetworkObjectFilterProxyModel.h +++ b/master/src/NetworkObjectFilterProxyModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.h - header file for NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.cpp b/master/src/NetworkObjectOverlayDataModel.cpp index 8702293f3..8d23260f9 100644 --- a/master/src/NetworkObjectOverlayDataModel.cpp +++ b/master/src/NetworkObjectOverlayDataModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.cpp - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.h b/master/src/NetworkObjectOverlayDataModel.h index d2e34197d..713647dd9 100644 --- a/master/src/NetworkObjectOverlayDataModel.h +++ b/master/src/NetworkObjectOverlayDataModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.h - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.cpp b/master/src/NetworkObjectTreeModel.cpp index 5590dcbe3..115d7c894 100644 --- a/master/src/NetworkObjectTreeModel.cpp +++ b/master/src/NetworkObjectTreeModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.cpp - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.h b/master/src/NetworkObjectTreeModel.h index 403a822a9..344d0ccb9 100644 --- a/master/src/NetworkObjectTreeModel.h +++ b/master/src/NetworkObjectTreeModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.h - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/RecursiveFilterProxyModel.cpp b/master/src/RecursiveFilterProxyModel.cpp index fe0171cae..a8c8cab27 100644 --- a/master/src/RecursiveFilterProxyModel.cpp +++ b/master/src/RecursiveFilterProxyModel.cpp @@ -1,7 +1,7 @@ /* * RecursiveFilterProxyModel.cpp - proxy model for recursive filtering * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/RecursiveFilterProxyModel.h b/master/src/RecursiveFilterProxyModel.h index 015d00b75..6cbd66ab5 100644 --- a/master/src/RecursiveFilterProxyModel.h +++ b/master/src/RecursiveFilterProxyModel.h @@ -1,7 +1,7 @@ /* * RecursiveFilterProxyModel.h - proxy model for recursive filtering * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.cpp b/master/src/ScreenshotManagementPanel.cpp index 9baa60d80..4b578d76d 100644 --- a/master/src/ScreenshotManagementPanel.cpp +++ b/master/src/ScreenshotManagementPanel.cpp @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.cpp - implementation of screenshot management view * - * Copyright (c) 2004-2020 Tobias Junghans + * Copyright (c) 2004-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.h b/master/src/ScreenshotManagementPanel.h index ab798f5d3..fee82108e 100644 --- a/master/src/ScreenshotManagementPanel.h +++ b/master/src/ScreenshotManagementPanel.h @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.h - declaration of screenshot management view * - * Copyright (c) 2004-2020 Tobias Junghans + * Copyright (c) 2004-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.cpp b/master/src/SlideshowModel.cpp index b13c27645..063a41e7d 100644 --- a/master/src/SlideshowModel.cpp +++ b/master/src/SlideshowModel.cpp @@ -1,7 +1,7 @@ /* * SlideshowModel.cpp - implementation of SlideshowModel * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.h b/master/src/SlideshowModel.h index cc31d0c2f..d37fb2931 100644 --- a/master/src/SlideshowModel.h +++ b/master/src/SlideshowModel.h @@ -1,7 +1,7 @@ /* * SlideshowModel.h - header file for SlideshowModel * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index 138f9f3ee..d7967373a 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -1,7 +1,7 @@ /* * SlideshowPanel.cpp - implementation of SlideshowPanel * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.h b/master/src/SlideshowPanel.h index a3cd45ae6..66c2bc897 100644 --- a/master/src/SlideshowPanel.h +++ b/master/src/SlideshowPanel.h @@ -1,7 +1,7 @@ /* * SlideshowPanel.h - declaration of SlideshowPanel * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.cpp b/master/src/SpotlightModel.cpp index be947ad87..706c3247e 100644 --- a/master/src/SpotlightModel.cpp +++ b/master/src/SpotlightModel.cpp @@ -1,7 +1,7 @@ /* * SpotlightModel.cpp - implementation of SpotlightModel * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.h b/master/src/SpotlightModel.h index 529ff49f0..c585fddc9 100644 --- a/master/src/SpotlightModel.h +++ b/master/src/SpotlightModel.h @@ -1,7 +1,7 @@ /* * SpotlightModel.h - header file for SpotlightModel * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index 3fc871652..07b93670b 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -1,7 +1,7 @@ /* * SpotlightPanel.cpp - implementation of SpotlightPanel * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index 649e0761e..e0ddeb2ae 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -1,7 +1,7 @@ /* * SpotlightPanel.h - declaration of SpotlightPanel * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index b5f73f679..4406edf55 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -2,7 +2,7 @@ * UserConfig.cpp - Configuration object storing personal settings * for the Veyon Master Application * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index 56265fb95..48906ebbc 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -1,7 +1,7 @@ /* * UserConfig.h - UserConfig class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 0716fc947..da626708c 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -1,7 +1,7 @@ /* * VeyonMaster.cpp - management of application-global instances * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 662731940..e26ea7f7b 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -1,7 +1,7 @@ /* * VeyonMaster.h - global instances * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/main.cpp b/master/src/main.cpp index 1a899a5eb..fa1f59dc1 100644 --- a/master/src/main.cpp +++ b/master/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - startup routine for Veyon Master Application * - * Copyright (c) 2004-2020 Tobias Junghans + * Copyright (c) 2004-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/veyon-master.rc.in b/master/veyon-master.rc.in index 401c735f3..ebd5b603e 100644 --- a/master/veyon-master.rc.in +++ b/master/veyon-master.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Master\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-master.exe\0" END END diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index f0716ff7c..0c1bc4ec3 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -2,7 +2,7 @@ !define COMP_NAME "Veyon Solutions" !define WEB_SITE "https://veyon.io" !define VERSION "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@.@VERSION_BUILD@" -!define COPYRIGHT "2004-2020 Veyon Solutions / Tobias Junghans" +!define COPYRIGHT "2004-2021 Veyon Solutions / Tobias Junghans" !define DESCRIPTION "Veyon Installer" !define LICENSE_TXT "COPYING" !define INSTALLER_NAME "veyon-${VERSION}-@MINGW_PLATFORM@-setup.exe" diff --git a/plugins/authkeys/AuthKeysConfiguration.h b/plugins/authkeys/AuthKeysConfiguration.h index f127704a8..4a2dec95b 100644 --- a/plugins/authkeys/AuthKeysConfiguration.h +++ b/plugins/authkeys/AuthKeysConfiguration.h @@ -1,7 +1,7 @@ /* * AuthKeysConfiguration.h - configuration values for AuthKeys plugin * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.cpp b/plugins/authkeys/AuthKeysConfigurationWidget.cpp index 25c159ef6..08544d137 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.cpp +++ b/plugins/authkeys/AuthKeysConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.cpp - implementation of the authentication configuration page * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.h b/plugins/authkeys/AuthKeysConfigurationWidget.h index e309d1765..a66870400 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.h +++ b/plugins/authkeys/AuthKeysConfigurationWidget.h @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.h - header for the AuthKeysConfigurationDialog class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index 19f1e5c58..7e9d359c6 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -1,7 +1,7 @@ /* * AuthKeysManager.cpp - implementation of AuthKeysManager class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.h b/plugins/authkeys/AuthKeysManager.h index 40107e927..0f6ffe35a 100644 --- a/plugins/authkeys/AuthKeysManager.h +++ b/plugins/authkeys/AuthKeysManager.h @@ -1,7 +1,7 @@ /* * AuthKeysManager.h - declaration of AuthKeysManager class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index 2de54bf3b..9d0e4450d 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.cpp - implementation of AuthKeysPlugin class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index 04d84edca..06f1cb8f1 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.h - declaration of AuthKeysPlugin class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.cpp b/plugins/authkeys/AuthKeysTableModel.cpp index 7db695599..d9253728d 100644 --- a/plugins/authkeys/AuthKeysTableModel.cpp +++ b/plugins/authkeys/AuthKeysTableModel.cpp @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.cpp - implementation of AuthKeysTableModel class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.h b/plugins/authkeys/AuthKeysTableModel.h index 42b9ff133..1c6bbe0f7 100644 --- a/plugins/authkeys/AuthKeysTableModel.h +++ b/plugins/authkeys/AuthKeysTableModel.h @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.h - declaration of AuthKeysTableModel class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.cpp b/plugins/authlogon/AuthLogonDialog.cpp index a327481df..b71078165 100644 --- a/plugins/authlogon/AuthLogonDialog.cpp +++ b/plugins/authlogon/AuthLogonDialog.cpp @@ -1,7 +1,7 @@ /* * AuthLogonDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.h b/plugins/authlogon/AuthLogonDialog.h index c58f9eed0..4d0ae37a9 100644 --- a/plugins/authlogon/AuthLogonDialog.h +++ b/plugins/authlogon/AuthLogonDialog.h @@ -1,7 +1,7 @@ /* * AuthLogonDialog.h - declaration of password dialog * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index d7b462c17..d9811975b 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.cpp - implementation of AuthLogonPlugin class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h index 730fffce0..3f9ea8627 100644 --- a/plugins/authlogon/AuthLogonPlugin.h +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.h - declaration of AuthLogonPlugin class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleConfiguration.h b/plugins/authsimple/AuthSimpleConfiguration.h index 1763c5997..5da222ab3 100644 --- a/plugins/authsimple/AuthSimpleConfiguration.h +++ b/plugins/authsimple/AuthSimpleConfiguration.h @@ -1,7 +1,7 @@ /* * AuthSimpleConfiguration.h - configuration values for AuthSimple plugin * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.cpp b/plugins/authsimple/AuthSimpleDialog.cpp index c6c029c39..b26438cde 100644 --- a/plugins/authsimple/AuthSimpleDialog.cpp +++ b/plugins/authsimple/AuthSimpleDialog.cpp @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.h b/plugins/authsimple/AuthSimpleDialog.h index a6713f8a2..e67e1a821 100644 --- a/plugins/authsimple/AuthSimpleDialog.h +++ b/plugins/authsimple/AuthSimpleDialog.h @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.h - declaration of password dialog * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp index 628228df5..d1c07e178 100644 --- a/plugins/authsimple/AuthSimplePlugin.cpp +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.cpp - implementation of AuthSimplePlugin class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.h b/plugins/authsimple/AuthSimplePlugin.h index 41623a265..109e5ec28 100644 --- a/plugins/authsimple/AuthSimplePlugin.h +++ b/plugins/authsimple/AuthSimplePlugin.h @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.h - declaration of AuthSimplePlugin class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.cpp b/plugins/builtindirectory/BuiltinDirectory.cpp index 37c9f803a..f4e7fc977 100644 --- a/plugins/builtindirectory/BuiltinDirectory.cpp +++ b/plugins/builtindirectory/BuiltinDirectory.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectory.cpp - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.h b/plugins/builtindirectory/BuiltinDirectory.h index 1f35e58ce..5731792aa 100644 --- a/plugins/builtindirectory/BuiltinDirectory.h +++ b/plugins/builtindirectory/BuiltinDirectory.h @@ -1,7 +1,7 @@ /* * BuiltinDirectory.h - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h index 5abdfca36..43c745c00 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfiguration.h - configuration values for BuiltinDirectory plugin * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp index 86a581f05..331b1c54d 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.cpp - implementation of BuiltinDirectoryConfigurationPage * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h index a7de49981..1259f5a6c 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.h - header for the BuiltinDirectoryConfigurationPage class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 248b508f1..d6bb33595 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.cpp - implementation of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.h b/plugins/builtindirectory/BuiltinDirectoryPlugin.h index 123bf20be..236c4344e 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.h +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.h - declaration of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.cpp b/plugins/demo/DemoAuthentication.cpp index 9b93ab5b5..02a1f9c76 100644 --- a/plugins/demo/DemoAuthentication.cpp +++ b/plugins/demo/DemoAuthentication.cpp @@ -1,7 +1,7 @@ /* * DemoAuthentication.cpp - implementation of DemoAuthentication class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index c3be515cc..5b22c8d56 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -1,7 +1,7 @@ /* * DemoAuthentication.h - declaration of DemoAuthentication class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index 5dbda2afb..033b319bd 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -1,7 +1,7 @@ /* * DemoClient.cpp - client widget for demo mode * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.h b/plugins/demo/DemoClient.h index ec7f50cab..567244187 100644 --- a/plugins/demo/DemoClient.h +++ b/plugins/demo/DemoClient.h @@ -1,7 +1,7 @@ /* * DemoClient.h - client for demo server * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfiguration.h b/plugins/demo/DemoConfiguration.h index 0fa913486..2dfd986f0 100644 --- a/plugins/demo/DemoConfiguration.h +++ b/plugins/demo/DemoConfiguration.h @@ -1,7 +1,7 @@ /* * DemoConfiguration.h - configuration values for Demo plugin * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.cpp b/plugins/demo/DemoConfigurationPage.cpp index 5ff1d3940..d5a838e69 100644 --- a/plugins/demo/DemoConfigurationPage.cpp +++ b/plugins/demo/DemoConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.cpp - implementation of DemoConfigurationPage * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.h b/plugins/demo/DemoConfigurationPage.h index e103eedc8..0c2369198 100644 --- a/plugins/demo/DemoConfigurationPage.h +++ b/plugins/demo/DemoConfigurationPage.h @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.h - header for the DemoConfigurationPage class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 405a1d421..852caeb2a 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.cpp - implementation of DemoFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 35e4e9806..f63b108e8 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.h - declaration of DemoFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index bc0c91e27..b143c84f0 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index abd08c8f3..09d757f3b 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -2,7 +2,7 @@ * DemoServer.h - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 795d4865a..86f087ec2 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.h b/plugins/demo/DemoServerConnection.h index 4eedae085..6a5ea0854 100644 --- a/plugins/demo/DemoServerConnection.h +++ b/plugins/demo/DemoServerConnection.h @@ -1,7 +1,7 @@ /* * DemoServerConnection.h - header file for DemoServerConnection class * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.cpp b/plugins/demo/DemoServerProtocol.cpp index 144308831..03d8020fd 100644 --- a/plugins/demo/DemoServerProtocol.cpp +++ b/plugins/demo/DemoServerProtocol.cpp @@ -1,7 +1,7 @@ /* * DemoServerProtocol.cpp - implementation of DemoServerProtocol class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.h b/plugins/demo/DemoServerProtocol.h index 78052b526..c269e68cf 100644 --- a/plugins/demo/DemoServerProtocol.h +++ b/plugins/demo/DemoServerProtocol.h @@ -1,7 +1,7 @@ /* * DemoServerProtocol.h - header file for DemoServerProtocol class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.cpp b/plugins/desktopservices/DesktopServiceObject.cpp index 1c5067656..3ae7d7be0 100644 --- a/plugins/desktopservices/DesktopServiceObject.cpp +++ b/plugins/desktopservices/DesktopServiceObject.cpp @@ -1,7 +1,7 @@ /* * DesktopServiceObject.cpp - data class representing a desktop service object * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.h b/plugins/desktopservices/DesktopServiceObject.h index b44778526..e60c8754c 100644 --- a/plugins/desktopservices/DesktopServiceObject.h +++ b/plugins/desktopservices/DesktopServiceObject.h @@ -1,7 +1,7 @@ /* * DesktopServiceObject.h - data class representing a desktop service object * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfiguration.h b/plugins/desktopservices/DesktopServicesConfiguration.h index 1686dc9a9..cf94c4ef1 100644 --- a/plugins/desktopservices/DesktopServicesConfiguration.h +++ b/plugins/desktopservices/DesktopServicesConfiguration.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfiguration.h - configuration values for DesktopServices * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp index 2cd78daa5..bec090519 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.cpp - implementation of the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.h b/plugins/desktopservices/DesktopServicesConfigurationPage.h index cdfc97e39..093f720f8 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.h +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.h - header for the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index f977e9e28..6dba22a07 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.cpp - implementation of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index 06b6c1cec..ed3cbb6b4 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.h - declaration of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.cpp b/plugins/desktopservices/OpenWebsiteDialog.cpp index 5a37c184d..f9834123b 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.cpp +++ b/plugins/desktopservices/OpenWebsiteDialog.cpp @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.cpp - implementation of OpenWebsiteDialog * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.h b/plugins/desktopservices/OpenWebsiteDialog.h index e56f49880..37068a44f 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.h +++ b/plugins/desktopservices/OpenWebsiteDialog.h @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.h - declaration of class OpenWebsiteDialog * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/desktopservices/RunProgramDialog.cpp b/plugins/desktopservices/RunProgramDialog.cpp index b5d8385b1..67c9688ff 100644 --- a/plugins/desktopservices/RunProgramDialog.cpp +++ b/plugins/desktopservices/RunProgramDialog.cpp @@ -1,7 +1,7 @@ /* * RunProgramDialog.cpp - implementation of RunProgramDialog * - * Copyright (c) 2004-2020 Tobias Junghans + * Copyright (c) 2004-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/RunProgramDialog.h b/plugins/desktopservices/RunProgramDialog.h index aa722a8b0..75690550c 100644 --- a/plugins/desktopservices/RunProgramDialog.h +++ b/plugins/desktopservices/RunProgramDialog.h @@ -1,7 +1,7 @@ /* * RunProgramDialog.h - declaration of class RunProgramDialog * - * Copyright (c) 2004-2020 Tobias Junghans + * Copyright (c) 2004-2021 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileReadThread.cpp b/plugins/filetransfer/FileReadThread.cpp index 35d4c179a..f621e9f78 100644 --- a/plugins/filetransfer/FileReadThread.cpp +++ b/plugins/filetransfer/FileReadThread.cpp @@ -1,7 +1,7 @@ /* * FileReadThread.cpp - implementation of FileReadThread class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileReadThread.h b/plugins/filetransfer/FileReadThread.h index 1510b5ffb..b4736ebf9 100644 --- a/plugins/filetransfer/FileReadThread.h +++ b/plugins/filetransfer/FileReadThread.h @@ -1,7 +1,7 @@ /* * FileReadThread.h - declaration of FileReadThread class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfiguration.h b/plugins/filetransfer/FileTransferConfiguration.h index f22e95192..d1365d4a5 100644 --- a/plugins/filetransfer/FileTransferConfiguration.h +++ b/plugins/filetransfer/FileTransferConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferConfiguration.h - configuration values for FileTransfer plugin * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.cpp b/plugins/filetransfer/FileTransferConfigurationPage.cpp index 129981ccb..acc7a0c70 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.cpp +++ b/plugins/filetransfer/FileTransferConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.cpp - implementation of FileTransferConfigurationPage * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.h b/plugins/filetransfer/FileTransferConfigurationPage.h index 1516a01e9..1d7e487e5 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.h +++ b/plugins/filetransfer/FileTransferConfigurationPage.h @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.h - header for the FileTransferConfigurationPage class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.cpp b/plugins/filetransfer/FileTransferController.cpp index 97b9d30e0..3c01e3180 100644 --- a/plugins/filetransfer/FileTransferController.cpp +++ b/plugins/filetransfer/FileTransferController.cpp @@ -1,7 +1,7 @@ /* * FileTransferController.cpp - implementation of FileTransferController class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.h b/plugins/filetransfer/FileTransferController.h index 9143f9e71..4d0ce91d5 100644 --- a/plugins/filetransfer/FileTransferController.h +++ b/plugins/filetransfer/FileTransferController.h @@ -1,7 +1,7 @@ /* * FileTransferController.h - declaration of FileTransferController class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.cpp b/plugins/filetransfer/FileTransferDialog.cpp index 82fd14c4c..99e61cc3e 100644 --- a/plugins/filetransfer/FileTransferDialog.cpp +++ b/plugins/filetransfer/FileTransferDialog.cpp @@ -1,7 +1,7 @@ /* * FileTransferDialog.cpp - implementation of FileTransferDialog * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.h b/plugins/filetransfer/FileTransferDialog.h index b6bea7a7c..4874f099c 100644 --- a/plugins/filetransfer/FileTransferDialog.h +++ b/plugins/filetransfer/FileTransferDialog.h @@ -1,7 +1,7 @@ /* * FileTransferDialog.h - declaration of class FileTransferDialog * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileTransferListModel.cpp b/plugins/filetransfer/FileTransferListModel.cpp index 90914e255..b7ceecff3 100644 --- a/plugins/filetransfer/FileTransferListModel.cpp +++ b/plugins/filetransfer/FileTransferListModel.cpp @@ -1,7 +1,7 @@ /* * FileTransferListModel.cpp - implementation of FileTransferListModel class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferListModel.h b/plugins/filetransfer/FileTransferListModel.h index 7983c4e96..381f4958d 100644 --- a/plugins/filetransfer/FileTransferListModel.h +++ b/plugins/filetransfer/FileTransferListModel.h @@ -1,7 +1,7 @@ /* * FileTransferListModel.h - declaration of FileTransferListModel class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.cpp b/plugins/filetransfer/FileTransferPlugin.cpp index 1b5e2b2e7..9ecda9df4 100644 --- a/plugins/filetransfer/FileTransferPlugin.cpp +++ b/plugins/filetransfer/FileTransferPlugin.cpp @@ -1,7 +1,7 @@ /* * FileTransferPlugin.cpp - implementation of FileTransferPlugin class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.h b/plugins/filetransfer/FileTransferPlugin.h index 25cd9c4ba..dd223c676 100644 --- a/plugins/filetransfer/FileTransferPlugin.h +++ b/plugins/filetransfer/FileTransferPlugin.h @@ -1,7 +1,7 @@ /* * FileTransferPlugin.h - declaration of FileTransferPlugin class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferUserConfiguration.h b/plugins/filetransfer/FileTransferUserConfiguration.h index eba43a4f2..eb153ae68 100644 --- a/plugins/filetransfer/FileTransferUserConfiguration.h +++ b/plugins/filetransfer/FileTransferUserConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferUserConfiguration.h - user config values for file transfer * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapConfiguration.h b/plugins/ldap/AuthLdapConfiguration.h index ce21e283c..b61530441 100644 --- a/plugins/ldap/AuthLdapConfiguration.h +++ b/plugins/ldap/AuthLdapConfiguration.h @@ -1,7 +1,7 @@ /* * LdapConfiguration.h - LDAP-auth-specific configuration values * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapConfigurationWidget.cpp b/plugins/ldap/AuthLdapConfigurationWidget.cpp index 10680c96d..9c71e4798 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.cpp +++ b/plugins/ldap/AuthLdapConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * AuthLdapConfigurationWidget.cpp - implementation of the authentication configuration page * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapConfigurationWidget.h b/plugins/ldap/AuthLdapConfigurationWidget.h index 5f99b69be..c265f8f0c 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.h +++ b/plugins/ldap/AuthLdapConfigurationWidget.h @@ -1,7 +1,7 @@ /* * AuthLdapConfigurationWidget.h - header for the AuthLdapConfigurationWidget class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapCore.cpp b/plugins/ldap/AuthLdapCore.cpp index 37c3ff839..562976975 100644 --- a/plugins/ldap/AuthLdapCore.cpp +++ b/plugins/ldap/AuthLdapCore.cpp @@ -1,7 +1,7 @@ /* * AuthLdapCore.cpp - implementation of AuthLdapCore class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapCore.h b/plugins/ldap/AuthLdapCore.h index 0eae0bb67..06266feb1 100644 --- a/plugins/ldap/AuthLdapCore.h +++ b/plugins/ldap/AuthLdapCore.h @@ -1,7 +1,7 @@ /* * AuthLdapCore.h - declaration of AuthLdapCore class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapDialog.cpp b/plugins/ldap/AuthLdapDialog.cpp index 473b25350..cf5659111 100644 --- a/plugins/ldap/AuthLdapDialog.cpp +++ b/plugins/ldap/AuthLdapDialog.cpp @@ -1,7 +1,7 @@ /* * AuthLdapDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapDialog.h b/plugins/ldap/AuthLdapDialog.h index 02a0695bb..ff786940f 100644 --- a/plugins/ldap/AuthLdapDialog.h +++ b/plugins/ldap/AuthLdapDialog.h @@ -1,7 +1,7 @@ /* * AuthLdapDialog.h - declaration of password dialog * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/LdapPlugin.cpp b/plugins/ldap/LdapPlugin.cpp index 2b16f1bc5..0a4678575 100644 --- a/plugins/ldap/LdapPlugin.cpp +++ b/plugins/ldap/LdapPlugin.cpp @@ -1,7 +1,7 @@ /* * LdapPlugin.cpp - implementation of LdapPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/LdapPlugin.h b/plugins/ldap/LdapPlugin.h index a8d87d2ae..4e0f05787 100644 --- a/plugins/ldap/LdapPlugin.h +++ b/plugins/ldap/LdapPlugin.h @@ -1,7 +1,7 @@ /* * LdapPlugin.h - declaration of LdapPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapBrowseDialog.cpp b/plugins/ldap/common/LdapBrowseDialog.cpp index e21d33f50..741d2ce03 100644 --- a/plugins/ldap/common/LdapBrowseDialog.cpp +++ b/plugins/ldap/common/LdapBrowseDialog.cpp @@ -1,7 +1,7 @@ /* * LdapBrowseDialog.cpp - dialog for browsing LDAP directories * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapBrowseDialog.h b/plugins/ldap/common/LdapBrowseDialog.h index 4dbedf4dd..dec49f218 100644 --- a/plugins/ldap/common/LdapBrowseDialog.h +++ b/plugins/ldap/common/LdapBrowseDialog.h @@ -1,7 +1,7 @@ /* * LdapBrowseDialog.h - dialog for browsing LDAP directories * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapBrowseModel.cpp b/plugins/ldap/common/LdapBrowseModel.cpp index e8d7320cb..d74a8be27 100644 --- a/plugins/ldap/common/LdapBrowseModel.cpp +++ b/plugins/ldap/common/LdapBrowseModel.cpp @@ -1,7 +1,7 @@ /* * LdapModel.cpp - item model for browsing LDAP directories * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapBrowseModel.h b/plugins/ldap/common/LdapBrowseModel.h index f63943bcc..01125c060 100644 --- a/plugins/ldap/common/LdapBrowseModel.h +++ b/plugins/ldap/common/LdapBrowseModel.h @@ -1,7 +1,7 @@ /* * LdapModel.h - item model for browsing LDAP directories * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapClient.cpp b/plugins/ldap/common/LdapClient.cpp index d3e838d93..64f2d54ca 100644 --- a/plugins/ldap/common/LdapClient.cpp +++ b/plugins/ldap/common/LdapClient.cpp @@ -1,7 +1,7 @@ /* * LdapClient.cpp - class representing the LDAP directory and providing access to directory entries * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index 36f30e9a8..0289b12c7 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -1,7 +1,7 @@ /* * LdapClient.h - class implementing an LDAP client * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapCommon.h b/plugins/ldap/common/LdapCommon.h index 3ff2280dc..1087380f4 100644 --- a/plugins/ldap/common/LdapCommon.h +++ b/plugins/ldap/common/LdapCommon.h @@ -1,7 +1,7 @@ /* * LdapCommon.h - common definitions for the LDAP library * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfiguration.cpp b/plugins/ldap/common/LdapConfiguration.cpp index bbc94284d..cebe68e0a 100644 --- a/plugins/ldap/common/LdapConfiguration.cpp +++ b/plugins/ldap/common/LdapConfiguration.cpp @@ -1,7 +1,7 @@ /* * LdapConfiguration.cpp - LDAP-specific configuration values * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index 16261c922..c81496dbb 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -1,7 +1,7 @@ /* * LdapConfiguration.h - LDAP-specific configuration values * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfigurationPage.cpp b/plugins/ldap/common/LdapConfigurationPage.cpp index e3b274ebf..931517308 100644 --- a/plugins/ldap/common/LdapConfigurationPage.cpp +++ b/plugins/ldap/common/LdapConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * LdapConfigurationPage.cpp - implementation of the LdapConfigurationPage class * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfigurationPage.h b/plugins/ldap/common/LdapConfigurationPage.h index ad40f0dc5..602a3d5df 100644 --- a/plugins/ldap/common/LdapConfigurationPage.h +++ b/plugins/ldap/common/LdapConfigurationPage.h @@ -1,7 +1,7 @@ /* * LdapConfigurationPage.h - header for the LdapConfigurationPage class * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfigurationTest.cpp b/plugins/ldap/common/LdapConfigurationTest.cpp index b5e1f4822..f84167310 100644 --- a/plugins/ldap/common/LdapConfigurationTest.cpp +++ b/plugins/ldap/common/LdapConfigurationTest.cpp @@ -1,7 +1,7 @@ /* * LdapConfigurationTest.cpp - implementation of the LdapConfigurationTest class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfigurationTest.h b/plugins/ldap/common/LdapConfigurationTest.h index 22a0529ca..cd86cf75d 100644 --- a/plugins/ldap/common/LdapConfigurationTest.h +++ b/plugins/ldap/common/LdapConfigurationTest.h @@ -1,7 +1,7 @@ /* * LdapConfigurationTest.h - header for the LdapConfigurationTest class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index 2ab3baa1f..f6ebd7aea 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -1,7 +1,7 @@ /* * LdapDirectory.cpp - class representing the LDAP directory and providing access to directory entries * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapDirectory.h b/plugins/ldap/common/LdapDirectory.h index 36e81c70d..e2f331216 100644 --- a/plugins/ldap/common/LdapDirectory.h +++ b/plugins/ldap/common/LdapDirectory.h @@ -1,7 +1,7 @@ /* * LdapDirectory.h - class representing the LDAP directory and providing access to directory entries * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index 051131a01..28f8f7526 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * LdapNetworkObjectDirectory.cpp - provides a NetworkObjectDirectory for LDAP * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.h b/plugins/ldap/common/LdapNetworkObjectDirectory.h index 9d180cdc3..bd38c7d84 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * LdapNetworkObjectDirectory.h - provides a NetworkObjectDirectory for LDAP * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/kldap/KLdapIntegration.cpp b/plugins/ldap/kldap/KLdapIntegration.cpp index 2d99d44fb..35402e0c4 100644 --- a/plugins/ldap/kldap/KLdapIntegration.cpp +++ b/plugins/ldap/kldap/KLdapIntegration.cpp @@ -1,7 +1,7 @@ /* * KLdapIntegration.cpp - definition of logging category for kldap * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/kldap/kldap_export.h b/plugins/ldap/kldap/kldap_export.h index f40486099..91de1d538 100644 --- a/plugins/ldap/kldap/kldap_export.h +++ b/plugins/ldap/kldap/kldap_export.h @@ -1,7 +1,7 @@ /* * kldap_export.h - definition of symbol visibility macros for kldap * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/kldap/klocalizedstring.h b/plugins/ldap/kldap/klocalizedstring.h index 4b45b4493..c232ff051 100644 --- a/plugins/ldap/kldap/klocalizedstring.h +++ b/plugins/ldap/kldap/klocalizedstring.h @@ -1,7 +1,7 @@ /* * klocalizedstring.h - dummy replacements for i18n() functions of KDE * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/kldap/ldap_debug.h b/plugins/ldap/kldap/ldap_debug.h index baf136c85..118b7f16f 100644 --- a/plugins/ldap/kldap/ldap_debug.h +++ b/plugins/ldap/kldap/ldap_debug.h @@ -1,7 +1,7 @@ /* * ldap_debug.h - declaration of logging category for kldap * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/LogonHelper.cpp b/plugins/platform/common/LogonHelper.cpp index d0116a02b..ed384fec2 100644 --- a/plugins/platform/common/LogonHelper.cpp +++ b/plugins/platform/common/LogonHelper.cpp @@ -1,7 +1,7 @@ /* * LogonHelper.cpp - implementation of LogonHelper class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/LogonHelper.h b/plugins/platform/common/LogonHelper.h index e9fc68c12..c0c0aa851 100644 --- a/plugins/platform/common/LogonHelper.h +++ b/plugins/platform/common/LogonHelper.h @@ -1,7 +1,7 @@ /* * LogonHelper.h - declaration of LogonHelper class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.cpp b/plugins/platform/common/PersistentLogonCredentials.cpp index 5fd8c4072..f4a1eff1d 100644 --- a/plugins/platform/common/PersistentLogonCredentials.cpp +++ b/plugins/platform/common/PersistentLogonCredentials.cpp @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.cpp - implementation of PersistentLogonCredentials class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.h b/plugins/platform/common/PersistentLogonCredentials.h index 2fdf73582..4161f7960 100644 --- a/plugins/platform/common/PersistentLogonCredentials.h +++ b/plugins/platform/common/PersistentLogonCredentials.h @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.h - declaration of PersistentLogonCredentials class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index 0e122dfad..25d16fb8e 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -1,7 +1,7 @@ /* * PlatformSessionManager.cpp - implementation of PlatformSessionManager class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.h b/plugins/platform/common/PlatformSessionManager.h index bd6bb1d2b..9bceb103d 100644 --- a/plugins/platform/common/PlatformSessionManager.h +++ b/plugins/platform/common/PlatformSessionManager.h @@ -1,7 +1,7 @@ /* * PlatformSessionManager.h - declaration of PlatformSessionManager class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.cpp b/plugins/platform/common/ServiceDataManager.cpp index cf7494f28..5473dd51b 100644 --- a/plugins/platform/common/ServiceDataManager.cpp +++ b/plugins/platform/common/ServiceDataManager.cpp @@ -1,7 +1,7 @@ /* * ServiceDataManager.cpp - implementation of ServiceDataManager class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.h b/plugins/platform/common/ServiceDataManager.h index 522365372..0d78fac41 100644 --- a/plugins/platform/common/ServiceDataManager.h +++ b/plugins/platform/common/ServiceDataManager.h @@ -1,7 +1,7 @@ /* * ServiceDataManager.h - header file for ServiceDataManager class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 342c7aab6..30f6380b5 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.cpp - implementation of LinuxCoreFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index c997db744..b4937c15b 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.h - declaration of LinuxCoreFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxDesktopIntegration.h b/plugins/platform/linux/LinuxDesktopIntegration.h index 9c8f570c2..c2bf75b8a 100644 --- a/plugins/platform/linux/LinuxDesktopIntegration.h +++ b/plugins/platform/linux/LinuxDesktopIntegration.h @@ -1,7 +1,7 @@ /* * LinuxDesktopIntegration.h - declaration of LinuxDesktopIntegration class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.cpp b/plugins/platform/linux/LinuxFilesystemFunctions.cpp index 8d215fd93..ed5738619 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.cpp +++ b/plugins/platform/linux/LinuxFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.cpp - implementation of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.h b/plugins/platform/linux/LinuxFilesystemFunctions.h index 04797c1d7..e46225f4f 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.h +++ b/plugins/platform/linux/LinuxFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.h - declaration of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp index e7fe76b39..41fc680df 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.cpp - implementation of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.h b/plugins/platform/linux/LinuxInputDeviceFunctions.h index b17fc9917..32a32197c 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.h +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.h - declaration of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.cpp b/plugins/platform/linux/LinuxKeyboardInput.cpp index b3fdf3210..594194850 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.cpp +++ b/plugins/platform/linux/LinuxKeyboardInput.cpp @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.cpp - implementation of LinuxKeyboardInput class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.h b/plugins/platform/linux/LinuxKeyboardInput.h index 5c295e853..605730d0b 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.h +++ b/plugins/platform/linux/LinuxKeyboardInput.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.h - declaration of LinuxKeyboardInput class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h index 3b81c900b..e8743f790 100644 --- a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h +++ b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardShortcutTrapper.h - dummy KeyboardShortcutTrapper implementation * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.cpp b/plugins/platform/linux/LinuxNetworkFunctions.cpp index 63c13da2f..f6db36471 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.cpp +++ b/plugins/platform/linux/LinuxNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.cpp - implementation of LinuxNetworkFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.h b/plugins/platform/linux/LinuxNetworkFunctions.h index 1008d7c18..fa88688e1 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.h +++ b/plugins/platform/linux/LinuxNetworkFunctions.h @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.h - declaration of LinuxNetworkFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfiguration.h b/plugins/platform/linux/LinuxPlatformConfiguration.h index 86ab2eff6..557be0eec 100644 --- a/plugins/platform/linux/LinuxPlatformConfiguration.h +++ b/plugins/platform/linux/LinuxPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfiguration.h - configuration values for LinuxPlatform plugin * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp index d8833ca05..a8e68a10e 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.h b/plugins/platform/linux/LinuxPlatformConfigurationPage.h index 473ff2a09..2cbc22cb1 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.h +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.h - header for the LinuxPlatformConfigurationPage class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.cpp b/plugins/platform/linux/LinuxPlatformPlugin.cpp index 03c618e5e..78d046ffa 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.cpp +++ b/plugins/platform/linux/LinuxPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.cpp - implementation of LinuxPlatformPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.h b/plugins/platform/linux/LinuxPlatformPlugin.h index d021d6a20..4a7ca1113 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.h +++ b/plugins/platform/linux/LinuxPlatformPlugin.h @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.h - declaration of LinuxPlatformPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index fe2a6ee8a..dbf81fc24 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index 0df490c7b..5a12f48fb 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -1,7 +1,7 @@ /* * LinuxServiceCore.h - declaration of LinuxServiceCore class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.cpp b/plugins/platform/linux/LinuxServiceFunctions.cpp index 89f10f68c..c6a06a9b9 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.cpp +++ b/plugins/platform/linux/LinuxServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.h b/plugins/platform/linux/LinuxServiceFunctions.h index d462fa3cc..ad3855101 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.h +++ b/plugins/platform/linux/LinuxServiceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.h - declaration of LinuxServiceFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index e892cc47a..1446dcfb9 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.cpp - implementation of LinuxSessionFunctions class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index e80d04581..0df778ad6 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.h - declaration of LinuxSessionFunctions class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 8d3a522d7..6e0c9f128 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.cpp - implementation of LinuxUserFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index c4755670e..4f88e8dcc 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.h - declaration of LinuxUserFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp index 1819c417d..05a839670 100644 --- a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp +++ b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp @@ -1,7 +1,7 @@ /* * VeyonAuthHelper.cpp - main file for Veyon Authentication Helper * - * Copyright (c) 2010-2020 Tobias Junghans + * Copyright (c) 2010-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.cpp b/plugins/platform/windows/DesktopInputController.cpp index 10965cb9a..21f965b90 100644 --- a/plugins/platform/windows/DesktopInputController.cpp +++ b/plugins/platform/windows/DesktopInputController.cpp @@ -1,7 +1,7 @@ /* * DesktopInputController.cpp - implementation of DesktopInputController class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.h b/plugins/platform/windows/DesktopInputController.h index d3a4f3502..466196f84 100644 --- a/plugins/platform/windows/DesktopInputController.h +++ b/plugins/platform/windows/DesktopInputController.h @@ -1,7 +1,7 @@ /* * DesktopInputController.h - declaration of DesktopInputController class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.cpp b/plugins/platform/windows/SasEventListener.cpp index 9bc0c5756..11b9480e9 100644 --- a/plugins/platform/windows/SasEventListener.cpp +++ b/plugins/platform/windows/SasEventListener.cpp @@ -1,7 +1,7 @@ /* * SasEventListener.cpp - implementation of SasEventListener class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.h b/plugins/platform/windows/SasEventListener.h index 6c2c643fb..63e6ac419 100644 --- a/plugins/platform/windows/SasEventListener.h +++ b/plugins/platform/windows/SasEventListener.h @@ -1,7 +1,7 @@ /* * SasEventListener.h - header file for SasEventListener class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index ac1f2ccb7..4521c6b5a 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.cpp - implementation of WindowsCoreFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index 77865b96d..003a2f4dc 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.h - declaration of WindowsCoreFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.cpp b/plugins/platform/windows/WindowsFilesystemFunctions.cpp index 778acdff9..ce6754541 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.cpp +++ b/plugins/platform/windows/WindowsFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.cpp - implementation of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.h b/plugins/platform/windows/WindowsFilesystemFunctions.h index ca18d1e06..dad4ca12d 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.h +++ b/plugins/platform/windows/WindowsFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.h - declaration of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp index 22ca1f1f5..53f3aefbb 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.cpp - implementation of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.h b/plugins/platform/windows/WindowsInputDeviceFunctions.h index 86caaa427..651534504 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.h +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.h - declaration of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp index e387e6786..4befc2581 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h index 7ee141812..f9c0e966c 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.cpp b/plugins/platform/windows/WindowsNetworkFunctions.cpp index 3a4e32dec..e0cd25c4d 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.cpp +++ b/plugins/platform/windows/WindowsNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.cpp - implementation of WindowsNetworkFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.h b/plugins/platform/windows/WindowsNetworkFunctions.h index 608a23b8a..679e87716 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.h +++ b/plugins/platform/windows/WindowsNetworkFunctions.h @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.h - declaration of WindowsNetworkFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfiguration.h b/plugins/platform/windows/WindowsPlatformConfiguration.h index b84abcffd..4d1671e3a 100644 --- a/plugins/platform/windows/WindowsPlatformConfiguration.h +++ b/plugins/platform/windows/WindowsPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfiguration.h - configuration values for WindowsPlatform plugin * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp index 47767f4e8..69d06cdc5 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.h b/plugins/platform/windows/WindowsPlatformConfigurationPage.h index 606b21d72..3d6c80b88 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.h +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.h - header for the WindowsPlatformConfigurationPage class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.cpp b/plugins/platform/windows/WindowsPlatformPlugin.cpp index 82cc9ec6c..17ae57c32 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.cpp +++ b/plugins/platform/windows/WindowsPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.cpp - implementation of WindowsPlatformPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.h b/plugins/platform/windows/WindowsPlatformPlugin.h index bf9d9ae72..ab7f88d46 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.h +++ b/plugins/platform/windows/WindowsPlatformPlugin.h @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.h - declaration of WindowsPlatformPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index ea505d8fa..0df3e950c 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceControl.h - class for managing a Windows service * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.h b/plugins/platform/windows/WindowsServiceControl.h index 96e1f1561..c1020a447 100644 --- a/plugins/platform/windows/WindowsServiceControl.h +++ b/plugins/platform/windows/WindowsServiceControl.h @@ -1,7 +1,7 @@ /* * WindowsService.h - class for managing a Windows service * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index a2c981f06..a8b8d5522 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceCore.cpp - implementation of WindowsServiceCore class * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.h b/plugins/platform/windows/WindowsServiceCore.h index a79b0b770..6f6033367 100644 --- a/plugins/platform/windows/WindowsServiceCore.h +++ b/plugins/platform/windows/WindowsServiceCore.h @@ -1,7 +1,7 @@ /* * WindowsServiceCore.h - header file for WindowsServiceCore class * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.cpp b/plugins/platform/windows/WindowsServiceFunctions.cpp index adeb0ad5a..4a278468a 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.cpp +++ b/plugins/platform/windows/WindowsServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.cpp - implementation of WindowsServiceFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.h b/plugins/platform/windows/WindowsServiceFunctions.h index f1328d7b4..057195df9 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.h +++ b/plugins/platform/windows/WindowsServiceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.h - declaration of WindowsServiceFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 6ebf9ed90..c96ead4e3 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.cpp - implementation of WindowsSessionFunctions class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index 491e3f6f1..7a4682d31 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.h - declaration of WindowsSessionFunctions class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 47f023884..1aa51fd73 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.cpp - implementation of WindowsUserFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index f8db2b20f..67a3cddd3 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.h - declaration of WindowsUserFunctions class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 17a512c9d..40e6d7bd1 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -1,7 +1,7 @@ /* * WtsSessionManager.cpp - implementation of WtsSessionManager class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index 0b59dd1df..b020dd4ff 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -1,7 +1,7 @@ /* * WtsSessionManager.h - header file for WtsSessionManager class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 78878cc1e..3f21ac41d 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.cpp - implementation of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.h b/plugins/powercontrol/PowerControlFeaturePlugin.h index 585ab7cc1..ad3e7fa1a 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.h +++ b/plugins/powercontrol/PowerControlFeaturePlugin.h @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.h - declaration of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.cpp b/plugins/powercontrol/PowerDownTimeInputDialog.cpp index 630ffae11..512f3f1c6 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.cpp +++ b/plugins/powercontrol/PowerDownTimeInputDialog.cpp @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - implementation of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.h b/plugins/powercontrol/PowerDownTimeInputDialog.h index 8f59bc1fa..941034fc0 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.h +++ b/plugins/powercontrol/PowerDownTimeInputDialog.h @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - declaration of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 43a439195..54dbf0110 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.cpp - implementation of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index 282f0acc0..1366f0ce9 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.h - declaration of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.cpp b/plugins/remoteaccess/RemoteAccessPage.cpp index 8d5304937..493995923 100644 --- a/plugins/remoteaccess/RemoteAccessPage.cpp +++ b/plugins/remoteaccess/RemoteAccessPage.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.h b/plugins/remoteaccess/RemoteAccessPage.h index 73ad1233a..a589c0ead 100644 --- a/plugins/remoteaccess/RemoteAccessPage.h +++ b/plugins/remoteaccess/RemoteAccessPage.h @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index a70ad0e21..40d85802f 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.cpp - widget containing a VNC-view and controls for it * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index 2c4101c2a..6800f9f68 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.h - widget containing a VNC view and controls for it * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.cpp b/plugins/screenlock/ScreenLockFeaturePlugin.cpp index bd1ae3b9d..af3f35eac 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.cpp +++ b/plugins/screenlock/ScreenLockFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.cpp - implementation of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.h b/plugins/screenlock/ScreenLockFeaturePlugin.h index 48587188d..2ac3b8f92 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.h +++ b/plugins/screenlock/ScreenLockFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.h - declaration of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.cpp b/plugins/screenshot/ScreenshotFeaturePlugin.cpp index b05542660..abb37067b 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.cpp +++ b/plugins/screenshot/ScreenshotFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.cpp - implementation of ScreenshotFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.h b/plugins/screenshot/ScreenshotFeaturePlugin.h index 4f9d12495..937aeeb70 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.h +++ b/plugins/screenshot/ScreenshotFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.h - declaration of ScreenshotFeature class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/servicecontrol/ServiceControlPlugin.cpp b/plugins/servicecontrol/ServiceControlPlugin.cpp index b2736d070..ca9842452 100644 --- a/plugins/servicecontrol/ServiceControlPlugin.cpp +++ b/plugins/servicecontrol/ServiceControlPlugin.cpp @@ -1,7 +1,7 @@ /* * ServiceControlPlugin.cpp - implementation of ServiceControlPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/servicecontrol/ServiceControlPlugin.h b/plugins/servicecontrol/ServiceControlPlugin.h index f0dc9f6f3..4c9a086f5 100644 --- a/plugins/servicecontrol/ServiceControlPlugin.h +++ b/plugins/servicecontrol/ServiceControlPlugin.h @@ -1,7 +1,7 @@ /* * ServiceControlPlugin.h - declaration of ServiceControlPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/shell/ShellCommandLinePlugin.cpp b/plugins/shell/ShellCommandLinePlugin.cpp index 195dd7aab..ccb7a22b1 100644 --- a/plugins/shell/ShellCommandLinePlugin.cpp +++ b/plugins/shell/ShellCommandLinePlugin.cpp @@ -1,7 +1,7 @@ /* * ShellCommandLinePlugin.cpp - implementation of ShellCommandLinePlugin class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/shell/ShellCommandLinePlugin.h b/plugins/shell/ShellCommandLinePlugin.h index 5548056fd..045880aaf 100644 --- a/plugins/shell/ShellCommandLinePlugin.h +++ b/plugins/shell/ShellCommandLinePlugin.h @@ -1,7 +1,7 @@ /* * ShellCommandLinePlugin.h - declaration of ShellCommandLinePlugin class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp index 3e4a92996..dba93c0c8 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.cpp - implementation of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.h b/plugins/systemusergroups/SystemUserGroupsPlugin.h index 8fdcf8723..4b72d208f 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.h +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.h @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.h - declaration of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.cpp b/plugins/testing/TestingCommandLinePlugin.cpp index 2b2bd4352..a53c2c57a 100644 --- a/plugins/testing/TestingCommandLinePlugin.cpp +++ b/plugins/testing/TestingCommandLinePlugin.cpp @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.cpp - implementation of TestingCommandLinePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.h b/plugins/testing/TestingCommandLinePlugin.h index 4577a2ad6..4fedf0ae7 100644 --- a/plugins/testing/TestingCommandLinePlugin.h +++ b/plugins/testing/TestingCommandLinePlugin.h @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.h - declaration of TestingCommandLinePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.cpp b/plugins/textmessage/TextMessageDialog.cpp index 99e851bcf..ec75331e1 100644 --- a/plugins/textmessage/TextMessageDialog.cpp +++ b/plugins/textmessage/TextMessageDialog.cpp @@ -1,7 +1,7 @@ /* * TextMessageDialog.cpp - implementation of text message dialog class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.h b/plugins/textmessage/TextMessageDialog.h index e9b14cdd6..2eec97a00 100644 --- a/plugins/textmessage/TextMessageDialog.h +++ b/plugins/textmessage/TextMessageDialog.h @@ -1,7 +1,7 @@ /* * TextMessageDialog.h - declaration of text message dialog class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.cpp b/plugins/textmessage/TextMessageFeaturePlugin.cpp index 25d9f1dfd..e50a4c894 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.cpp +++ b/plugins/textmessage/TextMessageFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.cpp - implementation of TextMessageFeaturePlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.h b/plugins/textmessage/TextMessageFeaturePlugin.h index 3bafdb6b1..173b0b226 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.h +++ b/plugins/textmessage/TextMessageFeaturePlugin.h @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.h - declaration of TextMessageFeature class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.cpp b/plugins/usersessioncontrol/UserLoginDialog.cpp index 29006cf95..eca9984d6 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.cpp +++ b/plugins/usersessioncontrol/UserLoginDialog.cpp @@ -1,7 +1,7 @@ /* * UserLoginDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.h b/plugins/usersessioncontrol/UserLoginDialog.h index d79aa98a9..8ebb98fd5 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.h +++ b/plugins/usersessioncontrol/UserLoginDialog.h @@ -1,7 +1,7 @@ /* * UserLoginDialog.h - dialog for querying logon credentials * - * Copyright (c) 2019-2020 Tobias Junghans + * Copyright (c) 2019-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp index ea18e3b5b..f6f7f1fd3 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.cpp - implementation of UserSessionControlPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.h b/plugins/usersessioncontrol/UserSessionControlPlugin.h index 6a64ef754..320f668eb 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.h +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.h @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.h - declaration of UserSessionControlPlugin class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.cpp b/plugins/vncserver/external/ExternalVncServer.cpp index 19aa783d5..4de805e0a 100644 --- a/plugins/vncserver/external/ExternalVncServer.cpp +++ b/plugins/vncserver/external/ExternalVncServer.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServer.cpp - implementation of ExternalVncServer class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.h b/plugins/vncserver/external/ExternalVncServer.h index bfbba841e..8d8d471aa 100644 --- a/plugins/vncserver/external/ExternalVncServer.h +++ b/plugins/vncserver/external/ExternalVncServer.h @@ -1,7 +1,7 @@ /* * ExternalVncServer.h - declaration of ExternalVncServer class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfiguration.h b/plugins/vncserver/external/ExternalVncServerConfiguration.h index 61199f65f..898d30a0b 100644 --- a/plugins/vncserver/external/ExternalVncServerConfiguration.h +++ b/plugins/vncserver/external/ExternalVncServerConfiguration.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfiguration.h - configuration values for external VNC server * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp index f60ae97ff..1b2672c82 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - implementation of the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h index 0cd144ff6..d218ec513 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - header for the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncConfiguration.h b/plugins/vncserver/headless/HeadlessVncConfiguration.h index 40ab071b2..e8e175c2b 100644 --- a/plugins/vncserver/headless/HeadlessVncConfiguration.h +++ b/plugins/vncserver/headless/HeadlessVncConfiguration.h @@ -1,7 +1,7 @@ /* * HeadlessVncConfiguration.h - headless VNC server specific configuration values * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp index 2f7cc0dbb..061b964c2 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.cpp +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -1,7 +1,7 @@ /* * HeadlessVncServer.cpp - implementation of HeadlessVncServer class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.h b/plugins/vncserver/headless/HeadlessVncServer.h index 560f265eb..ce372ff34 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.h +++ b/plugins/vncserver/headless/HeadlessVncServer.h @@ -1,7 +1,7 @@ /* * HeadlessVncServer.h - declaration of HeadlessVncServer class * - * Copyright (c) 2020 Tobias Junghans + * Copyright (c) 2020-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp index 55156ddad..122b96aa5 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.cpp - implementation of BuiltinUltraVncServer class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h index 9858a97e7..63e7693f2 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.h - declaration of BuiltinUltraVncServer class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp index ccdc831b0..6103aec99 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp @@ -1,7 +1,7 @@ /* * LogoffEventFilter.cpp - implementation of LogoffEventFilter class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h index 5065c6675..131ddeece 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h @@ -1,7 +1,7 @@ /* * LogoffEventFilter.h - declaration of LogoffEventFilter class * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h index 76ff0b471..5fcec5e1c 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h @@ -1,7 +1,7 @@ /* * UltraVncConfiguration.h - UltraVNC-specific configuration values * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp index ab7bafd32..ab826d2c5 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - implementation of the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h index c449202a2..e71a2bed0 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - header for the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/vncntlm.cpp b/plugins/vncserver/ultravnc-builtin/vncntlm.cpp index 14b745312..77b9add26 100644 --- a/plugins/vncserver/ultravnc-builtin/vncntlm.cpp +++ b/plugins/vncserver/ultravnc-builtin/vncntlm.cpp @@ -1,7 +1,7 @@ /* * vncntlm.cpp - dummy implementation of vncntlm module * - * Copyright (c) 2016-2020 Tobias Junghans + * Copyright (c) 2016-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index 02d4cf219..f7bb919e8 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.cpp - implementation of BuiltinX11VncServer class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h index 124f5aad9..570f3566a 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.h - declaration of BuiltinX11VncServer class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h index be5355664..6dd27e6ac 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h @@ -1,7 +1,7 @@ /* * X11VncConfiguration.h - x11vnc-specific configuration values * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp index 0db4015a2..40321d1eb 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - implementation of the X11VncConfigurationWidget class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h index 6d5ea990c..3aac28126 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - header for the X11VncConfigurationWidget class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/project.yml b/project.yml index 3e7051eb3..d2ddb0326 100644 --- a/project.yml +++ b/project.yml @@ -1,7 +1,7 @@ project: name: Veyon version: 4.99.0 - copyright: 2004-2019 + copyright: 2004-2021 author: Tobias Junghans contact: Tobias Junghans contributors: diff --git a/server/src/ComputerControlClient.cpp b/server/src/ComputerControlClient.cpp index 3c35bf45b..10d4c23e8 100644 --- a/server/src/ComputerControlClient.cpp +++ b/server/src/ComputerControlClient.cpp @@ -1,7 +1,7 @@ /* * ComputerControlClient.cpp - implementation of the ComputerControlClient class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlClient.h b/server/src/ComputerControlClient.h index b9c5da5c6..29fef33fe 100644 --- a/server/src/ComputerControlClient.h +++ b/server/src/ComputerControlClient.h @@ -1,7 +1,7 @@ /* * ComputerControlClient.h - header file for the ComputerControlClient class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 6229c2b80..d8ba52926 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -1,7 +1,7 @@ /* * ComputerControlServer.cpp - implementation of ComputerControlServer * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index 599b5c375..f7c0233fb 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -1,7 +1,7 @@ /* * ComputerControlServer.h - header file for ComputerControlServer * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index c8b1d9882..59ab0bbe2 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.cpp - implementation of ServerAccessControlManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.h b/server/src/ServerAccessControlManager.h index d3c041ff3..4b11ac788 100644 --- a/server/src/ServerAccessControlManager.h +++ b/server/src/ServerAccessControlManager.h @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.h - header file for ServerAccessControlManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.cpp b/server/src/ServerAuthenticationManager.cpp index f1436928d..1f3f90866 100644 --- a/server/src/ServerAuthenticationManager.cpp +++ b/server/src/ServerAuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.cpp - implementation of ServerAuthenticationManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.h b/server/src/ServerAuthenticationManager.h index 97c3d5348..6614a0b1b 100644 --- a/server/src/ServerAuthenticationManager.h +++ b/server/src/ServerAuthenticationManager.h @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.h - header file for ServerAuthenticationManager * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.cpp b/server/src/VeyonServerProtocol.cpp index 833ad5284..626d6a493 100644 --- a/server/src/VeyonServerProtocol.cpp +++ b/server/src/VeyonServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.cpp - implementation of the VeyonServerProtocol class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.h b/server/src/VeyonServerProtocol.h index d27027b72..de77a0ff0 100644 --- a/server/src/VeyonServerProtocol.h +++ b/server/src/VeyonServerProtocol.h @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.h - header file for the VeyonServerProtocol class * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.cpp b/server/src/VncProxyConnection.cpp index 85b16281f..f849b0291 100644 --- a/server/src/VncProxyConnection.cpp +++ b/server/src/VncProxyConnection.cpp @@ -1,7 +1,7 @@ /* * VncProxyConnection.cpp - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.h b/server/src/VncProxyConnection.h index 8fab9343e..a8f72af1d 100644 --- a/server/src/VncProxyConnection.h +++ b/server/src/VncProxyConnection.h @@ -1,7 +1,7 @@ /* * VncProxyConnection.h - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnectionFactory.h b/server/src/VncProxyConnectionFactory.h index 98e9575b5..efcfc3420 100644 --- a/server/src/VncProxyConnectionFactory.h +++ b/server/src/VncProxyConnectionFactory.h @@ -1,7 +1,7 @@ /* * VncProxyConnectionFactory.h - abstract factory class for VncProxyConnectionFactory objects * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.cpp b/server/src/VncProxyServer.cpp index 6ac06f8eb..8ebbf5676 100644 --- a/server/src/VncProxyServer.cpp +++ b/server/src/VncProxyServer.cpp @@ -1,7 +1,7 @@ /* * VncProxyServer.cpp - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.h b/server/src/VncProxyServer.h index 98e358e66..8d2861cb9 100644 --- a/server/src/VncProxyServer.h +++ b/server/src/VncProxyServer.h @@ -1,7 +1,7 @@ /* * VncProxyServer.h - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.cpp b/server/src/VncServer.cpp index 5506b2ac0..ae78e0f78 100644 --- a/server/src/VncServer.cpp +++ b/server/src/VncServer.cpp @@ -2,7 +2,7 @@ * VncServer.cpp - implementation of VncServer, a VNC-server- * abstraction for platform independent VNC-server-usage * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.h b/server/src/VncServer.h index 195f5b4cd..78e2d3cd3 100644 --- a/server/src/VncServer.h +++ b/server/src/VncServer.h @@ -2,7 +2,7 @@ * VncServer.h - class VncServer, a VNC server abstraction for * platform-independent VNC server usage * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/main.cpp b/server/src/main.cpp index a85caea13..d546f2bd3 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Server * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/veyon-server.rc.in b/server/veyon-server.rc.in index e7cffabc3..b362f4ab8 100644 --- a/server/veyon-server.rc.in +++ b/server/veyon-server.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Server\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-server.exe\0" END END diff --git a/service/src/main.cpp b/service/src/main.cpp index db9f86d3d..c1867a1b3 100644 --- a/service/src/main.cpp +++ b/service/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Service * - * Copyright (c) 2006-2020 Tobias Junghans + * Copyright (c) 2006-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/service/veyon-service.rc.in b/service/veyon-service.rc.in index 4720188a4..3feb0e3e5 100644 --- a/service/veyon-service.rc.in +++ b/service/veyon-service.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Service\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-service.exe\0" END END diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index 3840b2692..f1de66eb3 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.cpp - class which handles communication between service and feature * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/FeatureWorkerManagerConnection.h b/worker/src/FeatureWorkerManagerConnection.h index 93002b379..4755fa8c9 100644 --- a/worker/src/FeatureWorkerManagerConnection.h +++ b/worker/src/FeatureWorkerManagerConnection.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.h - class which handles communication between worker manager and worker * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.cpp b/worker/src/VeyonWorker.cpp index 791a4b9be..8d073935b 100644 --- a/worker/src/VeyonWorker.cpp +++ b/worker/src/VeyonWorker.cpp @@ -1,7 +1,7 @@ /* * VeyonWorker.cpp - basic implementation of Veyon Worker * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.h b/worker/src/VeyonWorker.h index f58416280..262354b3d 100644 --- a/worker/src/VeyonWorker.h +++ b/worker/src/VeyonWorker.h @@ -1,7 +1,7 @@ /* * VeyonWorker.h - basic implementation of Veyon Worker * - * Copyright (c) 2018-2020 Tobias Junghans + * Copyright (c) 2018-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/main.cpp b/worker/src/main.cpp index 6faa3dfca..2fc7cd46d 100644 --- a/worker/src/main.cpp +++ b/worker/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Feature Worker * - * Copyright (c) 2017-2020 Tobias Junghans + * Copyright (c) 2017-2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/veyon-worker.rc.in b/worker/veyon-worker.rc.in index e8d7cb562..53c32db1f 100644 --- a/worker/veyon-worker.rc.in +++ b/worker/veyon-worker.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2020 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-worker.exe\0" END END From 01277895bad93b3df3c796f35d18d6f7f4765511 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 19:05:46 +0100 Subject: [PATCH 0819/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 071b0149d..719ea083a 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 071b0149dcee002b383bbb71d75501afa78cdf63 +Subproject commit 719ea083a0c83af94c56ea6a11d17d0be9c22ea7 From ec1f108e8ed38cb5e6873518df5a54e4053b92d6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 19:05:53 +0100 Subject: [PATCH 0820/1765] CI: Windows: remove obsolete message --- .ci/windows/build.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh index 6715d53fb..34574ba79 100755 --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -13,8 +13,6 @@ cd $BUILDDIR cmake $BASEDIR -DCMAKE_TOOLCHAIN_FILE=$BASEDIR/cmake/modules/Win${1}Toolchain.cmake -DCMAKE_MODULE_PATH=$BASEDIR/cmake/modules/ -G Ninja $CMAKE_FLAGS -echo Building on $CPUS CPUs - if [ -z "$2" ] ; then ninja windows-binaries else From ddcea2d5467e1a7ba41166bb6963e86d66ab2ef9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Feb 2021 19:16:02 +0100 Subject: [PATCH 0821/1765] CI: update package name suffixes --- .ci/linux.centos.7.9/script.sh | 2 +- .ci/linux.centos.8.3/script.sh | 2 +- .ci/linux.fedora.32/script.sh | 2 +- .ci/linux.fedora.33/script.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.ci/linux.centos.7.9/script.sh b/.ci/linux.centos.7.9/script.sh index c32ad2c1d..960478fdb 100755 --- a/.ci/linux.centos.7.9/script.sh +++ b/.ci/linux.centos.7.9/script.sh @@ -5,4 +5,4 @@ source scl_source enable devtoolset-7 set -e $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "centos-7.8" +$1/.ci/common/finalize-rpm.sh $1 $2 "centos-7.9" diff --git a/.ci/linux.centos.8.3/script.sh b/.ci/linux.centos.8.3/script.sh index 120c500f8..8a601d111 100755 --- a/.ci/linux.centos.8.3/script.sh +++ b/.ci/linux.centos.8.3/script.sh @@ -5,4 +5,4 @@ set -e export CMAKE_FLAGS="-DWITH_PCH=OFF" $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "centos-8.2" +$1/.ci/common/finalize-rpm.sh $1 $2 "centos-8.3" diff --git a/.ci/linux.fedora.32/script.sh b/.ci/linux.fedora.32/script.sh index 71ab48097..936cb207f 100755 --- a/.ci/linux.fedora.32/script.sh +++ b/.ci/linux.fedora.32/script.sh @@ -3,4 +3,4 @@ set -e $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "fc31" +$1/.ci/common/finalize-rpm.sh $1 $2 "fc32" diff --git a/.ci/linux.fedora.33/script.sh b/.ci/linux.fedora.33/script.sh index 8b7241830..be0cc3eb0 100755 --- a/.ci/linux.fedora.33/script.sh +++ b/.ci/linux.fedora.33/script.sh @@ -5,4 +5,4 @@ set -e export CMAKE_FLAGS="-DWITH_PCH=OFF" $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "fc31" +$1/.ci/common/finalize-rpm.sh $1 $2 "fc33" From 4ba7b290b886b8a8dbd36deafa0c35f9b7c8d355 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 1 Mar 2021 07:46:36 +0100 Subject: [PATCH 0822/1765] Revert "CI: disable precompiled headers on Fedora 33" This reverts commit e16805e46660b38c536a414c0c70c3af1fd1da9b. --- .ci/linux.fedora.33/script.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/.ci/linux.fedora.33/script.sh b/.ci/linux.fedora.33/script.sh index be0cc3eb0..df83b4682 100755 --- a/.ci/linux.fedora.33/script.sh +++ b/.ci/linux.fedora.33/script.sh @@ -2,7 +2,5 @@ set -e -export CMAKE_FLAGS="-DWITH_PCH=OFF" - $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "fc33" From 5909b3daef0a63ec3494cc94e86e3f0724b1a67b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 1 Mar 2021 07:45:34 +0100 Subject: [PATCH 0823/1765] Core: fix PCH issue with CMake >= 3.18.0 Intended changes in CMake 3.18 cause problems if a target does not have source files and AUTOMOC is set: https://gitlab.kitware.com/cmake/cmake/-/issues/20980 --- core/CMakeLists.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index e49503558..ddcce9d86 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -102,6 +102,14 @@ if(WITH_PCH) target_precompile_headers(veyon-core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") add_library(veyon-pch STATIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") + + if(${CMAKE_VERSION} VERSION_GREATER "3.17.5") + file(GENERATE + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx + CONTENT "/*empty file*/") + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_AUTOGEN TRUE) + target_sources(veyon-pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx) + endif() target_link_libraries(veyon-pch Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) target_precompile_headers(veyon-pch PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") endif() From 4386e6a99732a1ce0160c79a74db902fbf32caca Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 4 Mar 2021 09:12:11 +0100 Subject: [PATCH 0824/1765] PlatformSessionManager: always close sessions properly Removing the platform session ID from the session map must not be enclosed in a vDebug() call since it would only be executed if debugging is enabled. --- plugins/platform/common/PlatformSessionManager.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index 25d16fb8e..75cc5060c 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -103,7 +103,9 @@ void PlatformSessionManager::closeSession( const PlatformSessionId& platformSess { QMutexLocker l( &m_mutex ); - vDebug() << "Closing session" << m_sessions.take( platformSessionId ).toInt() << "for platform session" << platformSessionId; + const auto closedSessionId = m_sessions.take( platformSessionId ).toInt(); + + vDebug() << "Closing session" << closedSessionId << "for platform session" << platformSessionId; } From 260ca3256dbb52610a188cba17eb26ca36651212 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 4 Mar 2021 09:39:50 +0100 Subject: [PATCH 0825/1765] LinuxServiceCore: drop redundant check stopAllServers() iterates over m_serverProcesses so it will do nothing if it's empty. --- plugins/platform/linux/LinuxServiceCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index dbf81fc24..38babb583 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -121,7 +121,7 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO return; } - if( m_sessionManager.multiSession() == false && m_serverProcesses.isEmpty() == false ) + if( m_sessionManager.multiSession() == false ) { // make sure no other server is still running stopAllServers(); From 1a728651b788336fef8db0a2b2cfde55e81dd2eb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 4 Mar 2021 09:43:33 +0100 Subject: [PATCH 0826/1765] VeyonCore: use default session ID for Service --- core/src/VeyonCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 9bf2556ef..356ae65d3 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -504,7 +504,7 @@ void VeyonCore::initPlatformPlugin() void VeyonCore::initSession() { - if( config().multiSessionModeEnabled() ) + if( component() != Component::Service && config().multiSessionModeEnabled() ) { const auto systemEnv = QProcessEnvironment::systemEnvironment(); if( systemEnv.contains( sessionIdEnvironmentVariable() ) ) From 5db1a2b27266d7515dcbd536409bf4194d2455fe Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 4 Mar 2021 10:36:12 +0100 Subject: [PATCH 0827/1765] LinuxServiceCore: use session path as session ID Since the session ID property can't be queried once the session has been closed, PlatformSessionManager::closeSession() may be called with an invalid session ID. Simply use the unique session path instead to avoid this issue. --- plugins/platform/linux/LinuxServiceCore.cpp | 14 ++++++-------- plugins/platform/linux/LinuxSessionFunctions.cpp | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 38babb583..7bc28d600 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -136,20 +136,18 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO return; } - const auto seat = LinuxSessionFunctions::getSessionSeat( sessionPath ); - const auto sessionId = LinuxSessionFunctions::getSessionId( sessionPath ); - // if pam-systemd is not in use, we have to set the XDG_SESSION_ID environment variable manually if( sessionEnvironment.contains( LinuxSessionFunctions::xdgSessionIdEnvVarName() ) == false ) { - sessionEnvironment.insert( LinuxSessionFunctions::xdgSessionIdEnvVarName(), sessionId ); + sessionEnvironment.insert( LinuxSessionFunctions::xdgSessionIdEnvVarName(), + LinuxSessionFunctions::getSessionId( sessionPath ) ); } - const auto veyonSessionId = m_sessionManager.openSession( sessionId ); + const auto sessionId = m_sessionManager.openSession( sessionPath ); vInfo() << "Starting server for new" << qUtf8Printable(sessionType) << "session" << sessionPath - << "with ID" << veyonSessionId - << "at seat" << seat.path; + << "with ID" << sessionId + << "at seat" << LinuxSessionFunctions::getSessionSeat( sessionPath ).path; sessionEnvironment.insert( QLatin1String( ServiceDataManager::serviceDataTokenEnvironmentVariable() ), QString::fromUtf8( m_dataManager.token().toByteArray() ) ); @@ -220,7 +218,7 @@ void LinuxServiceCore::connectToLoginManager() void LinuxServiceCore::stopServer( const QString& sessionPath ) { - m_sessionManager.closeSession( LinuxSessionFunctions::getSessionId( sessionPath ) ); + m_sessionManager.closeSession( sessionPath ); if( m_serverProcesses.contains( sessionPath ) == false ) { diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 1446dcfb9..7af6e6303 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -34,7 +34,7 @@ LinuxSessionFunctions::SessionId LinuxSessionFunctions::currentSessionId() { - return PlatformSessionManager::resolveSessionId( getSessionId( currentSessionPath() ) ); + return PlatformSessionManager::resolveSessionId( currentSessionPath() ); } From 586a983e89d5e98f3a787434535439a63d49ec25 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 07:03:12 +0100 Subject: [PATCH 0828/1765] BuiltinX11VncServer: disable SHM for xrdp sessions When launching x11vnc for xrdp sessions from the outside, MIT SHM is not available, causing x11vnc to crash: X11 MIT Shared Memory Attach failed: Is your DISPLAY=:10 on a remote machine? Suggestion, use: x11vnc -display :0 ... for local display :0 --- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index f7bb919e8..cad4b1628 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -72,6 +72,12 @@ bool BuiltinX11VncServer::runServer( int serverPort, const Password& password ) cmdline.append( extraArguments.split( QLatin1Char(' ') ) ); } + const auto systemEnv = QProcessEnvironment::systemEnvironment(); + if( systemEnv.contains( QStringLiteral("XRDP_SESSION") ) ) + { + cmdline.append( QStringLiteral("-noshm") ); + } + if( m_configuration.isXDamageDisabled() ) { cmdline.append( QStringLiteral("-noxdamage") ); From 6a764128a98b2e52416b39e72bc4f618c2512589 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 07:08:48 +0100 Subject: [PATCH 0829/1765] BuiltinX11VncServer: simplify XDamage control --- .../x11vnc-builtin/BuiltinX11VncServer.cpp | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index cad4b1628..48f6602db 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -78,24 +78,14 @@ bool BuiltinX11VncServer::runServer( int serverPort, const Password& password ) cmdline.append( QStringLiteral("-noshm") ); } - if( m_configuration.isXDamageDisabled() ) + if( m_configuration.isXDamageDisabled() || + // workaround for x11vnc when running in a NX session or a Thin client LTSP session + systemEnv.contains( QStringLiteral("NXSESSIONID") ) || + systemEnv.contains( QStringLiteral("X2GO_SESSION") ) || + systemEnv.contains( QStringLiteral("LTSP_CLIENT_MAC") ) ) { cmdline.append( QStringLiteral("-noxdamage") ); } - else - { - // workaround for x11vnc when running in an NX session or a Thin client LTSP session - const auto systemEnv = QProcess::systemEnvironment(); - for( const auto& s : systemEnv ) - { - if( s.startsWith( QStringLiteral("NXSESSIONID=") ) || - s.startsWith( QStringLiteral("X2GO_SESSION=") ) || - s.startsWith( QStringLiteral("LTSP_CLIENT_MAC=") ) ) - { - cmdline.append( QStringLiteral("-noxdamage") ); - } - } - } #ifdef VEYON_X11VNC_EXTERNAL QTemporaryFile tempFile; From 18f124212b00aca42e22efc776509ce01e624fa4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 07:32:06 +0100 Subject: [PATCH 0830/1765] LinuxServiceCore: call kill() with valid PID only When calling kill() with PID=0, it sends signals to every process in the process group of the calling process. This lead to all server instances and even the service itself being stopped. --- plugins/platform/linux/LinuxServiceCore.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 7bc28d600..a5af323b4 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -229,8 +229,12 @@ void LinuxServiceCore::stopServer( const QString& sessionPath ) auto process = qAsConst(m_serverProcesses)[sessionPath]; - // tell x11vnc to shutdown - kill( pid_t(process->processId()), SIGINT ); + const auto pid = pid_t(process->processId()); + if( pid > 0 ) + { + // tell x11vnc to shutdown + kill( pid, SIGINT ); + } if( ProcessHelper::waitForProcess( process, ServerShutdownTimeout, ServerWaitSleepInterval ) == false ) { From 003d96d8fdad22fbe238581da0b71bf9e34815be Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 08:05:58 +0100 Subject: [PATCH 0831/1765] LinuxCoreFunctions: add forEachChildProcess() This function allows visiting all child processes of a given parent process. The corresponding proc_t structure is passed to the visitor. If visitor returns false, no child processes of the currently visited process are visited. --- plugins/platform/linux/LinuxCoreFunctions.cpp | 33 +++++++++++++++++++ plugins/platform/linux/LinuxCoreFunctions.h | 5 +++ 2 files changed, 38 insertions(+) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 30f6380b5..272d2eff1 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -30,6 +30,7 @@ #include #include +#include #include "LinuxCoreFunctions.h" #include "LinuxDesktopIntegration.h" @@ -388,3 +389,35 @@ void LinuxCoreFunctions::restartDisplayManagers() systemctl( { QStringLiteral("restart"), displayManager } ); } } + + + +void LinuxCoreFunctions::forEachChildProcess( const std::function& visitor, + int parentPid, int flags, bool visitParent ) +{ + QProcessEnvironment sessionEnv; + + const auto proc = openproc( flags | PROC_FILLSTAT /* required for proc_t::ppid */ ); + proc_t* procInfo = nullptr; + + QList ppids; + + while( ( procInfo = readproc( proc, nullptr ) ) ) + { + if( procInfo->ppid == parentPid ) + { + if( visitParent == false || visitor( procInfo ) ) + { + ppids.append( procInfo->tid ); + } + } + else if( ppids.contains( procInfo->ppid ) && visitor( procInfo ) ) + { + ppids.append( procInfo->tid ); + } + + freeproc( procInfo ); + } + + closeproc( proc ); +} diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index b4937c15b..64098742b 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -29,6 +29,8 @@ #include "PlatformCoreFunctions.h" +struct proc_t; + // clazy:excludeall=copyable-polymorphic class LinuxCoreFunctions : public PlatformCoreFunctions @@ -75,6 +77,9 @@ class LinuxCoreFunctions : public PlatformCoreFunctions static void restartDisplayManagers(); + static void forEachChildProcess( const std::function& visitor, + int parentPid, int flags, bool visitParent ); + private: int m_screenSaverTimeout{0}; int m_screenSaverPreferBlanking{0}; From 3723186812028adf097dbc46e525a1a29172956e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 08:30:06 +0100 Subject: [PATCH 0832/1765] LinuxSessionFunctions: use forEachChildProcess() Simplify LinuxSessionFunctions::getSessionEnvironment() by using the new LinuxCoreFunctions::forEachChildProcess() function. --- .../platform/linux/LinuxSessionFunctions.cpp | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 7af6e6303..22a9e57b1 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -28,6 +28,7 @@ #include +#include "LinuxCoreFunctions.h" #include "LinuxSessionFunctions.h" #include "PlatformSessionManager.h" @@ -151,29 +152,26 @@ QProcessEnvironment LinuxSessionFunctions::getSessionEnvironment( int sessionLea { QProcessEnvironment sessionEnv; - PROCTAB* proc = openproc( PROC_FILLSTATUS | PROC_FILLENV ); - proc_t* procInfo = nullptr; - - QList ppids; - - while( ( procInfo = readproc( proc, nullptr ) ) ) - { - if( ( procInfo->ppid == sessionLeaderPid || ppids.contains( procInfo->ppid ) ) && - procInfo->environ != nullptr ) - { - for( int i = 0; procInfo->environ[i]; ++i ) + LinuxCoreFunctions::forEachChildProcess( + [&sessionEnv]( proc_t* procInfo ) { + if( procInfo->environ != nullptr ) { - const auto env = QString::fromUtf8( procInfo->environ[i] ).split( QLatin1Char('=') ); - sessionEnv.insert( env.first(), env.mid( 1 ).join( QLatin1Char('=') ) ); + for( int i = 0; procInfo->environ[i]; ++i ) + { + const auto env = QString::fromUtf8( procInfo->environ[i] ); + const auto separatorPos = env.indexOf( QLatin1Char('=') ); + if( separatorPos > 0 ) + { + sessionEnv.insert( env.left( separatorPos ), env.mid( separatorPos+1 ) ); + } + } + + return true; } - ppids.append( procInfo->tid ); - } - - freeproc( procInfo ); - } - - closeproc( proc ); + return false; + }, + sessionLeaderPid, PROC_FILLENV, true ); return sessionEnv; } From 8cfdd50775aae43b0ff546b6109e3f3f64eaaa6c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 08:40:05 +0100 Subject: [PATCH 0833/1765] LinuxServiceCore: send SIGINT/SIGTERM/SIGKILL recursively --- plugins/platform/linux/LinuxServiceCore.cpp | 28 ++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index a5af323b4..e38a80d61 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include "Filesystem.h" @@ -229,21 +230,36 @@ void LinuxServiceCore::stopServer( const QString& sessionPath ) auto process = qAsConst(m_serverProcesses)[sessionPath]; - const auto pid = pid_t(process->processId()); - if( pid > 0 ) - { - // tell x11vnc to shutdown - kill( pid, SIGINT ); - } + const auto sendSignalRecursively = []( int pid, int sig ) { + if( pid > 0 ) + { + LinuxCoreFunctions::forEachChildProcess( + [=]( proc_t* procInfo ) { + if( procInfo->tid > 0 ) + { + kill( procInfo->tid, sig ); + } + return true; + }, + pid, 0, true ); + } + }; + + const auto pid = process->processId(); + + // tell x11vnc and child processes (in case spawned via catchsegv) to shutdown + sendSignalRecursively( pid, SIGINT ); if( ProcessHelper::waitForProcess( process, ServerShutdownTimeout, ServerWaitSleepInterval ) == false ) { process->terminate(); + sendSignalRecursively( pid, SIGTERM ); if( ProcessHelper::waitForProcess( process, ServerTerminateTimeout, ServerWaitSleepInterval ) == false ) { vWarning() << "server for session" << sessionPath << "still running - killing now"; process->kill(); + sendSignalRecursively( pid, SIGKILL ); ProcessHelper::waitForProcess( process, ServerKillTimeout, ServerWaitSleepInterval ); } } From a797d210aebedaa1f42cf5881c5f01a95bef1d98 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 08:48:00 +0100 Subject: [PATCH 0834/1765] LinuxServiceCore: decrease ServerKillTimeout to 3s Now that we properly send signals to the server and all child processes, we shouldn't wait (and block) longer than necessary. --- plugins/platform/linux/LinuxServiceCore.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index 5a12f48fb..21504a769 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -49,7 +49,7 @@ private Q_SLOTS: static constexpr auto LoginManagerReconnectInterval = 3000; static constexpr auto ServerShutdownTimeout = 1000; static constexpr auto ServerTerminateTimeout = 3000; - static constexpr auto ServerKillTimeout = 10000; + static constexpr auto ServerKillTimeout = 3000; static constexpr auto ServerWaitSleepInterval = 100; static constexpr auto SessionEnvironmentProbingInterval = 1000; static constexpr auto SessionStateProbingInterval = 1000; From 0f7a63a844c177c0d2c8115d05b38fcf39fb2796 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 09:35:00 +0100 Subject: [PATCH 0835/1765] LinuxServiceCore: stop server for closing sessions If a session is stuck in closing state but the Server process already has stopped, call stopServer() to free all resources and the associated session ID. --- plugins/platform/linux/LinuxServiceCore.cpp | 15 ++++++++++++++- plugins/platform/linux/LinuxServiceCore.h | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index e38a80d61..2dff35837 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -171,6 +171,8 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO process->start( VeyonCore::filesystem().serverFilePath(), QStringList{} ); } + connect( process, &QProcess::stateChanged, this, [=]() { checkSessionState( sessionPath ); } ); + m_serverProcesses[sessionPath] = process; } @@ -264,7 +266,7 @@ void LinuxServiceCore::stopServer( const QString& sessionPath ) } } - delete process; + process->deleteLater(); m_serverProcesses.remove( sessionPath ); } @@ -280,6 +282,17 @@ void LinuxServiceCore::stopAllServers() +void LinuxServiceCore::checkSessionState( const QString& sessionPath ) +{ + if( LinuxSessionFunctions::getSessionState( sessionPath ) == LinuxSessionFunctions::State::Closing ) + { + vDebug() << "Stopping server for currently closing session" << sessionPath; + stopServer( sessionPath ); + } +} + + + QStringList LinuxServiceCore::listSessions() { QStringList sessions; diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index 21504a769..b10bcbbb2 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -60,6 +60,8 @@ private Q_SLOTS: void stopServer( const QString& sessionPath ); void stopAllServers(); + void checkSessionState( const QString& sessionPath ); + QStringList listSessions(); LinuxCoreFunctions::DBusInterfacePointer m_loginManager{LinuxCoreFunctions::systemdLoginManager()}; From 85b33dff58c1aa4358cf5e23ad9f39734f0dc78a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 14:36:51 +0100 Subject: [PATCH 0836/1765] FeatureWorkerManager: optionally run worker processes with Valgrind --- core/src/FeatureWorkerManager.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index fde398296..d7f79a978 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -93,7 +93,19 @@ bool FeatureWorkerManager::startManagedSystemWorker( Feature::Uid featureUid ) worker.process, &QProcess::deleteLater ); vDebug() << "Starting managed system worker for feature" << featureUid; - worker.process->start( VeyonCore::filesystem().workerFilePath(), { featureUid.toString() } ); + if( qEnvironmentVariableIsSet("VEYON_VALGRIND_WORKERS") ) + { + worker.process->start( QStringLiteral("valgrind"), + { QStringLiteral("--error-limit=no"), + QStringLiteral("--leak-check=full"), + QStringLiteral("--show-leak-kinds=all"), + QStringLiteral("--log-file=valgrind-%1.log").arg(VeyonCore::formattedUuid(featureUid)), + VeyonCore::filesystem().workerFilePath(), featureUid.toString() } ); + } + else + { + worker.process->start( VeyonCore::filesystem().workerFilePath(), { featureUid.toString() } ); + } m_workersMutex.lock(); m_workers[featureUid] = worker; From 34eb314c2b0d43f21df1fdd083099d4e6081e653 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 14:38:10 +0100 Subject: [PATCH 0837/1765] VeyonCore: destroy Logger before plugin managers Since the Logger destructor may access functions implemented in platform plugins (such as PlatformCoreFunctions::writeToNativeLoggingSystem()), it must be destroyed before plugins and their managers. --- core/src/VeyonCore.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 356ae65d3..38c1e1f33 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -120,15 +120,15 @@ VeyonCore::~VeyonCore() delete m_builtinFeatures; m_builtinFeatures = nullptr; + delete m_logger; + m_logger = nullptr; + delete m_platformPluginManager; m_platformPluginManager = nullptr; delete m_pluginManager; m_pluginManager = nullptr; - delete m_logger; - m_logger = nullptr; - delete m_config; m_config = nullptr; From 79295b68c52ca53ad1781ac532c6b50e83269155 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Mar 2021 14:39:58 +0100 Subject: [PATCH 0838/1765] Demo: refactor server termination Make DemoServerConnection objects really children of DemoServer so findChildren() actually has any effect. Also make sure to not delete the DemoServer instance until all DemoServerConnection objects have been destroyed. --- plugins/demo/DemoFeaturePlugin.cpp | 5 +++- plugins/demo/DemoServer.cpp | 38 ++++++++++++++++----------- plugins/demo/DemoServer.h | 3 +++ plugins/demo/DemoServerConnection.cpp | 2 +- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 852caeb2a..0a27451df 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -350,7 +350,10 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worker, cons return true; case StopDemoServer: - delete m_demoServer; + if( m_demoServer ) + { + m_demoServer->terminate(); + } m_demoServer = nullptr; QCoreApplication::quit(); diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index b143c84f0..19fef6ebc 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -65,27 +65,35 @@ DemoServer::DemoServer( int vncServerPort, const Password& vncServerPassword, co DemoServer::~DemoServer() { - vDebug() << "disconnecting signals"; - m_vncServerSocket->disconnect( this ); + delete m_vncClientProtocol; + delete m_vncServerSocket; +} + - vDebug() << "deleting connections"; - QList l; - while( !( l = findChildren() ).isEmpty() ) +void DemoServer::terminate() +{ + m_vncServerSocket->disconnect( this ); + + const auto connections = findChildren(); + if( connections.isEmpty() ) { - l.front()->quit(); - l.front()->wait( ConnectionThreadWaitTime ); - l.front()->terminate(); - l.front()->deleteLater(); + deleteLater(); } + else + { + for( auto connection : connections ) + { + connection->quit(); + } - vDebug() << "deleting VNC client protocol"; - delete m_vncClientProtocol; - - vDebug() << "deleting server socket"; - delete m_vncServerSocket; + for( auto connection : connections ) + { + connection->wait( ConnectionThreadWaitTime ); + } - vDebug() << "finished"; + QTimer::singleShot( TerminateRetryInterval, 0, &DemoServer::terminate ); + } } diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index 09d757f3b..aa6ee83c4 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -49,6 +49,8 @@ class DemoServer : public QTcpServer const DemoConfiguration& configuration, int demoServerPort, QObject *parent ); ~DemoServer() override; + void terminate(); + const DemoConfiguration& configuration() const { return m_configuration; @@ -90,6 +92,7 @@ class DemoServer : public QTcpServer bool setVncServerEncodings(); static constexpr auto ConnectionThreadWaitTime = 5000; + static constexpr auto TerminateRetryInterval = 1000; const DemoAuthentication& m_authentication; const DemoConfiguration& m_configuration; diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 86f087ec2..843b7ab0a 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -35,7 +35,7 @@ DemoServerConnection::DemoServerConnection( DemoServer* demoServer, const DemoAuthentication& authentication, quintptr socketDescriptor ) : - QThread(), + QThread( demoServer ), m_authentication( authentication ), m_demoServer( demoServer ), m_socketDescriptor( socketDescriptor ), From e49d0dfe64210ca8bdb80eb4aae7238b4c1ba11c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 14:24:22 +0100 Subject: [PATCH 0839/1765] VeyonCore: check instance in isDebugging() --- core/src/VeyonCore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 38c1e1f33..2c16f04f2 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -274,7 +274,7 @@ void VeyonCore::enforceBranding( QWidget *topLevelWidget ) bool VeyonCore::isDebugging() { - return instance()->m_debugging; + return s_instance && s_instance->m_debugging; } From f705d5cebd6cedc8b509b63bbb73c3008986a7e8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 14:29:28 +0100 Subject: [PATCH 0840/1765] Demo: also terminate fullscreen demo client This fixes a regression introduced with a684c7fab94f757e547f5f6223b5a3f. --- plugins/demo/DemoFeaturePlugin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 0a27451df..b047ffdbf 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -228,6 +228,7 @@ bool DemoFeaturePlugin::stopFeature( VeyonMasterInterface& master, const Feature feature == m_shareOwnScreenWindowFeature || feature == m_shareOwnScreenFullScreenFeature || feature == m_shareUserScreenWindowFeature || feature == m_shareUserScreenFullScreenFeature ) { + controlFeature( m_demoClientFullScreenFeature.uid(), Operation::Stop, {}, computerControlInterfaces ); controlFeature( m_demoClientWindowFeature.uid(), Operation::Stop, {}, computerControlInterfaces ); controlFeature( m_demoClientWindowFeature.uid(), Operation::Stop, {}, From c594c2b6e49a0adf88313639b8eaa4636d99e376 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 14:26:22 +0100 Subject: [PATCH 0841/1765] Demo: refactor demo server control This new approach ensures that the demo server is always running while there is at least one client. This also handles cases where the demo server crashed unexpectedly so it gets restarted automatically. The demo client tracking is improved as well by maintaining a list of ComputerControlInterfaces instead of host addresses. --- plugins/demo/DemoFeaturePlugin.cpp | 86 +++++++++++++++++------------- plugins/demo/DemoFeaturePlugin.h | 11 ++-- 2 files changed, 55 insertions(+), 42 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index b047ffdbf..a4a511e32 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -108,6 +108,7 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : { connect( qGuiApp, &QGuiApplication::screenAdded, this, &DemoFeaturePlugin::addScreen ); connect( qGuiApp, &QGuiApplication::screenRemoved, this, &DemoFeaturePlugin::removeScreen ); + connect( &m_demoServerControlTimer, &QTimer::timeout, this, &DemoFeaturePlugin::controlDemoServer ); updateFeatures(); } @@ -121,7 +122,19 @@ bool DemoFeaturePlugin::controlFeature( Feature::Uid featureUid, { if( featureUid == m_demoServerFeature.uid() ) { - return controlDemoServer( operation, arguments, computerControlInterfaces ); + m_demoServerArguments = arguments; + + if( operation == Operation::Start ) + { + m_demoServerControlTimer.start( DemoServerControlInterval ); + m_demoServerControlInterfaces = computerControlInterfaces; + } + else + { + m_demoServerControlTimer.stop(); + } + + return controlDemoServer(); } if( featureUid == m_demoClientFullScreenFeature.uid() || featureUid == m_demoClientWindowFeature.uid() ) @@ -139,15 +152,15 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur { if( feature == m_shareOwnScreenWindowFeature || feature == m_shareOwnScreenFullScreenFeature ) { - // start demo server - controlFeature( m_demoServerFeature.uid(), Operation::Start, {}, - { master.localSessionControlInterface().weakPointer() } ); - // start demo clients controlFeature( feature == m_shareOwnScreenFullScreenFeature ? m_demoClientFullScreenFeature.uid() : m_demoClientWindowFeature.uid(), Operation::Start, {}, computerControlInterfaces ); + // start demo server + controlFeature( m_demoServerFeature.uid(), Operation::Start, {}, + { master.localSessionControlInterface().weakPointer() } ); + return true; } @@ -181,14 +194,6 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur demoServerPort += sessionId; } - // start demo server - controlFeature( m_demoServerFeature.uid(), Operation::Start, - { - { argToString(Argument::VncServerPortOffset), vncServerPortOffset }, - { argToString(Argument::DemoServerPort), demoServerPort }, - }, - master.selectedComputerControlInterfaces() ); - // start demo clients auto userDemoControlInterfaces = computerControlInterfaces; userDemoControlInterfaces.removeAll( demoServerInterface ); @@ -205,6 +210,14 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur controlFeature( m_demoClientWindowFeature.uid(), Operation::Start, demoClientArgs, { master.localSessionControlInterface().weakPointer() } ); + // start demo server + controlFeature( m_demoServerFeature.uid(), Operation::Start, + { + { argToString(Argument::VncServerPortOffset), vncServerPortOffset }, + { argToString(Argument::DemoServerPort), demoServerPort }, + }, + master.selectedComputerControlInterfaces() ); + return true; } @@ -234,14 +247,13 @@ bool DemoFeaturePlugin::stopFeature( VeyonMasterInterface& master, const Feature controlFeature( m_demoClientWindowFeature.uid(), Operation::Stop, {}, { master.localSessionControlInterface().weakPointer() } ); + controlDemoServer(); + // no demo clients left? - if( m_demoClientHosts.isEmpty() ) + if( m_demoServerClients.isEmpty() ) { // then we can stop the server - controlFeature( m_demoServerFeature.uid(), Operation::Stop, {}, - { master.localSessionControlInterface().weakPointer() } ); - - controlFeature( m_demoServerFeature.uid(), Operation::Stop, {}, computerControlInterfaces ); + m_demoServerControlTimer.stop(); // reset demo access token initializeCredentials(); @@ -527,31 +539,27 @@ QRect DemoFeaturePlugin::viewportFromScreenSelection() const -bool DemoFeaturePlugin::controlDemoServer( Operation operation, const QVariantMap& arguments, - const ComputerControlInterfaceList& computerControlInterfaces ) +bool DemoFeaturePlugin::controlDemoServer() { - if( operation == Operation::Start ) + if( m_demoServerClients.isEmpty() ) { - const auto demoServerPort = arguments.value( argToString(Argument::DemoServerPort), - VeyonCore::config().demoServerPort() + VeyonCore::sessionId() ).toInt(); - const auto vncServerPortOffset = arguments.value( argToString(Argument::VncServerPortOffset), - VeyonCore::sessionId() ).toInt(); - const auto demoAccessToken = arguments.value( argToString(Argument::DemoAccessToken), - accessToken().toByteArray() ).toByteArray(); + sendFeatureMessage( FeatureMessage{ m_demoServerFeature.uid(), StopDemoServer }, + m_demoServerControlInterfaces ); + } + else + { + const auto demoServerPort = m_demoServerArguments.value( argToString(Argument::DemoServerPort), + VeyonCore::config().demoServerPort() + VeyonCore::sessionId() ).toInt(); + const auto vncServerPortOffset = m_demoServerArguments.value( argToString(Argument::VncServerPortOffset), + VeyonCore::sessionId() ).toInt(); + const auto demoAccessToken = m_demoServerArguments.value( argToString(Argument::DemoAccessToken), + accessToken().toByteArray() ).toByteArray(); sendFeatureMessage( FeatureMessage{ m_demoServerFeature.uid(), StartDemoServer } .addArgument( Argument::DemoAccessToken, demoAccessToken ) .addArgument( Argument::VncServerPortOffset, vncServerPortOffset ) .addArgument( Argument::DemoServerPort, demoServerPort ), - computerControlInterfaces ); - - return true; - } - - if( operation == Operation::Stop ) - { - sendFeatureMessage( FeatureMessage{ m_demoServerFeature.uid(), StopDemoServer }, - computerControlInterfaces ); + m_demoServerControlInterfaces ); return true; } @@ -588,7 +596,8 @@ bool DemoFeaturePlugin::controlDemoClient( Feature::Uid featureUid, Operation op for( const auto& computerControlInterface : computerControlInterfaces ) { - m_demoClientHosts += computerControlInterface->computer().hostAddress(); + m_demoServerClients += computerControlInterface; + if( disableUpdates ) { computerControlInterface->setUpdateMode( ComputerControlInterface::UpdateMode::Disabled ); @@ -611,7 +620,8 @@ bool DemoFeaturePlugin::controlDemoClient( Feature::Uid featureUid, Operation op for( const auto& computerControlInterface : computerControlInterfaces ) { - m_demoClientHosts.removeAll( computerControlInterface->computer().hostAddress() ); + m_demoServerClients.removeAll( computerControlInterface ); + if( enableUpdates ) { computerControlInterface->setUpdateMode( ComputerControlInterface::UpdateMode::Monitoring ); diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index f63b108e8..3ef2172fd 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -118,6 +118,7 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf private: static constexpr auto ScreenSelectionNone = 0; + static constexpr auto DemoServerControlInterval = 1000; void addScreen( QScreen* screen ); void removeScreen( QScreen* screen ); @@ -126,8 +127,7 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf QRect viewportFromScreenSelection() const; - bool controlDemoServer( Operation operation, const QVariantMap& arguments, - const ComputerControlInterfaceList& computerControlInterfaces ); + bool controlDemoServer(); bool controlDemoClient( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ); @@ -155,9 +155,12 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf DemoConfiguration m_configuration; - QStringList m_demoClientHosts{}; - DemoServer* m_demoServer{nullptr}; DemoClient* m_demoClient{nullptr}; + ComputerControlInterfaceList m_demoServerControlInterfaces{}; + ComputerControlInterfaceList m_demoServerClients{}; + QVariantMap m_demoServerArguments{}; + QTimer m_demoServerControlTimer{this}; + }; From 9420a87af4b0c253ab46857ae85b4dcb05d110cc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 14:30:43 +0100 Subject: [PATCH 0842/1765] DemoServer: improve debug message --- plugins/demo/DemoServer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 19fef6ebc..37d1e19a0 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -246,9 +246,9 @@ void DemoServer::enqueueFramebufferUpdateMessage( const QByteArray& message ) if( m_keyFrameTimer.elapsed() > 1 ) { const auto memTotal = queueSize / 1024; - vDebug() - << " MEMTOTAL:" << memTotal - << " KB/s:" << ( memTotal * 1000 ) / m_keyFrameTimer.elapsed(); + vDebug() << "message count:" << m_framebufferUpdateMessages.size() + << "queue size (KB):" << memTotal + << "throughput (KB/s):" << ( memTotal * 1000 ) / m_keyFrameTimer.elapsed(); } m_keyFrameTimer.restart(); ++m_keyFrame; From d5dbbd18b3ec5f4de63705e98f8298cd3ff0cc1e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 14:31:08 +0100 Subject: [PATCH 0843/1765] DemoServerConnection: improve code readability --- plugins/demo/DemoServerConnection.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 843b7ab0a..0b44d3438 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -180,9 +180,10 @@ void DemoServerConnection::sendFramebufferUpdate() } bool sentUpdates = false; - for( ; m_framebufferUpdateMessageIndex < framebufferUpdateMessageCount; ++m_framebufferUpdateMessageIndex ) + while( m_framebufferUpdateMessageIndex < framebufferUpdateMessageCount ) { m_socket->write( framebufferUpdateMessages[m_framebufferUpdateMessageIndex] ); + ++m_framebufferUpdateMessageIndex; sentUpdates = true; } From ff3ec8e20cbd8a51f6bf546d91cd908d2dcc4853 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 14:31:47 +0100 Subject: [PATCH 0844/1765] LinuxServiceCore: optionally run server process with Valgrind --- plugins/platform/linux/LinuxServiceCore.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 2dff35837..bba6cbf1d 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -162,7 +162,14 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO } const auto catchsegv{ QStringLiteral("/usr/bin/catchsegv") }; - if( VeyonCore::isDebugging() && QFileInfo::exists( catchsegv ) ) + if( qEnvironmentVariableIsSet("VEYON_VALGRIND_SERVERS") ) + { + process->start( QStringLiteral("/usr/bin/valgrind"), + { QStringLiteral("--error-limit=no"), + QStringLiteral("--log-file=valgrind-veyon-server-%1.log").arg(sessionId), + VeyonCore::filesystem().serverFilePath() } ); + } + else if( VeyonCore::isDebugging() && QFileInfo::exists( catchsegv ) ) { process->start( catchsegv, { VeyonCore::filesystem().serverFilePath() } ); } From 4979be81e910ee14f9fff5f94b2448bbb9810253 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 14:32:39 +0100 Subject: [PATCH 0845/1765] LinuxCoreFunctions: ignore missing DPMS for xrdp sessions --- plugins/platform/linux/LinuxCoreFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 272d2eff1..d78534277 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -174,7 +174,7 @@ void LinuxCoreFunctions::disableScreenSaver() DPMSGetTimeouts( display, &m_dpmsStandbyTimeout, &m_dpmsSuspendTimeout, &m_dpmsOffTimeout ); DPMSSetTimeouts( display, 0, 0, 0 ); } - else + else if( qEnvironmentVariableIsSet("XRDP_SESSION") == false ) { vWarning() << "DPMS extension not supported!"; } From eb3accc0585ab8a16893b7400e064c6d92978d4b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 16:02:21 +0100 Subject: [PATCH 0846/1765] LinuxKeyboardInput: only send current character --- plugins/platform/linux/LinuxKeyboardInput.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxKeyboardInput.cpp b/plugins/platform/linux/LinuxKeyboardInput.cpp index 594194850..bb5fefa0f 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.cpp +++ b/plugins/platform/linux/LinuxKeyboardInput.cpp @@ -88,6 +88,6 @@ void LinuxKeyboardInput::sendString( const QString& string ) { for( int i = 0; i < string.size(); ++i ) { - pressAndReleaseKey( string.midRef( i ).toUtf8() ); + pressAndReleaseKey( string.midRef( i, 1 ).toUtf8() ); } } From 5eea5d9d6917ff56231314eede0fcaa3b551bed4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 16:04:49 +0100 Subject: [PATCH 0847/1765] LinuxPlatformConfiguration: add userLoginKeySequence property --- .../linux/LinuxPlatformConfiguration.h | 1 + .../linux/LinuxPlatformConfigurationPage.ui | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/plugins/platform/linux/LinuxPlatformConfiguration.h b/plugins/platform/linux/LinuxPlatformConfiguration.h index 557be0eec..88442e3bb 100644 --- a/plugins/platform/linux/LinuxPlatformConfiguration.h +++ b/plugins/platform/linux/LinuxPlatformConfiguration.h @@ -29,6 +29,7 @@ #define FOREACH_LINUX_PLATFORM_CONFIG_PROPERTY(OP) \ OP( LinuxPlatformConfiguration, m_configuration, QString, pamServiceName, setPamServiceName, "PamServiceName", "Linux", QString(), Configuration::Property::Flag::Advanced ) \ OP( LinuxPlatformConfiguration, m_configuration, QString, displayManagerUsers, setDisplayManagerUsers, "DisplayManagerUsers", "Linux", QStringLiteral("gdm,lightdm,sddm,mdm,Debian-gdm"), Configuration::Property::Flag::Advanced ) \ + OP( LinuxPlatformConfiguration, m_configuration, QString, userLoginKeySequence, setUserLoginKeySequence, "UserLoginKeySequence", "Linux", QStringLiteral("%username%%password%"), Configuration::Property::Flag::Advanced ) \ // clazy:excludeall=missing-qobject-macro diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.ui b/plugins/platform/linux/LinuxPlatformConfigurationPage.ui index 2c7cb3f6f..e783f2000 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.ui +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.ui @@ -58,6 +58,25 @@ + + + + User login + + + + + + Login key sequence + + + + + + + + + From 32e612abf50b93ec3f083c9c2ec8ab22242bc361 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Mar 2021 16:07:31 +0100 Subject: [PATCH 0848/1765] LinuxUserFunctions: make user login sequence fully configurable --- plugins/platform/linux/LinuxUserFunctions.cpp | 51 +++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 6e0c9f128..d977439e2 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "LinuxCoreFunctions.h" #include "LinuxDesktopIntegration.h" @@ -37,6 +38,7 @@ #define XK_MISCELLANY #include +#include #include #include @@ -289,10 +291,51 @@ bool LinuxUserFunctions::performLogon( const QString& username, const Password& { LinuxKeyboardInput input; - input.sendString( username ); - input.pressAndReleaseKey( XK_Tab ); - input.sendString( QString::fromUtf8( password.toByteArray() ) ); - input.pressAndReleaseKey( XK_Return ); + auto sequence = LinuxPlatformConfiguration( &VeyonCore::config() ).userLoginKeySequence(); + + if( sequence.isEmpty() == false ) + { + sequence = QStringLiteral("%username%%password%"); + } + + auto matchIterator = QRegularExpression( QStringLiteral("(<[\\w\\d_]+>|%username%|%password%|[\\w\\d]+)") ) + .globalMatch( sequence ); + if( matchIterator.hasNext() == false ) + { + vCritical() << "invalid user login key sequence"; + return false; + } + + while( matchIterator.hasNext() ) + { + const auto token = matchIterator.next().captured(0); + if( token == QStringLiteral("%username%") ) + { + input.sendString( username ); + } + else if( token == QStringLiteral("%password%") ) + { + input.sendString( QString::fromUtf8( password.toByteArray() ) ); + } + else if( token.startsWith( QLatin1Char('<') ) && token.endsWith( QLatin1Char('>') ) ) + { + const auto keysymString = token.mid( 1, token.length() - 2 ); + const auto keysym = XStringToKeysym( keysymString.toLatin1().constData() ); + if( keysym != NoSymbol ) + { + input.pressAndReleaseKey( keysym ); + } + else + { + vCritical() << "unresolved keysym" << keysymString; + return false; + } + } + else if( token.isEmpty() == false ) + { + input.sendString( token ); + } + } return true; } From b5575deeeb4f87546ab7217c3aed576c20ba1308 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 11 Mar 2021 14:32:10 +0100 Subject: [PATCH 0849/1765] Core: fix PCH issue with winsock2.h --- core/CMakeLists.txt | 7 +++++++ core/src/PrecompiledHeader.h | 3 +-- plugins/platform/windows/CMakeLists.txt | 2 +- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 2 -- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index ddcce9d86..e82a8c8b1 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -98,6 +98,10 @@ if(VEYON_BUILD_ANDROID) target_link_libraries(veyon-core Qt5::AndroidExtras) endif() +if(VEYON_BUILD_WIN32) + target_compile_definitions(veyon-core PUBLIC _WIN32_WINNT=0x0602) +endif() + if(WITH_PCH) target_precompile_headers(veyon-core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") @@ -112,4 +116,7 @@ if(WITH_PCH) endif() target_link_libraries(veyon-pch Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) target_precompile_headers(veyon-pch PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") + if(VEYON_BUILD_WIN32) + target_compile_definitions(veyon-pch PUBLIC _WIN32_WINNT=0x0602) + endif() endif() diff --git a/core/src/PrecompiledHeader.h b/core/src/PrecompiledHeader.h index 3eec61caa..fc267ad7b 100644 --- a/core/src/PrecompiledHeader.h +++ b/core/src/PrecompiledHeader.h @@ -1,8 +1,7 @@ #pragma once -#ifdef WIN32 +#ifdef _WIN32_WINNT #include -#include #endif #ifdef __cplusplus diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index 1e532dad6..eaa63a574 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -1,6 +1,6 @@ include(BuildVeyonPlugin) -add_definitions(-DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0600) +add_definitions(-DUNICODE -D_UNICODE) set(WITH_PCH OFF) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index b3482ac45..77a28286e 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -6,8 +6,6 @@ find_package(ZLIB REQUIRED) find_package(JPEG REQUIRED) find_package(LZO REQUIRED) -add_definitions(-D_WIN32_WINNT=0x0602) - set(ultravnc_CXX_SOURCES ${ultravnc_DIR}/winvnc/winvnc/HideDesktop.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbRegion_win32.cpp From 3a0d0ce4ad7602c7fc06401bb61a0a64f1798ca0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 11 Mar 2021 14:10:54 +0100 Subject: [PATCH 0850/1765] Initial port to Qt 6 Fortunately there are only minor changes so the code base will and should continue to work with Qt 5. --- CMakeLists.txt | 48 ++++++++--- cli/src/ConfigCommands.cpp | 4 + cli/src/ConfigCommands.h | 2 +- cli/src/PluginsCommands.cpp | 6 +- cli/src/PluginsCommands.h | 2 +- cmake/modules/CreateTranslations.cmake | 12 ++- cmake/modules/FindQCA.cmake | 6 +- cmake/modules/FindQtTranslations.cmake | 6 +- .../src/AccessControlRuleEditDialog.cpp | 3 +- .../src/AccessControlRulesTestDialog.cpp | 14 ++-- configurator/src/MainWindow.cpp | 1 + core/CMakeLists.txt | 30 +++++-- core/src/Configuration/LocalStore.cpp | 9 ++- core/src/DesktopAccessDialog.h | 2 +- core/src/FeatureControl.cpp | 2 +- core/src/FeatureControl.h | 2 +- core/src/FeatureWorkerManager.cpp | 3 +- core/src/FeatureWorkerManager.h | 13 ++- core/src/LockWidget.cpp | 6 ++ core/src/Lockable.h | 8 ++ core/src/MonitoringMode.cpp | 2 +- core/src/MonitoringMode.h | 2 +- core/src/QSGImageTexture.cpp | 2 + core/src/QSGImageTexture.h | 4 +- core/src/Screenshot.cpp | 4 +- core/src/SystemTrayIcon.h | 2 +- core/src/ToolButton.cpp | 6 ++ core/src/ToolButton.h | 6 +- core/src/TranslationLoader.cpp | 12 +-- core/src/VeyonCore.cpp | 2 + core/src/VncClientProtocol.cpp | 10 ++- core/src/VncServerProtocol.cpp | 7 +- core/src/VncView.cpp | 2 +- core/src/VncViewItem.cpp | 6 +- core/src/VncViewWidget.cpp | 15 +++- master/src/ComputerControlListModel.cpp | 81 ++++++++----------- master/src/ComputerControlListModel.h | 14 ++-- master/src/ComputerImageProvider.cpp | 48 +++++++++++ master/src/ComputerImageProvider.h | 46 +++++++++++ master/src/ComputerMonitoringView.cpp | 8 ++ master/src/ComputerZoomWidget.cpp | 1 - master/src/ComputerZoomWidget.h | 2 +- master/src/LocationDialog.cpp | 6 +- master/src/SpotlightPanel.cpp | 4 +- master/src/VeyonMaster.cpp | 4 +- master/src/VeyonMaster.h | 2 +- plugins/authkeys/AuthKeysManager.cpp | 6 +- plugins/authkeys/AuthKeysPlugin.h | 2 +- plugins/authlogon/AuthLogonPlugin.h | 2 +- plugins/authsimple/AuthSimplePlugin.h | 2 +- .../BuiltinDirectoryPlugin.cpp | 28 +++---- .../builtindirectory/BuiltinDirectoryPlugin.h | 2 +- plugins/demo/DemoClient.cpp | 13 ++- plugins/demo/DemoFeaturePlugin.h | 2 +- .../DesktopServicesFeaturePlugin.h | 2 +- plugins/filetransfer/FileTransferPlugin.h | 2 +- plugins/ldap/LdapPlugin.h | 2 +- plugins/ldap/common/LdapBrowseModel.cpp | 4 +- plugins/ldap/kldap/CMakeLists.txt | 7 +- plugins/platform/linux/CMakeLists.txt | 13 ++- plugins/platform/linux/LinuxCoreFunctions.cpp | 23 ++++-- plugins/platform/linux/LinuxKeyboardInput.cpp | 2 +- plugins/platform/linux/LinuxPlatformPlugin.h | 2 +- .../platform/linux/auth-helper/CMakeLists.txt | 7 +- .../platform/windows/WindowsPlatformPlugin.h | 2 +- .../powercontrol/PowerControlFeaturePlugin.h | 2 +- .../remoteaccess/RemoteAccessFeaturePlugin.h | 2 +- plugins/remoteaccess/RemoteAccessPage.h | 3 +- plugins/remoteaccess/RemoteAccessWidget.cpp | 4 + plugins/remoteaccess/RemoteAccessWidget.h | 4 + plugins/screenlock/ScreenLockFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.h | 2 +- plugins/servicecontrol/ServiceControlPlugin.h | 2 +- plugins/shell/ShellCommandLinePlugin.h | 2 +- .../systemusergroups/SystemUserGroupsPlugin.h | 2 +- plugins/testing/TestingCommandLinePlugin.cpp | 5 +- plugins/testing/TestingCommandLinePlugin.h | 2 +- .../textmessage/TextMessageFeaturePlugin.h | 2 +- .../UserSessionControlPlugin.h | 2 +- .../vncserver/external/ExternalVncServer.h | 2 +- .../vncserver/headless/HeadlessVncServer.h | 2 +- .../ultravnc-builtin/BuiltinUltraVncServer.h | 2 +- .../x11vnc-builtin/BuiltinX11VncServer.h | 2 +- server/CMakeLists.txt | 6 -- server/src/main.cpp | 2 + worker/src/VeyonWorker.cpp | 4 +- worker/src/VeyonWorker.h | 2 +- worker/src/main.cpp | 4 +- 88 files changed, 460 insertions(+), 202 deletions(-) create mode 100644 master/src/ComputerImageProvider.cpp create mode 100644 master/src/ComputerImageProvider.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3507e539a..311c9aff7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,17 +143,34 @@ endif() set(VEYON_CORE_INCLUDE_DIR core/src) -# find required Qt5 modules -find_package(Qt5Core REQUIRED) -find_package(Qt5Concurrent REQUIRED) -find_package(Qt5Gui REQUIRED) -find_package(Qt5Widgets REQUIRED) -find_package(Qt5Network REQUIRED) -find_package(Qt5LinguistTools REQUIRED) -find_package(Qt5Quick REQUIRED) -find_package(Qt5QuickControls2 REQUIRED) -if(VEYON_BUILD_ANDROID) -find_package(Qt5AndroidExtras REQUIRED) +# find required Qt modules +option(WITH_QT6 "Build for Qt 6" OFF) +if(WITH_QT6) + find_package(Qt6 COMPONENTS + Core + Concurrent + Gui + Widgets + Network + LinguistTools + Quick + QuickControls2 + REQUIRED) + if(VEYON_BUILD_ANDROID) + find_package(Qt6 COMPONENTS AndroidExtras REQUIRED) + endif() +else() + find_package(Qt5Core REQUIRED) + find_package(Qt5Concurrent REQUIRED) + find_package(Qt5Gui REQUIRED) + find_package(Qt5Widgets REQUIRED) + find_package(Qt5Network REQUIRED) + find_package(Qt5LinguistTools REQUIRED) + find_package(Qt5Quick REQUIRED) + find_package(Qt5QuickControls2 REQUIRED) + if(VEYON_BUILD_ANDROID) + find_package(Qt5AndroidExtras REQUIRED) + endif() endif() # find required libraries @@ -234,8 +251,13 @@ set(WITH_LTO OFF) endif() if(WITH_MODEL_TESTERS) -find_package(Qt5Test REQUIRED) -set(VEYON_DEBUG_LIBRARIES Qt5::Test) + if(WITH_QT6) + find_package(Qt6 COMPONENTS Test REQUIRED) + set(VEYON_DEBUG_LIBRARIES Qt6::Test) + else() + find_package(Qt5Test REQUIRED) + set(VEYON_DEBUG_LIBRARIES Qt5::Test) + endif() endif() add_definitions( diff --git a/cli/src/ConfigCommands.cpp b/cli/src/ConfigCommands.cpp index ffc94b280..f687e664c 100644 --- a/cli/src/ConfigCommands.cpp +++ b/cli/src/ConfigCommands.cpp @@ -302,7 +302,11 @@ void ConfigCommands::listConfiguration( ListMode listMode ) const replace( QLatin1Char('Q'), QString() ).toLower() ); break; } +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + stdoutStream << Qt::endl; +#else stdoutStream << endl; +#endif } } diff --git a/cli/src/ConfigCommands.h b/cli/src/ConfigCommands.h index dcd3a0ae2..410d58cb4 100644 --- a/cli/src/ConfigCommands.h +++ b/cli/src/ConfigCommands.h @@ -37,7 +37,7 @@ class ConfigCommands : public QObject, CommandLinePluginInterface, PluginInterfa Plugin::Uid uid() const override { - return QStringLiteral("1bdb0d1c-f8eb-4d21-a093-d555a10f3975"); + return Plugin::Uid{ QStringLiteral("1bdb0d1c-f8eb-4d21-a093-d555a10f3975") }; } QVersionNumber version() const override diff --git a/cli/src/PluginsCommands.cpp b/cli/src/PluginsCommands.cpp index 88968a256..1e80369cc 100644 --- a/cli/src/PluginsCommands.cpp +++ b/cli/src/PluginsCommands.cpp @@ -83,7 +83,11 @@ CommandLinePluginInterface::RunResult PluginsCommands::handle_show( const QStrin plugin->name(), plugin->description(), plugin->version().toString(), - VeyonCore::formattedUuid( plugin->uid().toString() ) +#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) + plugin->uid().toString( QUuid::WithoutBraces ) +#else + VeyonCore::formattedUuid( plugin->uid().toString() ) +#endif } ); } diff --git a/cli/src/PluginsCommands.h b/cli/src/PluginsCommands.h index a9259bd22..dff496a3c 100644 --- a/cli/src/PluginsCommands.h +++ b/cli/src/PluginsCommands.h @@ -37,7 +37,7 @@ class PluginsCommands : public QObject, CommandLinePluginInterface, PluginInterf Plugin::Uid uid() const override { - return QStringLiteral("cbea24b5-4f6b-446d-8f54-4f98ec796a8c"); + return Plugin::Uid{ QStringLiteral("cbea24b5-4f6b-446d-8f54-4f98ec796a8c") }; } QVersionNumber version() const override diff --git a/cmake/modules/CreateTranslations.cmake b/cmake/modules/CreateTranslations.cmake index 17ba3b63f..4a9c916c6 100644 --- a/cmake/modules/CreateTranslations.cmake +++ b/cmake/modules/CreateTranslations.cmake @@ -5,6 +5,14 @@ function(create_translations name ts_files source_files) + if(WITH_QT6) + set(LUPDATE Qt6::lupdate) + set(LRELEASE Qt6::lrelease) + else() + set(LUPDATE ${Qt5_LUPDATE_EXECUTABLE}) + set(LRELEASE ${Qt5_LRELEASE_EXECUTABLE}) + endif() + set(qm_targets "") foreach(ts_file ${ts_files}) string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" ts_filename "${ts_file}") @@ -13,12 +21,12 @@ function(create_translations name ts_files source_files) set(qm_target "${basename}_qm") set(qm_file "${CMAKE_CURRENT_BINARY_DIR}/${basename}.qm") add_custom_command(OUTPUT ${ts_file} - COMMAND ${Qt5_LUPDATE_EXECUTABLE} -locations none -no-obsolete ${source_files} -ts ${ts_file} + COMMAND ${LUPDATE} -locations none -no-obsolete ${source_files} -ts ${ts_file} DEPENDS ${source_files}) add_custom_target(${ts_target} DEPENDS ${ts_file}) # add command and target for generating/updating QM file if TS file is newer or no QM file exists yet add_custom_command(OUTPUT ${qm_file} - COMMAND ${Qt5_LRELEASE_EXECUTABLE} ${ts_file} -qm ${qm_file} + COMMAND ${LRELEASE} ${ts_file} -qm ${qm_file} DEPENDS ${ts_file}) add_custom_target(${qm_target} DEPENDS ${qm_file}) diff --git a/cmake/modules/FindQCA.cmake b/cmake/modules/FindQCA.cmake index 75a6b0221..1cd968122 100644 --- a/cmake/modules/FindQCA.cmake +++ b/cmake/modules/FindQCA.cmake @@ -20,7 +20,11 @@ if(QCA_INCLUDE_DIR AND QCA_LIBRARY) else() - set(QCA_LIBRARY_NAMES qca-qt5 qca2-qt5) + if(WITH_QT6) + set(QCA_LIBRARY_NAMES qca-qt6 qca2-qt6) + else() + set(QCA_LIBRARY_NAMES qca-qt5 qca2-qt5) + endif() find_library(QCA_LIBRARY NAMES ${QCA_LIBRARY_NAMES} diff --git a/cmake/modules/FindQtTranslations.cmake b/cmake/modules/FindQtTranslations.cmake index cf9377d7f..ed9a42faf 100644 --- a/cmake/modules/FindQtTranslations.cmake +++ b/cmake/modules/FindQtTranslations.cmake @@ -8,7 +8,11 @@ function(find_qt_translations) # find Qt's translation files set(QT_TRANSLATIONS_STAMP ${CMAKE_CURRENT_BINARY_DIR}/qttranslations.stamp) if(NOT EXISTS "${QT_TRANSLATIONS_STAMP}") - get_target_property(QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) + if(WITH_QT6) + get_target_property(QT_QMAKE_EXECUTABLE Qt6::qmake IMPORTED_LOCATION) + else() + get_target_property(QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) + endif() execute_process(COMMAND "${QT_QMAKE_EXECUTABLE}" -query QT_INSTALL_TRANSLATIONS OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE QT_INSTALL_TRANSLATIONS) diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index f4320c3f8..5871834a4 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -92,7 +92,8 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule ui->isAtLocationSubjectComboBox->setCurrentText( m_subjectNameMap.value( rule.subject( AccessControlRule::Condition::LocatedAt ) ) ); // load condition arguments - ui->authenticationMethodsComboBox->setCurrentText( authenticationMethods.value( rule.argument( AccessControlRule::Condition::AuthenticationMethod ) ) ); + ui->authenticationMethodsComboBox->setCurrentText( authenticationMethods.value( + Plugin::Uid{ rule.argument( AccessControlRule::Condition::AuthenticationMethod ) } ) ); ui->groupsComboBox->setCurrentText( rule.argument( AccessControlRule::Condition::MemberOfUserGroup ) ); ui->locationsComboBox->setCurrentText( rule.argument( AccessControlRule::Condition::LocatedAt ) ); diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index 8bcf976fb..37bc14263 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -72,13 +72,13 @@ int AccessControlRulesTestDialog::exec() void AccessControlRulesTestDialog::accept() { - const auto result = - AccessControlProvider().processAccessControlRules( ui->accessingUserLineEdit->text(), - ui->accessingComputerLineEdit->text(), - ui->localUserLineEdit->text(), - ui->localComputerLineEdit->text(), - ui->connectedUsersLineEdit->text().split( QLatin1Char(',') ), - ui->authenticationMethodsComboBox->currentData().toString() ); + const auto result = AccessControlProvider{} + .processAccessControlRules( ui->accessingUserLineEdit->text(), + ui->accessingComputerLineEdit->text(), + ui->localUserLineEdit->text(), + ui->localComputerLineEdit->text(), + ui->connectedUsersLineEdit->text().split( QLatin1Char(',') ), + Plugin::Uid{ui->authenticationMethodsComboBox->currentData().toString()} ); QString resultText; switch( result ) diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index d32b68c60..fec2b4f70 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index e82a8c8b1..b8d4c08f1 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -42,16 +42,26 @@ target_include_directories(veyon-core PUBLIC ${QCA_INCLUDE_DIR} ) +if(WITH_QT6) + target_link_libraries(veyon-core + Qt6::Concurrent + Qt6::Gui + Qt6::Network + Qt6::Widgets + Qt6::QuickControls2) +else() + target_link_libraries(veyon-core + Qt5::Concurrent + Qt5::Gui + Qt5::Network + Qt5::Widgets + Qt5::QuickControls2) +endif() + target_link_libraries(veyon-core - Qt5::Concurrent - Qt5::Gui - Qt5::Network - Qt5::Widgets - Qt5::QuickControls2 OpenSSL::SSL ${VEYON_DEBUG_LIBRARIES} - ${QCA_LIBRARY} - ) + ${QCA_LIBRARY}) if(LibVNCClient_FOUND) target_link_libraries(veyon-core LibVNC::LibVNCClient) @@ -114,7 +124,11 @@ if(WITH_PCH) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_AUTOGEN TRUE) target_sources(veyon-pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx) endif() - target_link_libraries(veyon-pch Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) + if(WITH_QT6) + target_link_libraries(veyon-pch Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Widgets) + else() + target_link_libraries(veyon-pch Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) + endif() target_precompile_headers(veyon-pch PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") if(VEYON_BUILD_WIN32) target_compile_definitions(veyon-pch PUBLIC _WIN32_WINNT=0x0602) diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index 17181c02b..f8b4e44bb 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include "Configuration/LocalStore.h" @@ -60,12 +61,12 @@ static void loadSettingsTree( Object *obj, QSettings *s, for( const auto& k : childKeys ) { - QString stringValue = s->value( k ).toString(); - QRegExp jsonValueRX( QStringLiteral("@JsonValue(\\(.*\\))") ); + const auto stringValue = s->value( k ).toString(); + const auto jsonValueMatch = QRegularExpression( QStringLiteral("^@JsonValue(\\(.*\\))$") ).match( stringValue ); - if( jsonValueRX.indexIn( stringValue ) == 0 ) + if( jsonValueMatch.hasMatch() ) { - auto jsonValue = QJsonDocument::fromJson( QByteArray::fromBase64( jsonValueRX.cap( 1 ).toUtf8() ) ).object(); + auto jsonValue = QJsonDocument::fromJson( QByteArray::fromBase64( jsonValueMatch.captured( 1 ).toUtf8() ) ).object(); if( jsonValue.contains( QStringLiteral( "a" ) ) ) { obj->setValue( k, jsonValue[QStringLiteral("a")].toArray(), parentKey ); diff --git a/core/src/DesktopAccessDialog.h b/core/src/DesktopAccessDialog.h index a59d10ad2..ff5cd548d 100644 --- a/core/src/DesktopAccessDialog.h +++ b/core/src/DesktopAccessDialog.h @@ -69,7 +69,7 @@ class VEYON_CORE_EXPORT DesktopAccessDialog : public QObject, public FeatureProv Plugin::Uid uid() const override { - return QStringLiteral("13fb9ce8-afbc-4397-93e3-e01c4d8288c9"); + return Plugin::Uid{ QStringLiteral("13fb9ce8-afbc-4397-93e3-e01c4d8288c9") }; } QVersionNumber version() const override diff --git a/core/src/FeatureControl.cpp b/core/src/FeatureControl.cpp index eae67b5f7..d4b7cab60 100644 --- a/core/src/FeatureControl.cpp +++ b/core/src/FeatureControl.cpp @@ -61,7 +61,7 @@ bool FeatureControl::handleFeatureMessage( ComputerControlInterface::Pointer com for( const auto& featureUidString : featureUidStrings ) { - activeFeatures.append( featureUidString ); + activeFeatures.append( Feature::Uid{featureUidString} ); } computerControlInterface->setActiveFeatures( activeFeatures ); diff --git a/core/src/FeatureControl.h b/core/src/FeatureControl.h index 8bc4bcc30..54a71aa86 100644 --- a/core/src/FeatureControl.h +++ b/core/src/FeatureControl.h @@ -44,7 +44,7 @@ class VEYON_CORE_EXPORT FeatureControl : public QObject, public FeatureProviderI Plugin::Uid uid() const override { - return QStringLiteral("f5ec79e0-186c-4af0-89a2-7e5687cc32b2"); + return Plugin::Uid{ QStringLiteral("f5ec79e0-186c-4af0-89a2-7e5687cc32b2") }; } QVersionNumber version() const override diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index d7f79a978..b6f76d38c 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -41,8 +41,7 @@ FeatureWorkerManager::FeatureWorkerManager( VeyonServerInterface& server, Featur QObject( parent ), m_server( server ), m_featureManager( featureManager ), - m_tcpServer( this ), - m_workersMutex( QMutex::Recursive ) + m_tcpServer( this ) { connect( &m_tcpServer, &QTcpServer::newConnection, this, &FeatureWorkerManager::acceptConnection ); diff --git a/core/src/FeatureWorkerManager.h b/core/src/FeatureWorkerManager.h index 123c55f71..23937cebf 100644 --- a/core/src/FeatureWorkerManager.h +++ b/core/src/FeatureWorkerManager.h @@ -24,12 +24,17 @@ #pragma once -#include #include #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) +#include +#else +#include +#endif + #include "FeatureMessage.h" class FeatureManager; @@ -78,6 +83,10 @@ class VEYON_CORE_EXPORT FeatureWorkerManager : public QObject using WorkerMap = QMap; WorkerMap m_workers; - QMutex m_workersMutex; +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + QRecursiveMutex m_workersMutex; +#else + QMutex m_workersMutex{QMutex::Recursive}; +#endif } ; diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index 9913ccb2d..ca5020e98 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -26,7 +26,9 @@ #include "PlatformInputDeviceFunctions.h" #include +#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) #include +#endif #include #include #include @@ -58,7 +60,11 @@ LockWidget::LockWidget( Mode mode, const QPixmap& background, QWidget* parent ) setWindowTitle( {} ); show(); move( 0, 0 ); +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + setFixedSize( screen()->size() ); +#else setFixedSize( qApp->desktop()->size() ); +#endif VeyonCore::platform().coreFunctions().raiseWindow( this, true ); showFullScreen(); setFocusPolicy( Qt::StrongFocus ); diff --git a/core/src/Lockable.h b/core/src/Lockable.h index 09de5cb5c..b2156d83f 100644 --- a/core/src/Lockable.h +++ b/core/src/Lockable.h @@ -23,7 +23,11 @@ #pragma once +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) +#include +#else #include +#endif class Lockable { @@ -39,6 +43,10 @@ class Lockable } private: +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + QRecursiveMutex m_mutex{}; +#else QMutex m_mutex{QMutex::Recursive}; +#endif }; diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index e5fba3275..d7fa98036 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -110,7 +110,7 @@ void MonitoringMode::queryUserInformation() { // asynchronously query information about logged on user (which might block // due to domain controller queries and timeouts etc.) - QtConcurrent::run( [=]() { + (void) QtConcurrent::run( [=]() { const auto userLoginName = VeyonCore::platform().userFunctions().currentUser(); const auto userFullName = VeyonCore::platform().userFunctions().fullName( userLoginName ); const auto userSessionId = VeyonCore::sessionId(); diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index e7d4c7a55..a1a249a3a 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -48,7 +48,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac Plugin::Uid uid() const override { - return QStringLiteral("1a6a59b1-c7a1-43cc-bcab-c136a4d91be8"); + return Plugin::Uid{ QStringLiteral("1a6a59b1-c7a1-43cc-bcab-c136a4d91be8") }; } QVersionNumber version() const override diff --git a/core/src/QSGImageTexture.cpp b/core/src/QSGImageTexture.cpp index c04e27030..fb5861552 100644 --- a/core/src/QSGImageTexture.cpp +++ b/core/src/QSGImageTexture.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "QSGImageTexture.h" +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) #include #include @@ -172,3 +173,4 @@ void QSGImageTexture::bind() m_dirty_bind_options = false; m_image = {}; } +#endif diff --git a/core/src/QSGImageTexture.h b/core/src/QSGImageTexture.h index 094000b94..04ed2b708 100644 --- a/core/src/QSGImageTexture.h +++ b/core/src/QSGImageTexture.h @@ -39,8 +39,9 @@ #pragma once -#include #include +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#include class QSGImageTexture : public QSGTexture { @@ -84,3 +85,4 @@ class QSGImageTexture : public QSGTexture uint m_owns_texture : 1; }; +#endif diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index a1811894f..56bff958c 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -182,8 +182,8 @@ QString Screenshot::host() const QString Screenshot::date() const { - return QDate::fromString( property( metaDataKey( MetaData::Date ), 2 ), - Qt::ISODate ).toString( Qt::LocalDate ); + return QLocale::system().toString( QDate::fromString( property( metaDataKey( MetaData::Date ), 2 ), Qt::ISODate ), + QLocale::ShortFormat ); } diff --git a/core/src/SystemTrayIcon.h b/core/src/SystemTrayIcon.h index bf5eaabe3..c323c965e 100644 --- a/core/src/SystemTrayIcon.h +++ b/core/src/SystemTrayIcon.h @@ -54,7 +54,7 @@ class VEYON_CORE_EXPORT SystemTrayIcon : public QObject, public FeatureProviderI Plugin::Uid uid() const override { - return QStringLiteral("3cb1adb1-6b4d-4934-a641-db767df83eea"); + return Plugin::Uid { QStringLiteral("3cb1adb1-6b4d-4934-a641-db767df83eea") }; } QVersionNumber version() const override diff --git a/core/src/ToolButton.cpp b/core/src/ToolButton.cpp index 92109cb3b..cfb7ac763 100644 --- a/core/src/ToolButton.cpp +++ b/core/src/ToolButton.cpp @@ -26,7 +26,9 @@ #include #include #include +#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) #include +#endif #include #include #include @@ -80,7 +82,11 @@ void ToolButton::addTo( QToolBar* toolBar ) +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +void ToolButton::enterEvent( QEnterEvent* event ) +#else void ToolButton::enterEvent( QEvent* event ) +#endif { m_mouseOver = true; if( !s_toolTipsDisabled && !m_label.isEmpty() && !m_descr.isEmpty() ) diff --git a/core/src/ToolButton.h b/core/src/ToolButton.h index 06aac7366..9ef10b703 100644 --- a/core/src/ToolButton.h +++ b/core/src/ToolButton.h @@ -64,7 +64,11 @@ class VEYON_CORE_EXPORT ToolButton : public QToolButton protected: - void enterEvent( QEvent * _e ) override; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + void enterEvent( QEnterEvent* event ) override; +#else + void enterEvent( QEvent* event ) override; +#endif void leaveEvent( QEvent * _e ) override; void mousePressEvent( QMouseEvent * _me ) override; void paintEvent( QPaintEvent * _pe ) override; diff --git a/core/src/TranslationLoader.cpp b/core/src/TranslationLoader.cpp index 2ae782944..4b171d69b 100644 --- a/core/src/TranslationLoader.cpp +++ b/core/src/TranslationLoader.cpp @@ -23,6 +23,7 @@ */ #include +#include #include #include "TranslationLoader.h" @@ -41,10 +42,11 @@ QLocale TranslationLoader::load( const QString& resourceName ) { QLocale configuredLocale( QLocale::C ); - QRegExp localeRegEx( QStringLiteral( "[^(]*\\(([^)]*)\\)") ); - if( localeRegEx.indexIn( VeyonCore::config().uiLanguage() ) == 0 ) + const auto configuredLocaleMatch = QRegularExpression{ QStringLiteral( "[^(]*\\(([^)]*)\\)") } + .match( VeyonCore::config().uiLanguage() ); + if( configuredLocaleMatch.hasMatch() ) { - configuredLocale = QLocale( localeRegEx.cap( 1 ) ); + configuredLocale = QLocale( configuredLocaleMatch.captured( 1 ) ); } if( configuredLocale.language() != QLocale::English && @@ -62,8 +64,8 @@ QLocale TranslationLoader::load( const QString& resourceName ) if( translator->load( QStringLiteral( "%1_%2.qm" ).arg( resourceName, configuredLocale.name() ), VeyonCore::translationsDirectory() ) == false ) { - translator->load( QStringLiteral( "%1_%2.qm" ).arg( resourceName, configuredLocale.language() ), - VeyonCore::translationsDirectory() ); + (void) translator->load( QStringLiteral( "%1_%2.qm" ).arg( resourceName, configuredLocale.language() ), + VeyonCore::translationsDirectory() ); } } diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 2c16f04f2..48485fed4 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -221,7 +221,9 @@ void VeyonCore::setupApplicationParameters() QCoreApplication::setOrganizationDomain( QStringLiteral( "veyon.io" ) ); QCoreApplication::setApplicationName( QStringLiteral( "Veyon" ) ); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QApplication::setAttribute( Qt::AA_UseHighDpiPixmaps ); +#endif } diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 9872fabd5..1ab5002da 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -30,6 +30,7 @@ extern "C" #include #include +#include #include #include "VncClientProtocol.h" @@ -235,11 +236,12 @@ bool VncClientProtocol::readProtocol() return false; } - QRegExp protocolRX( QStringLiteral("RFB (\\d\\d\\d)\\.(\\d\\d\\d)\n") ); + const auto match = QRegularExpression{ QStringLiteral("RFB (\\d\\d\\d)\\.(\\d\\d\\d)\n") } + .match( QString::fromUtf8( protocol ) ); - if( protocolRX.indexIn( QString::fromUtf8( protocol ) ) != 0 || - protocolRX.cap( 1 ).toInt() != 3 || - protocolRX.cap( 2 ).toInt() < 7 ) + if( match.hasMatch() == false || + match.captured( 1 ).toInt() != 3 || + match.captured( 2 ).toInt() < 7 ) { vCritical() << "invalid protocol version"; m_socket->close(); diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index 4adbce66d..cccfc6ed1 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -25,7 +25,9 @@ #include "rfb/rfbproto.h" #include +#include #include + #include "AuthenticationCredentials.h" #include "VariantArrayMessage.h" #include "VncServerClient.h" @@ -124,9 +126,8 @@ bool VncServerProtocol::readProtocol() return false; } - QRegExp protocolRX( QStringLiteral("RFB (\\d\\d\\d)\\.(\\d\\d\\d)\n") ); - - if( protocolRX.indexIn( QString::fromUtf8( protocol ) ) != 0 ) + if( QRegularExpression{ QStringLiteral("RFB (\\d\\d\\d)\\.(\\d\\d\\d)\n") } + .match( QString::fromUtf8( protocol ) ).hasMatch() == false ) { vCritical() << "invalid protocol version"; m_socket->close(); diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index 81ae9add4..313447d16 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -566,7 +566,7 @@ void VncView::mouseEventHandler( QMouseEvent* event ) static constexpr std::array buttonTranslationMap{ { { Qt::LeftButton, rfbButton1Mask }, - { Qt::MidButton, rfbButton2Mask }, + { Qt::MiddleButton, rfbButton2Mask }, { Qt::RightButton, rfbButton3Mask } } }; diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index 4f95d155f..efd59208a 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -61,6 +61,10 @@ QSGNode* VncViewItem::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* up { Q_UNUSED(updatePaintNodeData) +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + // TODO + return oldNode; +#else auto* node = static_cast(oldNode); if( !node ) { @@ -79,10 +83,10 @@ QSGNode* VncViewItem::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* up { texture->setImage( m_computerControlInterface->screen() ); } - node->setRect( boundingRect() ); return node; +#endif } diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index 3d2cd8156..0f0432c57 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -23,11 +23,16 @@ */ #include -#include #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) +#include +#else +#include +#endif + #include "ProgressWidget.h" #include "VeyonConnection.h" #include "VncConnection.h" @@ -76,7 +81,13 @@ VncViewWidget::VncViewWidget( const QString& host, int port, QWidget* parent, Mo show(); - resize( QApplication::desktop()->availableGeometry( this ).size() - QSize( 10, 30 ) ); +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + const auto screenGeometry = screen()->availableGeometry(); +#else + const auto screenGeometry = QApplication::desktop()->availableGeometry( this ); +#endif + + resize( screenGeometry.size() - QSize( 10, 30 ) ); setFocusPolicy( Qt::StrongFocus ); setFocus(); diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 605ad2931..4ebc07199 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -25,6 +25,7 @@ #include #include "ComputerControlListModel.h" +#include "ComputerImageProvider.h" #include "ComputerManager.h" #include "FeatureManager.h" #include "VeyonMaster.h" @@ -38,8 +39,8 @@ ComputerControlListModel::ComputerControlListModel( VeyonMaster* masterCore, QObject* parent ) : ComputerListModel( parent ), - QQuickImageProvider( QQmlImageProviderBase::Image ), m_master( masterCore ), + m_imageProvider( new ComputerImageProvider( this ) ), m_iconDefault( QStringLiteral(":/master/preferences-desktop-display-gray.png") ), m_iconConnectionProblem( QStringLiteral(":/master/preferences-desktop-display-red.png") ), m_iconServerNotRunning( QStringLiteral(":/master/preferences-desktop-display-orange.png") ) @@ -107,7 +108,7 @@ QVariant ComputerControlListModel::data( const QModelIndex& index, int role ) co return QVariant::fromValue( computerControl->state() ); case ImageIdRole: - return QStringLiteral("image://%1/%2/%3").arg( imageProviderId(), + return QStringLiteral("image://%1/%2/%3").arg( imageProvider()->id(), VeyonCore::formattedUuid( computerControl->computer().networkObjectUid() ), QString::number( computerControl->timestamp() ) ); @@ -159,22 +160,6 @@ bool ComputerControlListModel::setData( const QModelIndex& index, const QVariant -QImage ComputerControlListModel::requestImage( const QString& id, QSize* size, const QSize& requestedSize ) -{ - Q_UNUSED(size) - Q_UNUSED(requestedSize) - - const auto controlInterface = computerControlInterface( NetworkObject::Uid{id} ); - if( controlInterface ) - { - return computerDecorationRole( controlInterface ); - } - - return {}; -} - - - void ComputerControlListModel::updateComputerScreenSize() { auto ratio = 16.0 / 9.0; @@ -239,6 +224,36 @@ ComputerControlInterface::Pointer ComputerControlListModel::computerControlInter +QImage ComputerControlListModel::computerDecorationRole( const ComputerControlInterface::Pointer& controlInterface ) const +{ + switch( controlInterface->state() ) + { + case ComputerControlInterface::State::Connected: + { + const auto image = controlInterface->scaledScreen(); + if( image.isNull() == false ) + { + return image; + } + + return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledScreenSize() ); + } + + case ComputerControlInterface::State::ServerNotRunning: + return scaleAndAlignIcon( m_iconServerNotRunning, controlInterface->scaledScreenSize() ); + + case ComputerControlInterface::State::AuthenticationFailed: + return scaleAndAlignIcon( m_iconConnectionProblem, controlInterface->scaledScreenSize() ); + + default: + break; + } + + return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledScreenSize() ); +} + + + void ComputerControlListModel::reload() { beginResetModel(); @@ -431,36 +446,6 @@ QImage ComputerControlListModel::scaleAndAlignIcon( const QImage& icon, QSize si -QImage ComputerControlListModel::computerDecorationRole( const ComputerControlInterface::Pointer& controlInterface ) const -{ - switch( controlInterface->state() ) - { - case ComputerControlInterface::State::Connected: - { - const auto image = controlInterface->scaledScreen(); - if( image.isNull() == false ) - { - return image; - } - - return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledScreenSize() ); - } - - case ComputerControlInterface::State::ServerNotRunning: - return scaleAndAlignIcon( m_iconServerNotRunning, controlInterface->scaledScreenSize() ); - - case ComputerControlInterface::State::AuthenticationFailed: - return scaleAndAlignIcon( m_iconConnectionProblem, controlInterface->scaledScreenSize() ); - - default: - break; - } - - return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledScreenSize() ); -} - - - QString ComputerControlListModel::computerToolTipRole( const ComputerControlInterface::Pointer& controlInterface ) const { const QString state( computerStateDescription( controlInterface ) ); diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index c4758f748..3b5dc9545 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -31,9 +31,10 @@ #include "ComputerListModel.h" #include "ComputerControlInterface.h" +class ComputerImageProvider; class VeyonMaster; -class ComputerControlListModel : public ComputerListModel, public QQuickImageProvider +class ComputerControlListModel : public ComputerListModel { Q_OBJECT public: @@ -45,13 +46,11 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro bool setData( const QModelIndex& index, const QVariant& value, int role ) override; - const QString& imageProviderId() const + ComputerImageProvider* imageProvider() const { - return m_imageProviderId; + return m_imageProvider; } - QImage requestImage( const QString& id, QSize *size, const QSize &requestedSize ) override; - void updateComputerScreenSize(); QSize computerScreenSize() const @@ -67,6 +66,8 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro ComputerControlInterface::Pointer computerControlInterface( const QModelIndex& index ) const; ComputerControlInterface::Pointer computerControlInterface( NetworkObject::Uid uid ) const; + QImage computerDecorationRole( const ComputerControlInterface::Pointer& controlInterface ) const; + void reload(); Q_SIGNALS: @@ -89,7 +90,6 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro double averageAspectRatio() const; QImage scaleAndAlignIcon( const QImage& icon, QSize size ) const; - QImage computerDecorationRole( const ComputerControlInterface::Pointer& controlInterface ) const; QString computerToolTipRole( const ComputerControlInterface::Pointer& controlInterface ) const; QString computerDisplayRole( const ComputerControlInterface::Pointer& controlInterface ) const; QString computerSortRole( const ComputerControlInterface::Pointer& controlInterface ) const; @@ -99,7 +99,7 @@ class ComputerControlListModel : public ComputerListModel, public QQuickImagePro VeyonMaster* m_master; - QString m_imageProviderId{ QStringLiteral("computers") }; + ComputerImageProvider* m_imageProvider; QImage m_iconDefault; QImage m_iconConnectionProblem; QImage m_iconServerNotRunning; diff --git a/master/src/ComputerImageProvider.cpp b/master/src/ComputerImageProvider.cpp new file mode 100644 index 000000000..e15cf42aa --- /dev/null +++ b/master/src/ComputerImageProvider.cpp @@ -0,0 +1,48 @@ +/* + * ComputerImageProvider.cpp - data model for computer control objects + * + * Copyright (c) 2017-2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "ComputerControlListModel.h" +#include "ComputerImageProvider.h" + +ComputerImageProvider::ComputerImageProvider( ComputerControlListModel* model ) : + QQuickImageProvider( QQmlImageProviderBase::Image ), + m_model( model ) +{ +} + + + +QImage ComputerImageProvider::requestImage( const QString& id, QSize* size, const QSize& requestedSize ) +{ + Q_UNUSED(size) + Q_UNUSED(requestedSize) + + const auto controlInterface = m_model->computerControlInterface( NetworkObject::Uid{id} ); + if( controlInterface ) + { + return m_model->computerDecorationRole( controlInterface ); + } + + return {}; +} diff --git a/master/src/ComputerImageProvider.h b/master/src/ComputerImageProvider.h new file mode 100644 index 000000000..228d3c6a5 --- /dev/null +++ b/master/src/ComputerImageProvider.h @@ -0,0 +1,46 @@ +/* + * ComputerImageProvider.h - image provider for computers + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include + +class ComputerControlListModel; + +class ComputerImageProvider : public QQuickImageProvider +{ +public: + explicit ComputerImageProvider( ComputerControlListModel* model ); + + QImage requestImage( const QString& id, QSize *size, const QSize &requestedSize ) override; + + QString id() const + { + return QStringLiteral("computers"); + } + +private: + ComputerControlListModel* m_model; + +}; diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 805cb1ce8..cde47215b 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -83,14 +83,22 @@ ComputerMonitoringModel* ComputerMonitoringView::dataModel() const QString ComputerMonitoringView::searchFilter() const { +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) + return dataModel()->filterRegularExpression().pattern(); +#else return dataModel()->filterRegExp().pattern(); +#endif } void ComputerMonitoringView::setSearchFilter( const QString& searchFilter ) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) + dataModel()->setFilterRegularExpression( searchFilter ); +#else dataModel()->setFilterRegExp( searchFilter ); +#endif } diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 2b4eabd7a..d7c3af7ca 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -23,7 +23,6 @@ */ #include -#include #include #include diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index b9ebe606d..7091a7115 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -26,7 +26,7 @@ #include "ComputerControlInterface.h" -#include +#include class VncViewWidget; diff --git a/master/src/LocationDialog.cpp b/master/src/LocationDialog.cpp index 73226eddd..3f1736a0c 100644 --- a/master/src/LocationDialog.cpp +++ b/master/src/LocationDialog.cpp @@ -55,7 +55,11 @@ LocationDialog::~LocationDialog() void LocationDialog::updateSearchFilter() { - m_sortFilterProxyModel.setFilterRegExp( QRegExp( ui->filterLineEdit->text() ) ); +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) + m_sortFilterProxyModel.setFilterRegularExpression( ui->filterLineEdit->text() ); +#else + m_sortFilterProxyModel.setFilterRegExp( ui->filterLineEdit->text() ); +#endif m_sortFilterProxyModel.setFilterCaseSensitivity( Qt::CaseInsensitive ); ui->listView->selectionModel()->setCurrentIndex( m_sortFilterProxyModel.index( 0, 0 ), diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index 07b93670b..a29f4650d 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -192,7 +192,7 @@ void SpotlightPanel::updateIconSize() void SpotlightPanel::addPressedItem( const QModelIndex& index ) { - if( QGuiApplication::mouseButtons().testFlag( Qt::MidButton ) ) + if( QGuiApplication::mouseButtons().testFlag( Qt::MiddleButton ) ) { m_globalComputerMonitoringWidget->selectionModel()->select( index, QItemSelectionModel::SelectCurrent ); @@ -204,7 +204,7 @@ void SpotlightPanel::addPressedItem( const QModelIndex& index ) void SpotlightPanel::removePressedItem( const QModelIndex& index ) { - if( QGuiApplication::mouseButtons().testFlag( Qt::MidButton ) ) + if( QGuiApplication::mouseButtons().testFlag( Qt::MiddleButton ) ) { ui->monitoringWidget->selectionModel()->select( index, QItemSelectionModel::SelectCurrent ); diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index da626708c..a49b90ec6 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -29,6 +29,7 @@ #include "BuiltinFeatures.h" #include "ComputerControlListModel.h" +#include "ComputerImageProvider.h" #include "ComputerManager.h" #include "ComputerMonitoringItem.h" #include "ComputerMonitoringModel.h" @@ -303,7 +304,8 @@ void VeyonMaster::initUserInterface() qmlRegisterType( "Veyon.Master", majorVersion, minorVersion, "ComputerMonitoringItem" ); m_qmlAppEngine = new QQmlApplicationEngine( this ); - m_qmlAppEngine->addImageProvider( m_computerControlListModel->imageProviderId(), m_computerControlListModel ); + m_qmlAppEngine->addImageProvider( m_computerControlListModel->imageProvider()->id(), + m_computerControlListModel->imageProvider() ); m_qmlAppEngine->rootContext()->setContextProperty( QStringLiteral("masterCore"), this ); m_qmlAppEngine->load( QStringLiteral(":/master/main.qml") ); } diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index e26ea7f7b..77284797a 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -24,7 +24,7 @@ #pragma once -#include +#include #include "Feature.h" #include "FeatureListModel.h" diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index 7e9d359c6..c74bb57b5 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -469,11 +469,11 @@ QString AuthKeysManager::exportedKeyFileName( const QString& name, const QString QString AuthKeysManager::keyNameFromExportedKeyFile( const QString& keyFile ) { - QRegExp rx( QStringLiteral("^(.*)_(.*)_key.pem$") ); + const auto keyNameMatch = QRegularExpression( QStringLiteral("^(.*)_(.*)_key.pem$") ).match( keyFile ); - if( rx.indexIn( QFileInfo( keyFile ).fileName() ) == 0 ) + if( keyNameMatch.hasMatch() ) { - return rx.cap( 1 ); + return keyNameMatch.captured( 1 ); } return {}; diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index 06f1cb8f1..f057c87bf 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -49,7 +49,7 @@ class AuthKeysPlugin : public QObject, Plugin::Uid uid() const override { - return QStringLiteral("0c69b301-81b4-42d6-8fae-128cdd113314"); + return Plugin::Uid{ QStringLiteral("0c69b301-81b4-42d6-8fae-128cdd113314") }; } QVersionNumber version() const override diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h index 3f9ea8627..300ab7bf2 100644 --- a/plugins/authlogon/AuthLogonPlugin.h +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -40,7 +40,7 @@ class AuthLogonPlugin : public QObject, Plugin::Uid uid() const override { - return QStringLiteral("63611f7c-b457-42c7-832e-67d0f9281085"); + return Plugin::Uid{ QStringLiteral("63611f7c-b457-42c7-832e-67d0f9281085") }; } QVersionNumber version() const override diff --git a/plugins/authsimple/AuthSimplePlugin.h b/plugins/authsimple/AuthSimplePlugin.h index 109e5ec28..c4288d209 100644 --- a/plugins/authsimple/AuthSimplePlugin.h +++ b/plugins/authsimple/AuthSimplePlugin.h @@ -40,7 +40,7 @@ class AuthSimplePlugin : public QObject, Plugin::Uid uid() const override { - return QStringLiteral("73430b14-ef69-4c75-a145-ba635d1cc676"); + return Plugin::Uid{ QStringLiteral("73430b14-ef69-4c75-a145-ba635d1cc676") }; } QVersionNumber version() const override diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index d6bb33595..85ac7c6c0 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -23,6 +23,7 @@ */ #include +#include #include "BuiltinDirectoryConfigurationPage.h" #include "BuiltinDirectory.h" @@ -680,13 +681,14 @@ bool BuiltinDirectoryPlugin::exportFile( QFile& outputFile, const QString& forma NetworkObject BuiltinDirectoryPlugin::findNetworkObject( const QString& uidOrName ) const { const ObjectManager objectManager( m_configuration.networkObjects() ); + const QUuid uid{uidOrName}; - if( QUuid( uidOrName ).isNull() ) + if( uid.isNull() ) { return objectManager.findByName( uidOrName ); } - return objectManager.findByUid( uidOrName ); + return objectManager.findByUid( uid ); } @@ -695,13 +697,11 @@ NetworkObject BuiltinDirectoryPlugin::toNetworkObject( const QString& line, cons QString& location ) { QStringList placeholders; - QRegExp varDetectionRX( QStringLiteral("\\((%\\w+%):[^)]+\\)") ); - int pos = 0; + auto varDetectionMatchIterator = QRegularExpression{ QStringLiteral("\\((%\\w+%):[^)]+\\)") }.globalMatch( regExWithPlaceholders ); - while( ( pos = varDetectionRX.indexIn( regExWithPlaceholders, pos ) ) != -1 ) + while( varDetectionMatchIterator.hasNext() ) { - placeholders.append( varDetectionRX.cap(1) ); - pos += varDetectionRX.matchedLength(); + placeholders.append( varDetectionMatchIterator.next().captured(1) ); } QString rxString = regExWithPlaceholders; @@ -710,14 +710,14 @@ NetworkObject BuiltinDirectoryPlugin::toNetworkObject( const QString& line, cons rxString.replace( QStringLiteral("%1:").arg( var ), QString() ); } - QRegExp rx( rxString ); - if( rx.indexIn( line ) != -1 ) + auto match = QRegularExpression( rxString ).match( line ); + if( match.hasMatch() ) { auto objectType = NetworkObject::Type::Host; const auto typeIndex = placeholders.indexOf( QStringLiteral("%type%") ); if( typeIndex != -1 ) { - objectType = parseNetworkObjectType( rx.cap( 1 + typeIndex ) ); + objectType = parseNetworkObjectType( match.captured( 1 + typeIndex ) ); } const auto locationIndex = placeholders.indexOf( QStringLiteral("%location%") ); @@ -725,9 +725,9 @@ NetworkObject BuiltinDirectoryPlugin::toNetworkObject( const QString& line, cons const auto hostIndex = placeholders.indexOf( QStringLiteral("%host%") ); const auto macIndex = placeholders.indexOf( QStringLiteral("%mac%") ); - auto name = ( nameIndex != -1 ) ? rx.cap( 1 + nameIndex ).trimmed() : QString(); - auto host = ( hostIndex != -1 ) ? rx.cap( 1 + hostIndex ).trimmed() : QString(); - auto mac = ( macIndex != -1 ) ? rx.cap( 1 + macIndex ).trimmed() : QString(); + auto name = ( nameIndex != -1 ) ? match.captured( 1 + nameIndex ).trimmed() : QString(); + auto host = ( hostIndex != -1 ) ? match.captured( 1 + hostIndex ).trimmed() : QString(); + auto mac = ( macIndex != -1 ) ? match.captured( 1 + macIndex ).trimmed() : QString(); if( objectType == NetworkObject::Type::Location ) { @@ -736,7 +736,7 @@ NetworkObject BuiltinDirectoryPlugin::toNetworkObject( const QString& line, cons if( location.isEmpty() && locationIndex != -1 ) { - location = rx.cap( 1 + locationIndex ).trimmed(); + location = match.captured( 1 + locationIndex ).trimmed(); } if( host.isEmpty() ) diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.h b/plugins/builtindirectory/BuiltinDirectoryPlugin.h index 236c4344e..5a50a8bc9 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.h +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.h @@ -52,7 +52,7 @@ class BuiltinDirectoryPlugin : public QObject, Plugin::Uid uid() const override { - return QStringLiteral("14bacaaa-ebe5-449c-b881-5b382f952571"); + return Plugin::Uid{ QStringLiteral("14bacaaa-ebe5-449c-b881-5b382f952571") }; } QVersionNumber version() const override diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index 033b319bd..eeb5f59d5 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -23,7 +23,11 @@ */ #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) +#include +#else #include +#endif #include #include @@ -54,7 +58,14 @@ DemoClient::DemoClient( const QString& host, int port, bool fullscreen, const QR if( fullscreen == false ) { m_toplevel->setWindowFlags( Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint ); - m_toplevel->resize( QApplication::desktop()->availableGeometry( m_toplevel ).size() - QSize( 10, 30 ) ); + +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + const auto screenGeometry = m_toplevel->screen()->availableGeometry(); +#else + const auto screenGeometry = QApplication::desktop()->availableGeometry( m_toplevel ); +#endif + + m_toplevel->resize( screenGeometry.size() - QSize( 10, 30 ) ); } m_vncView = new VncViewWidget( host, port, m_toplevel, VncView::DemoMode, viewport ); diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 3ef2172fd..30410356f 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -66,7 +66,7 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf Plugin::Uid uid() const override { - return QStringLiteral("1b08265b-348f-4978-acaa-45d4f6b90bd9"); + return Plugin::Uid{ QStringLiteral("1b08265b-348f-4978-acaa-45d4f6b90bd9") }; } QVersionNumber version() const override diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index ed3cbb6b4..e34b31e21 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -51,7 +51,7 @@ class DesktopServicesFeaturePlugin : public QObject, PluginInterface, Plugin::Uid uid() const override { - return QStringLiteral("a54ee018-42bf-4569-90c7-0d8470125ccf"); + return Plugin::Uid{ QStringLiteral("a54ee018-42bf-4569-90c7-0d8470125ccf") }; } QVersionNumber version() const override diff --git a/plugins/filetransfer/FileTransferPlugin.h b/plugins/filetransfer/FileTransferPlugin.h index dd223c676..f8a806806 100644 --- a/plugins/filetransfer/FileTransferPlugin.h +++ b/plugins/filetransfer/FileTransferPlugin.h @@ -59,7 +59,7 @@ class FileTransferPlugin : public QObject, FeatureProviderInterface, PluginInter Plugin::Uid uid() const override { - return QStringLiteral("d4bb9c42-9eef-4ecb-8dd5-dfd84b355481"); + return Plugin::Uid{ QStringLiteral("d4bb9c42-9eef-4ecb-8dd5-dfd84b355481") }; } QVersionNumber version() const override diff --git a/plugins/ldap/LdapPlugin.h b/plugins/ldap/LdapPlugin.h index 4e0f05787..d4b4bab28 100644 --- a/plugins/ldap/LdapPlugin.h +++ b/plugins/ldap/LdapPlugin.h @@ -56,7 +56,7 @@ class LdapPlugin : public QObject, Plugin::Uid uid() const override { - return QStringLiteral("6f0a491e-c1c6-4338-8244-f823b0bf8670"); + return Plugin::Uid{ QStringLiteral("6f0a491e-c1c6-4338-8244-f823b0bf8670") }; } QVersionNumber version() const override diff --git a/plugins/ldap/common/LdapBrowseModel.cpp b/plugins/ldap/common/LdapBrowseModel.cpp index d74a8be27..622a68689 100644 --- a/plugins/ldap/common/LdapBrowseModel.cpp +++ b/plugins/ldap/common/LdapBrowseModel.cpp @@ -22,6 +22,8 @@ * */ +#include + #include "LdapClient.h" #include "LdapConfiguration.h" #include "LdapBrowseModel.h" @@ -334,7 +336,7 @@ void LdapBrowseModel::populateRoot() const { if( context.isEmpty() == false ) { - namingContexts.replaceInStrings( QRegExp( QStringLiteral(".*,%1").arg( context ) ), {} ); + namingContexts.replaceInStrings( QRegularExpression( QStringLiteral(".*,%1").arg( context ) ), {} ); } } namingContexts.removeAll( {} ); diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index 1005fd43c..c03935f1e 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -35,7 +35,12 @@ set(kldap_SOURCES add_library(kldap-light SHARED ${kldap_SOURCES}) target_compile_options(kldap-light PRIVATE ${VEYON_COMPILE_OPTIONS}) -target_link_libraries(kldap-light Qt5::Core ${Ldap_LIBRARIES} ${Sasl2_LIBRARIES}) +if(WITH_QT6) + target_link_libraries(kldap-light Qt6::Core) +else() + target_link_libraries(kldap-light Qt5::Core) +endif() +target_link_libraries(kldap-light ${Ldap_LIBRARIES} ${Sasl2_LIBRARIES}) target_include_directories(kldap-light PRIVATE ${Ldap_INCLUDE_DIRS}) target_include_directories(kldap-light PUBLIC ${kldap_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) set_default_target_properties(kldap-light) diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index e0dfd1b7f..d32c1f554 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -1,7 +1,6 @@ add_subdirectory(auth-helper) find_package(X11 REQUIRED) -find_package(Qt5DBus REQUIRED) find_package(PkgConfig QUIET) pkg_check_modules(procps REQUIRED libprocps) pkg_check_modules(fakekey libfakekey) @@ -62,11 +61,17 @@ target_include_directories(linux-platform PRIVATE ${procps_INCLUDE_DIRS} ) +if(WITH_QT6) + find_package(Qt6 COMPONENTS DBus REQUIRED) + target_link_libraries(linux-platform Qt6::DBus) +else() + find_package(Qt5DBus REQUIRED) + target_link_libraries(linux-platform Qt5::DBus) +endif() + target_link_libraries(linux-platform ${X11_LIBRARIES} - Qt5::DBus - ${procps_LDFLAGS} - ) + ${procps_LDFLAGS}) if(fakekey_FOUND) target_include_directories(linux-platform PRIVATE ${fakekey_INCLUDE_DIRS}) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index d78534277..a0b8b891a 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -250,6 +250,21 @@ bool LinuxCoreFunctions::runProgramAsUser( const QString& program, const QString { Q_UNUSED(desktop) + const auto uid = LinuxUserFunctions::userIdFromName( username ); + if( uid <= 0 ) + { + return false; + } + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + auto process = new QProcess; + process->setChildProcessModifier( [uid]() { + if( setuid( uid ) != 0 ) + { + qFatal( "Could not set UID for child process!" ); + }; + } ); +#else class UserProcess : public QProcess // clazy:exclude=missing-qobject-macro { public: @@ -271,13 +286,9 @@ bool LinuxCoreFunctions::runProgramAsUser( const QString& program, const QString const uid_t m_uid; }; - const auto uid = LinuxUserFunctions::userIdFromName( username ); - if( uid <= 0 ) - { - return false; - } - auto process = new UserProcess( uid ); +#endif + QObject::connect( process, QOverload::of( &QProcess::finished ), &QProcess::deleteLater ); process->start( program, parameters ); diff --git a/plugins/platform/linux/LinuxKeyboardInput.cpp b/plugins/platform/linux/LinuxKeyboardInput.cpp index bb5fefa0f..100340902 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.cpp +++ b/plugins/platform/linux/LinuxKeyboardInput.cpp @@ -88,6 +88,6 @@ void LinuxKeyboardInput::sendString( const QString& string ) { for( int i = 0; i < string.size(); ++i ) { - pressAndReleaseKey( string.midRef( i, 1 ).toUtf8() ); + pressAndReleaseKey( string.mid( i, 1 ).toUtf8() ); } } diff --git a/plugins/platform/linux/LinuxPlatformPlugin.h b/plugins/platform/linux/LinuxPlatformPlugin.h index 4a7ca1113..58e93f0fe 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.h +++ b/plugins/platform/linux/LinuxPlatformPlugin.h @@ -46,7 +46,7 @@ class LinuxPlatformPlugin : public QObject, PlatformPluginInterface, PluginInter Plugin::Uid uid() const override { - return QStringLiteral("63928a8a-4c51-4bfd-888e-9e13c6f3907a"); + return Plugin::Uid{ QStringLiteral("63928a8a-4c51-4bfd-888e-9e13c6f3907a") }; } QVersionNumber version() const override diff --git a/plugins/platform/linux/auth-helper/CMakeLists.txt b/plugins/platform/linux/auth-helper/CMakeLists.txt index c0171c895..02733387d 100644 --- a/plugins/platform/linux/auth-helper/CMakeLists.txt +++ b/plugins/platform/linux/auth-helper/CMakeLists.txt @@ -10,6 +10,11 @@ set_default_target_properties(veyon-auth-helper) target_compile_options(veyon-auth-helper PRIVATE ${VEYON_COMPILE_OPTIONS}) target_include_directories(veyon-auth-helper PRIVATE ${PAM_INCLUDE_DIR}) -target_link_libraries(veyon-auth-helper Qt5::Core ${PAM_LIBRARY}) +if(WITH_QT6) + target_link_libraries(veyon-auth-helper Qt6::Core) +else() + target_link_libraries(veyon-auth-helper Qt5::Core) +endif() +target_link_libraries(veyon-auth-helper ${PAM_LIBRARY}) install(TARGETS veyon-auth-helper RUNTIME DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE SETUID GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/plugins/platform/windows/WindowsPlatformPlugin.h b/plugins/platform/windows/WindowsPlatformPlugin.h index ab7f88d46..2e6238fc3 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.h +++ b/plugins/platform/windows/WindowsPlatformPlugin.h @@ -46,7 +46,7 @@ class WindowsPlatformPlugin : public QObject, PlatformPluginInterface, PluginInt Plugin::Uid uid() const override { - return QStringLiteral("1baa01e0-02d6-4494-a766-788f5b225991"); + return Plugin::Uid{ QStringLiteral("1baa01e0-02d6-4494-a766-788f5b225991") }; } QVersionNumber version() const override diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.h b/plugins/powercontrol/PowerControlFeaturePlugin.h index ad3e7fa1a..871f92493 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.h +++ b/plugins/powercontrol/PowerControlFeaturePlugin.h @@ -50,7 +50,7 @@ class PowerControlFeaturePlugin : public QObject, Plugin::Uid uid() const override { - return QStringLiteral("4122e8ca-b617-4e36-b851-8e050ed2d82e"); + return Plugin::Uid{ QStringLiteral("4122e8ca-b617-4e36-b851-8e050ed2d82e") }; } QVersionNumber version() const override diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index 1366f0ce9..8840a98c7 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -46,7 +46,7 @@ class RemoteAccessFeaturePlugin : public QObject, CommandLinePluginInterface, Fe Plugin::Uid uid() const override { - return QStringLiteral("387a0c43-1355-4ff6-9e1f-d098e9ce5127"); + return Plugin::Uid{ QStringLiteral("387a0c43-1355-4ff6-9e1f-d098e9ce5127") }; } QVersionNumber version() const override diff --git a/plugins/remoteaccess/RemoteAccessPage.h b/plugins/remoteaccess/RemoteAccessPage.h index a589c0ead..791a31e88 100644 --- a/plugins/remoteaccess/RemoteAccessPage.h +++ b/plugins/remoteaccess/RemoteAccessPage.h @@ -23,9 +23,10 @@ #pragma once +#include + #include "ComputerControlInterface.h" -class QQuickItem; class VncViewItem; // clazy:excludeall=ctor-missing-parent-argument diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 40d85802f..ff86a5392 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -312,7 +312,11 @@ bool RemoteAccessWidget::eventFilter( QObject* object, QEvent* event ) +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +void RemoteAccessWidget::enterEvent( QEnterEvent* event ) +#else void RemoteAccessWidget::enterEvent( QEvent* event ) +#endif { m_toolBar->disappear(); diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index 6800f9f68..3bcc6417f 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -98,7 +98,11 @@ class RemoteAccessWidget : public QWidget protected: bool eventFilter( QObject* object, QEvent* event ) override; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + void enterEvent( QEnterEvent* event ) override; +#else void enterEvent( QEvent* event ) override; +#endif void leaveEvent( QEvent* event ) override; void resizeEvent( QResizeEvent* event ) override; diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.h b/plugins/screenlock/ScreenLockFeaturePlugin.h index 2ac3b8f92..e61b78dd7 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.h +++ b/plugins/screenlock/ScreenLockFeaturePlugin.h @@ -39,7 +39,7 @@ class ScreenLockFeaturePlugin : public QObject, FeatureProviderInterface, Plugin Plugin::Uid uid() const override { - return QStringLiteral("2ad98ccb-e9a5-43ef-8c4c-876ac5efbcb1"); + return Plugin::Uid{ QStringLiteral("2ad98ccb-e9a5-43ef-8c4c-876ac5efbcb1") }; } QVersionNumber version() const override diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.h b/plugins/screenshot/ScreenshotFeaturePlugin.h index 937aeeb70..1e360af40 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.h +++ b/plugins/screenshot/ScreenshotFeaturePlugin.h @@ -38,7 +38,7 @@ class ScreenshotFeaturePlugin : public QObject, FeatureProviderInterface, Plugin Plugin::Uid uid() const override { - return QStringLiteral("ee322521-f4fb-482d-b082-82a79003afa7"); + return Plugin::Uid{ QStringLiteral("ee322521-f4fb-482d-b082-82a79003afa7") }; } QVersionNumber version() const override diff --git a/plugins/servicecontrol/ServiceControlPlugin.h b/plugins/servicecontrol/ServiceControlPlugin.h index 4c9a086f5..3b969f13a 100644 --- a/plugins/servicecontrol/ServiceControlPlugin.h +++ b/plugins/servicecontrol/ServiceControlPlugin.h @@ -37,7 +37,7 @@ class ServiceControlPlugin : public QObject, CommandLinePluginInterface, PluginI Plugin::Uid uid() const override { - return QStringLiteral("b47bcae0-24ff-4bf5-869c-484d64af5c4c"); + return Plugin::Uid{ QStringLiteral("b47bcae0-24ff-4bf5-869c-484d64af5c4c") }; } QVersionNumber version() const override diff --git a/plugins/shell/ShellCommandLinePlugin.h b/plugins/shell/ShellCommandLinePlugin.h index 045880aaf..6e1f067f8 100644 --- a/plugins/shell/ShellCommandLinePlugin.h +++ b/plugins/shell/ShellCommandLinePlugin.h @@ -37,7 +37,7 @@ class ShellCommandLinePlugin : public QObject, CommandLinePluginInterface, Plugi Plugin::Uid uid() const override { - return QStringLiteral("85f6c631-e75a-4c78-8cb2-a7f3f502015a"); + return Plugin::Uid{ QStringLiteral("85f6c631-e75a-4c78-8cb2-a7f3f502015a") }; } QVersionNumber version() const override diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.h b/plugins/systemusergroups/SystemUserGroupsPlugin.h index 4b72d208f..949955459 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.h +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.h @@ -37,7 +37,7 @@ class SystemUserGroupsPlugin : public QObject, PluginInterface, UserGroupsBacken Plugin::Uid uid() const override { - return QStringLiteral("2917cdeb-ac13-4099-8715-20368254a367"); + return Plugin::Uid{ QStringLiteral("2917cdeb-ac13-4099-8715-20368254a367") }; } QVersionNumber version() const override diff --git a/plugins/testing/TestingCommandLinePlugin.cpp b/plugins/testing/TestingCommandLinePlugin.cpp index a53c2c57a..c636de268 100644 --- a/plugins/testing/TestingCommandLinePlugin.cpp +++ b/plugins/testing/TestingCommandLinePlugin.cpp @@ -57,7 +57,8 @@ QString TestingCommandLinePlugin::commandHelp( const QString& command ) const CommandLinePluginInterface::RunResult TestingCommandLinePlugin::handle_checkaccess( const QStringList& arguments ) { - switch( AccessControlProvider().checkAccess( arguments.value( 0 ), arguments.value( 1 ), { arguments.value( 2 ) }, arguments.value( 3 ) ) ) + switch( AccessControlProvider().checkAccess( arguments.value( 0 ), arguments.value( 1 ), { arguments.value( 2 ) }, + Plugin::Uid{ arguments.value(3) } ) ) { case AccessControlProvider::Access::Allow: printf( "[TEST]: CheckAccess: ALLOW\n" ); return Successful; case AccessControlProvider::Access::Deny: printf( "[TEST]: CheckAccess: DENY\n" ); return Successful; @@ -90,7 +91,7 @@ CommandLinePluginInterface::RunResult TestingCommandLinePlugin::handle_accesscon switch( AccessControlProvider().processAccessControlRules( arguments.value( 0 ), arguments.value( 1 ), arguments.value( 2 ), arguments.value( 3 ), QStringList( arguments.value( 4 ) ), - arguments.value( 5 ) ) ) + Plugin::Uid{ arguments.value(5) } ) ) { case AccessControlRule::Action::Allow: printf( "[TEST]: AccessControlRules: ALLOW\n" ); return Successful; case AccessControlRule::Action::Deny: printf( "[TEST]: AccessControlRules: DENY\n" ); return Successful; diff --git a/plugins/testing/TestingCommandLinePlugin.h b/plugins/testing/TestingCommandLinePlugin.h index 4fedf0ae7..6546821ba 100644 --- a/plugins/testing/TestingCommandLinePlugin.h +++ b/plugins/testing/TestingCommandLinePlugin.h @@ -38,7 +38,7 @@ class TestingCommandLinePlugin : public QObject, CommandLinePluginInterface, Plu Plugin::Uid uid() const override { - return QStringLiteral("a8a84654-40ca-4731-811e-7e05997ed081"); + return Plugin::Uid{ QStringLiteral("a8a84654-40ca-4731-811e-7e05997ed081") }; } QVersionNumber version() const override diff --git a/plugins/textmessage/TextMessageFeaturePlugin.h b/plugins/textmessage/TextMessageFeaturePlugin.h index 173b0b226..1dbd0f721 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.h +++ b/plugins/textmessage/TextMessageFeaturePlugin.h @@ -44,7 +44,7 @@ class TextMessageFeaturePlugin : public QObject, FeatureProviderInterface, Plugi Plugin::Uid uid() const override { - return QStringLiteral("8ae6668b-9c12-4b29-9bfc-ff89f6604164"); + return Plugin::Uid{ QStringLiteral("8ae6668b-9c12-4b29-9bfc-ff89f6604164") }; } QVersionNumber version() const override diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.h b/plugins/usersessioncontrol/UserSessionControlPlugin.h index 320f668eb..65fe9e39b 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.h +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.h @@ -46,7 +46,7 @@ class UserSessionControlPlugin : public QObject, public FeatureProviderInterface Plugin::Uid uid() const override { - return QStringLiteral("80580500-2e59-4297-9e35-e53959b028cd"); + return Plugin::Uid{ QStringLiteral("80580500-2e59-4297-9e35-e53959b028cd") }; } QVersionNumber version() const override diff --git a/plugins/vncserver/external/ExternalVncServer.h b/plugins/vncserver/external/ExternalVncServer.h index 8d8d471aa..39dcbaa52 100644 --- a/plugins/vncserver/external/ExternalVncServer.h +++ b/plugins/vncserver/external/ExternalVncServer.h @@ -38,7 +38,7 @@ class ExternalVncServer : public QObject, VncServerPluginInterface, PluginInterf Plugin::Uid uid() const override { - return QStringLiteral("67dfc1c1-8f37-4539-a298-16e74e34fd8b"); + return Plugin::Uid{ QStringLiteral("67dfc1c1-8f37-4539-a298-16e74e34fd8b") }; } QVersionNumber version() const override diff --git a/plugins/vncserver/headless/HeadlessVncServer.h b/plugins/vncserver/headless/HeadlessVncServer.h index ce372ff34..b00c3b3e7 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.h +++ b/plugins/vncserver/headless/HeadlessVncServer.h @@ -40,7 +40,7 @@ class HeadlessVncServer : public QObject, VncServerPluginInterface, PluginInterf Plugin::Uid uid() const override { - return QStringLiteral("f626f759-7691-45c0-bd4a-37171d98d219"); + return Plugin::Uid{ QStringLiteral("f626f759-7691-45c0-bd4a-37171d98d219") }; } QVersionNumber version() const override diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h index 63e7693f2..fc3d2ced7 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h @@ -40,7 +40,7 @@ class BuiltinUltraVncServer : public QObject, VncServerPluginInterface, PluginIn Plugin::Uid uid() const override { - return QStringLiteral("39d7a07f-94db-4912-aa1a-c4df8aee3879"); + return Plugin::Uid{ QStringLiteral("39d7a07f-94db-4912-aa1a-c4df8aee3879") }; } QVersionNumber version() const override diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h index 570f3566a..228fdab2c 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h @@ -38,7 +38,7 @@ class BuiltinX11VncServer : public QObject, VncServerPluginInterface, PluginInte Plugin::Uid uid() const override { - return QStringLiteral("39d7a07f-94db-4912-aa1a-c4df8aee3879"); + return Plugin::Uid{ QStringLiteral("39d7a07f-94db-4912-aa1a-c4df8aee3879") }; } QVersionNumber version() const override diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index fd54bad61..f6810cb5c 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -8,12 +8,6 @@ build_veyon_application(veyon-server ${server_SOURCES}) add_windows_resource(veyon-server) make_graphical_app(veyon-server) -target_link_libraries(veyon-server - Qt5::Gui - Qt5::Network - Qt5::Widgets - ) - if(VEYON_BUILD_ANDROID) set(CMAKE_ANDROID_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") androiddeployqt("veyon-server" "${ANDROID_ADDITIONAL_FIND_ROOT_PATH};${CMAKE_BINARY_DIR}/core;${ANDROID_INSTALL_DIR}") diff --git a/server/src/main.cpp b/server/src/main.cpp index d546f2bd3..4b9b7a64b 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -30,7 +30,9 @@ int main( int argc, char **argv ) { +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QGuiApplication::setAttribute( Qt::AA_EnableHighDpiScaling ); +#endif QGuiApplication app( argc, argv ); VeyonCore core( &app, VeyonCore::Component::Server, QStringLiteral("Server") ); diff --git a/worker/src/VeyonWorker.cpp b/worker/src/VeyonWorker.cpp index 8d073935b..610615f67 100644 --- a/worker/src/VeyonWorker.cpp +++ b/worker/src/VeyonWorker.cpp @@ -29,7 +29,7 @@ #include "VeyonWorker.h" -VeyonWorker::VeyonWorker( const QString& featureUid, QObject* parent ) : +VeyonWorker::VeyonWorker( QUuid featureUid, QObject* parent ) : QObject( parent ), m_core( QCoreApplication::instance(), VeyonCore::Component::Worker, @@ -50,7 +50,7 @@ VeyonWorker::VeyonWorker( const QString& featureUid, QObject* parent ) : qFatal( "Could not find specified feature" ); } - if( VeyonCore::config().disabledFeatures().contains( featureUid ) ) + if( VeyonCore::config().disabledFeatures().contains( featureUid.toString() ) ) { qFatal( "Specified feature is disabled by configuration!" ); } diff --git a/worker/src/VeyonWorker.h b/worker/src/VeyonWorker.h index 262354b3d..0db84cc9b 100644 --- a/worker/src/VeyonWorker.h +++ b/worker/src/VeyonWorker.h @@ -33,7 +33,7 @@ class VeyonWorker : public QObject, VeyonWorkerInterface { Q_OBJECT public: - explicit VeyonWorker( const QString& featureUid, QObject* parent = nullptr ); + explicit VeyonWorker( QUuid featureUid, QObject* parent = nullptr ); bool sendFeatureMessageReply( const FeatureMessage& reply ) override; diff --git a/worker/src/main.cpp b/worker/src/main.cpp index 2fc7cd46d..12fa61589 100644 --- a/worker/src/main.cpp +++ b/worker/src/main.cpp @@ -39,8 +39,8 @@ int main( int argc, char **argv ) qFatal( "Not enough arguments (feature)" ); } - const auto featureUid = arguments[1]; - if( QUuid( featureUid ).isNull() ) + const auto featureUid = Feature::Uid{arguments[1]}; + if( featureUid.isNull() ) { qFatal( "Invalid feature UID given" ); } From 989420d301b6b3374f41b44c2a534d415594b715 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 11 Mar 2021 16:10:31 +0100 Subject: [PATCH 0851/1765] CheckableItemProxyModel: load/remove check states lazily Remember states until they get saved in saveStates(). This makes top level items such as dynamically populated Network Discovery groups remain checked if they disappear and appear later. --- master/src/CheckableItemProxyModel.cpp | 42 ++++++++++++++++---------- master/src/CheckableItemProxyModel.h | 1 - 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/master/src/CheckableItemProxyModel.cpp b/master/src/CheckableItemProxyModel.cpp index b043bccf2..4a7968f5b 100644 --- a/master/src/CheckableItemProxyModel.cpp +++ b/master/src/CheckableItemProxyModel.cpp @@ -35,8 +35,6 @@ CheckableItemProxyModel::CheckableItemProxyModel( int uidRole, QObject *parent ) { connect( this, &QIdentityProxyModel::rowsInserted, this, &CheckableItemProxyModel::updateNewRows ); - connect( this, &QIdentityProxyModel::rowsAboutToBeRemoved, - this, &CheckableItemProxyModel::removeRowStates ); #if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) new QAbstractItemModelTester( this, QAbstractItemModelTester::FailureReportingMode::Warning, this ); @@ -114,24 +112,32 @@ bool CheckableItemProxyModel::setData( const QModelIndex& index, const QVariant& void CheckableItemProxyModel::updateNewRows(const QModelIndex &parent, int first, int last) { - // also set newly inserted items checked if parent is checked - if( parent.isValid() && data( parent, Qt::CheckStateRole ).value() == Qt::Checked ) + if( parent.isValid() ) { - for( int i = first; i <= last; ++i ) + auto parentState = data( parent, Qt::CheckStateRole ).value(); + if( parentState == Qt::Checked ) { - setData( index( i, 0, parent ), Qt::Checked, Qt::CheckStateRole ); + // also set newly inserted items checked if parent is checked + for( int i = first; i <= last; ++i ) + { + setData( index( i, 0, parent ), Qt::Checked, Qt::CheckStateRole ); + } } - } -} - - + else if( parentState == Qt::Unchecked ) + { + // make sure parent is (partially) checked if one of the newly inserted items was checked previously + for( int i = first; i <= last; ++i ) + { + if( data( index( i, 0, parent ), Qt::CheckStateRole ).value() == Qt::Checked ) + { + parentState = Qt::Checked; + } + } -void CheckableItemProxyModel::removeRowStates(const QModelIndex &parent, int first, int last) -{ - for( int i = first; i <= last; ++i ) - { - m_checkStates.remove( QIdentityProxyModel::data( index( i, 0, parent ), m_uidRole ).toUuid() ); + setParentData( parent, parentState ); + } } + } @@ -142,7 +148,8 @@ QJsonArray CheckableItemProxyModel::saveStates() for( auto it = m_checkStates.constBegin(), end = m_checkStates.constEnd(); it != end; ++it ) { - if( it.value() == Qt::Checked ) + if( it.value() == Qt::Checked && + match( index( 0, 0 ), m_uidRole, it.key(), 1, Qt::MatchExactly | Qt::MatchRecursive ).isEmpty() == false ) { data += it.key().toString(); } @@ -169,6 +176,9 @@ void CheckableItemProxyModel::loadStates( const QJsonArray& data ) { setData( indexList.first(), Qt::Checked, Qt::CheckStateRole ); } + + // allow items being added dynamically even if we can't propagate the check state at the moment + m_checkStates[uid] = Qt::Checked; } endResetModel(); diff --git a/master/src/CheckableItemProxyModel.h b/master/src/CheckableItemProxyModel.h index 6fa3a5973..4ba6cc4fa 100644 --- a/master/src/CheckableItemProxyModel.h +++ b/master/src/CheckableItemProxyModel.h @@ -43,7 +43,6 @@ class CheckableItemProxyModel : public QIdentityProxyModel bool setData(const QModelIndex &index, const QVariant &value, int role) override; void updateNewRows(const QModelIndex &parent, int first, int last); - void removeRowStates(const QModelIndex &parent, int first, int last); QJsonArray saveStates(); void loadStates( const QJsonArray& data ); From b708946c62f4993c2d74b2c959449173f17a77c8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 12 Mar 2021 10:13:58 +0100 Subject: [PATCH 0852/1765] 3rdparty: update submodules --- 3rdparty/libvncserver | 2 +- 3rdparty/x11vnc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index c82b3abb3..242fda806 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit c82b3abb369983cd737190331b897814a580a980 +Subproject commit 242fda806d16f06890fb61339aa0a585443af8bb diff --git a/3rdparty/x11vnc b/3rdparty/x11vnc index 4a56ce2f9..8748e1530 160000 --- a/3rdparty/x11vnc +++ b/3rdparty/x11vnc @@ -1 +1 @@ -Subproject commit 4a56ce2f931266759f35955881a4335b68f51142 +Subproject commit 8748e153054b65e30c2c7df2cb556c5a721bb5c3 From 7d77ecc0e2db3b748323427a342abbdaebecd993 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 12 Mar 2021 10:14:02 +0100 Subject: [PATCH 0853/1765] x11vnc-builtin: adopt header detection changes --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 1 + plugins/vncserver/x11vnc-builtin/config.h.in | 3 +++ 2 files changed, 4 insertions(+) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index bd30936ce..9df42c16e 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -42,6 +42,7 @@ check_include_files(linux/fb.h HAVE_LINUX_FB_H) check_include_files(linux/input.h HAVE_LINUX_INPUT_H) check_include_files(linux/uinput.h HAVE_LINUX_UINPUT_H) check_include_files(linux/videodev.h HAVE_LINUX_VIDEODEV_H) +check_include_files(linux/videodev2.h HAVE_LINUX_VIDEODEV2_H) check_include_files(netdb.h HAVE_NETDB_H) check_include_files(netinet/in.h HAVE_NETINET_IN_H) check_include_files(pwd.h HAVE_PWD_H) diff --git a/plugins/vncserver/x11vnc-builtin/config.h.in b/plugins/vncserver/x11vnc-builtin/config.h.in index 9cbf3b6a5..6ab3f253a 100644 --- a/plugins/vncserver/x11vnc-builtin/config.h.in +++ b/plugins/vncserver/x11vnc-builtin/config.h.in @@ -84,6 +84,9 @@ /* video4linux build environment present */ #cmakedefine HAVE_LINUX_VIDEODEV_H 1 +/* video4linux2 build environment present */ +#cmakedefine HAVE_LINUX_VIDEODEV2_H 1 + /* build MacOS X native display support */ #cmakedefine HAVE_MACOSX_NATIVE_DISPLAY 1 From c2d0aed7ed187fb13d75ba03df0e0645acd3ffe6 Mon Sep 17 00:00:00 2001 From: Egor Ignatov Date: Wed, 24 Mar 2021 15:44:51 +0300 Subject: [PATCH 0854/1765] BuiltinDirectory: disable addComputerButton if no location exists --- .../builtindirectory/BuiltinDirectoryConfigurationPage.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp index 331b1c54d..8a7193339 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp @@ -177,6 +177,8 @@ void BuiltinDirectoryConfigurationPage::populateLocations() ui->locationTableWidget->setUpdatesEnabled( false ); ui->locationTableWidget->clear(); + ui->addComputerButton->setEnabled( false ); + int rowCount = 0; const auto networkObjects = m_configuration.networkObjects(); @@ -193,6 +195,11 @@ void BuiltinDirectoryConfigurationPage::populateLocations() } ui->locationTableWidget->setUpdatesEnabled( true ); + + if( rowCount > 0 ) + { + ui->addComputerButton->setEnabled( true ); + } } From 3c1e8d7f3bea9e77729bae75d21fec213088428c Mon Sep 17 00:00:00 2001 From: Egor Ignatov Date: Fri, 26 Mar 2021 15:37:19 +0300 Subject: [PATCH 0855/1765] BuiltinDirectory: select location after removeLocation() --- .../BuiltinDirectoryConfigurationPage.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp index 8a7193339..c95bc41a9 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp @@ -111,11 +111,22 @@ void BuiltinDirectoryConfigurationPage::updateLocation() void BuiltinDirectoryConfigurationPage::removeLocation() { + auto currentRow = ui->locationTableWidget->currentRow(); + ObjectManager objectManager( m_configuration.networkObjects() ); objectManager.remove( currentLocationObject().uid(), true ); m_configuration.setNetworkObjects( objectManager.objects() ); populateLocations(); + + if( currentRow > 0 ) + { + ui->locationTableWidget->setCurrentCell( currentRow-1, 0 ); + } + else if ( ui->locationTableWidget->rowCount() > 0 ) + { + ui->locationTableWidget->setCurrentCell( currentRow, 0 ); + } } From d15e33feb3a64098438325ef26d54ff878d8ae40 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 08:55:39 +0200 Subject: [PATCH 0856/1765] LinuxServiceCore: make minimum user session lifetime configurable --- .../linux/LinuxPlatformConfiguration.h | 1 + .../linux/LinuxPlatformConfigurationPage.ui | 22 ++++++++++++++++++- plugins/platform/linux/LinuxServiceCore.cpp | 4 +++- plugins/platform/linux/LinuxServiceCore.h | 1 - 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/plugins/platform/linux/LinuxPlatformConfiguration.h b/plugins/platform/linux/LinuxPlatformConfiguration.h index 88442e3bb..a6e5225aa 100644 --- a/plugins/platform/linux/LinuxPlatformConfiguration.h +++ b/plugins/platform/linux/LinuxPlatformConfiguration.h @@ -29,6 +29,7 @@ #define FOREACH_LINUX_PLATFORM_CONFIG_PROPERTY(OP) \ OP( LinuxPlatformConfiguration, m_configuration, QString, pamServiceName, setPamServiceName, "PamServiceName", "Linux", QString(), Configuration::Property::Flag::Advanced ) \ OP( LinuxPlatformConfiguration, m_configuration, QString, displayManagerUsers, setDisplayManagerUsers, "DisplayManagerUsers", "Linux", QStringLiteral("gdm,lightdm,sddm,mdm,Debian-gdm"), Configuration::Property::Flag::Advanced ) \ + OP( LinuxPlatformConfiguration, m_configuration, int, minimumUserSessionLifetime, setMinimumUserSessionLifetime, "MinimumUserSessionLifetime", "Linux", 3, Configuration::Property::Flag::Advanced ) \ OP( LinuxPlatformConfiguration, m_configuration, QString, userLoginKeySequence, setUserLoginKeySequence, "UserLoginKeySequence", "Linux", QStringLiteral("%username%%password%"), Configuration::Property::Flag::Advanced ) \ // clazy:excludeall=missing-qobject-macro diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.ui b/plugins/platform/linux/LinuxPlatformConfigurationPage.ui index e783f2000..11ec78610 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.ui +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.ui @@ -42,7 +42,7 @@ - Session management + User sessions @@ -55,6 +55,26 @@ + + + + Minimum session lifetime before server start + + + + + + + s + + + 1 + + + 60 + + + diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index bba6cbf1d..c1427f2c2 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -34,6 +34,7 @@ #include "Filesystem.h" #include "LinuxCoreFunctions.h" +#include "LinuxPlatformConfiguration.h" #include "LinuxServiceCore.h" #include "LinuxSessionFunctions.h" #include "ProcessHelper.h" @@ -130,7 +131,8 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO const auto sessionUptime = LinuxSessionFunctions::getSessionUptimeSeconds( sessionPath ); - if( sessionUptime >= 0 && sessionUptime < SessionUptimeSecondsMinimum ) + if( sessionUptime >= 0 && + sessionUptime < LinuxPlatformConfiguration(&VeyonCore::config()).minimumUserSessionLifetime() ) { vDebug() << "Session" << sessionPath << "too young - retrying in" << SessionUptimeProbingInterval << "msecs"; QTimer::singleShot( SessionUptimeProbingInterval, this, [=]() { startServer( login1SessionId, sessionObjectPath ); } ); diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index b10bcbbb2..b5bfc8aec 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -53,7 +53,6 @@ private Q_SLOTS: static constexpr auto ServerWaitSleepInterval = 100; static constexpr auto SessionEnvironmentProbingInterval = 1000; static constexpr auto SessionStateProbingInterval = 1000; - static constexpr auto SessionUptimeSecondsMinimum = 3; static constexpr auto SessionUptimeProbingInterval = 1000; void connectToLoginManager(); From 6de1d43a07df03f9a49d576e7eaaad57a4e9f713 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 09:30:46 +0200 Subject: [PATCH 0857/1765] LinuxServiceCore: move listSessions() to LinuxSessionFunctions --- plugins/platform/linux/LinuxServiceCore.cpp | 36 +------------------ plugins/platform/linux/LinuxServiceCore.h | 2 -- .../platform/linux/LinuxSessionFunctions.cpp | 31 ++++++++++++++++ .../platform/linux/LinuxSessionFunctions.h | 2 ++ 4 files changed, 34 insertions(+), 37 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index c1427f2c2..1df14486a 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -58,7 +58,7 @@ LinuxServiceCore::~LinuxServiceCore() void LinuxServiceCore::run() { - const auto sessions = listSessions(); + const auto sessions = LinuxSessionFunctions::listSessions(); for( const auto& s : sessions ) { @@ -299,37 +299,3 @@ void LinuxServiceCore::checkSessionState( const QString& sessionPath ) stopServer( sessionPath ); } } - - - -QStringList LinuxServiceCore::listSessions() -{ - QStringList sessions; - - const QDBusReply reply = m_loginManager->call( QStringLiteral("ListSessions") ); - - if( reply.isValid() ) - { - const auto data = reply.value(); - - data.beginArray(); - while( data.atEnd() == false ) - { - LinuxSessionFunctions::LoginDBusSession session; - - data.beginStructure(); - data >> session.id >> session.uid >> session.name >> session.seatId >> session.path; - data.endStructure(); - - sessions.append( session.path.path() ); - } - return sessions; - } - - vCritical() << "Could not query sessions:" << reply.error().message(); - - return sessions; -} - - - diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index b5bfc8aec..cb65c21ff 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -61,8 +61,6 @@ private Q_SLOTS: void checkSessionState( const QString& sessionPath ); - QStringList listSessions(); - LinuxCoreFunctions::DBusInterfacePointer m_loginManager{LinuxCoreFunctions::systemdLoginManager()}; QMap m_serverProcesses; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 22a9e57b1..0486670a4 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -206,3 +206,34 @@ QString LinuxSessionFunctions::currentSessionPath() return QStringLiteral("/org/freedesktop/login1/session/%1").arg( xdgSessionId ); } + + + +QStringList LinuxSessionFunctions::listSessions() +{ + QStringList sessions; + + const QDBusReply reply = LinuxCoreFunctions::systemdLoginManager()->call( QStringLiteral("ListSessions") ); + + if( reply.isValid() ) + { + const auto data = reply.value(); + + data.beginArray(); + while( data.atEnd() == false ) + { + LoginDBusSession session; + + data.beginStructure(); + data >> session.id >> session.uid >> session.name >> session.seatId >> session.path; + data.endStructure(); + + sessions.append( session.path.path() ); + } + return sessions; + } + + vCritical() << "Could not query sessions:" << reply.error().message(); + + return sessions; +} diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 0df778ad6..23828022b 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -64,6 +64,8 @@ class LinuxSessionFunctions : public PlatformSessionFunctions QString currentSessionType() const override; + static QStringList listSessions(); + static QVariant getSessionProperty( const QString& session, const QString& property ); static int getSessionLeaderPid( const QString& session ); From b220abfa8565b0dc73f35362ed8b7bf61a36b748 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 09:42:18 +0200 Subject: [PATCH 0858/1765] LinuxSessionFunctions: add getSessionClass() --- .../platform/linux/LinuxSessionFunctions.cpp | 21 +++++++++++++++++++ .../platform/linux/LinuxSessionFunctions.h | 10 +++++++++ 2 files changed, 31 insertions(+) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 0486670a4..7b6598d8b 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -96,6 +96,27 @@ qint64 LinuxSessionFunctions::getSessionUptimeSeconds( const QString& session ) +LinuxSessionFunctions::Class LinuxSessionFunctions::getSessionClass( const QString& session ) +{ + const auto sessionClass = getSessionProperty( session, QStringLiteral("Class") ).toString(); + if( sessionClass == QLatin1String("user") ) + { + return Class::User; + } + else if( sessionClass == QLatin1String("greeter") ) + { + return Class::Greeter; + } + else if( sessionClass == QLatin1String("lock-screen") ) + { + return Class::LockScreen; + } + + return Class::Unknown; +} + + + QString LinuxSessionFunctions::getSessionType( const QString& session ) { return getSessionProperty( session, QStringLiteral("Type") ).toString(); diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 23828022b..0e7f9b45b 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -60,6 +60,15 @@ class LinuxSessionFunctions : public PlatformSessionFunctions }; Q_ENUM(State) + enum class Class + { + Unknown, + User, + Greeter, + LockScreen + }; + Q_ENUM(Class) + SessionId currentSessionId() override; QString currentSessionType() const override; @@ -70,6 +79,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions static int getSessionLeaderPid( const QString& session ); static qint64 getSessionUptimeSeconds( const QString& session ); + static Class getSessionClass( const QString& session ); static QString getSessionType( const QString& session ); static QString getSessionId( const QString& session ); static State getSessionState( const QString& session ); From ab1d7a911d30f6a829f84663e6060458977722d7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 09:45:25 +0200 Subject: [PATCH 0859/1765] LinuxSessionFunctions: specify session type via enum class --- plugins/platform/linux/LinuxServiceCore.cpp | 6 ++--- .../platform/linux/LinuxSessionFunctions.cpp | 26 ++++++++++++++++--- .../platform/linux/LinuxSessionFunctions.h | 12 ++++++++- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 1df14486a..5f6b3d2d9 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -77,14 +77,14 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO const auto sessionType = LinuxSessionFunctions::getSessionType( sessionPath ); - if( sessionType == QLatin1String("wayland") ) + if( sessionType == LinuxSessionFunctions::Type::Wayland ) { vCritical() << "Can't start Veyon Server in Wayland sessions as this is not yet supported. Please switch to X11-based sessions!"; return; } // do not start server for non-graphical sessions - if( sessionType != QLatin1String("x11") ) + if( sessionType != LinuxSessionFunctions::Type::X11 ) { return; } @@ -148,7 +148,7 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO const auto sessionId = m_sessionManager.openSession( sessionPath ); - vInfo() << "Starting server for new" << qUtf8Printable(sessionType) << "session" << sessionPath + vInfo() << "Starting server for new session" << sessionPath << "with ID" << sessionId << "at seat" << LinuxSessionFunctions::getSessionSeat( sessionPath ).path; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 7b6598d8b..8a8868268 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -117,9 +117,27 @@ LinuxSessionFunctions::Class LinuxSessionFunctions::getSessionClass( const QStri -QString LinuxSessionFunctions::getSessionType( const QString& session ) +LinuxSessionFunctions::Type LinuxSessionFunctions::getSessionType( const QString& session ) { - return getSessionProperty( session, QStringLiteral("Type") ).toString(); + const auto type = getSessionProperty( session, QStringLiteral("Type") ).toString(); + if( type == QLatin1String("tty") ) + { + return Type::TTY; + } + else if( type == QLatin1String("x11") ) + { + return Type::X11; + } + else if( type == QLatin1String("mir") ) + { + return Type::Mir; + } + else if( type == QLatin1String("wayland") ) + { + return Type::Wayland; + } + + return Type::Unspecified; } @@ -139,7 +157,7 @@ LinuxSessionFunctions::State LinuxSessionFunctions::getSessionState( const QStri { QStringLiteral("online"), State::Online }, { QStringLiteral("active"), State::Active }, { QStringLiteral("opening"), State::Opening }, - { QStringLiteral("closing"), State::Closing }, + { QStringLiteral("closing"), State::Closing } }; const auto stateString = getSessionProperty( session, QStringLiteral("State") ).toString(); @@ -212,7 +230,7 @@ QString LinuxSessionFunctions::currentSessionType() const return QStringLiteral("x11"); } - return getSessionType( currentSessionPath() ); + return getSessionProperty( currentSessionPath(), QStringLiteral("Type") ).toString(); } diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 0e7f9b45b..66c8f6a7b 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -69,6 +69,16 @@ class LinuxSessionFunctions : public PlatformSessionFunctions }; Q_ENUM(Class) + enum class Type + { + Unspecified, + TTY, + X11, + Mir, + Wayland + }; + Q_ENUM(Type) + SessionId currentSessionId() override; QString currentSessionType() const override; @@ -80,7 +90,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions static int getSessionLeaderPid( const QString& session ); static qint64 getSessionUptimeSeconds( const QString& session ); static Class getSessionClass( const QString& session ); - static QString getSessionType( const QString& session ); + static Type getSessionType( const QString& session ); static QString getSessionId( const QString& session ); static State getSessionState( const QString& session ); static LoginDBusSessionSeat getSessionSeat( const QString& session ); From 038812fcef58d2d7bfe4af9ecdc552e18373ff16 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 10:04:40 +0200 Subject: [PATCH 0860/1765] LinuxSessionFunctions: add isOpen()/isGraphical() --- .../platform/linux/LinuxSessionFunctions.cpp | 21 +++++++++++++++++++ .../platform/linux/LinuxSessionFunctions.h | 3 +++ 2 files changed, 24 insertions(+) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 8a8868268..5a00080c6 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -276,3 +276,24 @@ QStringList LinuxSessionFunctions::listSessions() return sessions; } + + + +bool LinuxSessionFunctions::isOpen( const QString& session ) +{ + const auto state = getSessionState( session ); + + return state == State::Active || + state == State::Online || + state == State::Opening; +} + + +bool LinuxSessionFunctions::isGraphical( const QString& session ) +{ + const auto type = getSessionType( session ); + + return type == Type::X11 || + type == Type::Wayland || + type == Type::Mir; +} diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 66c8f6a7b..931cf1c60 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -104,4 +104,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions return QStringLiteral("XDG_SESSION_ID"); } + static bool isOpen( const QString& session ); + static bool isGraphical( const QString& session ); + }; From 12134a056211acd644be0b0b308033c662e52b1b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 10:05:09 +0200 Subject: [PATCH 0861/1765] LinuxUserFunctions: use listSessions() in isAnyUserLoggedOn() Querying systemd sessions is much more reliable than calling "who" and also allows distinguishing between graphical user sessions and all other types of sessions. This fixes the processing of the access control rule condition "No user logged on" on Linux which evaluated to false when a user opens a local console (tty) session. While this behaviour by itself is correct, it's not what's intended by access control rules relying on this condition. Often such a rule is configured to always allow access to the local graphical display manager. If a console session is opened, access to that graphical display manager should still be possible. --- plugins/platform/linux/LinuxUserFunctions.cpp | 22 +++++-------------- plugins/platform/linux/LinuxUserFunctions.h | 1 - 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index d977439e2..4e2701f9b 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -205,24 +205,12 @@ QStringList LinuxUserFunctions::groupsOfUser( const QString& username, bool quer bool LinuxUserFunctions::isAnyUserLoggedOn() { - QProcess whoProcess; - whoProcess.start( QStringLiteral("who"), QStringList{} ); - whoProcess.waitForFinished( WhoProcessTimeout ); - - if( whoProcess.exitCode() != 0 ) - { - return false; - } - - const auto displayManagerUsers = LinuxPlatformConfiguration( &VeyonCore::config() ).displayManagerUsers(). - split( QLatin1Char(',') ); - - const auto lines = whoProcess.readAll().split( '\n' ); - for( const auto& line : lines ) + const auto sessions = LinuxSessionFunctions::listSessions(); + for( const auto& session : sessions ) { - const auto user = QString::fromUtf8( line.split( ' ' ).value( 0 ) ); - if( user.isEmpty() == false && - displayManagerUsers.contains( user ) == false ) + if( LinuxSessionFunctions::isOpen( session ) && + LinuxSessionFunctions::isGraphical( session ) && + LinuxSessionFunctions::getSessionClass( session ) == LinuxSessionFunctions::Class::User ) { return true; } diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index 4f88e8dcc..85a6e07f6 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -51,7 +51,6 @@ class LinuxUserFunctions : public PlatformUserFunctions static uid_t userIdFromName( const QString& username ); private: - static constexpr auto WhoProcessTimeout = 3000; static constexpr auto AuthHelperTimeout = 10000; LogonHelper m_logonHelper{}; From 731938c4d14d8b52d63056f20fd4898dd2ba8d0b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 10:20:51 +0200 Subject: [PATCH 0862/1765] LinuxPlatformConfiguration: drop unused displayManagerUsers property --- plugins/platform/linux/LinuxPlatformConfiguration.h | 1 - .../platform/linux/LinuxPlatformConfigurationPage.ui | 12 +----------- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/plugins/platform/linux/LinuxPlatformConfiguration.h b/plugins/platform/linux/LinuxPlatformConfiguration.h index a6e5225aa..a13612ce6 100644 --- a/plugins/platform/linux/LinuxPlatformConfiguration.h +++ b/plugins/platform/linux/LinuxPlatformConfiguration.h @@ -28,7 +28,6 @@ #define FOREACH_LINUX_PLATFORM_CONFIG_PROPERTY(OP) \ OP( LinuxPlatformConfiguration, m_configuration, QString, pamServiceName, setPamServiceName, "PamServiceName", "Linux", QString(), Configuration::Property::Flag::Advanced ) \ - OP( LinuxPlatformConfiguration, m_configuration, QString, displayManagerUsers, setDisplayManagerUsers, "DisplayManagerUsers", "Linux", QStringLiteral("gdm,lightdm,sddm,mdm,Debian-gdm"), Configuration::Property::Flag::Advanced ) \ OP( LinuxPlatformConfiguration, m_configuration, int, minimumUserSessionLifetime, setMinimumUserSessionLifetime, "MinimumUserSessionLifetime", "Linux", 3, Configuration::Property::Flag::Advanced ) \ OP( LinuxPlatformConfiguration, m_configuration, QString, userLoginKeySequence, setUserLoginKeySequence, "UserLoginKeySequence", "Linux", QStringLiteral("%username%%password%"), Configuration::Property::Flag::Advanced ) \ diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.ui b/plugins/platform/linux/LinuxPlatformConfigurationPage.ui index 11ec78610..d167a9950 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.ui +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.ui @@ -46,23 +46,13 @@ - - - Display manager users - - - - - - - Minimum session lifetime before server start - + s From 892e85dde20199c8f22ec887d05c40fae435e8b0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 10:22:51 +0200 Subject: [PATCH 0863/1765] AccessControlRuleEditDialog: fix column spanning of checkboxes --- .../src/AccessControlRuleEditDialog.ui | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/configurator/src/AccessControlRuleEditDialog.ui b/configurator/src/AccessControlRuleEditDialog.ui index a4b680251..18eda7019 100644 --- a/configurator/src/AccessControlRuleEditDialog.ui +++ b/configurator/src/AccessControlRuleEditDialog.ui @@ -150,13 +150,6 @@ - - - - Accessing computer is localhost - - - @@ -164,27 +157,6 @@ - - - - Accessing user is logged on user - - - - - - - Accessing user is already connected - - - - - - - No user logged on - - - @@ -218,6 +190,34 @@ + + + + Accessing computer is localhost + + + + + + + Accessing user is logged on user + + + + + + + Accessing user is already connected + + + + + + + No user logged on + + + From e063a08b91e1af4fb422c9b49d7cc2467c520f9e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 11:05:34 +0200 Subject: [PATCH 0864/1765] PlatformUserFunctions: distinguish between locally and remotely logged in users --- .../src/AccessControlRuleEditDialog.cpp | 6 ++-- .../src/AccessControlRuleEditDialog.ui | 6 ++-- core/src/AccessControlProvider.cpp | 8 ++--- core/src/AccessControlProvider.h | 2 +- core/src/AccessControlRule.h | 2 +- core/src/FeatureWorkerManager.cpp | 2 +- core/src/PlatformUserFunctions.h | 3 +- plugins/platform/common/LogonHelper.cpp | 4 +-- .../platform/linux/LinuxSessionFunctions.cpp | 7 +++++ .../platform/linux/LinuxSessionFunctions.h | 1 + plugins/platform/linux/LinuxUserFunctions.cpp | 22 ++++++++++++- plugins/platform/linux/LinuxUserFunctions.h | 3 +- .../platform/windows/WindowsUserFunctions.cpp | 31 +++++++++++++++++-- .../platform/windows/WindowsUserFunctions.h | 4 ++- .../platform/windows/WtsSessionManager.cpp | 21 +++++++++++++ plugins/platform/windows/WtsSessionManager.h | 1 + .../PowerControlFeaturePlugin.cpp | 3 +- 17 files changed, 104 insertions(+), 22 deletions(-) diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index 5871834a4..fd90b15ae 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -85,7 +85,7 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule ui->isLocalHostAccessCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromLocalHost ) ); ui->isLocalUserAccessCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromLocalUser ) ); ui->isSameUserAccessCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromAlreadyConnectedUser ) ); - ui->noUserLoggedOnCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedOn ) ); + ui->noUserLoggedInLocallyCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally ) ); // load selected condition subjects ui->isMemberOfGroupSubjectComboBox->setCurrentText( m_subjectNameMap.value( rule.subject( AccessControlRule::Condition::MemberOfUserGroup ) ) ); @@ -165,8 +165,8 @@ void AccessControlRuleEditDialog::accept() m_rule.setConditionEnabled( AccessControlRule::Condition::AccessFromAlreadyConnectedUser, ui->isSameUserAccessCheckBox->isChecked() ); - m_rule.setConditionEnabled( AccessControlRule::Condition::NoUserLoggedOn, - ui->noUserLoggedOnCheckBox->isChecked() ); + m_rule.setConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally, + ui->noUserLoggedInLocallyCheckBox->isChecked() ); // save action if( ui->actionAllowRadioButton->isChecked() ) diff --git a/configurator/src/AccessControlRuleEditDialog.ui b/configurator/src/AccessControlRuleEditDialog.ui index 18eda7019..cb7d359dc 100644 --- a/configurator/src/AccessControlRuleEditDialog.ui +++ b/configurator/src/AccessControlRuleEditDialog.ui @@ -212,9 +212,9 @@ - + - No user logged on + No user logged in locally @@ -306,7 +306,7 @@ hasCommonGroupsCheckBox isLocalUserAccessCheckBox isSameUserAccessCheckBox - noUserLoggedOnCheckBox + noUserLoggedInLocallyCheckBox actionAllowRadioButton actionDenyRadioButton actionAskForPermissionRadioButton diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 8295e7624..96b8673d9 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -313,9 +313,9 @@ bool AccessControlProvider::isLocalUser( const QString &accessingUser, const QSt -bool AccessControlProvider::isNoUserLoggedOn() const +bool AccessControlProvider::isNoUserLoggedInLocally() const { - return VeyonCore::platform().userFunctions().isAnyUserLoggedOn() == false; + return VeyonCore::platform().userFunctions().isAnyUserLoggedInLocally() == false; } @@ -447,11 +447,11 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, } } - if( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedOn ) ) + if( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally ) ) { hasConditions = true; - if( isNoUserLoggedOn() != matchResult ) + if( isNoUserLoggedInLocally() != matchResult ) { return false; } diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index 6b43e7bc9..30b49164f 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -67,7 +67,7 @@ class VEYON_CORE_EXPORT AccessControlProvider bool haveSameLocations( const QString& computerOne, const QString& computerTwo ) const; bool isLocalHost( const QString& accessingComputer ) const; bool isLocalUser( const QString& accessingUser, const QString& localUser ) const; - bool isNoUserLoggedOn() const; + bool isNoUserLoggedInLocally() const; QString lookupSubject( AccessControlRule::Subject subject, const QString& accessingUser, const QString& accessingComputer, diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index 38cad12aa..941f27b77 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -54,7 +54,7 @@ class VEYON_CORE_EXPORT AccessControlRule AccessFromLocalHost, AccessFromLocalUser, AccessFromAlreadyConnectedUser, - NoUserLoggedOn, + NoUserLoggedInLocally, AuthenticationMethod } ; diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index b6f76d38c..93a3fa5dd 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -214,7 +214,7 @@ void FeatureWorkerManager::sendMessageToManagedSystemWorker( const FeatureMessag void FeatureWorkerManager::sendMessageToUnmanagedSessionWorker( const FeatureMessage& message ) { // don't start worker for logon screen sessions - if( VeyonCore::platform().userFunctions().isAnyUserLoggedOn() == false || + if( VeyonCore::platform().userFunctions().isAnyUserLoggedInLocally() == false || VeyonCore::platform().coreFunctions().activeDesktopName().contains( QStringLiteral("winlogon"), Qt::CaseInsensitive ) ) { return; diff --git a/core/src/PlatformUserFunctions.h b/core/src/PlatformUserFunctions.h index bb8fc9a44..f04f6d330 100644 --- a/core/src/PlatformUserFunctions.h +++ b/core/src/PlatformUserFunctions.h @@ -41,7 +41,8 @@ class PlatformUserFunctions virtual QStringList userGroups( bool queryDomainGroups ) = 0; virtual QStringList groupsOfUser( const QString& username, bool queryDomainGroups ) = 0; - virtual bool isAnyUserLoggedOn() = 0; + virtual bool isAnyUserLoggedInLocally() = 0; + virtual bool isAnyUserLoggedInRemotely() = 0; virtual QString currentUser() = 0; virtual bool prepareLogon( const QString& username, const Password& password ) = 0; diff --git a/plugins/platform/common/LogonHelper.cpp b/plugins/platform/common/LogonHelper.cpp index ed384fec2..8fecb2707 100644 --- a/plugins/platform/common/LogonHelper.cpp +++ b/plugins/platform/common/LogonHelper.cpp @@ -40,7 +40,7 @@ LogonHelper::LogonHelper( QObject* parent ) : bool LogonHelper::prepare( const QString& username, const Password& password ) { - if( VeyonCore::platform().userFunctions().isAnyUserLoggedOn() ) + if( VeyonCore::platform().userFunctions().isAnyUserLoggedInLocally() ) { vInfo() << "Skipping user logon as a user is already logged on"; return false; @@ -55,7 +55,7 @@ void LogonHelper::checkPendingLogonTasks() { if( VeyonCore::component() == VeyonCore::Component::Server && ServiceDataManager::serviceDataTokenFromEnvironment().isEmpty() == false && - VeyonCore::platform().userFunctions().isAnyUserLoggedOn() == false ) + VeyonCore::platform().userFunctions().isAnyUserLoggedInLocally() == false ) { vDebug() << "Reading logon credentials"; QString username; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 5a00080c6..74cd50e9b 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -297,3 +297,10 @@ bool LinuxSessionFunctions::isGraphical( const QString& session ) type == Type::Wayland || type == Type::Mir; } + + + +bool LinuxSessionFunctions::isRemote( const QString& session ) +{ + return getSessionProperty( session, QStringLiteral("Remote") ).toBool(); +} diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 931cf1c60..80ae10c4c 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -106,5 +106,6 @@ class LinuxSessionFunctions : public PlatformSessionFunctions static bool isOpen( const QString& session ); static bool isGraphical( const QString& session ); + static bool isRemote( const QString& session ); }; diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 4e2701f9b..88106ac17 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -203,13 +203,33 @@ QStringList LinuxUserFunctions::groupsOfUser( const QString& username, bool quer -bool LinuxUserFunctions::isAnyUserLoggedOn() +bool LinuxUserFunctions::isAnyUserLoggedInLocally() { const auto sessions = LinuxSessionFunctions::listSessions(); for( const auto& session : sessions ) { if( LinuxSessionFunctions::isOpen( session ) && LinuxSessionFunctions::isGraphical( session ) && + LinuxSessionFunctions::isRemote( session ) == false && + LinuxSessionFunctions::getSessionClass( session ) == LinuxSessionFunctions::Class::User ) + { + return true; + } + } + + return false; +} + + + +bool LinuxUserFunctions::isAnyUserLoggedInRemotely() +{ + const auto sessions = LinuxSessionFunctions::listSessions(); + for( const auto& session : sessions ) + { + if( LinuxSessionFunctions::isOpen( session ) && + LinuxSessionFunctions::isGraphical( session ) && + LinuxSessionFunctions::isRemote( session ) && LinuxSessionFunctions::getSessionClass( session ) == LinuxSessionFunctions::Class::User ) { return true; diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index 85a6e07f6..2c53dcc66 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -39,7 +39,8 @@ class LinuxUserFunctions : public PlatformUserFunctions QStringList userGroups( bool queryDomainGroups ) override; QStringList groupsOfUser( const QString& username, bool queryDomainGroups ) override; - bool isAnyUserLoggedOn() override; + bool isAnyUserLoggedInLocally() override; + bool isAnyUserLoggedInRemotely() override; QString currentUser() override; bool prepareLogon( const QString& username, const Password& password ) override; diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 1aa51fd73..e70c176d5 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -120,9 +120,36 @@ QStringList WindowsUserFunctions::groupsOfUser( const QString& username, bool qu -bool WindowsUserFunctions::isAnyUserLoggedOn() +bool WindowsUserFunctions::isAnyUserLoggedInLocally() { - return WtsSessionManager::loggedOnUsers().isEmpty() == false; + const auto sessions = WtsSessionManager::activeSessions(); + for( const auto session : sessions ) + { + if( WtsSessionManager::querySessionInformation( session, WtsSessionManager::SessionInfo::UserName ).isEmpty() == false && + WtsSessionManager::isRemote( session ) == false ) + { + return true; + } + } + + return false; +} + + + +bool WindowsUserFunctions::isAnyUserLoggedInRemotely() +{ + const auto sessions = WtsSessionManager::activeSessions(); + for( const auto session : sessions ) + { + if( WtsSessionManager::querySessionInformation( session, WtsSessionManager::SessionInfo::UserName ).isEmpty() == false && + WtsSessionManager::isRemote( session ) ) + { + return true; + } + } + + return false; } diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index 67a3cddd3..d59288425 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -37,7 +37,9 @@ class WindowsUserFunctions : public PlatformUserFunctions QStringList userGroups( bool queryDomainGroups ) override; QStringList groupsOfUser( const QString& username, bool queryDomainGroups ) override; - bool isAnyUserLoggedOn() override; + bool isAnyUserLoggedInLocally() override; + bool isAnyUserLoggedInRemotely() override; + QString currentUser() override; bool prepareLogon( const QString& username, const Password& password ) override; diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 40e6d7bd1..42df49483 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -122,6 +122,27 @@ QString WtsSessionManager::querySessionInformation( SessionId sessionId, Session +bool WtsSessionManager::isRemote( SessionId sessionId ) +{ + const auto WTSIsRemoteSession = static_cast(29); + + BOOL *isRDP = nullptr; + DWORD dataLen = 0; + + if( WTSQuerySessionInformation( WTS_CURRENT_SERVER_HANDLE, sessionId, WTSIsRemoteSession, + reinterpret_cast(&isRDP), &dataLen ) && + isRDP ) + { + const auto result = *isRDP; + WTSFreeMemory( isRDP ); + return result; + } + + return false; +} + + + WtsSessionManager::ProcessId WtsSessionManager::findWinlogonProcessId( SessionId sessionId ) { if( sessionId == InvalidSession ) diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index b020dd4ff..ae7a94ef0 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -53,6 +53,7 @@ class WtsSessionManager static SessionList activeSessions(); static QString querySessionInformation( SessionId sessionId, SessionInfo sessionInfo ); + static bool isRemote( SessionId sessionId ); static ProcessId findWinlogonProcessId( SessionId sessionId ); static ProcessId findUserProcessId( const QString& userName ); diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 3f21ac41d..b43a50a77 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -200,7 +200,8 @@ bool PowerControlFeaturePlugin::handleFeatureMessage( VeyonServerInterface& serv } else if( message.featureUid() == m_powerDownConfirmedFeature.uid() ) { - if( VeyonCore::platform().userFunctions().isAnyUserLoggedOn() == false ) + if( VeyonCore::platform().userFunctions().isAnyUserLoggedInLocally() == false && + VeyonCore::platform().userFunctions().isAnyUserLoggedInRemotely() == false ) { VeyonCore::platform().coreFunctions().powerDown( false ); } From 062fa9134bf154e46f3da04d5f267b9de6f04e13 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 11:08:32 +0200 Subject: [PATCH 0865/1765] AccessControl: add condition NoUserLoggedInRemotely --- .../src/AccessControlRuleEditDialog.cpp | 5 + .../src/AccessControlRuleEditDialog.ui | 128 ++++++++++-------- core/src/AccessControlProvider.cpp | 17 +++ core/src/AccessControlProvider.h | 1 + core/src/AccessControlRule.h | 1 + 5 files changed, 92 insertions(+), 60 deletions(-) diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index fd90b15ae..445c64763 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -86,6 +86,7 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule ui->isLocalUserAccessCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromLocalUser ) ); ui->isSameUserAccessCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromAlreadyConnectedUser ) ); ui->noUserLoggedInLocallyCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally ) ); + ui->noUserLoggedInRemotelyCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInRemotely ) ); // load selected condition subjects ui->isMemberOfGroupSubjectComboBox->setCurrentText( m_subjectNameMap.value( rule.subject( AccessControlRule::Condition::MemberOfUserGroup ) ) ); @@ -168,6 +169,10 @@ void AccessControlRuleEditDialog::accept() m_rule.setConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally, ui->noUserLoggedInLocallyCheckBox->isChecked() ); + m_rule.setConditionEnabled( AccessControlRule::Condition::NoUserLoggedInRemotely, + ui->noUserLoggedInRemotelyCheckBox->isChecked() ); + + // save action if( ui->actionAllowRadioButton->isChecked() ) { diff --git a/configurator/src/AccessControlRuleEditDialog.ui b/configurator/src/AccessControlRuleEditDialog.ui index cb7d359dc..f9930cc12 100644 --- a/configurator/src/AccessControlRuleEditDialog.ui +++ b/configurator/src/AccessControlRuleEditDialog.ui @@ -63,27 +63,24 @@ Conditions - - + + - - - - false - - - QComboBox::AdjustToContents + + + + Accessing computer is localhost - - + + - is member of group + Accessing user is already connected @@ -100,13 +97,6 @@ - - - - - - - @@ -124,6 +114,38 @@ + + + + is member of group + + + + + + + Accessing user is logged on user + + + + + + + + + Authenticated via method + + + + + + + false + + + + + @@ -137,16 +159,10 @@ - - - - - 0 - 0 - - + + - Accessing computer and local computer are at the same location + No user logged in locally @@ -157,7 +173,7 @@ - + @@ -172,49 +188,40 @@ - - - - - - Authenticated via method - - - - - - - false - - - - - - - + + - Accessing computer is localhost + - - - - Accessing user is logged on user + + + + false + + + QComboBox::AdjustToContents - - + + + + + 0 + 0 + + - Accessing user is already connected + Accessing computer and local computer are at the same location - - + + - No user logged in locally + No user logged in remotely @@ -307,6 +314,7 @@ isLocalUserAccessCheckBox isSameUserAccessCheckBox noUserLoggedInLocallyCheckBox + noUserLoggedInRemotelyCheckBox actionAllowRadioButton actionDenyRadioButton actionAskForPermissionRadioButton diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 96b8673d9..6332ee53e 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -320,6 +320,13 @@ bool AccessControlProvider::isNoUserLoggedInLocally() const +bool AccessControlProvider::isNoUserLoggedInRemotely() const +{ + return VeyonCore::platform().userFunctions().isAnyUserLoggedInRemotely() == false; +} + + + QString AccessControlProvider::lookupSubject( AccessControlRule::Subject subject, const QString &accessingUser, const QString &accessingComputer, const QString &localUser, const QString &localComputer ) const @@ -457,6 +464,16 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, } } + if( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInRemotely ) ) + { + hasConditions = true; + + if( isNoUserLoggedInRemotely() != matchResult ) + { + return false; + } + } + // do not match the rule if no conditions are set at all if( hasConditions == false ) { diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index 30b49164f..9c0e4f3d8 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -68,6 +68,7 @@ class VEYON_CORE_EXPORT AccessControlProvider bool isLocalHost( const QString& accessingComputer ) const; bool isLocalUser( const QString& accessingUser, const QString& localUser ) const; bool isNoUserLoggedInLocally() const; + bool isNoUserLoggedInRemotely() const; QString lookupSubject( AccessControlRule::Subject subject, const QString& accessingUser, const QString& accessingComputer, diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index 941f27b77..c6d2a2fcb 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -55,6 +55,7 @@ class VEYON_CORE_EXPORT AccessControlRule AccessFromLocalUser, AccessFromAlreadyConnectedUser, NoUserLoggedInLocally, + NoUserLoggedInRemotely, AuthenticationMethod } ; From 92b9d31fb14b9c36ca571566eea8211635877708 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 11:09:21 +0200 Subject: [PATCH 0866/1765] WtsSessionManager: improve code readability --- plugins/platform/windows/WtsSessionManager.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 42df49483..1c7dc8063 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -52,17 +52,16 @@ WtsSessionManager::SessionId WtsSessionManager::activeConsoleSession() WtsSessionManager::SessionList WtsSessionManager::activeSessions() { - SessionList sessionList; - PWTS_SESSION_INFO sessions; DWORD sessionCount = 0; - auto result = WTSEnumerateSessions( WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessions, &sessionCount ); + const auto result = WTSEnumerateSessions( WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessions, &sessionCount ); if( result == false ) { - return sessionList; + return {}; } + SessionList sessionList; sessionList.reserve( sessionCount ); for( DWORD sessionIndex = 0; sessionIndex < sessionCount; ++sessionIndex ) From 30359aa76a20484dc0ac9d4e4411474972f5cceb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 11:09:56 +0200 Subject: [PATCH 0867/1765] WtsSessionManager: fix memory leak in activeSessions() --- plugins/platform/windows/WtsSessionManager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 1c7dc8063..420a9e750 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -73,6 +73,8 @@ WtsSessionManager::SessionList WtsSessionManager::activeSessions() } } + WTSFreeMemory( sessions ); + return sessionList; } From f8c10021ebb34387a336b26e3f4428b6cbb72655 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 11:10:17 +0200 Subject: [PATCH 0868/1765] WtsSessionManager: drop unused loggedOnUsers() --- .../platform/windows/WtsSessionManager.cpp | 44 ------------------- plugins/platform/windows/WtsSessionManager.h | 2 - 2 files changed, 46 deletions(-) diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 420a9e750..c637dcafc 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -265,47 +265,3 @@ WtsSessionManager::ProcessId WtsSessionManager::findProcessId( const QString& pr return pid; } - - - -QStringList WtsSessionManager::loggedOnUsers() -{ - PWTS_SESSION_INFO sessionInfo = nullptr; - DWORD sessionCount = 0; - - if( WTSEnumerateSessions( WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessionInfo, &sessionCount ) == false ) - { - return {}; - } - - QStringList users; - - for( DWORD session = 0; session < sessionCount; ++session ) - { - if( sessionInfo[session].State != WTSActive ) - { - continue; - } - - LPTSTR userBuffer = nullptr; - DWORD bytesReturned = 0; - if( WTSQuerySessionInformation( WTS_CURRENT_SERVER_HANDLE, sessionInfo[session].SessionId, WTSUserName, - &userBuffer, &bytesReturned ) == false || - userBuffer == nullptr ) - { - continue; - } - - const auto user = QString::fromWCharArray( userBuffer ); - if( user.isEmpty() == false && users.contains( user ) == false ) - { - users.append( user ); - } - - WTSFreeMemory( userBuffer ); - } - - WTSFreeMemory( sessionInfo ); - - return users; -} diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index ae7a94ef0..648f17d98 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -59,6 +59,4 @@ class WtsSessionManager static ProcessId findUserProcessId( const QString& userName ); static ProcessId findProcessId( const QString& processName ); - static QStringList loggedOnUsers(); - } ; From b6a84ee114ee12125c0a8fb3b15ee75ac3ce5fc6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 14:54:06 +0200 Subject: [PATCH 0869/1765] AccessControl: add support for inverting individual conditions Also refactor parts of the AccessControlRuleEditDialog and improve the AccessControlRule::Condition member names. --- .../src/AccessControlRuleEditDialog.cpp | 113 +-- .../src/AccessControlRuleEditDialog.ui | 720 ++++++++++++++---- core/src/AccessControlProvider.cpp | 51 +- core/src/AccessControlRule.cpp | 6 +- core/src/AccessControlRule.h | 21 +- 5 files changed, 672 insertions(+), 239 deletions(-) diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index 445c64763..e268e26c8 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -48,25 +48,25 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule { if( it.value().isEmpty() == false ) { - ui->authenticationMethodsComboBox->addItem( it.value(), it.key() ); + ui->authenticationMethods->addItem( it.value(), it.key() ); } } // populate user subject combobox - ui->isMemberOfGroupSubjectComboBox->addItem( m_subjectNameMap[AccessControlRule::Subject::AccessingUser], + ui->isMemberOfGroupSubject->addItem( m_subjectNameMap[AccessControlRule::Subject::AccessingUser], static_cast( AccessControlRule::Subject::AccessingUser ) ); - ui->isMemberOfGroupSubjectComboBox->addItem( m_subjectNameMap[AccessControlRule::Subject::LocalUser], + ui->isMemberOfGroupSubject->addItem( m_subjectNameMap[AccessControlRule::Subject::LocalUser], static_cast( AccessControlRule::Subject::LocalUser ) ); // populate computer subject comboboxes - ui->isAtLocationSubjectComboBox->addItem( m_subjectNameMap[AccessControlRule::Subject::AccessingComputer], + ui->isAtLocationSubject->addItem( m_subjectNameMap[AccessControlRule::Subject::AccessingComputer], static_cast( AccessControlRule::Subject::AccessingComputer ) ); - ui->isAtLocationSubjectComboBox->addItem( m_subjectNameMap[AccessControlRule::Subject::LocalComputer], + ui->isAtLocationSubject->addItem( m_subjectNameMap[AccessControlRule::Subject::LocalComputer], static_cast( AccessControlRule::Subject::LocalComputer ) ); // populate groups and locations comboboxes - ui->groupsComboBox->addItems( accessControlProvider.userGroups() ); - ui->locationsComboBox->addItems( accessControlProvider.locations() ); + ui->groups->addItems( accessControlProvider.userGroups() ); + ui->locations->addItems( accessControlProvider.locations() ); // load general settings ui->ruleNameLineEdit->setText( rule.name() ); @@ -74,29 +74,38 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule // load general condition processing settings ui->ignoreConditionsCheckBox->setChecked( rule.areConditionsIgnored() ); - ui->invertConditionsCheckBox->setChecked( rule.areConditionsInverted() ); + ui->invertConditionsCheckBox->setChecked( rule.areAllConditionsInverted() ); // load condition states - ui->isAuthenticatedViaMethodCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::AuthenticationMethod ) ); - ui->isMemberOfGroupCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::MemberOfUserGroup ) ); - ui->hasCommonGroupsCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::GroupsInCommon ) ); - ui->isAtLocationCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::LocatedAt ) ); - ui->hasCommonLocationsCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::SameLocation ) ); - ui->isLocalHostAccessCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromLocalHost ) ); - ui->isLocalUserAccessCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromLocalUser ) ); - ui->isSameUserAccessCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromAlreadyConnectedUser ) ); - ui->noUserLoggedInLocallyCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally ) ); - ui->noUserLoggedInRemotelyCheckBox->setChecked( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInRemotely ) ); + const auto loadCondition = [&rule]( QCheckBox* checkBox, + QComboBox* comboBox, + AccessControlRule::Condition condition ) + { + checkBox->setChecked( rule.isConditionEnabled( condition ) ); + comboBox->setCurrentIndex( rule.isConditionInverted( condition ) ? 1 : 0 ); + }; + + // load condition settings + loadCondition ( ui->isAuthenticatedViaMethod, ui->invertIsAuthenticatedViaMethod, AccessControlRule::Condition::AuthenticationMethod ); + loadCondition ( ui->isMemberOfGroup, ui->invertIsMemberOfGroup, AccessControlRule::Condition::MemberOfGroup ); + loadCondition ( ui->hasCommonGroups, ui->invertHasCommonGroups, AccessControlRule::Condition::GroupsInCommon ); + loadCondition ( ui->isAtLocation, ui->invertIsAtLocation, AccessControlRule::Condition::LocatedAt ); + loadCondition ( ui->hasCommonLocations, ui->invertHasCommonLocations, AccessControlRule::Condition::LocationsInCommon ); + loadCondition ( ui->isLocalHostAccess, ui->invertIsLocalHostAccess, AccessControlRule::Condition::AccessFromLocalHost ); + loadCondition ( ui->isSameUserAccess, ui->invertIsSameUserAccess, AccessControlRule::Condition::AccessFromSameUser ); + loadCondition ( ui->isUserConnected, ui->invertIsUserConnected, AccessControlRule::Condition::AccessFromAlreadyConnectedUser ); + loadCondition ( ui->isNoUserLoggedInLocally, ui->invertIsNoUserLoggedInLocally, AccessControlRule::Condition::NoUserLoggedInLocally ); + loadCondition ( ui->isNoUserLoggedInRemotely, ui->invertIsNoUserLoggedInRemotely, AccessControlRule::Condition::NoUserLoggedInRemotely ); // load selected condition subjects - ui->isMemberOfGroupSubjectComboBox->setCurrentText( m_subjectNameMap.value( rule.subject( AccessControlRule::Condition::MemberOfUserGroup ) ) ); - ui->isAtLocationSubjectComboBox->setCurrentText( m_subjectNameMap.value( rule.subject( AccessControlRule::Condition::LocatedAt ) ) ); + ui->isMemberOfGroupSubject->setCurrentText( m_subjectNameMap.value( rule.subject( AccessControlRule::Condition::MemberOfGroup ) ) ); + ui->isAtLocationSubject->setCurrentText( m_subjectNameMap.value( rule.subject( AccessControlRule::Condition::LocatedAt ) ) ); // load condition arguments - ui->authenticationMethodsComboBox->setCurrentText( authenticationMethods.value( + ui->authenticationMethods->setCurrentText( authenticationMethods.value( Plugin::Uid{ rule.argument( AccessControlRule::Condition::AuthenticationMethod ) } ) ); - ui->groupsComboBox->setCurrentText( rule.argument( AccessControlRule::Condition::MemberOfUserGroup ) ); - ui->locationsComboBox->setCurrentText( rule.argument( AccessControlRule::Condition::LocatedAt ) ); + ui->groups->setCurrentText( rule.argument( AccessControlRule::Condition::MemberOfGroup ) ); + ui->locations->setCurrentText( rule.argument( AccessControlRule::Condition::LocatedAt ) ); // load action ui->actionNoneRadioButton->setChecked( rule.action() == AccessControlRule::Action::None ); @@ -122,56 +131,48 @@ void AccessControlRuleEditDialog::accept() // save general condition processing settings m_rule.setConditionsIgnored( ui->ignoreConditionsCheckBox->isChecked() ); - m_rule.setConditionsInverted( ui->invertConditionsCheckBox->isChecked() ); + m_rule.setAllConditionsInverted( ui->invertConditionsCheckBox->isChecked() ); // save conditions m_rule.clearParameters(); + const auto saveCondition = [this]( QCheckBox* checkBox, + QComboBox* comboBox, + AccessControlRule::Condition condition ) + { + m_rule.setConditionEnabled( condition, checkBox->isChecked() ); + m_rule.setConditionInverted( condition, comboBox->currentIndex() > 0 ); + }; + // authentication method - m_rule.setConditionEnabled( AccessControlRule::Condition::AuthenticationMethod, - ui->isAuthenticatedViaMethodCheckBox->isChecked() ); + saveCondition( ui->isAuthenticatedViaMethod, ui->invertIsAuthenticatedViaMethod, AccessControlRule::Condition::AuthenticationMethod ); m_rule.setArgument( AccessControlRule::Condition::AuthenticationMethod, - VeyonCore::formattedUuid( ui->authenticationMethodsComboBox->currentData().toUuid() ) ); + VeyonCore::formattedUuid( ui->authenticationMethods->currentData().toUuid() ) ); // member of user group - m_rule.setConditionEnabled( AccessControlRule::Condition::MemberOfUserGroup, - ui->isMemberOfGroupCheckBox->isChecked() ); - m_rule.setSubject( AccessControlRule::Condition::MemberOfUserGroup, - m_subjectNameMap.key( ui->isMemberOfGroupSubjectComboBox->currentText() ) ); - m_rule.setArgument( AccessControlRule::Condition::MemberOfUserGroup, - ui->groupsComboBox->currentText() ); + saveCondition( ui->isMemberOfGroup, ui->invertIsMemberOfGroup, AccessControlRule::Condition::MemberOfGroup ); + m_rule.setSubject( AccessControlRule::Condition::MemberOfGroup, + m_subjectNameMap.key( ui->isMemberOfGroupSubject->currentText() ) ); + m_rule.setArgument( AccessControlRule::Condition::MemberOfGroup, ui->groups->currentText() ); // common groups - m_rule.setConditionEnabled( AccessControlRule::Condition::GroupsInCommon, - ui->hasCommonGroupsCheckBox->isChecked() ); + saveCondition( ui->hasCommonGroups, ui->invertHasCommonGroups, AccessControlRule::Condition::GroupsInCommon ); // located at - m_rule.setConditionEnabled( AccessControlRule::Condition::LocatedAt, - ui->isAtLocationCheckBox->isChecked() ); + saveCondition( ui->isAtLocation, ui->invertIsAtLocation, AccessControlRule::Condition::LocatedAt ); m_rule.setSubject( AccessControlRule::Condition::LocatedAt, - m_subjectNameMap.key( ui->isAtLocationSubjectComboBox->currentText() ) ); - m_rule.setArgument( AccessControlRule::Condition::LocatedAt, - ui->locationsComboBox->currentText() ); + m_subjectNameMap.key( ui->isAtLocationSubject->currentText() ) ); + m_rule.setArgument( AccessControlRule::Condition::LocatedAt, ui->locations->currentText() ); // same location - m_rule.setConditionEnabled( AccessControlRule::Condition::SameLocation, - ui->hasCommonLocationsCheckBox->isChecked() ); - - m_rule.setConditionEnabled( AccessControlRule::Condition::AccessFromLocalHost, - ui->isLocalHostAccessCheckBox->isChecked() ); - - m_rule.setConditionEnabled( AccessControlRule::Condition::AccessFromLocalUser, - ui->isLocalUserAccessCheckBox->isChecked() ); - - m_rule.setConditionEnabled( AccessControlRule::Condition::AccessFromAlreadyConnectedUser, - ui->isSameUserAccessCheckBox->isChecked() ); - - m_rule.setConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally, - ui->noUserLoggedInLocallyCheckBox->isChecked() ); + saveCondition( ui->hasCommonLocations, ui->invertHasCommonLocations, AccessControlRule::Condition::LocationsInCommon ); - m_rule.setConditionEnabled( AccessControlRule::Condition::NoUserLoggedInRemotely, - ui->noUserLoggedInRemotelyCheckBox->isChecked() ); + saveCondition( ui->isLocalHostAccess, ui->invertIsLocalHostAccess, AccessControlRule::Condition::AccessFromLocalHost ); + saveCondition( ui->isSameUserAccess, ui->invertIsSameUserAccess, AccessControlRule::Condition::AccessFromSameUser ); + saveCondition( ui->isUserConnected, ui->invertIsUserConnected, AccessControlRule::Condition::AccessFromAlreadyConnectedUser ); + saveCondition( ui->isNoUserLoggedInLocally, ui->invertIsNoUserLoggedInLocally, AccessControlRule::Condition::NoUserLoggedInLocally ); + saveCondition( ui->isNoUserLoggedInRemotely, ui->invertIsNoUserLoggedInRemotely, AccessControlRule::Condition::NoUserLoggedInRemotely ); // save action if( ui->actionAllowRadioButton->isChecked() ) diff --git a/configurator/src/AccessControlRuleEditDialog.ui b/configurator/src/AccessControlRuleEditDialog.ui index f9930cc12..2d7b709b7 100644 --- a/configurator/src/AccessControlRuleEditDialog.ui +++ b/configurator/src/AccessControlRuleEditDialog.ui @@ -62,118 +62,401 @@ Conditions - - - - - - - - - - - - Accessing computer is localhost - - - - - - - Accessing user is already connected - - + + + + + + + + + + + + + + false + + + QComboBox::AdjustToContents + + + + + + + false + + + + is + + + + + is not + + + + + + + + member of group + + + + + + + false + + + true + + + QComboBox::AdjustToContents + + + + - - - - false - - - true - - - QComboBox::AdjustToContents - - + + + + + + + + + + + + + false + + + QComboBox::AdjustToContents + + + + + + + false + + + + is + + + + + is not + + + + + + + + located at + + + + + + + false + + + true + + + QComboBox::AdjustToContents + + + + - - - - false - - - QComboBox::AdjustToContents - - + + + + + + + 0 + 0 + + + + Accessing computer and local computer + + + + + + + false + + + + are located + + + + + are not located + + + + + + + + at the same location + + + + - - - - is located at - - + + + + + + Accessing computer + + + + + + + false + + + + is + + + + + is not + + + + + + + + localhost + + + + - - - - is member of group - - + + + + + + Accessing user + + + + + + + false + + + + is + + + + + is not + + + + + + + + authenticated via + + + + + + + false + + + + - - - - Accessing user is logged on user - - + + + + + + Accessing user + + + + + + + false + + + + has one or more + + + + + has no + + + + + + + + groups in common with user being accessed + + + + - - + + - + - Authenticated via method + Accessing user - + false + + + 0 + 0 + + + + + equals + + + + + is different from + + + + + + + + user being accessed + - - - - false - - - true - - - QComboBox::AdjustToContents - - + + + + + + Accessing user + + + + + + + false + + + + is already + + + + + is not + + + + + + + + connected + + + + - - - - No user logged in locally - - + + + + + + + + + false + + + + No user is logged in locally + + + + + One or multiple users are logged in locally + + + + + - - - - Accessing user has one or more groups in common with local (logged on) user - - + + + + + + + + + false + + + + No user is logged in remotely + + + + + One or multiple users are logged in remotely + + + + + - + @@ -188,43 +471,6 @@ - - - - - - - - - - - false - - - QComboBox::AdjustToContents - - - - - - - - 0 - 0 - - - - Accessing computer and local computer are at the same location - - - - - - - No user logged in remotely - - - @@ -300,21 +546,31 @@ ruleDescriptionLineEdit ignoreConditionsCheckBox invertConditionsCheckBox - isAuthenticatedViaMethodCheckBox - authenticationMethodsComboBox - isMemberOfGroupCheckBox - isMemberOfGroupSubjectComboBox - groupsComboBox - isAtLocationCheckBox - isAtLocationSubjectComboBox - locationsComboBox - hasCommonLocationsCheckBox - isLocalHostAccessCheckBox - hasCommonGroupsCheckBox - isLocalUserAccessCheckBox - isSameUserAccessCheckBox - noUserLoggedInLocallyCheckBox - noUserLoggedInRemotelyCheckBox + isMemberOfGroup + isMemberOfGroupSubject + invertIsMemberOfGroup + groups + isAtLocation + isAtLocationSubject + invertIsAtLocation + locations + hasCommonLocations + invertHasCommonLocations + isLocalHostAccess + invertIsLocalHostAccess + isAuthenticatedViaMethod + invertIsAuthenticatedViaMethod + authenticationMethods + hasCommonGroups + invertHasCommonGroups + isSameUserAccess + invertIsSameUserAccess + isUserConnected + invertIsUserConnected + isNoUserLoggedInLocally + invertIsNoUserLoggedInLocally + isNoUserLoggedInRemotely + invertIsNoUserLoggedInRemotely actionAllowRadioButton actionDenyRadioButton actionAskForPermissionRadioButton @@ -355,9 +611,9 @@ - isMemberOfGroupCheckBox + isMemberOfGroup toggled(bool) - groupsComboBox + groups setEnabled(bool) @@ -371,9 +627,9 @@ - isAtLocationCheckBox + isAtLocation toggled(bool) - locationsComboBox + locations setEnabled(bool) @@ -387,9 +643,9 @@ - isMemberOfGroupCheckBox + isMemberOfGroup toggled(bool) - isMemberOfGroupSubjectComboBox + isMemberOfGroupSubject setEnabled(bool) @@ -403,9 +659,9 @@ - isAtLocationCheckBox + isAtLocation toggled(bool) - isAtLocationSubjectComboBox + isAtLocationSubject setEnabled(bool) @@ -451,9 +707,9 @@ - isAuthenticatedViaMethodCheckBox + isAuthenticatedViaMethod toggled(bool) - authenticationMethodsComboBox + authenticationMethods setEnabled(bool) @@ -466,6 +722,166 @@ + + isMemberOfGroup + toggled(bool) + invertIsMemberOfGroup + setEnabled(bool) + + + 39 + 307 + + + 408 + 307 + + + + + isAtLocation + toggled(bool) + invertIsAtLocation + setEnabled(bool) + + + 39 + 352 + + + 444 + 352 + + + + + hasCommonLocations + toggled(bool) + invertHasCommonLocations + setEnabled(bool) + + + 224 + 397 + + + 550 + 397 + + + + + isLocalHostAccess + toggled(bool) + invertIsLocalHostAccess + setEnabled(bool) + + + 136 + 442 + + + 417 + 442 + + + + + isAuthenticatedViaMethod + toggled(bool) + invertIsAuthenticatedViaMethod + setEnabled(bool) + + + 112 + 487 + + + 294 + 487 + + + + + hasCommonGroups + toggled(bool) + invertHasCommonGroups + setEnabled(bool) + + + 112 + 532 + + + 381 + 532 + + + + + isSameUserAccess + toggled(bool) + invertIsSameUserAccess + setEnabled(bool) + + + 112 + 577 + + + 381 + 577 + + + + + isUserConnected + toggled(bool) + invertIsUserConnected + setEnabled(bool) + + + 112 + 622 + + + 381 + 622 + + + + + isNoUserLoggedInLocally + toggled(bool) + invertIsNoUserLoggedInLocally + setEnabled(bool) + + + 39 + 667 + + + 492 + 667 + + + + + isNoUserLoggedInRemotely + toggled(bool) + invertIsNoUserLoggedInRemotely + setEnabled(bool) + + + 39 + 712 + + + 492 + 712 + + + diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 6332ee53e..aa338fbd5 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -350,18 +350,14 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, const QString& localUser, const QString& localComputer, const QStringList& connectedUsers, Plugin::Uid authMethodUid ) const { - bool hasConditions = false; + vDebug() << rule.toJson(); - // normally all selected conditions have to match in order to make the whole rule match - // if conditions should be inverted (i.e. "is member of" is to be interpreted as "is NOT member of") - // we have to check against the opposite boolean value - bool matchResult = rule.areConditionsInverted() == false; - - vDebug() << rule.toJson() << matchResult; + AccessControlRule::Condition condition{AccessControlRule::Condition::None}; if( rule.isConditionEnabled( AccessControlRule::Condition::AuthenticationMethod ) ) { - hasConditions = true; + condition = AccessControlRule::Condition::AuthenticationMethod; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); const auto allowedAuthMethod = Plugin::Uid( rule.argument( AccessControlRule::Condition::AuthenticationMethod ) ); if( authMethodUid.isNull() || @@ -372,11 +368,12 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, } } - if( rule.isConditionEnabled( AccessControlRule::Condition::MemberOfUserGroup ) ) + if( rule.isConditionEnabled( AccessControlRule::Condition::MemberOfGroup ) ) { - hasConditions = true; + condition = AccessControlRule::Condition::MemberOfGroup; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); - const auto condition = AccessControlRule::Condition::MemberOfUserGroup; + const auto condition = AccessControlRule::Condition::MemberOfGroup; const auto user = lookupSubject( rule.subject( condition ), accessingUser, {}, localUser, {} ); const auto group = rule.argument( condition ); @@ -389,7 +386,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::GroupsInCommon ) ) { - hasConditions = true; + condition = AccessControlRule::Condition::GroupsInCommon; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); if( accessingUser.isEmpty() || localUser.isEmpty() || haveGroupsInCommon( accessingUser, localUser ) != matchResult ) @@ -400,9 +398,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::LocatedAt ) ) { - hasConditions = true; - - const auto condition = AccessControlRule::Condition::LocatedAt; + condition = AccessControlRule::Condition::LocatedAt; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); const auto computer = lookupSubject( rule.subject( condition ), {}, accessingComputer, {}, localComputer ); const auto location = rule.argument( condition ); @@ -413,9 +410,10 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, } } - if( rule.isConditionEnabled( AccessControlRule::Condition::SameLocation ) ) + if( rule.isConditionEnabled( AccessControlRule::Condition::LocationsInCommon ) ) { - hasConditions = true; + condition = AccessControlRule::Condition::LocationsInCommon; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); if( accessingComputer.isEmpty() || localComputer.isEmpty() || haveSameLocations( accessingComputer, localComputer ) != matchResult ) @@ -426,7 +424,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromLocalHost ) ) { - hasConditions = true; + condition = AccessControlRule::Condition::AccessFromLocalHost; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); if( isLocalHost( accessingComputer ) != matchResult ) { @@ -434,9 +433,10 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, } } - if( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromLocalUser ) ) + if( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromSameUser ) ) { - hasConditions = true; + condition = AccessControlRule::Condition::AccessFromSameUser; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); if( isLocalUser( accessingUser, localUser ) != matchResult ) { @@ -446,7 +446,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromAlreadyConnectedUser ) ) { - hasConditions = true; + condition = AccessControlRule::Condition::AccessFromAlreadyConnectedUser; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); if( connectedUsers.contains( accessingUser ) != matchResult ) { @@ -456,7 +457,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally ) ) { - hasConditions = true; + condition = AccessControlRule::Condition::NoUserLoggedInLocally; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); if( isNoUserLoggedInLocally() != matchResult ) { @@ -466,7 +468,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInRemotely ) ) { - hasConditions = true; + condition = AccessControlRule::Condition::NoUserLoggedInRemotely; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); if( isNoUserLoggedInRemotely() != matchResult ) { @@ -475,7 +478,7 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, } // do not match the rule if no conditions are set at all - if( hasConditions == false ) + if( condition == AccessControlRule::Condition::None ) { return false; } diff --git a/core/src/AccessControlRule.cpp b/core/src/AccessControlRule.cpp index 30c64e17a..be2d1c587 100644 --- a/core/src/AccessControlRule.cpp +++ b/core/src/AccessControlRule.cpp @@ -42,7 +42,7 @@ AccessControlRule::AccessControlRule(const AccessControlRule &other) : m_description( other.description() ), m_action( other.action() ), m_parameters( other.parameters() ), - m_invertConditions( other.areConditionsInverted() ), + m_invertConditions( other.areAllConditionsInverted() ), m_ignoreConditions( other.areConditionsIgnored() ) { } @@ -74,6 +74,7 @@ AccessControlRule::AccessControlRule(const QJsonValue &jsonValue) : auto condition = static_cast( parametersObj[QStringLiteral("Condition")].toInt() ); m_parameters[condition].enabled = parametersObj[QStringLiteral("Enabled")].toBool(); + m_parameters[condition].inverted = parametersObj[QStringLiteral("Inverted")].toBool(); m_parameters[condition].subject = static_cast( parametersObj[QStringLiteral("Subject")].toInt() ); m_parameters[condition].argument = parametersObj[QStringLiteral("Argument")].toString(); } @@ -88,7 +89,7 @@ AccessControlRule& AccessControlRule::operator=( const AccessControlRule& other m_description = other.description(); m_action = other.action(); m_parameters = other.parameters(); - m_invertConditions = other.areConditionsInverted(); + m_invertConditions = other.areAllConditionsInverted(); m_ignoreConditions = other.areConditionsIgnored(); return *this; @@ -115,6 +116,7 @@ QJsonObject AccessControlRule::toJson() const QJsonObject parametersObject; parametersObject[QStringLiteral("Condition")] = static_cast( it.key() ); parametersObject[QStringLiteral("Enabled")] = true; + parametersObject[QStringLiteral("Inverted")] = isConditionInverted( it.key() ); parametersObject[QStringLiteral("Subject")] = static_cast( subject( it.key() ) ); parametersObject[QStringLiteral("Argument")] = argument( it.key() ); parameters.append( parametersObject ); diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index c6d2a2fcb..9399c0ef4 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -47,12 +47,12 @@ class VEYON_CORE_EXPORT AccessControlRule enum class Condition { None, - MemberOfUserGroup, + MemberOfGroup, GroupsInCommon, LocatedAt, - SameLocation, + LocationsInCommon, AccessFromLocalHost, - AccessFromLocalUser, + AccessFromSameUser, AccessFromAlreadyConnectedUser, NoUserLoggedInLocally, NoUserLoggedInRemotely, @@ -77,6 +77,7 @@ class VEYON_CORE_EXPORT AccessControlRule struct ConditionParameters { bool enabled{false}; + bool inverted{false}; Subject subject{Subject::None}; ConditionArgument argument; }; @@ -147,12 +148,12 @@ class VEYON_CORE_EXPORT AccessControlRule m_ignoreConditions = ignored; } - bool areConditionsInverted() const + bool areAllConditionsInverted() const { return m_invertConditions; } - void setConditionsInverted( bool inverted ) + void setAllConditionsInverted( bool inverted ) { m_invertConditions = inverted; } @@ -167,6 +168,16 @@ class VEYON_CORE_EXPORT AccessControlRule m_parameters[condition].enabled = enabled; } + bool isConditionInverted( Condition condition ) const + { + return m_parameters.value( condition ).inverted; + } + + void setConditionInverted( Condition condition, bool inverted ) + { + m_parameters[condition].inverted = inverted; + } + ConditionArgument argument( Condition condition ) const { return m_parameters.value( condition ).argument; From 657f2ea6334498e44124dc8379d4e8ef17245f11 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 15:38:43 +0200 Subject: [PATCH 0870/1765] PlatformSessionFunctions: add currentSessionIsRemote() --- core/src/PlatformSessionFunctions.h | 1 + plugins/platform/linux/LinuxSessionFunctions.cpp | 7 +++++++ plugins/platform/linux/LinuxSessionFunctions.h | 1 + plugins/platform/windows/WindowsSessionFunctions.cpp | 7 +++++++ plugins/platform/windows/WindowsSessionFunctions.h | 1 + 5 files changed, 17 insertions(+) diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 4001f9303..06d366c02 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -41,5 +41,6 @@ class PlatformSessionFunctions virtual SessionId currentSessionId() = 0; virtual QString currentSessionType() const = 0; + virtual bool currentSessionIsRemote() const = 0; }; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 74cd50e9b..35a9a4e09 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -235,6 +235,13 @@ QString LinuxSessionFunctions::currentSessionType() const +bool LinuxSessionFunctions::currentSessionIsRemote() const +{ + return isRemote( currentSessionPath() ); +} + + + QString LinuxSessionFunctions::currentSessionPath() { const auto xdgSessionId = QProcessEnvironment::systemEnvironment().value( xdgSessionIdEnvVarName() ); diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 80ae10c4c..4e61d8dae 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -82,6 +82,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions SessionId currentSessionId() override; QString currentSessionType() const override; + bool currentSessionIsRemote() const override; static QStringList listSessions(); diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index c96ead4e3..867827184 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -50,3 +50,10 @@ QString WindowsSessionFunctions::currentSessionType() const return QStringLiteral("rdp"); } + + + +bool WindowsSessionFunctions::currentSessionIsRemote() const +{ + return WtsSessionManager::isRemote( WtsSessionManager::currentSession() ); +} diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index 7a4682d31..3132b091a 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -34,5 +34,6 @@ class WindowsSessionFunctions : public PlatformSessionFunctions SessionId currentSessionId() override; QString currentSessionType() const override; + bool currentSessionIsRemote() const override; }; From 99611e1964e45ac01d335f63caddbd022deecc80 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Apr 2021 15:39:16 +0200 Subject: [PATCH 0871/1765] AccessControl: add condition AccessedUserLoggedInLocally --- .../src/AccessControlRuleEditDialog.cpp | 2 + .../src/AccessControlRuleEditDialog.ui | 46 +++++++++++++++++++ core/src/AccessControlProvider.cpp | 12 +++++ core/src/AccessControlRule.h | 1 + 4 files changed, 61 insertions(+) diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index e268e26c8..cfa004539 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -94,6 +94,7 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule loadCondition ( ui->isLocalHostAccess, ui->invertIsLocalHostAccess, AccessControlRule::Condition::AccessFromLocalHost ); loadCondition ( ui->isSameUserAccess, ui->invertIsSameUserAccess, AccessControlRule::Condition::AccessFromSameUser ); loadCondition ( ui->isUserConnected, ui->invertIsUserConnected, AccessControlRule::Condition::AccessFromAlreadyConnectedUser ); + loadCondition ( ui->isAccessedUserLoggedInLocally, ui->invertIsAccessedUserLoggedInLocally, AccessControlRule::Condition::AccessedUserLoggedInLocally ); loadCondition ( ui->isNoUserLoggedInLocally, ui->invertIsNoUserLoggedInLocally, AccessControlRule::Condition::NoUserLoggedInLocally ); loadCondition ( ui->isNoUserLoggedInRemotely, ui->invertIsNoUserLoggedInRemotely, AccessControlRule::Condition::NoUserLoggedInRemotely ); @@ -170,6 +171,7 @@ void AccessControlRuleEditDialog::accept() saveCondition( ui->isLocalHostAccess, ui->invertIsLocalHostAccess, AccessControlRule::Condition::AccessFromLocalHost ); saveCondition( ui->isSameUserAccess, ui->invertIsSameUserAccess, AccessControlRule::Condition::AccessFromSameUser ); saveCondition( ui->isUserConnected, ui->invertIsUserConnected, AccessControlRule::Condition::AccessFromAlreadyConnectedUser ); + saveCondition( ui->isAccessedUserLoggedInLocally, ui->invertIsAccessedUserLoggedInLocally, AccessControlRule::Condition::AccessedUserLoggedInLocally ); saveCondition( ui->isNoUserLoggedInLocally, ui->invertIsNoUserLoggedInLocally, AccessControlRule::Condition::NoUserLoggedInLocally ); saveCondition( ui->isNoUserLoggedInRemotely, ui->invertIsNoUserLoggedInRemotely, AccessControlRule::Condition::NoUserLoggedInRemotely ); diff --git a/configurator/src/AccessControlRuleEditDialog.ui b/configurator/src/AccessControlRuleEditDialog.ui index 2d7b709b7..e02692a8a 100644 --- a/configurator/src/AccessControlRuleEditDialog.ui +++ b/configurator/src/AccessControlRuleEditDialog.ui @@ -408,6 +408,34 @@ + + + + + + User being accessed + + + + + + + false + + + + is logged in locally + + + + + is logged in remotely + + + + + + @@ -567,6 +595,8 @@ invertIsSameUserAccess isUserConnected invertIsUserConnected + isAccessedUserLoggedInLocally + invertIsAccessedUserLoggedInLocally isNoUserLoggedInLocally invertIsNoUserLoggedInLocally isNoUserLoggedInRemotely @@ -882,6 +912,22 @@ + + isAccessedUserLoggedInLocally + toggled(bool) + invertIsAccessedUserLoggedInLocally + setEnabled(bool) + + + 137 + 665 + + + 590 + 665 + + + diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index aa338fbd5..6b4dcb8b2 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -33,6 +33,7 @@ #include "VeyonConfiguration.h" #include "VeyonCore.h" #include "PlatformPluginInterface.h" +#include "PlatformSessionFunctions.h" #include "PlatformUserFunctions.h" @@ -455,6 +456,17 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, } } + if( rule.isConditionEnabled( AccessControlRule::Condition::AccessedUserLoggedInLocally ) ) + { + condition = AccessControlRule::Condition::AccessedUserLoggedInLocally; + const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); + + if( VeyonCore::platform().sessionFunctions().currentSessionIsRemote() != matchResult ) + { + return false; + } + } + if( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally ) ) { condition = AccessControlRule::Condition::NoUserLoggedInLocally; diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index 9399c0ef4..dd922efbb 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -56,6 +56,7 @@ class VEYON_CORE_EXPORT AccessControlRule AccessFromAlreadyConnectedUser, NoUserLoggedInLocally, NoUserLoggedInRemotely, + AccessedUserLoggedInLocally, AuthenticationMethod } ; From fc42c25ffe0220a373fc5e8ec18d5437503f714d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 08:57:55 +0200 Subject: [PATCH 0872/1765] AccessControl: drop rule-global condition inversion There's no need for the legacy rule-global inversion of conditions any longer since each condition can be inverted individually. If the InvertConditions field is found in rules saved by Veyon 4, manually invert all conditions for full compatibility. --- .../src/AccessControlRuleEditDialog.cpp | 2 - .../src/AccessControlRuleEditDialog.ui | 46 +++++-------------- core/src/AccessControlProvider.cpp | 34 +++++--------- core/src/AccessControlRule.cpp | 21 +++++---- core/src/AccessControlRule.h | 11 ----- 5 files changed, 36 insertions(+), 78 deletions(-) diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index cfa004539..66ade9ef6 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -74,7 +74,6 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule // load general condition processing settings ui->ignoreConditionsCheckBox->setChecked( rule.areConditionsIgnored() ); - ui->invertConditionsCheckBox->setChecked( rule.areAllConditionsInverted() ); // load condition states const auto loadCondition = [&rule]( QCheckBox* checkBox, @@ -132,7 +131,6 @@ void AccessControlRuleEditDialog::accept() // save general condition processing settings m_rule.setConditionsIgnored( ui->ignoreConditionsCheckBox->isChecked() ); - m_rule.setAllConditionsInverted( ui->invertConditionsCheckBox->isChecked() ); // save conditions m_rule.clearParameters(); diff --git a/configurator/src/AccessControlRuleEditDialog.ui b/configurator/src/AccessControlRuleEditDialog.ui index e02692a8a..079a9712f 100644 --- a/configurator/src/AccessControlRuleEditDialog.ui +++ b/configurator/src/AccessControlRuleEditDialog.ui @@ -12,13 +12,6 @@ General - - - - enter a short name for the rule here - - - @@ -26,13 +19,6 @@ - - - - enter a description for the rule here - - - @@ -40,10 +26,17 @@ - - - - Invert all conditions ("is/has" interpreted as "is/has not") + + + + enter a description for the rule here + + + + + + + enter a short name for the rule here @@ -573,7 +566,6 @@ ruleNameLineEdit ruleDescriptionLineEdit ignoreConditionsCheckBox - invertConditionsCheckBox isMemberOfGroup isMemberOfGroupSubject invertIsMemberOfGroup @@ -720,22 +712,6 @@ - - ignoreConditionsCheckBox - toggled(bool) - invertConditionsCheckBox - setDisabled(bool) - - - 548 - 179 - - - 548 - 225 - - - isAuthenticatedViaMethod toggled(bool) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 6b4dcb8b2..e28e8c0de 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -358,12 +358,11 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::AuthenticationMethod ) ) { condition = AccessControlRule::Condition::AuthenticationMethod; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); const auto allowedAuthMethod = Plugin::Uid( rule.argument( AccessControlRule::Condition::AuthenticationMethod ) ); if( authMethodUid.isNull() || allowedAuthMethod.isNull() || - ( authMethodUid == allowedAuthMethod ) != matchResult ) + ( authMethodUid == allowedAuthMethod ) == rule.isConditionInverted(condition) ) { return false; } @@ -372,14 +371,13 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::MemberOfGroup ) ) { condition = AccessControlRule::Condition::MemberOfGroup; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); const auto condition = AccessControlRule::Condition::MemberOfGroup; const auto user = lookupSubject( rule.subject( condition ), accessingUser, {}, localUser, {} ); const auto group = rule.argument( condition ); if( user.isEmpty() || group.isEmpty() || - isMemberOfUserGroup( user, group ) != matchResult ) + isMemberOfUserGroup( user, group ) == rule.isConditionInverted(condition) ) { return false; } @@ -388,10 +386,9 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::GroupsInCommon ) ) { condition = AccessControlRule::Condition::GroupsInCommon; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); if( accessingUser.isEmpty() || localUser.isEmpty() || - haveGroupsInCommon( accessingUser, localUser ) != matchResult ) + haveGroupsInCommon( accessingUser, localUser ) == rule.isConditionInverted(condition) ) { return false; } @@ -400,12 +397,12 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::LocatedAt ) ) { condition = AccessControlRule::Condition::LocatedAt; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); + const auto computer = lookupSubject( rule.subject( condition ), {}, accessingComputer, {}, localComputer ); const auto location = rule.argument( condition ); if( computer.isEmpty() || location.isEmpty() || - isLocatedAt( computer, location ) != matchResult ) + isLocatedAt( computer, location ) == rule.isConditionInverted(condition) ) { return false; } @@ -414,10 +411,9 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::LocationsInCommon ) ) { condition = AccessControlRule::Condition::LocationsInCommon; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); if( accessingComputer.isEmpty() || localComputer.isEmpty() || - haveSameLocations( accessingComputer, localComputer ) != matchResult ) + haveSameLocations( accessingComputer, localComputer ) == rule.isConditionInverted(condition) ) { return false; } @@ -426,9 +422,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromLocalHost ) ) { condition = AccessControlRule::Condition::AccessFromLocalHost; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); - if( isLocalHost( accessingComputer ) != matchResult ) + if( isLocalHost( accessingComputer ) == rule.isConditionInverted(condition) ) { return false; } @@ -437,9 +432,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromSameUser ) ) { condition = AccessControlRule::Condition::AccessFromSameUser; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); - if( isLocalUser( accessingUser, localUser ) != matchResult ) + if( isLocalUser( accessingUser, localUser ) == rule.isConditionInverted(condition) ) { return false; } @@ -448,9 +442,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::AccessFromAlreadyConnectedUser ) ) { condition = AccessControlRule::Condition::AccessFromAlreadyConnectedUser; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); - if( connectedUsers.contains( accessingUser ) != matchResult ) + if( connectedUsers.contains( accessingUser ) == rule.isConditionInverted(condition) ) { return false; } @@ -459,9 +452,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::AccessedUserLoggedInLocally ) ) { condition = AccessControlRule::Condition::AccessedUserLoggedInLocally; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); - if( VeyonCore::platform().sessionFunctions().currentSessionIsRemote() != matchResult ) + if( VeyonCore::platform().sessionFunctions().currentSessionIsRemote() == rule.isConditionInverted(condition) ) { return false; } @@ -470,9 +462,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInLocally ) ) { condition = AccessControlRule::Condition::NoUserLoggedInLocally; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); - if( isNoUserLoggedInLocally() != matchResult ) + if( isNoUserLoggedInLocally() == rule.isConditionInverted(condition) ) { return false; } @@ -481,9 +472,8 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, if( rule.isConditionEnabled( AccessControlRule::Condition::NoUserLoggedInRemotely ) ) { condition = AccessControlRule::Condition::NoUserLoggedInRemotely; - const auto matchResult = rule.areAllConditionsInverted() == rule.isConditionInverted( condition ); - if( isNoUserLoggedInRemotely() != matchResult ) + if( isNoUserLoggedInRemotely() == rule.isConditionInverted(condition) ) { return false; } diff --git a/core/src/AccessControlRule.cpp b/core/src/AccessControlRule.cpp index be2d1c587..8075c06cc 100644 --- a/core/src/AccessControlRule.cpp +++ b/core/src/AccessControlRule.cpp @@ -23,6 +23,7 @@ */ #include +#include #include "AccessControlRule.h" @@ -30,7 +31,6 @@ AccessControlRule::AccessControlRule() : m_name(), m_description(), m_action( Action::None ), - m_invertConditions( false ), m_ignoreConditions( false ) { } @@ -42,18 +42,16 @@ AccessControlRule::AccessControlRule(const AccessControlRule &other) : m_description( other.description() ), m_action( other.action() ), m_parameters( other.parameters() ), - m_invertConditions( other.areAllConditionsInverted() ), m_ignoreConditions( other.areConditionsIgnored() ) { } -AccessControlRule::AccessControlRule(const QJsonValue &jsonValue) : +AccessControlRule::AccessControlRule( const QJsonValue& jsonValue ) : m_name(), m_description(), m_action( Action::None ), - m_invertConditions( false ), m_ignoreConditions( false ) { if( jsonValue.isObject() ) @@ -63,10 +61,9 @@ AccessControlRule::AccessControlRule(const QJsonValue &jsonValue) : m_name = json[QStringLiteral("Name")].toString(); m_description = json[QStringLiteral("Description")].toString(); m_action = static_cast( json[QStringLiteral("Action")].toInt() ); - m_invertConditions = json[QStringLiteral("InvertConditions")].toBool(); m_ignoreConditions = json[QStringLiteral("IgnoreConditions")].toBool(); - auto parameters = json[QStringLiteral("Parameters")].toArray(); + const auto parameters = json[QStringLiteral("Parameters")].toArray(); for( auto parametersValue : parameters ) { @@ -78,6 +75,16 @@ AccessControlRule::AccessControlRule(const QJsonValue &jsonValue) : m_parameters[condition].subject = static_cast( parametersObj[QStringLiteral("Subject")].toInt() ); m_parameters[condition].argument = parametersObj[QStringLiteral("Argument")].toString(); } + + // migrate global inversion setting from Veyon 4 + if( json[QStringLiteral("InvertConditions")].toBool() ) + { + const auto conditionCount = QMetaEnum::fromType().keyCount(); + for( int i = 0; i < conditionCount; ++i ) + { + m_parameters[Condition(i)].inverted ^= true; + } + } } } @@ -89,7 +96,6 @@ AccessControlRule& AccessControlRule::operator=( const AccessControlRule& other m_description = other.description(); m_action = other.action(); m_parameters = other.parameters(); - m_invertConditions = other.areAllConditionsInverted(); m_ignoreConditions = other.areConditionsIgnored(); return *this; @@ -104,7 +110,6 @@ QJsonObject AccessControlRule::toJson() const json[QStringLiteral("Name")] = m_name; json[QStringLiteral("Description")] = m_description; json[QStringLiteral("Action")] = static_cast( m_action ); - json[QStringLiteral("InvertConditions")] = m_invertConditions; json[QStringLiteral("IgnoreConditions")] = m_ignoreConditions; QJsonArray parameters; diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index dd922efbb..dbdf4ea73 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -149,16 +149,6 @@ class VEYON_CORE_EXPORT AccessControlRule m_ignoreConditions = ignored; } - bool areAllConditionsInverted() const - { - return m_invertConditions; - } - - void setAllConditionsInverted( bool inverted ) - { - m_invertConditions = inverted; - } - bool isConditionEnabled( Condition condition ) const { return m_parameters.value( condition ).enabled; @@ -202,7 +192,6 @@ class VEYON_CORE_EXPORT AccessControlRule QString m_description; Action m_action; ConditionParameterMap m_parameters; - bool m_invertConditions; bool m_ignoreConditions; } ; From 2db3a95355341f49dc864612601d9cf8b8619a40 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 11:37:03 +0200 Subject: [PATCH 0873/1765] Feature: rename Flag::Internal to Flag::Meta --- configurator/src/MasterConfigurationPage.cpp | 4 ++-- core/src/Feature.h | 2 +- master/src/ComputerMonitoringWidget.cpp | 2 +- master/src/MainWindow.cpp | 2 +- plugins/demo/DemoFeaturePlugin.cpp | 4 ++-- plugins/screenlock/ScreenLockFeaturePlugin.cpp | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index e264e926a..f082820aa 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -141,7 +141,7 @@ void MasterConfigurationPage::populateFeatureComboBox() for( const auto& feature : m_featureManager.features() ) { if( feature.testFlag( Feature::Master ) && - feature.testFlag( Feature::Internal ) == false ) + feature.testFlag( Feature::Meta ) == false ) { ui->computerDoubleClickFeature->addItem( QIcon( feature.iconUrl() ), feature.displayName(), @@ -163,7 +163,7 @@ void MasterConfigurationPage::updateFeatureLists() for( const auto& feature : qAsConst( m_featureManager.features() ) ) { if( feature.testFlag( Feature::Master ) == false || - feature.testFlag( Feature::Internal ) || + feature.testFlag( Feature::Meta ) || feature == VeyonCore::builtinFeatures().monitoringMode().feature() ) { continue; diff --git a/core/src/Feature.h b/core/src/Feature.h index 7ca479f33..264cca44b 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -43,7 +43,7 @@ class VEYON_CORE_EXPORT Feature Mode = 0x0001, Action = 0x0002, Session = 0x0004, - Internal = 0x0008, + Meta = 0x0008, Option = 0x0010, Checked = 0x0020, Master = 0x0100, diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index c9e1bb762..9aade90da 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -197,7 +197,7 @@ void ComputerMonitoringWidget::populateFeatureMenu( const ComputerControlInterf for( const auto& feature : master()->features() ) { - if( feature.testFlag( Feature::Internal ) ) + if( feature.testFlag( Feature::Meta ) ) { continue; } diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 47580e2f0..17213e931 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -416,7 +416,7 @@ void MainWindow::addFeaturesToToolBar() { for( const auto& feature : m_master.features() ) { - if( feature.testFlag( Feature::Internal ) ) + if( feature.testFlag( Feature::Meta ) ) { continue; } diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index a4a511e32..d1a999290 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -50,11 +50,11 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : tr( "Share your screen or allow a user to share his screen with other users." ), QStringLiteral(":/demo/demo.png") ), m_demoClientFullScreenFeature( QStringLiteral( "FullScreenDemo" ), - Feature::Internal | Feature::AllComponents, + Feature::Meta | Feature::AllComponents, Feature::Uid( "7b6231bd-eb89-45d3-af32-f70663b2f878" ), {}, tr("Full screen demo"), {}, {} ), m_demoClientWindowFeature( QStringLiteral( "WindowDemo" ), - Feature::Internal | Feature::AllComponents, + Feature::Meta | Feature::AllComponents, Feature::Uid( "ae45c3db-dc2e-4204-ae8b-374cdab8c62c" ), {}, tr("Window demo"), {}, {} ), m_shareOwnScreenFullScreenFeature( QStringLiteral( "ShareOwnScreenFullScreen" ), diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.cpp b/plugins/screenlock/ScreenLockFeaturePlugin.cpp index af3f35eac..f3b19e5bb 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.cpp +++ b/plugins/screenlock/ScreenLockFeaturePlugin.cpp @@ -44,7 +44,7 @@ ScreenLockFeaturePlugin::ScreenLockFeaturePlugin( QObject* parent ) : "the screens are blacked." ), QStringLiteral(":/screenlock/system-lock-screen.png") ), m_lockInputDevicesFeature( QStringLiteral( "InputDevicesLock" ), - Feature::Mode | Feature::AllComponents | Feature::Internal, + Feature::Mode | Feature::AllComponents | Feature::Meta, Feature::Uid( "e4a77879-e544-4fec-bc18-e534f33b934c" ), {}, tr( "Lock input devices" ), tr( "Unlock input devices" ), From 7374d9ae0f332c4f66476f09faad4411d1e6610a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 11:37:43 +0200 Subject: [PATCH 0874/1765] FeatureProviderInterface: add metaFeature() This method shall return the meta feature used internally by a certain regular feature. --- core/src/FeatureProviderInterface.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index 78c04c562..fbb94a0d5 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -69,6 +69,11 @@ class VEYON_CORE_EXPORT FeatureProviderInterface return false; } + virtual Feature::Uid metaFeature( Feature::Uid ) const + { + return {}; + } + template static QString argToString( T item ) { From 40cd7c5eefff2f536e5ad8a0e098282b9d6ca037 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 11:39:03 +0200 Subject: [PATCH 0875/1765] DemoFeaturePlugin: implement metaFeature() --- plugins/demo/DemoFeaturePlugin.cpp | 18 ++++++++++++++++++ plugins/demo/DemoFeaturePlugin.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index d1a999290..6def30fc1 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -115,6 +115,24 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : +Feature::Uid DemoFeaturePlugin::metaFeature( Feature::Uid featureUid ) const +{ + if( featureUid == m_shareOwnScreenFullScreenFeature.uid() || + featureUid == m_shareUserScreenFullScreenFeature.uid() ) + { + return m_demoClientFullScreenFeature.uid(); + } + else if( featureUid == m_shareOwnScreenWindowFeature.uid() || + featureUid == m_shareUserScreenWindowFeature.uid() ) + { + return m_demoClientWindowFeature.uid(); + } + + return FeatureProviderInterface::metaFeature( featureUid ); +} + + + bool DemoFeaturePlugin::controlFeature( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 30410356f..01bbae105 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -99,6 +99,8 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf return m_features; } + Feature::Uid metaFeature( Feature::Uid featureUid ) const override; + bool controlFeature( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ) override; From 5f560d8a9e59b9b379278bb73f0577494829bcc9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 11:39:34 +0200 Subject: [PATCH 0876/1765] DemoFeaturePlugin: fix duplicate feature UIDs --- plugins/demo/DemoFeaturePlugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 6def30fc1..3eb7d5c1f 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -59,7 +59,7 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : {}, tr("Window demo"), {}, {} ), m_shareOwnScreenFullScreenFeature( QStringLiteral( "ShareOwnScreenFullScreen" ), Feature::Mode | Feature::AllComponents, - Feature::Uid( "7b6231bd-eb89-45d3-af32-f70663b2f878" ), + Feature::Uid( "07b375e1-8ab6-4b48-bcb7-75fb3d56035b" ), m_demoFeature.uid(), tr( "Share your own screen in fullscreen mode" ), {}, tr( "In this mode your screen is being displayed in " @@ -68,7 +68,7 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : QStringLiteral(":/demo/presentation-fullscreen.png") ), m_shareOwnScreenWindowFeature( QStringLiteral( "ShareOwnScreenWindow" ), Feature::Mode | Feature::AllComponents, - Feature::Uid( "ae45c3db-dc2e-4204-ae8b-374cdab8c62c" ), + Feature::Uid( "68c55fb9-127e-4c9f-9c90-28b998bf1a47" ), m_demoFeature.uid(), tr( "Share your own screen in a window" ), {}, tr( "In this mode your screen being displayed in a " From 2956cc7cd52666221bfcd01cb5f47fadf43390e2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 11:41:11 +0200 Subject: [PATCH 0877/1765] FeatureManager: add metaFeatureUid() This new method resolves the meta UID for a certain feature UID. --- core/src/FeatureManager.cpp | 18 ++++++++++++++++++ core/src/FeatureManager.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 42acfd6c4..46cfe9dbd 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -92,6 +92,24 @@ const Feature& FeatureManager::feature( Feature::Uid featureUid ) const +Feature::Uid FeatureManager::metaFeatureUid( Feature::Uid featureUid ) const +{ + for( const auto& featureInterface : m_featurePluginInterfaces ) + { + for( const auto& feature : featureInterface->featureList() ) + { + if( feature.uid() == featureUid ) + { + return featureInterface->metaFeature( featureUid ); + } + } + } + + return {}; +} + + + Plugin::Uid FeatureManager::pluginUid( const Feature& feature ) const { for( auto pluginObject : m_pluginObjects ) diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index be5a96435..8c6dd9886 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -50,6 +50,8 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject const Feature& feature( Feature::Uid featureUid ) const; + Feature::Uid metaFeatureUid( Feature::Uid featureUid ) const; + Plugin::Uid pluginUid( const Feature& feature ) const; void controlFeature( Feature::Uid featureUid, From fdfbae6f466aac4b3c75c95459e21fc1d5581589 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 11:43:42 +0200 Subject: [PATCH 0878/1765] VeyonMaster: add metaFeaturesUids() --- master/src/VeyonMaster.cpp | 19 +++++++++++++++++++ master/src/VeyonMaster.h | 1 + 2 files changed, 20 insertions(+) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index a49b90ec6..b6a429492 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -149,6 +149,25 @@ FeatureUidList VeyonMaster::subFeaturesUids( Feature::Uid parentFeatureUid ) con +FeatureUidList VeyonMaster::metaFeaturesUids( const FeatureUidList& featureUids ) const +{ + FeatureUidList metaFeatureUids; + metaFeatureUids.reserve( featureUids.size() ); + + for( const auto& featureUid : featureUids ) + { + const auto metaFeatureUid = m_featureManager->metaFeatureUid( featureUid ); + if( metaFeatureUid.isNull() == false ) + { + metaFeatureUids.append( metaFeatureUid ); + } + } + + return metaFeatureUids; +} + + + FeatureList VeyonMaster::modeFeatures() const { FeatureList featureList; diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 77284797a..64b2576e3 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -98,6 +98,7 @@ class VeyonMaster : public VeyonMasterInterface FeatureList subFeatures( Feature::Uid parentFeatureUid ) const; FeatureUidList subFeaturesUids( Feature::Uid parentFeatureUid ) const; + FeatureUidList metaFeaturesUids( const FeatureUidList& featureUids ) const; FeatureList modeFeatures() const; From 2e42708996c6ef49fd9c7e192845e5ce35a14ac7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 11:44:26 +0200 Subject: [PATCH 0879/1765] ComputerMonitoringView: also check for active meta features --- master/src/ComputerMonitoringView.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index cde47215b..74fb6655a 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -222,7 +222,8 @@ void ComputerMonitoringView::runFeature( const Feature& feature ) bool ComputerMonitoringView::isFeatureOrSubFeatureActive( const ComputerControlInterfaceList& computerControlInterfaces, Feature::Uid featureUid ) const { - const auto featureList = FeatureUidList{ featureUid } + m_master->subFeaturesUids( featureUid ); + auto featureList = FeatureUidList{ featureUid } + m_master->subFeaturesUids( featureUid ); + featureList.append( m_master->metaFeaturesUids( featureList ) ); for( const auto& controlInterface : computerControlInterfaces ) { From 479f2789dd4d1b5d7abda1ababa80be9163631a5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 11:46:13 +0200 Subject: [PATCH 0880/1765] VeyonMaster: don't stop other mode features This conflicts with the meta feature mapping in the demo plugin and breaks the demo mode. --- master/src/VeyonMaster.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index b6a429492..7604275ab 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -276,17 +276,6 @@ void VeyonMaster::enforceDesignatedMode( const QModelIndex& index ) if( controlInterface ) { auto designatedModeFeature = m_featureManager->feature( controlInterface->designatedModeFeature() ); - - // stop all other active mode feature - const auto features = modeFeatures(); - for( const auto& currentFeature : features ) - { - if( currentFeature != designatedModeFeature ) - { - featureManager().stopFeature( *this, currentFeature, { controlInterface } ); - } - } - if( designatedModeFeature != VeyonCore::builtinFeatures().monitoringMode().feature() ) { featureManager().startFeature( *this, designatedModeFeature, { controlInterface } ); From 00eaab74cdc002df499f9508ba087f5cfb30cff3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 11:47:28 +0200 Subject: [PATCH 0881/1765] VeyonMaster: only start mode feature if not active --- master/src/VeyonMaster.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 7604275ab..5232bd57e 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -275,10 +275,13 @@ void VeyonMaster::enforceDesignatedMode( const QModelIndex& index ) auto controlInterface = m_computerControlListModel->computerControlInterface( index ); if( controlInterface ) { - auto designatedModeFeature = m_featureManager->feature( controlInterface->designatedModeFeature() ); - if( designatedModeFeature != VeyonCore::builtinFeatures().monitoringMode().feature() ) + const auto designatedModeFeature = controlInterface->designatedModeFeature(); + + if( designatedModeFeature != VeyonCore::builtinFeatures().monitoringMode().feature().uid() && + controlInterface->activeFeatures().contains( designatedModeFeature ) == false && + controlInterface->activeFeatures().contains( m_featureManager->metaFeatureUid(designatedModeFeature) ) == false ) { - featureManager().startFeature( *this, designatedModeFeature, { controlInterface } ); + featureManager().startFeature( *this, m_featureManager->feature(designatedModeFeature), { controlInterface } ); } } } From c8e141bb1a1ad32d3cdde29b7757470c988f7d05 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 13:36:44 +0200 Subject: [PATCH 0882/1765] AccessControlRuleEditDialog: improve translatability --- .../src/AccessControlRuleEditDialog.cpp | 4 +- .../src/AccessControlRuleEditDialog.ui | 104 ++++-------------- 2 files changed, 26 insertions(+), 82 deletions(-) diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index 66ade9ef6..db508f53c 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -35,8 +35,8 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule m_subjectNameMap( { { AccessControlRule::Subject::AccessingUser, tr( "Accessing user" ) }, { AccessControlRule::Subject::AccessingComputer, tr( "Accessing computer" ) }, -{ AccessControlRule::Subject::LocalUser, tr( "Local (logged on) user" ) }, -{ AccessControlRule::Subject::LocalComputer, tr( "Local computer" ) }, +{ AccessControlRule::Subject::LocalUser, tr( "User being accessed" ) }, +{ AccessControlRule::Subject::LocalComputer, tr( "Computer being accessed" ) }, } ) { ui->setupUi(this); diff --git a/configurator/src/AccessControlRuleEditDialog.ui b/configurator/src/AccessControlRuleEditDialog.ui index 079a9712f..ce5313a0e 100644 --- a/configurator/src/AccessControlRuleEditDialog.ui +++ b/configurator/src/AccessControlRuleEditDialog.ui @@ -57,7 +57,7 @@ - + @@ -82,23 +82,16 @@ - is + is member of group - is not + is not member of group - - - - member of group - - - @@ -115,7 +108,7 @@ - + @@ -140,23 +133,16 @@ - is + is located at - is not + is not located at - - - - located at - - - @@ -173,7 +159,7 @@ - + @@ -194,27 +180,20 @@ - are located + are located at the same location - are not located + are not located the same location - - - - at the same location - - - - + @@ -229,27 +208,20 @@ - is + is local computer - is not + is not local computer - - - - localhost - - - - + @@ -264,23 +236,16 @@ - is + is authenticated via - is not + is not authenticated via - - - - authenticated via - - - @@ -291,7 +256,7 @@ - + @@ -306,27 +271,20 @@ - has one or more + has one or more groups in common with user being accessed - has no + has no groups in common with user being accessed - - - - groups in common with user being accessed - - - - + @@ -347,27 +305,20 @@ - equals + equals user being accessed - is different from + is different from user being accessed - - - - user being accessed - - - - + @@ -382,23 +333,16 @@ - is already + is already connected - is not + is not connected - - - - connected - - - From 0fd065fa2ec601deab4e3a372fc8d49b3e612339 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Apr 2021 13:48:28 +0200 Subject: [PATCH 0883/1765] Update translations --- translations/veyon.ts | 108 ++++++-- translations/veyon_ar.ts | 112 +++++++-- translations/veyon_bg.ts | 134 +++++++--- translations/veyon_ca_ES.ts | 108 ++++++-- translations/veyon_cs.ts | 134 +++++++--- translations/veyon_de.ts | 143 ++++++++--- translations/veyon_el.ts | 150 +++++++---- translations/veyon_es_ES.ts | 143 ++++++++--- translations/veyon_et.ts | 149 +++++++---- translations/veyon_fa.ts | 128 +++++++--- translations/veyon_fr.ts | 143 ++++++++--- translations/veyon_he.ts | 132 +++++++--- translations/veyon_hu.ts | 134 +++++++--- translations/veyon_id.ts | 132 +++++++--- translations/veyon_it.ts | 143 ++++++++--- translations/veyon_ja.ts | 130 +++++++--- translations/veyon_ko.ts | 134 +++++++--- translations/veyon_lt.ts | 194 +++++++++----- translations/veyon_lv.ts | 124 ++++++--- translations/veyon_mn.ts | 108 ++++++-- translations/veyon_nl.ts | 130 +++++++--- translations/veyon_no_NO.ts | 112 +++++++-- translations/veyon_pl.ts | 174 ++++++++----- translations/veyon_pt_BR.ts | 490 ++++++++++++++++++++---------------- translations/veyon_pt_PT.ts | 122 ++++++--- translations/veyon_ru.ts | 253 ++++++++++++------- translations/veyon_sl.ts | 130 +++++++--- translations/veyon_sr.ts | 134 +++++++--- translations/veyon_sv.ts | 132 +++++++--- translations/veyon_th.ts | 162 ++++++++---- translations/veyon_tr.ts | 136 +++++++--- translations/veyon_uk.ts | 143 ++++++++--- translations/veyon_vi.ts | 128 +++++++--- translations/veyon_zh_CN.ts | 134 +++++++--- translations/veyon_zh_TW.ts | 149 +++++++---- 35 files changed, 3661 insertions(+), 1551 deletions(-) diff --git a/translations/veyon.ts b/translations/veyon.ts index 70274b2a9..ce50a968c 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -176,91 +176,143 @@ If you're interested in translating Veyon into your local or another langua - Invert all conditions ("is/has" interpreted as "is/has not") + Conditions - Conditions + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - is member of group + Action - Accessing computer is localhost + Allow access - Accessing user is logged on user + Deny access - Accessing user is already connected + Ask logged on user for permission - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. + None (rule disabled) - Action + Accessing user - Allow access + Accessing computer - Deny access + Always process rule and ignore conditions - Ask logged on user for permission + Accessing computer and local computer - None (rule disabled) + User being accessed - Accessing user + is logged in locally - Accessing computer + is logged in remotely - Local (logged on) user + No user is logged in locally - Local computer + One or multiple users are logged in locally - Always process rule and ignore conditions + No user is logged in remotely - No user logged on + One or multiple users are logged in remotely - Accessing user has one or more groups in common with local (logged on) user + is located at - Accessing computer and local computer are at the same location + is not located at - is located at + are located at the same location + + + + are not located the same location - Authenticated via method + is member of group + + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2765,11 +2817,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_ar.ts b/translations/veyon_ar.ts index 1d7fd4de1..1cfd04747 100644 --- a/translations/veyon_ar.ts +++ b/translations/veyon_ar.ts @@ -174,91 +174,143 @@ If you're interested in translating Veyon into your local or another langua - Invert all conditions ("is/has" interpreted as "is/has not") + Conditions + حالات + + + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - Conditions - حالات + Action + - is member of group - هو عضو في المجموعة + Allow access + - Accessing computer is localhost + Deny access - Accessing user is logged on user + Ask logged on user for permission - Accessing user is already connected + None (rule disabled) - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. + Accessing user - Action + Accessing computer - Allow access + Always process rule and ignore conditions - Deny access + Accessing computer and local computer - Ask logged on user for permission + User being accessed - None (rule disabled) + is logged in locally - Accessing user + is logged in remotely - Accessing computer + No user is logged in locally - Local (logged on) user + One or multiple users are logged in locally - Local computer + No user is logged in remotely - Always process rule and ignore conditions + One or multiple users are logged in remotely - No user logged on + is located at - Accessing user has one or more groups in common with local (logged on) user + is not located at - Accessing computer and local computer are at the same location + are located at the same location - is located at + are not located the same location + + + + is member of group + هو عضو في المجموعة + + + is not member of group - Authenticated via method + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2763,11 +2815,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_bg.ts b/translations/veyon_bg.ts index 3afab2c5a..07f9634b1 100644 --- a/translations/veyon_bg.ts +++ b/translations/veyon_bg.ts @@ -175,30 +175,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: Описание на правилото: - - Invert all conditions ("is/has" interpreted as "is/has not") - Invert all conditions ("is/has" interpreted as "is/has not") - Conditions Условия - - is member of group - е член на групата - - - Accessing computer is localhost - Достъпът до компютъра е localhost - - - Accessing user is logged on user - Достъп като влезлия потребител - - - Accessing user is already connected - Вече сте свързан - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. @@ -232,35 +212,107 @@ If you're interested in translating Veyon into your local or another langua Достъп до компютър - Local (logged on) user - Локален (влязъл) потребител + Always process rule and ignore conditions + Винаги използвай правилото и игнорирай условията - Local computer - Локален компютър + Accessing computer and local computer + - Always process rule and ignore conditions - Винаги използвай правилото и игнорирай условията + User being accessed + - No user logged on - Няма потребител + is logged in locally + + + + is logged in remotely + - Accessing user has one or more groups in common with local (logged on) user - Accessing user has one or more groups in common with local (logged on) user + No user is logged in locally + - Accessing computer and local computer are at the same location - Accessing computer and local computer are at the same location + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at is located at - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + е член на групата + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2787,12 +2839,20 @@ The public key is used on client computers to authenticate incoming connection r User authentication - Session management - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login + User login - Display manager users - Display manager users + Login key sequence + diff --git a/translations/veyon_ca_ES.ts b/translations/veyon_ca_ES.ts index 7545c9b24..c6780d9a0 100644 --- a/translations/veyon_ca_ES.ts +++ b/translations/veyon_ca_ES.ts @@ -174,91 +174,143 @@ If you're interested in translating Veyon into your local or another langua - Invert all conditions ("is/has" interpreted as "is/has not") + Conditions - Conditions + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - is member of group + Action - Accessing computer is localhost + Allow access - Accessing user is logged on user + Deny access - Accessing user is already connected + Ask logged on user for permission - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. + None (rule disabled) - Action + Accessing user - Allow access + Accessing computer - Deny access + Always process rule and ignore conditions - Ask logged on user for permission + Accessing computer and local computer - None (rule disabled) + User being accessed - Accessing user + is logged in locally - Accessing computer + is logged in remotely - Local (logged on) user + No user is logged in locally - Local computer + One or multiple users are logged in locally - Always process rule and ignore conditions + No user is logged in remotely - No user logged on + One or multiple users are logged in remotely - Accessing user has one or more groups in common with local (logged on) user + is located at - Accessing computer and local computer are at the same location + is not located at - is located at + are located at the same location + + + + are not located the same location - Authenticated via method + is member of group + + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2763,11 +2815,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_cs.ts b/translations/veyon_cs.ts index dadf7a4ed..da964d769 100644 --- a/translations/veyon_cs.ts +++ b/translations/veyon_cs.ts @@ -175,30 +175,10 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně Rule description: Popis pravidla: - - Invert all conditions ("is/has" interpreted as "is/has not") - Převrátit všechny podmínky („je/má“ si vykládat jako není/nemá) - Conditions Podmínky - - is member of group - je členem skupiny - - - Accessing computer is localhost - Přistupující počítač přistupuje sám na sebe - - - Accessing user is logged on user - Přistupující uživatel přistupuje sám na sebe - - - Accessing user is already connected - Přistupující uživatel je už připojený - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Pokud je zapnutá více než jedna, pak aby se pravidlo uplatnilo je třeba, aby byly splněné všechny podmínky (logické A). Pokud postačí splnit pouze jednu z daných podmínek (logické NEBO) vytvořte pravidlo řízení přístupu pro každou zvlášť. @@ -232,35 +212,107 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně Přistupující počítač - Local (logged on) user - Uživatel na tomto počítači (právě přihlášený) + Always process rule and ignore conditions + Ignorovat podmínky a pravidlo zpracovat vždy - Local computer - Tento počítač + Accessing computer and local computer + - Always process rule and ignore conditions - Ignorovat podmínky a pravidlo zpracovat vždy + User being accessed + - No user logged on - Není přihlášený žádný uživatel + is logged in locally + + + + is logged in remotely + - Accessing user has one or more groups in common with local (logged on) user - Přistupující uživatel má jednu nebo více skupin společných s uživatelem, který je právě přihlášený k počítači + No user is logged in locally + - Accessing computer and local computer are at the same location - Přistupující počítač a tento počítač se nacházejí ve stejném umístění + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at se nachází v - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + je členem skupiny + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2783,12 +2835,20 @@ Veřejná část je použita na klientských počítačích pro ověření pří Ověření uživatele - Session management - Správa relace + User sessions + + + + Minimum session lifetime before server start + + + + User login + Přihlášení uživatele - Display manager users - Zobrazit uživatele-správce + Login key sequence + diff --git a/translations/veyon_de.ts b/translations/veyon_de.ts index 30fce184d..3a4e08754 100644 --- a/translations/veyon_de.ts +++ b/translations/veyon_de.ts @@ -173,30 +173,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: Regelbeschreibung: - - Invert all conditions ("is/has" interpreted as "is/has not") - Alle Bedingungen umkehren ("ist/hat" wird als "ist/hat nicht" interpretiert) - Conditions Bedingungen - - is member of group - ist Mitglied von Gruppe - - - Accessing computer is localhost - Zugreifender Computer ist localhost - - - Accessing user is logged on user - Zugreifender Benutzer ist angemeldeter Benutzer - - - Accessing user is already connected - Zugreifender Benutzer ist bereits verbunden - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Wenn mehr als eine Bedingung aktiviert wird muss jede Bedingung zutreffen, damit die Regel angewendet wird (logisches UND). Wenn nur eine von mehreren Regeln zutreffen soll (logisches ODER) erstellen Sie bitte mehrere Zugriffskontrollregeln. @@ -230,36 +210,108 @@ If you're interested in translating Veyon into your local or another langua Zugreifender Computer - Local (logged on) user - Lokaler (angemeldeter) Benutzer + Always process rule and ignore conditions + Regel immer verarbeiten und Bedingungen ignorieren - Local computer - Lokaler Computer + Accessing computer and local computer + Zugreifender und lokaler Computer - Always process rule and ignore conditions - Regel immer verarbeiten und Bedingungen ignorieren + User being accessed + Benutzer, auf den zugegriffen wird - No user logged on - Kein Benutzer angemeldet + is logged in locally + ist lokal angemeldet + + + is logged in remotely + ist aus der Ferne angemeldet + + + No user is logged in locally + Kein Benutzer ist lokal angemeldet + + + One or multiple users are logged in locally + Ein oder mehrere Benutzer sind lokal angemeldet - Accessing user has one or more groups in common with local (logged on) user - Zugreifender Benutzer hat eine oder mehrere gemeinsame Gruppen mit lokalem (angemeldeten) Benutzer + No user is logged in remotely + Kein Benutzer ist aus der Ferne angemeldet - Accessing computer and local computer are at the same location - Zugreifender Computer und lokaler Computer befinden sich am selben Standort + One or multiple users are logged in remotely + Ein oder mehrere Benutzer sind aus der Ferne angemeldet is located at befindet sich in - Authenticated via method - Authentifiziert über Methode + is not located at + befindet sich nicht in + + + are located at the same location + befinden sich am selben Standort + + + are not located the same location + befinden sich nicht am selben Standort + + + is member of group + ist Mitglied der Gruppe + + + is not member of group + ist nicht Mitglied der Gruppe + + + is authenticated via + ist authentifiziert über + + + is not authenticated via + ist nicht authentifiziert über + + + has one or more groups in common with user being accessed + hat gemeinsame Gruppen mit dem Benutzer, auf den zugegriffen wird + + + has no groups in common with user being accessed + hat keine gemeinsame Gruppen mit dem Benutzer, auf den zugegriffen wird + + + equals user being accessed + entspricht Benutzer, auf den zugegriffen wird + + + is different from user being accessed + unterscheidet sich von Benutzer, auf den zugegriffen wird + + + is already connected + ist bereits verbunden + + + is not connected + ist nicht verbunden + + + is local computer + ist lokaler Computer + + + is not local computer + ist nicht lokaler Computer + + + Computer being accessed + Computer, auf den zugegriffen wird @@ -1328,11 +1380,11 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e ComputerZoomWidget %1 - %2 Computer Zoom Widget - + %1 - %2 Computer-Zoom-Ansicht %1 - %2 - %3 Computer Zoom Widget - + %1 - %2 - %3 Computer-Zoom-Ansicht @@ -2784,12 +2836,20 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Benutzerauthentifizierung - Session management - Sitzungsverwaltung + User sessions + Benutzersitzungen + + + Minimum session lifetime before server start + Minimale Sitzungsdauer vor Serverstart + + + User login + Benutzeranmeldung - Display manager users - Displaymanager-Benutzer + Login key sequence + Tastensequenz zum Anmelden @@ -3917,7 +3977,8 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen. Add computers by clicking with the middle mouse button or clicking the first button below. The second button will remove the selected computer. If nothing is selected the last one will be removed. - + Computer durch Klick mit der mittleren Maustaste oder mit Hilfe des ersten Buttons hinzufügen. +Der zweite Button entfernt den gewählten Computer. Wenn nichts ausgewählt ist, wird der letzte Computer entfernt. diff --git a/translations/veyon_el.ts b/translations/veyon_el.ts index 5335e7302..bcbf2e674 100644 --- a/translations/veyon_el.ts +++ b/translations/veyon_el.ts @@ -33,7 +33,9 @@ Current language not translated yet (or native English). If you're interested in translating Veyon into your local or another language or want to improve an existing translation, please contact a Veyon developer! - + Δεν υπάρχει μετάφραση σε αυτήν την γλώσσα ακόμα (ή Αγγλικά). + +Εάν ενδιαφέρεσται να μεταφράσετε το Veyon στην γλώσσα σας ή σε κάποια άλλη ή θέλεται να βελτιόσεται την παρούσα μετάφραση, πρακαλούμαι εποικοινωνίσται με κάποιον προγραμματιστή του Veyon! About %1 %2 @@ -48,11 +50,11 @@ If you're interested in translating Veyon into your local or another langua AccessControlPage Computer access control - + Έλεγχος πρόσβασης υπολογιστή Grant access to every authenticated user (default) - + Παραχώρηση πρόσβασης σε όλους τους πιστοποιημένους χρήστες (προεπιλογή) Test @@ -60,7 +62,7 @@ If you're interested in translating Veyon into your local or another langua Process access control rules - + Επεξεργασία κανόνα ελέγχου πρόσβασης User groups authorized for computer access @@ -80,15 +82,15 @@ If you're interested in translating Veyon into your local or another langua Access control rules - + Έλεγχος πρόσβασης Add access control rule - + Προσθήκη κανόνα ελέγχου πρόσβασης Remove access control rule - + Αφαίρεση κανόνα ελέγχου πρόσβασης Move selected rule down @@ -128,30 +130,30 @@ If you're interested in translating Veyon into your local or another langua Enable usage of domain groups - + Ενεργοποιήση χρήσης ομάδων τομέα User groups backend: - + Υποστίρηξη ομάδων χρηστών Missing user groups backend - + Έλλειψη υποστίριξης ομαδών χρηστών No default user groups plugin was found. Please check your installation! - + Δεν βρέθηκε κάνένα πρόσθετο για ομάδες χρηστών. Παρακαλούμε ελέγχξται την εγκατάσταση σας! Restrict access to members of specific user groups - + Περιορισμός πρόσβασης σε μέλη συγκεκριμένης ομάδας χρηστών AccessControlRuleEditDialog Edit access control rule - + Επεξεργασία κανόνα ελέγχου General @@ -173,33 +175,13 @@ If you're interested in translating Veyon into your local or another langua Rule description: Περιγραφή κανόνα: - - Invert all conditions ("is/has" interpreted as "is/has not") - Αντιστροφή όλων των συνθηκών ("είναι/έχει" θα είναι "δεν είναι/δεν έχει") - Conditions Συνθήκες - - is member of group - είναι μέλος της ομάδας - - - Accessing computer is localhost - - - - Accessing user is logged on user - - - - Accessing user is already connected - - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Εάν παραπάνω από μία συνθήκη είναι ενεργή κάθε συνθήκη πρέπει να επαλυθεύετει για να εφαρμοστεί ο κανόνας (λογικό AND). Εάν πρέπει μόνο μία απο όλες τις συνθήκες να επαλυθευτεί (λογικό OR) παρακαλούμε διμιουργήσται πολλαπλούς κανόνες πρόσβασης. Action @@ -230,27 +212,39 @@ If you're interested in translating Veyon into your local or another langua - Local (logged on) user + Always process rule and ignore conditions - Local computer - Τοπικός υπολογιστής + Accessing computer and local computer + - Always process rule and ignore conditions + User being accessed - No user logged on + is logged in locally + + + + is logged in remotely + + + + No user is logged in locally + + + + One or multiple users are logged in locally - Accessing user has one or more groups in common with local (logged on) user + No user is logged in remotely - Accessing computer and local computer are at the same location + One or multiple users are logged in remotely @@ -258,7 +252,67 @@ If you're interested in translating Veyon into your local or another langua - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + είναι μέλος της ομάδας + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2763,11 +2817,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_es_ES.ts b/translations/veyon_es_ES.ts index 96d6612db..95e6b8101 100644 --- a/translations/veyon_es_ES.ts +++ b/translations/veyon_es_ES.ts @@ -177,30 +177,10 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla Rule description: Descripción de regla: - - Invert all conditions ("is/has" interpreted as "is/has not") - Invertir todas las condiciones ("está/tiene" interpretado como "no está/no tiene") - Conditions Condiciones - - is member of group - es miembro del grupo - - - Accessing computer is localhost - El computador de acceso es localhost - - - Accessing user is logged on user - El usuario de acceso ha iniciado sesión - - - Accessing user is already connected - El usuario de acceso ya está conectado - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Si se activa más de una condición, cada condición se tiene que cumplir para hacer que la regla se aplique (AND lógico). Si sólo una de las condiciones múltiples se tiene que cumplir (OR lógico) cree varias reglas de control de acceso. @@ -234,36 +214,108 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla Acceso al equipo - Local (logged on) user - Usuario local (conectado) + Always process rule and ignore conditions + Siempre procesar reglas e ignorar condiciones - Local computer - Equipo local + Accessing computer and local computer + - Always process rule and ignore conditions - Siempre procesar reglas e ignorar condiciones + User being accessed + - No user logged on - Ningún usuario ha iniciado sesión + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - El acceso al usuario tiene uno o más grupos en común con el usuario local (conectado) + is logged in remotely + - Accessing computer and local computer are at the same location - El acceso al equipo y el equipo local están en la misma ubicación + No user is logged in locally + + + + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at se encuentra en - Authenticated via method - Autenticado por método + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + es miembro del grupo + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -1333,11 +1385,11 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu ComputerZoomWidget %1 - %2 Computer Zoom Widget - + %1 - %2 Widget de Zoom de Computadora %1 - %2 - %3 Computer Zoom Widget - + %1 - %2 - %3 Widget de Zoom de Computadora @@ -2789,12 +2841,20 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Autenticacion de usuario - Session management - Gestión de sesiones + User sessions + - Display manager users - Usuarios del gestor de pantalla + Minimum session lifetime before server start + + + + User login + Inicio de sesión de usuario + + + Login key sequence + Secuencia de clave de inicio de sesión @@ -3922,7 +3982,8 @@ Por lo general, esto es necesario para admitir servidores de terminales. Add computers by clicking with the middle mouse button or clicking the first button below. The second button will remove the selected computer. If nothing is selected the last one will be removed. - + Añada computadoras haciendo clic con el botón central del ratón o haciendo clic en el primer botón a continuación. +El segundo botón eliminará la computadora seleccionada. Si no se selecciona nada, se eliminará el último. diff --git a/translations/veyon_et.ts b/translations/veyon_et.ts index 84b2a87fb..2dfa39029 100644 --- a/translations/veyon_et.ts +++ b/translations/veyon_et.ts @@ -175,30 +175,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: Reegli kirjeldus: - - Invert all conditions ("is/has" interpreted as "is/has not") - Pöörake kõik tingimused ümber ("on/on" tõlgendatud kui "on/ei ole") - Conditions Tingimused - - is member of group - on rühma liige - - - Accessing computer is localhost - Arvutile juurdepääs on kohalik host - - - Accessing user is logged on user - Juurdepääs kasutajale on sisse logitud kasutaja - - - Accessing user is already connected - Juurdepääs kasutajale on juba ühendatud - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Kui aktiveeritakse rohkem kui üks tingimus, peavad reegli rakendamiseks kõik tingimused vastama (loogiline JA). Kui peab vastama ainult üks mitmest tingimusest (loogiline VÕI), siis looge mitu juurdepääsu kontrollreeglit. @@ -232,36 +212,108 @@ If you're interested in translating Veyon into your local or another langua Arvutile juurdepääs - Local (logged on) user - Kohalik (sisse logitud) kasutaja + Always process rule and ignore conditions + Kasutage reeglit alati ja eirake tingimusi - Local computer - Kohalik arvuti + Accessing computer and local computer + - Always process rule and ignore conditions - Kasutage reeglit alati ja eirake tingimusi + User being accessed + - No user logged on - Ükski kasutaja pole sisse loginud + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - Kasutajal, kellel on juurdepääs, on üks või mitu kohaliku (sisse logitud) kasutajaga ühist rühma + is logged in remotely + - Accessing computer and local computer are at the same location - Juurdepääs arvutile ja kohalikule arvutile asuvad samas kohas + No user is logged in locally + + + + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at on asukohas - Authenticated via method - Autentitud meetodi abil + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + on rühma liige + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -1331,11 +1383,11 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten ComputerZoomWidget %1 - %2 Computer Zoom Widget - + %1 - %2 Arvuti suumi vidin %1 - %2 - %3 Computer Zoom Widget - + %1 - %2 - %3 Arvuti suumi vidin @@ -1984,7 +2036,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten HeadlessVncServer Headless VNC server - + Peata VNC-server @@ -2787,12 +2839,20 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Kasutaja autentimine - Session management - Sessiooni haldus + User sessions + - Display manager users - Kuvahalduri kasutajad + Minimum session lifetime before server start + + + + User login + Kasutaja sisselogimine + + + Login key sequence + @@ -3199,7 +3259,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Open feature windows on the same screen as the main window - + Avage funktsiooniaknad peaaknaga samal ekraanil @@ -3920,7 +3980,8 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Add computers by clicking with the middle mouse button or clicking the first button below. The second button will remove the selected computer. If nothing is selected the last one will be removed. - + Arvutite lisamiseks klõpsake hiire keskmise nupuga või klõpsake allolevat esimest nuppu. +Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viimane. @@ -4010,7 +4071,7 @@ The second button will remove the selected computer. If nothing is selected the Maximum CPU usage - + Maksimaalne protsessori kasutamine diff --git a/translations/veyon_fa.ts b/translations/veyon_fa.ts index 5b415e843..915b0f675 100644 --- a/translations/veyon_fa.ts +++ b/translations/veyon_fa.ts @@ -174,30 +174,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: شرح قانون: - - Invert all conditions ("is/has" interpreted as "is/has not") - همه شرایط را غیرفعال کنید ("is / has" به عنوان "آیا / ندارد" تفسیر شده است) - Conditions شرایط - - is member of group - عضو گروه است - - - Accessing computer is localhost - دسترسی به کامپیوتر میزبان محلی است - - - Accessing user is logged on user - دسترسی به کاربر به کاربر وارد شده است - - - Accessing user is already connected - دسترسی به کاربر در حال حاضر اتصال است - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. اگر بیشتر از یک شرایط فعال شود، هر شرایط باید برای تطابق قوانین (منطقی AND) مطابقت داشته باشد. اگر فقط یکی از شرایط چندگانه برای برآورده شدن باشد (منطقی OR)، لطفا قوانین کنترل دسترسی چندگانه ایجاد کنید. @@ -231,27 +211,39 @@ If you're interested in translating Veyon into your local or another langua دسترسی به کامپیوتر - Local (logged on) user - محلی (وارد سیستم) کاربر + Always process rule and ignore conditions + همیشه قوانین را فراموش کنید و شرایط را نادیده بگیرید - Local computer - کامپیوتر محلی + Accessing computer and local computer + - Always process rule and ignore conditions - همیشه قوانین را فراموش کنید و شرایط را نادیده بگیرید + User being accessed + - No user logged on - هیچ کاربری وارد نشده است + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - دسترسی به کاربر دارای یک یا چند گروه مشترک با کاربر محلی (وارد شده) است + is logged in remotely + + + + No user is logged in locally + - Accessing computer and local computer are at the same location + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely @@ -259,7 +251,67 @@ If you're interested in translating Veyon into your local or another langua - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + عضو گروه است + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2764,11 +2816,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_fr.ts b/translations/veyon_fr.ts index 4919aedca..2487fc8de 100644 --- a/translations/veyon_fr.ts +++ b/translations/veyon_fr.ts @@ -175,30 +175,10 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Rule description: Description de la règle: - - Invert all conditions ("is/has" interpreted as "is/has not") - Inverser toutes les conditions ("est" sera interprété par "n'est pas") - Conditions Conditions - - is member of group - est membre du groupe - - - Accessing computer is localhost - L'ordinateur accédant est l'hôte local - - - Accessing user is logged on user - L'utilisateur accédant est identifié en utilisateur - - - Accessing user is already connected - L'utilisateur accédant est déjà connecté - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Si plus d'une condition est validée, chaque condition doit être en adéquation avec les autres afin que la règle puisse s'appliquer (ET Logique). Si seulement une condition sur plusieurs est validée (OU Logique) optez plutôt pour la création de plusieurs règles de contrôle d'accès. @@ -232,36 +212,108 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, L'ordinateur accédant - Local (logged on) user - L'utilisateur local (connecté) + Always process rule and ignore conditions + Toujours appliquer la règle et ignorer les conditions - Local computer - L'ordinateur local + Accessing computer and local computer + - Always process rule and ignore conditions - Toujours appliquer la règle et ignorer les conditions + User being accessed + - No user logged on - Aucun utilisateur connecté + is logged in locally + + + + is logged in remotely + + + + No user is logged in locally + + + + One or multiple users are logged in locally + - Accessing user has one or more groups in common with local (logged on) user - L'utilisateur accédant est membre d'un ou plusieurs groupes en commun avec l'utilisateur local (connecté) + No user is logged in remotely + - Accessing computer and local computer are at the same location - L'accès à l'ordinateur et l'ordinateur local se trouvent au même endroit + One or multiple users are logged in remotely + is located at est situé à - Authenticated via method - Authentifié via la méthode + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + est membre du groupe + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -1331,11 +1383,11 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif ComputerZoomWidget %1 - %2 Computer Zoom Widget - + %1 - %2 Widget Zoom de l'ordinateur %1 - %2 - %3 Computer Zoom Widget - + %1 - %2 - %3 Widget Zoom de l'ordinateur @@ -2787,12 +2839,20 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Authentification utilisateur - Session management - Gestion de session + User sessions + - Display manager users - Gestionnaire d'affichage utilisateurs + Minimum session lifetime before server start + + + + User login + Identifiant utilisateur + + + Login key sequence + @@ -3920,7 +3980,8 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Add computers by clicking with the middle mouse button or clicking the first button below. The second button will remove the selected computer. If nothing is selected the last one will be removed. - + Ajoutez des ordinateurs en cliquant avec le bouton central de la souris ou en cliquant sur le premier bouton ci-dessous. +Le deuxième bouton supprimera l'ordinateur sélectionné. Si rien n'est sélectionné, le dernier sera supprimé. diff --git a/translations/veyon_he.ts b/translations/veyon_he.ts index 0d9fdff75..7180284d7 100644 --- a/translations/veyon_he.ts +++ b/translations/veyon_he.ts @@ -173,30 +173,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: תיאור כלל: - - Invert all conditions ("is/has" interpreted as "is/has not") - הפוך את כל התנאים (מקיים\קיים הופך ללא מקיים\קיים) - Conditions תנאים - - is member of group - חבר קבוצה - - - Accessing computer is localhost - המחשב הניגש הוא המקומי - - - Accessing user is logged on user - משתמש ניגש מחובר כמשתמש - - - Accessing user is already connected - משתמש ניגש כבר מחובר - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. אם יותר מאחד התנאים מופעל, כל אחד מהתנאים צריך להתקיים על מנת לקיים את התנאי ("וגם" לוגי). אם רק אחד מהתנאים צריך להתקיים ("או" לוגי), יש ליצור מספר כללי גישה. @@ -230,36 +210,108 @@ If you're interested in translating Veyon into your local or another langua מחשב ניגש - Local (logged on) user - משתמש מקומי (מחובר) + Always process rule and ignore conditions + תמיד הפעל את החור והתעלם מהתנאים - Local computer - מחשב מקומי + Accessing computer and local computer + - Always process rule and ignore conditions - תמיד הפעל את החור והתעלם מהתנאים + User being accessed + - No user logged on - אין אף משתמש מחובר + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - משתמש ניגש בעל אחת או יותר קבוצות במשותף עם המשתמש המקומי (המחובר) + is logged in remotely + - Accessing computer and local computer are at the same location - מחשב ניגש ומחשב מקומי נמצאים באותו מיקום + No user is logged in locally + + + + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at ממוקם ב - Authenticated via method - התחברות באמצעות שיטה + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + חבר קבוצה + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -2767,11 +2819,19 @@ The public key is used on client computers to authenticate incoming connection r אימות משתמש - Session management + User sessions + + + + Minimum session lifetime before server start - Display manager users + User login + התחברות משתמש + + + Login key sequence diff --git a/translations/veyon_hu.ts b/translations/veyon_hu.ts index e6c0725c6..509570fa6 100644 --- a/translations/veyon_hu.ts +++ b/translations/veyon_hu.ts @@ -175,30 +175,10 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő Rule description: Szabály leírása: - - Invert all conditions ("is/has" interpreted as "is/has not") - Feltételek megfordítása ("van/volt" cseréje: "nincs/nem volt") - Conditions Feltételek - - is member of group - tagja a csoportnak - - - Accessing computer is localhost - A hozzáférő számítógép a helyi számítógép - - - Accessing user is logged on user - A hozzáférő felhasználó már bejelentkezett - - - Accessing user is already connected - A hozzáférő felhasználó már csatlakozott - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Ha egynél több feltétel aktív, az összes feltételnek teljesülnie kell, hogy a szabály életbe lépjen (logikai ÉS). Ha a szabályok közül csak egy teljesül (logikai VAGY), kérem, készíts több hozzáférés-vezérlési szabályt. @@ -232,35 +212,107 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő Hozzáférő számítógép - Local (logged on) user - Helyi (bejelentkezett) felhasználó + Always process rule and ignore conditions + Mindig hassanak a szabályok és hagyja figyelmen kívül a feltételeket - Local computer - Helyi számítógép + Accessing computer and local computer + - Always process rule and ignore conditions - Mindig hassanak a szabályok és hagyja figyelmen kívül a feltételeket + User being accessed + - No user logged on - Egy felhasználó sem jelentkezett be + is logged in locally + + + + is logged in remotely + - Accessing user has one or more groups in common with local (logged on) user - A hozzáférő felhasználó egy vagy több csoport közös tagja a helyi (bejelentkezett) felhasználóval + No user is logged in locally + - Accessing computer and local computer are at the same location - A hozzáférő számítógép a helyi számítógéppel egy helyszínen van + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at helyezkedik el - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + tagja a csoportnak + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2787,12 +2839,20 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Felhasználó hitelesítés - Session management - Munkamenet-kezelés + User sessions + + + + Minimum session lifetime before server start + + + + User login + Felhasználó bejelentkezése - Display manager users - Kezelő felhasználók megjelenítése + Login key sequence + diff --git a/translations/veyon_id.ts b/translations/veyon_id.ts index 3ad4be3ab..0ac10d006 100644 --- a/translations/veyon_id.ts +++ b/translations/veyon_id.ts @@ -175,30 +175,10 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Rule description: Penjelasan aturan: - - Invert all conditions ("is/has" interpreted as "is/has not") - Balikkan semua kondisi ("adalah/telah" diartikan sebagai "adalah/belum") - Conditions Kondisi - - is member of group - adalah anggota grup - - - Accessing computer is localhost - Mengakses komputer adalah localhost - - - Accessing user is logged on user - Pengguna yang mengakses dicatat sebagai pengguna - - - Accessing user is already connected - Mengakses pengguna sudah terhubung - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Jika lebih dari satu kondisi diaktifkan, setiap kondisi harus dipenuhi untuk membuat aturan berlaku (logika AND). Jika hanya satu dari beberapa kondisi yang harus dipenuhi (OR logis), buat beberapa aturan kontrol akses. @@ -232,36 +212,108 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Mengakses Komputer - Local (logged on) user - Pengguna lokal (masuk log) + Always process rule and ignore conditions + Selalu proses aturan dan abaikan kondisi - Local computer - Komputer lokal + Accessing computer and local computer + - Always process rule and ignore conditions - Selalu proses aturan dan abaikan kondisi + User being accessed + - No user logged on - Tidak ada pengguna masuk + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - Pengguna yang mengakses memiliki satu atau beberapa grup yang sama dengan pengguna lokal (masuk) + is logged in remotely + + + + No user is logged in locally + - Accessing computer and local computer are at the same location - Mengakses komputer dan komputer lokal berada di lokasi yang sama + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at berlokasi - Authenticated via method - Metode autentikasi menggunakan + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + adalah anggota grup + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -2768,11 +2820,19 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_it.ts b/translations/veyon_it.ts index 3ae71ca11..1556d094a 100644 --- a/translations/veyon_it.ts +++ b/translations/veyon_it.ts @@ -175,30 +175,10 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche Rule description: Descrizione della regola: - - Invert all conditions ("is/has" interpreted as "is/has not") - Inverti tutte le condizioni ("è/ha" interpretato come "non è/ha") - Conditions Condizioni - - is member of group - è membro del gruppo - - - Accessing computer is localhost - Il computer in cui si sta entrando è localhost - - - Accessing user is logged on user - L'utente che sta entrando è registrato sull'utente - - - Accessing user is already connected - L'utente che sta entrando è già connesso - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Se è attivata più di una condizione, ciascuna condizione deve essere soddisfatta affinchè la regola venga applicata (AND logico). Se invece solo una condizione è richiesta (OR logico), allora per favore creare regole multiple di controllo accesso. @@ -232,36 +212,108 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche Il computer che sta entrando - Local (logged on) user - Utente locale (collegato) + Always process rule and ignore conditions + Elabora sempre la regola ed ignora le condizioni - Local computer - Computer locale + Accessing computer and local computer + - Always process rule and ignore conditions - Elabora sempre la regola ed ignora le condizioni + User being accessed + - No user logged on - Nessun utente connesso + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - L'utente a cui si sta accedendo ha uno o più gruppi in comune con l'utente locale (l'utente ora loggato). + is logged in remotely + - Accessing computer and local computer are at the same location - L'accesso al computer e al computer locale si trovano nella stessa posizione + No user is logged in locally + + + + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at si trova a - Authenticated via method - Autenticato tramite metodo + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + è membro del gruppo + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -1328,11 +1380,11 @@ The public key is used on client computers to authenticate incoming connection r ComputerZoomWidget %1 - %2 Computer Zoom Widget - + %1 -%2 Widget per lo Zoom del Computer %1 - %2 - %3 Computer Zoom Widget - + %1 -%2 -%3 Widget per lo Zoom del Computer @@ -2774,12 +2826,20 @@ The public key is used on client computers to authenticate incoming connection r Autenticazione utente - Session management - Gestione della sessione + User sessions + - Display manager users - Display gestione utenti + Minimum session lifetime before server start + + + + User login + Login utente + + + Login key sequence + Sequenza di tasti di accesso @@ -3906,7 +3966,8 @@ Typically this is required to support terminal servers. Add computers by clicking with the middle mouse button or clicking the first button below. The second button will remove the selected computer. If nothing is selected the last one will be removed. - + Aggiungi computer facendo clic con il pulsante centrale del mouse o facendo clic sul primo pulsante in basso. +Il secondo pulsante rimuoverà il computer selezionato. Se non viene selezionato nulla, l'ultimo verrà rimosso. diff --git a/translations/veyon_ja.ts b/translations/veyon_ja.ts index a8a2d347d..c2ca562a0 100644 --- a/translations/veyon_ja.ts +++ b/translations/veyon_ja.ts @@ -176,30 +176,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: ルール説明: - - Invert all conditions ("is/has" interpreted as "is/has not") - 反転する - Conditions コンディション - - is member of group - はグループのメンバーです - - - Accessing computer is localhost - アクセスしているコンピューターはローカルホストです - - - Accessing user is logged on user - アクセスしているユーザーはユーザーでログインしています - - - Accessing user is already connected - アクセスしているユーザーは既に接続されています - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. もし1つ以上のコンディションが有効にされている場合、ルールが有効になるようそれぞれのコンディションを調整する必要があります。もし複数のコンディションを使用したい場合複数のコントロールルールを作ってください。 @@ -233,35 +213,107 @@ If you're interested in translating Veyon into your local or another langua コンピューターにアクセス中 - Local (logged on) user - ローカルユーザー + Always process rule and ignore conditions + 常にルールを有効にし、コンディションを無視する - Local computer - ローカルコンピューター + Accessing computer and local computer + - Always process rule and ignore conditions - 常にルールを有効にし、コンディションを無視する + User being accessed + - No user logged on - ログインユーザーなし + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - アクセスしているユーザーは1つかそれ以上のグループにローカルユーザーと共通で所属しています + is logged in remotely + - Accessing computer and local computer are at the same location - アクセスしているコンピューターとローカルコンピューターが同じ場所にあります + No user is logged in locally + + + + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at の場所 - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + はグループのメンバーです + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2769,11 +2821,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_ko.ts b/translations/veyon_ko.ts index 4334137ae..ad31e504f 100644 --- a/translations/veyon_ko.ts +++ b/translations/veyon_ko.ts @@ -175,30 +175,10 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 Rule description: 규칙 설명: - - Invert all conditions ("is/has" interpreted as "is/has not") - 모든 조건 반대로 ("is/has" 는 "is/has not" 로 변경됨) - Conditions 조건 - - is member of group - 는 그룹의 멤버임 - - - Accessing computer is localhost - 연결하는 컴퓨터는 로컬 호스트입니다 - - - Accessing user is logged on user - 접속하는 사용자는 로그온되어 있습니다 - - - Accessing user is already connected - 접속하는 사용자는 이미 연결되어 있습니다 - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. 한개 이상의 조건이 활성화 될 경우 규칙이 적용되려면 각각의 조건이 일치해야 한다 (논리적 AND). 여러개 중에서 하나의 조건만 맞아야 할 경우에는(논리적 OR) 다수의 접근 제어 규칙을 생성하세요 . @@ -232,35 +212,107 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 연결하는 컴퓨터 - Local (logged on) user - (로그온된)로컬 사용자 + Always process rule and ignore conditions + 조건 무시하고 항상 규칙 수행 - Local computer - 로컬 컴퓨터 + Accessing computer and local computer + - Always process rule and ignore conditions - 조건 무시하고 항상 규칙 수행 + User being accessed + - No user logged on - 로그온된 사용자 없음 + is logged in locally + + + + is logged in remotely + - Accessing user has one or more groups in common with local (logged on) user - 연결하는 사용자는 로컬 사용자(로그온됨)와 하나 또는 그이상의 공통 그룹을 갖고 있습니다 + No user is logged in locally + - Accessing computer and local computer are at the same location - 같은 장소에 있는 다른 컴퓨터와 로컬 컴퓨터에 접근 + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at 에 위치함 - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + 는 그룹의 멤버임 + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2785,12 +2837,20 @@ The public key is used on client computers to authenticate incoming connection r 사용자 인증 - Session management - 세션 관리 + User sessions + + + + Minimum session lifetime before server start + + + + User login + 유저 로긴 - Display manager users - 매니저 유저를 표시 + Login key sequence + diff --git a/translations/veyon_lt.ts b/translations/veyon_lt.ts index 80f6a84cf..6ef47254f 100644 --- a/translations/veyon_lt.ts +++ b/translations/veyon_lt.ts @@ -174,30 +174,10 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p Rule description: Taisyklės aprašymas - - Invert all conditions ("is/has" interpreted as "is/has not") - Invertuoti visas sąlygas ("yra turi" interpretuojama kaip "nėra/neturi") - Conditions Sąlygos - - is member of group - yra grupės narys - - - Accessing computer is localhost - Pasiekiamas kompiuteris yra vietiniame tinkle - - - Accessing user is logged on user - Prisijungiantis vartotojas yra prisijungęs prie vartotojo - - - Accessing user is already connected - Vartotojas kuris bando prisijungti jau yra prisijungęs - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Jeigu daugiau negu viena sąlyga yra aktyvuota kiekviena sąlyga turi atitikti nustatytus kriterijus, kad taisyklė veiktų (loginis IR). Jeigu viena iš kelių salygų atitinka (loginis ARBA). Prašome sukurti kelias prieigos valdymo taisykles. @@ -231,36 +211,108 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p Prisijungiama prie kompiuterio - Local (logged on) user - Vietinis (prisijungęs) vartotojas + Always process rule and ignore conditions + Visados vykdyti šią taisyklę ir ignoruoti sąlygas - Local computer - Vietinis kompiuteris + Accessing computer and local computer + - Always process rule and ignore conditions - Visados vykdyti šią taisyklę ir ignoruoti sąlygas + User being accessed + - No user logged on - Nėra prisijungusių vartotojų + is logged in locally + + + + is logged in remotely + + + + No user is logged in locally + + + + One or multiple users are logged in locally + - Accessing user has one or more groups in common with local (logged on) user - Vartotojas kurį bandoma pasiekti turi viena ar daugiau bendrų grupių su vietiniu (prisijungusiu) vartotoju + No user is logged in remotely + - Accessing computer and local computer are at the same location - Prisijungiantis kompiuteris ir vietinis kompiuteris yra toje pačioje vietoje + One or multiple users are logged in remotely + is located at yra šioje vietoje - Authenticated via method - Autorizuotas panaudojant: + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + yra grupės narys + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -715,7 +767,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please enter your domain/LDAP username and password in order to access computers. - + Įveskite savo domeno/LDAP vartotojo vardą ir slaptažodį, kad pasiekti kompiuterius. Username @@ -1253,7 +1305,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Nerastas numatytasis tinklo objiektų plėtinys. Patikrinkite savo instaliaciją arba nustatykite kitą tinklo objektų katalogą panaudojant %1 konfigūratorių. Location detection failed @@ -1265,7 +1317,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + Negalima nustatyti kompiuterio vietos. Tai galėjo įvykti dėl problemos su sistemos konfigūracija. Visos vietos bus nurodytos kompiuterio pasirinkimo lange. @@ -1323,29 +1375,29 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not write the computer and users list to %1! Please check the file access permissions. - + Neįmanoma įrašyti kompiuterio ir vartotojų sąrašo į %1! Patikrinkite failo prieigos teises. ComputerZoomWidget %1 - %2 Computer Zoom Widget - + %1 - %2 Kompiuterio priartinimo valdiklis. %1 - %2 - %3 Computer Zoom Widget - + %1 - %2 - %3 Kompiuterio priartinimo valdiklis. ConfigCommands Clear system-wide Veyon configuration - + Išvalyti Veyon konfigūraciją sistemos lygmeniu. List all configuration keys and values - + Parodyti visus konfigūracijos parametrus. Import configuration from given file @@ -1357,23 +1409,23 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Read and output configuration value for given key - + Nuskaityti ir išvesti konfigūracijos vertę pasirinktam parametrui. Write given value to given configuration key - + Įrašyti nurodytą vertę pasirinktam parametrui. Unset (remove) given configuration key - + Atstatyti (pašalinti) pasirinktą parametrą. Upgrade and save configuration of program and plugins - + Atnaujinti ir išsaugoti programos ir plėtinių konfigūraciją. Please specify an existing configuration file to import. - + Nurodytkite esamą konfigūraciją kurią norite importuoti. Configuration file is not readable! @@ -1381,7 +1433,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please specify a valid filename for the configuration export. - + Nurodykite tinkamą failo vardą eksportuojamai konfigūracijai. Output file is not writable! @@ -1397,7 +1449,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Specified key does not exist in current configuration! - + Nurodyta vertė neegzistuoja esamoje konfigūracijoje Please specify a valid value. @@ -1409,34 +1461,34 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Commands for managing the configuration of Veyon - + Komandos skirtos valdyti Veyon konfigūraciją ConfigurationManager Could not modify the autostart property for the %1 Service. - + Nepavyko pakeisti automatinio paleidimo parametro servisui: %1 Could not configure the firewall configuration for the %1 Server. - + Nepavyko pakeisti ugniasienės konfigūracijos serveriui: %1 Could not configure the firewall configuration for the %1 Worker. - + Nepavyko pakeisti ugniasienės konfigūracijos darbuotojui: %1 Configuration is not writable. Please check your permissions! - + Konfigūracija nėra įrašoma. Patikrinkite konfigūracijos prieigos teises Could not apply platform-specific configuration settings. - + Nepavyko pritaikyti konfigūracijos parametrų specifinei platformai. Could not configure the firewall configuration for the %1 Service. - + Nepavyko sukonfigūruoti ugniasienės servisui: %1 @@ -1501,7 +1553,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Šiame rėžime jūsų ekranas bus demonstruojamas lange visiems kompiuteriams. Vartotojai gali perjungti langus pagal poreikį. Demo @@ -1541,7 +1593,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Šiame režime bus rodomas pasirinkto vartotojo ekranas visiems vartotojams lange. Vartotojai gali perjungti į kitus langus pagal poreikį. Please select a user screen to share. @@ -1557,7 +1609,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Screen %1 [%2] - + Ekranas %1 [%2] @@ -1757,11 +1809,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Destination directory - + Paskirties vieta Default source directory - + Numatytoji pradinė failų vieta. Options @@ -1769,11 +1821,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Remember last source directory - + Atsiminti paskutinę pradinę direktoriją. Create destination directory if it does not exist - + Sukurti paskirties direktoriją jeigu ji neegistuoja. @@ -1983,7 +2035,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u HeadlessVncServer Headless VNC server - + Nevaldomas VNC serveris. @@ -2768,11 +2820,19 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Vartotojo patvirtinimas - Session management - Seanso valdymas + User sessions + + + + Minimum session lifetime before server start + + + + User login + Naudotojo prisijungimas - Display manager users + Login key sequence diff --git a/translations/veyon_lv.ts b/translations/veyon_lv.ts index 55e1265c2..9df85077b 100644 --- a/translations/veyon_lv.ts +++ b/translations/veyon_lv.ts @@ -175,30 +175,10 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Rule description: Noteikuma apraksts: - - Invert all conditions ("is/has" interpreted as "is/has not") - - Conditions Nosacījumi - - is member of group - ir biedrs grupai - - - Accessing computer is localhost - - - - Accessing user is logged on user - - - - Accessing user is already connected - - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. @@ -232,27 +212,39 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Piekļūstošais dators - Local (logged on) user - Vietējais (pieslēdzies) lietotājs + Always process rule and ignore conditions + - Local computer - Vietējais dators + Accessing computer and local computer + - Always process rule and ignore conditions + User being accessed - No user logged on - Nav lietotājs pieslēdzies + is logged in locally + + + + is logged in remotely + - Accessing user has one or more groups in common with local (logged on) user + No user is logged in locally - Accessing computer and local computer are at the same location + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely @@ -260,7 +252,67 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + ir biedrs grupai + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2765,11 +2817,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_mn.ts b/translations/veyon_mn.ts index 49c6d6638..cde7de7a0 100644 --- a/translations/veyon_mn.ts +++ b/translations/veyon_mn.ts @@ -174,91 +174,143 @@ If you're interested in translating Veyon into your local or another langua - Invert all conditions ("is/has" interpreted as "is/has not") + Conditions - Conditions + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - is member of group + Action - Accessing computer is localhost + Allow access - Accessing user is logged on user + Deny access - Accessing user is already connected + Ask logged on user for permission - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. + None (rule disabled) - Action + Accessing user - Allow access + Accessing computer - Deny access + Always process rule and ignore conditions - Ask logged on user for permission + Accessing computer and local computer - None (rule disabled) + User being accessed - Accessing user + is logged in locally - Accessing computer + is logged in remotely - Local (logged on) user + No user is logged in locally - Local computer + One or multiple users are logged in locally - Always process rule and ignore conditions + No user is logged in remotely - No user logged on + One or multiple users are logged in remotely - Accessing user has one or more groups in common with local (logged on) user + is located at - Accessing computer and local computer are at the same location + is not located at - is located at + are located at the same location + + + + are not located the same location - Authenticated via method + is member of group + + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2763,11 +2815,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_nl.ts b/translations/veyon_nl.ts index 88fbe5ec6..1eebb3bcf 100644 --- a/translations/veyon_nl.ts +++ b/translations/veyon_nl.ts @@ -175,30 +175,10 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Rule description: Regelbeschrijving: - - Invert all conditions ("is/has" interpreted as "is/has not") - Keer all condities om ("is/heeft" geïnterpreteerd als "is/heeft niet") - Conditions Voorwaarden - - is member of group - is lid van groep - - - Accessing computer is localhost - Toegangzoekende computer is localhost - - - Accessing user is logged on user - Toegangzoekende gebruiker is de aangelogde gebruiker - - - Accessing user is already connected - Toegangzoekende gebruiker is reeds aangemeld - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Als er meerdere condities zijn geactiveerd, moet elke conditie voldoen om de regel toe te passen (logisch EN). Als slechts één van meerdere voorwaarden moet voldoen (logisch OF), maak dan meerdere toegangsregels aan. @@ -232,35 +212,107 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Toegangzoekende computer - Local (logged on) user - Lokale (ingelogde) gebruiker + Always process rule and ignore conditions + Verwerk altijd regel en negeer de voorwaarden - Local computer - Lokale computer + Accessing computer and local computer + - Always process rule and ignore conditions - Verwerk altijd regel en negeer de voorwaarden + User being accessed + - No user logged on - Geen gebruiker ingelogd + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - Toegangzoekende gebruiker heeft een of meerdere groepen gemeenschappelijk met de lokale (aangemelde) gebruiker + is logged in remotely + - Accessing computer and local computer are at the same location - Toegangzoekende computer bevindt zich in hetzelfde lokaal als lokale computer + No user is logged in locally + + + + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at bevind zich in - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + is lid van groep + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2772,11 +2824,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_no_NO.ts b/translations/veyon_no_NO.ts index e136b6b63..5605dbbc4 100644 --- a/translations/veyon_no_NO.ts +++ b/translations/veyon_no_NO.ts @@ -174,91 +174,143 @@ If you're interested in translating Veyon into your local or another langua - Invert all conditions ("is/has" interpreted as "is/has not") + Conditions - Conditions + If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - is member of group + Action - Accessing computer is localhost + Allow access + Tillat tilgang + + + Deny access - Accessing user is logged on user + Ask logged on user for permission - Accessing user is already connected + None (rule disabled) - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. + Accessing user - Action + Accessing computer - Allow access - Tillat tilgang + Always process rule and ignore conditions + - Deny access + Accessing computer and local computer - Ask logged on user for permission + User being accessed - None (rule disabled) + is logged in locally - Accessing user + is logged in remotely - Accessing computer + No user is logged in locally - Local (logged on) user + One or multiple users are logged in locally - Local computer + No user is logged in remotely - Always process rule and ignore conditions + One or multiple users are logged in remotely - No user logged on - Ingen bruker pålogget + is located at + - Accessing user has one or more groups in common with local (logged on) user + is not located at - Accessing computer and local computer are at the same location + are located at the same location - is located at + are not located the same location + + + + is member of group + + + + is not member of group - Authenticated via method + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2763,11 +2815,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_pl.ts b/translations/veyon_pl.ts index 27d8c2f67..0861bde78 100644 --- a/translations/veyon_pl.ts +++ b/translations/veyon_pl.ts @@ -175,30 +175,10 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne Rule description: Opis reguły: - - Invert all conditions ("is/has" interpreted as "is/has not") - Odwróć wszystkie warunki („jest / ma” interpretowane jako „nie jest / nie ma”) - Conditions Warunki - - is member of group - jest członkiem grupy - - - Accessing computer is localhost - Łączący się komputer to localhost - - - Accessing user is logged on user - Logujący się użytkownik jest już zalogowany - - - Accessing user is already connected - Logujący się użytkownik jest już połączony - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. eśli aktywowany jest więcej niż jeden warunek, każdy warunek musi zostać spełniony, aby reguła miała zastosowanie (logiczne AND). Jeśli tylko jeden z wielu warunków musi zostać spełniony (logiczne OR), proszę utwórz wiele reguł kontroli dostępu. @@ -232,36 +212,108 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne Łączący się komputer - Local (logged on) user - Użytkownik lokalny (zalogowany) + Always process rule and ignore conditions + Zawsze stosuj regułę i ignoruj warunki - Local computer - Komputer lokalny + Accessing computer and local computer + - Always process rule and ignore conditions - Zawsze stosuj regułę i ignoruj warunki + User being accessed + - No user logged on - Brak zalogowanych użytkowników. + is logged in locally + + + + is logged in remotely + + + + No user is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - Logujący się użytkownik ma jedną lub więcej grup wspólnych z użytkownikiem lokalnym (zalogowanym) + One or multiple users are logged in locally + - Accessing computer and local computer are at the same location - Logujący się komputer i lokalny komputer są w tej samej lokalizacji + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at jest w - Authenticated via method - Uwierzytelniony metodą + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + jest członkiem grupy + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -716,7 +768,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Please enter your domain/LDAP username and password in order to access computers. - + Wprowadź nazwę użytkownika i hasło domeny/LDAP, aby uzyskać dostęp do komputerów. Username @@ -1197,7 +1249,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Veyon Server unreachable or not running - + Serwer Veyon nieosiagalny lub nie uruchomiony @@ -1554,11 +1606,11 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc All screens - + Wszystkie ekrany Screen %1 [%2] - + Ekran %1 [%2} @@ -2782,12 +2834,20 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Uwierzytelnianie użytkownika - Session management - Zarządzanie sesją + User sessions + - Display manager users - Wyświetl użytkowników z uprawnieniami managera + Minimum session lifetime before server start + + + + User login + Login użytkownika + + + Login key sequence + @@ -3170,7 +3230,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Thumbnail spacing - + Odstęp między miniaturami px @@ -3178,7 +3238,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Hide local session - + Ukryj lokalną sesję Auto @@ -3186,15 +3246,15 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Thumbnail aspect ratio - + Proporcje miniatury Automatically adjust computer icon size - + Automatycznie dostosuj rozmiar ikony komputera Open feature windows on the same screen as the main window - + Otwieraj okna funkcji na tym samym ekranie, co okno główne @@ -3449,7 +3509,7 @@ Zapisz swoją pracę i zamknij wszystkie programy. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Zdalny dostęp @@ -3666,7 +3726,7 @@ Zapisz swoją pracę i zamknij wszystkie programy. Do you really want to delete all selected screenshots? - + Czy na pewno chcesz usunąć wszystkie zaznaczone zrzuty ekranu? @@ -3763,7 +3823,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Veyon server - + Serwer Veyon Internal VNC server @@ -3779,7 +3839,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Miscellaneous network settings - + Różne ustawienia sieci @@ -3871,11 +3931,11 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. SlideshowPanel Previous - + Poprzedni Start/pause - + Start/pauza Next @@ -3883,18 +3943,18 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Duration: - + Czas trwania: SpotlightPanel Add selected computers - + Dodaj wybrane komputery Remove selected computers - + Usuń wybrane komputery Update computers in realtime @@ -4005,7 +4065,7 @@ The second button will remove the selected computer. If nothing is selected the Maximum CPU usage - + Maksymalne wykorzystanie CPU diff --git a/translations/veyon_pt_BR.ts b/translations/veyon_pt_BR.ts index 22f714039..5d94b8d74 100644 --- a/translations/veyon_pt_BR.ts +++ b/translations/veyon_pt_BR.ts @@ -134,15 +134,15 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi User groups backend: - + Back-end dos grupos de usuários: Missing user groups backend - + Sem Back-end dos grupos de usuários: No default user groups plugin was found. Please check your installation! - + Nenhum plugin padrão de grupos de usuários foi encontrado. Verifique sua instalação! Restrict access to members of specific user groups @@ -175,30 +175,10 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Rule description: Descrição da regra: - - Invert all conditions ("is/has" interpreted as "is/has not") - Inverter todas as condições - Conditions Condições - - is member of group - é membro do grupo - - - Accessing computer is localhost - O computador acessando é localhost - - - Accessing user is logged on user - O usuário acessando está logado como usuário - - - Accessing user is already connected - O usuário acessando já está conectado - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Se mais de uma condição for ativada, todas devem ser atendidas para que a regra seja aplicada (E lógico). Se apenas uma das múltiplas condições tiver que ser atendida (OU lógico), crie múltiplas regras de controle de acesso. @@ -232,35 +212,107 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Computador acessando - Local (logged on) user - Usuários locais (logados) + Always process rule and ignore conditions + Sempre processe as regras e ignore as condições + + + Accessing computer and local computer + - Local computer - Computador local + User being accessed + - Always process rule and ignore conditions - Sempre processe as regras e ignore as condições + is logged in locally + - No user logged on - Nenhum usuário logado + is logged in remotely + + + + No user is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - O acesso ao usuário tem um ou mais grupos em comum com o usuário local (logado) + One or multiple users are logged in locally + - Accessing computer and local computer are at the same location - O computador de acesso e o computador local estão no mesmo local + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at está localizado em - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + é membro do grupo + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -316,7 +368,7 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Authentication method - + Método de autenticação @@ -405,7 +457,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter the name of the user group or role for which to create an authentication key pair: - + Por favor insira o nome do grupo de usuários ou função para o qual deseja criar um par de chaves de autenticação: Do you really want to delete authentication key "%1/%2"? @@ -417,7 +469,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter the name of the user group or role for which to import the authentication key: - + Por favor insira o nome do grupo de usuários ou função para o qual deseja importar a chave de autenticação: Please select a key to export! @@ -429,7 +481,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please select a key which to set the access group for! - + Selecione uma chave para a atribuir o grupo de acesso! @@ -444,15 +496,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Invalid key type specified! Please specify "%1" or "%2". - + Chave inválida! Especifique "%1" or "%2". Specified key does not exist! Please use the "list" command to list all installed keys. - + A chave especificada não existe! Use o comando "list" para listar todas as chaves instaladas. One or more key files already exist! Please delete them using the "delete" command. - + Um ou mais arquivos de chave já existem! Exclua-os usando o comando "delete". Creating new key pair for "%1" @@ -464,7 +516,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Newly created key pair has been saved to "%1" and "%2". - + O par de chaves recém-criado foi salvo em "% 1" e "% 2". Could not remove key file "%1"! @@ -516,15 +568,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + A chave "%1/%2" foi importada com sucesso. Verifique as permissões de arquivo de "%3" para evitar acessos não autorizados. Failed to convert private key to public key - + Falha ao converter chave privada em chave pública. Failed to create directory for private key file "%1". - + Falha ao criar diretório para o arquivo de chave privada "%1". Failed to save private key in file "%1"! @@ -532,11 +584,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Failed to set permissions for private key file "%1"! - + Falha ao definir permissões para o arquivo de chave privada "%1"! Failed to create directory for public key file "%1". - + Falha ao criar diretório para o arquivo de chave pública "%1". Failed to save public key in file "%1"! @@ -544,11 +596,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Failed to set permissions for public key file "%1"! - + Falha ao definir permissões para o arquivo de chave pública "%1"! Failed to set owner of key file "%1" to "%2". - + Falha ao definir o proprietário da chave "%1" para "%2". Failed to set permissions for key file "%1". @@ -556,7 +608,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key "%1" is now accessible by user group "%2". - + A chave "%1" agora está acessível ao grupo de usuários "%2". <N/A> @@ -595,7 +647,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Set user group allowed to access a key - + Definir grupo de usuários com permissão para acessar uma chave KEY @@ -607,7 +659,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + Este comando ajusta as permissões de acesso ao arquivo <KEY> de modo que apenas o grupo de usuários <ACCESS GROUP> tenha acesso de leitura a ele. NAME @@ -627,11 +679,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Este comando lista todas as chaves de autenticação disponíveis no diretório de chaves configurado. Se a opção "%1" for especificada, uma tabela com detalhes da chave será exibida. Alguns detalhes podem estar faltando se uma chave não estiver acessível. devido à falta de permissões de leitura. Please specify the command to display help for! - + Especifique o comando para o qual exibir ajuda! TYPE @@ -639,11 +691,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç PAIR ID - + ID DO PAR Commands for managing authentication keys - + Comandos para gerenciar chaves de autenticação This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. @@ -659,7 +711,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Os arquivos da chave de autenticação não estão configurados corretamente neste computador. Crie novos arquivos de chave ou mude para um método de autenticação diferente usando o Veyon Configurator. Key file authentication @@ -667,7 +719,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key file - + Arquivo da chave @@ -686,14 +738,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Pair ID - + ID do par AuthLdapConfigurationWidget LDAP authentication - + Autenticação LDAP General @@ -701,11 +753,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Username to bind DN mapping: - + Nome de usuário para vincular o mapeamento de DN: e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + ex.: %usuario%@DOMINIO ou cn=%usuario%,ou=users,dc=examplo,dc=org @@ -716,7 +768,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter your domain/LDAP username and password in order to access computers. - + Insira seu nome de usuário e senha de domínio/LDAP para acessar os computadores. Username @@ -766,7 +818,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + O nome de usuário ou senha fornecidos estão incorretos. Insira credenciais válidas ou mude para um método de autenticação diferente usando o Veyon Configurator. Logon authentication @@ -774,7 +826,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Logon - + Entrar @@ -785,7 +837,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please enter the Veyon password: - + Por favor, digite a senha do Veyon Authentication error @@ -793,22 +845,22 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Logon failed with given password. Please try again! - + Falha no logon com a senha fornecida. Por favor, tente novamente! AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + A senha fornecida está errada. Digite a senha correta ou mude para um método de autenticação diferente usando o Veyon Configurator. Simple password authentication - + Autenticação com senha simples Simple password - + Senha simples @@ -819,14 +871,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Authentication is set up properly on this computer. - + A autenticação está configurada corretamente neste computador. AuthenticationPageTab Enabled - + Ativado Test @@ -865,7 +917,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Builtin directory - + Diretório integrado Locations & computers @@ -900,15 +952,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Import objects from given file - + Importar objetos de arquivo Export objects to given file - + Exportar objetos para arquivo Invalid type specified. Valid values are "%1" or "%2". - + Tipo inválido especificado. Os valores válidos são "%1" ou "%2". Type @@ -928,7 +980,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Specified object not found. - + Objeto não encontrado. File "%1" does not exist! @@ -936,7 +988,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Can't open file "%1" for reading! - + Não é possível abrir o arquivo "%1" para leitura! Unknown argument "%1". @@ -944,11 +996,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Computer "%1" (host address: "%2" MAC address: "%3") - + Computador "%1" (endereço do host: "%2" endereço MAC: "%3") Unclassified object "%1" with ID "%2" - + Objeto não classificado "%1" com ID "%2" None @@ -968,19 +1020,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Error while parsing line %1. - + Erro ao analisar a linha %1. Network object directory which stores objects in local configuration - + Diretório de objetos de rede que armazena objetos em configuração local Commands for managing the builtin network object directory - + Comandos para gerenciar o diretório interno de objetos de rede No format string or regular expression specified! - + Nenhuma string de formato ou expressão regular especificada! Can't open file "%1" for writing! @@ -1370,7 +1422,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Upgrade and save configuration of program and plugins - + Atualize e salve a configuração do programa e plug-ins Please specify an existing configuration file to import. @@ -1429,7 +1481,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Configuration is not writable. Please check your permissions! - + A configuração não é gravável. Por favor, verifique suas permissões! Could not apply platform-specific configuration settings. @@ -1483,7 +1535,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Slow down thumbnail updates while demo is running - + Diminua a velocidade das atualizações de miniaturas enquanto a demonstração está em execução @@ -1506,59 +1558,59 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Demo - + Demonstração Share your screen or allow a user to share his screen with other users. - + Compartilhe sua tela ou permita que um usuário compartilhe sua tela com outros usuários. Full screen demo - + Demonstração em tela inteira Share your own screen in fullscreen mode - + Compartilhe sua própria tela em modo de tela inteira In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Neste modo, sua tela está sendo exibida em modo de tela inteira em todos os computadores enquanto os dispositivos de entrada dos usuários estão bloqueados. Share your own screen in a window - + Compartilhe sua própria tela em uma janela Share selected user's screen in fullscreen mode - + Compartilhe a tela do usuário selecionado em modo de tela inteira In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Neste modo, a tela do usuário selecionado é exibida em modo de tela inteira em todos os computadores enquanto os dispositivos de entrada dos usuários estão bloqueados. Share selected user's screen in a window - + Compartilhar a tela do usuário selecionado em uma janela In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Neste modo, a tela do usuário selecionado é exibida em uma janela em todos os computadores. Os usuários podem alternar para outras janelas conforme necessário. Please select a user screen to share. - + Selecione uma tela de um usuário para compartilhar. Please select only one user screen to share. - + Selecione apenas uma tela de usuário para compartilhar. All screens - + Todas as telas Screen %1 [%2] - + Tela %1 [%2] @@ -1659,7 +1711,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom program - + Programa personalizado Open website "%1" @@ -1667,7 +1719,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom website - + Website personalizado @@ -1686,7 +1738,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom website - + Website personalizado Open file manager @@ -1694,7 +1746,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Start learning tool - + Iniciar ferramenta de aprendizagem Play tutorial video @@ -1702,7 +1754,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom program - + Programa personalizado Handout @@ -1710,7 +1762,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Texts to read - + Textos para ler generic-student-user @@ -1758,11 +1810,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Destination directory - + Diretório de destino Default source directory - + Diretório padrão de origem Options @@ -1770,18 +1822,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Remember last source directory - + Lembrar último diretório de origem Create destination directory if it does not exist - + Crie o diretório de destino se ele não existir FileTransferController Could not open file "%1" for reading! Please check your permissions! - + Não foi possível abrir o arquivo "%1" para leitura! Por favor, verifique suas permissões! @@ -1800,11 +1852,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Transfer and open file(s) with associated program - + Transferir e abrir arquivo(s) com programa associado Transfer and open destination folder - + Transferir e abrir a pasta de destino Files @@ -1823,7 +1875,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç FileTransferFileDialog Select one or more files to transfer - + Selecione um ou mais arquivos para transferir @@ -1834,27 +1886,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Click this button to transfer files from your computer to all computers. - + Clique neste botão para transferir arquivos de seu computador para todos os computadores. Select one or more files to transfer - + Selecione um ou mais arquivos para transferir Transfer files to remote computer - + Transferir arquivos para computador remoto Received file "%1". - + Arquivo recebido: "%1". Could not receive file "%1" as it already exists. - + Não foi possível receber o arquivo "%1" porque ele já existe. Could not receive file "%1" as it could not be opened for writing! - + Não foi possível receber o arquivo "%1" porque ele não pôde ser aberto para gravação! @@ -1977,7 +2029,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Write to logging system of operating system - + Grave no sistema de registro do sistema operacional @@ -1991,7 +2043,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LdapBrowseDialog Browse LDAP - + Pesquisar LDAP @@ -2109,7 +2161,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User login name attribute - + Atributo de nome de login do usuário group members @@ -2133,23 +2185,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Computer display name attribute - + Atributo de nome de exibição do computador Invalid hostname - + Hostname inválido You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + Você configurou nomes de host de computador para serem armazenados como nomes de domínio totalmente qualificados (FQDN), mas inseriu um nome de host sem domínio. You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Você configurou nomes de host de computador para serem armazenados como nomes de host simples sem um nome de domínio, mas inseriu um nome de host com uma parte do nome de domínio. Computer hostname attribute - + Atributo de hostname do computador computer MAC addresses @@ -2161,15 +2213,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç computer locations - + localizações de computador Computer location attribute - + Atributo de nome de localização do computador Location name attribute - + Atributo de nome de localização users @@ -2201,7 +2253,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not find a user with the name "%1". Please check the username or the user tree parameter. - + Não foi possível encontrar um usuário com o nome "%1". Verifique o nome de usuário ou o parâmetro da árvore do usuário. groups of computer @@ -2213,15 +2265,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Não foi possível encontrar um computador com o nome de host "%1". Verifique o nome do host ou o parâmetro da árvore do computador. Hostname lookup failed - + A pesquisa de nome de host falhou Could not lookup hostname for IP address %1. Please check your DNS server settings. - + Não foi possível pesquisar o nome do host para o endereço IP "%1". Verifique as configurações do servidor DNS. location entries @@ -2229,11 +2281,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Computer groups filter - + Filtro de grupos de computadores Computer locations identification - + Identificação de localização do computador Filter for computer groups @@ -2241,11 +2293,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Invalid test value - + Valor de teste inválido An empty or invalid value has been supplied for this test. - + Um valor vazio ou inválido foi fornecido para este teste. LDAP %1 test failed @@ -2267,7 +2319,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LDAP test failed - + Teste LDAP falhou. Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. @@ -2277,11 +2329,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç and - + e LDAP test successful - + Teste LDAP bem sucedido %1 %2 have been queried successfully: @@ -2544,23 +2596,23 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Connection security - + Segurança da conexão TLS certificate verification - + Verificação de certificado TLS System defaults - + Padrões do sistems Never (insecure!) - + Nunca (inseguro!) Custom CA certificate file - + Arquivo personalizado de certificado CA None @@ -2576,51 +2628,51 @@ A chave pública é usada no computadores clientes para autenticar as requisiç e.g. (objectClass=computer) - + ex.: (objectClass=computer) e.g. (objectClass=group) - + ex.: (objectClass=group) e.g. (objectClass=person) - + ex.: (objectClass=person) e.g. (objectClass=room) or (objectClass=computerLab) - + ex.: (objectClass=room) or (objectClass=computerLab) e.g. (objectClass=container) or (objectClass=organizationalUnit) - + ex.: (objectClass=container) ou (objectClass=organizationalUnit) Certificate files (*.pem) - + Arquivos de certificados (*.pem) Encryption protocol - + Protocolo de encriptação Computer location attribute - + Atributo de nome de localização do computador Computer display name attribute - + Atributo de nome de exibição do computador Location name attribute - + Atributo de nome de localização e.g. cn or displayName - + Ex.: cn ou displayName Computer locations identification - + Identificação de localização do computador Identify computer locations (e.g. rooms) via: @@ -2632,39 +2684,39 @@ A chave pública é usada no computadores clientes para autenticar as requisiç List all entries of a location - + Lista todas as entradas de um local List all locations - + Liste todos os locais Enter computer display name - + Insira o nome de exibição do computador Please enter a computer display name to query: - + Insira um nome de exibição do computador para consultar: Enter computer location name - + Insira o nome do local do computador Please enter the name of a computer location (wildcards allowed): - + Insira o nome de um local de computador (caracteres curinga permitidos): Enter location name - + Insira o nome do local Please enter the name of a location whose entries to query: - + Insira o nome de um local cujas entradas deseja consultar: Browse - + Pesquisar Test @@ -2676,7 +2728,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Computer hostname attribute - + Atributo de hostname do computador Please enter a computer hostname to query: @@ -2684,7 +2736,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Enter hostname - + Insira o nome do host Please enter a computer hostname whose group memberships to query: @@ -2692,7 +2744,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User login name attribute - + Atributo de nome de login do usuário Configured attribute for user login name or computer hostname (OpenLDAP) @@ -2751,7 +2803,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + O nome de usuário ou senha fornecidos estão incorretos. Insira credenciais válidas ou mude para um método de autenticação diferente usando o Veyon Configurator. LDAP bind @@ -2770,14 +2822,22 @@ A chave pública é usada no computadores clientes para autenticar as requisiç User authentication + Autenticação de usuário + + + User sessions - Session management + Minimum session lifetime before server start - Display manager users + User login + Usuário: + + + Login key sequence @@ -3234,7 +3294,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Name: - + Nome: @@ -3332,7 +3392,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please specify the command to display help for! - + Especifique o comando para o qual exibir ajuda! Invalid MAC address specified! @@ -3528,7 +3588,7 @@ Please save your work and close all programs. Name: - + Nome: Remember and add to program menu @@ -3871,22 +3931,22 @@ Typically this is required to support terminal servers. Duration: - + Duração: SpotlightPanel Add selected computers - + Adicionar computadores selecionados Remove selected computers - + Remover computadores selecionados Update computers in realtime - + Atualizar computadores em tempo real Spotlight @@ -3894,11 +3954,11 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - + Selecione pelo menos um computador para adicionar. Please select at least one computer to remove. - + Selecione pelo menos um computador para remover. Add computers by clicking with the middle mouse button or clicking the first button below. @@ -3993,7 +4053,7 @@ The second button will remove the selected computer. If nothing is selected the Maximum CPU usage - + Máximo uso de CPU @@ -4011,11 +4071,11 @@ The second button will remove the selected computer. If nothing is selected the UserLoginDialog User login - + Usuário: Please enter a username and password for automatic login on all computers. - + Insira um nome de usuário e senha para login automático em todos os computadores. Username @@ -4030,27 +4090,27 @@ The second button will remove the selected computer. If nothing is selected the UserSessionControlPlugin Log in - + Entrar Click this button to log in a specific user on all computers. - + Clique neste botão para fazer login de um usuário específico em todos os computadores. Log off - + Sair Click this button to log off users from all computers. - + Clique neste botão para fazer logoff de usuários de todos os computadores. Confirm user logoff - + Confirmar logoff Do you really want to log off the selected users? - + Você realmente deseja deslogar o usuário selecionado? User session control @@ -4093,39 +4153,39 @@ The second button will remove the selected computer. If nothing is selected the No module specified or module not found - available modules are: - + Nenhum módulo especificado ou módulo não encontrado - os módulos disponíveis são: Plugin not licensed - + Plugin não licenciado INFO - + INFORMAÇÃO ERROR - + ERRO USAGE - + USO DESCRIPTION - + DESCRIÇÃO EXAMPLES - + EXEMPLOS WARNING - + ATENÇÃO Authentication test - + Teste de autenticação @@ -4153,7 +4213,7 @@ The second button will remove the selected computer. If nothing is selected the WindowsPlatformConfigurationPage Windows - + Windows General @@ -4165,39 +4225,39 @@ The second button will remove the selected computer. If nothing is selected the Screen lock - + Bloquear tela Hide taskbar - + Ocultar barra de tarefas Hide start menu - + Ocultar menu iniciar Hide desktop - + Ocultar desktop User authentication - + Autenticação de usuário Use alternative user authentication mechanism - + Usar mecanismo de autenticação alternativo User login - + Usuário: Input start delay - + Inserir delay de início Simulated key presses interval - + Intervalo de simulação de pressionamento de teclas Confirm legal notice (message displayed before user logs in) @@ -4243,7 +4303,7 @@ The second button will remove the selected computer. If nothing is selected the Service "%1" could not be found. - + Serviço "%1" não foi encontrado. diff --git a/translations/veyon_pt_PT.ts b/translations/veyon_pt_PT.ts index e1681be7e..2493798c6 100644 --- a/translations/veyon_pt_PT.ts +++ b/translations/veyon_pt_PT.ts @@ -175,30 +175,10 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma Rule description: Descrição da regra: - - Invert all conditions ("is/has" interpreted as "is/has not") - - Conditions Condições - - is member of group - é membro do grupo - - - Accessing computer is localhost - - - - Accessing user is logged on user - - - - Accessing user is already connected - O utilizador a aceder já está conectado - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. @@ -232,27 +212,39 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma Computador a aceder - Local (logged on) user + Always process rule and ignore conditions + Processar sempre as regras e ignorar as condições + + + Accessing computer and local computer - Local computer - Computador local + User being accessed + - Always process rule and ignore conditions - Processar sempre as regras e ignorar as condições + is logged in locally + - No user logged on + is logged in remotely + + + + No user is logged in locally - Accessing user has one or more groups in common with local (logged on) user + One or multiple users are logged in locally - Accessing computer and local computer are at the same location + No user is logged in remotely + + + + One or multiple users are logged in remotely @@ -260,7 +252,67 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + é membro do grupo + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2765,11 +2817,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_ru.ts b/translations/veyon_ru.ts index ae8503e57..1e5064a5c 100644 --- a/translations/veyon_ru.ts +++ b/translations/veyon_ru.ts @@ -175,30 +175,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: Описание правила: - - Invert all conditions ("is/has" interpreted as "is/has not") - Инвертировать все условия («быть / иметь» интерпретируется как «не быть / не иметь») - Conditions Условия - - is member of group - является членом группы - - - Accessing computer is localhost - Доступ к компьютеру как localhost - - - Accessing user is logged on user - Доступ к пользователю осуществляется пользователем - - - Accessing user is already connected - Доступ к пользователю уже подключен - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Если активировано более одного условия, каждое условие должно соответствовать для применения правила (логическое И). Если требуется только одно из нескольких условий (логическое ИЛИ), создайте несколько правил контроля доступа. @@ -232,36 +212,108 @@ If you're interested in translating Veyon into your local or another langua Доступ к компьютеру - Local (logged on) user - Локальный (вошедший в систему) пользователь + Always process rule and ignore conditions + Всегда обрабатывать правило и игнорировать условия - Local computer - Локальный компьютер + Accessing computer and local computer + - Always process rule and ignore conditions - Всегда обрабатывать правило и игнорировать условия + User being accessed + - No user logged on - Пользователь не вошел + is logged in locally + + + + is logged in remotely + + + + No user is logged in locally + + + + One or multiple users are logged in locally + - Accessing user has one or more groups in common with local (logged on) user - Доступ к пользователю имеет одна или несколько групп, совместно с локальным пользователем (вошедшим в систему) + No user is logged in remotely + - Accessing computer and local computer are at the same location - Компьютер для доступа расположен в том же месте, что и локальный компьютер + One or multiple users are logged in remotely + is located at расположен в - Authenticated via method - Аутентификация помощью + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + является членом группы + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -1193,11 +1245,11 @@ The public key is used on client computers to authenticate incoming connection r [no user] - + [нет пользователя] Veyon Server unreachable or not running - + Сервер Veyon недоступен или не запущен @@ -1331,11 +1383,11 @@ The public key is used on client computers to authenticate incoming connection r ComputerZoomWidget %1 - %2 Computer Zoom Widget - + %1 - %2 Виджет масштабирования компьютера %1 - %2 - %3 Computer Zoom Widget - + %1 - %2 - %3 Виджет масштабирования компьютера @@ -1506,59 +1558,59 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Демонстрация Share your screen or allow a user to share his screen with other users. - + Демонстрировать свой экран или разрешить другим пользователям демонстрировать свой экран. Full screen demo - + Полноэкранная демонстрация Share your own screen in fullscreen mode - + Демонстрировать собственный экран в полноэкранном режиме In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + В этом режиме изображение с экрана вашего компьютера будет демонстрироваться на весь экран на всех компьютерах, а устройства ввода данных на компьютерах будут заблокированы. Share your own screen in a window - + Демонстрировать собственный экран в оконном режиме Share selected user's screen in fullscreen mode - + Демонстрировать экран выбранного пользователя в полноэкранном режиме In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + В этом режиме экран выбранного пользователя отображается в полноэкранном режиме на всех компьютерах, в то время как устройства ввода пользователей заблокированы. Share selected user's screen in a window - + Демонстрировать экран выбранного пользователя в оконном режиме In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + В этом режиме экран выбранного пользователя отображается в окне на всех компьютерах. При необходимости пользователи могут переключаться на другие окна. Please select a user screen to share. - + Выберите экран пользователя, который вы хотите демонстрировать. Please select only one user screen to share. - + Пожалуйста, выберите только один пользовательский экран для демонстрации. All screens - + Все экраны Screen %1 [%2] - + Экран %1 [%2] @@ -1758,11 +1810,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Целевой каталог Default source directory - + Исходный каталог по умолчанию Options @@ -1770,11 +1822,11 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + Запомнить последний исходный каталог Create destination directory if it does not exist - + Создайте целевой каталог, если он не существует @@ -1984,7 +2036,7 @@ The public key is used on client computers to authenticate incoming connection r HeadlessVncServer Headless VNC server - + Автоматический VNC-сервер @@ -2787,12 +2839,20 @@ The public key is used on client computers to authenticate incoming connection r Аутентификация пользователей - Session management - Управление сеансами + User sessions + + + + Minimum session lifetime before server start + + + + User login + Имя пользователя - Display manager users - Пользователи управления дисплеем + Login key sequence + @@ -3000,7 +3060,7 @@ The public key is used on client computers to authenticate incoming connection r &Advanced - &Рвсширенный + &Расширенный Use custom computer arrangement @@ -3016,15 +3076,15 @@ The public key is used on client computers to authenticate incoming connection r Adjust size of computer icons automatically - + Автоматическая регулировка размера значков компьютера Slideshow - + Слайд-шоу Spotlight - + Акцент @@ -3175,15 +3235,15 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail spacing - + Интервал миниатюр px - + пикселей Hide local session - + Скрыть локальные сессии Auto @@ -3191,15 +3251,15 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail aspect ratio - + Соотношение сторон миниатюры Automatically adjust computer icon size - + Автоматически настраивать размер значка компьютера Open feature windows on the same screen as the main window - + Открывать окно функций на том же экране, что и главное окно @@ -3454,7 +3514,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Удаленный доступ @@ -3575,15 +3635,15 @@ Please save your work and close all programs. Lock input devices - + Заблокировать устройства ввода Unlock input devices - + Разблокировать устройства ввода To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Вы можете использовать эту кнопку для привлечения полного внимания всех пользователей и блокировки их настольных компьютеров. В этом режиме блокируются все устройства ввода. @@ -3671,7 +3731,7 @@ Please save your work and close all programs. Do you really want to delete all selected screenshots? - + Вы действительно хотите удалить выбранные скриншоты? @@ -3748,7 +3808,7 @@ Typically this is required to support terminal servers. Maximum session count - + Максимальное количество сеансов Sessions @@ -3756,27 +3816,27 @@ Typically this is required to support terminal servers. Single session mode (create server instance for local/physical session only) - + Режим одиночного сеанса (создание сервера только для локального / физического сеанса) Multi session mode (create server instance for each local and remote desktop session) - + Многосессионный режим (создание сервера для каждого сеанса локального и удаленного рабочего стола) Network port numbers - + Номера сетевых портов Veyon server - + Veyon сервер Internal VNC server - + Встроенный VNC-сервер Feature manager - + Менеджер функций Demo server @@ -3784,7 +3844,7 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + Дополнительные настройки сети @@ -3876,51 +3936,52 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Предыдущий Start/pause - + Старт/пауза Next - + Следующий Duration: - + Продолжительность: SpotlightPanel Add selected computers - + Добавить выбранные компьютеры Remove selected computers - + Удалить выбранные компьютеры Update computers in realtime - + Обновлять компьютеры в реальном времени Spotlight - + Акцент Please select at least one computer to add. - + Выберите хотя бы один компьютер для добавления. Please select at least one computer to remove. - + Выберите хотя бы один компьютер для удаления. Add computers by clicking with the middle mouse button or clicking the first button below. The second button will remove the selected computer. If nothing is selected the last one will be removed. - + Добавьте компьютеры, щелкнув средней кнопкой мыши или нажав первую кнопку ниже. +Вторая кнопка удалит выбранный компьютер. Если ничего не выбрано, будет удален последний компьютер. @@ -4010,7 +4071,7 @@ The second button will remove the selected computer. If nothing is selected the Maximum CPU usage - + Максимальное использование ЦП diff --git a/translations/veyon_sl.ts b/translations/veyon_sl.ts index 03723408e..50951bcdd 100644 --- a/translations/veyon_sl.ts +++ b/translations/veyon_sl.ts @@ -175,30 +175,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: Opis pravila: - - Invert all conditions ("is/has" interpreted as "is/has not") - Obrni vse pogoje ("je/ima" razloženo kot "je/ni") - Conditions Pogoji - - is member of group - je član skupine - - - Accessing computer is localhost - Dostopni računalnik je lokalni gostitelj - - - Accessing user is logged on user - Dostopni uporabnik je prijavljen na uporabnik - - - Accessing user is already connected - Dostopni uporabnik je že povezan - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Če je aktiviranih več pogojev, se mora izpolniti vsak pogoj, da se pravilo uporabi (logični AND). Če se mora izpolniti samo eden od več pogojev (logični OR), ustvarite več pravil za nadzor dostopa. @@ -232,35 +212,107 @@ If you're interested in translating Veyon into your local or another langua Dostopni računalnik - Local (logged on) user - Lokalni (prijavljeni) uporabnik + Always process rule and ignore conditions + Vedno obdelaj pravila in prezri pogoje - Local computer - Lokalni računalnik + Accessing computer and local computer + - Always process rule and ignore conditions - Vedno obdelaj pravila in prezri pogoje + User being accessed + - No user logged on - Uporabnik ni prijavljen na + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - Dostopni uporabnik ima eno ali več skupnin, skupnih z lokalnim (prijavljenim) uporabnikom + is logged in remotely + - Accessing computer and local computer are at the same location - Dostop do računalnika in lokalni računalnik sta na isti lokaciji + No user is logged in locally + + + + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at se nahaja na - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + je član skupine + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2787,11 +2839,19 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_sr.ts b/translations/veyon_sr.ts index ab76381d6..9c0cd88a4 100644 --- a/translations/veyon_sr.ts +++ b/translations/veyon_sr.ts @@ -175,30 +175,10 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili Rule description: Opis pravila: - - Invert all conditions ("is/has" interpreted as "is/has not") - Zamenite sve uslove ("is / has" je protumačeno kao "je / nije") - Conditions Uslovi - - is member of group - je član grupe - - - Accessing computer is localhost - Pristup kompjuteru je lokalni - - - Accessing user is logged on user - Pristupni korisnik je prijavljen - - - Accessing user is already connected - Pristupni korisnik je već povezan - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Ako je aktivirano više od jednog uslova, svaki se uslov mora ispuniti da bi se pravilo primenilo (logično I). Ako mora biti ispunjen samo jedan od više uslova (logički ILI),kreirajte više pravila kontrole pristupa. @@ -232,35 +212,107 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili Pristup kompjuteru - Local (logged on) user - Lokalni (prijavljeni) korisnik + Always process rule and ignore conditions + Uvek obradi pravilo i ignoriši uslove - Local computer - Lokalni računar + Accessing computer and local computer + - Always process rule and ignore conditions - Uvek obradi pravilo i ignoriši uslove + User being accessed + - No user logged on - Nijedan korisnik nije prijavljen + is logged in locally + + + + is logged in remotely + - Accessing user has one or more groups in common with local (logged on) user - Korisnik koji ima pristup ima jednu ili više grupa zajedničkih s lokalnim (prijavljenim) korisnikom + No user is logged in locally + - Accessing computer and local computer are at the same location - Pristupni računar i lokalni računar su na istoj lokaciji + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at nalazi se na - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + je član grupe + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2789,12 +2841,20 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Autentifikacija korisnika - Session management - Upravljanje sesijama + User sessions + + + + Minimum session lifetime before server start + + + + User login + Prijava korisnika - Display manager users - Prikaz menadžera korisnika + Login key sequence + diff --git a/translations/veyon_sv.ts b/translations/veyon_sv.ts index ceee22c10..859c849d2 100644 --- a/translations/veyon_sv.ts +++ b/translations/veyon_sv.ts @@ -7,11 +7,11 @@ Translation - + Översättning License - + Licens About Veyon @@ -175,30 +175,10 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an Rule description: Regelbeskrivning: - - Invert all conditions ("is/has" interpreted as "is/has not") - Invertera alla villkor ("är/har" tolkas som "är/har inte") - Conditions Villkor - - is member of group - är medlem av gruppen - - - Accessing computer is localhost - Åtkomstdator är localhost - - - Accessing user is logged on user - Åtkomstanvändare är inloggad användare - - - Accessing user is already connected - Åtkomstanvändare är redan ansluten - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Om fler än ett villkor aktiveras behöver varje villkor mötas för att regeln ska gälla (logiskt OCH). Om endast en av flera villkor behöver mötas (logiskt ELLER) vänligen skapa flera åtkomstregler. @@ -232,27 +212,39 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an Åtkomstdator - Local (logged on) user - Lokal (inloggad) användare + Always process rule and ignore conditions + Bearbeta alltid regel- och ignoreringsvillkor - Local computer - Lokal dator + Accessing computer and local computer + - Always process rule and ignore conditions - Bearbeta alltid regel- och ignoreringsvillkor + User being accessed + - No user logged on - Ingen användare inloggad + is logged in locally + + + + is logged in remotely + - Accessing user has one or more groups in common with local (logged on) user - Åtkomstanvändaren har en eller flera grupper gemensamt med lokal (inloggad) användare + No user is logged in locally + + + + One or multiple users are logged in locally + + + + No user is logged in remotely + - Accessing computer and local computer are at the same location + One or multiple users are logged in remotely @@ -260,7 +252,67 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + är medlem av gruppen + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2765,11 +2817,19 @@ The public key is used on client computers to authenticate incoming connection r - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_th.ts b/translations/veyon_th.ts index 2c4c0c16e..f1451151f 100644 --- a/translations/veyon_th.ts +++ b/translations/veyon_th.ts @@ -167,36 +167,16 @@ If you're interested in translating Veyon into your local or another langua enter a description for the rule here - + กรอกคำอธิบายสำหรับกฏได้ที่นี่ Rule description: คำอธิบายกฏ: - - Invert all conditions ("is/has" interpreted as "is/has not") - - Conditions เงื่อนไข - - is member of group - เป็นสมาชิกของกลุ่ม - - - Accessing computer is localhost - - - - Accessing user is logged on user - - - - Accessing user is already connected - - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. @@ -230,27 +210,39 @@ If you're interested in translating Veyon into your local or another langua คอมพิวเตอร์ที่เข้าถึง - Local (logged on) user - ผู้ใช้ท้องที่ (อยู่ในระบบ) + Always process rule and ignore conditions + - Local computer - คอมพิวเตอร์ท้องที่ + Accessing computer and local computer + - Always process rule and ignore conditions + User being accessed - No user logged on - ไม่มีผู้ใช้เข้าสู่ระบบ + is logged in locally + + + + is logged in remotely + + + + No user is logged in locally + + + + One or multiple users are logged in locally + - Accessing user has one or more groups in common with local (logged on) user + No user is logged in remotely - Accessing computer and local computer are at the same location + One or multiple users are logged in remotely @@ -258,7 +250,67 @@ If you're interested in translating Veyon into your local or another langua - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + เป็นสมาชิกของกลุ่ม + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -1275,7 +1327,7 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + ค้นหาผู้ใช้และคอมพิวเตอร์ Select all @@ -1481,7 +1533,7 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + ลดความเร็วการอัปเดตภาพทัมเนลลงเมื่ออยู่ในโหมดสาธิต @@ -1504,19 +1556,19 @@ The public key is used on client computers to authenticate incoming connection r Demo - + สาธิต Share your screen or allow a user to share his screen with other users. - + แบ่งปันหน้าจอของคุณเอง หรืออนุญาตให้ผู้ใช้ได้แบ่งหน้าจอของเขาให้ผู้ใช้คนอื่น Full screen demo - + สาธิตแบบเต็มจอ Share your own screen in fullscreen mode - + แบ่งปันหน้าจอของคุณในโหมดเต็มหน้าจอ In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. @@ -1524,7 +1576,7 @@ The public key is used on client computers to authenticate incoming connection r Share your own screen in a window - + แบ่งปันหน้าจอของคุณในหน้าต่างแยก Share selected user's screen in fullscreen mode @@ -2766,11 +2818,19 @@ The public key is used on client computers to authenticate incoming connection r การยืนยันตัวตนผู้ใช้ - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence @@ -2789,7 +2849,7 @@ The public key is used on client computers to authenticate incoming connection r enter search filter... - + กรอกตัวกรองการค้นหา... @@ -2943,7 +3003,7 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + ค้นหาผู้ใช้และคอมพิวเตอร์ Align computers to grid @@ -2995,15 +3055,15 @@ The public key is used on client computers to authenticate incoming connection r Adjust size of computer icons automatically - + ตั้งค่าขนาดไอคอนคอมพิวเตอร์โดยอัตโนมัติ Slideshow - + สไลด์โชว์ Spotlight - + สปอร์ตไลท์ @@ -3174,7 +3234,7 @@ The public key is used on client computers to authenticate incoming connection r Automatically adjust computer icon size - + ปรับเปลี่ยนขนาดไอคอนของคอมพิวเตอร์โดยอัตโนมัติ Open feature windows on the same screen as the main window @@ -3193,7 +3253,7 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. - + โหมดนี้จะให้คุณได้สังเกตการณ์คอมพิวเตอร์ทุกเครื่องจากสถานที่ใดสถานที่หนึ่งหรือมากกว่านั้น @@ -3353,7 +3413,7 @@ The public key is used on client computers to authenticate incoming connection r The computer was remotely requested to power down. Do you want to power down the computer now? - + คอมพิวเตอร์ได้รับการร้องขอจากระยะไกลให้ปิดเครื่องลง คุณต้องการปิดเครื่องลงตอนนี้หรือไม่? The computer will be powered down in %1 minutes, %2 seconds. @@ -3398,7 +3458,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + เปิดหน้าต่างการเข้าควบคุมระยะไกลสำหรับคอมพิวเตอร์ Remote access @@ -3865,7 +3925,7 @@ Typically this is required to support terminal servers. Duration: - + ระยะเวลา: @@ -3884,7 +3944,7 @@ Typically this is required to support terminal servers. Spotlight - + สปอร์ตไลท์ Please select at least one computer to add. diff --git a/translations/veyon_tr.ts b/translations/veyon_tr.ts index f25c3092a..7db546ab7 100644 --- a/translations/veyon_tr.ts +++ b/translations/veyon_tr.ts @@ -175,30 +175,10 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v Rule description: Kural açıklaması: - - Invert all conditions ("is/has" interpreted as "is/has not") - Tüm koşulları tersine çevir ("is/has" [-dır], "is/has not" [...değildir] olarak yorumlanır) - Conditions Koşullar - - is member of group - kümenin üyesidir - - - Accessing computer is localhost - Giriş yapan bilgisayar yerel sunucudur - - - Accessing user is logged on user - Erişilen kullanıcı oturumu açmış - - - Accessing user is already connected - Erişilen kullanıcı zaten bağlı - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Eğer birden çok koşul etkinse, kuralın uygulanması için her koşulun yerine getirilmesi gerekiyorsa (mantıksal VE). Eğer birden çok koşulun yalnızca birinin yerine getirilmesi gerekiyorsa (mantıksal VEYA) lütfen çoğul erişim denetimi kuralları oluşturun. @@ -232,36 +212,108 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v Bilgisayara erişim - Local (logged on) user - Yerel (oturum açmış) kullanıcı + Always process rule and ignore conditions + Her zaman kuralı işle ve koşulları yok say - Local computer - Yerel bilgisayar + Accessing computer and local computer + - Always process rule and ignore conditions - Her zaman kuralı işle ve koşulları yok say + User being accessed + - No user logged on - Oturum açan kullanıcı yok + is logged in locally + + + + is logged in remotely + - Accessing user has one or more groups in common with local (logged on) user - Erişilen kullanıcı, yerel (oturum açmış) kullanıcıyla ortak bir veya daha çok kümeye sahip + No user is logged in locally + - Accessing computer and local computer are at the same location - Giriş yapan bilgisayar ve yerel bilgisayar aynı lokasyonda + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at bulunduğu yer - Authenticated via method - Yöntemle kimlik doğrulaması yapıldı + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + kümenin üyesidir + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -2779,12 +2831,20 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Kullanıcı doğrulama - Session management - Oturum yönetimi + User sessions + + + + Minimum session lifetime before server start + - Display manager users - Görüntü yöneticisi kullanıcıları + User login + Kullanıcı Girişi + + + Login key sequence + diff --git a/translations/veyon_uk.ts b/translations/veyon_uk.ts index 1ef333628..4acb4f9a4 100644 --- a/translations/veyon_uk.ts +++ b/translations/veyon_uk.ts @@ -175,30 +175,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: Опис правила: - - Invert all conditions ("is/has" interpreted as "is/has not") - Інверсія усіх умов («є або має» буде вважатися записом «не є або не має») - Conditions Умови - - is member of group - є учасником групи - - - Accessing computer is localhost - Комп’ютер для доступу є локальним - - - Accessing user is logged on user - Користувач для доступу є розпізнаним користувачем системи - - - Accessing user is already connected - Користувача для доступу вже з’єднано - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Якщо вказано декілька умов, для застосування правила має бути виконано усі ці умови (логічне «І»). Якщо має бути виконано хоч одну з декількох умов (логічне «АБО»), вам слід створити декілька відповідних правил керування доступом. @@ -232,36 +212,108 @@ If you're interested in translating Veyon into your local or another langua Комп’ютер для доступу - Local (logged on) user - Локальний користувач (у системі) + Always process rule and ignore conditions + Завжди обробляти правило і ігнорувати умови - Local computer - Локальний комп’ютер + Accessing computer and local computer + Доступ до комп'ютера і локальний комп'ютер - Always process rule and ignore conditions - Завжди обробляти правило і ігнорувати умови + User being accessed + Доступ до користувача - No user logged on - Немає користувачів у системі + is logged in locally + який увійшов локально + + + is logged in remotely + який увійшов віддалено - Accessing user has one or more groups in common with local (logged on) user - Користувач для доступу є учасником однієї або декількох груп, які є спільними із локальним (поточним) користувачем + No user is logged in locally + Жоден користувач не увійшов локально - Accessing computer and local computer are at the same location - Комп’ютер для доступу розташовано у тому самому місці, що і локальний комп’ютер + One or multiple users are logged in locally + Один або декілька користувачів увійшли локально + + + No user is logged in remotely + Жоден користувач не увійшов віддалено + + + One or multiple users are logged in remotely + Один або декілька користувачів увійшли віддалено is located at розташовано у - Authenticated via method - Розпізнавання за методом + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + є учасником групи + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -1328,11 +1380,11 @@ The public key is used on client computers to authenticate incoming connection r ComputerZoomWidget %1 - %2 Computer Zoom Widget - + %1 — віджет масштабування комп'ютерів %2 %1 - %2 - %3 Computer Zoom Widget - + %1 — %2 — віджет масштабування комп'ютерів %3 @@ -2786,12 +2838,20 @@ The public key is used on client computers to authenticate incoming connection r Розпізнавання користувача - Session management - Керування сеансами + User sessions + Сеанси користувачів - Display manager users - Користувачі керування дисплеєм + Minimum session lifetime before server start + Мінімальна тривалість сеансу до запуску сервера + + + User login + Вхід від імені користувача + + + Login key sequence + Послідовність ключів для входу @@ -3919,7 +3979,8 @@ Typically this is required to support terminal servers. Add computers by clicking with the middle mouse button or clicking the first button below. The second button will remove the selected computer. If nothing is selected the last one will be removed. - + Додайте комп'ютери клацанням середньої кнопки миші або натисканням першої кнопки нижче. +Другу кнопку призначено для вилучення позначеного комп'ютера. Якщо нічого не позначено, буде вилучено останній з комп'ютерів. diff --git a/translations/veyon_vi.ts b/translations/veyon_vi.ts index 3a2065531..47db80942 100644 --- a/translations/veyon_vi.ts +++ b/translations/veyon_vi.ts @@ -175,30 +175,10 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa Rule description: Mô tả quy tắc: - - Invert all conditions ("is/has" interpreted as "is/has not") - Đảo ngược tất cả các điều kiện (có được hiểu là không) - Conditions Điều kiện - - is member of group - là thành viên của nhóm - - - Accessing computer is localhost - Máy tính đang truy cập là localhost - - - Accessing user is logged on user - Người dùng đang truy cập là người dùng đã đăng nhập - - - Accessing user is already connected - Người dùng đang truy cập đã được kết nối - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. Nếu có nhiều hơn một điều kiện kích hoạt, mỗi điều kiện phải thỏa mãn để áp dụng quy tắc (AND logic). Nếu chỉ một trong số nhiều điều kiện phải thoải mãn (OR logic) vui lòng tạo nhiều quy tắc điều khiển truy cập. @@ -232,27 +212,39 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa Máy tính đang truy cập - Local (logged on) user - Người dùng cục bộ (đã đăng nhập) + Always process rule and ignore conditions + Luôn xử lý quy tắc và bỏ qua các điều kiện - Local computer - Máy tính cục bộ + Accessing computer and local computer + - Always process rule and ignore conditions - Luôn xử lý quy tắc và bỏ qua các điều kiện + User being accessed + - No user logged on - Không có người dùng đã đăng nhập + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - Người dùng đang truy cập có một hoặc nhiều nhóm chung với người dùng cục bộ (đã đăng nhập) + is logged in remotely + + + + No user is logged in locally + - Accessing computer and local computer are at the same location + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely @@ -260,7 +252,67 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + là thành viên của nhóm + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2768,11 +2820,19 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - Session management + User sessions + + + + Minimum session lifetime before server start + + + + User login - Display manager users + Login key sequence diff --git a/translations/veyon_zh_CN.ts b/translations/veyon_zh_CN.ts index 2538facbb..0587cf092 100644 --- a/translations/veyon_zh_CN.ts +++ b/translations/veyon_zh_CN.ts @@ -175,30 +175,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: 规则描述: - - Invert all conditions ("is/has" interpreted as "is/has not") - 反转所有条件(“是/有”变成“否/没有”) - Conditions 条件 - - is member of group - 是组成员 - - - Accessing computer is localhost - 正在访问局域网中的计算机 - - - Accessing user is logged on user - 访问的用户已登录 - - - Accessing user is already connected - 访问的用户已连接 - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. 如果激活多个条件,则必须满足每个条件才能适用规则(逻辑与)。 如果只需满足多个条件中的一个,(逻辑或),请创建多个访问控制规则。 @@ -232,35 +212,107 @@ If you're interested in translating Veyon into your local or another langua 访问计算机 - Local (logged on) user - 本地(登录)用户 + Always process rule and ignore conditions + 总是按规则运行并忽略条件 - Local computer - 本地计算机 + Accessing computer and local computer + - Always process rule and ignore conditions - 总是按规则运行并忽略条件 + User being accessed + - No user logged on - 没有用户登录 + is logged in locally + + + + is logged in remotely + - Accessing user has one or more groups in common with local (logged on) user - 访问用户有一个或多个与本地(登录)用户相同的组 + No user is logged in locally + - Accessing computer and local computer are at the same location - 访问计算机和本地计算机位于同一地点 + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at 位于 - Authenticated via method + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + 是组成员 + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed @@ -2788,12 +2840,20 @@ The public key is used on client computers to authenticate incoming connection r 用户验证 - Session management - 会话管理 + User sessions + + + + Minimum session lifetime before server start + + + + User login + 用户登陆 - Display manager users - 显示管理员用户 + Login key sequence + diff --git a/translations/veyon_zh_TW.ts b/translations/veyon_zh_TW.ts index e60bfb558..59b7b1509 100644 --- a/translations/veyon_zh_TW.ts +++ b/translations/veyon_zh_TW.ts @@ -175,30 +175,10 @@ If you're interested in translating Veyon into your local or another langua Rule description: 規則描述: - - Invert all conditions ("is/has" interpreted as "is/has not") - 反向所有條件 ("是/有" 解釋為 "不是/沒有") - Conditions 條件 - - is member of group - 是群組的成員 - - - Accessing computer is localhost - 存取電腦是 localhost - - - Accessing user is logged on user - 存取使用者是登入的使用者 - - - Accessing user is already connected - 存取使用者已經連線 - If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. 如果有啟用一個以上條件,每個條件必須滿足,以便使規則套用 (邏輯 AND)。 如果多個條件只有一個必須滿足 (邏輯 OR),請建立多個存取控制規則。 @@ -232,36 +212,108 @@ If you're interested in translating Veyon into your local or another langua 存取電腦 - Local (logged on) user - 本機 (登入的) 使用者 + Always process rule and ignore conditions + 始終處理規則和忽略條件 - Local computer - 本機電腦 + Accessing computer and local computer + - Always process rule and ignore conditions - 始終處理規則和忽略條件 + User being accessed + - No user logged on - 沒有使用者登入 + is logged in locally + - Accessing user has one or more groups in common with local (logged on) user - 存取使用者與本機 (登入的) 使用者有一個或數個群組在通用 + is logged in remotely + - Accessing computer and local computer are at the same location - 存取電腦和本機電腦位於同一位置 + No user is logged in locally + + + + One or multiple users are logged in locally + + + + No user is logged in remotely + + + + One or multiple users are logged in remotely + is located at 位於 - Authenticated via method - 透過方法進行身份驗證 + is not located at + + + + are located at the same location + + + + are not located the same location + + + + is member of group + 是群組的成員 + + + is not member of group + + + + is authenticated via + + + + is not authenticated via + + + + has one or more groups in common with user being accessed + + + + has no groups in common with user being accessed + + + + equals user being accessed + + + + is different from user being accessed + + + + is already connected + + + + is not connected + + + + is local computer + + + + is not local computer + + + + Computer being accessed + @@ -1197,7 +1249,7 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running - 無法連線 Veyon 伺服器或未執行 + Veyon 伺服器無法存取或未執行 @@ -1331,11 +1383,11 @@ The public key is used on client computers to authenticate incoming connection r ComputerZoomWidget %1 - %2 Computer Zoom Widget - + %1 - %2 電腦縮放小工具 %1 - %2 - %3 Computer Zoom Widget - + %1 - %2 - %3 電腦縮放小工具 @@ -1506,7 +1558,7 @@ The public key is used on client computers to authenticate incoming connection r Demo - 演示 + 示範 Share your screen or allow a user to share his screen with other users. @@ -1514,7 +1566,7 @@ The public key is used on client computers to authenticate incoming connection r Full screen demo - 全螢幕演示 + 全螢幕示範 Share your own screen in fullscreen mode @@ -2787,12 +2839,20 @@ The public key is used on client computers to authenticate incoming connection r 使用者身份驗證 - Session management - 工作階段管理 + User sessions + - Display manager users - 顯示管理員使用者 + Minimum session lifetime before server start + + + + User login + 使用者登入 + + + Login key sequence + 登入金鑰序列 @@ -3920,7 +3980,8 @@ Typically this is required to support terminal servers. Add computers by clicking with the middle mouse button or clicking the first button below. The second button will remove the selected computer. If nothing is selected the last one will be removed. - + 使用按一下滑鼠中鍵或按一下以下的第一個按鈕來加入電腦。 +第二個按鈕將移除選取的電腦。 如果未選取任何內容,則將移除最後一個。 From 637eaaf1939cccf39bd33ad2293c191ac113f3c9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 19 Apr 2021 15:59:23 +0200 Subject: [PATCH 0884/1765] CI: install Qt WebEngine/WebKit development files --- .ci/linux.centos.7.9/Dockerfile | 2 +- .ci/linux.centos.8.3/Dockerfile | 2 +- .ci/linux.debian.buster/Dockerfile | 2 +- .ci/linux.debian.stretch/Dockerfile | 2 +- .ci/linux.fedora.32/Dockerfile | 2 +- .ci/linux.fedora.33/Dockerfile | 2 +- .ci/linux.opensuse.15.2/Dockerfile | 2 +- .ci/linux.ubuntu.bionic/Dockerfile | 2 +- .ci/linux.ubuntu.focal/Dockerfile | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.ci/linux.centos.7.9/Dockerfile b/.ci/linux.centos.7.9/Dockerfile index a8e01f35b..8ec4c746a 100644 --- a/.ci/linux.centos.7.9/Dockerfile +++ b/.ci/linux.centos.7.9/Dockerfile @@ -5,7 +5,7 @@ RUN \ yum --enablerepo=extras install -y epel-release && \ yum install -y centos-release-scl && \ yum install -y git devtoolset-7 make cmake3 rpm-build fakeroot \ - qt5-qtbase-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel \ + qt5-qtbase-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebkit-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libjpeg-turbo-devel \ zlib-devel \ diff --git a/.ci/linux.centos.8.3/Dockerfile b/.ci/linux.centos.8.3/Dockerfile index fc8bbf564..c000d3a7f 100644 --- a/.ci/linux.centos.8.3/Dockerfile +++ b/.ci/linux.centos.8.3/Dockerfile @@ -6,7 +6,7 @@ RUN \ yum config-manager --set-enabled powertools && \ dnf install -y https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm && \ yum install -y git gcc-c++ make cmake rpm-build fakeroot \ - qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel \ + qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel \ diff --git a/.ci/linux.debian.buster/Dockerfile b/.ci/linux.debian.buster/Dockerfile index 6ced406b3..4718882b1 100644 --- a/.ci/linux.debian.buster/Dockerfile +++ b/.ci/linux.debian.buster/Dockerfile @@ -6,7 +6,7 @@ RUN \ apt-get install --no-install-recommends -y \ dpkg-dev \ git binutils gcc g++ make cmake rename file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/.ci/linux.debian.stretch/Dockerfile b/.ci/linux.debian.stretch/Dockerfile index bb7aa54f0..85b722753 100644 --- a/.ci/linux.debian.stretch/Dockerfile +++ b/.ci/linux.debian.stretch/Dockerfile @@ -6,7 +6,7 @@ RUN \ apt-get install --no-install-recommends -y \ dpkg-dev \ git binutils gcc g++ make cmake rename file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/.ci/linux.fedora.32/Dockerfile b/.ci/linux.fedora.32/Dockerfile index f9ae2820e..3ea6510ba 100644 --- a/.ci/linux.fedora.32/Dockerfile +++ b/.ci/linux.fedora.32/Dockerfile @@ -3,7 +3,7 @@ MAINTAINER Tobias Junghans RUN \ yum install -y git gcc-c++ make cmake rpm-build fakeroot \ - qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel \ + qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel \ diff --git a/.ci/linux.fedora.33/Dockerfile b/.ci/linux.fedora.33/Dockerfile index aed1c1d7c..3c6478799 100644 --- a/.ci/linux.fedora.33/Dockerfile +++ b/.ci/linux.fedora.33/Dockerfile @@ -3,7 +3,7 @@ MAINTAINER Tobias Junghans RUN \ yum install -y git gcc-c++ make cmake rpm-build fakeroot \ - qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel \ + qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel \ diff --git a/.ci/linux.opensuse.15.2/Dockerfile b/.ci/linux.opensuse.15.2/Dockerfile index 79370656a..42cd06153 100644 --- a/.ci/linux.opensuse.15.2/Dockerfile +++ b/.ci/linux.opensuse.15.2/Dockerfile @@ -3,7 +3,7 @@ MAINTAINER Tobias Junghans RUN \ zypper --gpg-auto-import-keys install -y git gcc-c++ make cmake rpm-build fakeroot \ - libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel \ + libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel libqt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg8-devel \ diff --git a/.ci/linux.ubuntu.bionic/Dockerfile b/.ci/linux.ubuntu.bionic/Dockerfile index 23350decd..1c6c16a48 100644 --- a/.ci/linux.ubuntu.bionic/Dockerfile +++ b/.ci/linux.ubuntu.bionic/Dockerfile @@ -5,7 +5,7 @@ RUN \ apt-get update && \ apt-get install --no-install-recommends -y \ git binutils gcc g++ make cmake rename file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/.ci/linux.ubuntu.focal/Dockerfile b/.ci/linux.ubuntu.focal/Dockerfile index 73636555b..360cf4fb5 100644 --- a/.ci/linux.ubuntu.focal/Dockerfile +++ b/.ci/linux.ubuntu.focal/Dockerfile @@ -6,7 +6,7 @@ RUN \ DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ dpkg-dev \ git binutils gcc g++ make cmake rename file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ From e2c7b348fe73e29f2f9fbc175b3cb2ceccb96267 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 20 Apr 2021 08:04:28 +0200 Subject: [PATCH 0885/1765] CI: don't disable PCH for CentOS 8.3 --- .ci/linux.centos.8.3/script.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/.ci/linux.centos.8.3/script.sh b/.ci/linux.centos.8.3/script.sh index 8a601d111..6c6d42088 100755 --- a/.ci/linux.centos.8.3/script.sh +++ b/.ci/linux.centos.8.3/script.sh @@ -2,7 +2,5 @@ set -e -export CMAKE_FLAGS="-DWITH_PCH=OFF" - $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "centos-8.3" From 58aebd9d99e7d2fd8eb58ea43b1eab3a8664f013 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 20 Apr 2021 08:09:44 +0200 Subject: [PATCH 0886/1765] VeyonCore: set Qt::AA_ShareOpenGLContexts app attribute Setting this attribute is recommended when using QWebEngine (as the WebTabs add-on does). --- core/src/VeyonCore.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 48485fed4..a5db2d504 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -221,6 +221,8 @@ void VeyonCore::setupApplicationParameters() QCoreApplication::setOrganizationDomain( QStringLiteral( "veyon.io" ) ); QCoreApplication::setApplicationName( QStringLiteral( "Veyon" ) ); + QCoreApplication::setAttribute( Qt::AA_ShareOpenGLContexts ); + #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QApplication::setAttribute( Qt::AA_UseHighDpiPixmaps ); #endif From 7f1a029808c8a704892fb95772306fbfdd895524 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 20 Apr 2021 10:39:25 +0200 Subject: [PATCH 0887/1765] NSIS: remove imageformats directory on uninstall --- nsis/veyon.nsi.in | 1 + 1 file changed, 1 insertion(+) diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index 0c1bc4ec3..da6465769 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -298,6 +298,7 @@ Delete "$INSTDIR\*.dll" Delete "$INSTDIR\*.TXT" Delete "$INSTDIR\*.url" RmDir /r "$INSTDIR\crypto" +RmDir /r "$INSTDIR\imageformats" RmDir /r "$INSTDIR\plugins" RmDir /r "$INSTDIR\platforms" RmDir /r "$INSTDIR\styles" From 7ab7491d25fa5f35e2399e4794bb5e338cfd28b3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 29 Apr 2021 14:25:08 +0200 Subject: [PATCH 0888/1765] Update translations --- translations/veyon_it.ts | 50 ++++++++++++++++++++-------------------- translations/veyon_uk.ts | 30 ++++++++++++------------ 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/translations/veyon_it.ts b/translations/veyon_it.ts index 1556d094a..8ed4ca013 100644 --- a/translations/veyon_it.ts +++ b/translations/veyon_it.ts @@ -217,35 +217,35 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche Accessing computer and local computer - + Accesso al computer e al computer locale User being accessed - + Accesso all'utente is logged in locally - + è connesso localmente is logged in remotely - + è connesso in remoto No user is logged in locally - + Nessun utente è connesso localmente One or multiple users are logged in locally - + Uno o più utenti hanno effettuato l'accesso in locale No user is logged in remotely - + Nessun utente è connesso in remoto One or multiple users are logged in remotely - + Uno o più utenti hanno effettuato l'accesso da remoto is located at @@ -253,15 +253,15 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche is not located at - + non si trova in are located at the same location - + si trovano nella stessa posizione are not located the same location - + non si trovano nella stessa posizione is member of group @@ -269,51 +269,51 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche is not member of group - + non è membro del gruppo is authenticated via - + è autenticato tramite is not authenticated via - + non è autenticato tramite has one or more groups in common with user being accessed - + ha uno o più gruppi in comune con l'utente a cui si accede has no groups in common with user being accessed - + non ha gruppi in comune con l'utente a cui si accede equals user being accessed - + è uguale all'utente a cui ha avuto accesso is different from user being accessed - + è diverso dall'utente che ha avuto accesso is already connected - + è già connesso is not connected - + non è connesso is local computer - + è il computer locale is not local computer - + non è un computer locale Computer being accessed - + Computer a cui si accede @@ -2827,11 +2827,11 @@ The public key is used on client computers to authenticate incoming connection r User sessions - + Sessioni utente Minimum session lifetime before server start - + Durata minima della sessione prima dell'avvio del server User login diff --git a/translations/veyon_uk.ts b/translations/veyon_uk.ts index 4acb4f9a4..671f65fa4 100644 --- a/translations/veyon_uk.ts +++ b/translations/veyon_uk.ts @@ -253,15 +253,15 @@ If you're interested in translating Veyon into your local or another langua is not located at - + не розташовано у are located at the same location - + розташовано у тому самому місці are not located the same location - + не розташовано у тому самому місці is member of group @@ -269,51 +269,51 @@ If you're interested in translating Veyon into your local or another langua is not member of group - + є учасником групи is authenticated via - + розпізнано за допомогою is not authenticated via - + не розпізнано за допомогою has one or more groups in common with user being accessed - + належать до однієї або декількох спільних груп із користувачем для доступу has no groups in common with user being accessed - + не належать до спільних груп із користувачем для доступу equals user being accessed - + збігається із користувачем для доступу is different from user being accessed - + не збігається із користувачем для доступу is already connected - + вже з'єднано is not connected - + не з'єднано is local computer - + є локальним комп'ютером is not local computer - + не є локальним комп'ютером Computer being accessed - + Комп'ютер для доступу From 4ceb7ff47da354b4006f5d6f5f61170bd7fa81e1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 29 Apr 2021 14:20:12 +0200 Subject: [PATCH 0889/1765] PlatformSessionFunctions: add currentSessionHasUser() --- core/src/PlatformSessionFunctions.h | 1 + plugins/platform/linux/LinuxSessionFunctions.cpp | 7 +++++++ plugins/platform/linux/LinuxSessionFunctions.h | 1 + plugins/platform/windows/WindowsSessionFunctions.cpp | 8 ++++++++ plugins/platform/windows/WindowsSessionFunctions.h | 1 + 5 files changed, 18 insertions(+) diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 06d366c02..497493e70 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -41,6 +41,7 @@ class PlatformSessionFunctions virtual SessionId currentSessionId() = 0; virtual QString currentSessionType() const = 0; + virtual bool currentSessionHasUser() const = 0; virtual bool currentSessionIsRemote() const = 0; }; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 35a9a4e09..154b6e3e5 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -40,6 +40,13 @@ LinuxSessionFunctions::SessionId LinuxSessionFunctions::currentSessionId() +bool LinuxSessionFunctions::currentSessionHasUser() const +{ + return getSessionClass( currentSessionPath() ) == Class::User; +} + + + QVariant LinuxSessionFunctions::getSessionProperty( const QString& session, const QString& property ) { QDBusInterface loginManager( QStringLiteral("org.freedesktop.login1"), diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 4e61d8dae..5364c10d4 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -82,6 +82,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions SessionId currentSessionId() override; QString currentSessionType() const override; + bool currentSessionHasUser() const override; bool currentSessionIsRemote() const override; static QStringList listSessions(); diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 867827184..c9700d935 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -57,3 +57,11 @@ bool WindowsSessionFunctions::currentSessionIsRemote() const { return WtsSessionManager::isRemote( WtsSessionManager::currentSession() ); } + + + +bool WindowsSessionFunctions::currentSessionHasUser() const +{ + return WtsSessionManager::querySessionInformation( WtsSessionManager::currentSession(), + WtsSessionManager::SessionInfo::UserName ).isEmpty() == false; +} diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index 3132b091a..5dce3144a 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -34,6 +34,7 @@ class WindowsSessionFunctions : public PlatformSessionFunctions SessionId currentSessionId() override; QString currentSessionType() const override; + bool currentSessionHasUser() const override; bool currentSessionIsRemote() const override; }; From 7c91325cc005758cd603190022e0b517d37e6e16 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 29 Apr 2021 14:20:45 +0200 Subject: [PATCH 0890/1765] Demo: only start client inside user sessions --- plugins/demo/DemoFeaturePlugin.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 3eb7d5c1f..0343787e6 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -34,6 +34,7 @@ #include "FeatureWorkerManager.h" #include "HostAddress.h" #include "Logger.h" +#include "PlatformSessionFunctions.h" #include "VeyonConfiguration.h" #include "VeyonMasterInterface.h" #include "VeyonServerInterface.h" @@ -329,6 +330,12 @@ bool DemoFeaturePlugin::handleFeatureMessage( VeyonServerInterface& server, return true; } + if( VeyonCore::platform().sessionFunctions().currentSessionHasUser() == false ) + { + vDebug() << "not starting demo client since not running in a user session"; + return true; + } + auto socket = qobject_cast( messageContext.ioDevice() ); if( socket == nullptr ) { From d7a432f7e89014d81a7390b9dc203fca802f71a3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 29 Apr 2021 14:21:20 +0200 Subject: [PATCH 0891/1765] ScreenLock: only lock screen inside user sessions --- plugins/screenlock/ScreenLockFeaturePlugin.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.cpp b/plugins/screenlock/ScreenLockFeaturePlugin.cpp index f3b19e5bb..1c24c930d 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.cpp +++ b/plugins/screenlock/ScreenLockFeaturePlugin.cpp @@ -28,6 +28,7 @@ #include "FeatureWorkerManager.h" #include "LockWidget.h" #include "PlatformCoreFunctions.h" +#include "PlatformSessionFunctions.h" #include "VeyonServerInterface.h" @@ -111,6 +112,12 @@ bool ScreenLockFeaturePlugin::handleFeatureMessage( VeyonServerInterface& server return true; } + if( VeyonCore::platform().sessionFunctions().currentSessionHasUser() == false ) + { + vDebug() << "not locking screen since not running in a user session"; + return true; + } + // forward message to worker server.featureWorkerManager().sendMessageToManagedSystemWorker( message ); From e172623c09ec685d6e8b624bd19dae3442a145f5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 29 Apr 2021 14:21:35 +0200 Subject: [PATCH 0892/1765] LinuxSessionFunctions: fix header include --- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 5364c10d4..93551a775 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -24,7 +24,7 @@ #pragma once -#include +#include #include #include "PlatformSessionFunctions.h" From 40d97697472d4c9aab394b0ffe4a6e385c9f9cf0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 29 Apr 2021 14:23:52 +0200 Subject: [PATCH 0893/1765] LinuxSessionFunctions: fix function order Keep it in sync with header file. --- .../platform/linux/LinuxSessionFunctions.cpp | 112 +++++++++--------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 154b6e3e5..d7889a7fc 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -40,6 +40,24 @@ LinuxSessionFunctions::SessionId LinuxSessionFunctions::currentSessionId() +QString LinuxSessionFunctions::currentSessionType() const +{ + const auto env = QProcessEnvironment::systemEnvironment(); + + if( env.contains( QStringLiteral("WAYLAND_DISPLAY") ) ) + { + return QStringLiteral("wayland"); + } + else if( env.contains( QStringLiteral("DISPLAY") ) ) + { + return QStringLiteral("x11"); + } + + return getSessionProperty( currentSessionPath(), QStringLiteral("Type") ).toString(); +} + + + bool LinuxSessionFunctions::currentSessionHasUser() const { return getSessionClass( currentSessionPath() ) == Class::User; @@ -47,6 +65,44 @@ bool LinuxSessionFunctions::currentSessionHasUser() const +bool LinuxSessionFunctions::currentSessionIsRemote() const +{ + return isRemote( currentSessionPath() ); +} + + + +QStringList LinuxSessionFunctions::listSessions() +{ + QStringList sessions; + + const QDBusReply reply = LinuxCoreFunctions::systemdLoginManager()->call( QStringLiteral("ListSessions") ); + + if( reply.isValid() ) + { + const auto data = reply.value(); + + data.beginArray(); + while( data.atEnd() == false ) + { + LoginDBusSession session; + + data.beginStructure(); + data >> session.id >> session.uid >> session.name >> session.seatId >> session.path; + data.endStructure(); + + sessions.append( session.path.path() ); + } + return sessions; + } + + vCritical() << "Could not query sessions:" << reply.error().message(); + + return sessions; +} + + + QVariant LinuxSessionFunctions::getSessionProperty( const QString& session, const QString& property ) { QDBusInterface loginManager( QStringLiteral("org.freedesktop.login1"), @@ -224,31 +280,6 @@ QProcessEnvironment LinuxSessionFunctions::getSessionEnvironment( int sessionLea -QString LinuxSessionFunctions::currentSessionType() const -{ - const auto env = QProcessEnvironment::systemEnvironment(); - - if( env.contains( QStringLiteral("WAYLAND_DISPLAY") ) ) - { - return QStringLiteral("wayland"); - } - else if( env.contains( QStringLiteral("DISPLAY") ) ) - { - return QStringLiteral("x11"); - } - - return getSessionProperty( currentSessionPath(), QStringLiteral("Type") ).toString(); -} - - - -bool LinuxSessionFunctions::currentSessionIsRemote() const -{ - return isRemote( currentSessionPath() ); -} - - - QString LinuxSessionFunctions::currentSessionPath() { const auto xdgSessionId = QProcessEnvironment::systemEnvironment().value( xdgSessionIdEnvVarName() ); @@ -262,37 +293,6 @@ QString LinuxSessionFunctions::currentSessionPath() -QStringList LinuxSessionFunctions::listSessions() -{ - QStringList sessions; - - const QDBusReply reply = LinuxCoreFunctions::systemdLoginManager()->call( QStringLiteral("ListSessions") ); - - if( reply.isValid() ) - { - const auto data = reply.value(); - - data.beginArray(); - while( data.atEnd() == false ) - { - LoginDBusSession session; - - data.beginStructure(); - data >> session.id >> session.uid >> session.name >> session.seatId >> session.path; - data.endStructure(); - - sessions.append( session.path.path() ); - } - return sessions; - } - - vCritical() << "Could not query sessions:" << reply.error().message(); - - return sessions; -} - - - bool LinuxSessionFunctions::isOpen( const QString& session ) { const auto state = getSessionState( session ); From 7a9f9e6f891f6568e1f589a73534552c6deda918 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 09:31:11 +0200 Subject: [PATCH 0894/1765] DesktopAccessDialog: use uniform button layout The layout (order) of buttons in dialogs varies across platforms, toolkits and desktop environments. For a consistent user experience on Linux where a Qt-based display manager such as SDDM and Gtk-based sessions such as Gnome/Xfce may be used, use a fixed button box layout with Yes/Always on the left and No/Never on the right. --- core/src/DesktopAccessDialog.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index 4df73c50b..b044f95cb 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -143,6 +144,8 @@ DesktopAccessDialog::Choice DesktopAccessDialog::requestDesktopAccess( const QSt tr( "The user %1 at computer %2 wants to access your desktop. Do you want to grant access?" ). arg( user, hostName ), QMessageBox::Yes | QMessageBox::No ); + m.setStyleSheet( QStringLiteral("button-layout:%1").arg(QDialogButtonBox::WinLayout) ); + auto neverBtn = m.addButton( tr( "Never for this session" ), QMessageBox::NoRole ); auto alwaysBtn = m.addButton( tr( "Always for this session" ), QMessageBox::YesRole ); From 760e92c0a188ff72286b1f81344f8799afa8eeec Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 09:55:56 +0200 Subject: [PATCH 0895/1765] PowerControl, UserSessionControl: improve confirmation dialog Closes #374. --- .../PowerControlFeaturePlugin.cpp | 14 ++++++++++---- .../powercontrol/PowerControlFeaturePlugin.h | 2 +- .../UserSessionControlPlugin.cpp | 19 ++++++++++++------- .../UserSessionControlPlugin.h | 2 +- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index b43a50a77..53b0f5be1 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -173,7 +173,11 @@ bool PowerControlFeaturePlugin::startFeature( VeyonMasterInterface& master, cons return true; } - if( confirmFeatureExecution( feature, master.mainWindow() ) == false ) + const auto selectionCount = master.selectedComputerControlInterfaces().size(); + + if( confirmFeatureExecution( feature, + selectionCount == 0 || selectionCount == computerControlInterfaces.size(), + master.mainWindow() ) == false ) { return false; } @@ -286,7 +290,7 @@ CommandLinePluginInterface::RunResult PowerControlFeaturePlugin::handle_on( cons -bool PowerControlFeaturePlugin::confirmFeatureExecution( const Feature& feature, QWidget* parent ) +bool PowerControlFeaturePlugin::confirmFeatureExecution( const Feature& feature, bool all, QWidget* parent ) { if( VeyonCore::config().confirmUnsafeActions() == false ) { @@ -296,7 +300,8 @@ bool PowerControlFeaturePlugin::confirmFeatureExecution( const Feature& feature, if( feature == m_rebootFeature ) { return QMessageBox::question( parent, tr( "Confirm reboot" ), - tr( "Do you really want to reboot the selected computers?" ) ) == + all ? tr( "Do you really want to reboot ALL computers?" ) + : tr( "Do you really want to reboot the selected computers?" ) ) == QMessageBox::Yes; } @@ -307,7 +312,8 @@ bool PowerControlFeaturePlugin::confirmFeatureExecution( const Feature& feature, feature == m_powerDownDelayedFeature ) { return QMessageBox::question( parent, tr( "Confirm power down" ), - tr( "Do you really want to power down the selected computer?" ) ) == + all ? tr( "Do you really want to power down ALL computers?" ) + : tr( "Do you really want to power down the selected computers?" ) ) == QMessageBox::Yes; } diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.h b/plugins/powercontrol/PowerControlFeaturePlugin.h index 871f92493..f41524c66 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.h +++ b/plugins/powercontrol/PowerControlFeaturePlugin.h @@ -110,7 +110,7 @@ public Q_SLOTS: CommandLinePluginInterface::RunResult handle_on( const QStringList& arguments ); private: - bool confirmFeatureExecution( const Feature& feature, QWidget* parent ); + bool confirmFeatureExecution( const Feature& feature, bool all, QWidget* parent ); static bool broadcastWOLPacket( QString macAddress ); void confirmShutdown(); diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp index f6f7f1fd3..e4af983d9 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp @@ -95,11 +95,6 @@ bool UserSessionControlPlugin::startFeature( VeyonMasterInterface& master, const { Q_UNUSED(master) - if( confirmFeatureExecution( feature, master.mainWindow() ) == false ) - { - return false; - } - if( feature == m_userLoginFeature ) { UserLoginDialog loginDialog( master.mainWindow() ); @@ -115,6 +110,15 @@ bool UserSessionControlPlugin::startFeature( VeyonMasterInterface& master, const } else if( feature == m_userLogoffFeature ) { + const auto selectionCount = master.selectedComputerControlInterfaces().size(); + + if( confirmFeatureExecution( feature, + selectionCount == 0 || selectionCount == computerControlInterfaces.size(), + master.mainWindow() ) == false ) + { + return true; + } + return controlFeature( feature.uid(), Operation::Start, {}, computerControlInterfaces ); } @@ -149,7 +153,7 @@ bool UserSessionControlPlugin::handleFeatureMessage( VeyonServerInterface& serve -bool UserSessionControlPlugin::confirmFeatureExecution( const Feature& feature, QWidget* parent ) +bool UserSessionControlPlugin::confirmFeatureExecution( const Feature& feature, bool all, QWidget* parent ) { if( VeyonCore::config().confirmUnsafeActions() == false ) { @@ -159,7 +163,8 @@ bool UserSessionControlPlugin::confirmFeatureExecution( const Feature& feature, if( feature == m_userLogoffFeature ) { return QMessageBox::question( parent, tr( "Confirm user logoff" ), - tr( "Do you really want to log off the selected users?" ) ) == + all ? tr( "Do you really want to log off ALL users?" ) + : tr( "Do you really want to log off the selected users?" ) ) == QMessageBox::Yes; } diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.h b/plugins/usersessioncontrol/UserSessionControlPlugin.h index 65fe9e39b..324ab4d73 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.h +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.h @@ -90,7 +90,7 @@ class UserSessionControlPlugin : public QObject, public FeatureProviderInterface const FeatureMessage& message ) override; private: - bool confirmFeatureExecution( const Feature& feature, QWidget* parent ); + bool confirmFeatureExecution( const Feature& feature, bool all, QWidget* parent ); const Feature m_userLoginFeature; const Feature m_userLogoffFeature; From f5541d4437ec662e61da0e27897cfc4dc3779a58 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 10:10:58 +0200 Subject: [PATCH 0896/1765] AccessControl: add condition UserSession This condition allows distinguishing between user sessions and login screens. --- .../src/AccessControlRuleEditDialog.cpp | 2 + .../src/AccessControlRuleEditDialog.ui | 42 +++++++++++++++++++ core/src/AccessControlProvider.cpp | 10 +++++ core/src/AccessControlRule.h | 1 + 4 files changed, 55 insertions(+) diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index db508f53c..a8d8b853b 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -96,6 +96,7 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule loadCondition ( ui->isAccessedUserLoggedInLocally, ui->invertIsAccessedUserLoggedInLocally, AccessControlRule::Condition::AccessedUserLoggedInLocally ); loadCondition ( ui->isNoUserLoggedInLocally, ui->invertIsNoUserLoggedInLocally, AccessControlRule::Condition::NoUserLoggedInLocally ); loadCondition ( ui->isNoUserLoggedInRemotely, ui->invertIsNoUserLoggedInRemotely, AccessControlRule::Condition::NoUserLoggedInRemotely ); + loadCondition ( ui->isUserSession, ui->invertIsUserSession, AccessControlRule::Condition::UserSession ); // load selected condition subjects ui->isMemberOfGroupSubject->setCurrentText( m_subjectNameMap.value( rule.subject( AccessControlRule::Condition::MemberOfGroup ) ) ); @@ -173,6 +174,7 @@ void AccessControlRuleEditDialog::accept() saveCondition( ui->isNoUserLoggedInLocally, ui->invertIsNoUserLoggedInLocally, AccessControlRule::Condition::NoUserLoggedInLocally ); saveCondition( ui->isNoUserLoggedInRemotely, ui->invertIsNoUserLoggedInRemotely, AccessControlRule::Condition::NoUserLoggedInRemotely ); + saveCondition( ui->isUserSession, ui->invertIsUserSession, AccessControlRule::Condition::UserSession ); // save action if( ui->actionAllowRadioButton->isChecked() ) diff --git a/configurator/src/AccessControlRuleEditDialog.ui b/configurator/src/AccessControlRuleEditDialog.ui index ce5313a0e..cde43d4de 100644 --- a/configurator/src/AccessControlRuleEditDialog.ui +++ b/configurator/src/AccessControlRuleEditDialog.ui @@ -421,6 +421,30 @@ + + + + + + + + + false + + + + Session being accessed is a user session + + + + + Session being accessed is a login screen + + + + + + @@ -537,6 +561,8 @@ invertIsNoUserLoggedInLocally isNoUserLoggedInRemotely invertIsNoUserLoggedInRemotely + isUserSession + invertIsUserSession actionAllowRadioButton actionDenyRadioButton actionAskForPermissionRadioButton @@ -848,6 +874,22 @@ + + isUserSession + toggled(bool) + invertIsUserSession + setEnabled(bool) + + + 39 + 761 + + + 492 + 761 + + + diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index e28e8c0de..7b5ba4580 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -479,6 +479,16 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, } } + if( rule.isConditionEnabled( AccessControlRule::Condition::UserSession ) ) + { + condition = AccessControlRule::Condition::UserSession; + + if( VeyonCore::platform().sessionFunctions().currentSessionHasUser() == rule.isConditionInverted(condition) ) + { + return false; + } + } + // do not match the rule if no conditions are set at all if( condition == AccessControlRule::Condition::None ) { diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index dbdf4ea73..ccbf3df91 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -57,6 +57,7 @@ class VEYON_CORE_EXPORT AccessControlRule NoUserLoggedInLocally, NoUserLoggedInRemotely, AccessedUserLoggedInLocally, + UserSession, AuthenticationMethod } ; From d6f40a0dba1ab3a6e1d0df5c7d07dd090ee14825 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 11:10:58 +0200 Subject: [PATCH 0897/1765] QML: minor code modernizations --- master/qml/ComputerGroupSelector.qml | 10 +++---- master/qml/ComputerMonitoring.qml | 40 ++++++++++++++-------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/master/qml/ComputerGroupSelector.qml b/master/qml/ComputerGroupSelector.qml index 52cf74a7e..9b3056386 100644 --- a/master/qml/ComputerGroupSelector.qml +++ b/master/qml/ComputerGroupSelector.qml @@ -7,19 +7,19 @@ Repeater { property var availableGroups: { var groups = [] - for( var i = 0; i < count; ++i ) + for( let i = 0; i < count; ++i ) { - var item = itemAt(i) + let item = itemAt(i) groups.push( { "text": item.name, "color": item.groupColor } ) } return groups } property var selectedGroups: { - var groups = [] - for( var i = 0; i < count; ++i ) + let groups = [] + for( let i = 0; i < count; ++i ) { - var item = itemAt(i) + let item = itemAt(i) if( item.checked ) { groups.push( item.groupColor ) diff --git a/master/qml/ComputerMonitoring.qml b/master/qml/ComputerMonitoring.qml index 5369c2269..f32e69c74 100644 --- a/master/qml/ComputerMonitoring.qml +++ b/master/qml/ComputerMonitoring.qml @@ -6,7 +6,7 @@ import Veyon.Master 5.0 Page { title: qsTr("Computers") - property bool canBeClosed: false + readonly property bool canBeClosed: false header: Flow { Repeater { @@ -38,13 +38,13 @@ Page { groupFilter: computerGroupSelector.selectedGroups anchors.fill: parent - selectedObjects : { - var objectUids = []; - for( var item in computerMonitoringView.selectedItems ) + selectedObjects: { + let objectUids = [] + for( let item in computerMonitoringView.selectedItems ) { objectUids.push(computerMonitoringView.selectedItems[item].objectUid) } - return objectUids; + return objectUids } Rectangle { @@ -72,56 +72,56 @@ Page { function setAllSelected( selected ) { - for( var child in contentItem.children ) + for( let child in contentItem.children ) { - var item = contentItem.children[child]; + var item = contentItem.children[child] if( item.isComputerItem ) { - item.selected = selected; + item.selected = selected } } } function addSelectedToGroup( group ) { - for( var item in selectedItems ) + for( let item in selectedItems ) { - selectedItems[item].addGroup( [group] ); + selectedItems[item].addGroup( [group] ) } } function removeSelectedFromGroup( group ) { - for( var item in selectedItems ) + for( let item in selectedItems ) { - selectedItems[item].removeGroup( [group] ); + selectedItems[item].removeGroup( [group] ) } } property var selectedItems : { - var items = []; - for( var child in contentItem.children ) + var items = [] + for( let child in contentItem.children ) { - var item = contentItem.children[child]; + let item = contentItem.children[child] if( item.isComputerItem && item.selected ) { items.push(item) } } - return items; + return items } property var allItems : { - var items = []; - for( var child in contentItem.children ) + var items = [] + for( let child in contentItem.children ) { - var item = contentItem.children[child]; + var item = contentItem.children[child] if( item.isComputerItem ) { items.push(item) } } - return items; + return items } property bool selecting: selectedItems.length > 0 From f455a24d0ef2ab10b53199e32084821f049b30a6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 11:11:19 +0200 Subject: [PATCH 0898/1765] QML: improve font sizing and button layout --- master/qml/ButtonMenu.qml | 2 +- master/qml/FeatureButton.qml | 10 +++++----- master/qml/main.qml | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/master/qml/ButtonMenu.qml b/master/qml/ButtonMenu.qml index 5ebcb7da3..07f3afd2c 100644 --- a/master/qml/ButtonMenu.qml +++ b/master/qml/ButtonMenu.qml @@ -18,7 +18,7 @@ Menu { id: repeater model: groupSelector.availableGroups MenuItem { - contentItem: Text { + contentItem: Label { text: modelData.text color: modelData.color horizontalAlignment: Text.AlignLeft diff --git a/master/qml/FeatureButton.qml b/master/qml/FeatureButton.qml index 2dc9af8c9..a5d579246 100644 --- a/master/qml/FeatureButton.qml +++ b/master/qml/FeatureButton.qml @@ -11,7 +11,7 @@ Button { topInset: 0 bottomInset: 0 padding: 4 - width: height*1.2 + width: height*1.3 background: Rectangle { color: control.down ? "#ddd" : control.hovered ? "#eee" : "transparent" @@ -31,14 +31,14 @@ Button { Label { id: label text: control.text - verticalAlignment: Text.AlignBottom + horizontalAlignment: Label.AlignHCenter + verticalAlignment: Label.AlignBottom fontSizeMode: Label.Fit + Layout.fillWidth: true Layout.leftMargin: 5 Layout.rightMargin: 5 Layout.bottomMargin: 5 - Layout.maximumWidth: control.width - 2*control.padding - Layout.alignment: Qt.AlignCenter | Qt.AlignBottom - clip: true + minimumPointSize: font.pointSize * 0.75 elide: Label.ElideRight } } diff --git a/master/qml/main.qml b/master/qml/main.qml index 9ab5253f7..036c3123a 100644 --- a/master/qml/main.qml +++ b/master/qml/main.qml @@ -11,6 +11,7 @@ ApplicationWindow { visible: true width: 1600 height: 900 + font.pointSize: 10 property color themeColor: "#00BCD4"; property bool landscape: width > height From ebedda01899fb69a23a945d14fffc9dede1c1e46 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 11:11:50 +0200 Subject: [PATCH 0899/1765] QML: ComputerMonitoring: add scrollbar --- master/qml/ComputerMonitoring.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/master/qml/ComputerMonitoring.qml b/master/qml/ComputerMonitoring.qml index f32e69c74..101d2819a 100644 --- a/master/qml/ComputerMonitoring.qml +++ b/master/qml/ComputerMonitoring.qml @@ -65,6 +65,11 @@ Page { textColor: computerMonitoring.textColor } + ScrollBar.vertical: ScrollBar { + visible: computerMonitoringView.contentHeight > computerMonitoringView.height + policy: visible ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff + } + Label { id: dummyLabel visible: false From ee9edc5ce79b3fa606d1c43fd80f829703e51b6c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 11:12:18 +0200 Subject: [PATCH 0900/1765] ComputerMonitoringView: set initial icon size --- master/src/ComputerMonitoringView.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 74fb6655a..d4d58ddb8 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -57,6 +57,8 @@ void ComputerMonitoringView::initializeView( QObject* self ) setColors( VeyonCore::config().computerMonitoringBackgroundColor(), VeyonCore::config().computerMonitoringTextColor() ); + setIconSize( m_master->computerControlListModel().computerScreenSize() ); + setComputerScreenSize( m_master->userConfig().monitoringScreenSize() ); loadComputerPositions( m_master->userConfig().computerPositions() ); From 669d23af785cc4e7241619eecf31276fe09db1b7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 11:21:53 +0200 Subject: [PATCH 0901/1765] PowerControlFeaturePlugin: call hasFeature() early Avoids unnecessary calls to VeyonMaster::selectedComputerControlInterfaces(). --- plugins/powercontrol/PowerControlFeaturePlugin.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 53b0f5be1..606a9ef8d 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -121,7 +121,7 @@ bool PowerControlFeaturePlugin::controlFeature( Feature::Uid featureUid, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ) { - if( hasFeature( featureUid ) == false || operation != Operation::Start ) + if( operation != Operation::Start ) { return false; } @@ -154,6 +154,11 @@ bool PowerControlFeaturePlugin::controlFeature( Feature::Uid featureUid, bool PowerControlFeaturePlugin::startFeature( VeyonMasterInterface& master, const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) { + if( hasFeature( feature.uid() ) == false ) + { + return false; + } + if( feature == m_powerOnFeature ) { return controlFeature( feature.uid(), Operation::Start, {}, computerControlInterfaces ); From b861f2d3e5733805357fe7e6b9a883e598faa2fc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 11:24:45 +0200 Subject: [PATCH 0902/1765] VeyonMaster: fix selectedComputerControlInterfaces() with QML UI --- master/src/VeyonMaster.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 5232bd57e..efdb6ae3d 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -216,7 +216,18 @@ void VeyonMaster::reloadSubFeatures() ComputerControlInterfaceList VeyonMaster::selectedComputerControlInterfaces() const { - return m_mainWindow->selectedComputerControlInterfaces(); + if( m_mainWindow ) + { + return m_mainWindow->selectedComputerControlInterfaces(); + } + + const auto monitoringItem = m_appContainer->findChild(); + if( monitoringItem ) + { + return monitoringItem->selectedComputerControlInterfaces(); + } + + return {}; } From 5620e42bea5e170c2de08624dc3f3edd8cecb260 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 11:25:22 +0200 Subject: [PATCH 0903/1765] VeyonMaster: exclude meta features from global feature list --- master/src/VeyonMaster.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index efdb6ae3d..13a8b0fd2 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -373,9 +373,10 @@ FeatureList VeyonMaster::featureList() const for( const auto& feature : m_featureManager->features( pluginUid ) ) { if( feature.testFlag( Feature::Master ) && - feature.testFlag( Feature::Mode ) && - feature.parentUid().isNull() && - disabledFeatures.contains( feature.uid().toString() ) == false ) + feature.testFlag( Feature::Mode ) && + feature.testFlag( Feature::Meta ) == false && + feature.parentUid().isNull() && + disabledFeatures.contains( feature.uid().toString() ) == false ) { features += feature; } @@ -387,9 +388,10 @@ FeatureList VeyonMaster::featureList() const for( const auto& feature : m_featureManager->features( pluginUid ) ) { if( feature.testFlag( Feature::Master ) && - feature.testFlag( Feature::Mode ) == false && - feature.parentUid().isNull() && - disabledFeatures.contains( feature.uid().toString() ) == false ) + feature.testFlag( Feature::Mode ) == false && + feature.testFlag( Feature::Meta ) == false && + feature.parentUid().isNull() && + disabledFeatures.contains( feature.uid().toString() ) == false ) { features += feature; } From 04f2ef3dfdf4920eb07f94a30b626eeb1866aef5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 13:44:22 +0200 Subject: [PATCH 0904/1765] FileTransferFileDialog: set dialog modality --- plugins/filetransfer/FileTransferFileDialog.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/filetransfer/FileTransferFileDialog.qml b/plugins/filetransfer/FileTransferFileDialog.qml index 756e311c1..71e987c6c 100644 --- a/plugins/filetransfer/FileTransferFileDialog.qml +++ b/plugins/filetransfer/FileTransferFileDialog.qml @@ -7,6 +7,7 @@ FileDialog { title: qsTr("Select one or more files to transfer") selectMultiple: true visible: true + modality: Qt.ApplicationModal Component.onCompleted: folder = context.lastFileTransferSourceDirectory From d5335e913967376f4c570044da165115d9633095 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 13:44:56 +0200 Subject: [PATCH 0905/1765] TextMessageDialog: set dialog modality --- plugins/textmessage/TextMessageDialog.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/textmessage/TextMessageDialog.qml b/plugins/textmessage/TextMessageDialog.qml index fb169d54b..a0bc1df8c 100644 --- a/plugins/textmessage/TextMessageDialog.qml +++ b/plugins/textmessage/TextMessageDialog.qml @@ -9,6 +9,7 @@ Dialog { y: (parent.height - height) / 2 standardButtons: Dialog.Ok | Dialog.Cancel visible: true + modal: true onAccepted: { context.acceptTextMessage(textArea.text) From 18469f9fb1f9df890d5514af7cf44b2ff59d772e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 13:45:06 +0200 Subject: [PATCH 0906/1765] TextMessageDialog: improve text and fix wrap mode --- plugins/textmessage/TextMessageDialog.qml | 4 +++- plugins/textmessage/TextMessageDialog.ui | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/textmessage/TextMessageDialog.qml b/plugins/textmessage/TextMessageDialog.qml index a0bc1df8c..6cc3c0c6f 100644 --- a/plugins/textmessage/TextMessageDialog.qml +++ b/plugins/textmessage/TextMessageDialog.qml @@ -20,7 +20,9 @@ Dialog { ColumnLayout { anchors.fill: parent Label { - text: qsTr("Use the field below to type your message which will be sent to all selected users.") + text: qsTr("Please enter your message which send to all selected users.") + wrapMode: Label.WordWrap + Layout.fillWidth: true } TextArea { diff --git a/plugins/textmessage/TextMessageDialog.ui b/plugins/textmessage/TextMessageDialog.ui index 3e593624d..e13e685d3 100644 --- a/plugins/textmessage/TextMessageDialog.ui +++ b/plugins/textmessage/TextMessageDialog.ui @@ -14,7 +14,7 @@ - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. true From b1599364a932021431eb87bf549cdec6db814bc6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 14:06:36 +0200 Subject: [PATCH 0907/1765] DesktopServices: refactor for QML support On this occasion also rename the "Run program" feature to "Start application" and adopt the name change everywhere. --- master/src/DocumentationFigureCreator.cpp | 14 +- master/src/DocumentationFigureCreator.h | 4 +- plugins/desktopservices/CMakeLists.txt | 6 +- .../desktopservices/DesktopServiceObject.h | 2 +- .../DesktopServicesConfiguration.h | 3 +- .../DesktopServicesConfigurationPage.cpp | 26 +- .../DesktopServicesConfigurationPage.h | 6 +- .../DesktopServicesConfigurationPage.ui | 34 +-- .../DesktopServicesFeaturePlugin.cpp | 225 +++++++++++------- .../DesktopServicesFeaturePlugin.h | 35 ++- plugins/desktopservices/OpenWebsiteDialog.qml | 47 ++++ ...unProgramDialog.cpp => StartAppDialog.cpp} | 30 +-- .../{RunProgramDialog.h => StartAppDialog.h} | 18 +- plugins/desktopservices/StartAppDialog.qml | 49 ++++ ...{RunProgramDialog.ui => StartAppDialog.ui} | 16 +- plugins/desktopservices/desktopservices.qrc | 2 + 16 files changed, 342 insertions(+), 175 deletions(-) create mode 100644 plugins/desktopservices/OpenWebsiteDialog.qml rename plugins/desktopservices/{RunProgramDialog.cpp => StartAppDialog.cpp} (62%) rename plugins/desktopservices/{RunProgramDialog.h => StartAppDialog.h} (77%) create mode 100644 plugins/desktopservices/StartAppDialog.qml rename plugins/desktopservices/{RunProgramDialog.ui => StartAppDialog.ui} (88%) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index 18da54479..42f3a84fd 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -74,8 +74,8 @@ void DocumentationFigureCreator::run() createTextMessageDialogFigure(); createOpenWebsiteDialogFigure(); createWebsiteMenuFigure(); - createRunProgramDialogFigure(); - createProgramMenuFigure(); + createStartAppDialogFigure(); + createAppMenuFigure(); createRemoteAccessHostDialogFigure(); createRemoteAccessWindowFigure(); createPowerDownOptionsFigure(); @@ -386,14 +386,14 @@ void DocumentationFigureCreator::createWebsiteMenuFigure() -void DocumentationFigureCreator::createRunProgramDialogFigure() +void DocumentationFigureCreator::createStartAppDialogFigure() { scheduleUiOperation( []() { auto dialog = qobject_cast( QApplication::activeWindow() ); dialog->findChild()->setText( QStringLiteral("notepad") ); dialog->setFocus(); - grabDialog( dialog, {}, QStringLiteral("RunProgramDialog.png") ); + grabDialog( dialog, {}, QStringLiteral("StartAppDialog.png") ); }); m_master->runFeature( m_master->featureManager().feature( Feature::Uid( "da9ca56a-b2ad-4fff-8f8a-929b2927b442" ) ) ); @@ -401,16 +401,16 @@ void DocumentationFigureCreator::createRunProgramDialogFigure() -void DocumentationFigureCreator::createProgramMenuFigure() +void DocumentationFigureCreator::createAppMenuFigure() { auto toolbar = m_master->mainWindow()->findChild(); - auto runProgramButton = toolbar->findChild( QStringLiteral("RunProgram") ); + auto runProgramButton = toolbar->findChild( QStringLiteral("StartApp") ); auto menu = new QMenu; menu->addAction( tr("Open file manager") ); menu->addAction( tr("Start learning tool") ); menu->addAction( tr("Play tutorial video") ); - menu->addAction( QIcon( QStringLiteral(":/core/document-edit.png") ), tr("Custom program") ); + menu->addAction( QIcon( QStringLiteral(":/core/document-edit.png") ), tr("Custom application") ); scheduleUiOperation( [this, runProgramButton, menu]() { scheduleUiOperation( [this, runProgramButton, menu]() { diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index 61dbf3978..c9ce10a81 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -54,8 +54,8 @@ class DocumentationFigureCreator : public QObject void createTextMessageDialogFigure(); void createOpenWebsiteDialogFigure(); void createWebsiteMenuFigure(); - void createRunProgramDialogFigure(); - void createProgramMenuFigure(); + void createStartAppDialogFigure(); + void createAppMenuFigure(); void createRemoteAccessHostDialogFigure(); void createRemoteAccessWindowFigure(); void createFileTransferDialogFigure(); diff --git a/plugins/desktopservices/CMakeLists.txt b/plugins/desktopservices/CMakeLists.txt index 6a8cb786d..2eb7d70d2 100644 --- a/plugins/desktopservices/CMakeLists.txt +++ b/plugins/desktopservices/CMakeLists.txt @@ -5,9 +5,9 @@ build_veyon_plugin(desktopservices DesktopServicesConfigurationPage.cpp DesktopServicesConfigurationPage.ui DesktopServicesFeaturePlugin.cpp - RunProgramDialog.cpp - RunProgramDialog.h - RunProgramDialog.ui + StartAppDialog.cpp + StartAppDialog.h + StartAppDialog.ui OpenWebsiteDialog.cpp OpenWebsiteDialog.h OpenWebsiteDialog.ui diff --git a/plugins/desktopservices/DesktopServiceObject.h b/plugins/desktopservices/DesktopServiceObject.h index e60c8754c..bc30cc11d 100644 --- a/plugins/desktopservices/DesktopServiceObject.h +++ b/plugins/desktopservices/DesktopServiceObject.h @@ -40,7 +40,7 @@ class DesktopServiceObject enum class Type { None, - Program, + Application, Website, } ; diff --git a/plugins/desktopservices/DesktopServicesConfiguration.h b/plugins/desktopservices/DesktopServicesConfiguration.h index cf94c4ef1..cb35045d8 100644 --- a/plugins/desktopservices/DesktopServicesConfiguration.h +++ b/plugins/desktopservices/DesktopServicesConfiguration.h @@ -28,7 +28,8 @@ #include "Configuration/Proxy.h" #define FOREACH_DESKTOP_SERVICES_CONFIG_PROPERTY(OP) \ - OP( DesktopServicesConfiguration, m_configuration, QJsonArray, predefinedPrograms, setPredefinedPrograms, "PredefinedPrograms", "DesktopServices", QJsonArray(), Configuration::Property::Flag::Standard ) \ + OP( DesktopServicesConfiguration, m_configuration, QJsonArray, legacyPredefinedPrograms, setLegacyPredefinedPrograms, "PredefinedPrograms", "DesktopServices", QJsonArray(), Configuration::Property::Flag::Legacy) \ + OP( DesktopServicesConfiguration, m_configuration, QJsonArray, predefinedApplications, setPredefinedApplications, "PredefinedApplications", "DesktopServices", QJsonArray(), Configuration::Property::Flag::Standard ) \ OP( DesktopServicesConfiguration, m_configuration, QJsonArray, predefinedWebsites, setPredefinedWebsites, "PredefinedWebsites", "DesktopServices", QJsonArray(), Configuration::Property::Flag::Standard ) \ // clazy:excludeall=missing-qobject-macro diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp index bec090519..47ea4a5ba 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp @@ -48,7 +48,7 @@ DesktopServicesConfigurationPage::~DesktopServicesConfigurationPage() void DesktopServicesConfigurationPage::resetWidgets() { - loadObjects( m_configuration.predefinedPrograms(), ui->programTable ); + loadObjects( m_configuration.predefinedApplications(), ui->applicationTable ); loadObjects( m_configuration.predefinedWebsites(), ui->websiteTable ); } @@ -66,35 +66,35 @@ void DesktopServicesConfigurationPage::applyConfiguration() -void DesktopServicesConfigurationPage::addProgram() +void DesktopServicesConfigurationPage::addApplication() { - auto programs = m_configuration.predefinedPrograms(); + auto applications = m_configuration.predefinedApplications(); - addServiceObject( ui->programTable, DesktopServiceObject::Type::Program, tr( "New program" ), programs ); + addServiceObject( ui->applicationTable, DesktopServiceObject::Type::Application, tr( "New application" ), applications ); - m_configuration.setPredefinedPrograms( programs ); + m_configuration.setPredefinedApplications( applications ); } -void DesktopServicesConfigurationPage::updateProgram() +void DesktopServicesConfigurationPage::updateApplication() { - auto programs = m_configuration.predefinedPrograms(); + auto applications = m_configuration.predefinedApplications(); - updateServiceObject( ui->programTable, DesktopServiceObject::Type::Program, programs ); + updateServiceObject( ui->applicationTable, DesktopServiceObject::Type::Application, applications ); - m_configuration.setPredefinedPrograms( programs ); + m_configuration.setPredefinedApplications( applications ); } -void DesktopServicesConfigurationPage::removeProgram() +void DesktopServicesConfigurationPage::removeApplication() { - auto programs = m_configuration.predefinedPrograms(); + auto applications = m_configuration.predefinedApplications(); - removeServiceObject( ui->programTable, DesktopServiceObject::Type::Program, programs ); + removeServiceObject( ui->applicationTable, DesktopServiceObject::Type::Application, applications ); - m_configuration.setPredefinedPrograms( programs ); + m_configuration.setPredefinedApplications( applications ); } diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.h b/plugins/desktopservices/DesktopServicesConfigurationPage.h index 093f720f8..396e2744f 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.h +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.h @@ -46,9 +46,9 @@ class DesktopServicesConfigurationPage : public ConfigurationPage void applyConfiguration() override; private Q_SLOTS: - void addProgram(); - void updateProgram(); - void removeProgram(); + void addApplication(); + void updateApplication(); + void removeApplication(); void addWebsite(); void updateWebsite(); void removeWebsite(); diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.ui b/plugins/desktopservices/DesktopServicesConfigurationPage.ui index 3a20e90a9..10066b2c2 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.ui +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.ui @@ -3,7 +3,7 @@ DesktopServicesConfigurationPage - Programs & websites + Applications & websites @@ -19,11 +19,11 @@ - Predefined programs + Predefined applications - + QAbstractItemView::SelectRows @@ -49,9 +49,9 @@ - + - Add new program + Add new application @@ -63,9 +63,9 @@ - + - Remove selected program + Remove selected application @@ -101,7 +101,7 @@ - Add new program + Add new website @@ -176,10 +176,10 @@ - addProgramButton + addApplicationButton clicked() DesktopServicesConfigurationPage - addProgram() + addApplication() 296 @@ -192,10 +192,10 @@ - removeProgramButton + removeApplicationButton clicked() DesktopServicesConfigurationPage - removeProgram() + removeApplication() 296 @@ -240,10 +240,10 @@ - programTable + applicationTable cellChanged(int,int) DesktopServicesConfigurationPage - updateProgram() + updateApplication() 148 @@ -273,11 +273,11 @@ - addProgram() - removeProgram() + addApplication() + removeApplication() addWebsite() removeWebsite() - updateProgram() + updateApplication() updateWebsite() diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index 6dba22a07..a13d04f61 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -37,7 +38,8 @@ #include "OpenWebsiteDialog.h" #include "PlatformCoreFunctions.h" #include "PlatformUserFunctions.h" -#include "RunProgramDialog.h" +#include "QmlCore.h" +#include "StartAppDialog.h" #include "VeyonConfiguration.h" #include "VeyonMasterInterface.h" #include "VeyonServerInterface.h" @@ -46,12 +48,12 @@ DesktopServicesFeaturePlugin::DesktopServicesFeaturePlugin( QObject* parent ) : QObject( parent ), m_configuration( &VeyonCore::config() ), - m_runProgramFeature( QStringLiteral( "RunProgram" ), + m_startAppFeature( QStringLiteral( "StartApp" ), Feature::Action | Feature::AllComponents, Feature::Uid( "da9ca56a-b2ad-4fff-8f8a-929b2927b442" ), Feature::Uid(), - tr( "Run program" ), {}, - tr( "Click this button to run a program on all computers." ), + tr( "Start application" ), {}, + tr( "Click this button to start an application on all computers." ), QStringLiteral(":/desktopservices/preferences-desktop-launch-feedback.png") ), m_openWebsiteFeature( QStringLiteral( "OpenWebsite" ), Feature::Action | Feature::AllComponents, @@ -60,7 +62,7 @@ DesktopServicesFeaturePlugin::DesktopServicesFeaturePlugin( QObject* parent ) : tr( "Open website" ), {}, tr( "Click this button to open a website on all computers." ), QStringLiteral(":/desktopservices/internet-web-browser.png") ), - m_features( { m_runProgramFeature, m_openWebsiteFeature } ) + m_features( { m_startAppFeature, m_openWebsiteFeature } ) { connect( VeyonCore::instance(), &VeyonCore::applicationLoaded, this, &DesktopServicesFeaturePlugin::updateFeatures ); @@ -68,6 +70,17 @@ DesktopServicesFeaturePlugin::DesktopServicesFeaturePlugin( QObject* parent ) : +void DesktopServicesFeaturePlugin::upgrade(const QVersionNumber& oldVersion) +{ + if( oldVersion < QVersionNumber( 2, 0 ) && + m_configuration.legacyPredefinedPrograms().isEmpty() == false ) + { + m_configuration.setPredefinedApplications( m_configuration.legacyPredefinedPrograms() ); + } +} + + + bool DesktopServicesFeaturePlugin::controlFeature( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ) { @@ -76,12 +89,12 @@ bool DesktopServicesFeaturePlugin::controlFeature( Feature::Uid featureUid, Oper return false; } - if( featureUid == m_runProgramFeature.uid() ) + if( featureUid == m_startAppFeature.uid() ) { - const auto programs = arguments.value( argToString(Argument::Programs) ).toStringList(); + const auto apps = arguments.value( argToString(Argument::Applications) ).toStringList(); sendFeatureMessage( FeatureMessage{ featureUid, FeatureMessage::DefaultCommand } - .addArgument( Argument::Programs, programs ), + .addArgument( Argument::Applications, apps ), computerControlInterfaces ); return true; @@ -106,18 +119,18 @@ bool DesktopServicesFeaturePlugin::controlFeature( Feature::Uid featureUid, Oper bool DesktopServicesFeaturePlugin::startFeature( VeyonMasterInterface& master, const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) { - if( feature == m_runProgramFeature ) + if( feature == m_startAppFeature ) { - runProgram( master, computerControlInterfaces ); + executeStartAppDialog( master, computerControlInterfaces ); } else if( feature == m_openWebsiteFeature ) { - openWebsite( master, computerControlInterfaces ); + executeOpenWebsiteDialog( master, computerControlInterfaces ); } - else if( m_predefinedProgramsFeatures.contains( feature ) ) + else if( m_predefinedAppsFeatures.contains( feature ) ) { - sendFeatureMessage( FeatureMessage( m_runProgramFeature.uid(), FeatureMessage::DefaultCommand ). - addArgument( Argument::Programs, predefinedServicePath( feature.uid() ) ), computerControlInterfaces ); + sendFeatureMessage( FeatureMessage( m_startAppFeature.uid(), FeatureMessage::DefaultCommand ). + addArgument( Argument::Applications, predefinedServicePath( feature.uid() ) ), computerControlInterfaces ); } else if( m_predefinedWebsitesFeatures.contains( feature ) ) @@ -142,12 +155,12 @@ bool DesktopServicesFeaturePlugin::handleFeatureMessage( VeyonServerInterface& s { Q_UNUSED(messageContext) - if( message.featureUid() == m_runProgramFeature.uid() ) + if( message.featureUid() == m_startAppFeature.uid() ) { - const auto programs = message.argument( Argument::Programs ).toStringList(); - for( const auto& program : programs ) + const auto apps = message.argument( Argument::Applications ).toStringList(); + for( const auto& app : apps ) { - runProgramAsUser( program ); + runApplicationAsUser( app ); } } else if( message.featureUid() == m_openWebsiteFeature.uid() ) @@ -201,11 +214,11 @@ bool DesktopServicesFeaturePlugin::eventFilter( QObject* object, QEvent* event ) { DesktopServicesConfiguration userConfig( master->userConfigurationObject() ); - if( menu->objectName() == m_runProgramFeature.name() ) + if( menu->objectName() == m_startAppFeature.name() ) { - ObjectManager objectManager( userConfig.predefinedPrograms() ); + ObjectManager objectManager( userConfig.predefinedApplications() ); objectManager.remove( DesktopServiceObject::Uid( menu->activeAction()->objectName() ) ); - userConfig.setPredefinedPrograms( objectManager.objects() ); + userConfig.setPredefinedApplications( objectManager.objects() ); } else if( menu->objectName() == m_openWebsiteFeature.name() ) { @@ -229,21 +242,21 @@ bool DesktopServicesFeaturePlugin::eventFilter( QObject* object, QEvent* event ) void DesktopServicesFeaturePlugin::updateFeatures() { - updatePredefinedProgramFeatures(); + updatePredefinedApplicationFeatures(); updatePredefinedWebsiteFeatures(); - m_features = FeatureList( { m_runProgramFeature, m_openWebsiteFeature } ) + - m_predefinedProgramsFeatures + m_predefinedWebsitesFeatures; + m_features = FeatureList( { m_startAppFeature, m_openWebsiteFeature } ) + + m_predefinedAppsFeatures + m_predefinedWebsitesFeatures; auto master = VeyonCore::instance()->findChild(); if( master ) { master->reloadSubFeatures(); - auto runProgramButton = master->mainWindow()->findChild( m_runProgramFeature.name() ); - if( runProgramButton && runProgramButton->menu() ) + auto startAppButton = master->mainWindow()->findChild( m_startAppFeature.name() ); + if( startAppButton && startAppButton->menu() ) { - runProgramButton->menu()->installEventFilter( this ); + startAppButton->menu()->installEventFilter( this ); } auto openWebsiteButton = master->mainWindow()->findChild( m_openWebsiteFeature.name() ); @@ -271,67 +284,109 @@ void DesktopServicesFeaturePlugin::openMenu( const QString& objectName ) -void DesktopServicesFeaturePlugin::runProgram( VeyonMasterInterface& master, - const ComputerControlInterfaceList& computerControlInterfaces ) +void DesktopServicesFeaturePlugin::executeStartAppDialog( VeyonMasterInterface& master, + const ComputerControlInterfaceList& computerControlInterfaces ) { - RunProgramDialog runProgramDialog( master.mainWindow() ); + if( master.appWindow() ) + { + auto dialog = VeyonCore::qmlCore().createObjectFromFile( QStringLiteral("qrc:/desktopservices/StartAppDialog.qml"), + master.appWindow(), + this ); + connect( this, &DesktopServicesFeaturePlugin::acceptStartAppDialog, dialog, // clazy:exclude=connect-non-signal + [this, &master, computerControlInterfaces]( const QString& app, const QString& saveItemName ) { + startApp( app, saveItemName, master, computerControlInterfaces ); + } ); + return; + } + + StartAppDialog startAppDialog( master.mainWindow() ); - if( runProgramDialog.exec() == QDialog::Accepted ) + if( startAppDialog.exec() == QDialog::Accepted ) { - const auto programs = runProgramDialog.programs().split( QLatin1Char('\n') ); + startApp( startAppDialog.apps(), + startAppDialog.remember() ? startAppDialog.presetName() : QString{}, + master, computerControlInterfaces ); + } +} - controlFeature( m_runProgramFeature.uid(), Operation::Start, - { { argToString(Argument::Programs), programs } }, - computerControlInterfaces ); - if( runProgramDialog.remember() ) - { - DesktopServicesConfiguration userConfig( master.userConfigurationObject() ); - ObjectManager objectManager( userConfig.predefinedPrograms() ); - objectManager.add( DesktopServiceObject( DesktopServiceObject::Type::Program, - runProgramDialog.presetName(), - runProgramDialog.programs() ) ); - userConfig.setPredefinedPrograms( objectManager.objects() ); - userConfig.flushStore(); +void DesktopServicesFeaturePlugin::startApp( const QString& app, const QString& saveItemName, + VeyonMasterInterface& master, + const ComputerControlInterfaceList& computerControlInterfaces ) +{ + controlFeature( m_startAppFeature.uid(), Operation::Start, + { { argToString(Argument::Applications), app.split( QLatin1Char('\n') ) } }, + computerControlInterfaces ); - updateFeatures(); - } + if( saveItemName.isEmpty() == false ) + { + DesktopServicesConfiguration userConfig( master.userConfigurationObject() ); + + ObjectManager objectManager( userConfig.predefinedApplications() ); + objectManager.add( DesktopServiceObject( DesktopServiceObject::Type::Application, + saveItemName, app ) ); + userConfig.setPredefinedApplications( objectManager.objects() ); + userConfig.flushStore(); + + updateFeatures(); } } -void DesktopServicesFeaturePlugin::openWebsite( VeyonMasterInterface& master, +void DesktopServicesFeaturePlugin::executeOpenWebsiteDialog( VeyonMasterInterface& master, const ComputerControlInterfaceList& computerControlInterfaces ) { + if( master.appWindow() ) + { + auto dialog = VeyonCore::qmlCore().createObjectFromFile( QStringLiteral("qrc:/desktopservices/OpenWebsiteDialog.qml"), + master.appWindow(), + this ); + connect( this, &DesktopServicesFeaturePlugin::acceptOpenWebsiteDialog, dialog, // clazy:exclude=connect-non-signal + [this, &master, computerControlInterfaces]( const QString& app, const QString& saveItemName ) { + openWebsite( app, saveItemName, master, computerControlInterfaces ); + } ); + return; + } + OpenWebsiteDialog openWebsiteDialog( master.mainWindow() ); if( openWebsiteDialog.exec() == QDialog::Accepted ) { - controlFeature( m_openWebsiteFeature.uid(), Operation::Start, - { { argToString(Argument::WebsiteUrl), openWebsiteDialog.website() } }, - computerControlInterfaces ); + openWebsite( openWebsiteDialog.website(), + openWebsiteDialog.remember() ? openWebsiteDialog.presetName() : QString{}, + master, computerControlInterfaces ); + } +} - if( openWebsiteDialog.remember() ) - { - DesktopServicesConfiguration userConfig( master.userConfigurationObject() ); - ObjectManager objectManager( userConfig.predefinedWebsites() ); - objectManager.add( DesktopServiceObject( DesktopServiceObject::Type::Website, - openWebsiteDialog.presetName(), - openWebsiteDialog.website() ) ); - userConfig.setPredefinedWebsites( objectManager.objects() ); - userConfig.flushStore(); - updateFeatures(); - } +void DesktopServicesFeaturePlugin::openWebsite( const QString& website, const QString& saveItemName, + VeyonMasterInterface& master, + const ComputerControlInterfaceList& computerControlInterfaces ) +{ + controlFeature( m_openWebsiteFeature.uid(), Operation::Start, + { { argToString(Argument::WebsiteUrl), website } }, + computerControlInterfaces ); + + if( saveItemName.isEmpty() == false ) + { + DesktopServicesConfiguration userConfig( master.userConfigurationObject() ); + + ObjectManager objectManager( userConfig.predefinedWebsites() ); + objectManager.add( DesktopServiceObject( DesktopServiceObject::Type::Website, + saveItemName, website ) ); + userConfig.setPredefinedWebsites( objectManager.objects() ); + userConfig.flushStore(); + + updateFeatures(); } } -void DesktopServicesFeaturePlugin::runProgramAsUser( const QString& commandLine ) +void DesktopServicesFeaturePlugin::runApplicationAsUser( const QString& commandLine ) { vDebug() << "launching" << commandLine; @@ -343,7 +398,7 @@ void DesktopServicesFeaturePlugin::runProgramAsUser( const QString& commandLine { const auto commandLineSplit = commandLine.split( QLatin1Char('"') ); program = commandLineSplit.value( 1 ); - parameters = commandLine.mid( program.size() + 2 ).split( QLatin1Char(' ') ); + parameters = commandLine.mid( program.size() + 2 ).split(QLatin1Char(' ') ); } // parse command line format program.exe -foo -bar else if( commandLine.contains( QLatin1Char(' ') ) ) @@ -383,7 +438,7 @@ bool DesktopServicesFeaturePlugin::openWebsite( const QString& urlString ) { vWarning() << "could not open URL" << url << "via QDesktopServices - trying native generic URL handler"; - runProgramAsUser( QStringLiteral("%1 %2").arg( + runApplicationAsUser( QStringLiteral("%1 %2").arg( VeyonCore::platform().coreFunctions().genericUrlHandler(), url.toString() ) ); } @@ -393,17 +448,17 @@ bool DesktopServicesFeaturePlugin::openWebsite( const QString& urlString ) -void DesktopServicesFeaturePlugin::updatePredefinedPrograms() +void DesktopServicesFeaturePlugin::updatePredefinedApplications() { - m_predefinedPrograms = m_configuration.predefinedPrograms(); + m_predefinedApps = m_configuration.predefinedApplications(); auto master = VeyonCore::instance()->findChild(); if( master ) { - const auto userPrograms = DesktopServicesConfiguration( master->userConfigurationObject() ).predefinedPrograms(); - for( const auto& userProgram : userPrograms ) + const auto userApps = DesktopServicesConfiguration( master->userConfigurationObject() ).predefinedApplications(); + for( const auto& userApp : userApps ) { - m_predefinedPrograms.append( userProgram ); + m_predefinedApps.append( userApp ); } } } @@ -427,30 +482,30 @@ void DesktopServicesFeaturePlugin::updatePredefinedWebsites() -void DesktopServicesFeaturePlugin::updatePredefinedProgramFeatures() +void DesktopServicesFeaturePlugin::updatePredefinedApplicationFeatures() { - m_predefinedProgramsFeatures.clear(); + m_predefinedAppsFeatures.clear(); - updatePredefinedPrograms(); + updatePredefinedApplications(); - if( m_predefinedPrograms.isEmpty() == false ) + if( m_predefinedApps.isEmpty() == false ) { - m_predefinedProgramsFeatures.reserve( m_predefinedPrograms.size()+1 ); + m_predefinedAppsFeatures.reserve( m_predefinedApps.size()+1 ); - for( const auto& program : qAsConst(m_predefinedPrograms) ) + for( const auto& app : qAsConst(m_predefinedApps) ) { - const auto programObject = DesktopServiceObject( program.toObject() ); - m_predefinedProgramsFeatures.append( Feature( m_runProgramFeature.name(), Feature::Action | Feature::Master, - programObject.uid(), m_runProgramFeature.uid(), - programObject.name(), {}, - tr("Run program \"%1\"").arg( programObject.path() ) ) ); + const auto appObject = DesktopServiceObject( app.toObject() ); + m_predefinedAppsFeatures.append( Feature( m_startAppFeature.name(), Feature::Action | Feature::Master, + appObject.uid(), m_startAppFeature.uid(), + appObject.name(), {}, + tr("Start application \"%1\"").arg( appObject.path() ) ) ); } - auto primaryFeature = m_runProgramFeature; + auto primaryFeature = m_startAppFeature; primaryFeature.setIconUrl( QStringLiteral(":/core/document-edit.png") ); - primaryFeature.setParentUid( m_runProgramFeature.uid() ); - primaryFeature.setDisplayName( tr("Custom program") ); - m_predefinedProgramsFeatures.append( primaryFeature ); + primaryFeature.setParentUid( m_startAppFeature.uid() ); + primaryFeature.setDisplayName( tr("Custom application") ); + m_predefinedAppsFeatures.append( primaryFeature ); } } @@ -487,7 +542,7 @@ void DesktopServicesFeaturePlugin::updatePredefinedWebsiteFeatures() QString DesktopServicesFeaturePlugin::predefinedServicePath( Feature::Uid subFeatureUid ) const { - for( const auto& services : { m_predefinedPrograms, m_predefinedWebsites } ) + for( const auto& services : { m_predefinedApps, m_predefinedWebsites } ) { for( const auto& service : services ) { diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index e34b31e21..e99e4feee 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -41,7 +41,7 @@ class DesktopServicesFeaturePlugin : public QObject, PluginInterface, public: enum class Argument { - Programs, + Applications, WebsiteUrl }; Q_ENUM(Argument) @@ -56,7 +56,7 @@ class DesktopServicesFeaturePlugin : public QObject, PluginInterface, QVersionNumber version() const override { - return QVersionNumber( 1, 1 ); + return QVersionNumber( 2, 0 ); } QString name() const override @@ -66,7 +66,7 @@ class DesktopServicesFeaturePlugin : public QObject, PluginInterface, QString description() const override { - return tr( "Start programs and services in user desktop" ); + return tr( "Start apps and open websites in user sessions" ); } QString vendor() const override @@ -79,6 +79,8 @@ class DesktopServicesFeaturePlugin : public QObject, PluginInterface, return QStringLiteral("Tobias Junghans"); } + void upgrade( const QVersionNumber& oldVersion ); + const FeatureList& featureList() const override { return m_features; @@ -98,35 +100,46 @@ class DesktopServicesFeaturePlugin : public QObject, PluginInterface, ConfigurationPage* createConfigurationPage() override; +Q_SIGNALS: + Q_INVOKABLE void acceptStartAppDialog( const QString& app, const QString& saveItemName ); + Q_INVOKABLE void acceptOpenWebsiteDialog( const QString& website, const QString& saveItemName ); + private: bool eventFilter( QObject* object, QEvent* event ) override; void updateFeatures(); void openMenu( const QString& objectName ); - void runProgram( VeyonMasterInterface& master, const ComputerControlInterfaceList& computerControlInterfaces ); - void openWebsite( VeyonMasterInterface& master, const ComputerControlInterfaceList& computerControlInterfaces ); + void executeStartAppDialog( VeyonMasterInterface& master, + const ComputerControlInterfaceList& computerControlInterfaces ); + void startApp( const QString& app, const QString& saveItemName, + VeyonMasterInterface& master, const ComputerControlInterfaceList& computerControlInterfaces ); + + void executeOpenWebsiteDialog( VeyonMasterInterface& master, + const ComputerControlInterfaceList& computerControlInterfaces ); + void openWebsite( const QString& website, const QString& saveItemName, + VeyonMasterInterface& master, const ComputerControlInterfaceList& computerControlInterfaces ); - void runProgramAsUser( const QString& commandLine ); + void runApplicationAsUser( const QString& commandLine ); bool openWebsite( const QString& urlString ); - void updatePredefinedPrograms(); + void updatePredefinedApplications(); void updatePredefinedWebsites(); - void updatePredefinedProgramFeatures(); + void updatePredefinedApplicationFeatures(); void updatePredefinedWebsiteFeatures(); QString predefinedServicePath( Feature::Uid subFeatureUid ) const; DesktopServicesConfiguration m_configuration; - QJsonArray m_predefinedPrograms; + QJsonArray m_predefinedApps; QJsonArray m_predefinedWebsites; - const Feature m_runProgramFeature; + const Feature m_startAppFeature; const Feature m_openWebsiteFeature; - FeatureList m_predefinedProgramsFeatures{}; + FeatureList m_predefinedAppsFeatures{}; FeatureList m_predefinedWebsitesFeatures{}; FeatureList m_features; diff --git a/plugins/desktopservices/OpenWebsiteDialog.qml b/plugins/desktopservices/OpenWebsiteDialog.qml new file mode 100644 index 000000000..b30672dd6 --- /dev/null +++ b/plugins/desktopservices/OpenWebsiteDialog.qml @@ -0,0 +1,47 @@ +import QtQuick 2.0 +import QtQuick.Controls 2.1 +import QtQuick.Dialogs 1.0 +import QtQuick.Layouts 1.0 + +Dialog { + title: qsTr("Open website") + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + standardButtons: Dialog.Ok | Dialog.Cancel + visible: true + modal: true + + onAccepted: { + context.acceptOpenWebsiteDialog(urlInput.text, remember.checked ? saveName.text : "") + qmlCore.deleteLater(this) + } + onRejected: qmlCore.deleteLater(this) + + ColumnLayout { + anchors.fill: parent + Label { + text: qsTr("Please enter the URL of the website to open:") + wrapMode: Label.WordWrap + Layout.fillWidth: true + } + + TextField { + id: urlInput + focus: true + placeholderText: qsTr("e.g. www.veyon.io") + Layout.fillWidth: true + } + + CheckBox { + id: remember + text: qsTr("Remember and add to website menu") + } + + TextField { + id: saveName + enabled: remember.checked + placeholderText: qsTr("Website name") + Layout.fillWidth: true + } + } +} diff --git a/plugins/desktopservices/RunProgramDialog.cpp b/plugins/desktopservices/StartAppDialog.cpp similarity index 62% rename from plugins/desktopservices/RunProgramDialog.cpp rename to plugins/desktopservices/StartAppDialog.cpp index 67c9688ff..f98472eba 100644 --- a/plugins/desktopservices/RunProgramDialog.cpp +++ b/plugins/desktopservices/StartAppDialog.cpp @@ -1,5 +1,5 @@ /* - * RunProgramDialog.cpp - implementation of RunProgramDialog + * StartAppDialog.cpp - implementation of StartAppDialog * * Copyright (c) 2004-2021 Tobias Junghans * @@ -24,49 +24,49 @@ #include -#include "RunProgramDialog.h" +#include "StartAppDialog.h" -#include "ui_RunProgramDialog.h" +#include "ui_StartAppDialog.h" -RunProgramDialog::RunProgramDialog( QWidget* parent ) : +StartAppDialog::StartAppDialog( QWidget* parent ) : QDialog( parent ), - ui( new Ui::RunProgramDialog ), - m_programs(), + ui( new Ui::StartAppDialog ), + m_apps(), m_remember( false ), m_presetName() { ui->setupUi( this ); - connect( ui->programInputTextEdit, &QTextEdit::textChanged, this, &RunProgramDialog::validate ); - connect( ui->rememberCheckBox, &QCheckBox::toggled, this, &RunProgramDialog::validate ); - connect( ui->presetNameEdit, &QLineEdit::textChanged, this, &RunProgramDialog::validate ); + connect( ui->appInputTextEdit, &QTextEdit::textChanged, this, &StartAppDialog::validate ); + connect( ui->rememberCheckBox, &QCheckBox::toggled, this, &StartAppDialog::validate ); + connect( ui->presetNameEdit, &QLineEdit::textChanged, this, &StartAppDialog::validate ); validate(); - ui->programInputTextEdit->setFocus(); + ui->appInputTextEdit->setFocus(); } -RunProgramDialog::~RunProgramDialog() +StartAppDialog::~StartAppDialog() { delete ui; } -void RunProgramDialog::validate() +void StartAppDialog::validate() { ui->buttonBox->button( QDialogButtonBox::Ok )->setEnabled( - ui->programInputTextEdit->toPlainText().isEmpty() == false && + ui->appInputTextEdit->toPlainText().isEmpty() == false && ( ui->rememberCheckBox->isChecked() == false || ui->presetNameEdit->text().isEmpty() == false ) ); } -void RunProgramDialog::accept() +void StartAppDialog::accept() { - m_programs = ui->programInputTextEdit->toPlainText(); + m_apps = ui->appInputTextEdit->toPlainText(); m_remember = ui->rememberCheckBox->isChecked(); m_presetName = ui->presetNameEdit->text(); diff --git a/plugins/desktopservices/RunProgramDialog.h b/plugins/desktopservices/StartAppDialog.h similarity index 77% rename from plugins/desktopservices/RunProgramDialog.h rename to plugins/desktopservices/StartAppDialog.h index 75690550c..a4c69b566 100644 --- a/plugins/desktopservices/RunProgramDialog.h +++ b/plugins/desktopservices/StartAppDialog.h @@ -1,5 +1,5 @@ /* - * RunProgramDialog.h - declaration of class RunProgramDialog + * StartAppDialog.h - declaration of class StartAppDialog * * Copyright (c) 2004-2021 Tobias Junghans * @@ -24,18 +24,18 @@ #include -namespace Ui { class RunProgramDialog; } +namespace Ui { class StartAppDialog; } -class RunProgramDialog : public QDialog +class StartAppDialog : public QDialog { Q_OBJECT public: - explicit RunProgramDialog( QWidget *parent ); - ~RunProgramDialog() override; + explicit StartAppDialog( QWidget *parent ); + ~StartAppDialog() override; - const QString& programs() const + const QString& apps() const { - return m_programs; + return m_apps; } bool remember() const @@ -52,8 +52,8 @@ class RunProgramDialog : public QDialog void validate(); void accept() override; - Ui::RunProgramDialog* ui; - QString m_programs; + Ui::StartAppDialog* ui; + QString m_apps; bool m_remember; QString m_presetName; diff --git a/plugins/desktopservices/StartAppDialog.qml b/plugins/desktopservices/StartAppDialog.qml new file mode 100644 index 000000000..c1a95bc99 --- /dev/null +++ b/plugins/desktopservices/StartAppDialog.qml @@ -0,0 +1,49 @@ +import QtQuick 2.0 +import QtQuick.Controls 2.1 +import QtQuick.Dialogs 1.0 +import QtQuick.Layouts 1.0 + +Dialog { + title: qsTr("Start application") + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + standardButtons: Dialog.Ok | Dialog.Cancel + visible: true + modal: true + + onAccepted: { + context.acceptStartAppDialog(appNameInput.text, remember.checked ? saveName.text : "") + qmlCore.deleteLater(this) + } + onRejected: qmlCore.deleteLater(this) + + ColumnLayout { + anchors.fill: parent + Label { + text: qsTr("Please enter the applications to start on the selected computers. You can separate multiple applications by line.") + wrapMode: Label.WordWrap + Layout.fillWidth: true + } + + TextArea { + id: appNameInput + focus: true + // work around bug in lupdate which requires double-escaped backslashes + placeholderText: qsTr("e.g. \"C:\\\\Program Files\\\\VideoLAN\\\\VLC\\\\vlc.exe\"").replace(/\\\\/g, '\\') + Layout.fillWidth: true + Layout.fillHeight: true + } + + CheckBox { + id: remember + text: qsTr("Remember and add to application menu") + } + + TextField { + id: saveName + enabled: remember.checked + placeholderText: qsTr("Application name") + Layout.fillWidth: true + } + } +} diff --git a/plugins/desktopservices/RunProgramDialog.ui b/plugins/desktopservices/StartAppDialog.ui similarity index 88% rename from plugins/desktopservices/RunProgramDialog.ui rename to plugins/desktopservices/StartAppDialog.ui index f4ccba3da..963f80522 100644 --- a/plugins/desktopservices/RunProgramDialog.ui +++ b/plugins/desktopservices/StartAppDialog.ui @@ -1,10 +1,10 @@ Tobias Junghans - RunProgramDialog - + StartAppDialog + - Run programs + Start application @@ -39,7 +39,7 @@ - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" @@ -48,7 +48,7 @@ - Remember and add to program menu + Remember and add to application menu @@ -65,7 +65,7 @@ - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. + Please enter the applications to start on the selected computers. You can separate multiple applications by line. true @@ -94,7 +94,7 @@ buttonBox accepted() - RunProgramDialog + StartAppDialog accept() @@ -110,7 +110,7 @@ buttonBox rejected() - RunProgramDialog + StartAppDialog reject() diff --git a/plugins/desktopservices/desktopservices.qrc b/plugins/desktopservices/desktopservices.qrc index 9fdbc2f3e..3d0ad497a 100644 --- a/plugins/desktopservices/desktopservices.qrc +++ b/plugins/desktopservices/desktopservices.qrc @@ -3,5 +3,7 @@ internet-web-browser.png preferences-desktop-launch-feedback.png desktop-services.png + OpenWebsiteDialog.qml + StartAppDialog.qml From b95677c7a51098879f8ada3d553539fdadcd3fe2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 14:25:06 +0200 Subject: [PATCH 0908/1765] Master: rename main.qml to MainWindow.qml --- master/qml/{main.qml => MainWindow.qml} | 0 master/qml/qml.qrc | 2 +- master/src/VeyonMaster.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename master/qml/{main.qml => MainWindow.qml} (100%) diff --git a/master/qml/main.qml b/master/qml/MainWindow.qml similarity index 100% rename from master/qml/main.qml rename to master/qml/MainWindow.qml diff --git a/master/qml/qml.qrc b/master/qml/qml.qrc index 4b52581fd..94f8c1020 100644 --- a/master/qml/qml.qrc +++ b/master/qml/qml.qrc @@ -1,6 +1,6 @@ - main.qml + MainWindow.qml TitleBarTab.qml FeatureButton.qml ButtonMenu.qml diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 13a8b0fd2..4083f9a32 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -329,7 +329,7 @@ void VeyonMaster::initUserInterface() m_qmlAppEngine->addImageProvider( m_computerControlListModel->imageProvider()->id(), m_computerControlListModel->imageProvider() ); m_qmlAppEngine->rootContext()->setContextProperty( QStringLiteral("masterCore"), this ); - m_qmlAppEngine->load( QStringLiteral(":/master/main.qml") ); + m_qmlAppEngine->load( QStringLiteral(":/master/MainWindow.qml") ); } else { From 95c0b76cb9df36ac95feb6f0c60b427bde908c2c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 14:25:25 +0200 Subject: [PATCH 0909/1765] ComputerMonitoring.qml: add missing import --- master/qml/ComputerMonitoring.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/master/qml/ComputerMonitoring.qml b/master/qml/ComputerMonitoring.qml index 101d2819a..c421cb26c 100644 --- a/master/qml/ComputerMonitoring.qml +++ b/master/qml/ComputerMonitoring.qml @@ -1,6 +1,7 @@ import QtQuick 2.0 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.0 +import QtQml.Models 2.12 import Veyon.Master 5.0 Page { From 65134953c1956b57fc4822d54b9503a7e9095efd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Apr 2021 14:27:26 +0200 Subject: [PATCH 0910/1765] MainWindow.qml: drop unused ID --- master/qml/MainWindow.qml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/master/qml/MainWindow.qml b/master/qml/MainWindow.qml index 036c3123a..22802d619 100644 --- a/master/qml/MainWindow.qml +++ b/master/qml/MainWindow.qml @@ -45,9 +45,7 @@ ApplicationWindow { Layout.fillHeight: true Layout.fillWidth: true - ComputerMonitoring { - id: computerMonitoring - } + ComputerMonitoring { } } } } From 16361711a871efb82825b1287df294916c51d889 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 May 2021 13:35:07 +0200 Subject: [PATCH 0911/1765] Screenshot: add and integrate ScreenshotListModel --- plugins/screenshot/CMakeLists.txt | 2 + .../screenshot/ScreenshotFeaturePlugin.cpp | 4 + plugins/screenshot/ScreenshotFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotListModel.cpp | 101 ++++++++++++++++++ plugins/screenshot/ScreenshotListModel.h | 54 ++++++++++ .../screenshot/ScreenshotManagementPage.qml | 77 ++++++++++++- 6 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 plugins/screenshot/ScreenshotListModel.cpp create mode 100644 plugins/screenshot/ScreenshotListModel.h diff --git a/plugins/screenshot/CMakeLists.txt b/plugins/screenshot/CMakeLists.txt index 46c2fbd1b..bfc4dead1 100644 --- a/plugins/screenshot/CMakeLists.txt +++ b/plugins/screenshot/CMakeLists.txt @@ -3,5 +3,7 @@ include(BuildVeyonPlugin) build_veyon_plugin(screenshot ScreenshotFeaturePlugin.cpp ScreenshotFeaturePlugin.h + ScreenshotListModel.cpp + ScreenshotListModel.h screenshot.qrc ) diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.cpp b/plugins/screenshot/ScreenshotFeaturePlugin.cpp index abb37067b..563ed3920 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.cpp +++ b/plugins/screenshot/ScreenshotFeaturePlugin.cpp @@ -23,10 +23,12 @@ */ #include +#include #include "ComputerControlInterface.h" #include "Screenshot.h" #include "ScreenshotFeaturePlugin.h" +#include "ScreenshotListModel.h" #include "QmlCore.h" #include "VeyonMasterInterface.h" @@ -101,6 +103,8 @@ void ScreenshotFeaturePlugin::initUi() auto master = VeyonCore::instance()->findChild(); if( master->appContainer() ) { + qmlRegisterType( "Veyon.Plugins.Screenshot", version().majorVersion(), version().minorVersion(), + "ScreenshotListModel" ); VeyonCore::qmlCore().createItemFromFile( QStringLiteral("qrc:/screenshot/ScreenshotManagementPage.qml"), master->appContainer(), this ); diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.h b/plugins/screenshot/ScreenshotFeaturePlugin.h index 1e360af40..c0bf0a71d 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.h +++ b/plugins/screenshot/ScreenshotFeaturePlugin.h @@ -43,7 +43,7 @@ class ScreenshotFeaturePlugin : public QObject, FeatureProviderInterface, Plugin QVersionNumber version() const override { - return QVersionNumber( 1, 1 ); + return QVersionNumber( 2, 0 ); } QString name() const override diff --git a/plugins/screenshot/ScreenshotListModel.cpp b/plugins/screenshot/ScreenshotListModel.cpp new file mode 100644 index 000000000..cfdc21863 --- /dev/null +++ b/plugins/screenshot/ScreenshotListModel.cpp @@ -0,0 +1,101 @@ +/* + * ScreenshotListModel.cpp - implementation of ScreenshotListModel + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include +#include + +#include "Filesystem.h" +#include "ScreenshotListModel.h" +#include "VeyonConfiguration.h" +#include "VeyonCore.h" + + +ScreenshotListModel::ScreenshotListModel( QObject* parent ) : + QStringListModel( parent ) +{ + VeyonCore::filesystem().ensurePathExists( VeyonCore::config().screenshotDirectory() ); + + m_fsWatcher.addPath( VeyonCore::filesystem().screenshotDirectoryPath() ); + connect( &m_fsWatcher, &QFileSystemWatcher::directoryChanged, this, &ScreenshotListModel::updateModel ); + + m_reloadTimer.setInterval( FsModelResetDelay ); + m_reloadTimer.setSingleShot( true ); + + connect( &m_reloadTimer, &QTimer::timeout, this, &ScreenshotListModel::updateModel ); + connect( &VeyonCore::filesystem(), &Filesystem::screenshotDirectoryModified, + &m_reloadTimer, QOverload<>::of(&QTimer::start) ); + + updateModel(); +} + + + +QHash ScreenshotListModel::roleNames() const +{ + //auto roles = QStringListModel::roleNames(); + QHash roles; + roles[Qt::DisplayRole] = "name"; + roles[Qt::UserRole+1] = "url"; + return roles; +} + + + +QVariant ScreenshotListModel::data(const QModelIndex& index, int role) const +{ + if( role == Qt::UserRole+1 ) + { + return QString{QStringLiteral("file://") + filePath(index)}; + } + + return QStringListModel::data(index, role); +} + + + +void ScreenshotListModel::updateModel() +{ + setStringList( QDir{ VeyonCore::filesystem().screenshotDirectoryPath() } + .entryList( { QStringLiteral("*.png") }, QDir::Filter::Files, QDir::SortFlag::Name ) ); +} + + + +QString ScreenshotListModel::filePath( const QModelIndex& index ) const +{ + return VeyonCore::filesystem().screenshotDirectoryPath() + QDir::separator() + + data( index, Qt::DisplayRole ).toString(); +} + + + +void ScreenshotListModel::deleteScreenshot( const QModelIndexList& indexes ) +{ + for( const auto& index : indexes ) + { + QFile::remove( filePath( index ) ); + } + + updateModel(); +} diff --git a/plugins/screenshot/ScreenshotListModel.h b/plugins/screenshot/ScreenshotListModel.h new file mode 100644 index 000000000..17688051c --- /dev/null +++ b/plugins/screenshot/ScreenshotListModel.h @@ -0,0 +1,54 @@ +/* + * ScreenshotListModel.h - declaration of ScreenshotListModel + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include +#include +#include + +class ScreenshotListModel : public QStringListModel +{ + Q_OBJECT +public: + explicit ScreenshotListModel( QObject *parent = nullptr ); + + QHash roleNames() const; + + QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override; + + void deleteScreenshot( const QModelIndexList& indexes ); + +private: + void updateModel(); + + QString filePath( const QModelIndex& index ) const; + + QFileSystemWatcher m_fsWatcher{this}; + + QTimer m_reloadTimer{this}; + + static constexpr auto FsModelResetDelay = 1000; + +} ; diff --git a/plugins/screenshot/ScreenshotManagementPage.qml b/plugins/screenshot/ScreenshotManagementPage.qml index 31da44c9f..74f340ab2 100644 --- a/plugins/screenshot/ScreenshotManagementPage.qml +++ b/plugins/screenshot/ScreenshotManagementPage.qml @@ -1,13 +1,80 @@ -import QtQuick 2.0 -import QtQuick.Controls 2.0 +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import Veyon.Plugins.Screenshot 2.0 Page { title: qsTr("Screenshots") property bool canBeClosed: false - Label { - id: screenshots + Flipable { + id: flipable + property bool flipped: false anchors.fill: parent - text: "Hello" + + transform: Rotation { + id: rotation + origin.x: flipable.width/2 + origin.y: flipable.height/2 + axis.x: 0; axis.y: 1; axis.z: 0 + angle: 0 + } + + states: State { + name: "back" + PropertyChanges { target: rotation; angle: 180 } + when: flipable.flipped + } + + transitions: Transition { + NumberAnimation { target: rotation; property: "angle"; duration: 250 } + } + + front: GridView { + id: gridView + anchors.fill: parent + model: ScreenshotListModel { } + cellWidth: 300 + cellHeight: cellWidth * 9 / 16 + 20 + + delegate: ColumnLayout { + spacing: 5 + width: gridView.cellWidth + height: gridView.cellHeight + Image { + Layout.margins: 2 + source: url + Layout.alignment: Qt.AlignHCenter + sourceSize.width: width//parent.width + sourceSize.height: height//parent.height - label.height + clip: true + asynchronous: true + Layout.fillHeight: true + MouseArea { + anchors.fill: parent + onClicked: { + screenshotView.source = url + flipable.flipped = !flipable.flipped + } + } + } + Label { + id: label + text: name + Layout.margins: 5 + elide: Label.ElideRight + Layout.fillWidth: true + } + } + } + + back: Image { + anchors.fill: parent + id: screenshotView + MouseArea { + anchors.fill: parent + onClicked: flipable.flipped = !flipable.flipped + } + } } } From 45d33c28595b30d6ae5bd6f691341a289493bff0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 May 2021 15:39:25 +0200 Subject: [PATCH 0912/1765] Core: determine Qt translations dir at runtime --- cmake/modules/FindQtTranslations.cmake | 9 ++++----- core/CMakeLists.txt | 7 ------- core/src/VeyonCore.cpp | 11 +++++++---- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/cmake/modules/FindQtTranslations.cmake b/cmake/modules/FindQtTranslations.cmake index ed9a42faf..02441dac7 100644 --- a/cmake/modules/FindQtTranslations.cmake +++ b/cmake/modules/FindQtTranslations.cmake @@ -1,6 +1,6 @@ # FindQtTranslations.cmake - Copyright (c) 2020-2021 Tobias Junghans # -# description: find translation files of Qt and copy them on Windows to current binary dir +# description: find translation files of Qt and prepare them for Windows build # usage: find_qt_translations() @@ -17,8 +17,6 @@ function(find_qt_translations) OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE QT_INSTALL_TRANSLATIONS) message(STATUS "Found Qt translations: ${QT_INSTALL_TRANSLATIONS}") - set(${QT_TRANSLATIONS_DIR} "${QT_INSTALL_TRANSLATIONS}" PARENT_SCOPE) - file(WRITE "${QT_TRANSLATIONS_STAMP}" "1") if(WIN32) file(GLOB QT_TRANSLATIONS "${QT_INSTALL_TRANSLATIONS}/qt_*.qm") foreach(QT_TRANSLATION ${QT_TRANSLATIONS}) @@ -29,13 +27,14 @@ function(find_qt_translations) if(EXISTS "${QT_INSTALL_TRANSLATIONS}/${QTBASE_TRANSLATION_FILE_NAME}") # then use it instead of (deprecated) QM file for all Qt modules file(COPY "${QT_INSTALL_TRANSLATIONS}/${QTBASE_TRANSLATION_FILE_NAME}" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/${QTBASE_TRANSLATION_FILE_NAME}" "${CMAKE_CURRENT_BINARY_DIR}/${QT_TRANSLATION_FILE_NAME}") + message(STATUS "Imported Qt translation file: ${QT_INSTALL_TRANSLATIONS}/${QTBASE_TRANSLATION_FILE_NAME}") else() file(COPY ${QT_TRANSLATION} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + message(STATUS "Imported Qt translation file: ${QT_TRANSLATION}") endif() - message(STATUS "Imported Qt translation file: ${QT_TRANSLATION}") endif() endforeach() + file(WRITE "${QT_TRANSLATIONS_STAMP}" "1") endif() endif() endfunction() diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index b8d4c08f1..5d473450d 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -84,13 +84,6 @@ else() ) endif() -# find Qt's translation directory -if(NOT VEYON_BUILD_WIN32) - include(FindQtTranslations) - find_qt_translations() - target_compile_definitions(veyon-core PRIVATE QT_TRANSLATIONS_DIR="${QT_TRANSLATIONS_DIR}") -endif() - if(VEYON_BUILD_WIN32) # add Windows Socket library required by libvncclient target_link_libraries(veyon-core -lws2_32) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index a5db2d504..38f1812cb 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -185,11 +186,13 @@ QString VeyonCore::translationsDirectory() QString VeyonCore::qtTranslationsDirectory() { -#ifdef QT_TRANSLATIONS_DIR - return QStringLiteral( QT_TRANSLATIONS_DIR ); // clazy:exclude=empty-qstringliteral -#else + const auto path = QLibraryInfo::location(QLibraryInfo::TranslationsPath); + if( QDir{path}.exists() ) + { + return path; + } + return translationsDirectory(); -#endif } From c12c56666e016f6c3190596e66ca89f19767afa7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 May 2021 15:40:18 +0200 Subject: [PATCH 0913/1765] TranslationLoader: fix loading Qt translations --- core/src/TranslationLoader.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/src/TranslationLoader.cpp b/core/src/TranslationLoader.cpp index 4b171d69b..586768824 100644 --- a/core/src/TranslationLoader.cpp +++ b/core/src/TranslationLoader.cpp @@ -52,20 +52,24 @@ QLocale TranslationLoader::load( const QString& resourceName ) if( configuredLocale.language() != QLocale::English && VeyonCore::instance()->findChild( resourceName ) == nullptr ) { + const auto translationsDirectory = resourceName.startsWith( QLatin1String("qt") ) + ? VeyonCore::qtTranslationsDirectory() + : VeyonCore::translationsDirectory(); + auto translator = new QTranslator( VeyonCore::instance() ); translator->setObjectName( resourceName ); if( configuredLocale == QLocale::C || translator->load( QStringLiteral( "%1_%2.qm" ).arg( resourceName, configuredLocale.name() ), - VeyonCore::translationsDirectory() ) == false ) + translationsDirectory ) == false ) { configuredLocale = QLocale::system(); // Flawfinder: ignore if( translator->load( QStringLiteral( "%1_%2.qm" ).arg( resourceName, configuredLocale.name() ), - VeyonCore::translationsDirectory() ) == false ) + translationsDirectory ) == false ) { (void) translator->load( QStringLiteral( "%1_%2.qm" ).arg( resourceName, configuredLocale.language() ), - VeyonCore::translationsDirectory() ); + translationsDirectory() ); } } From 09ba498aa251c1c1f63302286560f5c908b66d33 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 May 2021 15:43:06 +0200 Subject: [PATCH 0914/1765] VeyonCore: configure layout direction based on default locale --- core/src/VeyonCore.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 38f1812cb..bc0af73d7 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -576,16 +576,12 @@ void VeyonCore::initLocaleAndTranslation() { TranslationLoader::load( QStringLiteral("qt") ); - const auto configuredLocale = TranslationLoader::load( QStringLiteral("veyon") ); + TranslationLoader::load( QStringLiteral("veyon") ); - if( configuredLocale.language() == QLocale::Hebrew || - configuredLocale.language() == QLocale::Arabic ) + const auto app = qobject_cast( QCoreApplication::instance() ); + if( app ) { - auto app = qobject_cast( QCoreApplication::instance() ); - if( app ) - { - QApplication::setLayoutDirection( Qt::RightToLeft ); - } + QGuiApplication::setLayoutDirection( QLocale{}.textDirection() ); } } From 2e8ec6b78abd1e4b1ffc40243126fd9da154ef4f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 May 2021 15:44:31 +0200 Subject: [PATCH 0915/1765] TranslationLoader: return success and drop broken fallback --- core/src/TranslationLoader.cpp | 8 ++++---- core/src/TranslationLoader.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/TranslationLoader.cpp b/core/src/TranslationLoader.cpp index 586768824..3e34357bb 100644 --- a/core/src/TranslationLoader.cpp +++ b/core/src/TranslationLoader.cpp @@ -38,7 +38,7 @@ TranslationLoader::TranslationLoader( const QString& resourceName ) -QLocale TranslationLoader::load( const QString& resourceName ) +bool TranslationLoader::load( const QString& resourceName ) { QLocale configuredLocale( QLocale::C ); @@ -68,8 +68,8 @@ QLocale TranslationLoader::load( const QString& resourceName ) if( translator->load( QStringLiteral( "%1_%2.qm" ).arg( resourceName, configuredLocale.name() ), translationsDirectory ) == false ) { - (void) translator->load( QStringLiteral( "%1_%2.qm" ).arg( resourceName, configuredLocale.language() ), - translationsDirectory() ); + delete translator; + return false; } } @@ -78,5 +78,5 @@ QLocale TranslationLoader::load( const QString& resourceName ) QCoreApplication::installTranslator( translator ); } - return configuredLocale; + return true; } diff --git a/core/src/TranslationLoader.h b/core/src/TranslationLoader.h index 183479f13..dfc68e74d 100644 --- a/core/src/TranslationLoader.h +++ b/core/src/TranslationLoader.h @@ -33,6 +33,6 @@ class VEYON_CORE_EXPORT TranslationLoader public: TranslationLoader( const QString& resourceName ); - static QLocale load( const QString& resourceName ); + static bool load( const QString& resourceName ); }; From cf44ebcd641984a0f92a8083d17ba4af2828e777 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 May 2021 15:45:10 +0200 Subject: [PATCH 0916/1765] Core: load qtbase translation per default Fall back to legacy all-in-one translations. --- core/src/VeyonCore.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index bc0af73d7..69973fe80 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -574,7 +574,10 @@ void VeyonCore::initLogging( const QString& appComponentName ) void VeyonCore::initLocaleAndTranslation() { - TranslationLoader::load( QStringLiteral("qt") ); + if( TranslationLoader::load( QStringLiteral("qtbase") ) == false ) + { + TranslationLoader::load( QStringLiteral("qt") ); + } TranslationLoader::load( QStringLiteral("veyon") ); From 4d05f839d1450b57d96300a3d503da9994bc3b8c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 May 2021 15:54:45 +0200 Subject: [PATCH 0917/1765] DocumentationFigureCreator: fix master construction/destruction --- master/src/DocumentationFigureCreator.cpp | 44 +++++++++++------------ master/src/DocumentationFigureCreator.h | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index 42f3a84fd..89bdb973c 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -57,7 +57,7 @@ void DocumentationFigureCreator::run() { - auto mainWindow = m_master->mainWindow(); + auto mainWindow = m_master.mainWindow(); mainWindow->move( 0, 0 ); mainWindow->resize( 3000, 1000 ); @@ -93,18 +93,18 @@ void DocumentationFigureCreator::createFeatureFigures() int x = -1; int w = 0; - auto toolbar = m_master->mainWindow()->findChild(); + auto toolbar = m_master.mainWindow()->findChild(); const QStringList separatedPluginFeatures( { QStringLiteral("a54ee018-42bf-4569-90c7-0d8470125ccf"), QStringLiteral("80580500-2e59-4297-9e35-e53959b028cd") } ); - const auto& features = m_master->features(); + const auto& features = m_master.features(); for( const auto& feature : features ) { auto btn = toolbar->findChild( feature.name() ); - const auto pluginUid = m_master->featureManager().pluginUid( feature ); + const auto pluginUid = m_master.featureManager().pluginUid( feature ); if( previousPluginUid.isNull() ) { @@ -152,7 +152,7 @@ void DocumentationFigureCreator::createFeatureFigures() void DocumentationFigureCreator::createContextMenuFigure() { - auto view = m_master->mainWindow()->findChild(); + auto view = m_master.mainWindow()->findChild(); auto menu = view->findChild(); connect( menu, &QMenu::aboutToShow, this, [menu]() { @@ -196,7 +196,7 @@ void DocumentationFigureCreator::createLocationDialogFigure() } QStringListModel locationsModel( locations, this ); - LocationDialog dialog( &locationsModel, m_master->mainWindow() ); + LocationDialog dialog( &locationsModel, m_master.mainWindow() ); grabDialog( &dialog, QSize( 300, 200 ), QStringLiteral("LocationDialog.png") ); @@ -207,7 +207,7 @@ void DocumentationFigureCreator::createLocationDialogFigure() void DocumentationFigureCreator::createScreenshotManagementPanelFigure() { - auto window = m_master->mainWindow(); + auto window = m_master.mainWindow(); auto panel = window->findChild(); auto panelButton = window->findChild( QStringLiteral("screenshotManagementPanelButton") ); auto list = panel->findChild(); @@ -269,14 +269,14 @@ void DocumentationFigureCreator::createScreenshotManagementPanelFigure() void DocumentationFigureCreator::createPowerDownOptionsFigure() { - auto toolbar = m_master->mainWindow()->findChild(); + auto toolbar = m_master.mainWindow()->findChild(); auto powerDownButton = toolbar->findChild( QStringLiteral("PowerDown") ); scheduleUiOperation( [this, powerDownButton]() { scheduleUiOperation( [this, powerDownButton]() { auto menu = powerDownButton->menu(); - grabWindow( m_master->mainWindow(), powerDownButton->mapTo( m_master->mainWindow(), QPoint( 0, 0 ) ), + grabWindow( m_master.mainWindow(), powerDownButton->mapTo( m_master.mainWindow(), QPoint( 0, 0 ) ), QSize( qMax( powerDownButton->width(), menu->width() ), powerDownButton->height() + menu->height() ), QStringLiteral("PowerDownOptions.png") ); @@ -304,7 +304,7 @@ void DocumentationFigureCreator::createPowerDownTimeInputDialogFigure() grabDialog( dialog, {}, QStringLiteral("PowerDownTimeInputDialog.png") ); }); - m_master->runFeature( m_master->featureManager().feature( Feature::Uid( "352de795-7fc4-4850-bc57-525bcb7033f5" ) ) ); + m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "352de795-7fc4-4850-bc57-525bcb7033f5" ) ) ); } @@ -321,7 +321,7 @@ void DocumentationFigureCreator::createUserLoginDialogFigure() grabDialog( dialog, {}, QStringLiteral("UserLoginDialog.png") ); }); - m_master->runFeature( m_master->featureManager().feature( Feature::Uid( "7310707d-3918-460d-a949-65bd152cb958" ) ) ); + m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "7310707d-3918-460d-a949-65bd152cb958" ) ) ); } @@ -336,7 +336,7 @@ void DocumentationFigureCreator::createTextMessageDialogFigure() grabDialog( dialog, {}, QStringLiteral("TextMessageDialog.png") ); }); - m_master->runFeature( m_master->featureManager().feature( Feature::Uid( "e75ae9c8-ac17-4d00-8f0d-019348346208" ) ) ); + m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "e75ae9c8-ac17-4d00-8f0d-019348346208" ) ) ); } @@ -351,14 +351,14 @@ void DocumentationFigureCreator::createOpenWebsiteDialogFigure() grabDialog( dialog, {}, QStringLiteral("OpenWebsiteDialog.png") ); }); - m_master->runFeature( m_master->featureManager().feature( Feature::Uid( "8a11a75d-b3db-48b6-b9cb-f8422ddd5b0c" ) ) ); + m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "8a11a75d-b3db-48b6-b9cb-f8422ddd5b0c" ) ) ); } void DocumentationFigureCreator::createWebsiteMenuFigure() { - auto toolbar = m_master->mainWindow()->findChild(); + auto toolbar = m_master.mainWindow()->findChild(); auto openWebsiteButton = toolbar->findChild( QStringLiteral("OpenWebsite") ); auto menu = new QMenu; @@ -369,7 +369,7 @@ void DocumentationFigureCreator::createWebsiteMenuFigure() scheduleUiOperation( [this, openWebsiteButton, menu]() { scheduleUiOperation( [this, openWebsiteButton, menu]() { - grabWindow( m_master->mainWindow(), openWebsiteButton->mapTo( m_master->mainWindow(), QPoint( 0, 0 ) ), + grabWindow( m_master.mainWindow(), openWebsiteButton->mapTo( m_master.mainWindow(), QPoint( 0, 0 ) ), QSize( qMax( openWebsiteButton->width(), menu->width() ), openWebsiteButton->height() + menu->height() ), QStringLiteral("OpenWebsiteMenu.png") ); @@ -396,14 +396,14 @@ void DocumentationFigureCreator::createStartAppDialogFigure() grabDialog( dialog, {}, QStringLiteral("StartAppDialog.png") ); }); - m_master->runFeature( m_master->featureManager().feature( Feature::Uid( "da9ca56a-b2ad-4fff-8f8a-929b2927b442" ) ) ); + m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "da9ca56a-b2ad-4fff-8f8a-929b2927b442" ) ) ); } void DocumentationFigureCreator::createAppMenuFigure() { - auto toolbar = m_master->mainWindow()->findChild(); + auto toolbar = m_master.mainWindow()->findChild(); auto runProgramButton = toolbar->findChild( QStringLiteral("StartApp") ); auto menu = new QMenu; @@ -415,7 +415,7 @@ void DocumentationFigureCreator::createAppMenuFigure() scheduleUiOperation( [this, runProgramButton, menu]() { scheduleUiOperation( [this, runProgramButton, menu]() { - grabWindow( m_master->mainWindow(), runProgramButton->mapTo( m_master->mainWindow(), QPoint( 0, 0 ) ), + grabWindow( m_master.mainWindow(), runProgramButton->mapTo( m_master.mainWindow(), QPoint( 0, 0 ) ), QSize( qMax( runProgramButton->width(), menu->width() ), runProgramButton->height() + menu->height() ), QStringLiteral("RunProgramMenu.png") ); @@ -441,7 +441,7 @@ void DocumentationFigureCreator::createRemoteAccessHostDialogFigure() grabDialog( dialog, {}, QStringLiteral("RemoteAccessHostDialog.png") ); } ); - m_master->runFeature( m_master->featureManager().feature( Feature::Uid( "a18e545b-1321-4d4e-ac34-adc421c6e9c8" ) ) ); + m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "a18e545b-1321-4d4e-ac34-adc421c6e9c8" ) ) ); } @@ -497,7 +497,7 @@ void DocumentationFigureCreator::createRemoteAccessWindowFigure() } ); } ); - m_master->runFeature( m_master->featureManager().feature( Feature::Uid( "ca00ad68-1709-4abe-85e2-48dff6ccf8a2" ) ) ); + m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "ca00ad68-1709-4abe-85e2-48dff6ccf8a2" ) ) ); m_eventLoop.exec(); } @@ -529,14 +529,14 @@ void DocumentationFigureCreator::createFileTransferDialogFigure() } ); } ); - m_master->runFeature( m_master->featureManager().feature( Feature::Uid( "4a70bd5a-fab2-4a4b-a92a-a1e81d2b75ed" ) ) ); + m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "4a70bd5a-fab2-4a4b-a92a-a1e81d2b75ed" ) ) ); } void DocumentationFigureCreator::hideComputers() { - auto view = m_master->mainWindow()->findChild(); + auto view = m_master.mainWindow()->findChild(); view->setSearchFilter( QStringLiteral("XXXXXX") ); } diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index c9ce10a81..6c6c6a09e 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -69,7 +69,7 @@ class DocumentationFigureCreator : public QObject static void grabWindow( QWidget* widget, const QString& fileName ); static void grabWindow( QWidget* widget, QPoint pos, const QSize size, const QString& fileName ); - VeyonMaster* m_master{new VeyonMaster}; + VeyonMaster m_master{VeyonCore::instance()}; QEventLoop m_eventLoop{}; } ; From 33eeda1e75de25f1fc701a01a1a4dc87713dcfbd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 May 2021 15:55:31 +0200 Subject: [PATCH 0918/1765] DocumentationFigureCreator: use constFirst() on temporary list --- master/src/DocumentationFigureCreator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index 89bdb973c..d244cbc09 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -509,7 +509,7 @@ void DocumentationFigureCreator::createFileTransferDialogFigure() auto dialog = qobject_cast( QApplication::activeWindow() ); dialog->setDirectory( QDir::current() ); - dialog->findChildren().value(0)->setText( QStringLiteral("\"%1.pdf\" \"%2.pdf\"").arg( tr("Handout"), tr("Texts to read") ) ); + dialog->findChildren().constFirst()->setText( QStringLiteral("\"%1.pdf\" \"%2.pdf\"").arg( tr("Handout"), tr("Texts to read") ) ); dialog->setResult( QDialog::Accepted ); dialog->setVisible( false ); From c734411ec0ffac4f7a5dafa3142ac7889a3984e5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 May 2021 15:55:45 +0200 Subject: [PATCH 0919/1765] DocumentationFigureCreator: wait before grabbing FileTransferDialogStart.png --- master/src/DocumentationFigureCreator.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index d244cbc09..19a3c632f 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -519,13 +519,16 @@ void DocumentationFigureCreator::createFileTransferDialogFigure() dialog->setFocus(); dialog->move( 0, 0 ); - grabWindow( dialog, QStringLiteral("FileTransferDialogStart.png") ); + scheduleUiOperation( [dialog, this]() { - dialog->findChild()->button( QDialogButtonBox::Ok )->click(); + grabWindow( dialog, QStringLiteral("FileTransferDialogStart.png") ); - scheduleUiOperation( [dialog]() { - grabDialog( dialog, {}, QStringLiteral("FileTransferDialogFinished.png") ); - }); + dialog->findChild()->button( QDialogButtonBox::Ok )->click(); + + scheduleUiOperation( [dialog]() { + grabDialog( dialog, {}, QStringLiteral("FileTransferDialogFinished.png") ); + }); + } ); } ); } ); From 66b83b30f3b89fbb783e4514ba69d6d08c2e51b8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 6 May 2021 10:10:17 +0200 Subject: [PATCH 0920/1765] DocumentationFigureCreator: add static version of scheduleUiOperation() --- master/src/DocumentationFigureCreator.cpp | 5 +++-- master/src/DocumentationFigureCreator.h | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index 19a3c632f..916dba4d8 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -545,9 +545,10 @@ void DocumentationFigureCreator::hideComputers() -void DocumentationFigureCreator::scheduleUiOperation( const std::function& operation ) +void DocumentationFigureCreator::scheduleUiOperation( const std::function& operation, + QObject* context ) { - QTimer::singleShot( DialogDelay, this, operation ); + QTimer::singleShot( DialogDelay, context, operation ); } diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index 6c6c6a09e..af1fc7d80 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -62,7 +62,12 @@ class DocumentationFigureCreator : public QObject void hideComputers(); - void scheduleUiOperation( const std::function& operation ); + void scheduleUiOperation( const std::function& operation ) + { + scheduleUiOperation( operation, this ); + } + + static void scheduleUiOperation( const std::function& operation, QObject* context ); static void grabWidget( QWidget* widget, QPoint pos, const QSize size, const QString& fileName ); static void grabDialog( QDialog* dialog, QSize size, const QString& fileName ); From dac5219facab375c878b04069738b14bab152960 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 6 May 2021 10:10:45 +0200 Subject: [PATCH 0921/1765] DocumentationFigureCreator: add grabMenu() --- master/src/DocumentationFigureCreator.cpp | 27 +++++++++++++++++++++++ master/src/DocumentationFigureCreator.h | 1 + 2 files changed, 28 insertions(+) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index 916dba4d8..bda1413f1 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -553,6 +553,33 @@ void DocumentationFigureCreator::scheduleUiOperation( const std::functionfindChild( buttonName ); + + scheduleUiOperation( [window, button, &fileName]() { + scheduleUiOperation( [window, button, &fileName]() { + auto menu = button->menu(); + + grabWindow( window, button->mapTo( window, QPoint( 0, 0 ) ), + QSize( qMax( button->width(), menu->width() ), + button->height() + menu->height() ), + fileName ); + menu->close(); + }, window ); + auto menu = button->menu(); + menu->close(); + + button->setDown(true); + button->showMenu(); + }, window ); + + button->setDown(true); + button->showMenu(); +} + + + void DocumentationFigureCreator::grabWidget(QWidget* widget, QPoint pos, QSize size, const QString& fileName) { QPixmap pixmap( size ); diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index af1fc7d80..2590bedfe 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -69,6 +69,7 @@ class DocumentationFigureCreator : public QObject static void scheduleUiOperation( const std::function& operation, QObject* context ); + static void grabMenu( QWidget* window, const QString& buttonName, const QString& fileName ); static void grabWidget( QWidget* widget, QPoint pos, const QSize size, const QString& fileName ); static void grabDialog( QDialog* dialog, QSize size, const QString& fileName ); static void grabWindow( QWidget* widget, const QString& fileName ); From 0e59592475f849b68baa5fa2465835f876d1e4eb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 6 May 2021 10:12:13 +0200 Subject: [PATCH 0922/1765] DocumentationFigureCreator: use grabMenu() --- master/src/DocumentationFigureCreator.cpp | 96 +++++------------------ 1 file changed, 19 insertions(+), 77 deletions(-) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index bda1413f1..5e152ac2c 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -269,27 +269,7 @@ void DocumentationFigureCreator::createScreenshotManagementPanelFigure() void DocumentationFigureCreator::createPowerDownOptionsFigure() { - auto toolbar = m_master.mainWindow()->findChild(); - auto powerDownButton = toolbar->findChild( QStringLiteral("PowerDown") ); - - scheduleUiOperation( [this, powerDownButton]() { - scheduleUiOperation( [this, powerDownButton]() { - auto menu = powerDownButton->menu(); - - grabWindow( m_master.mainWindow(), powerDownButton->mapTo( m_master.mainWindow(), QPoint( 0, 0 ) ), - QSize( qMax( powerDownButton->width(), menu->width() ), - powerDownButton->height() + menu->height() ), - QStringLiteral("PowerDownOptions.png") ); - menu->close(); - } ); - auto menu = powerDownButton->menu(); - menu->close(); - - powerDownButton->click(); - - } ); - - powerDownButton->showMenu(); + grabMenu( m_master.mainWindow(), QStringLiteral("PowerDown"), QStringLiteral("PowerDownOptions.png") ); } @@ -358,30 +338,16 @@ void DocumentationFigureCreator::createOpenWebsiteDialogFigure() void DocumentationFigureCreator::createWebsiteMenuFigure() { - auto toolbar = m_master.mainWindow()->findChild(); - auto openWebsiteButton = toolbar->findChild( QStringLiteral("OpenWebsite") ); - - auto menu = new QMenu; - menu->addAction( QStringLiteral("Intranet") ); - menu->addAction( QStringLiteral("Wikipedia") ); - menu->addAction( QIcon( QStringLiteral(":/core/document-edit.png") ), tr("Custom website") ); - - scheduleUiOperation( [this, openWebsiteButton, menu]() { - scheduleUiOperation( [this, openWebsiteButton, menu]() { + const auto openWebsiteButton = m_master.mainWindow()->findChild( QStringLiteral("OpenWebsite") ); - grabWindow( m_master.mainWindow(), openWebsiteButton->mapTo( m_master.mainWindow(), QPoint( 0, 0 ) ), - QSize( qMax( openWebsiteButton->width(), menu->width() ), - openWebsiteButton->height() + menu->height() ), - QStringLiteral("OpenWebsiteMenu.png") ); - menu->close(); - } ); + QMenu menu; + menu.addAction( QStringLiteral("Intranet") ); + menu.addAction( QStringLiteral("Wikipedia") ); + menu.addAction( QIcon( QStringLiteral(":/core/document-edit.png") ), tr("Custom website") ); - menu->close(); - openWebsiteButton->showMenu(); - } ); + openWebsiteButton->setMenu( &menu ); - openWebsiteButton->setMenu( menu ); - openWebsiteButton->showMenu(); + grabMenu( m_master.mainWindow(), openWebsiteButton->objectName(), QStringLiteral("OpenWebsiteMenu.png") ); } @@ -403,31 +369,17 @@ void DocumentationFigureCreator::createStartAppDialogFigure() void DocumentationFigureCreator::createAppMenuFigure() { - auto toolbar = m_master.mainWindow()->findChild(); - auto runProgramButton = toolbar->findChild( QStringLiteral("StartApp") ); + const auto startAppButton = m_master.mainWindow()->findChild( QStringLiteral("StartApp") ); - auto menu = new QMenu; - menu->addAction( tr("Open file manager") ); - menu->addAction( tr("Start learning tool") ); - menu->addAction( tr("Play tutorial video") ); - menu->addAction( QIcon( QStringLiteral(":/core/document-edit.png") ), tr("Custom application") ); + QMenu menu; + menu.addAction( tr("Open file manager") ); + menu.addAction( tr("Start learning tool") ); + menu.addAction( tr("Play tutorial video") ); + menu.addAction( QIcon( QStringLiteral(":/core/document-edit.png") ), tr("Custom application") ); - scheduleUiOperation( [this, runProgramButton, menu]() { - scheduleUiOperation( [this, runProgramButton, menu]() { + startAppButton->setMenu( &menu ); - grabWindow( m_master.mainWindow(), runProgramButton->mapTo( m_master.mainWindow(), QPoint( 0, 0 ) ), - QSize( qMax( runProgramButton->width(), menu->width() ), - runProgramButton->height() + menu->height() ), - QStringLiteral("RunProgramMenu.png") ); - menu->close(); - } ); - - menu->close(); - runProgramButton->showMenu(); - } ); - - runProgramButton->setMenu( menu ); - runProgramButton->showMenu(); + grabMenu( m_master.mainWindow(), startAppButton->objectName(), QStringLiteral("StartAppMenu.png") ); } @@ -479,19 +431,9 @@ void DocumentationFigureCreator::createRemoteAccessWindowFigure() auto shortcuts = window->findChild( QStringLiteral("shortcuts") ); Q_ASSERT(shortcuts != nullptr); - scheduleUiOperation( [this, window, shortcuts]() { - auto menu = shortcuts->menu(); - - grabWindow( window, shortcuts->mapTo( window, QPoint( 0, 0 ) ), - QSize( qMax( shortcuts->width(), menu->width() ), - shortcuts->height() + menu->height() ), - QStringLiteral("RemoteAccessShortcutsMenu.png") ); - menu->close(); - window->close(); - m_eventLoop.quit(); - } ); - - shortcuts->showMenu(); + grabMenu( window, QStringLiteral("shortcuts"), QStringLiteral("RemoteAccessShortcutsMenu.png") ); + window->close(); + m_eventLoop.quit(); } ); } ); } ); From baa0d47bf0aac0e19d0f80a55f1cfcfe8aaba6f1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 6 May 2021 10:15:49 +0200 Subject: [PATCH 0923/1765] DocumentationFigureCreator: add createDemoMenuFigure() --- master/src/DocumentationFigureCreator.cpp | 8 ++++++++ master/src/DocumentationFigureCreator.h | 1 + 2 files changed, 9 insertions(+) diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index 5e152ac2c..b1534fda9 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -67,6 +67,7 @@ void DocumentationFigureCreator::run() createFeatureFigures(); createContextMenuFigure(); + createDemoMenuFigure(); createLogonDialogFigure(); createLocationDialogFigure(); createScreenshotManagementPanelFigure(); @@ -267,6 +268,13 @@ void DocumentationFigureCreator::createScreenshotManagementPanelFigure() +void DocumentationFigureCreator::createDemoMenuFigure() +{ + grabMenu( m_master.mainWindow(), QStringLiteral("Demo"), QStringLiteral("DemoMenu.png") ); +} + + + void DocumentationFigureCreator::createPowerDownOptionsFigure() { grabMenu( m_master.mainWindow(), QStringLiteral("PowerDown"), QStringLiteral("PowerDownOptions.png") ); diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index 2590bedfe..22be9afde 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -48,6 +48,7 @@ class DocumentationFigureCreator : public QObject void createLogonDialogFigure(); void createLocationDialogFigure(); void createScreenshotManagementPanelFigure(); + void createDemoMenuFigure(); void createPowerDownOptionsFigure(); void createPowerDownTimeInputDialogFigure(); void createUserLoginDialogFigure(); From 7a0584a799a248bfe114ad79299ea37d9610736c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 6 May 2021 10:44:43 +0200 Subject: [PATCH 0924/1765] Update translations --- translations/veyon.ts | 155 ++++++++++-------- translations/veyon_ar.ts | 159 +++++++++++-------- translations/veyon_bg.ts | 189 ++++++++++++---------- translations/veyon_ca_ES.ts | 159 +++++++++++-------- translations/veyon_cs.ts | 189 ++++++++++++---------- translations/veyon_de.ts | 203 +++++++++++++---------- translations/veyon_el.ts | 159 +++++++++++-------- translations/veyon_es_ES.ts | 239 ++++++++++++++++------------ translations/veyon_et.ts | 191 ++++++++++++---------- translations/veyon_fa.ts | 163 +++++++++++-------- translations/veyon_fr.ts | 245 +++++++++++++++------------- translations/veyon_he.ts | 165 +++++++++++-------- translations/veyon_hu.ts | 189 ++++++++++++---------- translations/veyon_id.ts | 163 +++++++++++-------- translations/veyon_it.ts | 189 ++++++++++++---------- translations/veyon_ja.ts | 169 ++++++++++++-------- translations/veyon_ko.ts | 189 ++++++++++++---------- translations/veyon_lt.ts | 189 ++++++++++++---------- translations/veyon_lv.ts | 171 +++++++++++--------- translations/veyon_mn.ts | 159 +++++++++++-------- translations/veyon_nl.ts | 193 ++++++++++++---------- translations/veyon_no_NO.ts | 159 +++++++++++-------- translations/veyon_pl.ts | 189 ++++++++++++---------- translations/veyon_pt_BR.ts | 191 ++++++++++++---------- translations/veyon_pt_PT.ts | 155 ++++++++++-------- translations/veyon_ru.ts | 189 ++++++++++++---------- translations/veyon_sl.ts | 189 ++++++++++++---------- translations/veyon_sr.ts | 309 ++++++++++++++++++++---------------- translations/veyon_sv.ts | 155 ++++++++++-------- translations/veyon_th.ts | 185 ++++++++++++--------- translations/veyon_tr.ts | 189 ++++++++++++---------- translations/veyon_uk.ts | 189 ++++++++++++---------- translations/veyon_vi.ts | 157 ++++++++++-------- translations/veyon_zh_CN.ts | 189 ++++++++++++---------- translations/veyon_zh_TW.ts | 189 ++++++++++++---------- 35 files changed, 3738 insertions(+), 2723 deletions(-) diff --git a/translations/veyon.ts b/translations/veyon.ts index ce50a968c..fd9c1f40b 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -315,6 +315,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1636,86 +1644,90 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites + Name - Predefined programs + Path - Name + Predefined websites - Path + Remove selected website + + + + URL - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - Run program + Open website - Open website + Click this button to open a website on all computers. - Click this button to open a website on all computers. + Open website "%1" - Start programs and services in user desktop + Custom website - Click this button to run a program on all computers. + Start application - Run program "%1" + Click this button to start an application on all computers. - Custom program + Start application "%1" - Open website "%1" + Custom application - Custom website + Start apps and open websites in user sessions @@ -1749,10 +1761,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1765,6 +1773,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3064,6 +3076,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3288,6 +3304,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3366,10 +3386,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3420,6 +3436,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3564,33 +3592,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3958,6 +3959,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3994,7 +4026,7 @@ The second button will remove the selected computer. If nothing is selected the - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4108,6 +4140,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4313,11 +4349,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - diff --git a/translations/veyon_ar.ts b/translations/veyon_ar.ts index 1cfd04747..55c6f12e4 100644 --- a/translations/veyon_ar.ts +++ b/translations/veyon_ar.ts @@ -313,6 +313,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1634,86 +1642,90 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites + Name + الاسم + + + Path - Predefined programs + Predefined websites - Name - الاسم + Remove selected website + - Path + URL - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - Run program + Open website - Open website + Click this button to open a website on all computers. - Click this button to open a website on all computers. + Open website "%1" - Start programs and services in user desktop + Custom website - Click this button to run a program on all computers. + Start application - Run program "%1" + Click this button to start an application on all computers. - Custom program + Start application "%1" - Open website "%1" + Custom application - Custom website + Start apps and open websites in user sessions @@ -1747,10 +1759,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1763,6 +1771,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3062,6 +3074,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3286,6 +3302,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3364,10 +3384,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? هل تريد حقًا إعادة تشغيل الحاسوب المحدد؟ - - Do you really want to power down the selected computer? - هل تريد حقًا إيقاف تشغيل الحاسوب المحدد؟ - Power on a computer via Wake-on-LAN (WOL) @@ -3418,6 +3434,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3562,33 +3590,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - الرجاء إدخال برامج أو أوامر لتشغيلها على الحاسوب (الحواسيب) المحددة. يمكنك فصل العديد من البرامج / الأوامر بواسطة سطر. - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3956,6 +3957,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3992,8 +4024,8 @@ The second button will remove the selected computer. If nothing is selected the إرسال رسالة نصية - Use the field below to type your message which will be sent to all selected users. - استخدم الحقل أدناه لطباعة رسالتك التي سيتم ارسالها الى كافة المستخدمين المختارين + Please enter your message which send to all selected users. + @@ -4106,6 +4138,10 @@ The second button will remove the selected computer. If nothing is selected the User session control التحكم في جلسة عمل المستخدم + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4311,11 +4347,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_bg.ts b/translations/veyon_bg.ts index 07f9634b1..d40514577 100644 --- a/translations/veyon_bg.ts +++ b/translations/veyon_bg.ts @@ -315,6 +315,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - - Programs & websites - Programs & websites - - - Predefined programs - Predefined programs - Name Name @@ -1654,14 +1654,6 @@ The public key is used on client computers to authenticate incoming connection r Path Path - - Add new program - Add new program - - - Remove selected program - Remove selected program - Predefined websites Predefined websites @@ -1674,21 +1666,37 @@ The public key is used on client computers to authenticate incoming connection r URL URL - - New program - New program - New website New website + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Run program - Open website Open website @@ -1698,28 +1706,32 @@ The public key is used on client computers to authenticate incoming connection r Click this button to open a website on all computers. - Start programs and services in user desktop - Start programs and services in user desktop + Open website "%1" + Open website "%1" - Click this button to run a program on all computers. - Click this button to run a program on all computers. + Custom website + Custom website - Run program "%1" - Run program "%1" + Start application + - Custom program - Custom program + Click this button to start an application on all computers. + - Open website "%1" - Open website "%1" + Start application "%1" + - Custom website - Custom website + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video Play tutorial video - - Custom program - Custom program - Handout Handout @@ -1768,6 +1776,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user generic-student-user + + Custom application + + ExternalVncServer @@ -3086,6 +3098,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3310,6 +3326,10 @@ The public key is used on client computers to authenticate incoming connection r Name: Name: + + Website name + + PluginsCommands @@ -3388,10 +3408,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - Do you really want to power down the selected computer? - Power on a computer via Wake-on-LAN (WOL) Power on a computer via Wake-on-LAN (WOL) @@ -3444,6 +3460,18 @@ Please save your work and close all programs. Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3588,33 +3616,6 @@ Please save your work and close all programs. Exit - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - Run programs - Run programs - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Name: - - - Remember and add to program menu - Remember and add to program menu - - - e.g. VLC - e.g. VLC - - ScreenLockFeaturePlugin @@ -3983,6 +3984,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + Name: + + + e.g. VLC + e.g. VLC + + SystemTrayIcon @@ -4019,8 +4051,8 @@ The second button will remove the selected computer. If nothing is selected the Send text message - Use the field below to type your message which will be sent to all selected users. - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. + @@ -4133,6 +4165,10 @@ The second button will remove the selected computer. If nothing is selected the User session control User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4338,11 +4374,4 @@ The second button will remove the selected computer. If nothing is selected the Do not use X Damage extension - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_ca_ES.ts b/translations/veyon_ca_ES.ts index c6780d9a0..1d9744cd1 100644 --- a/translations/veyon_ca_ES.ts +++ b/translations/veyon_ca_ES.ts @@ -313,6 +313,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1634,86 +1642,90 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites + Name + Nom + + + Path - Predefined programs + Predefined websites - Name - Nom + Remove selected website + - Path + URL - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - Run program + Open website - Open website + Click this button to open a website on all computers. - Click this button to open a website on all computers. + Open website "%1" - Start programs and services in user desktop + Custom website - Click this button to run a program on all computers. + Start application - Run program "%1" + Click this button to start an application on all computers. - Custom program + Start application "%1" - Open website "%1" + Custom application - Custom website + Start apps and open websites in user sessions @@ -1747,10 +1759,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1763,6 +1771,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3062,6 +3074,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3286,6 +3302,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3364,10 +3384,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3418,6 +3434,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3562,33 +3590,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3956,6 +3957,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3992,8 +4024,8 @@ The second button will remove the selected computer. If nothing is selected the Envia un missatge de text - Use the field below to type your message which will be sent to all selected users. - Utilitzeu el camp de sota per escriure el missatge que serà enviat als usuaris seleccionats. + Please enter your message which send to all selected users. + @@ -4106,6 +4138,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4311,11 +4347,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_cs.ts b/translations/veyon_cs.ts index da964d769..a491cb2d8 100644 --- a/translations/veyon_cs.ts +++ b/translations/veyon_cs.ts @@ -315,6 +315,14 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří DesktopServicesConfigurationPage - - Programs & websites - Programy a webové stránky - - - Predefined programs - Přednastavené aplikace - Name Název @@ -1654,14 +1654,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Path Umístění - - Add new program - Přidat novou aplikaci - - - Remove selected program - Odebrat označenou aplikaci - Predefined websites Přednastavené webové stránky @@ -1674,21 +1666,37 @@ Veřejná část je použita na klientských počítačích pro ověření pří URL URL - - New program - Nová aplikace - New website Nová webová stránka + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Spustit aplikaci - Open website Otevřít webovou stránku @@ -1698,28 +1706,32 @@ Veřejná část je použita na klientských počítačích pro ověření pří Kliknutím na toto tlačítko otevřete webovou stránku na všech počítačích. - Start programs and services in user desktop - Spustit aplikace a služby na počítači uživatele + Open website "%1" + Otevřít webovou stránku „%1“ - Click this button to run a program on all computers. - Kliknutím na toto tlačítko spustíte aplikaci na všech počítačích. + Custom website + Uživatelsky určené webová stránka - Run program "%1" - Spustit aplikaci „%1“ + Start application + - Custom program - Uživatelem určená aplikace + Click this button to start an application on all computers. + - Open website "%1" - Otevřít webovou stránku „%1“ + Start application "%1" + - Custom website - Uživatelsky určené webová stránka + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Play tutorial video Přehrát výukové video - - Custom program - Uživatelem určená aplikace - Handout Předání @@ -1768,6 +1776,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří generic-student-user obecný student-uživatel + + Custom application + + ExternalVncServer @@ -3082,6 +3094,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3306,6 +3322,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří Name: Název: + + Website name + + PluginsCommands @@ -3384,10 +3404,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Do you really want to reboot the selected computers? Opravdu chcete vybrané počítače restartovat? - - Do you really want to power down the selected computer? - Opravdu chcete vybrané počítače vypnout? - Power on a computer via Wake-on-LAN (WOL) Zapnout počítač prostřednictvím probouzení po síti (WoL) @@ -3440,6 +3456,18 @@ Please save your work and close all programs. Uložte si rozdělanou práci a ukončete všechny aplikace. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3584,33 +3612,6 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Ukončit - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Zadejte aplikace nebo příkazy které mají být spuštěné na označených počítačích. Každou z aplikací/příkazů uvádějte na samostatný řádek - - - Run programs - Spustit aplikace - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - např.: "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Název: - - - Remember and add to program menu - Zapamatovat a přidat do nabídky programů - - - e.g. VLC - např. VLC - - ScreenLockFeaturePlugin @@ -3979,6 +3980,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + např.: "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + Název: + + + e.g. VLC + např. VLC + + SystemTrayIcon @@ -4015,8 +4047,8 @@ The second button will remove the selected computer. If nothing is selected the Poslat textovou zprávu - Use the field below to type your message which will be sent to all selected users. - Do kolonky níže zadejte svou zprávu, určenou všem označeným uživatelům. + Please enter your message which send to all selected users. + @@ -4129,6 +4161,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Ovládání relace uživatele + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4334,11 +4370,4 @@ The second button will remove the selected computer. If nothing is selected the Nezjišťovat změny ve zobrazení pomocí rozšíření Damage pro X zobrazovací server - - main - - Veyon Master - Veyon – hlavní - - \ No newline at end of file diff --git a/translations/veyon_de.ts b/translations/veyon_de.ts index 3a4e08754..f83c54829 100644 --- a/translations/veyon_de.ts +++ b/translations/veyon_de.ts @@ -313,6 +313,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed Computer, auf den zugegriffen wird + + Session being accessed is a user session + Sitzung, auf die zugegriffen wird, ist eine Benutzersitzung + + + Session being accessed is a login screen + Sitzung, auf die zugegriffen wird, ist ein Anmeldebildschirm + AccessControlRulesTestDialog @@ -1635,14 +1643,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e DesktopServicesConfigurationPage - - Programs & websites - Programme & Webseiten - - - Predefined programs - Vordefinierte Programme - Name Name @@ -1651,14 +1651,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Path Pfad - - Add new program - Neues Programm hinzufügen - - - Remove selected program - Ausgewähltes Programm entfernen - Predefined websites Vordefinierte Webseiten @@ -1671,21 +1663,37 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e URL URL - - New program - Neues Programm - New website Neue Webseite + + Applications & websites + Anwendungen & Webseiten + + + Predefined applications + Vordefinierte Anwendungen + + + Add new application + Neue Anwendung hinzufügen + + + Remove selected application + Gewählte Anwendung entfernen + + + Add new website + Neue Website hinzufügen + + + New application + Neue Anwendung + DesktopServicesFeaturePlugin - - Run program - Programm starten - Open website Webseite öffnen @@ -1695,28 +1703,32 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Klicken Sie auf diesen Button, um eine Webseite auf allen Computern zu öffnen. - Start programs and services in user desktop - Programme und Dienste im Benutzerdesktop starten + Open website "%1" + Webseite "%1" öffnen - Click this button to run a program on all computers. - Klicken Sie auf diesen Button, um Programme auf allen Computern zu starten. + Custom website + Benutzerdefinierte Webseite - Run program "%1" - Programm "%1" ausführen + Start application + Anwendung starten - Custom program - Benutzerdefiniertes Programm + Click this button to start an application on all computers. + Klicken Sie auf diesen Button, um eine Anwendung auf allen Computern zu starten. - Open website "%1" - Webseite "%1" öffnen + Start application "%1" + Anwendung "%1" ausführen - Custom website - Benutzerdefinierte Webseite + Custom application + Benutzerdefinierte Anwendung + + + Start apps and open websites in user sessions + Anwendungen starten und Webseiten öffnen in Benutzersitzungen @@ -1749,10 +1761,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Play tutorial video Tutorial-Video abspielen - - Custom program - Benutzerdefiniertes Programm - Handout Arbeitsblatt @@ -1765,6 +1773,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e generic-student-user allgemeiner-schueler-benutzer + + Custom application + Benutzerdefinierte Anwendung + ExternalVncServer @@ -3083,6 +3095,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Spotlight Scheinwerfer + + Veyon Master + + MasterConfigurationPage @@ -3140,7 +3156,7 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Actions such as rebooting or powering down computers - Aktionen wie Computer neustarten oder ausschalten + Aktionen wie Computer neu starten oder ausschalten User interface @@ -3307,6 +3323,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Name: Name: + + Website name + Webseitenname + PluginsCommands @@ -3355,7 +3375,7 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Reboot - Neustarten + Neustart Click this button to reboot all computers. @@ -3371,7 +3391,7 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Power on/down or reboot a computer - Computer ein-/ausschalten oder neustarten + Computer ein-/ausschalten oder neu starten Confirm reboot @@ -3383,11 +3403,7 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Do you really want to reboot the selected computers? - Möchten Sie wirklich die gewählten Computer neustarten? - - - Do you really want to power down the selected computer? - Möchten Sie wirklich die gewählten Computer herunterfahren? + Möchten Sie wirklich die gewählten Computer neu starten? Power on a computer via Wake-on-LAN (WOL) @@ -3441,6 +3457,18 @@ Please save your work and close all programs. Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. + + Do you really want to reboot <b>ALL</b> computers? + Möchten Sie wirklich <b>ALLE</b> Computer neu starten? + + + Do you really want to power down <b>ALL</b> computers? + Möchten Sie wirklich <b>ALLE</b> Computer herunterfahren? + + + Do you really want to power down the selected computers? + Möchten Sie wirklich die gewählten Computer herunterfahren? + PowerDownTimeInputDialog @@ -3585,33 +3613,6 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Beenden - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Bitte geben Sie die Programme oder die Befehle ein, die auf den gewählten Computern gestartet werden sollen. Sie können mehrere Programme/Befehle über einzelne Zeilen angeben. - - - Run programs - Programme starten - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - z.B. "C:\Programme\VideoLAN\VLC\vlc.exe" - - - Name: - Name: - - - Remember and add to program menu - Merken und zum Programmmenü hinzufügen - - - e.g. VLC - z.B. VLC - - ScreenLockFeaturePlugin @@ -3779,11 +3780,11 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Restart %1 Service - %1 Dienst neustarten + %1 Dienst neu starten All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - Alle Einstellungen wurden erfolgreich gespeichert. Damit die Einstellungen wirksam werden, muss der %1-Dienst neugestartet werden. Jetzt neustarten? + Alle Einstellungen wurden erfolgreich gespeichert. Damit die Einstellungen wirksam werden, muss der %1-Dienst neu gestartet werden. Jetzt neu starten? Running @@ -3899,7 +3900,7 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen. Restart Veyon Service - Veyon-Dienst neustarten + Veyon-Dienst neu starten Query status of Veyon Service @@ -3981,6 +3982,37 @@ The second button will remove the selected computer. If nothing is selected the Der zweite Button entfernt den gewählten Computer. Wenn nichts ausgewählt ist, wird der letzte Computer entfernt. + + StartAppDialog + + Start application + Anwendung starten + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + Bitte geben Sie die Anwendungen ein, die auf den gewählten Computern gestartet werden sollen. Sie können mehrere Anwendungen über einzelne Zeilen angeben. + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + z.B. "C:\Programme\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + Merken und zum Anwendungsmenü hinzufügen + + + Application name + Anwendungsname + + + Name: + Name: + + + e.g. VLC + z.B. VLC + + SystemTrayIcon @@ -4017,8 +4049,8 @@ Der zweite Button entfernt den gewählten Computer. Wenn nichts ausgewählt ist, Textnachricht übermitteln - Use the field below to type your message which will be sent to all selected users. - Nutzen Sie das Feld unterhalb, um Ihre Nachricht zu tippen, die an alle Benutzer übermittelt wird. + Please enter your message which send to all selected users. + Bitte geben Sie die Nachricht ein, die an alle gewählten Benutzer übermittelt werden soll. @@ -4131,6 +4163,10 @@ Der zweite Button entfernt den gewählten Computer. Wenn nichts ausgewählt ist, User session control Benutzersitzungssteuerung + + Do you really want to log off <b>ALL</b> users? + Möchten Sie wirklich <b>ALLE</b> Benutzer abmelden? + VeyonCore @@ -4336,11 +4372,4 @@ Der zweite Button entfernt den gewählten Computer. Wenn nichts ausgewählt ist, X-Damage-Erweiterung nicht nutzen - - main - - Veyon Master - Veyon Master - - \ No newline at end of file diff --git a/translations/veyon_el.ts b/translations/veyon_el.ts index bcbf2e674..4bd2ecdf5 100644 --- a/translations/veyon_el.ts +++ b/translations/veyon_el.ts @@ -315,6 +315,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1636,56 +1644,56 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites + Name + Όνομα + + + Path - Predefined programs + Predefined websites - Name - Όνομα + Remove selected website + - Path + URL - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - - Run program - Εκτέλεση προγράμματος - Open website Άνοιγμα ιστοχώρου @@ -1695,27 +1703,31 @@ The public key is used on client computers to authenticate incoming connection r Πατήστε το κουμπί για να ανοίξετε έναν ιστοχώρο σε όλους τους υπολογιστές. - Start programs and services in user desktop + Open website "%1" - Click this button to run a program on all computers. + Custom website - Run program "%1" + Start application - Custom program + Click this button to start an application on all computers. - Open website "%1" + Start application "%1" - Custom website + Custom application + + + + Start apps and open websites in user sessions @@ -1749,10 +1761,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1765,6 +1773,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3064,6 +3076,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3288,6 +3304,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3366,10 +3386,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3420,6 +3436,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3564,33 +3592,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - Εκτέλεση προγραμμάτων - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3958,6 +3959,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3994,7 +4026,7 @@ The second button will remove the selected computer. If nothing is selected the Αποστολή μηνύματος - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4108,6 +4140,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4313,11 +4349,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_es_ES.ts b/translations/veyon_es_ES.ts index 95e6b8101..c9d083693 100644 --- a/translations/veyon_es_ES.ts +++ b/translations/veyon_es_ES.ts @@ -219,35 +219,35 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla Accessing computer and local computer - + Computadora de acceso y computadora local User being accessed - + Usuario al que se accede is logged in locally - + está conectado localmente is logged in remotely - + está conectado de forma remota No user is logged in locally - + Ningún usuario ha iniciado sesión localmente One or multiple users are logged in locally - + Uno o varios usuarios han iniciado sesión localmente No user is logged in remotely - + Ningún usuario está conectado remotamente One or multiple users are logged in remotely - + Uno o varios usuarios inician sesión de forma remota is located at @@ -255,15 +255,15 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla is not located at - + no se encuentra en are located at the same location - + se encuentran en la misma ubicación are not located the same location - + no se encuentran en la misma ubicación is member of group @@ -271,51 +271,59 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla is not member of group - + no es miembro del grupo is authenticated via - + está autenticado a través de is not authenticated via - + no está autenticado a través de has one or more groups in common with user being accessed - + tiene uno o más grupos en común con el usuario al que se accede has no groups in common with user being accessed - + no tiene grupos en común con el usuario al que se accede equals user being accessed - + igual al usuario al que se accede is different from user being accessed - + es diferente al usuario al que se accede is already connected - + ya esta conectada is not connected - + no esta conectada is local computer - + es una computadora local is not local computer - + no es una computadora local Computer being accessed - + Se accede a la computadora + + + Session being accessed is a user session + La sesión a la que se accede es una sesión de usuario + + + Session being accessed is a login screen + La sesión a la que se accede es una pantalla de inicio de sesión @@ -1640,14 +1648,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu DesktopServicesConfigurationPage - - Programs & websites - Programas y sitios web - - - Predefined programs - Programas predefinidos - Name Nombre @@ -1656,14 +1656,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Path Ruta - - Add new program - Añadir nuevo programa - - - Remove selected program - Eliminar el programa seleccionado - Predefined websites Sitios web predefinidos @@ -1676,21 +1668,37 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu URL URL - - New program - Nuevo programa - New website Nuevo sitio web + + Applications & websites + Aplicaciones y sitios web + + + Predefined applications + Aplicaciones predefinidas + + + Add new application + Añadir nueva aplicación + + + Remove selected application + Eliminar la aplicación seleccionada + + + Add new website + Añadir nuevo sitio web + + + New application + Nueva aplicación + DesktopServicesFeaturePlugin - - Run program - Ejecutar programa - Open website Abrir sitio web @@ -1700,28 +1708,32 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Haga clic en este botón para abrir un sitio web en todos los equipos. - Start programs and services in user desktop - Iniciar programas y servicios en el escritorio del usuario + Open website "%1" + Abrir sitio web "%1" - Click this button to run a program on all computers. - Haga clic en este botón para ejecutar un programa en todos los equipos. + Custom website + Sitio web personalizado - Run program "%1" - Ejecutar el programa "%1" + Start application + Iniciar aplicación - Custom program - Programa personalizado + Click this button to start an application on all computers. + Haga clic en este botón para iniciar una aplicación en todas las computadoras. - Open website "%1" - Abrir sitio web "%1" + Start application "%1" + Iniciar aplicación "%1" - Custom website - Sitio web personalizado + Custom application + Aplicación personalizada + + + Start apps and open websites in user sessions + Iniciar aplicaciones y abrir sitios web en sesiones de usuario @@ -1754,10 +1766,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Play tutorial video Reproducir video tutorial - - Custom program - Programa personalizado - Handout Folleto @@ -1770,6 +1778,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu generic-student-user usuario-estudiante-genérico + + Custom application + Aplicación personalizada + ExternalVncServer @@ -2842,11 +2854,11 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu User sessions - + Sesiones de usuario Minimum session lifetime before server start - + Duración mínima de la sesión antes del inicio del servidor User login @@ -3088,6 +3100,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Spotlight Foco + + Veyon Master + + MasterConfigurationPage @@ -3312,6 +3328,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Name: Nombre: + + Website name + Nombre del Sitio Web + PluginsCommands @@ -3390,10 +3410,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Do you really want to reboot the selected computers? ¿Realmente desea reiniciar los equipos seleccionados? - - Do you really want to power down the selected computer? - ¿Realmente desea apagar el equipo seleccionado? - Power on a computer via Wake-on-LAN (WOL) Encienda un equipo a través de Wake-on-LAN (WOL) @@ -3446,6 +3462,18 @@ Please save your work and close all programs. Por favor guarde su trabajo y cierre todos los programas. + + Do you really want to reboot <b>ALL</b> computers? + ¿Realmente desea reiniciar <b>TODAS</b> las computadoras? + + + Do you really want to power down <b>ALL</b> computers? + ¿Realmente desea apagar <b>TODAS</b> las computadoras? + + + Do you really want to power down the selected computers? + ¿Realmente desea apagar las computadoras seleccionadas? + PowerDownTimeInputDialog @@ -3590,33 +3618,6 @@ Por favor guarde su trabajo y cierre todos los programas. Salir - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Introduzca los programas o comandos a ejecutar en el equipo/s seleccionado/s. Puede separar varios programas/comandos por línea. - - - Run programs - Ejecutar programas - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - v.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Nombre: - - - Remember and add to program menu - Recordar y añadir al menú del programa - - - e.g. VLC - p.ej. VLC - - ScreenLockFeaturePlugin @@ -3986,6 +3987,37 @@ The second button will remove the selected computer. If nothing is selected the El segundo botón eliminará la computadora seleccionada. Si no se selecciona nada, se eliminará el último. + + StartAppDialog + + Start application + Iniciar aplicación + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + Por favor, introduzca las aplicaciones para iniciar en las computadoras seleccionadas. Puede separar varias aplicaciones por línea. + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + v.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + Recordar y añadir al menú de la aplicación + + + Application name + Nombre de la aplicación + + + Name: + Nombre: + + + e.g. VLC + p.ej. VLC + + SystemTrayIcon @@ -4022,8 +4054,8 @@ El segundo botón eliminará la computadora seleccionada. Si no se selecciona na Enviar mensaje de texto - Use the field below to type your message which will be sent to all selected users. - Use el campo de más abajo para escribir su mensaje que será enviado a todos los usuarios seleccionados. + Please enter your message which send to all selected users. + Por favor, introduzca el mensaje a enviar a todos los usuarios seleccionados. @@ -4136,6 +4168,10 @@ El segundo botón eliminará la computadora seleccionada. Si no se selecciona na User session control Control de sesión de usuario + + Do you really want to log off <b>ALL</b> users? + ¿Realmente quieres cerrar sesión a <b>TODOS</b> los usuarios? + VeyonCore @@ -4341,11 +4377,4 @@ El segundo botón eliminará la computadora seleccionada. Si no se selecciona na No usar extensión X Damage - - main - - Veyon Master - Veyon Master - - \ No newline at end of file diff --git a/translations/veyon_et.ts b/translations/veyon_et.ts index 2dfa39029..ae48ce40f 100644 --- a/translations/veyon_et.ts +++ b/translations/veyon_et.ts @@ -315,6 +315,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten DesktopServicesConfigurationPage - - Programs & websites - Programmid ja veebisaidid - - - Predefined programs - Eelmääratud programmid - Name Nimi @@ -1654,14 +1654,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Path Rada - - Add new program - Lisa uus programm - - - Remove selected program - Eemalda valitud programm - Predefined websites Eelmääratud veebilehed @@ -1674,21 +1666,37 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten URL URL aadress - - New program - Uus programm - New website Uus veebileht + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Programmi käivitamine - Open website Weebilehe avamine @@ -1698,28 +1706,32 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Kõigil arvutitel veebisaidi avamiseks klõpsake seda nuppu. - Start programs and services in user desktop - Käivitage programmid ja teenused kasutaja töölaual + Open website "%1" + Avage veebileht "%1" - Click this button to run a program on all computers. - Programmi käivitamiseks kõigis arvutites klõpsake seda nuppu. + Custom website + Kohandatud veebileht - Run program "%1" - Käivitage programm "%1" + Start application + - Custom program - Kohandatud programm + Click this button to start an application on all computers. + - Open website "%1" - Avage veebileht "%1" + Start application "%1" + - Custom website - Kohandatud veebileht + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Play tutorial video Esitage õppevideot - - Custom program - Kohandatud programm - Handout Jaotusmaterjal @@ -1768,6 +1776,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten generic-student-user üldine-õpilane-kasutaja + + Custom application + + ExternalVncServer @@ -2187,7 +2199,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Could not find a group with the name "%1". Please check the group name or the group tree parameter. - Gruppi nimega "% 1" ei leitud. Kontrollige grupi nime või grupipuu parameetrit. + Gruppi nimega "%1" ei leitud. Kontrollige grupi nime või grupipuu parameetrit. computer objects @@ -3086,6 +3098,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Spotlight Tähelepanu keskpunktis + + Veyon Master + + MasterConfigurationPage @@ -3310,6 +3326,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Name: Nimi: + + Website name + + PluginsCommands @@ -3388,10 +3408,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Do you really want to reboot the selected computers? Kas soovite tõesti valitud arvutid taaskäivitada? - - Do you really want to power down the selected computer? - Kas soovite tõesti valitud arvutid välja lülitada? - Power on a computer via Wake-on-LAN (WOL) Lülitage arvuti sisse Wake-on-LAN (WOL) kaudu @@ -3444,6 +3460,18 @@ Please save your work and close all programs. Salvestage oma töö ja sulgege kõik programmid. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3588,33 +3616,6 @@ Salvestage oma töö ja sulgege kõik programmid. Välju - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Sisestage palun valitud arvutis (arvutites) käivitamiseks programmid või käsud. Eraldage programmid/ käskud uutel ridadel. - - - Run programs - Käivita programmid - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - näit. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Nimi: - - - Remember and add to program menu - Pea meeles ja lisa programmi menüüsse - - - e.g. VLC - näit. VLC - - ScreenLockFeaturePlugin @@ -3984,6 +3985,37 @@ The second button will remove the selected computer. If nothing is selected the Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viimane. + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + näit. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + Nimi: + + + e.g. VLC + näit. VLC + + SystemTrayIcon @@ -4020,8 +4052,8 @@ Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viiman Saada tekstisõnum - Use the field below to type your message which will be sent to all selected users. - Kasutage allolevat välja, et sisestada sõnum, mis saadetakse kõigile valitud kasutajatele. + Please enter your message which send to all selected users. + @@ -4134,6 +4166,10 @@ Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viiman User session control Kasutaja seansi juhtimine + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4339,11 +4375,4 @@ Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viiman Ärge kasutage laiendust X Damage - - main - - Veyon Master - Veyon Master - - \ No newline at end of file diff --git a/translations/veyon_fa.ts b/translations/veyon_fa.ts index 915b0f675..700102ba6 100644 --- a/translations/veyon_fa.ts +++ b/translations/veyon_fa.ts @@ -314,6 +314,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1635,56 +1643,56 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites + Name - Predefined programs + Path - Name + Predefined websites - Path + Remove selected website - Add new program + URL - Remove selected program + New website - Predefined websites + Applications & websites - Remove selected website + Predefined applications - URL + Add new application - New program + Remove selected application - New website + Add new website + + + + New application DesktopServicesFeaturePlugin - - Run program - اجرای برنامه - Open website وبسایت را باز کنید @@ -1694,27 +1702,31 @@ The public key is used on client computers to authenticate incoming connection r برای باز کردن یک وب سایت روی تمام رایانه ها ، روی این دکمه کلیک کنید. - Start programs and services in user desktop - شروع برنامه ها و خدمات در دسکتاپ کاربر + Open website "%1" + - Click this button to run a program on all computers. - برای اجرای یک برنامه روی تمام رایانه ها روی این دکمه کلیک کنید. + Custom website + - Run program "%1" + Start application - Custom program + Click this button to start an application on all computers. - Open website "%1" + Start application "%1" - Custom website + Custom application + + + + Start apps and open websites in user sessions @@ -1748,10 +1760,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1764,6 +1772,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3063,6 +3075,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3287,6 +3303,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3365,10 +3385,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3419,6 +3435,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3563,33 +3591,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3957,6 +3958,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3993,8 +4025,8 @@ The second button will remove the selected computer. If nothing is selected the ارسال پیام متنی - Use the field below to type your message which will be sent to all selected users. - از فیلد زیر برای تایپ پیام خود استفاده کنید که به تمامی کاربران انتخاب شده ارسال می شود. + Please enter your message which send to all selected users. + @@ -4107,6 +4139,10 @@ The second button will remove the selected computer. If nothing is selected the User session control کنترل جلسه کاربر + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4312,11 +4348,4 @@ The second button will remove the selected computer. If nothing is selected the از X Damage extension استفاده نکنید - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_fr.ts b/translations/veyon_fr.ts index 2487fc8de..829365650 100644 --- a/translations/veyon_fr.ts +++ b/translations/veyon_fr.ts @@ -217,35 +217,35 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Accessing computer and local computer - + Accès à l'ordinateur et à l'ordinateur local User being accessed - + Utilisateur en accès is logged in locally - + est connecté localement is logged in remotely - + est connecté à distance No user is logged in locally - + Aucun utilisateur n'est connecté localement One or multiple users are logged in locally - + Un ou plusieurs utilisateurs sont connectés localement No user is logged in remotely - + Aucun utilisateur n'est connecté à distance One or multiple users are logged in remotely - + Un ou plusieurs utilisateurs sont connectés à distance is located at @@ -253,15 +253,15 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, is not located at - + n'est pas situé à are located at the same location - + sont situés au même endroit are not located the same location - + ne sont pas situés au même endroit is member of group @@ -269,51 +269,59 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, is not member of group - + n'est pas membre du groupe is authenticated via - + est authentifié via is not authenticated via - + n'est pas authentifié via has one or more groups in common with user being accessed - + a un ou plusieurs groupes en commun avec l'utilisateur auquel on accède has no groups in common with user being accessed - + n'a aucun groupe en commun avec l'utilisateur auquel on accède equals user being accessed - + équivaut à l'utilisateur auquel on accède is different from user being accessed - + est différent de l'utilisateur auquel on accède is already connected - + est déjà connecté is not connected - + n'est pas connecté is local computer - + est un ordinateur local is not local computer - + n'est pas un ordinateur local Computer being accessed - + Ordinateur en accès + + + Session being accessed is a user session + La session en cours d'accès est une session utilisateur + + + Session being accessed is a login screen + La session en cours d'accès est un écran de connexion @@ -1638,14 +1646,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif DesktopServicesConfigurationPage - - Programs & websites - Programmes et sites internet - - - Predefined programs - Programmes prédéfinis - Name Nom @@ -1654,14 +1654,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Path Chemin - - Add new program - Ajouter un nouveau programme - - - Remove selected program - Retirer le programme sélectionné - Predefined websites Sites internet prédéfinis @@ -1674,21 +1666,37 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif URL URL - - New program - Nouveau programme - New website Nouveau site internet + + Applications & websites + Applications & sites internet + + + Predefined applications + Applications prédéfinies + + + Add new application + Ajouter une nouvelle application + + + Remove selected application + Retirer l'application sélectionnée + + + Add new website + Ajouter un nouveau site internet + + + New application + Nouvelle application + DesktopServicesFeaturePlugin - - Run program - Exécuter un programme - Open website Ouvrir une page internet @@ -1698,28 +1706,32 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Cliquez sur ce bouton pour ouvrir un site internet sur tous les ordinateurs. - Start programs and services in user desktop - Démarrer les programmes et les services dans le bureau utilisateur + Open website "%1" + Ouvre le site internet "%1" - Click this button to run a program on all computers. - Cliquez sur ce bouton pour exécuter un programme sur tous les ordinateurs. + Custom website + Site internet personnalisé - Run program "%1" - Lance le programme "%1" + Start application + Démarrer l'application - Custom program - Programme personnalisé + Click this button to start an application on all computers. + Cliquez sur ce bouton pour exécuter une application sur tous les ordinateurs. - Open website "%1" - Ouvre le site internet "%1" + Start application "%1" + Démarrer l'application "%1" - Custom website - Site internet personnalisé + Custom application + Application personnalisée + + + Start apps and open websites in user sessions + Démarrez des applications et ouvrez des sites internet dans les sessions utilisateur @@ -1752,10 +1764,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Play tutorial video Démarrer le didacticiel vidéo - - Custom program - Programme personnalisé - Handout don @@ -1768,6 +1776,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif generic-student-user utilisateur-élève-générique + + Custom application + Application personnalisée + ExternalVncServer @@ -2840,11 +2852,11 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif User sessions - + Sessions utilisateurs Minimum session lifetime before server start - + Durée de vie minimale de la session avant le démarrage du serveur User login @@ -2852,7 +2864,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Login key sequence - + Séquence de touches de connexion @@ -3020,7 +3032,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Do you really want to reset the local configuration and revert all settings to their defaults? - Voulez-vous vraiment reset la configuration locale et restaurer tous les paramètres à leurs valeurs par défaut ? + Souhaitez-vous vraiment réinitialiser la configuration locale et restaurer tous les paramètres à leurs valeurs par défaut ? Search users and computers @@ -3086,6 +3098,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Spotlight Focalisation + + Veyon Master + + MasterConfigurationPage @@ -3310,6 +3326,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Name: Nom: + + Website name + Nom de site internet + PluginsCommands @@ -3388,10 +3408,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Do you really want to reboot the selected computers? Souhaitez-vous réellement redémarrer les ordinateurs sélectionnés ? - - Do you really want to power down the selected computer? - Souhaitez-vous réellement éteindre les ordinateurs sélectionnés ? - Power on a computer via Wake-on-LAN (WOL) Allumer un ordinateur via Wake-on-LAN (WOL) @@ -3444,6 +3460,18 @@ Please save your work and close all programs. Veuillez sauvegarder votre travail et fermer tous les programmes. + + Do you really want to reboot <b>ALL</b> computers? + Souhaitez-vous vraiment redémarrer <b>TOUS</b> les ordinateurs? + + + Do you really want to power down <b>ALL</b> computers? + Souhaitez-vous vraiment éteindre <b>TOUS</b> les ordinateurs? + + + Do you really want to power down the selected computers? + Souhaitez-vous vraiment éteindre les ordinateurs sélectionnés? + PowerDownTimeInputDialog @@ -3588,33 +3616,6 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Quitter - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Veuillez entrer les programmes ou les commandes à exécuter sur les ordinateurs sélectionnés. Vous pouvez séparer vos différents programmes/commandes ligne par ligne. - - - Run programs - Exécuter des programmes - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - ex: "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Nom: - - - Remember and add to program menu - Mémoriser et ajouter au menu du programme - - - e.g. VLC - ex: VLC - - ScreenLockFeaturePlugin @@ -3731,7 +3732,7 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Do you really want to delete all selected screenshots? - Voulez-vous vraiment supprimer toutes les captures d'écran sélectionnées? + Souhaitez-vous vraiment supprimer toutes les captures d'écran sélectionnées? @@ -3984,6 +3985,37 @@ The second button will remove the selected computer. If nothing is selected the Le deuxième bouton supprimera l'ordinateur sélectionné. Si rien n'est sélectionné, le dernier sera supprimé. + + StartAppDialog + + Start application + Démarrer l'application + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + Veuillez entrer les applications à démarrer sur les ordinateurs sélectionnés. Vous pouvez séparer plusieurs applications en les inscrivant sur chaque ligne. + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + ex: "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + Se souvenir et ajouter au menu de l'application + + + Application name + Nom d'application + + + Name: + Nom: + + + e.g. VLC + ex: VLC + + SystemTrayIcon @@ -4020,8 +4052,8 @@ Le deuxième bouton supprimera l'ordinateur sélectionné. Si rien n'e Envoyer un message écrit - Use the field below to type your message which will be sent to all selected users. - Utilisez le champ ci-dessous pour saisir votre message, il sera envoyé à tous les utilisateurs sélectionnés. + Please enter your message which send to all selected users. + Veuillez saisir votre message qui sera envoyé à tous les utilisateurs sélectionnés. @@ -4134,6 +4166,10 @@ Le deuxième bouton supprimera l'ordinateur sélectionné. Si rien n'e User session control Contrôle de session utilisateur + + Do you really want to log off <b>ALL</b> users? + Souhaitez-vous vraiment déconnecter <b>TOUS</b> les utilisateurs? + VeyonCore @@ -4339,11 +4375,4 @@ Le deuxième bouton supprimera l'ordinateur sélectionné. Si rien n'e N'utilise pas l'extension X Damage - - main - - Veyon Master - Veyon Maître - - \ No newline at end of file diff --git a/translations/veyon_he.ts b/translations/veyon_he.ts index 7180284d7..7d4778cbe 100644 --- a/translations/veyon_he.ts +++ b/translations/veyon_he.ts @@ -313,6 +313,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,56 +1646,56 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites - + Name + שם - Predefined programs + Path + נתיב + + + Predefined websites - Name - שם + Remove selected website + - Path - נתיב + URL + - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - - Run program - הפעל תוכנית - Open website פתח אתר אינטרנט @@ -1697,27 +1705,31 @@ The public key is used on client computers to authenticate incoming connection r - Start programs and services in user desktop + Open website "%1" + + + + Custom website - Click this button to run a program on all computers. + Start application - Run program "%1" + Click this button to start an application on all computers. - Custom program + Start application "%1" - Open website "%1" + Custom application - Custom website + Start apps and open websites in user sessions @@ -1751,10 +1763,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1767,6 +1775,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3066,6 +3078,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3290,6 +3306,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3368,10 +3388,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3422,6 +3438,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3566,33 +3594,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - לדוגמה VLC - - ScreenLockFeaturePlugin @@ -3960,6 +3961,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + לדוגמה VLC + + SystemTrayIcon @@ -3996,8 +4028,8 @@ The second button will remove the selected computer. If nothing is selected the שלחו הודעת טקסט - Use the field below to type your message which will be sent to all selected users. - השתמש בשדה מטה על מנת להקליד את ההודעה שתישלח לכל המשתמשים + Please enter your message which send to all selected users. + @@ -4110,6 +4142,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4315,11 +4351,4 @@ The second button will remove the selected computer. If nothing is selected the אין להשתמש בהרחבה X Damage - - main - - Veyon Master - Veyon מאסטר - - \ No newline at end of file diff --git a/translations/veyon_hu.ts b/translations/veyon_hu.ts index 509570fa6..7a75f292b 100644 --- a/translations/veyon_hu.ts +++ b/translations/veyon_hu.ts @@ -315,6 +315,14 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso DesktopServicesConfigurationPage - - Programs & websites - Programok és weboldalak - - - Predefined programs - Előre definiált programok - Name Megnevezés @@ -1654,14 +1654,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Path Útvonal - - Add new program - Új program hozzáadása - - - Remove selected program - Kiválasztott program eltávolítása - Predefined websites Előre definiált weboldal @@ -1674,21 +1666,37 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso URL URL - - New program - Új program - New website Új weboldal + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Program futtatása - Open website Weboldal megnyitása @@ -1698,28 +1706,32 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Kattints erre a gombra, hogy az összes számítógépen megnyíljon egy weboldal. - Start programs and services in user desktop - Programok és szolgáltatások indítása a felhasználó asztalon + Open website "%1" + "%1" weboldal megnyitása - Click this button to run a program on all computers. - Kattints erre a gombra, hogy egy programot futtass az összes számítógépen. + Custom website + Egyéni weboldal - Run program "%1" - "%1" program futtatása + Start application + - Custom program - Egyéni program + Click this button to start an application on all computers. + - Open website "%1" - "%1" weboldal megnyitása + Start application "%1" + - Custom website - Egyéni weboldal + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Play tutorial video Bemutató videó lejátszása - - Custom program - Egyéni program - Handout Kiosztás @@ -1768,6 +1776,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso generic-student-user generic-student-user + + Custom application + + ExternalVncServer @@ -3086,6 +3098,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3310,6 +3326,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Name: Név: + + Website name + + PluginsCommands @@ -3388,10 +3408,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Do you really want to reboot the selected computers? Biztos, hogy újraindítod a kiválasztott számítógépeket? - - Do you really want to power down the selected computer? - Biztos, hogy kikapcsolod a kiválasztott számítógépeket? - Power on a computer via Wake-on-LAN (WOL) Egy számítógép bekapcsolása hálózati ébresztéssel (WOL) @@ -3442,6 +3458,18 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Please save your work and close all programs. A számítógép %1 perc %2 másodperc múlva automatikusan le fog állni. Kérjük, mentse el munkáját és zárja be az összes futó programot. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3586,33 +3614,6 @@ Please save your work and close all programs. Kilépés - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Kérem, add meg a kiválasztott számítógép(ek)en futtatandó programokat vagy parancsokat. Több programot/parancsot soronként adj meg. - - - Run programs - Programok futtatása - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - például "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Név: - - - Remember and add to program menu - Emlékezz és add a programmenühöz - - - e.g. VLC - pl. VLC - - ScreenLockFeaturePlugin @@ -3980,6 +3981,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + például "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + Név: + + + e.g. VLC + pl. VLC + + SystemTrayIcon @@ -4016,8 +4048,8 @@ The second button will remove the selected computer. If nothing is selected the Szöveges üzenet küldése - Use the field below to type your message which will be sent to all selected users. - Az alábbi mezőbe gépeld az összes kiválasztott felhasználóknak küldendő üzenetedet. + Please enter your message which send to all selected users. + @@ -4130,6 +4162,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Felhasználói munkamenet-vezérlés + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4335,11 +4371,4 @@ The second button will remove the selected computer. If nothing is selected the Ne használd az X Damage bővítményt - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_id.ts b/translations/veyon_id.ts index 0ac10d006..7d65b721d 100644 --- a/translations/veyon_id.ts +++ b/translations/veyon_id.ts @@ -315,6 +315,14 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -508,7 +516,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Creating new key pair for "%1" - Membuat pasangan kunci baru untuk "% 1" + Membuat pasangan kunci baru untuk "%1" Failed to create public or private key! @@ -1639,86 +1647,90 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone DesktopServicesConfigurationPage - Programs & websites - + Name + Nama - Predefined programs + Path - Name - Nama + Predefined websites + - Path + Remove selected website - Add new program + URL + URL + + + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL - URL + Remove selected application + - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - Run program + Open website - Open website + Click this button to open a website on all computers. - Click this button to open a website on all computers. + Open website "%1" - Start programs and services in user desktop + Custom website - Click this button to run a program on all computers. + Start application - Run program "%1" + Click this button to start an application on all computers. - Custom program + Start application "%1" - Open website "%1" + Custom application - Custom website + Start apps and open websites in user sessions @@ -1752,10 +1764,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Play tutorial video - - Custom program - - Handout @@ -1768,6 +1776,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone generic-student-user + + Custom application + + ExternalVncServer @@ -3067,6 +3079,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3291,6 +3307,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Name: + + Website name + + PluginsCommands @@ -3369,10 +3389,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3423,6 +3439,18 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3567,33 +3595,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - Jalankan program - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3961,6 +3962,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3997,7 +4029,7 @@ The second button will remove the selected computer. If nothing is selected the Kirim pesan teks - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4111,6 +4143,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4316,11 +4352,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_it.ts b/translations/veyon_it.ts index 8ed4ca013..4f8b02350 100644 --- a/translations/veyon_it.ts +++ b/translations/veyon_it.ts @@ -315,6 +315,14 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche Computer being accessed Computer a cui si accede + + Session being accessed is a user session + La sessione a cui si accede è una sessione utente + + + Session being accessed is a login screen + La sessione a cui si accede è una schermata di accesso + AccessControlRulesTestDialog @@ -1635,14 +1643,6 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - - Programs & websites - Programmi e siti Web - - - Predefined programs - Programmi predefiniti - Name Nome @@ -1651,14 +1651,6 @@ The public key is used on client computers to authenticate incoming connection r Path Percorso - - Add new program - Aggiungi un nuovo programma - - - Remove selected program - Rimuovi il programma selezionato - Predefined websites Siti Web predefiniti @@ -1671,21 +1663,37 @@ The public key is used on client computers to authenticate incoming connection r URL URL - - New program - Nuovo programma - New website Nuovo sito web + + Applications & websites + Applicazioni e siti web + + + Predefined applications + Applicazioni predefinite + + + Add new application + Aggiungi nuova applicazione + + + Remove selected application + Rimuovi l'applicazione selezionata + + + Add new website + Aggiungi nuovo sito web + + + New application + Nuova applicazione + DesktopServicesFeaturePlugin - - Run program - Apri un programma - Open website Apri sito web @@ -1695,28 +1703,32 @@ The public key is used on client computers to authenticate incoming connection r Clicca su questo pulsante per aprire un sito internet su tutti i PC. - Start programs and services in user desktop - Attiva il programma sul PC remoto + Open website "%1" + Apri il sito web "%1" - Click this button to run a program on all computers. - Clicca su questo pulsante per lanciare un programma su tutti i PC + Custom website + Sito web personalizzato - Run program "%1" - Esegui il programma "%1" + Start application + Avvia applicazione - Custom program - Programma personalizzato + Click this button to start an application on all computers. + Fare clic su questo pulsante per avviare un'applicazione su tutti i computer. - Open website "%1" - Apri il sito web "%1" + Start application "%1" + Avvia l'applicazione "%1" - Custom website - Sito web personalizzato + Custom application + Applicazione personalizzata + + + Start apps and open websites in user sessions + Avvia app e apri siti web nelle sessioni utente @@ -1749,10 +1761,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video Riproduci video tutorial - - Custom program - Programma personalizzato - Handout Volantino @@ -1765,6 +1773,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user utente-generico-studente + + Custom application + Applicazione personalizzata + ExternalVncServer @@ -3073,6 +3085,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3297,6 +3313,10 @@ The public key is used on client computers to authenticate incoming connection r Name: Nome + + Website name + Nome del sito web + PluginsCommands @@ -3375,10 +3395,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? Vuoi veramente riavviare i computer selezionati? - - Do you really want to power down the selected computer? - Vuoi veramente spegnere il computer selezionato? - Power on a computer via Wake-on-LAN (WOL) Accendi un computer tramite Wake-on-LAN (WOL) @@ -3431,6 +3447,18 @@ Please save your work and close all programs. Si prega di salvare il lavoro e chiudere tutti i programmi. + + Do you really want to reboot <b>ALL</b> computers? + Vuoi davvero riavviare<b>TUTTI</b> i computer? + + + Do you really want to power down <b>ALL</b> computers? + Vuoi davvero spegnere <b>TUTTI</b> i computer? + + + Do you really want to power down the selected computers? + Vuoi davvero spegnere i computer selezionati? + PowerDownTimeInputDialog @@ -3575,33 +3603,6 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Uscita - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Inserisci i programmi o i comandi da eseguire nei computer selezionati. Puoi separare programmi/comandi multipli andando a capo. - - - Run programs - Esegui programmi - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - es. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Nome - - - Remember and add to program menu - Ricorda e aggiungi al menu del programma - - - e.g. VLC - per esempio, VLC - - ScreenLockFeaturePlugin @@ -3970,6 +3971,37 @@ The second button will remove the selected computer. If nothing is selected the Il secondo pulsante rimuoverà il computer selezionato. Se non viene selezionato nulla, l'ultimo verrà rimosso. + + StartAppDialog + + Start application + Avvia applicazione + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + Immettere le applicazioni da avviare sui computer selezionati. È possibile separare più applicazioni per riga. + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + es. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + Ricorda e aggiungi al menu dell'applicazione + + + Application name + Nome dell'applicazione + + + Name: + Nome + + + e.g. VLC + per esempio, VLC + + SystemTrayIcon @@ -4006,8 +4038,8 @@ Il secondo pulsante rimuoverà il computer selezionato. Se non viene selezionato Invia un messaggio di testo - Use the field below to type your message which will be sent to all selected users. - Utilizza il campo qui sotto per scrivere il messaggio che vuoi inviare agli utenti selezionati. + Please enter your message which send to all selected users. + Inserisci il messaggio che verrà inviato a tutti gli utenti selezionati. @@ -4120,6 +4152,10 @@ Il secondo pulsante rimuoverà il computer selezionato. Se non viene selezionato User session control Controllo sessione utente + + Do you really want to log off <b>ALL</b> users? + Vuoi davvero disconnettere <b>TUTTI</b> gli utenti? + VeyonCore @@ -4325,11 +4361,4 @@ Il secondo pulsante rimuoverà il computer selezionato. Se non viene selezionato Non usare l'estensione X Damage - - main - - Veyon Master - Veyon Master - - \ No newline at end of file diff --git a/translations/veyon_ja.ts b/translations/veyon_ja.ts index c2ca562a0..3864f12f9 100644 --- a/translations/veyon_ja.ts +++ b/translations/veyon_ja.ts @@ -316,6 +316,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1640,56 +1648,56 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites - + Name + 名前 - Predefined programs + Path - Name - 名前 + Predefined websites + - Path + Remove selected website - Add new program + URL + URL + + + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL - URL + Remove selected application + - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - - Run program - プログラムを起動 - Open website @@ -1699,27 +1707,31 @@ The public key is used on client computers to authenticate incoming connection r - Start programs and services in user desktop + Open website "%1" - Click this button to run a program on all computers. - 全てのコンピューターでプログラムを起動します。 + Custom website + - Run program "%1" - "%1"プログラムを起動します + Start application + - Custom program - カスタムプログラム + Click this button to start an application on all computers. + - Open website "%1" + Start application "%1" - Custom website + Custom application + + + + Start apps and open websites in user sessions @@ -1753,10 +1765,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - カスタムプログラム - Handout @@ -1769,6 +1777,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3068,6 +3080,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3292,6 +3308,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3370,10 +3390,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3425,6 +3441,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3569,33 +3597,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3963,6 +3964,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3999,7 +4031,7 @@ The second button will remove the selected computer. If nothing is selected the - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4113,6 +4145,10 @@ The second button will remove the selected computer. If nothing is selected the User session control ユーザーセッション制御 + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4318,11 +4354,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_ko.ts b/translations/veyon_ko.ts index ad31e504f..0032fbef1 100644 --- a/translations/veyon_ko.ts +++ b/translations/veyon_ko.ts @@ -315,6 +315,14 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - - Programs & websites - 프로그램과 웹사이트들 - - - Predefined programs - 미리 지정된 프로그램들 - Name 이름 @@ -1654,14 +1654,6 @@ The public key is used on client computers to authenticate incoming connection r Path 경로 - - Add new program - 새 프로그램 추가 - - - Remove selected program - 선택한 프로그램 삭제 - Predefined websites 미리 지정된 웹사이트들 @@ -1674,21 +1666,37 @@ The public key is used on client computers to authenticate incoming connection r URL URL - - New program - 새 프로그램 - New website 새 웹사이트 + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - 프로그램 실행 - Open website 웹사이트 열기 @@ -1698,28 +1706,32 @@ The public key is used on client computers to authenticate incoming connection r 클릭하면 모든 컴퓨터에서 같은 웹사이트를 오픈합니다. - Start programs and services in user desktop - 사용자 데스크탑에서 프로그램과 서비스를 시작 + Open website "%1" + 웹사이트 "%1" 열기 - Click this button to run a program on all computers. - 클릭하면 모든 컴퓨터에서 프로그램을 실행합니다. + Custom website + 사용자 지정 웹사이트 - Run program "%1" - 프로그램 "%1" 실행 + Start application + - Custom program - 사용자 프로그램 + Click this button to start an application on all computers. + - Open website "%1" - 웹사이트 "%1" 열기 + Start application "%1" + - Custom website - 사용자 지정 웹사이트 + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video 튜토리얼 동영상 재생 - - Custom program - 사용자 프로그램 - Handout 자료 배포 핸드아웃 @@ -1768,6 +1776,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user 일반-학생-사용자 + + Custom application + + ExternalVncServer @@ -3084,6 +3096,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3308,6 +3324,10 @@ The public key is used on client computers to authenticate incoming connection r Name: 이름: + + Website name + + PluginsCommands @@ -3386,10 +3406,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? 선택된 컴퓨터를 리부팅하시겠습니까 ? - - Do you really want to power down the selected computer? - 선택된 컴퓨터 파워를 끄시겠습니까 ? - Power on a computer via Wake-on-LAN (WOL) Wake-on-LAN(WOL)을 사용하여 컴퓨터 파워를 켬 @@ -3442,6 +3458,18 @@ Please save your work and close all programs. 작업을 저장하고 모든 프로그램을 닫기 바랍니다. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3586,33 +3614,6 @@ Please save your work and close all programs. 나가기 - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - 선택된 컴퓨터(들)에서 실행할 명령어 또는 프로그램을 입력하세요. 각각의 라인으로 다수의 프로그램/명령어를 구분할 수 있습니다. - - - Run programs - 프로그램 실행 - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - 예. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - 이름: - - - Remember and add to program menu - 기억하고 프로그램 메뉴에 추가하기 - - - e.g. VLC - 예: VLC - - ScreenLockFeaturePlugin @@ -3981,6 +3982,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + 예. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + 이름: + + + e.g. VLC + 예: VLC + + SystemTrayIcon @@ -4017,8 +4049,8 @@ The second button will remove the selected computer. If nothing is selected the 문자 메세지 보내기 - Use the field below to type your message which will be sent to all selected users. - 선택된 사용자에세 메세지를 보내려면 아래 빈칸에 내용을 입력하세요 + Please enter your message which send to all selected users. + @@ -4131,6 +4163,10 @@ The second button will remove the selected computer. If nothing is selected the User session control 사용자 세션제어 + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4336,11 +4372,4 @@ The second button will remove the selected computer. If nothing is selected the X 손상 확장 사용하지 않음 - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_lt.ts b/translations/veyon_lt.ts index 6ef47254f..af1736bc4 100644 --- a/translations/veyon_lt.ts +++ b/translations/veyon_lt.ts @@ -314,6 +314,14 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1637,14 +1645,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u DesktopServicesConfigurationPage - - Programs & websites - Programos ir tinklalapiai - - - Predefined programs - Numatytosios programos - Name Vardas @@ -1653,14 +1653,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Path Kelias - - Add new program - Pridėti naują programą - - - Remove selected program - Pašalinti pasirinktą programą - Predefined websites Numatytieji puslapiai @@ -1673,21 +1665,37 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u URL URL - - New program - Nauja programa - New website Naujas puslapis + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Paleisti programą - Open website Atidaryti tinklalapį @@ -1697,28 +1705,32 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Paspauskite šį mygtuką, kad atidarytumėte puslapį visuose kompiuteriuose. - Start programs and services in user desktop - Paleisti programas ar servisus vartotojo kompiuteryje. + Open website "%1" + Atidaryti puslapį "%1" - Click this button to run a program on all computers. - Paspauskite šį mygtuką, kad atidarytumėte programą visuose kompiuteriuose. + Custom website + Pasirinktinis puslapis - Run program "%1" - Paleisti programą "%1" + Start application + - Custom program - Pasirinktinė programa + Click this button to start an application on all computers. + - Open website "%1" - Atidaryti puslapį "%1" + Start application "%1" + - Custom website - Pasirinktinis puslapis + Custom application + + + + Start apps and open websites in user sessions + @@ -1751,10 +1763,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Play tutorial video Paleisti mokomajį vaizdo įrašą - - Custom program - Pasirinktinė programa - Handout Padalomoji medžiaga @@ -1767,6 +1775,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u generic-student-user bendrinis-besimokantysis-vartotojas + + Custom application + + ExternalVncServer @@ -3067,6 +3079,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3291,6 +3307,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Name: Vardas: + + Website name + + PluginsCommands @@ -3369,10 +3389,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Do you really want to reboot the selected computers? Ar tikrai norite paleisti iš naujo pasirinktus kompiuterius? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3423,6 +3439,18 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3567,33 +3595,6 @@ Please save your work and close all programs. Išeiti - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - Paleisti programas - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - pvz.: "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Vardas: - - - Remember and add to program menu - - - - e.g. VLC - pvz.: VLC - - ScreenLockFeaturePlugin @@ -3961,6 +3962,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + pvz.: "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + Vardas: + + + e.g. VLC + pvz.: VLC + + SystemTrayIcon @@ -3997,8 +4029,8 @@ The second button will remove the selected computer. If nothing is selected the Nusiųsti tekstine žinutę - Use the field below to type your message which will be sent to all selected users. - Apačioje esančiame lange įveskite žinutę kuri bus išsiųsta visiems pasirinktiems vartotojams + Please enter your message which send to all selected users. + @@ -4111,6 +4143,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Vartotojo sesijos valdymas + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4316,11 +4352,4 @@ The second button will remove the selected computer. If nothing is selected the Nenaudokite X Damage papildinio. - - main - - Veyon Master - Veyon Master - - \ No newline at end of file diff --git a/translations/veyon_lv.ts b/translations/veyon_lv.ts index 9df85077b..2c88d2767 100644 --- a/translations/veyon_lv.ts +++ b/translations/veyon_lv.ts @@ -315,6 +315,14 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1636,56 +1644,56 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites - + Name + Vārds + + + Path + Ceļš - Predefined programs + Predefined websites - Name - Vārds + Remove selected website + - Path - Ceļš + URL + URL - Add new program - Pievienot jaunu programmu + New website + - Remove selected program - Noņemt izvēlēto programmu + Applications & websites + - Predefined websites + Predefined applications - Remove selected website + Add new application - URL - URL + Remove selected application + - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - - Run program - - Open website Atvērt vietni @@ -1695,27 +1703,31 @@ The public key is used on client computers to authenticate incoming connection r - Start programs and services in user desktop + Open website "%1" - Click this button to run a program on all computers. + Custom website - Run program "%1" - Palaist programmu "%1" + Start application + - Custom program + Click this button to start an application on all computers. - Open website "%1" + Start application "%1" - Custom website + Custom application + + + + Start apps and open websites in user sessions @@ -1749,10 +1761,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1765,6 +1773,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3064,6 +3076,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3288,6 +3304,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3366,10 +3386,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? Vai Tu tiešām vēlies restartēt izvēlētos datorus? - - Do you really want to power down the selected computer? - Vai Tu tiešām vēlies izslēgt izvēlētos datorus? - Power on a computer via Wake-on-LAN (WOL) @@ -3420,6 +3436,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3564,33 +3592,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - Palaist programmas - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3958,6 +3959,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3994,7 +4026,7 @@ The second button will remove the selected computer. If nothing is selected the Nosūtīt teksta ziņojumu - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4108,6 +4140,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4313,11 +4349,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_mn.ts b/translations/veyon_mn.ts index cde7de7a0..a56240f0a 100644 --- a/translations/veyon_mn.ts +++ b/translations/veyon_mn.ts @@ -313,6 +313,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1634,86 +1642,90 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites + Name + Нэр + + + Path - Predefined programs + Predefined websites - Name - Нэр + Remove selected website + - Path + URL - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - Run program + Open website - Open website + Click this button to open a website on all computers. - Click this button to open a website on all computers. + Open website "%1" - Start programs and services in user desktop + Custom website - Click this button to run a program on all computers. + Start application - Run program "%1" + Click this button to start an application on all computers. - Custom program + Start application "%1" - Open website "%1" + Custom application - Custom website + Start apps and open websites in user sessions @@ -1747,10 +1759,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1763,6 +1771,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3062,6 +3074,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3286,6 +3302,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3364,10 +3384,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3418,6 +3434,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3562,33 +3590,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3956,6 +3957,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3992,8 +4024,8 @@ The second button will remove the selected computer. If nothing is selected the Текст мессеж явуулах - Use the field below to type your message which will be sent to all selected users. - Доорх талбарт бүх сонгогдсон хэрэглэгчдэд илгээх мессежээ бичнэ. + Please enter your message which send to all selected users. + @@ -4106,6 +4138,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4311,11 +4347,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_nl.ts b/translations/veyon_nl.ts index 1eebb3bcf..80bbd8b58 100644 --- a/translations/veyon_nl.ts +++ b/translations/veyon_nl.ts @@ -315,6 +315,14 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1303,7 +1311,7 @@ The public key is used on client computers to authenticate incoming connection r No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - Er is geen standaard plugin voor netwerkobjecten gevonden. Controleer uw installatie of configureer een andere netwerk object directory backend via% 1 Configurator. + Er is geen standaard plugin voor netwerkobjecten gevonden. Controleer uw installatie of configureer een andere netwerk object directory backend via%1 Configurator. Location detection failed @@ -1373,7 +1381,7 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. - Kon de computer en gebruikerslijst niet schrijven naar% 1! Controleer de toegangsrechten voor het bestand. + Kon de computer en gebruikerslijst niet schrijven naar %1! Controleer de toegangsrechten voor het bestand. @@ -1635,14 +1643,6 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - - Programs & websites - Programma's & websites - - - Predefined programs - - Name Naam @@ -1651,14 +1651,6 @@ The public key is used on client computers to authenticate incoming connection r Path Pad - - Add new program - Nieuw programma toevoegen - - - Remove selected program - Geselecteerd programma verwijderen - Predefined websites @@ -1671,21 +1663,37 @@ The public key is used on client computers to authenticate incoming connection r URL URL - - New program - Nieuw programma - New website Nieuwe website + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Voer programma uit - Open website Open website @@ -1695,28 +1703,32 @@ The public key is used on client computers to authenticate incoming connection r Klik op deze knop om een website op alle computers te openen. - Start programs and services in user desktop - Start programma's en services in de gebruikersdesktop + Open website "%1" + Open website "%1" - Click this button to run a program on all computers. - Klik op deze knop om een programma op alle computers uit te voeren. + Custom website + Aangepaste website - Run program "%1" - Programma "%1" uitvoeren + Start application + - Custom program - Aangepast programma + Click this button to start an application on all computers. + - Open website "%1" - Open website "%1" + Start application "%1" + - Custom website - Aangepaste website + Custom application + + + + Start apps and open websites in user sessions + @@ -1749,10 +1761,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - Aangepast programma - Handout @@ -1765,6 +1773,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3071,6 +3083,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3295,6 +3311,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3373,10 +3393,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? Wilt u werkelijk de geselecteerde computers heropstarten? - - Do you really want to power down the selected computer? - Wilt u werkelijk de geselecteerde computers uitschakelen? - Power on a computer via Wake-on-LAN (WOL) @@ -3427,6 +3443,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3571,33 +3599,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Voer alsjeblieft de programma's of commando's in om op de geselecteerde computer(s) te draaien. U kunt meerdere programma's / opdrachten per lijn scheiden. - - - Run programs - Voer programma's uit - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - bv. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3965,6 +3966,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + bv. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -4001,8 +4033,8 @@ The second button will remove the selected computer. If nothing is selected the Stuur tekstbericht - Use the field below to type your message which will be sent to all selected users. - Gebruik de onderstaande veld om uw bericht dat voor alle geselecteerde gebruikers wordt verzonden te typen. + Please enter your message which send to all selected users. + @@ -4115,6 +4147,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Gebruikers sessie controle + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4320,11 +4356,4 @@ The second button will remove the selected computer. If nothing is selected the Gebruik geen X Damage extensie - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_no_NO.ts b/translations/veyon_no_NO.ts index 5605dbbc4..e8f7af265 100644 --- a/translations/veyon_no_NO.ts +++ b/translations/veyon_no_NO.ts @@ -313,6 +313,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1634,56 +1642,56 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites + Name + Navn + + + Path - Predefined programs + Predefined websites - Name - Navn + Remove selected website + - Path + URL - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - - Run program - - Open website @@ -1693,27 +1701,31 @@ The public key is used on client computers to authenticate incoming connection r Klikk denne knappen for å åpne nettsiden på alle datamaskinene. - Start programs and services in user desktop + Open website "%1" - Click this button to run a program on all computers. + Custom website - Run program "%1" + Start application - Custom program + Click this button to start an application on all computers. - Open website "%1" + Start application "%1" - Custom website + Custom application + + + + Start apps and open websites in user sessions @@ -1747,10 +1759,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1763,6 +1771,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3062,6 +3074,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3286,6 +3302,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3364,10 +3384,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3418,6 +3434,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3562,33 +3590,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3956,6 +3957,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3992,7 +4024,7 @@ The second button will remove the selected computer. If nothing is selected the - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4106,6 +4138,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4311,11 +4347,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_pl.ts b/translations/veyon_pl.ts index 0861bde78..ffb70a1f4 100644 --- a/translations/veyon_pl.ts +++ b/translations/veyon_pl.ts @@ -315,6 +315,14 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc DesktopServicesConfigurationPage - - Programs & websites - Programy i strony internetowe - - - Predefined programs - Predefiniowane programy - Name Nazwa @@ -1654,14 +1654,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Path Ścieżka - - Add new program - Dodaj nowy program - - - Remove selected program - Usuń wybrane programy - Predefined websites Predefiniowane strony @@ -1674,21 +1666,37 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc URL Adres - - New program - Nowy program - New website Nowa strona + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Uruchom program - Open website Otwórz stronę WWW @@ -1698,28 +1706,32 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Przyciśnij ten przycisk żeby otworzyć stronę WWW na wszystkich komputerach - Start programs and services in user desktop - Uruchom programy i usługi na pulpicie użytkownika + Open website "%1" + Otwórz stronę "%1" - Click this button to run a program on all computers. - Przyciśnij ten przycisk żeby uruchomić program na wszystkich komputerach + Custom website + Inna strona - Run program "%1" - Uruchom program "%1" + Start application + - Custom program - Inny program + Click this button to start an application on all computers. + - Open website "%1" - Otwórz stronę "%1" + Start application "%1" + - Custom website - Inna strona + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Play tutorial video Odtwórz film instruktażowy - - Custom program - Inny program - Handout Materiały informacyjne @@ -1768,6 +1776,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc generic-student-user generic-student-user + + Custom application + + ExternalVncServer @@ -3081,6 +3093,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3305,6 +3321,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Name: Nazwa: + + Website name + + PluginsCommands @@ -3383,10 +3403,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Do you really want to reboot the selected computers? Czy na pewno chcesz uruchomić ponownie wybrane komputery? - - Do you really want to power down the selected computer? - Czy na pewno chcesz wyłączyć wybrany komputer? - Power on a computer via Wake-on-LAN (WOL) Włącz komputer przez Wake-on-LAN (WOL) @@ -3439,6 +3455,18 @@ Please save your work and close all programs. Zapisz swoją pracę i zamknij wszystkie programy. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3583,33 +3611,6 @@ Zapisz swoją pracę i zamknij wszystkie programy. Wyjście - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Wprowadź nazwę programów lub komendy do uruchomienia na zdalnym komputerze(komputerach). Możesz oddzielić je, zapisując w osobnych wierszach. - - - Run programs - Uruchom programy - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - np. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Nazwa: - - - Remember and add to program menu - Zapamiętaj i dodaj do menu programów - - - e.g. VLC - np.: VLC - - ScreenLockFeaturePlugin @@ -3978,6 +3979,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + np. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + Nazwa: + + + e.g. VLC + np.: VLC + + SystemTrayIcon @@ -4014,8 +4046,8 @@ The second button will remove the selected computer. If nothing is selected the Wyślij wiadomość tekstową - Use the field below to type your message which will be sent to all selected users. - W polu poniżej napisz wiadomość, która ma zostać wysłana do wybranych użytkowników. + Please enter your message which send to all selected users. + @@ -4128,6 +4160,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Kontrola sesji użytkownika + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4333,11 +4369,4 @@ The second button will remove the selected computer. If nothing is selected the Nie używaj rozszerzenia X Damage - - main - - Veyon Master - Veyon Master - - \ No newline at end of file diff --git a/translations/veyon_pt_BR.ts b/translations/veyon_pt_BR.ts index 5d94b8d74..4556de942 100644 --- a/translations/veyon_pt_BR.ts +++ b/translations/veyon_pt_BR.ts @@ -315,6 +315,14 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -516,7 +524,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Newly created key pair has been saved to "%1" and "%2". - O par de chaves recém-criado foi salvo em "% 1" e "% 2". + O par de chaves recém-criado foi salvo em "%1" e "%2". Could not remove key file "%1"! @@ -1638,14 +1646,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç DesktopServicesConfigurationPage - - Programs & websites - Programas e sites - - - Predefined programs - Programas predefinidos - Name Nome @@ -1654,14 +1654,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Path Caminho - - Add new program - Adicionar novo programa - - - Remove selected program - Remover programa selecionado - Predefined websites Sites predefinidos @@ -1674,21 +1666,37 @@ A chave pública é usada no computadores clientes para autenticar as requisiç URL URL - - New program - Novo programa - New website Novo website + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Executar programa - Open website Abrir website @@ -1698,28 +1706,32 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Clique neste botão para abrir um website em todos os computadores. - Start programs and services in user desktop - Iniciar programas e serviços no desktop do usuário + Open website "%1" + Abrir site "%1" - Click this button to run a program on all computers. - Clique neste botão para executar um programa em todos os computadores. + Custom website + Website personalizado - Run program "%1" - Executar programa "%1" + Start application + - Custom program - Programa personalizado + Click this button to start an application on all computers. + - Open website "%1" - Abrir site "%1" + Start application "%1" + - Custom website - Website personalizado + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Play tutorial video Iniciar vídeo tutorial - - Custom program - Programa personalizado - Handout @@ -1768,6 +1776,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç generic-student-user + + Custom application + + ExternalVncServer @@ -3072,6 +3084,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3296,6 +3312,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Name: Nome: + + Website name + + PluginsCommands @@ -3374,10 +3394,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Do you really want to reboot the selected computers? Tem certeza que quer reiniciar todos os computadores selecionados? - - Do you really want to power down the selected computer? - Tem certeza que quer desligar os computadores selecionados? - Power on a computer via Wake-on-LAN (WOL) @@ -3428,6 +3444,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3572,33 +3600,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Por favor digite os programas ou comandos para executar no(s) computador(s) selecionado(s). Você pode separar múltiplos programas/comandos por linha. - - - Run programs - Executar programas - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - e.g. "C:\Arquivos de Programas\VideoLAN\VLC\vlc.exe" - - - Name: - Nome: - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3966,6 +3967,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + e.g. "C:\Arquivos de Programas\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + Nome: + + + e.g. VLC + + + SystemTrayIcon @@ -4002,8 +4034,8 @@ The second button will remove the selected computer. If nothing is selected the Enviar mensagem de texto - Use the field below to type your message which will be sent to all selected users. - Use o campo abaixo para digitar sua mensagem que será enviada para todos os usuários selecionados. + Please enter your message which send to all selected users. + @@ -4116,6 +4148,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Controle de sessão do usuário. + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4321,11 +4357,4 @@ The second button will remove the selected computer. If nothing is selected the Não use extensão X Damage - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_pt_PT.ts b/translations/veyon_pt_PT.ts index 2493798c6..304192d54 100644 --- a/translations/veyon_pt_PT.ts +++ b/translations/veyon_pt_PT.ts @@ -315,6 +315,14 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1636,86 +1644,90 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites + Name - Predefined programs + Path - Name + Predefined websites - Path + Remove selected website + + + + URL - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - Run program + Open website - Open website + Click this button to open a website on all computers. - Click this button to open a website on all computers. + Open website "%1" - Start programs and services in user desktop + Custom website - Click this button to run a program on all computers. + Start application - Run program "%1" + Click this button to start an application on all computers. - Custom program + Start application "%1" - Open website "%1" + Custom application - Custom website + Start apps and open websites in user sessions @@ -1749,10 +1761,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1765,6 +1773,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3064,6 +3076,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3288,6 +3304,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3366,10 +3386,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3420,6 +3436,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3564,33 +3592,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3958,6 +3959,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3994,7 +4026,7 @@ The second button will remove the selected computer. If nothing is selected the Enviar mensagem de texto - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4108,6 +4140,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4313,11 +4349,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_ru.ts b/translations/veyon_ru.ts index 1e5064a5c..2f7f81d6e 100644 --- a/translations/veyon_ru.ts +++ b/translations/veyon_ru.ts @@ -315,6 +315,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - - Programs & websites - Программы и сайты - - - Predefined programs - Предварительно определённые программы - Name Имя @@ -1654,14 +1654,6 @@ The public key is used on client computers to authenticate incoming connection r Path Путь - - Add new program - Добавить новую программу - - - Remove selected program - Удалить выделенную программу - Predefined websites Предварительно определённые сайты @@ -1674,21 +1666,37 @@ The public key is used on client computers to authenticate incoming connection r URL Адрес - - New program - Новая программа - New website Новый сайт + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Запустить программу - Open website Открыть веб-сайт @@ -1698,28 +1706,32 @@ The public key is used on client computers to authenticate incoming connection r Нажмите эту кнопку для открытия веб-сайта на всех компьютерах. - Start programs and services in user desktop - Запуск программ и сервисов на рабочем столе пользователя + Open website "%1" + Открыть сайт "%1" - Click this button to run a program on all computers. - Нажмите эту кнопку для запуска программы на всех компьютерах. + Custom website + Необычный сайт - Run program "%1" - Выполнить программу "%1" + Start application + - Custom program - Необычная программа + Click this button to start an application on all computers. + - Open website "%1" - Открыть сайт "%1" + Start application "%1" + - Custom website - Необычный сайт + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video Воспроизвести обучающее видео - - Custom program - Необычная программа - Handout Бесплатный образец @@ -1768,6 +1776,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user типичный-ученик-пользователь + + Custom application + + ExternalVncServer @@ -3086,6 +3098,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight Акцент + + Veyon Master + + MasterConfigurationPage @@ -3310,6 +3326,10 @@ The public key is used on client computers to authenticate incoming connection r Name: Имя: + + Website name + + PluginsCommands @@ -3388,10 +3408,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? Вы действительно хотите перезагрузить выбранные компьютеры? - - Do you really want to power down the selected computer? - Вы действительно хотите выключить выбранный компьютер? - Power on a computer via Wake-on-LAN (WOL) Включить компьютер через пробуждение по сигналу из локальной сети Wake-on-LAN (WOL) @@ -3444,6 +3460,18 @@ Please save your work and close all programs. Пожалуйста, сохраните результаты вашей работы и завершите работу всех программ. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3588,33 +3616,6 @@ Please save your work and close all programs. Выход - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Пожалуйста, введите программы или команды для их выполнения на выбранных компьютерах. Вы можете записать несколько программ/команд, по одной в строке. - - - Run programs - Запустить программы - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - например, "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Имя: - - - Remember and add to program menu - Запомнить и добавить в меню программ - - - e.g. VLC - например VLC - - ScreenLockFeaturePlugin @@ -3984,6 +3985,37 @@ The second button will remove the selected computer. If nothing is selected the Вторая кнопка удалит выбранный компьютер. Если ничего не выбрано, будет удален последний компьютер. + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + например, "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + Имя: + + + e.g. VLC + например VLC + + SystemTrayIcon @@ -4020,8 +4052,8 @@ The second button will remove the selected computer. If nothing is selected the Послать текстовое сообщение - Use the field below to type your message which will be sent to all selected users. - Используйте это поле снизу для набора сообщения, которое хотите послать всем выбранным пользователям. + Please enter your message which send to all selected users. + @@ -4134,6 +4166,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Управление сеансами пользователей + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4339,11 +4375,4 @@ The second button will remove the selected computer. If nothing is selected the Не использовать расширение X Damage - - main - - Veyon Master - Veyon Мастер - - \ No newline at end of file diff --git a/translations/veyon_sl.ts b/translations/veyon_sl.ts index 50951bcdd..d5c96e775 100644 --- a/translations/veyon_sl.ts +++ b/translations/veyon_sl.ts @@ -315,6 +315,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti DesktopServicesConfigurationPage - - Programs & websites - Programi in spletne strani - - - Predefined programs - Vnaprej določeni programi - Name Ime @@ -1654,14 +1654,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Path Pot - - Add new program - Dodaj nov program - - - Remove selected program - Odstrani izbrani program - Predefined websites Vnaprej določene spletne strani @@ -1674,21 +1666,37 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti URL URL - - New program - Nov program - New website Nova spletna stran + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Zaženi program - Open website Odpri spletno stran @@ -1698,28 +1706,32 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Kliknite ta gumb, da odprete spletno mesto na vseh računalnikih. - Start programs and services in user desktop - Zaženite programe in storitve na uporabniškem namizju + Open website "%1" + Odpri spletno stran "%1" - Click this button to run a program on all computers. - Kliknite ta gumb za zagon programa na vseh računalnikih. + Custom website + Spletna stran po meri - Run program "%1" - Zaženi program "%1" + Start application + - Custom program - Program po meri + Click this button to start an application on all computers. + - Open website "%1" - Odpri spletno stran "%1" + Start application "%1" + - Custom website - Spletna stran po meri + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Play tutorial video - - Custom program - Program po meri - Handout @@ -1768,6 +1776,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti generic-student-user + + Custom application + + ExternalVncServer @@ -3086,6 +3098,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3310,6 +3326,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Name: + + Website name + + PluginsCommands @@ -3388,10 +3408,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Do you really want to reboot the selected computers? Ali res želite ponovno zagnati izbrane računalnike? - - Do you really want to power down the selected computer? - Ste prepričani, da želite izklopiti izbrani računalnik? - Power on a computer via Wake-on-LAN (WOL) Zagon računalnika preko Wake-on-LAN (WOL) @@ -3442,6 +3458,18 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3586,33 +3614,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Prosimo, vnesite programe ali ukaze, ki se izvajajo v izbranih računalnikih. Več programov / ukazov lahko ločite po vrstici. - - - Run programs - Zaženi programe - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - npr. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3981,6 +3982,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + npr. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -4017,8 +4049,8 @@ The second button will remove the selected computer. If nothing is selected the Pošlji sporočilo - Use the field below to type your message which will be sent to all selected users. - Uporabite spodnje polje za vpis sporočila, ki ga želite poslati izbranim uporabnikom. + Please enter your message which send to all selected users. + @@ -4131,6 +4163,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Nadzor seje uporabnika + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4336,11 +4372,4 @@ The second button will remove the selected computer. If nothing is selected the Ne uporabljajte X škodljive razširitve - - main - - Veyon Master - Veyon Master - - \ No newline at end of file diff --git a/translations/veyon_sr.ts b/translations/veyon_sr.ts index 9c0cd88a4..57c6005e9 100644 --- a/translations/veyon_sr.ts +++ b/translations/veyon_sr.ts @@ -315,6 +315,14 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -461,7 +469,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Do you really want to delete authentication key "%1/%2"? - Želite li stvarno izbrisati autentifikacijski ključ "% 1 /% 2"? + Želite li stvarno izbrisati autentifikacijski ključ "%1/%2"? Please select a key to delete! @@ -477,7 +485,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Please select a user group which to grant access to key "%1": - Odaberite grupu korisnika koja će odobriti pristup ključu "% 1": + Odaberite grupu korisnika koja će odobriti pristup ključu "%1": Please select a key which to set the access group for! @@ -496,7 +504,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Invalid key type specified! Please specify "%1" or "%2". - Navedena je nevažeća vrsta ključa! Navedite "% 1" ili "% 2". + Navedena je nevažeća vrsta ključa! Navedite "%1" ili "%2". Specified key does not exist! Please use the "list" command to list all installed keys. @@ -508,7 +516,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Creating new key pair for "%1" - Izrada novog para ključeva za "% 1" + Izrada novog para ključeva za "%1" Failed to create public or private key! @@ -516,15 +524,15 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Newly created key pair has been saved to "%1" and "%2". - Novostvoreni par ključeva sačuvan je u „% 1“ i „% 2“. + Novostvoreni par ključeva sačuvan je u „%1“ i „%2“. Could not remove key file "%1"! - Nije moguće ukloniti datoteku s ključevima "% 1"! + Nije moguće ukloniti datoteku s ključevima "%1"! Could not remove key file directory "%1"! - Nije moguće ukloniti direktorijum ključnih datoteka "% 1"! + Nije moguće ukloniti direktorijum ključnih datoteka "%1"! Failed to create directory for output file. @@ -532,7 +540,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z File "%1" already exists. - Datoteka "% 1" već postoji. + Datoteka "%1" već postoji. Failed to write output file. @@ -540,7 +548,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Key "%1/%2" has been exported to "%3" successfully. - Ključ "% 1 /% 2" je uspešno izvezen u "% 3". + Ključ "%1/%2" je uspešno izvezen u "%3". Failed read input file. @@ -548,11 +556,11 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z File "%1" does not contain a valid private key! - Datoteka "% 1" ne sadrži validni privatni ključ! + Datoteka "%1" ne sadrži validni privatni ključ! File "%1" does not contain a valid public key! - Datoteka "% 1" ne sadrži validni javni ključ! + Datoteka "%1" ne sadrži validni javni ključ! Failed to create directory for key file. @@ -560,15 +568,15 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Failed to write key file "%1". - Nije uspelo pisanje datoteke ključa "% 1". + Nije uspelo pisanje datoteke ključa "%1". Failed to set permissions for key file "%1"! - Nije moguće postaviti dozvole za ključnu datoteku "% 1"! + Nije moguće postaviti dozvole za ključnu datoteku "%1"! Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - Ključ "% 1 /% 2" je uspešno uvežen. Proverite dozvole datoteka "% 3" kako biste sprečili neovlašćeni pristup. + Ključ "%1/%2" je uspešno uvežen. Proverite dozvole datoteka "%3" kako biste sprečili neovlašćeni pristup. Failed to convert private key to public key @@ -576,19 +584,19 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Failed to create directory for private key file "%1". - Nije uspelo kreiranje direktorijuma za datoteku privatnog ključa "% 1". + Nije uspelo kreiranje direktorijuma za datoteku privatnog ključa "%1". Failed to save private key in file "%1"! - Privatni ključ u datoteci "% 1" nije uspešno sačuvan! + Privatni ključ u datoteci "%1" nije uspešno sačuvan! Failed to set permissions for private key file "%1"! - Neuspešno postavljanje dozvola za datoteku privatnog ključa "% 1"! + Neuspešno postavljanje dozvola za datoteku privatnog ključa "%1"! Failed to create directory for public key file "%1". - Neuspešno kreiranje direktorijuma za datoteku javnog ključa "% 1". + Neuspešno kreiranje direktorijuma za datoteku javnog ključa "%1". Failed to save public key in file "%1"! @@ -596,19 +604,19 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Failed to set permissions for public key file "%1"! - Nije moguće postaviti dozvole za datoteku javnog ključa "% 1"! + Nije moguće postaviti dozvole za datoteku javnog ključa "%1"! Failed to set owner of key file "%1" to "%2". - Neuspešno postavljanje vlasnika datoteke ključa "% 1" na "% 2". + Neuspešno postavljanje vlasnika datoteke ključa "%1" na "%2". Failed to set permissions for key file "%1". - Neuspešno postavljanje dozvola za ključnu datoteku "% 1". + Neuspešno postavljanje dozvola za ključnu datoteku "%1". Key "%1" is now accessible by user group "%2". - Ključ "% 1" je sada dostupan grupi korisnika "% 2". + Ključ "%1" je sada dostupan grupi korisnika "%2". <N/A> @@ -679,7 +687,7 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - Ova naredba navodi sve dostupne ključeve za proveru autentičnosti u konfiguracionom direktorijumu ključeva. Ako je navedena opcija "% 1",specifična tablica s ključnim detaljima biće prikazana umesto opcija. Neki detalji možda nedostaju ako ključ nije dostupan, npr. zbog nedostatka dozvola za čitanje. + Ova naredba navodi sve dostupne ključeve za proveru autentičnosti u konfiguracionom direktorijumu ključeva. Ako je navedena opcija "%1",specifična tablica s ključnim detaljima biće prikazana umesto opcija. Neki detalji možda nedostaju ako ključ nije dostupan, npr. zbog nedostatka dozvola za čitanje. Please specify the command to display help for! @@ -962,7 +970,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Invalid type specified. Valid values are "%1" or "%2". - Naveden nevažeći tip. Važeće vrednosti su „% 1“ ili „% 2“. + Naveden nevažeći tip. Važeće vrednosti su „%1“ ili „%2“. Type @@ -990,19 +998,19 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Can't open file "%1" for reading! - Nije moguće otvoriti datoteku "% 1" za čitanje! + Nije moguće otvoriti datoteku "%1" za čitanje! Unknown argument "%1". - Nepoznati argument "% 1". + Nepoznati argument "%1". Computer "%1" (host address: "%2" MAC address: "%3") - Računar "% 1" (adresa domaćina: "% 2" MAC adresa: "% 3") + Računar "%1" (adresa domaćina: "%2" MAC adresa: "%3") Unclassified object "%1" with ID "%2" - Nerazvrstani objekt "% 1" sa ID-om "% 2" + Nerazvrstani objekt "%1" sa ID-om "%2" None @@ -1022,7 +1030,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Error while parsing line %1. - Greška prilikom raščlanjivanja linije% 1. + Greška prilikom raščlanjivanja linije%1. Network object directory which stores objects in local configuration @@ -1038,7 +1046,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Can't open file "%1" for writing! - Nije moguće otvoriti datoteku "% 1" za pisanje! + Nije moguće otvoriti datoteku "%1" za pisanje! No format string specified! @@ -1102,7 +1110,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - Uvozi objekte iz zadane tekstualne datoteke pomoću datog niza formata ili regularnog izraza koji sadrži jedno ili više rezervi. Važeća rezervirana mesta su:% 1 + Uvozi objekte iz zadane tekstualne datoteke pomoću datog niza formata ili regularnog izraza koji sadrži jedno ili više rezervi. Važeća rezervirana mesta su: %1 Import simple CSV file to a single room @@ -1122,7 +1130,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - Izvezi objekte u navedenu tekstualnu datoteku koristeći zadani format niza koji sadrži jedno ili više rezervi. Važeća rezervisana mesta su:% 1 + Izvezi objekte u navedenu tekstualnu datoteku koristeći zadani format niza koji sadrži jedno ili više rezervi. Važeća rezervisana mesta su:%1 Export all objects to a CSV file @@ -1146,7 +1154,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - Dodaje objekt u kojem % 1 može biti jedan od "% 2" ili "% 3". % 4 može se odrediti imenom ili UUID-om. + Dodaje objekt u kojem %1 može biti jedan od "%2" ili "%3". %4 može se odrediti imenom ili UUID-om. Add a room @@ -1162,7 +1170,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - Uklanja navedeni objekt iz direktorijuma. % 1 može se odrediti imenom ili UUID-om. Ako uklonite lokaciju, uklonite i sva povezana računara. + Uklanja navedeni objekt iz direktorijuma. %1 može se odrediti imenom ili UUID-om. Ako uklonite lokaciju, uklonite i sva povezana računara. Remove a computer by name @@ -1211,7 +1219,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Active features: %1 - Aktivne karakteristike:% 1 + Aktivne karakteristike: %1 Online and connected @@ -1239,7 +1247,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Logged on user: %1 - Prijavljeni korisnik:% 1 + Prijavljeni korisnik: %1 Location: %1 @@ -1274,7 +1282,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - Korisnik "% 1" kod domaćina "% 2" pokušao je pristupiti ovom računaru, ali nije uspeo uspješno proveriti identitet. + Korisnik "%1" kod domaćina "%2" pokušao je pristupiti ovom računaru, ali nije uspeo uspješno proveriti identitet. Access control error @@ -1282,7 +1290,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - Korisnik "% 1" kod računara "% 2" pokušao je pristupiti ovom računaru, ali je blokiran zbog postavki kontrole pristupa. + Korisnik "%1" kod računara "%2" pokušao je pristupiti ovom računaru, ali je blokiran zbog postavki kontrole pristupa. Active connections: @@ -1308,7 +1316,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - Nije pronađen nijedan podrazumevani dodatak mrežnog objekta. Proverite vašu instalaciju ili konfigurišite drugačiju poziciju direktorijuma mrežnih objekata putem% 1 Konfigurator. + Nije pronađen nijedan podrazumevani dodatak mrežnog objekta. Proverite vašu instalaciju ili konfigurišite drugačiju poziciju direktorijuma mrežnih objekata putem %1 Konfigurator. Location detection failed @@ -1378,7 +1386,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not write the computer and users list to %1! Please check the file access permissions. - Ne može se zapisati lista računara i korisnika na% 1! Proverite dozvole za pristup datoteci. + Ne može se zapisati lista računara i korisnika na %1! Proverite dozvole za pristup datoteci. @@ -1471,15 +1479,15 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u ConfigurationManager Could not modify the autostart property for the %1 Service. - Nije moguće izmeniti svojstvo automatskog pokretanja za uslugu% 1. + Nije moguće izmeniti svojstvo automatskog pokretanja za uslugu %1. Could not configure the firewall configuration for the %1 Server. - Nije moguće konfigurisati konfiguraciju zaštitnog zida za% 1 Server. + Nije moguće konfigurisati konfiguraciju zaštitnog zida za %1 Server. Could not configure the firewall configuration for the %1 Worker. - Nije moguće konfigurisati konfiguraciju zaštitnog zida za% 1 Radnika. + Nije moguće konfigurisati konfiguraciju zaštitnog zida za %1 Radnika. Configuration is not writable. Please check your permissions! @@ -1635,19 +1643,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - Korisnik % 1 na računaru % 2 želi pristupiti vašoj radnoj površini. Želite li odobriti pristup? + Korisnik %1 na računaru %2 želi pristupiti vašoj radnoj površini. Želite li odobriti pristup? DesktopServicesConfigurationPage - - Programs & websites - Programi & websajtovi - - - Predefined programs - Unapred definisani programi - Name Ime @@ -1656,14 +1656,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Path Putanja - - Add new program - Dodaj novi program - - - Remove selected program - Ukloni obeležen program - Predefined websites Unapred definisani websajtovi @@ -1676,21 +1668,37 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u URL URL - - New program - Novi program - New website Novi websajt + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Pokreni program - Open website Otvori websajt @@ -1700,28 +1708,32 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Klikni ovo dugme da otvorite websajt na svim računarima. - Start programs and services in user desktop - Pokrenite programe i usluge na radnoj površini korisnika + Open website "%1" + Otvori web lokaciju "%1" - Click this button to run a program on all computers. - Kliknite ovo dugme da biste pokrenuli program na svim računarima. + Custom website + Prilagodjena web lokacija - Run program "%1" - Pokreni program "%1" + Start application + - Custom program - Prilagođjeni program + Click this button to start an application on all computers. + - Open website "%1" - Otvori web lokaciju "%1" + Start application "%1" + - Custom website - Prilagodjena web lokacija + Custom application + + + + Start apps and open websites in user sessions + @@ -1754,10 +1766,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Play tutorial video Reprodukujte video tutorial - - Custom program - Prilagođjeni program - Handout Brošura @@ -1770,6 +1778,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u generic-student-user opšti-student-korisnik + + Custom application + + ExternalVncServer @@ -1835,7 +1847,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u FileTransferController Could not open file "%1" for reading! Please check your permissions! - Nije moguće otvoriti datoteku "% 1" za čitanje! Molimo proverite svoje dozvole! + Nije moguće otvoriti datoteku "%1" za čitanje! Molimo proverite svoje dozvole! @@ -1904,11 +1916,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not receive file "%1" as it already exists. - Nije moguće primiti datoteku "% 1" jer ona već postoji. + Nije moguće primiti datoteku "%1" jer ona već postoji. Could not receive file "%1" as it could not be opened for writing! - Ne mogu primiti datoteku "% 1" jer se ne može otvoriti za pisanje! + Ne mogu primiti datoteku "%1" jer se ne može otvoriti za pisanje! @@ -2052,7 +2064,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u LdapClient LDAP error description: %1 - Opis greške LDAP:% 1 + Opis greške LDAP: %1 @@ -2189,7 +2201,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not find a group with the name "%1". Please check the group name or the group tree parameter. - Nije bilo moguće pronaći grupu sa nazivom "% 1". Proverite naziv grupe ili parametar stabla grupe. + Nije bilo moguće pronaći grupu sa nazivom "%1". Proverite naziv grupe ili parametar stabla grupe. computer objects @@ -2265,7 +2277,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not find a user with the name "%1". Please check the username or the user tree parameter. - Ne mogu pronaći korisnika s imenom "% 1". Proverite korisničko ime ili parametar korisničkog stabla. + Ne mogu pronaći korisnika s imenom "%1". Proverite korisničko ime ili parametar korisničkog stabla. groups of computer @@ -2277,7 +2289,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - Ne mogu pronaći računar s imenom domaćina "% 1". Molimo proverite naziv domaćina ili parametar stabla računara. + Ne mogu pronaći računar s imenom domaćina "%1". Molimo proverite naziv domaćina ili parametar stabla računara. Hostname lookup failed @@ -2285,7 +2297,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not lookup hostname for IP address %1. Please check your DNS server settings. - Nije moguće potražiti ime hosta za IP adresu% 1. Proverite postavke DNS servera. + Nije moguće potražiti ime hosta za IP adresu %1. Proverite postavke DNS servera. location entries @@ -2313,7 +2325,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u LDAP %1 test failed - LDAP% 1 test je neuspešan + LDAP %1 test je neuspešan Could not query any entries in configured %1. Please check the parameter "%2". @@ -2325,11 +2337,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u LDAP %1 test successful - LDAP% 1 test je uspešan + LDAP %1 test je uspešan The %1 has been queried successfully and %2 entries were found. - % 1 je uspešno upitan i pronađjeni su unosi % 2. + %1 je uspešno upitan i pronađjeni su unosi %2. LDAP test failed @@ -2355,7 +2367,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u %1 %2 have been queried successfully: %3 - % 1% 2 uspešno je prosledjen upit: + %1 %2 uspešno je prosledjen upit: %3 @@ -2367,7 +2379,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - Nije moguće proslediti upit nijednog % 1 pomoću konfigurisanog filtera. Molimo proverite LDAP filter za% 1. + Nije moguće proslediti upit nijednog %1 pomoću konfigurisanog filtera. Molimo proverite LDAP filter za %1. %2 @@ -2377,7 +2389,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u %1 %2 have been queried successfully using the configured filter. - % 1% 2 uspešno je ispitan pomoću konfigurisanog filtera. + %1 %2 uspešno je ispitan pomoću konfigurisanog filtera. @@ -2994,7 +3006,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - Lokalni pomoćni program za konfiguraciju izveštava da konfiguracija ne može biti napisana! Molimo pokrenite% 1 konfigurator s većim privilegijama. + Lokalni pomoćni program za konfiguraciju izveštava da konfiguracija ne može biti napisana! Molimo pokrenite %1 konfigurator s većim privilegijama. Access denied @@ -3014,7 +3026,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u The feature "%1" is still active. Please stop it before closing %2. - Funkcija "%1" i dalje je aktivna. Molim zaustavite pre zatvaranja %2. + Funkcija "%1" i dalje je aktivna. Molim zaustavite pre zatvaranja %2. Reset configuration @@ -3088,6 +3100,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3312,6 +3328,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Name: Ime: + + Website name + + PluginsCommands @@ -3390,10 +3410,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Do you really want to reboot the selected computers? Da li stvarno želite ponovo pokrenuti sistem izabranih kompjutera? - - Do you really want to power down the selected computer? - Da li stvarno želite isključiti izabrane kompjutere? - Power on a computer via Wake-on-LAN (WOL) Uključivanje kompjutera preko Wake-on-LAN (WOL) @@ -3446,6 +3462,18 @@ Please save your work and close all programs. Molimo snimite/spasite Vaš rad i zatvorite sve programe. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3590,33 +3618,6 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Izlaz - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Molimo unesite programe ili komande da se mogu izvršavati na odabranom kompjuteru(ima). Možete odvojiti više programa/komandi po liniji. - - - Run programs - Pokreni programe - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - npr. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - Ime: - - - Remember and add to program menu - Zapamtiti i dodati programskom meniju - - - e.g. VLC - npr. VLC - - ScreenLockFeaturePlugin @@ -3985,6 +3986,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + npr. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + Ime: + + + e.g. VLC + npr. VLC + + SystemTrayIcon @@ -4021,8 +4053,8 @@ The second button will remove the selected computer. If nothing is selected the Pošalji tekstualnu poruku - Use the field below to type your message which will be sent to all selected users. - Upotrebi polje ispod da napišeš poruku koja će biti poslana svim izabranim korisnicima. + Please enter your message which send to all selected users. + @@ -4135,6 +4167,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Kontrola sesije korisnika + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4340,11 +4376,4 @@ The second button will remove the selected computer. If nothing is selected the Ne upotrebljavajte X Demage ekstenziju - - main - - Veyon Master - Veyon Master - - \ No newline at end of file diff --git a/translations/veyon_sv.ts b/translations/veyon_sv.ts index 859c849d2..06a34c344 100644 --- a/translations/veyon_sv.ts +++ b/translations/veyon_sv.ts @@ -315,6 +315,14 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1636,86 +1644,90 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites + Name - Predefined programs + Path - Name + Predefined websites - Path + Remove selected website + + + + URL - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - Run program + Open website - Open website + Click this button to open a website on all computers. - Click this button to open a website on all computers. + Open website "%1" - Start programs and services in user desktop + Custom website - Click this button to run a program on all computers. + Start application - Run program "%1" + Click this button to start an application on all computers. - Custom program + Start application "%1" - Open website "%1" + Custom application - Custom website + Start apps and open websites in user sessions @@ -1749,10 +1761,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - - Handout @@ -1765,6 +1773,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3064,6 +3076,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3288,6 +3304,10 @@ The public key is used on client computers to authenticate incoming connection r Name: + + Website name + + PluginsCommands @@ -3366,10 +3386,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3420,6 +3436,18 @@ The public key is used on client computers to authenticate incoming connection r Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3564,33 +3592,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3958,6 +3959,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3994,7 +4026,7 @@ The second button will remove the selected computer. If nothing is selected the Skicka textmeddelande - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4108,6 +4140,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4313,11 +4349,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_th.ts b/translations/veyon_th.ts index f1451151f..321fdca05 100644 --- a/translations/veyon_th.ts +++ b/translations/veyon_th.ts @@ -313,6 +313,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1637,56 +1645,56 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - Programs & websites - โปรแกรมและเว็บไซต์ + Name + ชื่อ - Predefined programs - โปรแกรมที่กำหนดไว้ + Path + - Name - ชื่อ + Predefined websites + - Path + Remove selected website - Add new program - เพิ่มโปรแกรมใหม่ + URL + URL - Remove selected program - ลบโปรแกรมที่เลือก + New website + เว็บไซต์ใหม่ - Predefined websites + Applications & websites - Remove selected website + Predefined applications - URL - URL + Add new application + - New program - โปรแกรมใหม่ + Remove selected application + - New website - เว็บไซต์ใหม่ + Add new website + + + + New application + DesktopServicesFeaturePlugin - - Run program - สั่งเปิดโปรแกรม - Open website เปิดเว็บไซต์ @@ -1696,28 +1704,32 @@ The public key is used on client computers to authenticate incoming connection r คลิกที่ปุ่มนี้เพื่อเปิดเว็บไซต์ทั้งหมด - Start programs and services in user desktop - + Open website "%1" + เปิดเว็บไซต์ "%1" + + + Custom website + เว็บไซต์กำหนดเอง - Click this button to run a program on all computers. - คลิกปุ่มนี้เพื่อสั่งเปิดโปรแกรมบนเครื่องคอมพิวเตอร์ทุกเครื่อง + Start application + - Run program "%1" - สั่งเปิดโปรแกรม "%1" + Click this button to start an application on all computers. + - Custom program - โปรแกรมกำหนดเอง + Start application "%1" + - Open website "%1" - เปิดเว็บไซต์ "%1" + Custom application + - Custom website - เว็บไซต์กำหนดเอง + Start apps and open websites in user sessions + @@ -1750,10 +1762,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - - Custom program - โปรแกรมกำหนดเอง - Handout @@ -1766,6 +1774,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user + + Custom application + + ExternalVncServer @@ -3065,6 +3077,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight สปอร์ตไลท์ + + Veyon Master + + MasterConfigurationPage @@ -3289,6 +3305,10 @@ The public key is used on client computers to authenticate incoming connection r Name: ชื่อ: + + Website name + + PluginsCommands @@ -3367,10 +3387,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - คุณต้องการที่จะสั่งปิดเครื่องคอมพิวเตอร์ที่เลือกไว้หรือไม่? - Power on a computer via Wake-on-LAN (WOL) เปิดเครื่องคอมพิวเตอร์โดยใช้ Wake-on-LAN (WOL) @@ -3422,6 +3438,18 @@ Please save your work and close all programs. คอมพิวเตอร์จะปิดลงใน %1 นาที %2 วินาที กรุณาบันทึกงานให้เรียบร้อยแล้วปิดโปรแกรมทุกโปรแกรม + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3566,33 +3594,6 @@ Please save your work and close all programs. ออก - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - สั่งเปิดโปรแกรม - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - เช่น "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - ชื่อ: - - - Remember and add to program menu - จำไว้และเพิ่มไปยังเมนูโปรแกรม - - - e.g. VLC - เช่น VLC - - ScreenLockFeaturePlugin @@ -3960,6 +3961,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + เช่น "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + ชื่อ: + + + e.g. VLC + เช่น VLC + + SystemTrayIcon @@ -3996,7 +4028,7 @@ The second button will remove the selected computer. If nothing is selected the ส่งข้อความอักษระ - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4110,6 +4142,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4315,11 +4351,4 @@ The second button will remove the selected computer. If nothing is selected the ห้ามใช่ส่วนเสริม X Damage เป็นอันขาด - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_tr.ts b/translations/veyon_tr.ts index 7db546ab7..b15e041f9 100644 --- a/translations/veyon_tr.ts +++ b/translations/veyon_tr.ts @@ -315,6 +315,14 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do DesktopServicesConfigurationPage - - Programs & websites - Programlar ve web siteleri - - - Predefined programs - Önceden tanımlanmış programlar - Name Ad @@ -1654,14 +1654,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Path Yol - - Add new program - Yeni program ekle - - - Remove selected program - Seçili programı kaldır - Predefined websites Önceden tanımlanmış web siteleri @@ -1674,21 +1666,37 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do URL URL - - New program - Yeni program - New website Yeni web sitesi + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - Program çalıştır - Open website Web sitesi aç @@ -1698,28 +1706,32 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Tüm bilgisayarlarda bir web sitesi açmak için bu düğmeye tıklayın. - Start programs and services in user desktop - Kullanıcı masaüstünde program ve hizmetler başlat + Open website "%1" + Web sitesini "%1" açın - Click this button to run a program on all computers. - Tüm bilgisayarlarda bir program çalıştırmak için bu düğmeye tıklayın. + Custom website + Özel web sitesi - Run program "%1" - "%1" programını çalıştır + Start application + - Custom program - Özel program + Click this button to start an application on all computers. + - Open website "%1" - Web sitesini "%1" açın + Start application "%1" + - Custom website - Özel web sitesi + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Play tutorial video Eğitici videoyu oynat - - Custom program - Özel program - Handout Elden çıkar @@ -1768,6 +1776,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do generic-student-user Jenerik-öğrenci-kullanıcı + + Custom application + + ExternalVncServer @@ -3078,6 +3090,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3302,6 +3318,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Name: İsim: + + Website name + + PluginsCommands @@ -3380,10 +3400,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Do you really want to reboot the selected computers? Seçilen bilgisayarları yeniden başlatmak istediğinize emin misiniz? - - Do you really want to power down the selected computer? - Seçilen bilgisayarları kapatmak istediğinize emin misiniz? - Power on a computer via Wake-on-LAN (WOL) Bir bilgisayarı ağdan uyandır (WOL) @@ -3436,6 +3452,18 @@ Please save your work and close all programs. Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3580,33 +3608,6 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.Çıkış - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Lütfen seçilen bilgisayar(lar)da çalıştırılacak programları veya komutları girin. Birden çok program/komut satır ile ayrılabilir. - - - Run programs - Program çalıştır - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - örnek. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - İsim: - - - Remember and add to program menu - Unutmayın ve program menüsüne ekleyin - - - e.g. VLC - örn. VLC - - ScreenLockFeaturePlugin @@ -3975,6 +3976,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + örnek. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + İsim: + + + e.g. VLC + örn. VLC + + SystemTrayIcon @@ -4011,8 +4043,8 @@ The second button will remove the selected computer. If nothing is selected the Metin iletisi gönder - Use the field below to type your message which will be sent to all selected users. - Tüm seçili kullanıcılara gönderilecek iletinizi yazmak için aşağıdaki alanı kullanın. + Please enter your message which send to all selected users. + @@ -4125,6 +4157,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Kullanıcı oturum denetimi + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4330,11 +4366,4 @@ The second button will remove the selected computer. If nothing is selected the X Damage eklentisini kullanma - - main - - Veyon Master - Veyon Usta - - \ No newline at end of file diff --git a/translations/veyon_uk.ts b/translations/veyon_uk.ts index 671f65fa4..c38300a17 100644 --- a/translations/veyon_uk.ts +++ b/translations/veyon_uk.ts @@ -315,6 +315,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed Комп'ютер для доступу + + Session being accessed is a user session + Сеанс доступу є сеансом користувача + + + Session being accessed is a login screen + Сеанс доступу є вікном вітання + AccessControlRulesTestDialog @@ -1635,14 +1643,6 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - - Programs & websites - Програми і сайти - - - Predefined programs - Попередньо визначені програми - Name Назва @@ -1651,14 +1651,6 @@ The public key is used on client computers to authenticate incoming connection r Path Шлях - - Add new program - Додати нову програму - - - Remove selected program - Вилучити позначену програму - Predefined websites Попередньо визначені сайти @@ -1671,21 +1663,37 @@ The public key is used on client computers to authenticate incoming connection r URL Адреса - - New program - Нова програма - New website Новий сайт + + Applications & websites + Програми і сайти + + + Predefined applications + Попередньо визначені програми + + + Add new application + Додати нову програму + + + Remove selected application + Вилучити позначену програму + + + Add new website + Додати новий сайт + + + New application + Нова програма + DesktopServicesFeaturePlugin - - Run program - Виконати програму - Open website Відкрити сайт @@ -1695,28 +1703,32 @@ The public key is used on client computers to authenticate incoming connection r Натисніть цю кнопку, щоб відкрити сайт на усіх комп’ютерах. - Start programs and services in user desktop - Запустити програми і служби на робочій станції користувача + Open website "%1" + Відкрити сайт «%1» - Click this button to run a program on all computers. - Натисніть цю кнопку, щоб запустити програму на усіх комп’ютерах. + Custom website + Нетиповий сайт - Run program "%1" - Виконати програму «%1» + Start application + Запустити програму - Custom program - Нетипова програма + Click this button to start an application on all computers. + Натисніть цю кнопку, щоб запустити програму на усіх комп'ютерах. - Open website "%1" - Відкрити сайт «%1» + Start application "%1" + Запустити програму «%1» - Custom website - Нетиповий сайт + Custom application + Нетипова програма + + + Start apps and open websites in user sessions + Запустити програми і відкрити сайти у сеансах користувачів @@ -1749,10 +1761,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video Відтворити навчальне відео - - Custom program - Нетипова програма - Handout Безкоштовний зразок @@ -1765,6 +1773,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user типовий-користувач-учень + + Custom application + Нетипова програма + ExternalVncServer @@ -3085,6 +3097,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight Акцент + + Veyon Master + + MasterConfigurationPage @@ -3309,6 +3325,10 @@ The public key is used on client computers to authenticate incoming connection r Name: Назва: + + Website name + Назва сайта + PluginsCommands @@ -3387,10 +3407,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? Ви справді хочете перезавантажити позначені комп'ютери? - - Do you really want to power down the selected computer? - Ви справді хочете вимкнути позначений комп'ютер? - Power on a computer via Wake-on-LAN (WOL) Увімкнути комп'ютер за допомогою Wake-on-LAN (WOL) @@ -3443,6 +3459,18 @@ Please save your work and close all programs. Будь ласка, збережіть результати вашої роботи і завершіть роботу усіх програм. + + Do you really want to reboot <b>ALL</b> computers? + Ви справді хочете перезавантажити <b>УСІ</b> комп'ютери? + + + Do you really want to power down <b>ALL</b> computers? + Ви справді хочете вимкнути <b>УСІ</b> комп'ютери? + + + Do you really want to power down the selected computers? + Ви справді хочете вимкнути позначені комп'ютери? + PowerDownTimeInputDialog @@ -3587,33 +3615,6 @@ Please save your work and close all programs. Вийти - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - Будь ласка, вкажіть програми або команди, які слід виконати на позначених комп’ютерах. Ви можете вказати декілька програм або команд, записавши їх в окремих рядках. - - - Run programs - Виконати програми - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - наприклад, «C:\Program Files\VideoLAN\VLC\vlc.exe» - - - Name: - Назва: - - - Remember and add to program menu - Запам'ятати і додати до меню програм - - - e.g. VLC - наприклад VLC - - ScreenLockFeaturePlugin @@ -3983,6 +3984,37 @@ The second button will remove the selected computer. If nothing is selected the Другу кнопку призначено для вилучення позначеного комп'ютера. Якщо нічого не позначено, буде вилучено останній з комп'ютерів. + + StartAppDialog + + Start application + Запустити програму + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + Будь ласка, вкажіть програми, які слід запустити на позначених комп'ютерах. Ви можете вказати декілька програм, відокремивши записи символом розриву рядка. + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + наприклад, «C:\Program Files\VideoLAN\VLC\vlc.exe» + + + Remember and add to application menu + Запам'ятати і додати до меню програм + + + Application name + Назва програми + + + Name: + Назва: + + + e.g. VLC + наприклад VLC + + SystemTrayIcon @@ -4019,8 +4051,8 @@ The second button will remove the selected computer. If nothing is selected the Надіслати текстове повідомлення - Use the field below to type your message which will be sent to all selected users. - Використовуйте це поле, щоб набрати текст повідомлення, яке буде надіслано всім позначеним користувачам. + Please enter your message which send to all selected users. + Будь ласка, вкажіть ваше повідомлення, яке слід надіслати усім позначеним користувачам. @@ -4133,6 +4165,10 @@ The second button will remove the selected computer. If nothing is selected the User session control Керування сеансами користувачів + + Do you really want to log off <b>ALL</b> users? + Ви справді хочете виконати вихід з системи для <b>УСІХ</b> користувачів? + VeyonCore @@ -4338,11 +4374,4 @@ The second button will remove the selected computer. If nothing is selected the Не використовувати розширення X Damage - - main - - Veyon Master - Головний комп'ютер Veyon (Veyon Master) - - \ No newline at end of file diff --git a/translations/veyon_vi.ts b/translations/veyon_vi.ts index 47db80942..a121c17a0 100644 --- a/translations/veyon_vi.ts +++ b/translations/veyon_vi.ts @@ -315,6 +315,14 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1639,86 +1647,90 @@ Khóa công được sử dụng trên các máy tính khách để xác thực DesktopServicesConfigurationPage - Programs & websites + Name + Tên + + + Path - Predefined programs + Predefined websites - Name - Tên + Remove selected website + - Path + URL - Add new program + New website - Remove selected program + Applications & websites - Predefined websites + Predefined applications - Remove selected website + Add new application - URL + Remove selected application - New program + Add new website - New website + New application DesktopServicesFeaturePlugin - Run program + Open website - Open website + Click this button to open a website on all computers. - Click this button to open a website on all computers. + Open website "%1" - Start programs and services in user desktop + Custom website - Click this button to run a program on all computers. + Start application - Run program "%1" + Click this button to start an application on all computers. - Custom program + Start application "%1" - Open website "%1" + Custom application - Custom website + Start apps and open websites in user sessions @@ -1752,10 +1764,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Play tutorial video - - Custom program - - Handout @@ -1768,6 +1776,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực generic-student-user + + Custom application + + ExternalVncServer @@ -3067,6 +3079,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3291,6 +3307,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Name: + + Website name + + PluginsCommands @@ -3369,10 +3389,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Do you really want to reboot the selected computers? - - Do you really want to power down the selected computer? - - Power on a computer via Wake-on-LAN (WOL) @@ -3423,6 +3439,18 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Please save your work and close all programs. + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3567,33 +3595,6 @@ Please save your work and close all programs. - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - - - - Run programs - - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - - Name: - - - - Remember and add to program menu - - - - e.g. VLC - - - ScreenLockFeaturePlugin @@ -3961,6 +3962,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + + Remember and add to application menu + + + + Application name + + + + Name: + + + + e.g. VLC + + + SystemTrayIcon @@ -3997,7 +4029,7 @@ The second button will remove the selected computer. If nothing is selected the - Use the field below to type your message which will be sent to all selected users. + Please enter your message which send to all selected users. @@ -4111,6 +4143,10 @@ The second button will remove the selected computer. If nothing is selected the User session control + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4316,11 +4352,4 @@ The second button will remove the selected computer. If nothing is selected the - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_zh_CN.ts b/translations/veyon_zh_CN.ts index 0587cf092..29e59a396 100644 --- a/translations/veyon_zh_CN.ts +++ b/translations/veyon_zh_CN.ts @@ -315,6 +315,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1639,14 +1647,6 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - - Programs & websites - 程序和网站 - - - Predefined programs - 预定义的程序 - Name 名称 @@ -1655,14 +1655,6 @@ The public key is used on client computers to authenticate incoming connection r Path 路径 - - Add new program - 添加新程序 - - - Remove selected program - 移除选中的程序 - Predefined websites 预定义的网站 @@ -1675,21 +1667,37 @@ The public key is used on client computers to authenticate incoming connection r URL URL - - New program - 新程序 - New website 新站点 + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - 运行程序 - Open website 打开网站 @@ -1699,28 +1707,32 @@ The public key is used on client computers to authenticate incoming connection r 点击此按钮,将在所有计算机上打开一个网站 - Start programs and services in user desktop - 在用户桌面运行程序和服务 + Open website "%1" + 打开站点 "%1" - Click this button to run a program on all computers. - 点击此按钮将在所有计算机上运行一个程序。 + Custom website + 定制站点 - Run program "%1" - 运行程序 "%1" + Start application + - Custom program - 定制程序 + Click this button to start an application on all computers. + - Open website "%1" - 打开站点 "%1" + Start application "%1" + - Custom website - 定制站点 + Custom application + + + + Start apps and open websites in user sessions + @@ -1753,10 +1765,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video 播放教程视频 - - Custom program - 定制程序 - Handout 讲义 @@ -1769,6 +1777,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user 一般学生用户 + + Custom application + + ExternalVncServer @@ -3087,6 +3099,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight + + Veyon Master + + MasterConfigurationPage @@ -3311,6 +3327,10 @@ The public key is used on client computers to authenticate incoming connection r Name: 名称: + + Website name + + PluginsCommands @@ -3389,10 +3409,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? 你确定要重新启动选定的电脑吗? - - Do you really want to power down the selected computer? - 你确定要关闭选定的电脑吗? - Power on a computer via Wake-on-LAN (WOL) 通过局域网唤醒(WOL)打开计算机电源 @@ -3445,6 +3461,18 @@ Please save your work and close all programs. 请保存您的工作并关闭所有程序。 + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3589,33 +3617,6 @@ Please save your work and close all programs. 退出 - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - 请输入要在所选计算机上运行的程序或命令。 您可以按行分隔多个程序/命令。 - - - Run programs - 运行程序 - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - 例如 "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - 名称: - - - Remember and add to program menu - 记住并添加到程序菜单 - - - e.g. VLC - 例如 VLC - - ScreenLockFeaturePlugin @@ -3984,6 +3985,37 @@ The second button will remove the selected computer. If nothing is selected the + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + 例如 "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + 名称: + + + e.g. VLC + 例如 VLC + + SystemTrayIcon @@ -4020,8 +4052,8 @@ The second button will remove the selected computer. If nothing is selected the 发送消息 - Use the field below to type your message which will be sent to all selected users. - 在下面的文本框中输入您要发送给所选用户的消息。 + Please enter your message which send to all selected users. + @@ -4134,6 +4166,10 @@ The second button will remove the selected computer. If nothing is selected the User session control 用户会话控制 + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4339,11 +4375,4 @@ The second button will remove the selected computer. If nothing is selected the 不要使用 X Damage 扩展 - - main - - Veyon Master - - - \ No newline at end of file diff --git a/translations/veyon_zh_TW.ts b/translations/veyon_zh_TW.ts index 59b7b1509..0fc245205 100644 --- a/translations/veyon_zh_TW.ts +++ b/translations/veyon_zh_TW.ts @@ -315,6 +315,14 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed + + Session being accessed is a user session + + + + Session being accessed is a login screen + + AccessControlRulesTestDialog @@ -1638,14 +1646,6 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage - - Programs & websites - 程式 & 網站 - - - Predefined programs - 預先定義程式 - Name 名稱 @@ -1654,14 +1654,6 @@ The public key is used on client computers to authenticate incoming connection r Path 路徑 - - Add new program - 加入新的程式 - - - Remove selected program - 移除所選程式 - Predefined websites 預先定義網站 @@ -1674,21 +1666,37 @@ The public key is used on client computers to authenticate incoming connection r URL URL - - New program - 新程式 - New website 新網站 + + Applications & websites + + + + Predefined applications + + + + Add new application + + + + Remove selected application + + + + Add new website + + + + New application + + DesktopServicesFeaturePlugin - - Run program - 執行程式 - Open website 開啟網站 @@ -1698,28 +1706,32 @@ The public key is used on client computers to authenticate incoming connection r 按一下這個按鈕可以在所有電腦上開啟一個網站。 - Start programs and services in user desktop - 啟動程式和服務在使用者桌面 + Open website "%1" + 開啟網站 "%1" - Click this button to run a program on all computers. - 按一下這個按鈕可以在所有電腦上執行一個程式。 + Custom website + 自訂網站 - Run program "%1" - 執行程式 "%1" + Start application + - Custom program - 自訂程式 + Click this button to start an application on all computers. + - Open website "%1" - 開啟網站 "%1" + Start application "%1" + - Custom website - 自訂網站 + Custom application + + + + Start apps and open websites in user sessions + @@ -1752,10 +1764,6 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video 播放指南視訊 - - Custom program - 自訂程式 - Handout 講義 @@ -1768,6 +1776,10 @@ The public key is used on client computers to authenticate incoming connection r generic-student-user 通用學生使用者 + + Custom application + + ExternalVncServer @@ -3086,6 +3098,10 @@ The public key is used on client computers to authenticate incoming connection r Spotlight 聚光燈 + + Veyon Master + + MasterConfigurationPage @@ -3310,6 +3326,10 @@ The public key is used on client computers to authenticate incoming connection r Name: 名稱: + + Website name + + PluginsCommands @@ -3388,10 +3408,6 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? 您真的要重新啟動選取的電腦嗎? - - Do you really want to power down the selected computer? - 您真的要關閉選取的電腦嗎? - Power on a computer via Wake-on-LAN (WOL) 透過 Wake-on-LAN (WOL) 開啟電腦電源 @@ -3444,6 +3460,18 @@ Please save your work and close all programs. 請儲存您的工作並關閉所有程式。 + + Do you really want to reboot <b>ALL</b> computers? + + + + Do you really want to power down <b>ALL</b> computers? + + + + Do you really want to power down the selected computers? + + PowerDownTimeInputDialog @@ -3588,33 +3616,6 @@ Please save your work and close all programs. 結束 - - RunProgramDialog - - Please enter the programs or commands to run on the selected computer(s). You can separate multiple programs/commands by line. - 請輸入程式或在選取電腦上執行的命令。 您可以用行分隔多個程式/命令。 - - - Run programs - 執行程式 - - - e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - 例如: "C:\Program Files\VideoLAN\VLC\vlc.exe" - - - Name: - 名稱: - - - Remember and add to program menu - 記住並加入到程式功能表 - - - e.g. VLC - 例如: VLC - - ScreenLockFeaturePlugin @@ -3984,6 +3985,37 @@ The second button will remove the selected computer. If nothing is selected the 第二個按鈕將移除選取的電腦。 如果未選取任何內容,則將移除最後一個。 + + StartAppDialog + + Start application + + + + Please enter the applications to start on the selected computers. You can separate multiple applications by line. + + + + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" + 例如: "C:\Program Files\VideoLAN\VLC\vlc.exe" + + + Remember and add to application menu + + + + Application name + + + + Name: + 名稱: + + + e.g. VLC + 例如: VLC + + SystemTrayIcon @@ -4020,8 +4052,8 @@ The second button will remove the selected computer. If nothing is selected the 傳送文字訊息 - Use the field below to type your message which will be sent to all selected users. - 使用下列欄位輸入您要傳送給所有選取使用者的訊息。 + Please enter your message which send to all selected users. + @@ -4134,6 +4166,10 @@ The second button will remove the selected computer. If nothing is selected the User session control 使用者工作階段控制 + + Do you really want to log off <b>ALL</b> users? + + VeyonCore @@ -4339,11 +4375,4 @@ The second button will remove the selected computer. If nothing is selected the 不使用 X Damage 擴充功能 - - main - - Veyon Master - Veyon Master - - \ No newline at end of file From df789046ae762b95f43504aa2fd1f1a35df7e02e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 6 May 2021 14:54:37 +0200 Subject: [PATCH 0925/1765] AuthKeys: improve log messages Indicate whether loading the public key file failed or performing the actual verification. --- plugins/authkeys/AuthKeysPlugin.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index 9d0e4450d..d1dd9ec8c 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -164,11 +164,15 @@ VncServerClient::AuthState AuthKeysPlugin::performAuthentication( VncServerClien const auto publicKeyPath = m_manager.publicKeyPath( authKeyName ); - vDebug() << "loading public key" << publicKeyPath; CryptoCore::PublicKey publicKey( publicKeyPath ); + if( publicKey.isNull() || publicKey.isPublic() == false ) + { + vWarning() << "failed to load public key from" << publicKeyPath; + return VncServerClient::AuthState::Failed; + } - if( publicKey.isNull() || publicKey.isPublic() == false || - publicKey.verifyMessage( client->challenge(), signature, CryptoCore::DefaultSignatureAlgorithm ) == false ) + vDebug() << "loaded public key from" << publicKeyPath; + if( publicKey.verifyMessage( client->challenge(), signature, CryptoCore::DefaultSignatureAlgorithm ) == false ) { vWarning() << "FAIL"; return VncServerClient::AuthState::Failed; From cbbe8d30151fc91f285c0b02ce67e5fd4851257f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 10:09:37 +0200 Subject: [PATCH 0926/1765] CI: drop Debian Stretch and add Debian Bullseye --- .ci/{linux.debian.stretch => linux.debian.bullseye}/Dockerfile | 2 +- .ci/{linux.debian.stretch => linux.debian.bullseye}/script.sh | 2 +- .ci/linux.sast/Dockerfile | 2 +- .travis.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename .ci/{linux.debian.stretch => linux.debian.bullseye}/Dockerfile (96%) rename .ci/{linux.debian.stretch => linux.debian.bullseye}/script.sh (91%) diff --git a/.ci/linux.debian.stretch/Dockerfile b/.ci/linux.debian.bullseye/Dockerfile similarity index 96% rename from .ci/linux.debian.stretch/Dockerfile rename to .ci/linux.debian.bullseye/Dockerfile index 85b722753..ba122716e 100644 --- a/.ci/linux.debian.stretch/Dockerfile +++ b/.ci/linux.debian.bullseye/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:stretch +FROM debian:bullseye MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.debian.stretch/script.sh b/.ci/linux.debian.bullseye/script.sh similarity index 91% rename from .ci/linux.debian.stretch/script.sh rename to .ci/linux.debian.bullseye/script.sh index f27279dad..b93da281b 100755 --- a/.ci/linux.debian.stretch/script.sh +++ b/.ci/linux.debian.bullseye/script.sh @@ -3,7 +3,7 @@ set -e $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-deb.sh $1 $2 "debian-stretch" +$1/.ci/common/finalize-deb.sh $1 $2 "debian-bullseye" if [ -z "$3" ] ; then diff --git a/.ci/linux.sast/Dockerfile b/.ci/linux.sast/Dockerfile index 71cab024d..89c52064f 100755 --- a/.ci/linux.sast/Dockerfile +++ b/.ci/linux.sast/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:stretch +FROM debian:bullseye MAINTAINER Tobias Junghans RUN \ diff --git a/.travis.yml b/.travis.yml index 2cb94b281..144d72ad3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,8 @@ matrix: include: - env: TARGET_OS=centos.7.9 - env: TARGET_OS=centos.8.3 - - env: TARGET_OS=debian.stretch - env: TARGET_OS=debian.buster + - env: TARGET_OS=debian.bullseye - env: TARGET_OS=fedora.32 - env: TARGET_OS=fedora.33 - env: TARGET_OS=opensuse.15.2 From 998a6efc943f63185af6b87aca6d2b78cd48c5b7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 10:11:54 +0200 Subject: [PATCH 0927/1765] CI: drop Fedora 32 and add Fedora 34 --- .ci/{linux.fedora.32 => linux.fedora.34}/Dockerfile | 2 +- .ci/{linux.fedora.32 => linux.fedora.34}/script.sh | 2 +- .travis.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename .ci/{linux.fedora.32 => linux.fedora.34}/Dockerfile (97%) rename .ci/{linux.fedora.32 => linux.fedora.34}/script.sh (58%) diff --git a/.ci/linux.fedora.32/Dockerfile b/.ci/linux.fedora.34/Dockerfile similarity index 97% rename from .ci/linux.fedora.32/Dockerfile rename to .ci/linux.fedora.34/Dockerfile index 3ea6510ba..0b410d42f 100644 --- a/.ci/linux.fedora.32/Dockerfile +++ b/.ci/linux.fedora.34/Dockerfile @@ -1,4 +1,4 @@ -FROM fedora:32 +FROM fedora:34 MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.fedora.32/script.sh b/.ci/linux.fedora.34/script.sh similarity index 58% rename from .ci/linux.fedora.32/script.sh rename to .ci/linux.fedora.34/script.sh index 936cb207f..78b4bd35a 100755 --- a/.ci/linux.fedora.32/script.sh +++ b/.ci/linux.fedora.34/script.sh @@ -3,4 +3,4 @@ set -e $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "fc32" +$1/.ci/common/finalize-rpm.sh $1 $2 "fc34" diff --git a/.travis.yml b/.travis.yml index 144d72ad3..9320a6d07 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,8 +11,8 @@ matrix: - env: TARGET_OS=centos.8.3 - env: TARGET_OS=debian.buster - env: TARGET_OS=debian.bullseye - - env: TARGET_OS=fedora.32 - env: TARGET_OS=fedora.33 + - env: TARGET_OS=fedora.34 - env: TARGET_OS=opensuse.15.2 - env: TARGET_OS=ubuntu.bionic - env: TARGET_OS=ubuntu.focal From 5f20707cfb6e086789b91eef8a99ee466df2f95a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 10:40:28 +0200 Subject: [PATCH 0928/1765] Core: add common compile options to veyon-pch target --- core/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 5d473450d..351885c82 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -117,6 +117,8 @@ if(WITH_PCH) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_AUTOGEN TRUE) target_sources(veyon-pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx) endif() + target_compile_options(veyon-pch PRIVATE ${VEYON_COMPILE_OPTIONS}) + set_default_target_properties(veyon-pch) if(WITH_QT6) target_link_libraries(veyon-pch Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Widgets) else() From 6c87b4f745a635d6c757f30716546c724b362fba Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 10:43:38 +0200 Subject: [PATCH 0929/1765] CMake: drop support for legacy compilers --- CMakeLists.txt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 311c9aff7..eb16fbc61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,14 +237,9 @@ set(VEYON_COMPILE_OPTIONS "-Wall;-Werror") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong ${CFLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong -fno-exceptions ${CXXFLAGS}") -if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0) -message(WARNING "Not using -fvisibility=hidden and/or LTO with GCC < 6.0") -set(WITH_LTO OFF) -else() set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) -endif() if(VEYON_BUILD_WIN32 OR VEYON_BUILD_WIN64) set(WITH_LTO OFF) From 73f2887f9ee2d471ad28fe99a9c0a1576941aa46 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 10:51:04 +0200 Subject: [PATCH 0930/1765] CI: use ninja instead of make --- .ci/common/linux-build.sh | 12 ++++-------- .ci/linux.centos.7.9/Dockerfile | 2 +- .ci/linux.centos.8.3/Dockerfile | 2 +- .ci/linux.debian.bullseye/Dockerfile | 2 +- .ci/linux.debian.buster/Dockerfile | 2 +- .ci/linux.fedora.33/Dockerfile | 2 +- .ci/linux.fedora.34/Dockerfile | 2 +- .ci/linux.opensuse.15.2/Dockerfile | 2 +- .ci/linux.ubuntu.bionic/Dockerfile | 2 +- .ci/linux.ubuntu.focal/Dockerfile | 2 +- 10 files changed, 13 insertions(+), 17 deletions(-) diff --git a/.ci/common/linux-build.sh b/.ci/common/linux-build.sh index 9aaae8512..587742cb7 100755 --- a/.ci/common/linux-build.sh +++ b/.ci/common/linux-build.sh @@ -4,19 +4,16 @@ set -e SRC=$1 BUILD=$2 -CPUS=$(nproc) mkdir -p $BUILD cd $BUILD -cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr -DWITH_LTO=ON $CMAKE_FLAGS $SRC - -echo Building on $CPUS CPUs +cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr -DWITH_LTO=ON $CMAKE_FLAGS $SRC if [ -z "$3" ] ; then - make -j$CPUS + ninja - fakeroot make package + fakeroot ninja package LIBDIR=$(grep VEYON_LIB_DIR CMakeCache.txt |cut -d "=" -f2) BUILD_PWD=$(pwd) @@ -29,7 +26,6 @@ if [ -z "$3" ] ; then ./cli/veyon-cli help ./cli/veyon-cli about else - make ${@:3} -j$CPUS - fakeroot make package + fakeroot ninja package fi diff --git a/.ci/linux.centos.7.9/Dockerfile b/.ci/linux.centos.7.9/Dockerfile index 8ec4c746a..e17247f81 100644 --- a/.ci/linux.centos.7.9/Dockerfile +++ b/.ci/linux.centos.7.9/Dockerfile @@ -4,7 +4,7 @@ MAINTAINER Tobias Junghans RUN \ yum --enablerepo=extras install -y epel-release && \ yum install -y centos-release-scl && \ - yum install -y git devtoolset-7 make cmake3 rpm-build fakeroot \ + yum install -y git devtoolset-7 ninja-build cmake3 rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebkit-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libjpeg-turbo-devel \ diff --git a/.ci/linux.centos.8.3/Dockerfile b/.ci/linux.centos.8.3/Dockerfile index c000d3a7f..48f19907c 100644 --- a/.ci/linux.centos.8.3/Dockerfile +++ b/.ci/linux.centos.8.3/Dockerfile @@ -5,7 +5,7 @@ RUN \ yum --enablerepo=extras install -y epel-release dnf-plugins-core && \ yum config-manager --set-enabled powertools && \ dnf install -y https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm && \ - yum install -y git gcc-c++ make cmake rpm-build fakeroot \ + yum install -y git gcc-c++ ninja-build cmake rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ diff --git a/.ci/linux.debian.bullseye/Dockerfile b/.ci/linux.debian.bullseye/Dockerfile index ba122716e..d05c2eac0 100644 --- a/.ci/linux.debian.bullseye/Dockerfile +++ b/.ci/linux.debian.bullseye/Dockerfile @@ -5,7 +5,7 @@ RUN \ apt-get update && \ apt-get install --no-install-recommends -y \ dpkg-dev \ - git binutils gcc g++ make cmake rename file fakeroot bzip2 \ + git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ diff --git a/.ci/linux.debian.buster/Dockerfile b/.ci/linux.debian.buster/Dockerfile index 4718882b1..92c1090fc 100644 --- a/.ci/linux.debian.buster/Dockerfile +++ b/.ci/linux.debian.buster/Dockerfile @@ -5,7 +5,7 @@ RUN \ apt-get update && \ apt-get install --no-install-recommends -y \ dpkg-dev \ - git binutils gcc g++ make cmake rename file fakeroot bzip2 \ + git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ diff --git a/.ci/linux.fedora.33/Dockerfile b/.ci/linux.fedora.33/Dockerfile index 3c6478799..78edeb5b4 100644 --- a/.ci/linux.fedora.33/Dockerfile +++ b/.ci/linux.fedora.33/Dockerfile @@ -2,7 +2,7 @@ FROM fedora:33 MAINTAINER Tobias Junghans RUN \ - yum install -y git gcc-c++ make cmake rpm-build fakeroot \ + yum install -y git gcc-c++ ninja-build cmake rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ diff --git a/.ci/linux.fedora.34/Dockerfile b/.ci/linux.fedora.34/Dockerfile index 0b410d42f..c1af21743 100644 --- a/.ci/linux.fedora.34/Dockerfile +++ b/.ci/linux.fedora.34/Dockerfile @@ -2,7 +2,7 @@ FROM fedora:34 MAINTAINER Tobias Junghans RUN \ - yum install -y git gcc-c++ make cmake rpm-build fakeroot \ + yum install -y git gcc-c++ ninja-build cmake rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ diff --git a/.ci/linux.opensuse.15.2/Dockerfile b/.ci/linux.opensuse.15.2/Dockerfile index 42cd06153..f45097e9f 100644 --- a/.ci/linux.opensuse.15.2/Dockerfile +++ b/.ci/linux.opensuse.15.2/Dockerfile @@ -2,7 +2,7 @@ FROM opensuse/leap:15.2 MAINTAINER Tobias Junghans RUN \ - zypper --gpg-auto-import-keys install -y git gcc-c++ make cmake rpm-build fakeroot \ + zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel libqt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ diff --git a/.ci/linux.ubuntu.bionic/Dockerfile b/.ci/linux.ubuntu.bionic/Dockerfile index 1c6c16a48..af337d6a4 100644 --- a/.ci/linux.ubuntu.bionic/Dockerfile +++ b/.ci/linux.ubuntu.bionic/Dockerfile @@ -4,7 +4,7 @@ MAINTAINER Tobias Junghans RUN \ apt-get update && \ apt-get install --no-install-recommends -y \ - git binutils gcc g++ make cmake rename file fakeroot bzip2 \ + git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ diff --git a/.ci/linux.ubuntu.focal/Dockerfile b/.ci/linux.ubuntu.focal/Dockerfile index 360cf4fb5..f029d0cd9 100644 --- a/.ci/linux.ubuntu.focal/Dockerfile +++ b/.ci/linux.ubuntu.focal/Dockerfile @@ -5,7 +5,7 @@ RUN \ apt-get update && \ DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ dpkg-dev \ - git binutils gcc g++ make cmake rename file fakeroot bzip2 \ + git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ From b52f477f3ea33094e0e165c66e36fefa9a69338b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 11:10:45 +0200 Subject: [PATCH 0931/1765] CI: install/use libvnccserver where possible For distributions shipping libvncserver >= 0.9.13 we can install the corresponding development package instead of its build dependencies. --- .ci/linux.debian.bullseye/Dockerfile | 5 +---- .ci/linux.fedora.33/Dockerfile | 5 +---- .ci/linux.fedora.34/Dockerfile | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/.ci/linux.debian.bullseye/Dockerfile b/.ci/linux.debian.bullseye/Dockerfile index d05c2eac0..a2c1f4fe6 100644 --- a/.ci/linux.debian.bullseye/Dockerfile +++ b/.ci/linux.debian.bullseye/Dockerfile @@ -9,15 +9,12 @@ RUN \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ - libjpeg-dev \ - zlib1g-dev \ + libvncserver-dev \ libssl-dev \ libpam0g-dev \ libprocps-dev \ libldap2-dev \ libsasl2-dev \ - libpng-dev \ - liblzo2-dev \ libqca-qt5-2-dev libqca-qt5-2-plugins \ && \ apt-get clean && \ diff --git a/.ci/linux.fedora.33/Dockerfile b/.ci/linux.fedora.33/Dockerfile index 78edeb5b4..e0ca56f97 100644 --- a/.ci/linux.fedora.33/Dockerfile +++ b/.ci/linux.fedora.33/Dockerfile @@ -6,13 +6,10 @@ RUN \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ - libjpeg-turbo-devel \ - zlib-devel \ - libpng-devel \ + libvncserver-devel \ openssl-devel \ pam-devel \ procps-devel \ - lzo-devel \ qca-qt5-devel qca-qt5-ossl \ cyrus-sasl-devel \ openldap-devel diff --git a/.ci/linux.fedora.34/Dockerfile b/.ci/linux.fedora.34/Dockerfile index c1af21743..c7975f415 100644 --- a/.ci/linux.fedora.34/Dockerfile +++ b/.ci/linux.fedora.34/Dockerfile @@ -6,13 +6,10 @@ RUN \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ - libjpeg-turbo-devel \ - zlib-devel \ - libpng-devel \ + libvncserver-devel \ openssl-devel \ pam-devel \ procps-devel \ - lzo-devel \ qca-qt5-devel qca-qt5-ossl \ cyrus-sasl-devel \ openldap-devel From 5075fb495b943b6feb71cdd443d5492d856460c9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 11:26:41 +0200 Subject: [PATCH 0932/1765] CI: Fedora: use dnf instead of yum --- .ci/linux.fedora.33/Dockerfile | 3 ++- .ci/linux.fedora.34/Dockerfile | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.ci/linux.fedora.33/Dockerfile b/.ci/linux.fedora.33/Dockerfile index e0ca56f97..593970937 100644 --- a/.ci/linux.fedora.33/Dockerfile +++ b/.ci/linux.fedora.33/Dockerfile @@ -2,7 +2,8 @@ FROM fedora:33 MAINTAINER Tobias Junghans RUN \ - yum install -y git gcc-c++ ninja-build cmake rpm-build fakeroot \ + dnf install -y --setopt=install_weak_deps=False \ + git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ diff --git a/.ci/linux.fedora.34/Dockerfile b/.ci/linux.fedora.34/Dockerfile index c7975f415..acdbff874 100644 --- a/.ci/linux.fedora.34/Dockerfile +++ b/.ci/linux.fedora.34/Dockerfile @@ -2,7 +2,8 @@ FROM fedora:34 MAINTAINER Tobias Junghans RUN \ - yum install -y git gcc-c++ ninja-build cmake rpm-build fakeroot \ + dnf install -y --setopt=install_weak_deps=False \ + git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ From 4c301fcdf2ac475b7b0fbee729140579f26b92ef Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 11:44:53 +0200 Subject: [PATCH 0933/1765] Link against KF5::ItemModels instead of bundling --- .ci/common/strip-kitemmodels-sources.sh | 7 ------- .ci/linux.centos.7.9/Dockerfile | 1 + .ci/linux.centos.8.3/Dockerfile | 1 + .ci/linux.debian.bullseye/Dockerfile | 1 + .ci/linux.debian.bullseye/script.sh | 1 - .ci/linux.debian.buster/Dockerfile | 1 + .ci/linux.fedora.33/Dockerfile | 1 + .ci/linux.fedora.34/Dockerfile | 1 + .ci/linux.opensuse.15.2/Dockerfile | 1 + .ci/linux.ubuntu.bionic/Dockerfile | 1 + .ci/linux.ubuntu.focal/Dockerfile | 1 + .gitmodules | 4 ---- 3rdparty/kitemmodels | 1 - master/CMakeLists.txt | 13 ++++--------- master/src/KItemModelsIntegration.cpp | 4 ---- master/src/kitemmodels_debug.h | 7 ------- master/src/kitemmodels_export.h | 6 ------ 17 files changed, 13 insertions(+), 39 deletions(-) delete mode 100755 .ci/common/strip-kitemmodels-sources.sh delete mode 160000 3rdparty/kitemmodels delete mode 100644 master/src/KItemModelsIntegration.cpp delete mode 100644 master/src/kitemmodels_debug.h delete mode 100644 master/src/kitemmodels_export.h diff --git a/.ci/common/strip-kitemmodels-sources.sh b/.ci/common/strip-kitemmodels-sources.sh deleted file mode 100755 index 1f1fc4f07..000000000 --- a/.ci/common/strip-kitemmodels-sources.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -cd 3rdparty/kitemmodels && \ -rm -rf autotests \ - docs \ - tests - diff --git a/.ci/linux.centos.7.9/Dockerfile b/.ci/linux.centos.7.9/Dockerfile index e17247f81..9ec3f4ce4 100644 --- a/.ci/linux.centos.7.9/Dockerfile +++ b/.ci/linux.centos.7.9/Dockerfile @@ -6,6 +6,7 @@ RUN \ yum install -y centos-release-scl && \ yum install -y git devtoolset-7 ninja-build cmake3 rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebkit-devel \ + kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libjpeg-turbo-devel \ zlib-devel \ diff --git a/.ci/linux.centos.8.3/Dockerfile b/.ci/linux.centos.8.3/Dockerfile index 48f19907c..cf0932fd2 100644 --- a/.ci/linux.centos.8.3/Dockerfile +++ b/.ci/linux.centos.8.3/Dockerfile @@ -7,6 +7,7 @@ RUN \ dnf install -y https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm && \ yum install -y git gcc-c++ ninja-build cmake rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ + kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel \ diff --git a/.ci/linux.debian.bullseye/Dockerfile b/.ci/linux.debian.bullseye/Dockerfile index a2c1f4fe6..9d586b721 100644 --- a/.ci/linux.debian.bullseye/Dockerfile +++ b/.ci/linux.debian.bullseye/Dockerfile @@ -7,6 +7,7 @@ RUN \ dpkg-dev \ git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + libkf5itemmodels-dev \ xorg-dev \ libfakekey-dev \ libvncserver-dev \ diff --git a/.ci/linux.debian.bullseye/script.sh b/.ci/linux.debian.bullseye/script.sh index b93da281b..5532a9f48 100755 --- a/.ci/linux.debian.bullseye/script.sh +++ b/.ci/linux.debian.bullseye/script.sh @@ -12,7 +12,6 @@ cd $1 VERSION=$(git describe --tags --abbrev=0 | sed -e 's/^v//g') cp $2/CONTRIBUTORS . -$1/.ci/common/strip-kitemmodels-sources.sh $1/.ci/common/strip-kldap-sources.sh $1/.ci/common/strip-libvncserver-sources.sh $1/.ci/common/strip-ultravnc-sources.sh diff --git a/.ci/linux.debian.buster/Dockerfile b/.ci/linux.debian.buster/Dockerfile index 92c1090fc..de445497f 100644 --- a/.ci/linux.debian.buster/Dockerfile +++ b/.ci/linux.debian.buster/Dockerfile @@ -7,6 +7,7 @@ RUN \ dpkg-dev \ git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + libkf5itemmodels-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/.ci/linux.fedora.33/Dockerfile b/.ci/linux.fedora.33/Dockerfile index 593970937..a48965a54 100644 --- a/.ci/linux.fedora.33/Dockerfile +++ b/.ci/linux.fedora.33/Dockerfile @@ -5,6 +5,7 @@ RUN \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ + kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libvncserver-devel \ diff --git a/.ci/linux.fedora.34/Dockerfile b/.ci/linux.fedora.34/Dockerfile index acdbff874..1c4e2da67 100644 --- a/.ci/linux.fedora.34/Dockerfile +++ b/.ci/linux.fedora.34/Dockerfile @@ -5,6 +5,7 @@ RUN \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ + kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libvncserver-devel \ diff --git a/.ci/linux.opensuse.15.2/Dockerfile b/.ci/linux.opensuse.15.2/Dockerfile index f45097e9f..864425dc6 100644 --- a/.ci/linux.opensuse.15.2/Dockerfile +++ b/.ci/linux.opensuse.15.2/Dockerfile @@ -4,6 +4,7 @@ MAINTAINER Tobias Junghans RUN \ zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel libqt5-qtwebengine-devel \ + kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg8-devel \ diff --git a/.ci/linux.ubuntu.bionic/Dockerfile b/.ci/linux.ubuntu.bionic/Dockerfile index af337d6a4..4a1ca76e8 100644 --- a/.ci/linux.ubuntu.bionic/Dockerfile +++ b/.ci/linux.ubuntu.bionic/Dockerfile @@ -6,6 +6,7 @@ RUN \ apt-get install --no-install-recommends -y \ git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + libkf5itemmodels-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/.ci/linux.ubuntu.focal/Dockerfile b/.ci/linux.ubuntu.focal/Dockerfile index f029d0cd9..0a05fef3e 100644 --- a/.ci/linux.ubuntu.focal/Dockerfile +++ b/.ci/linux.ubuntu.focal/Dockerfile @@ -7,6 +7,7 @@ RUN \ dpkg-dev \ git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + libkf5itemmodels-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/.gitmodules b/.gitmodules index b499eb8f6..347671a59 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,10 +10,6 @@ [submodule "3rdparty/x11vnc"] path = 3rdparty/x11vnc url = https://github.com/veyon/x11vnc.git -[submodule "3rdparty/kitemmodels"] - path = 3rdparty/kitemmodels - url = https://invent.kde.org/frameworks/kitemmodels.git - branch = master [submodule "3rdparty/libfakekey"] path = 3rdparty/libfakekey url = https://git.yoctoproject.org/git/libfakekey diff --git a/3rdparty/kitemmodels b/3rdparty/kitemmodels deleted file mode 160000 index 328eac84b..000000000 --- a/3rdparty/kitemmodels +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 328eac84b34e5dd44316469942732e51d13a2182 diff --git a/master/CMakeLists.txt b/master/CMakeLists.txt index 04aa660d3..04c1b46d1 100644 --- a/master/CMakeLists.txt +++ b/master/CMakeLists.txt @@ -1,13 +1,7 @@ include(BuildVeyonApplication) include(WindowsBuildHelpers) -set(kitemmodels_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/kitemmodels/src/core) -set(kitemmodels_SOURCES - ${kitemmodels_SOURCE_DIR}/kextracolumnsproxymodel.cpp - ${kitemmodels_SOURCE_DIR}/krecursivefilterproxymodel.cpp - ${kitemmodels_SOURCE_DIR}/kextracolumnsproxymodel.h - ${kitemmodels_SOURCE_DIR}/krecursivefilterproxymodel.h - ) +find_package(KF5ItemModels REQUIRED) file(GLOB master_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.*) @@ -17,8 +11,9 @@ if(VEYON_DEBUG) endif() set(master_RESOURCES ${master_RESOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/qml/qml.qrc) -build_veyon_application(veyon-master ${master_SOURCES} ${master_RESOURCES} ${kitemmodels_SOURCES}) -target_include_directories(veyon-master PRIVATE ${kitemmodels_SOURCE_DIR}) +build_veyon_application(veyon-master ${master_SOURCES} ${master_RESOURCES}) + +target_link_libraries(veyon-master KF5::ItemModels) add_windows_resource(veyon-master) make_graphical_app(veyon-master) diff --git a/master/src/KItemModelsIntegration.cpp b/master/src/KItemModelsIntegration.cpp deleted file mode 100644 index 4618c2595..000000000 --- a/master/src/KItemModelsIntegration.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "kitemmodels_debug.h" - -Q_LOGGING_CATEGORY(KITEMMODELS_LOG, "kf5.kitemmodels"); - diff --git a/master/src/kitemmodels_debug.h b/master/src/kitemmodels_debug.h deleted file mode 100644 index b637c7582..000000000 --- a/master/src/kitemmodels_debug.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include -#include - -Q_DECLARE_LOGGING_CATEGORY(KITEMMODELS_LOG); - diff --git a/master/src/kitemmodels_export.h b/master/src/kitemmodels_export.h deleted file mode 100644 index 5b36302f0..000000000 --- a/master/src/kitemmodels_export.h +++ /dev/null @@ -1,6 +0,0 @@ -#include - -#define KITEMMODELS_EXPORT -#define KITEMMODELS_ENABLE_DEPRECATED_SINCE(x, y) QT_VERSION < QT_VERSION_CHECK(5, 10, 0) -#define KITEMMODELS_BUILD_DEPRECATED_SINCE KITEMMODELS_ENABLE_DEPRECATED_SINCE -#define KITEMMODELS_DEPRECATED_VERSION(x, y, z) From 65c6ff2c7c4f8b381de7d4f2c03cb3029ddb7d0b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 12:00:53 +0200 Subject: [PATCH 0934/1765] CI: create release builds for tags only Speed up regular builds by creating debug builds only. --- .ci/common/linux-build.sh | 10 +++++++++- CMakeLists.txt | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.ci/common/linux-build.sh b/.ci/common/linux-build.sh index 587742cb7..31da81b49 100755 --- a/.ci/common/linux-build.sh +++ b/.ci/common/linux-build.sh @@ -8,7 +8,15 @@ BUILD=$2 mkdir -p $BUILD cd $BUILD -cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=/usr -DWITH_LTO=ON $CMAKE_FLAGS $SRC +if [ ! -z "$CI_COMMIT_TAG" -o ! -z "$TRAVIS_TAG" ] ; then + BUILD_TYPE="RelWithDebInfo" + LTO="ON" +else + BUILD_TYPE="Debug" + LTO="OFF" +fi + +cmake -G Ninja -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=/usr -DWITH_LTO=$LTO $CMAKE_FLAGS $SRC if [ -z "$3" ] ; then ninja diff --git a/CMakeLists.txt b/CMakeLists.txt index eb16fbc61..c685e38ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,8 @@ endif() if(VEYON_DEBUG) add_definitions(-DVEYON_DEBUG) +else() + add_definitions(-D_FORTIFY_SOURCE=2) endif() set(CMAKE_EXPORT_COMPILE_COMMANDS 1) @@ -258,7 +260,6 @@ endif() add_definitions( -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050e00 - -D_FORTIFY_SOURCE=2 -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_BYTEARRAY From 8b9ecaea5034f156c686cd5aee5a0fbf6f741ce5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 13:42:10 +0200 Subject: [PATCH 0935/1765] CI: switch to Focal --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9320a6d07..5a29b7edc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ services: - docker git: depth: false -dist: bionic +dist: focal sudo: required matrix: include: From b669c1a7f0b14f6e0e85a9f73e89649ae866d1c9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 13:56:03 +0200 Subject: [PATCH 0936/1765] CI: install cmake from buster-backports Improves build times by using PCH and unity builds. --- .ci/linux.debian.buster/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.ci/linux.debian.buster/Dockerfile b/.ci/linux.debian.buster/Dockerfile index de445497f..2f8d3f7cd 100644 --- a/.ci/linux.debian.buster/Dockerfile +++ b/.ci/linux.debian.buster/Dockerfile @@ -2,10 +2,11 @@ FROM debian:buster MAINTAINER Tobias Junghans RUN \ + echo "deb http://deb.debian.org/debian buster-backports main" >> /etc/apt/sources.list && \ apt-get update && \ apt-get install --no-install-recommends -y \ dpkg-dev \ - git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ + git binutils gcc g++ ninja-build cmake/buster-backports rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ libkf5itemmodels-dev \ xorg-dev \ From 0bbf65971784cf62033b2b5df5ace078279be15d Mon Sep 17 00:00:00 2001 From: Egor Ignatov Date: Fri, 14 May 2021 08:55:10 +0300 Subject: [PATCH 0937/1765] LinuxUserFunctions: fix login key sequence selection Use default key sequence when configuration is empty --- plugins/platform/linux/LinuxUserFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 88106ac17..1010cf20c 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -301,7 +301,7 @@ bool LinuxUserFunctions::performLogon( const QString& username, const Password& auto sequence = LinuxPlatformConfiguration( &VeyonCore::config() ).userLoginKeySequence(); - if( sequence.isEmpty() == false ) + if( sequence.isEmpty() == true ) { sequence = QStringLiteral("%username%%password%"); } From 365a59b3362ae39190b4d96212e8198bf9febc7f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 15:32:18 +0200 Subject: [PATCH 0938/1765] cmake: WindowsInstaller: add libKF5ItemModels.dll --- cmake/modules/WindowsInstaller.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/modules/WindowsInstaller.cmake b/cmake/modules/WindowsInstaller.cmake index bde297f96..9b40f215a 100644 --- a/cmake/modules/WindowsInstaller.cmake +++ b/cmake/modules/WindowsInstaller.cmake @@ -25,6 +25,7 @@ add_custom_target(windows-binaries COMMAND mv ${WINDOWS_INSTALL_FILES}/plugins/vnchooks.dll ${WINDOWS_INSTALL_FILES} COMMAND mkdir -p ${WINDOWS_INSTALL_FILES}/translations COMMAND cp translations/*qm ${WINDOWS_INSTALL_FILES}/translations/ + COMMAND cp ${DLLDIR}/libKF5ItemModels.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libjpeg-62.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libpng16-16.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libcrypto-1_1*.dll ${DLLDIR}/libssl-1_1*.dll ${WINDOWS_INSTALL_FILES} From 9df87b5a756e723582e003b4ddf42883041a78d8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 10 May 2021 15:46:59 +0200 Subject: [PATCH 0939/1765] cmake: MinGWCrossCompile: drop unused statements --- cmake/modules/MinGWCrossCompile.cmake | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cmake/modules/MinGWCrossCompile.cmake b/cmake/modules/MinGWCrossCompile.cmake index 15b6141f4..b9161a9be 100644 --- a/cmake/modules/MinGWCrossCompile.cmake +++ b/cmake/modules/MinGWCrossCompile.cmake @@ -30,7 +30,3 @@ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_INCLUDE_PATH ${MINGW_PREFIX}/include) - -INCLUDE_DIRECTORIES(${MINGW_PREFIX}/include) -LINK_DIRECTORIES(${MINGW_PREFIX}/lib) - From 7cb7a0662a4ac572286358f47f0fd8f7631d52a4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 May 2021 15:01:38 +0200 Subject: [PATCH 0940/1765] ComputerControlInterface: add nullptr checks If the computer's host address is empty in start(), m_vncConnection remains nullptr. Closes #729. --- core/src/ComputerControlInterface.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 553f97f03..56b12fa28 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -134,14 +134,19 @@ void ComputerControlInterface::stop() bool ComputerControlInterface::hasValidFramebuffer() const { - return m_vncConnection->hasValidFramebuffer(); + return m_vncConnection && m_vncConnection->hasValidFramebuffer(); } QSize ComputerControlInterface::screenSize() const { - return m_vncConnection->image().size(); + if( m_vncConnection ) + { + return m_vncConnection->image().size(); + } + + return {}; } From c46acbca27ecac76834f3f6c7a2ca5846b2c6174 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 May 2021 15:05:52 +0200 Subject: [PATCH 0941/1765] CCLM: indicate invalid/empty host address in tooltip --- master/src/ComputerControlListModel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 4ebc07199..8d53a52ea 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -450,7 +450,9 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte { const QString state( computerStateDescription( controlInterface ) ); const QString location( tr( "Location: %1" ).arg( controlInterface->computer().location() ) ); - const QString host( tr( "Host/IP address: %1" ).arg( controlInterface->computer().hostAddress() ) ); + const QString host( tr( "Host/IP address: %1" ).arg( controlInterface->computer().hostAddress().isEmpty() + ? QStringLiteral("<%1>").arg( tr("invalid") ) + : controlInterface->computer().hostAddress() ) ); const QString user( loggedOnUserInformation( controlInterface ) ); const QString features( tr( "Active features: %1" ).arg( activeFeatures( controlInterface ) ) ); From 04208c0715ec0c58f300e18357340d3e28c9f0ce Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 20 May 2021 13:48:44 +0200 Subject: [PATCH 0942/1765] LDAP: add support for nested user groups (AD only) By adding the AD-specific LDAP_MATCHING_RULE_IN_CHAIN search filter rule we can support nested user groups easily. This is useful for access control where it's now possible to specify top-level user groups which certain users only indirect are members of. For compatibility reasons this option is disabled per default so there are no security implications when upgrading. --- plugins/ldap/common/LdapConfiguration.h | 1 + plugins/ldap/common/LdapConfigurationPage.ui | 19 ++++++++++++++++++- plugins/ldap/common/LdapDirectory.cpp | 7 +++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index c81496dbb..5c024dce4 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -56,6 +56,7 @@ OP( LdapConfiguration, m_configuration, QString, usersFilter, setUsersFilter, "UsersFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, userGroupsFilter, setUserGroupsFilter, "UserGroupsFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, computersFilter, setComputersFilter, "ComputersFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ + OP( LdapConfiguration, m_configuration, bool, queryNestedUserGroups, setQueryNestedUserGroups, "QueryNestedUserGroups", "LDAP", false, Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, bool, identifyGroupMembersByNameAttribute, setIdentifyGroupMembersByNameAttribute, "IdentifyGroupMembersByNameAttribute", "LDAP", false, Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, computerGroupsFilter, setComputerGroupsFilter, "ComputerGroupsFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, computerContainersFilter, setComputerContainersFilter, "ComputerContainersFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ diff --git a/plugins/ldap/common/LdapConfigurationPage.ui b/plugins/ldap/common/LdapConfigurationPage.ui index d894250fb..869e54f23 100644 --- a/plugins/ldap/common/LdapConfigurationPage.ui +++ b/plugins/ldap/common/LdapConfigurationPage.ui @@ -829,6 +829,22 @@ + + + + Query options + + + + + + Query nested user groups (supported by AD only) + + + + + + @@ -1071,6 +1087,7 @@ testComputersFilter testComputerGroupsFilter testComputerContainersFilter + queryNestedUserGroups identifyGroupMembersByDN identifyGroupMembersByNameAttribute computerLocationsByGroups @@ -1362,8 +1379,8 @@ - + diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index f6ebd7aea..fa9ed0c79 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -43,6 +43,13 @@ LdapDirectory::LdapDirectory( const LdapConfiguration& configuration, QObject* p m_userLoginNameAttribute = m_configuration.userLoginNameAttribute(); m_groupMemberAttribute = m_configuration.groupMemberAttribute(); + + if( m_configuration.queryNestedUserGroups() && + m_groupMemberAttribute.contains( QLatin1Char(':') ) == false ) + { + m_groupMemberAttribute.append( QLatin1String(":1.2.840.113556.1.4.1941:") ); + } + m_computerDisplayNameAttribute = m_configuration.computerDisplayNameAttribute(); m_computerHostNameAttribute = m_configuration.computerHostNameAttribute(); m_computerHostNameAsFQDN = m_configuration.computerHostNameAsFQDN(); From 261da3aa5d29ed0c111c3c3bee27558f4499a45a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 May 2021 09:38:22 +0200 Subject: [PATCH 0943/1765] AuthKeys: make import fail with file as 1st arg Since the target key name has to be specified first, make sure, no filename is passed instead accidentally. Closes #342. --- plugins/authkeys/AuthKeysPlugin.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index d1dd9ec8c..dd81b44d9 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -400,6 +401,12 @@ CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_import( const QStri return NotEnoughArguments; } + if( QFileInfo::exists( arguments[0] ) ) + { + error( tr( "Please specify the key name (e.g. \"teacher/public\") as the first argument." ) ); + return InvalidArguments; + } + const auto nameAndType = arguments[0].split( QLatin1Char('/') ); const auto name = nameAndType.value( 0 ); const auto type = nameAndType.value( 1 ); From b3b7bee836fc23e0872a4bafeb697ebc6f4b7cc7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 26 May 2021 07:58:36 +0200 Subject: [PATCH 0944/1765] VncServer: x11vnc: fix format string issue By fixing a format string issue in x11vnc we can drop the -Wno-format compiler flags which causes problems when using -Wformat-security as additional CFLAGS when running cmake. Closes #732. --- 3rdparty/libvncserver | 2 +- 3rdparty/x11vnc | 2 +- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index 242fda806..6a34178f5 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit 242fda806d16f06890fb61339aa0a585443af8bb +Subproject commit 6a34178f50838de5eacda6a55e0af2c67e9c5875 diff --git a/3rdparty/x11vnc b/3rdparty/x11vnc index 8748e1530..c5fff1332 160000 --- a/3rdparty/x11vnc +++ b/3rdparty/x11vnc @@ -1 +1 @@ -Subproject commit 8748e153054b65e30c2c7df2cb556c5a721bb5c3 +Subproject commit c5fff1332391d957aa27aed564723ff981c1c7b8 diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 9df42c16e..a4cbfda3e 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -201,7 +201,7 @@ set(x11vnc_SOURCES x11vnc-veyon.c ${x11vnc_DIR}/src/uinput.c ) -set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-format -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros") +set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros") endif() From 7d58ba1196c70c58e82cb06eb7c53e81b677bf5b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 26 May 2021 19:49:45 +0200 Subject: [PATCH 0945/1765] CI: move Linux build jobs to GitLab CI --- .ci/linux.debian.bullseye/script.sh | 2 +- .gitlab-ci.yml | 34 +++++++++++++++++++++++++++-- .travis.yml | 20 ----------------- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/.ci/linux.debian.bullseye/script.sh b/.ci/linux.debian.bullseye/script.sh index 5532a9f48..fcc9b8c7e 100755 --- a/.ci/linux.debian.bullseye/script.sh +++ b/.ci/linux.debian.bullseye/script.sh @@ -17,7 +17,7 @@ $1/.ci/common/strip-libvncserver-sources.sh $1/.ci/common/strip-ultravnc-sources.sh $1/.ci/common/strip-x11vnc-sources.sh -cd / +cd .. tar --transform "s,^veyon,veyon-$VERSION," --exclude=".git" --exclude="*.deb" -cjf $2/veyon-$VERSION-src.tar.bz2 veyon mv -v $2/*.tar.bz2 $1 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index adece8895..a1b123e72 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,27 @@ -image: docker:latest - stages: - build + - collect + +build-linux: + stage: build + image: veyon/ci.linux.$DISTRO:latest + script: + - .ci/linux.$DISTRO/script.sh $CI_PROJECT_DIR /tmp + parallel: + matrix: + - DISTRO: + - centos.7.9 + - centos.8.3 + - debian.buster + - debian.bullseye + - fedora.33 + - fedora.34 + - opensuse.15.2 + - ubuntu.bionic + - ubuntu.focal + artifacts: + paths: [ "veyon*" ] + expire_in: 1 day build-windows: stage: build @@ -15,5 +35,15 @@ build-windows: paths: [ veyon-win* ] expire_in: 1 day +collect-artifacts: + stage: collect + image: veyon/ci.linux.debian.buster:latest + dependencies: [ build-linux ] + only: [ tags ] + script: + - ls -la *.deb *.rpm + artifacts: + paths: [ "veyon*" ] + variables: GIT_SUBMODULE_STRATEGY: recursive diff --git a/.travis.yml b/.travis.yml index 5a29b7edc..bf897d95a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,27 +7,7 @@ dist: focal sudo: required matrix: include: - - env: TARGET_OS=centos.7.9 - - env: TARGET_OS=centos.8.3 - env: TARGET_OS=debian.buster - - env: TARGET_OS=debian.bullseye - - env: TARGET_OS=fedora.33 - - env: TARGET_OS=fedora.34 - - env: TARGET_OS=opensuse.15.2 - - env: TARGET_OS=ubuntu.bionic - - env: TARGET_OS=ubuntu.focal - - env: TARGET_OS=sast script: - docker pull veyon/ci.${TRAVIS_OS_NAME}.${TARGET_OS}:latest || docker build -t veyon/ci.${TRAVIS_OS_NAME}.${TARGET_OS} ${TRAVIS_BUILD_DIR}/.ci/${TRAVIS_OS_NAME}.${TARGET_OS}/ - docker run -v ${TRAVIS_BUILD_DIR}:/veyon:rw veyon/ci.${TRAVIS_OS_NAME}.${TARGET_OS} /bin/sh /veyon/.ci/${TRAVIS_OS_NAME}.${TARGET_OS}/script.sh /veyon /build -deploy: - provider: releases - api_key: - secure: Hvax0pT56HkHHDFhNnCoMIxhTCRZ2eHSK1kf0Lw91pX/UPsexkhtFm9qck2siyyAW5IDaXMWCvbJmD5f8TXNZV5d65NQ9lc0OtUdl/os6Te3LhIbNjdywKQQknWkZxoX+blXr1VCoRUjvruxwt2Q9yIjMJn40cMh8bnQPAx1VNdCAiGNSIb8vFBmTbv9a6GTkQ3xHjlSrtCXoeq3/AZ3OqrRtXLe5uS+TquZBZv4gS908+TaveSfRUBVFB/XPvNKHVdFPYSkQUz3i0k+/ZV+7gWGEHLk2nXcKRe+6tjrsQyhvqTbyOUiQxjsWHHW0dql67ZFmvQR31RM6l/IO3QhBNu1Qotu7IyxKExE7Wn5+RiyLYOA80RoyK09uAJA7T/MyvoY2QH1dWYQEi6kJQdK7A/g51zJJosILaZuokvmF19cjTu7MC0eMkAhhTWB79JRBLg+6DOskCesWfFf7xuCqt4XqONOjWb2N1vSgH0EkkAN4w2jlO/utX9f2bQTC6sOgW57V+/1yD7rKAj0QdI+eJSuuR0azId+UtBEaSefIuGhR7qw+vQ/GZQ27uz4GZ2NalD1mp0wt0wfx+p2TW2XC03uMO1j2ZY3ve8wT+sFlbEMKmwxC3ObRpM14ez2/EIAotauZ0HKDRm/AzvpShz8o9geChxZTuez06frt6Zx7fo= - repo: veyon/veyon - skip_cleanup: true - file_glob: true - file: "veyon*" - on: - tags: true - all_branches: true From 1cc76ac5650d21b94678b50a10b9545b0ee8daab Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 27 May 2021 14:22:55 +0200 Subject: [PATCH 0946/1765] CI: install ca-certificates --- .ci/linux.debian.bullseye/Dockerfile | 2 +- .ci/linux.debian.buster/Dockerfile | 2 +- .ci/linux.ubuntu.focal/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/linux.debian.bullseye/Dockerfile b/.ci/linux.debian.bullseye/Dockerfile index 9d586b721..7a3103ada 100644 --- a/.ci/linux.debian.bullseye/Dockerfile +++ b/.ci/linux.debian.bullseye/Dockerfile @@ -5,7 +5,7 @@ RUN \ apt-get update && \ apt-get install --no-install-recommends -y \ dpkg-dev \ - git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ + ca-certificates git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ libkf5itemmodels-dev \ xorg-dev \ diff --git a/.ci/linux.debian.buster/Dockerfile b/.ci/linux.debian.buster/Dockerfile index 2f8d3f7cd..21a8ca93f 100644 --- a/.ci/linux.debian.buster/Dockerfile +++ b/.ci/linux.debian.buster/Dockerfile @@ -6,7 +6,7 @@ RUN \ apt-get update && \ apt-get install --no-install-recommends -y \ dpkg-dev \ - git binutils gcc g++ ninja-build cmake/buster-backports rename file fakeroot bzip2 \ + ca-certificates git binutils gcc g++ ninja-build cmake/buster-backports rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ libkf5itemmodels-dev \ xorg-dev \ diff --git a/.ci/linux.ubuntu.focal/Dockerfile b/.ci/linux.ubuntu.focal/Dockerfile index 0a05fef3e..ca4f40f35 100644 --- a/.ci/linux.ubuntu.focal/Dockerfile +++ b/.ci/linux.ubuntu.focal/Dockerfile @@ -5,7 +5,7 @@ RUN \ apt-get update && \ DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ dpkg-dev \ - git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ + ca-certificates git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ libkf5itemmodels-dev \ xorg-dev \ From 02680f4cd79e4e9938aa6683f4d8f7ff455b9ef9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 27 May 2021 14:35:41 +0200 Subject: [PATCH 0947/1765] BuiltinUltraVncServer: silence compiler warning --- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 2 +- plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index 77a28286e..c306d3351 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -97,7 +97,7 @@ if(VEYON_BUILD_WIN64) target_compile_definitions(builtin-ultravnc-server PRIVATE _X64) endif() -set(ULTRAVNC_COMPILER_FLAGS "-Wno-comments -Wno-attributes -Wno-write-strings -Wno-parentheses -Wno-misleading-indentation -Wno-unused-result -Wno-unused-label -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-format-zero-length -Wno-sign-compare -fexceptions") +set(ULTRAVNC_COMPILER_FLAGS "-Wno-comments -Wno-attributes -Wno-write-strings -Wno-parentheses -Wno-misleading-indentation -Wno-unused-result -Wno-unused-label -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-format-zero-length -Wno-sign-compare -Wno-int-to-pointer-cast -fexceptions") set_source_files_properties(${ultravnc_C_SOURCES} PROPERTIES COMPILE_FLAGS "${ULTRAVNC_COMPILER_FLAGS}") set_source_files_properties(${ultravnc_CXX_SOURCES} PROPERTIES COMPILE_FLAGS "${ULTRAVNC_COMPILER_FLAGS} -Wno-terminate -Wno-conversion-null") diff --git a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt index 223221cb8..fef65989e 100644 --- a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt @@ -15,7 +15,7 @@ set_source_files_properties(${vnchooks_SOURCES} PROPERTIES SKIP_UNITY_BUILD_INCL target_compile_options(vnchooks PRIVATE ${VEYON_COMPILE_OPTIONS}) set_default_target_properties(vnchooks) set_target_properties(vnchooks PROPERTIES PREFIX "") -set_target_properties(vnchooks PROPERTIES COMPILE_FLAGS "-Wno-write-strings -Wno-unused-variable -Wno-unknown-pragmas") +set_target_properties(vnchooks PROPERTIES COMPILE_FLAGS "-Wno-write-strings -Wno-unused-variable -Wno-unknown-pragmas -Wno-int-to-pointer-cast") set_target_properties(vnchooks PROPERTIES LINK_FLAGS -Wl,-export-all-symbols) target_link_libraries(vnchooks -ladvapi32) From 8aff0d4ed4c3a14727e5cc04cb2458185d2f67d1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 27 May 2021 14:27:37 +0200 Subject: [PATCH 0948/1765] cmake: update path to GCC 10 DLLs --- CMakeLists.txt | 4 ---- cmake/modules/WindowsInstaller.cmake | 5 +++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c685e38ee..f52c40724 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,10 +93,6 @@ else() string(REPLACE "v" "" VERSION_STRING "${VERSION_STRING}") endif() -# set up compiler version variable -string(REGEX REPLACE "\\.[0-9]$" "" COMPILER_VERSION_MAJOR_MINOR ${CMAKE_CXX_COMPILER_VERSION}) - - # set up basic platform variables if(WIN32) set(VEYON_BUILD_WIN32 1) diff --git a/cmake/modules/WindowsInstaller.cmake b/cmake/modules/WindowsInstaller.cmake index 9b40f215a..a255061d6 100644 --- a/cmake/modules/WindowsInstaller.cmake +++ b/cmake/modules/WindowsInstaller.cmake @@ -2,12 +2,13 @@ set(WINDOWS_INSTALL_FILES "veyon-${MINGW_PLATFORM}-${VERSION_MAJOR}.${VERSION_MI set(DLLDIR "${MINGW_PREFIX}/bin") set(DLLDIR_LIB "${MINGW_PREFIX}/lib") -set(DLLDIR_GCC "/usr/lib/gcc/${MINGW_TARGET}/${COMPILER_VERSION_MAJOR_MINOR}-posix") +string(REGEX MATCH "^[^.]+" GCC_VERSION_MAJOR ${CMAKE_CXX_COMPILER_VERSION}) +set(DLLDIR_GCC "/usr/lib/gcc/${MINGW_TARGET}/${GCC_VERSION_MAJOR}-posix") if(VEYON_BUILD_WIN64) set(DLL_GCC "libgcc_s_seh-1.dll") set(DLL_DDENGINE "ddengine64.dll") else() - set(DLL_GCC "libgcc_s_sjlj-1.dll") + set(DLL_GCC "libgcc_s_dw2-1.dll") set(DLL_DDENGINE "ddengine.dll") endif() From 21e691ea2b657bc5c22dcc63c6b9909c149c1b7c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 27 May 2021 15:03:31 +0200 Subject: [PATCH 0949/1765] Always call VeyonCore::setupAppParams() in main() --- cli/src/main.cpp | 2 ++ core/src/VeyonCore.cpp | 2 -- server/src/main.cpp | 2 ++ service/src/main.cpp | 2 ++ worker/src/main.cpp | 2 ++ 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cli/src/main.cpp b/cli/src/main.cpp index c9618c4f6..aa18cc377 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -34,6 +34,8 @@ int main( int argc, char **argv ) { + VeyonCore::setupApplicationParameters(); + QCoreApplication* app = nullptr; #ifdef Q_OS_LINUX diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 69973fe80..0bd042061 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -78,8 +78,6 @@ VeyonCore::VeyonCore( QCoreApplication* application, Component component, const s_instance = this; - setupApplicationParameters(); - initPlatformPlugin(); initConfiguration(); diff --git a/server/src/main.cpp b/server/src/main.cpp index 4b9b7a64b..78860c670 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -30,6 +30,8 @@ int main( int argc, char **argv ) { + VeyonCore::setupApplicationParameters(); + #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QGuiApplication::setAttribute( Qt::AA_EnableHighDpiScaling ); #endif diff --git a/service/src/main.cpp b/service/src/main.cpp index c1867a1b3..d4a55cbbd 100644 --- a/service/src/main.cpp +++ b/service/src/main.cpp @@ -29,6 +29,8 @@ int main( int argc, char** argv ) { + VeyonCore::setupApplicationParameters(); + QCoreApplication app( argc, argv ); VeyonCore core( &app, VeyonCore::Component::Service, QStringLiteral("Service") ); diff --git a/worker/src/main.cpp b/worker/src/main.cpp index 12fa61589..12dbece27 100644 --- a/worker/src/main.cpp +++ b/worker/src/main.cpp @@ -29,6 +29,8 @@ int main( int argc, char **argv ) { + VeyonCore::setupApplicationParameters(); + QApplication app( argc, argv ); QApplication ::setWindowIcon( QIcon( QStringLiteral(":/core/icon64.png") ) ); From 5ee117e01481b573ac0efc13f7616677ce4898bc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 27 May 2021 14:23:18 +0200 Subject: [PATCH 0950/1765] CI: add GitHub Actions --- .github/workflows/build.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..3969c2109 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,18 @@ +on: [push] +jobs: + build-linux: + strategy: + matrix: + dist: + - centos.8.3 + - debian.buster + - fedora.34 + - opensuse.15.2 + - ubuntu.focal + runs-on: ubuntu-latest + container: veyon/ci.linux.${{matrix.dist}} + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - run: .ci/linux.${{matrix.dist}}/script.sh $GITHUB_WORKSPACE /tmp From 8b0cd7fcf8a1419d4402c2bdd9eedebf05739a96 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 May 2021 10:47:45 +0200 Subject: [PATCH 0951/1765] CI: install make on CentOS 8.3 It's required by GCC 8 for parallel LTO. --- .ci/linux.centos.8.3/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/linux.centos.8.3/Dockerfile b/.ci/linux.centos.8.3/Dockerfile index cf0932fd2..6d6f525cd 100644 --- a/.ci/linux.centos.8.3/Dockerfile +++ b/.ci/linux.centos.8.3/Dockerfile @@ -5,7 +5,7 @@ RUN \ yum --enablerepo=extras install -y epel-release dnf-plugins-core && \ yum config-manager --set-enabled powertools && \ dnf install -y https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm && \ - yum install -y git gcc-c++ ninja-build cmake rpm-build fakeroot \ + yum install -y git gcc-c++ make ninja-build cmake rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ From c2fbf2e25b13c53cfa22d70efea5b916c7a2b3fd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 May 2021 13:41:04 +0200 Subject: [PATCH 0952/1765] CI: drop Travis support --- .travis.yml | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index bf897d95a..000000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: cpp -services: - - docker -git: - depth: false -dist: focal -sudo: required -matrix: - include: - - env: TARGET_OS=debian.buster -script: - - docker pull veyon/ci.${TRAVIS_OS_NAME}.${TARGET_OS}:latest || docker build -t veyon/ci.${TRAVIS_OS_NAME}.${TARGET_OS} ${TRAVIS_BUILD_DIR}/.ci/${TRAVIS_OS_NAME}.${TARGET_OS}/ - - docker run -v ${TRAVIS_BUILD_DIR}:/veyon:rw veyon/ci.${TRAVIS_OS_NAME}.${TARGET_OS} /bin/sh /veyon/.ci/${TRAVIS_OS_NAME}.${TARGET_OS}/script.sh /veyon /build From 40438112c6186b30e2171a2b2f0c43c28b0bb9fa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 May 2021 13:52:51 +0200 Subject: [PATCH 0953/1765] README.md: use GitHub Actions badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9ae371270..bd607b07b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Veyon - Virtual Eye On Networks -[![Build status](https://travis-ci.com/veyon/veyon.svg?branch=master)](https://travis-ci.com/veyon/veyon) +[![.github/workflows/build.yml](https://github.com/veyon/veyon/actions/workflows/build.yml/badge.svg)](https://github.com/veyon/veyon/actions/workflows/build.yml) [![Latest stable release](https://img.shields.io/github/release/veyon/veyon.svg?maxAge=3600)](https://github.com/veyon/veyon/releases) [![Overall downloads on Github](https://img.shields.io/github/downloads/veyon/veyon/total.svg?maxAge=3600)](https://github.com/veyon/veyon/releases) [![Documentation Status](https://readthedocs.org/projects/veyon/badge/?version=latest)](https://docs.veyon.io/) From 455bbb4dd6c74762f2128bcfad2dac7ef4ce2f8e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 23 Jun 2021 10:11:48 +0200 Subject: [PATCH 0954/1765] AuthKeys: allow minus characters in key name --- plugins/authkeys/AuthKeysManager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index c74bb57b5..a3b941cfd 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -50,9 +50,10 @@ AuthKeysManager::AuthKeysManager( AuthKeysConfiguration& configuration, QObject* } + bool AuthKeysManager::isKeyNameValid( const QString& authKeyName ) { - return QRegularExpression( QStringLiteral("^\\w+$") ).match( authKeyName ).hasMatch(); + return QRegularExpression( QStringLiteral("^[\\w-]+$") ).match( authKeyName ).hasMatch(); } From 38d11a0dcf1ae5fa4ad1cd98c34486e0064ab2f2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 23 Jun 2021 15:43:37 +0200 Subject: [PATCH 0955/1765] VeyonCore: add TLS configuration support --- core/src/VeyonConfigurationProperties.h | 7 ++ core/src/VeyonCore.cpp | 110 ++++++++++++++++++++++++ core/src/VeyonCore.h | 5 +- 3 files changed, 121 insertions(+), 1 deletion(-) diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 997859804..7b52040d6 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -82,6 +82,12 @@ OP( VeyonConfiguration, VeyonCore::config(), int, logFileRotationCount, setLogFileRotationCount, "LogFileRotationCount", "Logging", Logger::DefaultFileRotationCount, Configuration::Property::Flag::Advanced ) \ OP( VeyonConfiguration, VeyonCore::config(), QString, logFileDirectory, setLogFileDirectory, "LogFileDirectory", "Logging", QLatin1String(Logger::DefaultLogFileDirectory), Configuration::Property::Flag::Standard ) \ +#define FOREACH_VEYON_TLS_CONFIG_PROPERTY(OP) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, tlsEnabled, setTlsEnabled, "Enabled", "TLS", false, Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, tlsCaCertificateFile, setTlsCaCertificateFile, "CaCertificateFile", "TLS", QString(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, tlsHostCertificateFile, setTlsHostCertificateFile, "HostCertificateFile", "TLS", QString(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, tlsHostPrivateKeyFile, setTlsHostPrivateKeyFile, "HostPrivateKeyFile", "TLS", QString(), Configuration::Property::Flag::Standard ) \ + #define FOREACH_VEYON_VNC_SERVER_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QUuid, vncServerPlugin, setVncServerPlugin, "Plugin", "VncServer", QUuid(), Configuration::Property::Flag::Standard ) \ @@ -151,6 +157,7 @@ FOREACH_VEYON_UI_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_SERVICE_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_LOGGING_CONFIG_PROPERTY(OP) \ + FOREACH_VEYON_TLS_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(OP)\ FOREACH_VEYON_FEATURES_CONFIG_PROPERTY(OP)\ FOREACH_VEYON_VNC_SERVER_CONFIG_PROPERTY(OP) \ diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 0bd042061..3127b36b2 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include "AuthenticationCredentials.h" @@ -90,6 +92,8 @@ VeyonCore::VeyonCore( QCoreApplication* application, Component component, const initCryptoCore(); + initTlsConfiguration(); + initQmlCore(); initAuthenticationCredentials(); @@ -641,3 +645,109 @@ void VeyonCore::initSystemInfo() << QSysInfo::kernelType() << QSysInfo::kernelVersion() << QSysInfo::prettyProductName() << QSysInfo::productType() << QSysInfo::productVersion(); } + + + +void VeyonCore::initTlsConfiguration() +{ + if( config().tlsEnabled() == false ) + { + return; + } + + QFile caCertFile( filesystem().expandPath( config().tlsCaCertificateFile() ) ); + + if( caCertFile.exists() == false ) + { + vCritical() << "TLS CA certificate file" << caCertFile.fileName() << "does not exist"; + return; + } + + if( caCertFile.open( QFile::ReadOnly ) == false ) + { + vCritical() << "TLS CA certificate file" << caCertFile.fileName() << "is not readable"; + return; + } + + QSslCertificate caCertificate( caCertFile.readAll() ); + if( caCertificate.isNull() ) + { + vCritical() << caCertFile.fileName() << "does not contain a valid TLS certificate"; + return; + } + + QFile hostCertFile( filesystem().expandPath( config().tlsHostCertificateFile() ) ); + + if( hostCertFile.exists() == false ) + { + vCritical() << "TLS host certificate file" << hostCertFile.fileName() << "does not exist"; + return; + } + + if( hostCertFile.open( QFile::ReadOnly ) == false ) + { + vCritical() << "TLS host certificate file" << hostCertFile.fileName() << "is not readable"; + return; + } + + QSslCertificate hostCertificate( hostCertFile.readAll() ); + if( hostCertificate.isNull() ) + { + vCritical() << hostCertFile.fileName() << "does not contain a valid TLS certificate"; + return; + } + + QFile hostPrivateKeyFile( filesystem().expandPath( config().tlsHostPrivateKeyFile() ) ); + + if( hostPrivateKeyFile.exists() == false ) + { + vCritical() << "TLS private key file" << hostPrivateKeyFile.fileName() << "does not exist"; + return; + } + + if( hostPrivateKeyFile.open( QFile::ReadOnly ) == false ) + { + vCritical() << "TLS private key file" << hostPrivateKeyFile.fileName() << "is not readable"; + return; + } + + const auto hostPrivateKeyFileData = hostPrivateKeyFile.readAll(); + + QSslKey hostPrivateKey; + for( auto algorithm : { QSsl::KeyAlgorithm::Rsa, QSsl::KeyAlgorithm::Ec +#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0) + , QSsl::KeyAlgorithm::Dh +#endif + } ) + { + QSslKey currentPrivateKey( hostPrivateKeyFileData, algorithm ); + if( currentPrivateKey.isNull() == false ) + { + hostPrivateKey = currentPrivateKey; + break; + } + } + + if( hostPrivateKey.isNull() ) + { + vCritical() << hostPrivateKeyFile.fileName() << "does contains an invalid or unsupported TLS private key"; + return; + } + + TlsConfiguration tlsConfig; + +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) + tlsConfig.setProtocol( QSsl::TlsV1_3OrLater ); +#else + tlsConfig.setProtocol( QSsl::TlsV1_2OrLater ); +#endif +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + tlsConfig.addCaCertificate( caCertificate ); +#else + tlsConfig.setCaCertificates( tlsConfig.caCertificates() + QList{caCertificate} ); +#endif + tlsConfig.setLocalCertificate( hostCertificate ); + tlsConfig.setPrivateKey( hostPrivateKey ); + + TlsConfiguration::setDefaultConfiguration( tlsConfig ); +} diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 42e452d85..8457e0e03 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -26,7 +26,6 @@ #include #include -#include #include #include @@ -43,6 +42,7 @@ #endif class QCoreApplication; +class QSslConfiguration; class QWidget; class AuthenticationCredentials; @@ -65,6 +65,8 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject { Q_OBJECT public: + using TlsConfiguration = QSslConfiguration; + enum class ApplicationVersion { Version_4_0, Version_4_1, @@ -196,6 +198,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject void initManagers(); void initLocalComputerControlInterface(); void initSystemInfo(); + void initTlsConfiguration(); static VeyonCore* s_instance; From 445d11e20e66727de7cb530da27ca8cf6b65188c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 23 Jun 2021 15:44:59 +0200 Subject: [PATCH 0956/1765] GeneralConfigurationPage: add TLS configuration options --- configurator/src/GeneralConfigurationPage.cpp | 16 ++++ configurator/src/GeneralConfigurationPage.ui | 88 ++++++++++++++++++- 2 files changed, 103 insertions(+), 1 deletion(-) diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index 7adcdeacf..1e04530d8 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -46,6 +46,20 @@ GeneralConfigurationPage::GeneralConfigurationPage( QWidget* parent ) : { ui->setupUi(this); + Configuration::UiMapping::setFlags( ui->securityGroupBox, Configuration::Property::Flag::Advanced ); + + connect( ui->browseTlsCaCertificateFile, &QAbstractButton::clicked, this, [this]() { + FileSystemBrowser( FileSystemBrowser::ExistingFile ).exec( ui->tlsCaCertificateFile ); + } ); + + connect( ui->browseTlsHostCertificateFile, &QAbstractButton::clicked, this, [this]() { + FileSystemBrowser( FileSystemBrowser::ExistingFile ).exec( ui->tlsHostCertificateFile ); + } ); + + connect( ui->browseTlsHostPrivateKeyFile, &QAbstractButton::clicked, this, [this]() { + FileSystemBrowser( FileSystemBrowser::ExistingFile ).exec( ui->tlsHostPrivateKeyFile ); + } ); + // retrieve list of builtin translations and populate language combobox QStringList languages; const auto qmFiles = QDir( VeyonCore::translationsDirectory() ).entryList( { QStringLiteral("veyon*.qm") } ); @@ -88,6 +102,7 @@ void GeneralConfigurationPage::resetWidgets() FOREACH_VEYON_UI_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); FOREACH_VEYON_LOGGING_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); + FOREACH_VEYON_TLS_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); } @@ -97,6 +112,7 @@ void GeneralConfigurationPage::connectWidgetsToProperties() FOREACH_VEYON_UI_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); FOREACH_VEYON_LOGGING_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); + FOREACH_VEYON_TLS_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); } diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index 24c48710e..8438ca15f 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -2,7 +2,7 @@ GeneralConfigurationPage - + 0 @@ -281,6 +281,85 @@ + + + + Security + + + + + + Host certificate file + + + + + + + ... + + + + :/core/document-open.png:/core/document-open.png + + + + + + + CA certificate file + + + + + + + + + + Enable TLS for network connections + + + + + + + Host private key file + + + + + + + ... + + + + :/core/document-open.png:/core/document-open.png + + + + + + + ... + + + + :/core/document-open.png:/core/document-open.png + + + + + + + + + + + + @@ -311,6 +390,13 @@ logToStdErr logToSystem clearLogFiles + tlsEnabled + tlsCaCertificateFile + browseTlsCaCertificateFile + tlsHostCertificateFile + browseTlsHostCertificateFile + tlsHostPrivateKeyFile + browseTlsHostPrivateKeyFile From cdb553865a890e0c5a3d922302fcec7ec2d52abd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 23 Jun 2021 15:45:54 +0200 Subject: [PATCH 0957/1765] server: cmake: don't use file globbing --- server/CMakeLists.txt | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index f6810cb5c..255029301 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -1,9 +1,26 @@ include(BuildVeyonApplication) include(WindowsBuildHelpers) -file(GLOB server_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.*) - -build_veyon_application(veyon-server ${server_SOURCES}) +build_veyon_application(veyon-server + src/ComputerControlClient.cpp + src/ComputerControlClient.h + src/ComputerControlServer.cpp + src/ComputerControlServer.h + src/main.cpp + src/ServerAccessControlManager.cpp + src/ServerAccessControlManager.h + src/ServerAuthenticationManager.cpp + src/ServerAuthenticationManager.h + src/VeyonServerProtocol.cpp + src/VeyonServerProtocol.h + src/VncProxyConnection.cpp + src/VncProxyConnectionFactory.h + src/VncProxyConnection.h + src/VncProxyServer.cpp + src/VncProxyServer.h + src/VncServer.cpp + src/VncServer.h + ) add_windows_resource(veyon-server) make_graphical_app(veyon-server) From 429ce87003e768c00837d12c401404863148763c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 23 Jun 2021 15:46:38 +0200 Subject: [PATCH 0958/1765] server: add TlsServer --- server/CMakeLists.txt | 2 + server/src/TlsServer.cpp | 80 ++++++++++++++++++++++++++++++++++++++++ server/src/TlsServer.h | 48 ++++++++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 server/src/TlsServer.cpp create mode 100644 server/src/TlsServer.h diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 255029301..0581adb28 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -11,6 +11,8 @@ build_veyon_application(veyon-server src/ServerAccessControlManager.h src/ServerAuthenticationManager.cpp src/ServerAuthenticationManager.h + src/TlsServer.cpp + src/TlsServer.h src/VeyonServerProtocol.cpp src/VeyonServerProtocol.h src/VncProxyConnection.cpp diff --git a/server/src/TlsServer.cpp b/server/src/TlsServer.cpp new file mode 100644 index 000000000..ddb461d6d --- /dev/null +++ b/server/src/TlsServer.cpp @@ -0,0 +1,80 @@ +/* + * TlsServer.cpp - header file for TlsServer + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include + +#include "TlsServer.h" + + +TlsServer::TlsServer( const VeyonCore::TlsConfiguration& tlsConfig, QObject* parent ) : + QTcpServer( parent ), + m_tlsConfig( tlsConfig ) +{ +} + + + +void TlsServer::incomingConnection( qintptr socketDescriptor ) +{ + if( m_tlsConfig.isNull() ) + { + auto socket = new QTcpSocket; + if( socket->setSocketDescriptor(socketDescriptor) ) + { + addPendingConnection( socket ); + } + else + { + delete socket; + } + } + else + { + auto socket = new QSslSocket; + if( socket->setSocketDescriptor(socketDescriptor) ) + { + connect(socket, &QSslSocket::encrypted, this, []() { + qCritical() << "connected"; } ); + + connect(socket, QOverload&>::of(&QSslSocket::sslErrors), + [this, socket]( const QList &errors) { + for( const auto& err : errors ) + { + vCritical() << err; + } + + Q_EMIT tlsErrors( socket, errors ); + } ); + + socket->setSslConfiguration( m_tlsConfig ); + socket->startServerEncryption(); + + addPendingConnection( socket ); + } + else + { + delete socket; + } + } +} diff --git a/server/src/TlsServer.h b/server/src/TlsServer.h new file mode 100644 index 000000000..db12d6f4d --- /dev/null +++ b/server/src/TlsServer.h @@ -0,0 +1,48 @@ +/* + * TlsServer.h - header file for TlsServer + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include +#include + +#include "VeyonCore.h" + +class TlsServer : public QTcpServer +{ + Q_OBJECT +public: + TlsServer( const VeyonCore::TlsConfiguration& tlsConfig, QObject* parent = nullptr ); + ~TlsServer() override = default; + +protected: + void incomingConnection( qintptr socketDescriptor ) override; + +private: + VeyonCore::TlsConfiguration m_tlsConfig; + +Q_SIGNALS: + void tlsErrors( QSslSocket* socket, const QList& errors ); + +} ; From 2259fd9aab2c7bd366cedf70e5fe4986c88a9f5f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 23 Jun 2021 15:47:56 +0200 Subject: [PATCH 0959/1765] VncProxyServer: use TlsServer --- server/src/VncProxyServer.cpp | 4 ++-- server/src/VncProxyServer.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/src/VncProxyServer.cpp b/server/src/VncProxyServer.cpp index 8ebbf5676..3ffcfb1c7 100644 --- a/server/src/VncProxyServer.cpp +++ b/server/src/VncProxyServer.cpp @@ -22,9 +22,9 @@ * */ -#include #include +#include "TlsServer.h" #include "VeyonCore.h" #include "VncProxyServer.h" #include "VncProxyConnection.h" @@ -38,7 +38,7 @@ VncProxyServer::VncProxyServer( const QHostAddress& listenAddress, QObject( parent ), m_listenAddress( listenAddress ), m_listenPort( listenPort ), - m_server( new QTcpServer( this ) ), + m_server( new TlsServer( VeyonCore::TlsConfiguration::defaultConfiguration(), this ) ), m_connectionFactory( connectionFactory ) { connect( m_server, &QTcpServer::newConnection, this, &VncProxyServer::acceptConnection ); diff --git a/server/src/VncProxyServer.h b/server/src/VncProxyServer.h index 8d2861cb9..4dc7aa7a8 100644 --- a/server/src/VncProxyServer.h +++ b/server/src/VncProxyServer.h @@ -29,7 +29,7 @@ #include "CryptoCore.h" -class QTcpServer; +class TlsServer; class VncProxyConnection; class VncProxyConnectionFactory; @@ -66,7 +66,7 @@ class VncProxyServer : public QObject Password m_vncServerPassword{}; QHostAddress m_listenAddress; int m_listenPort; - QTcpServer* m_server; + TlsServer* m_server; VncProxyConnectionFactory* m_connectionFactory; VncProxyConnectionList m_connections; From 28906399e91f56b5326e646ab0024531a0a55afb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 09:04:42 +0200 Subject: [PATCH 0960/1765] Filesystem: expand HOSTNAME variable --- core/src/Filesystem.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index 9cc367ff8..66769f261 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "VeyonConfiguration.h" #include "Filesystem.h" @@ -34,6 +35,8 @@ QString Filesystem::expandPath( QString path ) const { const auto p = QDir::toNativeSeparators( path.replace( QStringLiteral( "%HOME%" ), QDir::homePath() ). replace( QStringLiteral( "$HOME" ), QDir::homePath() ). + replace( QStringLiteral( "%HOSTNAME%" ), QHostInfo::localHostName() ). + replace( QStringLiteral( "$HOSTNAME" ), QHostInfo::localHostName() ). replace( QStringLiteral( "%PROFILE%" ), QDir::homePath() ). replace( QStringLiteral( "$PROFILE" ), QDir::homePath() ). replace( QStringLiteral( "%APPDATA%" ), VeyonCore::platform().filesystemFunctions().personalAppDataPath() ). From b8d4e6f2252a66314476dcab9e52f08025211f65 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 09:09:16 +0200 Subject: [PATCH 0961/1765] VeyonConfig: add default paths for TLS files --- core/src/VeyonConfigurationProperties.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 7b52040d6..d60d1e71a 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -84,9 +84,9 @@ #define FOREACH_VEYON_TLS_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, tlsEnabled, setTlsEnabled, "Enabled", "TLS", false, Configuration::Property::Flag::Advanced ) \ - OP( VeyonConfiguration, VeyonCore::config(), QString, tlsCaCertificateFile, setTlsCaCertificateFile, "CaCertificateFile", "TLS", QString(), Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), QString, tlsHostCertificateFile, setTlsHostCertificateFile, "HostCertificateFile", "TLS", QString(), Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), QString, tlsHostPrivateKeyFile, setTlsHostPrivateKeyFile, "HostPrivateKeyFile", "TLS", QString(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, tlsCaCertificateFile, setTlsCaCertificateFile, "CaCertificateFile", "TLS", QStringLiteral("%GLOBALAPPDATA%/tls/ca.pem"), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, tlsHostCertificateFile, setTlsHostCertificateFile, "HostCertificateFile", "TLS", QStringLiteral("%GLOBALAPPDATA%/tls/%HOSTNAME%/cert.pem"), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, tlsHostPrivateKeyFile, setTlsHostPrivateKeyFile, "HostPrivateKeyFile", "TLS", QStringLiteral("%GLOBALAPPDATA%/tls/%HOSTNAME%/private.key"), Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_VNC_SERVER_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QUuid, vncServerPlugin, setVncServerPlugin, "Plugin", "VncServer", QUuid(), Configuration::Property::Flag::Standard ) \ From 5f82e81061fb0e1282e1442b77a080f682904f57 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 09:55:05 +0200 Subject: [PATCH 0962/1765] configurator: cmake: don't use file globbing --- configurator/CMakeLists.txt | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/configurator/CMakeLists.txt b/configurator/CMakeLists.txt index e6ca006b1..732eeeb0c 100644 --- a/configurator/CMakeLists.txt +++ b/configurator/CMakeLists.txt @@ -1,10 +1,39 @@ include(BuildVeyonApplication) include(WindowsBuildHelpers) -file(GLOB configurator_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.*) -set(configurator_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/resources/configurator.qrc) - -build_veyon_application(veyon-configurator ${configurator_SOURCES} ${configurator_RESOURCES}) +build_veyon_application(veyon-configurator + src/AccessControlPage.cpp + src/AccessControlPage.h + src/AccessControlPage.ui + src/AccessControlRuleEditDialog.cpp + src/AccessControlRuleEditDialog.h + src/AccessControlRuleEditDialog.ui + src/AccessControlRuleListModel.cpp + src/AccessControlRuleListModel.h + src/AccessControlRulesTestDialog.cpp + src/AccessControlRulesTestDialog.h + src/AccessControlRulesTestDialog.ui + src/AuthenticationPage.cpp + src/AuthenticationPage.h + src/AuthenticationPageTab.cpp + src/AuthenticationPageTab.h + src/AuthenticationPageTab.ui + src/AuthenticationPage.ui + src/GeneralConfigurationPage.cpp + src/GeneralConfigurationPage.h + src/GeneralConfigurationPage.ui + src/main.cpp + src/MainWindow.cpp + src/MainWindow.h + src/MainWindow.ui + src/MasterConfigurationPage.cpp + src/MasterConfigurationPage.h + src/MasterConfigurationPage.ui + src/ServiceConfigurationPage.cpp + src/ServiceConfigurationPage.h + src/ServiceConfigurationPage.ui + resources/configurator.qrc +) add_windows_resource(veyon-configurator) make_graphical_app(veyon-configurator) From e29a764c43c2f81075f31a961af3baefdd20308c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 14:51:38 +0200 Subject: [PATCH 0963/1765] AccessControlPage: fix bottom spacer --- configurator/src/AccessControlPage.ui | 29 +++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/configurator/src/AccessControlPage.ui b/configurator/src/AccessControlPage.ui index 8113f93bb..184ffbb22 100644 --- a/configurator/src/AccessControlPage.ui +++ b/configurator/src/AccessControlPage.ui @@ -214,19 +214,6 @@ Access control rules - - - - Qt::Vertical - - - - 20 - 88 - - - - @@ -308,6 +295,22 @@ + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 10 + 10 + + + + From 5b977f452be7fba9c03730894bba0fcce6869c43 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 14:59:43 +0200 Subject: [PATCH 0964/1765] AuthenticationPage: drop top-level groupbox --- configurator/src/AuthenticationPage.ui | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/configurator/src/AuthenticationPage.ui b/configurator/src/AuthenticationPage.ui index 402af6e89..9ca95cf98 100644 --- a/configurator/src/AuthenticationPage.ui +++ b/configurator/src/AuthenticationPage.ui @@ -13,16 +13,7 @@ 0 - - - Authentication methods - - - - - - - + From 25f87cfc8bbcac7841e8a81f84a8ce2fd646f80a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 15:20:11 +0200 Subject: [PATCH 0965/1765] AuthenticationPage: remove redundant code --- configurator/src/AuthenticationPage.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/configurator/src/AuthenticationPage.cpp b/configurator/src/AuthenticationPage.cpp index fd492af6c..e9b3e62bf 100644 --- a/configurator/src/AuthenticationPage.cpp +++ b/configurator/src/AuthenticationPage.cpp @@ -69,10 +69,6 @@ void AuthenticationPage::connectWidgetsToProperties() connect( checkBox, &QCheckBox::toggled, this, [plugin, checkBox]() { VeyonCore::authenticationManager().setEnabled( plugin, checkBox->isChecked() ); } ); - - connect( checkBox, &QCheckBox::toggled, this, [plugin, checkBox]() { - VeyonCore::authenticationManager().setEnabled( plugin, checkBox->isChecked() ); - } ); } } From 348d7dcda3a41a6399738b79d6516072b14dfe63 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 15:00:15 +0200 Subject: [PATCH 0966/1765] AuthenticationPageTab: improve spacer --- configurator/src/AuthenticationPageTab.ui | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/configurator/src/AuthenticationPageTab.ui b/configurator/src/AuthenticationPageTab.ui index c1cc31f11..3b36099ae 100644 --- a/configurator/src/AuthenticationPageTab.ui +++ b/configurator/src/AuthenticationPageTab.ui @@ -52,10 +52,13 @@ Qt::Vertical + + QSizePolicy::Expanding + - 20 - 40 + 0 + 0 From 492684aae3c5147af8645005314d18861f511eec Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 15:07:14 +0200 Subject: [PATCH 0967/1765] Configurator: MainWindow: improve page container sizing --- configurator/src/MainWindow.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index fec2b4f70..b3b76ecd6 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -91,8 +91,8 @@ MainWindow::MainWindow( QWidget* parent ) : connect( ui->configPages, &QStackedWidget::currentChanged, this, &MainWindow::updateSizes ); - resize( ui->pageSelector->width() + ui->generalConfigurationPage->minimumSizeHint().width(), - ui->generalConfigurationPage->minimumSizeHint().height() ); + resize( ui->pageSelector->width() + ui->masterConfigurationPage->minimumSizeHint().width(), + ui->masterConfigurationPage->minimumSizeHint().height() + 100 ); restoreGeometry( QSettings{}.value( windowGeometryKey() ).toByteArray() ); @@ -265,6 +265,11 @@ void MainWindow::updateSizes() { ui->configPages->setMinimumSize( ui->scrollArea->width() - ui->scrollArea->verticalScrollBar()->width(), ui->configPages->currentWidget()->minimumSizeHint().height() ); + + ui->scrollAreaWidgetContents->setFixedSize( + ui->scrollArea->width() - ui->scrollArea->verticalScrollBar()->width(), + qMax( ui->scrollAreaWidgetContents->minimumSizeHint().height(), ui->scrollArea->contentsRect().height() ) + ); } From 1faeb7bb67517c3be7cac583ff5da42efc54b9f2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 15:21:12 +0200 Subject: [PATCH 0968/1765] AuthKeysConfigurationWidget: clean up form --- plugins/authkeys/AuthKeysConfigurationWidget.ui | 7 ------- 1 file changed, 7 deletions(-) diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.ui b/plugins/authkeys/AuthKeysConfigurationWidget.ui index 90d9a7a89..5b94f8686 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.ui +++ b/plugins/authkeys/AuthKeysConfigurationWidget.ui @@ -2,13 +2,6 @@ AuthKeysConfigurationWidget - - Authentication keys - - - - :/core/application-x-pem-key.png:/core/application-x-pem-key.png - 0 From 694306afd4fa17611d87bd9f0c2853f5604279bc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 15:21:36 +0200 Subject: [PATCH 0969/1765] AuthLdapConfigurationWidget: clean up form --- plugins/ldap/AuthLdapConfigurationWidget.ui | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/plugins/ldap/AuthLdapConfigurationWidget.ui b/plugins/ldap/AuthLdapConfigurationWidget.ui index d3931d8ac..0010e2ee1 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.ui +++ b/plugins/ldap/AuthLdapConfigurationWidget.ui @@ -2,13 +2,6 @@ AuthLdapConfigurationWidget - - LDAP authentication - - - - :/core/application-x-pem-key.png:/core/application-x-pem-key.png - 0 @@ -47,8 +40,6 @@ - - - + From fb3005a4969ba08cfdd0bf5014923c80cfff207a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Jun 2021 15:09:37 +0200 Subject: [PATCH 0970/1765] Reorganize configuration of network object directories This prepares multi-NOD support and brings selection and configuration of NODs together so users can't configure a NOD without enabling it. --- configurator/CMakeLists.txt | 6 + configurator/resources/configurator.qrc | 1 + .../resources/network-object-directory.png | Bin configurator/src/GeneralConfigurationPage.cpp | 18 - configurator/src/GeneralConfigurationPage.h | 2 - configurator/src/GeneralConfigurationPage.ui | 44 --- configurator/src/MainWindow.ui | 19 +- ...etworkObjectDirectoryConfigurationPage.cpp | 108 ++++++ .../NetworkObjectDirectoryConfigurationPage.h | 54 +++ ...NetworkObjectDirectoryConfigurationPage.ui | 49 +++ ...orkObjectDirectoryConfigurationPageTab.cpp | 59 +++ ...tworkObjectDirectoryConfigurationPageTab.h | 62 ++++ ...workObjectDirectoryConfigurationPageTab.ui | 20 + core/src/NetworkObjectDirectoryManager.cpp | 97 +++-- core/src/NetworkObjectDirectoryManager.h | 17 +- .../NetworkObjectDirectoryPluginInterface.h | 2 + core/src/VeyonConfigurationProperties.h | 3 +- .../BuiltinDirectoryConfigurationPage.ui | 348 +++++++++--------- .../BuiltinDirectoryPlugin.cpp | 3 +- .../builtindirectory/BuiltinDirectoryPlugin.h | 5 +- plugins/builtindirectory/CMakeLists.txt | 1 - plugins/builtindirectory/builtindirectory.qrc | 5 - plugins/ldap/LdapPlugin.cpp | 10 + plugins/ldap/LdapPlugin.h | 2 + plugins/ldap/common/CMakeLists.txt | 3 + ...etworkObjectDirectoryConfigurationPage.cpp | 41 +++ ...pNetworkObjectDirectoryConfigurationPage.h | 48 +++ ...NetworkObjectDirectoryConfigurationPage.ui | 32 ++ 28 files changed, 769 insertions(+), 290 deletions(-) rename plugins/builtindirectory/builtindirectory.png => configurator/resources/network-object-directory.png (100%) create mode 100644 configurator/src/NetworkObjectDirectoryConfigurationPage.cpp create mode 100644 configurator/src/NetworkObjectDirectoryConfigurationPage.h create mode 100644 configurator/src/NetworkObjectDirectoryConfigurationPage.ui create mode 100644 configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp create mode 100644 configurator/src/NetworkObjectDirectoryConfigurationPageTab.h create mode 100644 configurator/src/NetworkObjectDirectoryConfigurationPageTab.ui delete mode 100644 plugins/builtindirectory/builtindirectory.qrc create mode 100644 plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp create mode 100644 plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h create mode 100644 plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.ui diff --git a/configurator/CMakeLists.txt b/configurator/CMakeLists.txt index 732eeeb0c..293c123e9 100644 --- a/configurator/CMakeLists.txt +++ b/configurator/CMakeLists.txt @@ -29,6 +29,12 @@ build_veyon_application(veyon-configurator src/MasterConfigurationPage.cpp src/MasterConfigurationPage.h src/MasterConfigurationPage.ui + src/NetworkObjectDirectoryConfigurationPage.cpp + src/NetworkObjectDirectoryConfigurationPage.h + src/NetworkObjectDirectoryConfigurationPage.ui + src/NetworkObjectDirectoryConfigurationPageTab.cpp + src/NetworkObjectDirectoryConfigurationPageTab.h + src/NetworkObjectDirectoryConfigurationPageTab.ui src/ServiceConfigurationPage.cpp src/ServiceConfigurationPage.h src/ServiceConfigurationPage.ui diff --git a/configurator/resources/configurator.qrc b/configurator/resources/configurator.qrc index 10e2ee2a2..6ad147df7 100644 --- a/configurator/resources/configurator.qrc +++ b/configurator/resources/configurator.qrc @@ -12,5 +12,6 @@ vcs-normal.png vcs-removed.png access-rule-ask.png + network-object-directory.png diff --git a/plugins/builtindirectory/builtindirectory.png b/configurator/resources/network-object-directory.png similarity index 100% rename from plugins/builtindirectory/builtindirectory.png rename to configurator/resources/network-object-directory.png diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index 1e04530d8..c76b3aa9c 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -29,10 +29,8 @@ #include "GeneralConfigurationPage.h" #include "Filesystem.h" #include "FileSystemBrowser.h" -#include "NetworkObjectDirectoryManager.h" #include "PlatformFilesystemFunctions.h" #include "PlatformUserFunctions.h" -#include "PluginManager.h" #include "VeyonServiceControl.h" #include "VeyonCore.h" #include "VeyonConfiguration.h" @@ -84,8 +82,6 @@ GeneralConfigurationPage::GeneralConfigurationPage( QWidget* parent ) : connect( ui->openLogFileDirectory, &QPushButton::clicked, this, &GeneralConfigurationPage::openLogFileDirectory ); connect( ui->clearLogFiles, &QPushButton::clicked, this, &GeneralConfigurationPage::clearLogFiles ); - - populateNetworkObjectDirectories(); } @@ -101,7 +97,6 @@ void GeneralConfigurationPage::resetWidgets() { FOREACH_VEYON_UI_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); FOREACH_VEYON_LOGGING_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); - FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); FOREACH_VEYON_TLS_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); } @@ -111,7 +106,6 @@ void GeneralConfigurationPage::connectWidgetsToProperties() { FOREACH_VEYON_UI_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); FOREACH_VEYON_LOGGING_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); - FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); FOREACH_VEYON_TLS_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); } @@ -201,15 +195,3 @@ void GeneralConfigurationPage::clearLogFiles() tr( "Could not remove all log files." ) ); } } - - - -void GeneralConfigurationPage::populateNetworkObjectDirectories() -{ - const auto directories = VeyonCore::networkObjectDirectoryManager().availableDirectories(); - - for( auto it = directories.constBegin(), end = directories.constEnd(); it != end; ++it ) - { - ui->networkObjectDirectoryPlugin->addItem( it.value(), it.key() ); - } -} diff --git a/configurator/src/GeneralConfigurationPage.h b/configurator/src/GeneralConfigurationPage.h index 1537f7aaa..e2a6fba1b 100644 --- a/configurator/src/GeneralConfigurationPage.h +++ b/configurator/src/GeneralConfigurationPage.h @@ -43,8 +43,6 @@ class GeneralConfigurationPage : public ConfigurationPage void openLogFileDirectory(); void clearLogFiles(); - void populateNetworkObjectDirectories(); - Ui::GeneralConfigurationPage* ui; } ; diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index 8438ca15f..61ec3ead4 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -50,48 +50,6 @@ - - - - Network object directory - - - - - - Backend: - - - - - - - - - - Update interval: - - - - - - - seconds - - - 10 - - - 3600 - - - 600 - - - - - - @@ -378,8 +336,6 @@ applicationName uiLanguage - networkObjectDirectoryPlugin - networkObjectDirectoryUpdateInterval logFileDirectory openLogFileDirectory logLevel diff --git a/configurator/src/MainWindow.ui b/configurator/src/MainWindow.ui index 9d3410713..5b51924a0 100644 --- a/configurator/src/MainWindow.ui +++ b/configurator/src/MainWindow.ui @@ -67,6 +67,15 @@ ItemIsSelectable|ItemIsUserCheckable|ItemIsEnabled + + + Locations & computers + + + + :/configurator/network-object-directory.png:/configurator/network-object-directory.png + + Master @@ -129,11 +138,9 @@ - - 0 - + @@ -306,6 +313,12 @@
    ServiceConfigurationPage.h
    1 + + NetworkObjectDirectoryConfigurationPage + QWidget +
    NetworkObjectDirectoryConfigurationPage.h
    + 1 +
    diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp new file mode 100644 index 000000000..6107f1e26 --- /dev/null +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp @@ -0,0 +1,108 @@ +/* + * NetworkObjectDirectoryConfigurationPage.cpp - implementation of the NetworkObjectDirectoryConfigurationPage class + * + * Copyright (c) 2020-2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include + +#include "Configuration/UiMapping.h" +#include "NetworkObjectDirectoryConfigurationPage.h" +#include "NetworkObjectDirectoryConfigurationPageTab.h" +#include "NetworkObjectDirectoryManager.h" +#include "NetworkObjectDirectoryPluginInterface.h" +#include "VeyonConfiguration.h" + +#include "ui_NetworkObjectDirectoryConfigurationPage.h" + +NetworkObjectDirectoryConfigurationPage::NetworkObjectDirectoryConfigurationPage( QWidget* parent ) : + ConfigurationPage( parent ), + ui(new Ui::NetworkObjectDirectoryConfigurationPage) +{ + ui->setupUi(this); + + populateTabs(); +} + + + +NetworkObjectDirectoryConfigurationPage::~NetworkObjectDirectoryConfigurationPage() +{ + delete ui; +} + + + +void NetworkObjectDirectoryConfigurationPage::resetWidgets() +{ + FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); + + for( const auto* tab : m_tabs ) + { + tab->content()->resetWidgets(); + tab->enabledCheckBox()->setChecked( VeyonCore::networkObjectDirectoryManager().isEnabled( tab->plugin() ) ); + + } +} + + + +void NetworkObjectDirectoryConfigurationPage::connectWidgetsToProperties() +{ + FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); + + for( const auto* tab : m_tabs ) + { + const auto plugin = tab->plugin(); + const auto checkBox = tab->enabledCheckBox(); + + connect( checkBox, &QCheckBox::toggled, this, [plugin, checkBox]() { + VeyonCore::networkObjectDirectoryManager().setEnabled( plugin, checkBox->isChecked() ); + } ); + } +} + + + +void NetworkObjectDirectoryConfigurationPage::applyConfiguration() +{ + for( auto tab : m_tabs ) + { + tab->content()->applyConfiguration(); + } +} + + + +void NetworkObjectDirectoryConfigurationPage::populateTabs() +{ + const auto plugins = VeyonCore::networkObjectDirectoryManager().plugins(); + for( auto* plugin : plugins ) + { + const auto tab = new NetworkObjectDirectoryConfigurationPageTab( plugin ); + + tab->enabledCheckBox()->setChecked( VeyonCore::networkObjectDirectoryManager().isEnabled( plugin ) ); + + ui->tabWidget->addTab( tab, tab->content()->windowTitle() ); + + m_tabs.append( tab ); + } +} diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.h b/configurator/src/NetworkObjectDirectoryConfigurationPage.h new file mode 100644 index 000000000..5c09f8f9b --- /dev/null +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.h @@ -0,0 +1,54 @@ +/* + * NetworkObjectDirectoryConfigurationPage.h - header for the NetworkObjectDirectoryConfigurationPage class + * + * Copyright (c) 2016-2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "ConfigurationPage.h" + +namespace Ui { +class NetworkObjectDirectoryConfigurationPage; +} + +class NetworkObjectDirectoryPluginInterface; +class NetworkObjectDirectoryConfigurationPageTab; + +class NetworkObjectDirectoryConfigurationPage : public ConfigurationPage +{ + Q_OBJECT +public: + NetworkObjectDirectoryConfigurationPage( QWidget* parent = nullptr ); + ~NetworkObjectDirectoryConfigurationPage() override; + + void resetWidgets() override; + void connectWidgetsToProperties() override; + void applyConfiguration() override; + +private: + void populateTabs(); + + Ui::NetworkObjectDirectoryConfigurationPage *ui; + + QList m_tabs; + +}; diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.ui b/configurator/src/NetworkObjectDirectoryConfigurationPage.ui new file mode 100644 index 000000000..3d2e6b391 --- /dev/null +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.ui @@ -0,0 +1,49 @@ + + + NetworkObjectDirectoryConfigurationPage + + + Locations & computers + + + + 0 + + + 0 + + + + + + + Update interval: + + + + + + + seconds + + + 10 + + + 3600 + + + 600 + + + + + + + + + + + + + diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp new file mode 100644 index 000000000..be0bd6be1 --- /dev/null +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp @@ -0,0 +1,59 @@ +/* + * NetworkObjectDirectoryConfigurationPageTab.cpp - implementation of the NetworkObjectDirectoryConfigurationPageTab class + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "ConfigurationPage.h" +#include "NetworkObjectDirectoryPluginInterface.h" +#include "NetworkObjectDirectoryConfigurationPageTab.h" + +#include "ui_NetworkObjectDirectoryConfigurationPageTab.h" + +NetworkObjectDirectoryConfigurationPageTab::NetworkObjectDirectoryConfigurationPageTab( + NetworkObjectDirectoryPluginInterface* plugin, QWidget* parent ) : + QWidget( parent ), + ui(new Ui::NetworkObjectDirectoryConfigurationPageTab), + m_plugin( plugin ), + m_content( m_plugin->createNetworkObjectDirectoryConfigurationPage() ) +{ + ui->setupUi(this); + + m_content->setEnabled( false ); + + connect( ui->enabledCheckBox, &QCheckBox::toggled, m_content, &QWidget::setEnabled ); + + ui->tabLayout->insertWidget( 1, m_content ); +} + + + +NetworkObjectDirectoryConfigurationPageTab::~NetworkObjectDirectoryConfigurationPageTab() +{ + delete ui; +} + + + +QCheckBox* NetworkObjectDirectoryConfigurationPageTab::enabledCheckBox() const +{ + return ui->enabledCheckBox; +} diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h new file mode 100644 index 000000000..e3e706ceb --- /dev/null +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h @@ -0,0 +1,62 @@ +/* + * NetworkObjectDirectoryConfigurationPageTab.h - header for the NetworkObjectDirectoryConfigurationPageTab class + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include + +namespace Ui { +class NetworkObjectDirectoryConfigurationPageTab; +} + +class QBoxLayout; +class QCheckBox; +class QPushButton; +class ConfigurationPage; +class NetworkObjectDirectoryPluginInterface; + +class NetworkObjectDirectoryConfigurationPageTab : public QWidget +{ + Q_OBJECT +public: + NetworkObjectDirectoryConfigurationPageTab( NetworkObjectDirectoryPluginInterface* plugin, QWidget* parent = nullptr ); + ~NetworkObjectDirectoryConfigurationPageTab() override; + + QCheckBox* enabledCheckBox() const; + + NetworkObjectDirectoryPluginInterface* plugin() const + { + return m_plugin; + } + + ConfigurationPage* content() const + { + return m_content; + } + +private: + Ui::NetworkObjectDirectoryConfigurationPageTab *ui; + NetworkObjectDirectoryPluginInterface* m_plugin; + ConfigurationPage* m_content; +}; diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.ui b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.ui new file mode 100644 index 000000000..1b17ee536 --- /dev/null +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.ui @@ -0,0 +1,20 @@ + + + NetworkObjectDirectoryConfigurationPageTab + + + + 16 + + + + + Enabled + + + + + + + + diff --git a/core/src/NetworkObjectDirectoryManager.cpp b/core/src/NetworkObjectDirectoryManager.cpp index 854b8329b..9d5752239 100644 --- a/core/src/NetworkObjectDirectoryManager.cpp +++ b/core/src/NetworkObjectDirectoryManager.cpp @@ -38,65 +38,108 @@ NetworkObjectDirectoryManager::NetworkObjectDirectoryManager( QObject* parent ) if( pluginInterface && directoryPluginInterface ) { - m_directoryPluginInterfaces[pluginInterface] = directoryPluginInterface; + m_plugins[pluginInterface->uid()] = directoryPluginInterface; } } } -QMap NetworkObjectDirectoryManager::availableDirectories() +NetworkObjectDirectory* NetworkObjectDirectoryManager::configuredDirectory() +{ + if( m_configuredDirectory == nullptr ) + { + m_configuredDirectory = createDirectory( VeyonCore::config().enabledNetworkObjectDirectoryPlugins().value(0), + this ); + } + + return m_configuredDirectory; +} + + + +NetworkObjectDirectory* NetworkObjectDirectoryManager::createDirectory( Plugin::Uid uid, QObject* parent ) { - QMap items; + const auto plugin = m_plugins.value( uid ); + if( plugin ) + { + auto directory = plugin->createNetworkObjectDirectory( parent ); + if( directory ) + { + return directory; + } + } + + const auto defaultPlugin = VeyonCore::pluginManager().find( + []( const PluginInterface* plugin ) { + return plugin->flags().testFlag( Plugin::ProvidesDefaultImplementation ); + } ); - for( auto it = m_directoryPluginInterfaces.constBegin(), end = m_directoryPluginInterfaces.constEnd(); it != end; ++it ) + if( defaultPlugin ) { - items[it.key()->uid()] = it.value()->directoryName(); + const auto defaultDirectory = defaultPlugin->createNetworkObjectDirectory( parent ); + if( defaultDirectory ) + { + return defaultDirectory; + } } - return items; + vCritical() << "no default plugin available! requested plugin:" << uid; + return nullptr; } -NetworkObjectDirectory* NetworkObjectDirectoryManager::configuredDirectory() +void NetworkObjectDirectoryManager::setEnabled( Plugin::Uid uid, bool enabled ) { - if( m_configuredDirectory == nullptr ) + const auto formattedUid = VeyonCore::formattedUuid(uid); + + auto plugins = VeyonCore::config().enabledNetworkObjectDirectoryPlugins(); + + if( enabled ) { - m_configuredDirectory = createDirectory( VeyonCore::config().networkObjectDirectoryPlugin(), this ); + plugins.append( formattedUid ); + plugins.removeDuplicates(); + } + else + { + plugins.removeAll( formattedUid ); } - return m_configuredDirectory; + VeyonCore::config().setEnabledNetworkObjectDirectoryPlugins( plugins ); } -NetworkObjectDirectory* NetworkObjectDirectoryManager::createDirectory( Plugin::Uid uid, QObject* parent ) +bool NetworkObjectDirectoryManager::isEnabled( Plugin::Uid uid ) const +{ + return VeyonCore::config().enabledNetworkObjectDirectoryPlugins().contains( VeyonCore::formattedUuid(uid) ); +} + + + +void NetworkObjectDirectoryManager::setEnabled( NetworkObjectDirectoryPluginInterface* plugin, bool enabled ) { - for( auto it = m_directoryPluginInterfaces.constBegin(), end = m_directoryPluginInterfaces.constEnd(); it != end; ++it ) + for( auto it = m_plugins.constBegin(), end = m_plugins.constEnd(); it != end; ++it ) { - if( it.key()->uid() == uid ) + if( it.value() == plugin ) { - auto directory = it.value()->createNetworkObjectDirectory( parent ); - if( directory ) - { - return directory; - } + setEnabled( it.key(), enabled ); } } +} - for( auto it = m_directoryPluginInterfaces.constBegin(), end = m_directoryPluginInterfaces.constEnd(); it != end; ++it ) + + +bool NetworkObjectDirectoryManager::isEnabled( NetworkObjectDirectoryPluginInterface* plugin ) const +{ + for( auto it = m_plugins.constBegin(), end = m_plugins.constEnd(); it != end; ++it ) { - if( it.key()->flags().testFlag( Plugin::ProvidesDefaultImplementation ) ) + if( it.value() == plugin && isEnabled( it.key() ) ) { - auto defaultDirectory = it.value()->createNetworkObjectDirectory( parent ); - if( defaultDirectory ) - { - return defaultDirectory; - } + return true; } } - vCritical() << "no default plugin available! requested plugin:" << uid; - return nullptr; + return false; } diff --git a/core/src/NetworkObjectDirectoryManager.h b/core/src/NetworkObjectDirectoryManager.h index 7c4f68c0c..dc0ed7800 100644 --- a/core/src/NetworkObjectDirectoryManager.h +++ b/core/src/NetworkObjectDirectoryManager.h @@ -35,16 +35,27 @@ class VEYON_CORE_EXPORT NetworkObjectDirectoryManager : public QObject { Q_OBJECT public: + using Plugins = QMap; + explicit NetworkObjectDirectoryManager( QObject* parent = nullptr ); - QMap availableDirectories(); + const Plugins& plugins() const + { + return m_plugins; + } + + NetworkObjectDirectory* configuredDirectory(); NetworkObjectDirectory* createDirectory( Plugin::Uid uid, QObject* parent ); - NetworkObjectDirectory* configuredDirectory(); + void setEnabled( Plugin::Uid uid, bool enabled ); + bool isEnabled( Plugin::Uid uid ) const; + + void setEnabled( NetworkObjectDirectoryPluginInterface* plugin, bool enabled ); + bool isEnabled( NetworkObjectDirectoryPluginInterface* plugin ) const; private: - QMap m_directoryPluginInterfaces{}; + Plugins m_plugins{}; NetworkObjectDirectory* m_configuredDirectory{nullptr}; }; diff --git a/core/src/NetworkObjectDirectoryPluginInterface.h b/core/src/NetworkObjectDirectoryPluginInterface.h index 1532da17f..021d70114 100644 --- a/core/src/NetworkObjectDirectoryPluginInterface.h +++ b/core/src/NetworkObjectDirectoryPluginInterface.h @@ -27,6 +27,7 @@ #include "PluginInterface.h" +class ConfigurationPage; class NetworkObjectDirectory; // clazy:excludeall=copyable-polymorphic @@ -36,6 +37,7 @@ class NetworkObjectDirectoryPluginInterface public: virtual QString directoryName() const = 0; virtual NetworkObjectDirectory* createNetworkObjectDirectory( QObject* parent ) = 0; + virtual ConfigurationPage* createNetworkObjectDirectoryConfigurationPage() = 0; }; diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index d60d1e71a..b1c640748 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -66,7 +66,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, autostartService, setServiceAutostart, "Autostart", "Service", true, Configuration::Property::Flag::Advanced ) \ #define FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(OP) \ - OP( VeyonConfiguration, VeyonCore::config(), QUuid, networkObjectDirectoryPlugin, setNetworkObjectDirectoryPlugin, "Plugin", "NetworkObjectDirectory", QUuid(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), QStringList, enabledNetworkObjectDirectoryPlugins, setEnabledNetworkObjectDirectoryPlugins, "EnabledPlugins", "NetworkObjectDirectory", QStringList(), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, networkObjectDirectoryUpdateInterval, setNetworkObjectDirectoryUpdateInterval, "UpdateInterval", "NetworkObjectDirectory", NetworkObjectDirectory::DefaultUpdateInterval, Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_FEATURES_CONFIG_PROPERTY(OP) \ @@ -150,6 +150,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, legacyLocalComputerHidden, setLegacyLocalComputerHidden, "LocalComputerHidden", "Master", false, Configuration::Property::Flag::Legacy ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, legacyComputerFilterHidden, setLegacyComputerFilterHidden, "ComputerFilterHidden", "Master", false, Configuration::Property::Flag::Legacy ) \ OP( VeyonConfiguration, VeyonCore::config(), int, legacyPrimaryServicePort, setLegacyPrimaryServicePort, "PrimaryServicePort", "Network", 11100, Configuration::Property::Flag::Legacy ) \ + OP( VeyonConfiguration, VeyonCore::config(), QUuid, legacyNetworkObjectDirectoryPlugin, setLegacyNetworkObjectDirectoryPlugin, "Plugin", "NetworkObjectDirectory", QUuid(), Configuration::Property::Flag::Legacy ) \ #define FOREACH_VEYON_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_CORE_CONFIG_PROPERTIES(OP) \ diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.ui b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.ui index 7d0c78bc0..c407cbf8a 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.ui +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.ui @@ -3,201 +3,187 @@ BuiltinDirectoryConfigurationPage - Locations & computers + Builtin directory - - - :/builtindirectory/builtindirectory.png:/builtindirectory/builtindirectory.png - - + 0 0 - - - - Builtin directory + + + + + + Add new location + + + + + + + :/core/list-add.png:/core/list-add.png + + + + + + + Remove selected location + + + + + + + :/core/edit-delete.png:/core/edit-delete.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + QAbstractItemView::SelectRows + + + 150 + + + true + + + false + + + + Name + + + + + Host address/IP + + + + + MAC address + + + + + + + + + + Add new computer + + + + + + + :/core/list-add.png:/core/list-add.png + + + + + + + Remove selected computer + + + + + + + :/core/edit-delete.png:/core/edit-delete.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Locations + + + + + + + false + + + true + + + false + + + + Locations + + + + + + + + Computers + + + + + + + + true + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + + true - - - - - Computers - - - - - - - Locations - - - - - - - - - Add new computer - - - - - - - :/core/list-add.png:/core/list-add.png - - - - - - - Remove selected computer - - - - - - - :/core/edit-delete.png:/core/edit-delete.png - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - QAbstractItemView::SelectRows - - - 150 - - - true - - - false - - - - Name - - - - - Host address/IP - - - - - MAC address - - - - - - - - - - Add new location - - - - - - - :/core/list-add.png:/core/list-add.png - - - - - - - Remove selected location - - - - - - - :/core/edit-delete.png:/core/edit-delete.png - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - false - - - true - - - false - - - - Locations - - - - - - - - - true - - - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - - - true - - - - - diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 85ac7c6c0..b7bd9e762 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -71,9 +71,10 @@ NetworkObjectDirectory *BuiltinDirectoryPlugin::createNetworkObjectDirectory( QO -ConfigurationPage *BuiltinDirectoryPlugin::createConfigurationPage() +ConfigurationPage* BuiltinDirectoryPlugin::createNetworkObjectDirectoryConfigurationPage() { return new BuiltinDirectoryConfigurationPage( m_configuration ); + } diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.h b/plugins/builtindirectory/BuiltinDirectoryPlugin.h index 5a50a8bc9..ca506fa86 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.h +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.h @@ -26,7 +26,6 @@ #include "CommandLinePluginInterface.h" #include "CommandLineIO.h" -#include "ConfigurationPagePluginInterface.h" #include "BuiltinDirectoryConfiguration.h" #include "NetworkObject.h" #include "NetworkObjectDirectoryPluginInterface.h" @@ -36,7 +35,6 @@ class QFile; class BuiltinDirectoryPlugin : public QObject, PluginInterface, NetworkObjectDirectoryPluginInterface, - ConfigurationPagePluginInterface, CommandLinePluginInterface, CommandLineIO { @@ -44,7 +42,6 @@ class BuiltinDirectoryPlugin : public QObject, Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.BuiltinDirectory") Q_INTERFACES(PluginInterface NetworkObjectDirectoryPluginInterface - ConfigurationPagePluginInterface CommandLinePluginInterface) public: explicit BuiltinDirectoryPlugin( QObject* paren = nullptr ); @@ -94,7 +91,7 @@ class BuiltinDirectoryPlugin : public QObject, NetworkObjectDirectory* createNetworkObjectDirectory( QObject* parent ) override; - ConfigurationPage* createConfigurationPage() override; + ConfigurationPage* createNetworkObjectDirectoryConfigurationPage() override; QString commandLineModuleName() const override { diff --git a/plugins/builtindirectory/CMakeLists.txt b/plugins/builtindirectory/CMakeLists.txt index bc9f8ee01..ffd40b59e 100644 --- a/plugins/builtindirectory/CMakeLists.txt +++ b/plugins/builtindirectory/CMakeLists.txt @@ -9,5 +9,4 @@ build_veyon_plugin(builtindirectory BuiltinDirectoryConfiguration.h BuiltinDirectoryConfigurationPage.h BuiltinDirectory.h - builtindirectory.qrc ) diff --git a/plugins/builtindirectory/builtindirectory.qrc b/plugins/builtindirectory/builtindirectory.qrc deleted file mode 100644 index d3a90fc32..000000000 --- a/plugins/builtindirectory/builtindirectory.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - builtindirectory.png - - diff --git a/plugins/ldap/LdapPlugin.cpp b/plugins/ldap/LdapPlugin.cpp index 0a4678575..9802fb527 100644 --- a/plugins/ldap/LdapPlugin.cpp +++ b/plugins/ldap/LdapPlugin.cpp @@ -34,6 +34,7 @@ #include "LdapConfigurationPage.h" #include "LdapConfigurationTest.h" #include "LdapDirectory.h" +#include "LdapNetworkObjectDirectoryConfigurationPage.h" #include "VariantArrayMessage.h" #include "VeyonConfiguration.h" @@ -265,6 +266,15 @@ NetworkObjectDirectory *LdapPlugin::createNetworkObjectDirectory( QObject* paren +ConfigurationPage* LdapPlugin::createNetworkObjectDirectoryConfigurationPage() +{ + auto page = new LdapNetworkObjectDirectoryConfigurationPage; + page->setWindowTitle( name() ); + return page; +} + + + void LdapPlugin::reloadConfiguration() { delete m_ldapDirectory; diff --git a/plugins/ldap/LdapPlugin.h b/plugins/ldap/LdapPlugin.h index d4b4bab28..928ec8912 100644 --- a/plugins/ldap/LdapPlugin.h +++ b/plugins/ldap/LdapPlugin.h @@ -128,6 +128,8 @@ class LdapPlugin : public QObject, NetworkObjectDirectory* createNetworkObjectDirectory( QObject* parent ) override; + ConfigurationPage* createNetworkObjectDirectoryConfigurationPage() override; + QString userGroupsBackendName() const override { return tr( "%1 (load users and groups from LDAP/AD)" ).arg( name() ); diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index 178f41883..b61da1f51 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -17,6 +17,9 @@ set(ldap_common_SOURCES LdapDirectory.h LdapNetworkObjectDirectory.cpp LdapNetworkObjectDirectory.h + LdapNetworkObjectDirectoryConfigurationPage.h + LdapNetworkObjectDirectoryConfigurationPage.cpp + LdapNetworkObjectDirectoryConfigurationPage.ui ldap.qrc ) diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp new file mode 100644 index 000000000..777462e8c --- /dev/null +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp @@ -0,0 +1,41 @@ +/* + * LdapNetworkObjectDirectoryConfigurationPage.cpp - implementation of the LdapNetworkObjectDirectoryConfigurationPage class + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "LdapNetworkObjectDirectoryConfigurationPage.h" + +#include "ui_LdapNetworkObjectDirectoryConfigurationPage.h" + +LdapNetworkObjectDirectoryConfigurationPage::LdapNetworkObjectDirectoryConfigurationPage( QWidget* parent ) : + ConfigurationPage( parent ), + ui(new Ui::LdapNetworkObjectDirectoryConfigurationPage) +{ + ui->setupUi(this); +} + + + +LdapNetworkObjectDirectoryConfigurationPage::~LdapNetworkObjectDirectoryConfigurationPage() +{ + delete ui; +} diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h new file mode 100644 index 000000000..32be5673d --- /dev/null +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h @@ -0,0 +1,48 @@ +/* + * LdapNetworkObjectDirectoryConfigurationPage.h - header for the LdapNetworkObjectDirectoryConfigurationPage class + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "ConfigurationPage.h" +#include "LdapCommon.h" + +namespace Ui { +class LdapNetworkObjectDirectoryConfigurationPage; +} + +class LDAP_COMMON_EXPORT LdapNetworkObjectDirectoryConfigurationPage : public ConfigurationPage +{ + Q_OBJECT +public: + explicit LdapNetworkObjectDirectoryConfigurationPage( QWidget* parent = nullptr ); + ~LdapNetworkObjectDirectoryConfigurationPage() override; + + void resetWidgets() override {}; + void connectWidgetsToProperties() override {}; + void applyConfiguration() override {}; + +private: + Ui::LdapNetworkObjectDirectoryConfigurationPage *ui; + +}; diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.ui b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.ui new file mode 100644 index 000000000..4504f2a4d --- /dev/null +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.ui @@ -0,0 +1,32 @@ + + + LdapNetworkObjectDirectoryConfigurationPage + + + LDAP + + + + 0 + + + 0 + + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + true + + + + + + + + From 52b61a8f9d1d54c66cd9f985fe34d960711ea7b8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Jul 2021 14:43:46 +0200 Subject: [PATCH 0971/1765] cmake: require C++17 support --- cmake/modules/SetDefaultTargetProperties.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/SetDefaultTargetProperties.cmake b/cmake/modules/SetDefaultTargetProperties.cmake index b819a80e0..e1a2e1641 100644 --- a/cmake/modules/SetDefaultTargetProperties.cmake +++ b/cmake/modules/SetDefaultTargetProperties.cmake @@ -1,6 +1,6 @@ macro(set_default_target_properties TARGET_NAME) set_property(TARGET ${TARGET_NAME} PROPERTY NO_SYSTEM_FROM_IMPORTED ON) - set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD 14) + set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD 17) set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) if(WITH_LTO AND NOT VEYON_DEBUG) set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) From cbb43cb0591f8c0f2406fd183626cef367062d6a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Jul 2021 14:56:51 +0200 Subject: [PATCH 0972/1765] Core: add RfbClientCallback The RfbClientCallback structure provides a wrapper for using regular member functions of VncConnection as libvncclient callbacks. --- core/src/RfbClientCallback.h | 94 ++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 core/src/RfbClientCallback.h diff --git a/core/src/RfbClientCallback.h b/core/src/RfbClientCallback.h new file mode 100644 index 000000000..27ce8d559 --- /dev/null +++ b/core/src/RfbClientCallback.h @@ -0,0 +1,94 @@ +/* + * RfbClientCallback.h - wrapper for using member functions as libvncclient callbacks + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "VncConnection.h" + +using rfbClient = struct _rfbClient; + +struct RfbClientCallback +{ + template + using ReturnType = typename std::result_of::type; + + template + using ReturnTypeIsVoid = std::is_void>; + + template + using EnableIfHasReturnType = typename std::enable_if::value, + ReturnType>::type; + + template + using EnableIfHasNoReturnType = typename std::enable_if>::value, + void>::type; + + template + static VncConnection* vncConnectionFromClient( rfbClient* client, Args... ) + { + return static_cast( VncConnection::clientData( client, VncConnection::VncConnectionTag ) ); + } + + template + static EnableIfHasReturnType wrap(Args...args) + { + if( const auto connection = vncConnectionFromClient(std::forward(args)...); connection ) + { + return (connection->*fn)( std::forward(args)...); + } + + return DefaultReturnValue; + } + + template + static EnableIfHasReturnType wrap(rfbClient* client, Args...args) + { + if( const auto connection = vncConnectionFromClient(client); connection ) + { + return (connection->*fn)( std::forward(args)...); + } + + return DefaultReturnValue; + } + + template + static EnableIfHasNoReturnType wrap(Args...args) + { + if( const auto connection = vncConnectionFromClient(std::forward(args)...); connection ) + { + (connection->*fn)( std::forward(args)...); + } + } + + template + static EnableIfHasNoReturnType wrap(rfbClient* client, Args...args) + { + if( const auto connection = vncConnectionFromClient(client); connection ) + { + (connection->*fn)( std::forward(args)...); + } + } + +}; + From 0206b678f7e4627acc0a21c4992c7835a4771936 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Jul 2021 14:59:43 +0200 Subject: [PATCH 0973/1765] VncConnection: rewrite callbacks via RfbClientCallback Also make order of method declarations and implementations match. --- core/src/VncConnection.cpp | 302 ++++++++++++++++--------------------- core/src/VncConnection.h | 13 +- 2 files changed, 132 insertions(+), 183 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 2926f57c1..d2847831e 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -37,132 +37,11 @@ #include "PlatformNetworkFunctions.h" #include "VeyonConfiguration.h" #include "VncConnection.h" +#include "RfbClientCallback.h" #include "SocketDevice.h" #include "VncEvents.h" -rfbBool VncConnection::hookInitFrameBuffer( rfbClient* client ) -{ - auto connection = static_cast( clientData( client, VncConnectionTag ) ); - if( connection ) - { - return connection->initFrameBuffer( client ); - } - - return false; -} - - - - -void VncConnection::hookUpdateFB( rfbClient* client, int x, int y, int w, int h ) -{ - auto connection = static_cast( clientData( client, VncConnectionTag ) ); - if( connection ) - { - Q_EMIT connection->imageUpdated( x, y, w, h ); - } -} - - - - -void VncConnection::hookFinishFrameBufferUpdate( rfbClient* client ) -{ - auto connection = static_cast( clientData( client, VncConnectionTag ) ); - if( connection ) - { - connection->finishFrameBufferUpdate(); - } -} - - - - -rfbBool VncConnection::hookHandleCursorPos( rfbClient* client, int x, int y ) -{ - auto connection = static_cast( clientData( client, VncConnectionTag ) ); - if( connection ) - { - Q_EMIT connection->cursorPosChanged( x, y ); - } - - return true; -} - - - - -void VncConnection::hookCursorShape( rfbClient* client, int xh, int yh, int w, int h, int bpp ) -{ - if( bpp != 4 ) - { - vWarning() << QThread::currentThreadId() << "bytes per pixel != 4"; - return; - } - - QImage alpha( client->rcMask, w, h, QImage::Format_Indexed8 ); - alpha.setColorTable( { qRgb(255,255,255), qRgb(0,0,0) } ); - - QPixmap cursorShape( QPixmap::fromImage( QImage( client->rcSource, w, h, QImage::Format_RGB32 ) ) ); - cursorShape.setMask( QBitmap::fromImage( alpha ) ); - - auto connection = static_cast( clientData( client, VncConnectionTag ) ); - if( connection ) - { - Q_EMIT connection->cursorShapeUpdated( cursorShape, xh, yh ); - } -} - - - -void VncConnection::hookCutText( rfbClient* client, const char* text, int textlen ) -{ - auto connection = static_cast( clientData( client, VncConnectionTag ) ); - const auto cutText = QString::fromUtf8( text, textlen ); - - if( connection && cutText.isEmpty() == false ) - { - Q_EMIT connection->gotCut( cutText ); - } -} - - - -void VncConnection::rfbClientLogDebug( const char* format, ... ) -{ - va_list args; - va_start( args, format ); - - static constexpr int MaxMessageLength = 256; - std::array message{}; - - vsnprintf( message.data(), sizeof(message), format, args ); - message[MaxMessageLength-1] = 0; - - va_end(args); - - vDebug() << QThread::currentThreadId() << message.data(); -} - - - - -void VncConnection::rfbClientLogNone( const char* format, ... ) -{ - Q_UNUSED(format) -} - - - -void VncConnection::framebufferCleanup( void* framebuffer ) -{ - delete[] static_cast( framebuffer ); -} - - - - VncConnection::VncConnection( QObject* parent ) : QThread( parent ), m_defaultPort( VeyonCore::config().veyonServerPort() ) @@ -317,6 +196,33 @@ void VncConnection::setServerReachable() +void VncConnection::enqueueEvent( VncEvent* event, bool wake ) +{ + if( state() != State::Connected ) + { + return; + } + + m_eventQueueMutex.lock(); + m_eventQueue.enqueue( event ); + m_eventQueueMutex.unlock(); + + if( wake ) + { + m_updateIntervalSleeper.wakeAll(); + } +} + + + +bool VncConnection::isEventQueueEmpty() +{ + QMutexLocker lock( &m_eventQueueMutex ); + return m_eventQueue.isEmpty(); +} + + + void VncConnection::setScaledSize( QSize s ) { QMutexLocker globalLock( &m_globalMutex ); @@ -396,6 +302,45 @@ void VncConnection::setClientData( int tag, void* data ) +qint64 VncConnection::libvncClientDispatcher( char* buffer, const qint64 bytes, + SocketDevice::SocketOperation operation, void* user ) +{ + auto client = static_cast( user ); + switch( operation ) + { + case SocketDevice::SocketOpRead: + return ReadFromRFBServer( client, buffer, static_cast( bytes ) ) ? bytes : 0; + + case SocketDevice::SocketOpWrite: + return WriteToRFBServer( client, buffer, static_cast( bytes ) ) ? bytes : 0; + } + + return 0; +} + + + +void VncConnection::mouseEvent( int x, int y, uint buttonMask ) +{ + enqueueEvent( new VncPointerEvent( x, y, buttonMask ), true ); +} + + + +void VncConnection::keyEvent( unsigned int key, bool pressed ) +{ + enqueueEvent( new VncKeyEvent( key, pressed ), true ); +} + + + +void VncConnection::clientCut( const QString& text ) +{ + enqueueEvent( new VncClientCutEvent( text ), true ); +} + + + void VncConnection::run() { while( isControlFlagSet( ControlFlag::TerminateThread ) == false ) @@ -421,13 +366,14 @@ void VncConnection::establishConnection() state() != State::Connected ) // try to connect as long as the server allows { m_client = rfbGetClient( RfbBitsPerSample, RfbSamplesPerPixel, RfbBytesPerPixel ); - m_client->MallocFrameBuffer = hookInitFrameBuffer; m_client->canHandleNewFBSize = true; - m_client->GotFrameBufferUpdate = hookUpdateFB; - m_client->FinishedFrameBufferUpdate = hookFinishFrameBufferUpdate; - m_client->HandleCursorPos = hookHandleCursorPos; - m_client->GotCursorShape = hookCursorShape; - m_client->GotXCutText = hookCutText; + m_client->MallocFrameBuffer = RfbClientCallback::wrap<&VncConnection::initFrameBuffer>; + m_client->GotFrameBufferUpdate = RfbClientCallback::wrap<&VncConnection::imageUpdated>; + m_client->FinishedFrameBufferUpdate = RfbClientCallback::wrap<&VncConnection::finishFrameBufferUpdate>; + m_client->HandleCursorPos = RfbClientCallback::wrap<&VncConnection::updateCursorPosition>; + m_client->GotCursorShape = RfbClientCallback::wrap<&VncConnection::updateCursorShape>; + m_client->GotXCutText = RfbClientCallback::wrap<&VncConnection::updateClipboard>; + m_client->connectTimeout = m_connectTimeout / 1000; m_client->readTimeout = m_readTimeout / 1000; setClientData( VncConnectionTag, this ); @@ -622,7 +568,7 @@ bool VncConnection::isControlFlagSet( VncConnection::ControlFlag flag ) -bool VncConnection::initFrameBuffer( rfbClient* client ) +rfbBool VncConnection::initFrameBuffer( rfbClient* client ) { if( client->format.bitsPerPixel != RfbBitsPerSample * RfbBytesPerPixel ) { @@ -696,6 +642,45 @@ void VncConnection::finishFrameBufferUpdate() +rfbBool VncConnection::updateCursorPosition( int x, int y ) +{ + Q_EMIT cursorPosChanged( x, y ); + return true; +} + + + +void VncConnection::updateCursorShape( rfbClient* client, int xh, int yh, int w, int h, int bpp ) +{ + if( bpp != 4 ) + { + vWarning() << QThread::currentThreadId() << "bytes per pixel != 4"; + return; + } + + QImage alpha( client->rcMask, w, h, QImage::Format_Indexed8 ); + alpha.setColorTable( { qRgb(255,255,255), qRgb(0,0,0) } ); + + QPixmap cursorShape( QPixmap::fromImage( QImage( client->rcSource, w, h, QImage::Format_RGB32 ) ) ); + cursorShape.setMask( QBitmap::fromImage( alpha ) ); + + Q_EMIT cursorShapeUpdated( cursorShape, xh, yh ); +} + + + +void VncConnection::updateClipboard( const char* text, int textlen ) +{ + const auto cutText = QString::fromUtf8( text, textlen ); + + if( cutText.isEmpty() == false ) + { + Q_EMIT gotCut( cutText ); + } +} + + + void VncConnection::sendEvents() { m_eventQueueMutex.lock(); @@ -723,66 +708,33 @@ void VncConnection::sendEvents() -void VncConnection::enqueueEvent( VncEvent* event, bool wake ) +void VncConnection::rfbClientLogDebug( const char* format, ... ) { - if( state() != State::Connected ) - { - return; - } - - m_eventQueueMutex.lock(); - m_eventQueue.enqueue( event ); - m_eventQueueMutex.unlock(); - - if( wake ) - { - m_updateIntervalSleeper.wakeAll(); - } -} - - + va_list args; + va_start( args, format ); -bool VncConnection::isEventQueueEmpty() -{ - QMutexLocker lock( &m_eventQueueMutex ); - return m_eventQueue.isEmpty(); -} + static constexpr int MaxMessageLength = 256; + std::array message{}; + vsnprintf( message.data(), sizeof(message), format, args ); + message[MaxMessageLength-1] = 0; + va_end(args); -void VncConnection::mouseEvent( int x, int y, uint buttonMask ) -{ - enqueueEvent( new VncPointerEvent( x, y, buttonMask ), true ); + vDebug() << QThread::currentThreadId() << message.data(); } -void VncConnection::keyEvent( unsigned int key, bool pressed ) -{ - enqueueEvent( new VncKeyEvent( key, pressed ), true ); -} - - -void VncConnection::clientCut( const QString& text ) +void VncConnection::rfbClientLogNone( const char* format, ... ) { - enqueueEvent( new VncClientCutEvent( text ), true ); + Q_UNUSED(format) } -qint64 VncConnection::libvncClientDispatcher( char* buffer, const qint64 bytes, - SocketDevice::SocketOperation operation, void* user ) +void VncConnection::framebufferCleanup( void* framebuffer ) { - auto client = static_cast( user ); - switch( operation ) - { - case SocketDevice::SocketOpRead: - return ReadFromRFBServer( client, buffer, static_cast( bytes ) ) ? bytes : 0; - - case SocketDevice::SocketOpWrite: - return WriteToRFBServer( client, buffer, static_cast( bytes ) ) ? bytes : 0; - } - - return 0; + delete[] static_cast( framebuffer ); } diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 6c7de27cd..df4055b80 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -189,18 +189,15 @@ class VEYON_CORE_EXPORT VncConnection : public QThread void setControlFlag( ControlFlag flag, bool on ); bool isControlFlagSet( ControlFlag flag ); - bool initFrameBuffer( rfbClient* client ); + rfbBool initFrameBuffer( rfbClient* client ); void finishFrameBufferUpdate(); + rfbBool updateCursorPosition( int x, int y ); + void updateCursorShape( rfbClient* client, int xh, int yh, int w, int h, int bpp ); + void updateClipboard( const char *text, int textlen ); + void sendEvents(); - // hooks for LibVNCClient - static int8_t hookInitFrameBuffer( rfbClient* client ); - static void hookUpdateFB( rfbClient* client, int x, int y, int w, int h ); - static void hookFinishFrameBufferUpdate( rfbClient* client ); - static int8_t hookHandleCursorPos( rfbClient* client, int x, int y ); - static void hookCursorShape( rfbClient* client, int xh, int yh, int w, int h, int bpp ); - static void hookCutText( rfbClient* client, const char *text, int textlen ); static void rfbClientLogDebug( const char* format, ... ); static void rfbClientLogNone( const char* format, ... ); static void framebufferCleanup( void* framebuffer ); From 4cf6beee868f81bbaba747c23fee3ff7fa735af1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Jul 2021 15:03:56 +0200 Subject: [PATCH 0974/1765] VncConnection: prepare TLS support The corresponding API extension for libvncclient is still WIP. --- core/src/VncConnection.cpp | 58 ++++++++++++++++++++++++++++++++++++++ core/src/VncConnection.h | 9 ++++++ 2 files changed, 67 insertions(+) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index d2847831e..5c147e257 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include "PlatformNetworkFunctions.h" @@ -738,3 +739,60 @@ void VncConnection::framebufferCleanup( void* framebuffer ) { delete[] static_cast( framebuffer ); } + + + +int VncConnection::openTlsSocket( const char* hostname, int port ) +{ + delete m_sslSocket; + + m_sslSocket = new QSslSocket; + connect(m_sslSocket, QOverload&>::of(&QSslSocket::sslErrors), + []( const QList &errors) { + for( const auto& err : errors ) + { + vWarning() << "SSL error" << err; + } + } ); + + m_sslSocket->connectToHostEncrypted( QString::fromUtf8(hostname), port ); + if( m_sslSocket->waitForEncrypted() == false || m_sslSocket->socketDescriptor() < 0 ) + { + delete m_sslSocket; + m_sslSocket = nullptr; + return RFB_INVALID_SOCKET; + } + + return m_sslSocket->socketDescriptor(); +} + + + +int VncConnection::readFromTlsSocket( rfbClient* client, char* buffer, unsigned int len ) +{ + if( m_sslSocket->bytesAvailable() <= 0 ) + { + if( m_sslSocket->waitForReadyRead(10) == false ) + { + errno = EAGAIN; + return -1; + } + } + + return m_sslSocket->read( buffer, len ); +} + + + +int VncConnection::writeToTlsSocket( rfbClient* client, const char* buffer, unsigned int len ) +{ + const auto connection = static_cast( clientData( client, VncConnectionTag ) ); + if( connection ) + { + const auto ret = connection->m_sslSocket->write( buffer, len ); + connection->m_sslSocket->flush(); + return ret; + } + + return -1; +} diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index df4055b80..9b6d6148e 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -27,6 +27,8 @@ #pragma once +#include + #include #include #include @@ -41,6 +43,7 @@ using rfbClient = struct _rfbClient; +class QSslSocket; class VncEvent; class VEYON_CORE_EXPORT VncConnection : public QThread @@ -202,6 +205,10 @@ class VEYON_CORE_EXPORT VncConnection : public QThread static void rfbClientLogNone( const char* format, ... ); static void framebufferCleanup( void* framebuffer ); + rfbSocket openTlsSocket( const char* hostname, int port ); + int readFromTlsSocket( rfbClient* client, char* buffer, unsigned int len ); + int writeToTlsSocket( rfbClient* client, const char* buffer, unsigned int len ); + // intervals and timeouts int m_threadTerminationTimeout{DefaultThreadTerminationTimeout}; int m_connectTimeout{DefaultConnectTimeout}; @@ -219,6 +226,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread std::atomic m_framebufferState{FramebufferState::Invalid}; QAtomicInteger m_controlFlags{}; + QSslSocket* m_sslSocket{nullptr}; + // connection parameters and data rfbClient* m_client{nullptr}; Quality m_quality{Quality::Default}; From fd959fc7c465d0876cd6f1199a2b07e458fddffc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Sun, 18 Jul 2021 15:47:15 +0200 Subject: [PATCH 0975/1765] CryptoCore: add createPrivateKey() Hide key generation details from the API. --- core/src/CryptoCore.cpp | 7 +++++++ core/src/CryptoCore.h | 7 +++++-- plugins/authkeys/AuthKeysManager.cpp | 2 +- plugins/authlogon/AuthLogonPlugin.cpp | 2 +- plugins/authsimple/AuthSimplePlugin.cpp | 2 +- plugins/ldap/LdapPlugin.cpp | 2 +- 6 files changed, 16 insertions(+), 6 deletions(-) diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index 94db1aa16..b4047a39b 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -93,3 +93,10 @@ CryptoCore::PlaintextPassword CryptoCore::decryptPassword( const QString& encryp return {}; } + + + +CryptoCore::PrivateKey CryptoCore::createPrivateKey() +{ + return m_keyGenerator.createRSA( CryptoCore::RsaKeySize ); +} diff --git a/core/src/CryptoCore.h b/core/src/CryptoCore.h index 1aca9ff6b..1c4e3f152 100644 --- a/core/src/CryptoCore.h +++ b/core/src/CryptoCore.h @@ -33,13 +33,11 @@ class VEYON_CORE_EXPORT CryptoCore { public: - using KeyGenerator = QCA::KeyGenerator; using PrivateKey = QCA::PrivateKey; using PublicKey = QCA::PublicKey; using SecureArray = QCA::SecureArray; using PlaintextPassword = SecureArray; - static constexpr auto RsaKeySize = 4096; static constexpr auto ChallengeSize = 128; static constexpr auto BitsPerByte = 8; @@ -54,8 +52,13 @@ class VEYON_CORE_EXPORT CryptoCore QString encryptPassword( const PlaintextPassword& password ) const; PlaintextPassword decryptPassword( const QString& encryptedPassword ) const; + PrivateKey createPrivateKey(); + private: + static constexpr auto RsaKeySize = 4096; + QCA::Initializer m_qcaInitializer{}; + QCA::KeyGenerator m_keyGenerator{}; PrivateKey m_defaultPrivateKey{}; }; diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index a3b941cfd..a7b5f2661 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -77,7 +77,7 @@ bool AuthKeysManager::createKeyPair( const QString& name ) CommandLineIO::print( tr( "Creating new key pair for \"%1\"" ).arg( name ) ); - const auto privateKey = CryptoCore::KeyGenerator().createRSA( CryptoCore::RsaKeySize ); + const auto privateKey = VeyonCore::cryptoCore().createPrivateKey(); const auto publicKey = privateKey.toPublicKey(); if( privateKey.isNull() || publicKey.isNull() ) diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index d9811975b..98476d3cc 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -91,7 +91,7 @@ VncServerClient::AuthState AuthLogonPlugin::performAuthentication( VncServerClie switch( client->authState() ) { case VncServerClient::AuthState::Init: - client->setPrivateKey( CryptoCore::KeyGenerator().createRSA( CryptoCore::RsaKeySize ) ); + client->setPrivateKey( VeyonCore::cryptoCore().createPrivateKey() ); if( VariantArrayMessage( message.ioDevice() ).write( client->privateKey().toPublicKey().toPEM() ).send() ) { diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp index d1c07e178..63d5d357b 100644 --- a/plugins/authsimple/AuthSimplePlugin.cpp +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -107,7 +107,7 @@ VncServerClient::AuthState AuthSimplePlugin::performAuthentication( VncServerCli switch( client->authState() ) { case VncServerClient::AuthState::Init: - client->setPrivateKey( CryptoCore::KeyGenerator().createRSA( CryptoCore::RsaKeySize ) ); + client->setPrivateKey( VeyonCore::cryptoCore().createPrivateKey() ); if( VariantArrayMessage( message.ioDevice() ).write( client->privateKey().toPublicKey().toPEM() ).send() ) { diff --git a/plugins/ldap/LdapPlugin.cpp b/plugins/ldap/LdapPlugin.cpp index 9802fb527..0962f93da 100644 --- a/plugins/ldap/LdapPlugin.cpp +++ b/plugins/ldap/LdapPlugin.cpp @@ -163,7 +163,7 @@ VncServerClient::AuthState LdapPlugin::performAuthentication( VncServerClient* c switch( client->authState() ) { case VncServerClient::AuthState::Init: - client->setPrivateKey( CryptoCore::KeyGenerator().createRSA( CryptoCore::RsaKeySize ) ); + client->setPrivateKey( VeyonCore::cryptoCore().createPrivateKey() ); if( VariantArrayMessage( message.ioDevice() ).write( client->privateKey().toPublicKey().toPEM() ).send() ) { From f7c0b5214ee2a60549442caaa02c8fb472a0ebf1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Sun, 18 Jul 2021 15:48:32 +0200 Subject: [PATCH 0976/1765] CryptoCore: add createSelfSignedHostCertificate() --- core/src/CryptoCore.cpp | 30 ++++++++++++++++++++++++++++++ core/src/CryptoCore.h | 4 ++++ 2 files changed, 34 insertions(+) diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index b4047a39b..27e6636aa 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -24,7 +24,10 @@ #include +#include + #include "CryptoCore.h" +#include "HostAddress.h" CryptoCore::CryptoCore() { @@ -100,3 +103,30 @@ CryptoCore::PrivateKey CryptoCore::createPrivateKey() { return m_keyGenerator.createRSA( CryptoCore::RsaKeySize ); } + + + +CryptoCore::Certificate CryptoCore::createSelfSignedHostCertificate( const PrivateKey& privateKey ) +{ + QCA::CertificateInfo certInfo{ + { QCA::CertificateInfoTypeKnown::CommonName, HostAddress::localFQDN() }, + { QCA::CertificateInfoTypeKnown::DNS, HostAddress::localFQDN() } + }; + + for( const auto& address : QNetworkInterface::allAddresses() ) + { + certInfo.insert( QCA::CertificateInfoTypeKnown::IPAddress, address.toString() ); + } + + QCA::CertificateOptions certOpts; + certOpts.setInfo( certInfo ); + certOpts.setConstraints( { QCA::ConstraintTypeKnown::DigitalSignature, + QCA::ConstraintTypeKnown::KeyCertificateSign, + QCA::ConstraintTypeKnown::KeyEncipherment, + QCA::ConstraintTypeKnown::ServerAuth } ); + + certOpts.setValidityPeriod( QDateTime::currentDateTime(), + QDateTime::currentDateTime().addDays(DefaultCertificateValidity) ); + + return QCA::Certificate{certOpts, privateKey}; +} diff --git a/core/src/CryptoCore.h b/core/src/CryptoCore.h index 1c4e3f152..a4b8419e1 100644 --- a/core/src/CryptoCore.h +++ b/core/src/CryptoCore.h @@ -33,6 +33,7 @@ class VEYON_CORE_EXPORT CryptoCore { public: + using Certificate = QCA::Certificate; using PrivateKey = QCA::PrivateKey; using PublicKey = QCA::PublicKey; using SecureArray = QCA::SecureArray; @@ -44,6 +45,8 @@ class VEYON_CORE_EXPORT CryptoCore static constexpr auto DefaultEncryptionAlgorithm = QCA::EME_PKCS1_OAEP; static constexpr auto DefaultSignatureAlgorithm = QCA::EMSA3_SHA512; + static constexpr auto DefaultCertificateValidity = 30; + CryptoCore(); ~CryptoCore(); @@ -53,6 +56,7 @@ class VEYON_CORE_EXPORT CryptoCore PlaintextPassword decryptPassword( const QString& encryptedPassword ) const; PrivateKey createPrivateKey(); + Certificate createSelfSignedHostCertificate( const PrivateKey& privateKey ); private: static constexpr auto RsaKeySize = 4096; From 8905ea9c21d98f7737de2f37f207969fc0f0ce33 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Sun, 18 Jul 2021 15:54:35 +0200 Subject: [PATCH 0977/1765] Fall back to self-signed host certificate for TLS --- configurator/src/GeneralConfigurationPage.cpp | 2 +- configurator/src/GeneralConfigurationPage.ui | 159 ++++++++++-------- core/src/VeyonConfigurationProperties.h | 2 +- core/src/VeyonCore.cpp | 84 ++++++--- core/src/VeyonCore.h | 3 + core/src/VncConnection.cpp | 3 + core/src/VncConnection.h | 1 + server/src/ComputerControlServer.h | 4 +- server/src/TlsServer.cpp | 8 +- 9 files changed, 170 insertions(+), 96 deletions(-) diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index c76b3aa9c..e632f342e 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -44,7 +44,7 @@ GeneralConfigurationPage::GeneralConfigurationPage( QWidget* parent ) : { ui->setupUi(this); - Configuration::UiMapping::setFlags( ui->securityGroupBox, Configuration::Property::Flag::Advanced ); + Configuration::UiMapping::setFlags( ui->tlsConfigGroupBox, Configuration::Property::Flag::Advanced ); connect( ui->browseTlsCaCertificateFile, &QAbstractButton::clicked, this, [this]() { FileSystemBrowser( FileSystemBrowser::ExistingFile ).exec( ui->tlsCaCertificateFile ); diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index 61ec3ead4..2146da848 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -240,81 +240,90 @@
    - + - Security + TLS configuration - - - - - Host certificate file - - - - - - - ... - - - - :/core/document-open.png:/core/document-open.png - - - - - - - CA certificate file - - - - - - - - - - Enable TLS for network connections - - - - - - - Host private key file - - - - - + + + - ... - - - - :/core/document-open.png:/core/document-open.png + Use certificate authority for TLS connections - - - - ... - - - - :/core/document-open.png:/core/document-open.png + + + + false + + + + + CA certificate file + + + + + + + + + + ... + + + + :/core/document-open.png:/core/document-open.png + + + + + + + Host certificate file + + + + + + + + + + ... + + + + :/core/document-open.png:/core/document-open.png + + + + + + + Host private key file + + + + + + + + + + ... + + + + :/core/document-open.png:/core/document-open.png + + + + - - - - - - @@ -346,7 +355,7 @@ logToStdErr logToSystem clearLogFiles - tlsEnabled + tlsUseCertificateAuthority tlsCaCertificateFile browseTlsCaCertificateFile tlsHostCertificateFile @@ -406,5 +415,21 @@ + + tlsUseCertificateAuthority + toggled(bool) + tlsCaFiles + setEnabled(bool) + + + 315 + 581 + + + 315 + 679 + + +
    diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index b1c640748..fe1a7493e 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -83,7 +83,7 @@ OP( VeyonConfiguration, VeyonCore::config(), QString, logFileDirectory, setLogFileDirectory, "LogFileDirectory", "Logging", QLatin1String(Logger::DefaultLogFileDirectory), Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_TLS_CONFIG_PROPERTY(OP) \ - OP( VeyonConfiguration, VeyonCore::config(), bool, tlsEnabled, setTlsEnabled, "Enabled", "TLS", false, Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, tlsUseCertificateAuthority, setTlsUseCertificateAuthority, "UseCertificateAuthority", "TLS", false, Configuration::Property::Flag::Advanced ) \ OP( VeyonConfiguration, VeyonCore::config(), QString, tlsCaCertificateFile, setTlsCaCertificateFile, "CaCertificateFile", "TLS", QStringLiteral("%GLOBALAPPDATA%/tls/ca.pem"), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QString, tlsHostCertificateFile, setTlsHostCertificateFile, "HostCertificateFile", "TLS", QStringLiteral("%GLOBALAPPDATA%/tls/%HOSTNAME%/cert.pem"), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QString, tlsHostPrivateKeyFile, setTlsHostPrivateKeyFile, "HostPrivateKeyFile", "TLS", QStringLiteral("%GLOBALAPPDATA%/tls/%HOSTNAME%/private.key"), Configuration::Property::Flag::Standard ) \ diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 3127b36b2..44b74d084 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -650,30 +650,49 @@ void VeyonCore::initSystemInfo() void VeyonCore::initTlsConfiguration() { - if( config().tlsEnabled() == false ) + auto tlsConfig{TlsConfiguration::defaultConfiguration()}; + +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) + tlsConfig.setProtocol( QSsl::TlsV1_3OrLater ); +#else + tlsConfig.setProtocol( QSsl::TlsV1_2OrLater ); +#endif + + if( config().tlsUseCertificateAuthority() ) { - return; + loadCertificateAuthorityFiles( &tlsConfig ); } + else + { + addSelfSignedHostCertificate( &tlsConfig ); + } + + TlsConfiguration::setDefaultConfiguration( tlsConfig ); +} + + +bool VeyonCore::loadCertificateAuthorityFiles( TlsConfiguration* tlsConfig ) +{ QFile caCertFile( filesystem().expandPath( config().tlsCaCertificateFile() ) ); if( caCertFile.exists() == false ) { vCritical() << "TLS CA certificate file" << caCertFile.fileName() << "does not exist"; - return; + return false; } if( caCertFile.open( QFile::ReadOnly ) == false ) { vCritical() << "TLS CA certificate file" << caCertFile.fileName() << "is not readable"; - return; + return false; } QSslCertificate caCertificate( caCertFile.readAll() ); if( caCertificate.isNull() ) { vCritical() << caCertFile.fileName() << "does not contain a valid TLS certificate"; - return; + return false; } QFile hostCertFile( filesystem().expandPath( config().tlsHostCertificateFile() ) ); @@ -681,20 +700,20 @@ void VeyonCore::initTlsConfiguration() if( hostCertFile.exists() == false ) { vCritical() << "TLS host certificate file" << hostCertFile.fileName() << "does not exist"; - return; + return false; } if( hostCertFile.open( QFile::ReadOnly ) == false ) { vCritical() << "TLS host certificate file" << hostCertFile.fileName() << "is not readable"; - return; + return false; } QSslCertificate hostCertificate( hostCertFile.readAll() ); if( hostCertificate.isNull() ) { vCritical() << hostCertFile.fileName() << "does not contain a valid TLS certificate"; - return; + return false; } QFile hostPrivateKeyFile( filesystem().expandPath( config().tlsHostPrivateKeyFile() ) ); @@ -702,13 +721,13 @@ void VeyonCore::initTlsConfiguration() if( hostPrivateKeyFile.exists() == false ) { vCritical() << "TLS private key file" << hostPrivateKeyFile.fileName() << "does not exist"; - return; + return false; } if( hostPrivateKeyFile.open( QFile::ReadOnly ) == false ) { vCritical() << "TLS private key file" << hostPrivateKeyFile.fileName() << "is not readable"; - return; + return false; } const auto hostPrivateKeyFileData = hostPrivateKeyFile.readAll(); @@ -731,23 +750,46 @@ void VeyonCore::initTlsConfiguration() if( hostPrivateKey.isNull() ) { vCritical() << hostPrivateKeyFile.fileName() << "does contains an invalid or unsupported TLS private key"; - return; + return false; } - TlsConfiguration tlsConfig; - -#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) - tlsConfig.setProtocol( QSsl::TlsV1_3OrLater ); +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + tlsConfig->addCaCertificates( TlsConfiguration::systemCaCertificates() ); + tlsConfig->addCaCertificate( caCertificate ); #else - tlsConfig.setProtocol( QSsl::TlsV1_2OrLater ); + tlsConfig->setCaCertificates( TlsConfiguration::systemCaCertificates() + QList{caCertificate} ); #endif + tlsConfig->setLocalCertificate( hostCertificate ); + tlsConfig->setPrivateKey( hostPrivateKey ); + + return true; +} + + + +bool VeyonCore::addSelfSignedHostCertificate( TlsConfiguration* tlsConfig ) +{ + const auto privateKey = cryptoCore().createPrivateKey(); + if( privateKey.isNull() ) + { + vCritical() << "failed to create private key for host certificate"; + return false; + } + + const auto cert = cryptoCore().createSelfSignedHostCertificate( privateKey ); + if( cert.isNull() ) + { + vCritical() << "failed to create host certificate"; + return false; + } + #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) - tlsConfig.addCaCertificate( caCertificate ); + tlsConfig->addCaCertificates( TlsConfiguration::systemCaCertificates() ); #else - tlsConfig.setCaCertificates( tlsConfig.caCertificates() + QList{caCertificate} ); + tlsConfig->setCaCertificates( TlsConfiguration::systemCaCertificates() ); #endif - tlsConfig.setLocalCertificate( hostCertificate ); - tlsConfig.setPrivateKey( hostPrivateKey ); + tlsConfig->setLocalCertificate( QSslCertificate( cert.toPEM().toUtf8() ) ); + tlsConfig->setPrivateKey( QSslKey( privateKey.toPEM().toUtf8(), QSsl::KeyAlgorithm::Rsa ) ); - TlsConfiguration::setDefaultConfiguration( tlsConfig ); + return true; } diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 8457e0e03..12048665f 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -200,6 +200,9 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject void initSystemInfo(); void initTlsConfiguration(); + bool loadCertificateAuthorityFiles( TlsConfiguration* tlsConfig ); + bool addSelfSignedHostCertificate( TlsConfiguration* tlsConfig ); + static VeyonCore* s_instance; Filesystem* m_filesystem; diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 5c147e257..a25329dff 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -45,6 +45,7 @@ VncConnection::VncConnection( QObject* parent ) : QThread( parent ), + m_verifyServerCertificate( VeyonCore::config().tlsUseCertificateAuthority() ), m_defaultPort( VeyonCore::config().veyonServerPort() ) { if( VeyonCore::config().useCustomVncConnectionSettings() ) @@ -755,6 +756,8 @@ int VncConnection::openTlsSocket( const char* hostname, int port ) } } ); + m_sslSocket->setPeerVerifyMode( m_verifyServerCertificate ? QSslSocket::VerifyPeer : QSslSocket::QueryPeer ); + m_sslSocket->connectToHostEncrypted( QString::fromUtf8(hostname), port ); if( m_sslSocket->waitForEncrypted() == false || m_sslSocket->socketDescriptor() < 0 ) { diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 9b6d6148e..7f42bb212 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -227,6 +227,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread QAtomicInteger m_controlFlags{}; QSslSocket* m_sslSocket{nullptr}; + const bool m_verifyServerCertificate{true}; // connection parameters and data rfbClient* m_client{nullptr}; diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index f7c0233fb..aae7cf555 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -24,8 +24,8 @@ #pragma once -#include -#include +#include +#include #include "FeatureManager.h" #include "FeatureWorkerManager.h" diff --git a/server/src/TlsServer.cpp b/server/src/TlsServer.cpp index ddb461d6d..2e5634c42 100644 --- a/server/src/TlsServer.cpp +++ b/server/src/TlsServer.cpp @@ -54,19 +54,19 @@ void TlsServer::incomingConnection( qintptr socketDescriptor ) auto socket = new QSslSocket; if( socket->setSocketDescriptor(socketDescriptor) ) { - connect(socket, &QSslSocket::encrypted, this, []() { - qCritical() << "connected"; } ); - connect(socket, QOverload&>::of(&QSslSocket::sslErrors), [this, socket]( const QList &errors) { for( const auto& err : errors ) { - vCritical() << err; + vCritical() << "SSL error" << err; } Q_EMIT tlsErrors( socket, errors ); } ); + connect(socket, &QSslSocket::encrypted, this, + []() { vDebug() << "connection encryption established"; } ); + socket->setSslConfiguration( m_tlsConfig ); socket->startServerEncryption(); From 3939d59839cdf1e1cd344560a326de9c2f3a8ffc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:04:31 +0200 Subject: [PATCH 0978/1765] BuiltinX11VncServer: disable SHM if not available If the MIT SHM extension is not available for some reason, disable its usage by x11vnc from the start. This makes Veyon Server work properly in environments where the -noshm flag had to be added to the configuration manually. --- .../x11vnc-builtin/BuiltinX11VncServer.cpp | 6 +- .../vncserver/x11vnc-builtin/x11vnc-veyon.c | 109 ++++++++++++++++++ 2 files changed, 113 insertions(+), 2 deletions(-) diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index 48f6602db..dcad92de3 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -32,6 +32,7 @@ #include "X11VncConfigurationWidget.h" extern "C" int x11vnc_main( int argc, char * * argv ); +extern "C" int hasWorkingXShm(); BuiltinX11VncServer::BuiltinX11VncServer( QObject* parent ) : @@ -72,12 +73,13 @@ bool BuiltinX11VncServer::runServer( int serverPort, const Password& password ) cmdline.append( extraArguments.split( QLatin1Char(' ') ) ); } - const auto systemEnv = QProcessEnvironment::systemEnvironment(); - if( systemEnv.contains( QStringLiteral("XRDP_SESSION") ) ) + if( hasWorkingXShm() == false ) { cmdline.append( QStringLiteral("-noshm") ); } + const auto systemEnv = QProcessEnvironment::systemEnvironment(); + if( m_configuration.isXDamageDisabled() || // workaround for x11vnc when running in a NX session or a Thin client LTSP session systemEnv.contains( QStringLiteral("NXSESSIONID") ) || diff --git a/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c b/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c index c5542cc82..da91f6ed5 100644 --- a/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c +++ b/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c @@ -5,3 +5,112 @@ #include "x11vnc.c" #include "pm.c" + +#ifdef HAVE_XSHM + +#include +#include + +static int xshmOpCode = 0; +static int xshmAttachErrorCount = 0; +static XErrorHandler defaultXErrorHandler = NULL; + +static int handleXError( Display* display, XErrorEvent* error ) +{ + if( xshmOpCode > 0 && error->request_code == xshmOpCode ) + { + xshmAttachErrorCount++; + } + + return defaultXErrorHandler(display, error); +} + + + +static XImage* createXShmTestImage( Display* display, XShmSegmentInfo* shm ) +{ + shm->shmid = -1; + shm->shmaddr = (char *) -1; + + XImage* xim = XShmCreateImage(display, NULL, 32, ZPixmap, NULL, shm, 1, 1); + if( xim == NULL ) + { + return NULL; + } + + shm->shmid = shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height, IPC_CREAT | 0600); + + if( shm->shmid == -1 ) + { + return xim; + } + + shm->shmaddr = xim->data = (char *) shmat(shm->shmid, 0, 0); + + if( shm->shmaddr == (char *)-1 ) + { + return xim; + } + + if( !XShmAttach(display, shm) ) + { + xshmAttachErrorCount++; + } + + return xim; +} + + + +int hasWorkingXShm() +{ + xshmAttachErrorCount = 0; + + char* displayName = NULL; + if( getenv("DISPLAY") ) + { + displayName = getenv("DISPLAY"); + } + + Display* display = XOpenDisplay(displayName); + if( display == NULL ) + { + return 0; + } + + int op, ev, er; + if( XQueryExtension(display, "MIT-SHM", &op, &ev, &er) ) + { + xshmOpCode = op; + } + else + { + XCloseDisplay(display); + return 0; + } + + defaultXErrorHandler = XSetErrorHandler(handleXError); + + XShmSegmentInfo shm; + XImage* xim = createXShmTestImage(display, &shm); + + XShmDetach(display, &shm); + XDestroyImage(xim); + + shm_delete(&shm); + + XCloseDisplay(display); + + XSetErrorHandler(defaultXErrorHandler); + + return xshmAttachErrorCount == 0; +} + +#else + +int hasWorkingXShm() +{ + return 0; +} + +#endif From b7a44d498bf6b3b5f5b2e17730f117697080b9ca Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:12:16 +0200 Subject: [PATCH 0979/1765] LinuxSessionFunctions: add xdgSessionPathEnvVarName() --- plugins/platform/linux/LinuxSessionFunctions.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 93551a775..9eb3d68c8 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -106,6 +106,11 @@ class LinuxSessionFunctions : public PlatformSessionFunctions return QStringLiteral("XDG_SESSION_ID"); } + static QString xdgSessionPathEnvVarName() + { + return QStringLiteral("XDG_SESSION_PATH"); + } + static bool isOpen( const QString& session ); static bool isGraphical( const QString& session ); static bool isRemote( const QString& session ); From 8dab659d306c200ef41802accbc3cf19efa40107 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:12:32 +0200 Subject: [PATCH 0980/1765] LinuxServiceCore: add session path to environment --- plugins/platform/linux/LinuxServiceCore.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 5f6b3d2d9..9161a0daa 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -139,6 +139,8 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO return; } + sessionEnvironment.insert( LinuxSessionFunctions::xdgSessionPathEnvVarName(), sessionPath ); + // if pam-systemd is not in use, we have to set the XDG_SESSION_ID environment variable manually if( sessionEnvironment.contains( LinuxSessionFunctions::xdgSessionIdEnvVarName() ) == false ) { From 7baa9e2bf0adaaa53cb98a3dedcf84192c3bbc72 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:13:17 +0200 Subject: [PATCH 0981/1765] LinuxSessionFunctions: use session path from environment When determining the current session path, try to retrieve it from the environment since the session ID does not necessarily correlate to the session path. --- plugins/platform/linux/LinuxSessionFunctions.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index d7889a7fc..b45c08b93 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -282,13 +282,13 @@ QProcessEnvironment LinuxSessionFunctions::getSessionEnvironment( int sessionLea QString LinuxSessionFunctions::currentSessionPath() { - const auto xdgSessionId = QProcessEnvironment::systemEnvironment().value( xdgSessionIdEnvVarName() ); - if( xdgSessionId.isEmpty() ) + const auto xdgSessionPath = QProcessEnvironment::systemEnvironment().value( xdgSessionPathEnvVarName() ); + if( xdgSessionPath.isEmpty() ) { return QStringLiteral("/org/freedesktop/login1/session/self"); } - return QStringLiteral("/org/freedesktop/login1/session/%1").arg( xdgSessionId ); + return xdgSessionPath; } From a48c5dd5f48711c20abd4a66cd1c5dbe50d6d19b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:14:58 +0200 Subject: [PATCH 0982/1765] Logger: include Veyon session ID in log messages --- core/src/Logger.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/Logger.cpp b/core/src/Logger.cpp index ad7fcb9a5..162504286 100644 --- a/core/src/Logger.cpp +++ b/core/src/Logger.cpp @@ -228,9 +228,10 @@ QString Logger::formatMessage( LogLevel ll, const QString& message ) default: break; } - return QStringLiteral( "%1.%2: [%3] %4\n" ).arg( + return QStringLiteral( "%1.%2: [%3] [%4] %5\n" ).arg( QDateTime::currentDateTime().toString( Qt::ISODate ), QDateTime::currentDateTime().toString( QStringLiteral( "zzz" ) ), + QString::number( VeyonCore::instance()->sessionId() ), messageType, message.trimmed() ); } From a58800665b0b0a0e415009f238d952741145d21a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:34:06 +0200 Subject: [PATCH 0983/1765] Revert "3rdparty: use LibVNC upstream repository" This reverts commit 6063fb852fa2586cce97618a488ff4cea8a7fac1. --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 347671a59..5f0ebd58a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,7 +6,7 @@ url = https://invent.kde.org/pim/kldap.git [submodule "3rdparty/libvncserver"] path = 3rdparty/libvncserver - url = https://github.com/LibVNC/libvncserver.git + url = https://github.com/veyon/libvncserver.git [submodule "3rdparty/x11vnc"] path = 3rdparty/x11vnc url = https://github.com/veyon/x11vnc.git From 63443b9d81d2419b61ded15eeef3fbeaca01694a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:17:25 +0200 Subject: [PATCH 0984/1765] 3rdparty: libvncserver: update submodule --- 3rdparty/libvncserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index 6a34178f5..a30177fd4 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit 6a34178f50838de5eacda6a55e0af2c67e9c5875 +Subproject commit a30177fd40a636a3940bfbb762d7ee0f935ed27d From 87fdba331966d02c4bd49687732689e153f4761f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:17:59 +0200 Subject: [PATCH 0985/1765] VncConnection: improve TLS socket handling --- core/src/VncConnection.cpp | 28 ++++++++++++++++++++-------- core/src/VncConnection.h | 5 +++-- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index a25329dff..ab9ed2707 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -771,8 +771,13 @@ int VncConnection::openTlsSocket( const char* hostname, int port ) -int VncConnection::readFromTlsSocket( rfbClient* client, char* buffer, unsigned int len ) +int VncConnection::readFromTlsSocket( char* buffer, unsigned int len ) { + if( m_sslSocket == nullptr ) + { + return -1; + } + if( m_sslSocket->bytesAvailable() <= 0 ) { if( m_sslSocket->waitForReadyRead(10) == false ) @@ -787,15 +792,22 @@ int VncConnection::readFromTlsSocket( rfbClient* client, char* buffer, unsigned -int VncConnection::writeToTlsSocket( rfbClient* client, const char* buffer, unsigned int len ) +int VncConnection::writeToTlsSocket( const char* buffer, unsigned int len ) { - const auto connection = static_cast( clientData( client, VncConnectionTag ) ); - if( connection ) + if( m_sslSocket == nullptr ) { - const auto ret = connection->m_sslSocket->write( buffer, len ); - connection->m_sslSocket->flush(); - return ret; + return -1; } - return -1; + const auto ret = m_sslSocket->write( buffer, len ); + m_sslSocket->flush(); + return ret; +} + + + +void VncConnection::closeTlsSocket() +{ + delete m_sslSocket; + m_sslSocket = nullptr; } diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 7f42bb212..738f781e2 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -206,8 +206,9 @@ class VEYON_CORE_EXPORT VncConnection : public QThread static void framebufferCleanup( void* framebuffer ); rfbSocket openTlsSocket( const char* hostname, int port ); - int readFromTlsSocket( rfbClient* client, char* buffer, unsigned int len ); - int writeToTlsSocket( rfbClient* client, const char* buffer, unsigned int len ); + int readFromTlsSocket( char* buffer, unsigned int len ); + int writeToTlsSocket( const char* buffer, unsigned int len ); + void closeTlsSocket(); // intervals and timeouts int m_threadTerminationTimeout{DefaultThreadTerminationTimeout}; From e7748c61d332d272b9c3b6d1ec061aded4c87e84 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:18:25 +0200 Subject: [PATCH 0986/1765] VncConnection: register TLS socket I/O handlers The custom socket I/O extension is not yet part of a libvncserver release so raise the minimum version to 0.9.14 to always use the bundled version for the time being. --- CMakeLists.txt | 2 +- core/src/VncConnection.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f52c40724..d775b2e89 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,7 +180,7 @@ if(VEYON_BUILD_LINUX) include(XdgInstall) endif() -find_package(LibVNCClient 0.9.13) +find_package(LibVNCClient 0.9.14) if(LibVNCClient_FOUND) include(CheckCSourceCompiles) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index ab9ed2707..9a051a8e7 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -376,6 +376,11 @@ void VncConnection::establishConnection() m_client->GotCursorShape = RfbClientCallback::wrap<&VncConnection::updateCursorShape>; m_client->GotXCutText = RfbClientCallback::wrap<&VncConnection::updateClipboard>; + m_client->ConnectToRFBServer = RfbClientCallback::wrap<&VncConnection::openTlsSocket, RFB_INVALID_SOCKET>; + m_client->ReadFromSocket = RfbClientCallback::wrap<&VncConnection::readFromTlsSocket, -1>; + m_client->WriteToSocket = RfbClientCallback::wrap<&VncConnection::writeToTlsSocket, -1>; + m_client->CloseSocket = RfbClientCallback::wrap<&VncConnection::closeTlsSocket>; + m_client->connectTimeout = m_connectTimeout / 1000; m_client->readTimeout = m_readTimeout / 1000; setClientData( VncConnectionTag, this ); From d879117bed7024b16f9b982713f1b9083ca25274 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Jul 2021 14:25:54 +0200 Subject: [PATCH 0987/1765] CI: add libvncserver build dependencies --- .ci/linux.debian.bullseye/Dockerfile | 1 + .ci/linux.fedora.33/Dockerfile | 1 + .ci/linux.fedora.34/Dockerfile | 1 + 3 files changed, 3 insertions(+) diff --git a/.ci/linux.debian.bullseye/Dockerfile b/.ci/linux.debian.bullseye/Dockerfile index 7a3103ada..61a70bfab 100644 --- a/.ci/linux.debian.bullseye/Dockerfile +++ b/.ci/linux.debian.bullseye/Dockerfile @@ -10,6 +10,7 @@ RUN \ libkf5itemmodels-dev \ xorg-dev \ libfakekey-dev \ + libpng-dev libjpeg-dev zlib1g-dev liblzo2-dev \ libvncserver-dev \ libssl-dev \ libpam0g-dev \ diff --git a/.ci/linux.fedora.33/Dockerfile b/.ci/linux.fedora.33/Dockerfile index a48965a54..31f122003 100644 --- a/.ci/linux.fedora.33/Dockerfile +++ b/.ci/linux.fedora.33/Dockerfile @@ -8,6 +8,7 @@ RUN \ kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ + libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ libvncserver-devel \ openssl-devel \ pam-devel \ diff --git a/.ci/linux.fedora.34/Dockerfile b/.ci/linux.fedora.34/Dockerfile index 1c4e2da67..1f0cc8090 100644 --- a/.ci/linux.fedora.34/Dockerfile +++ b/.ci/linux.fedora.34/Dockerfile @@ -8,6 +8,7 @@ RUN \ kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ + libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ libvncserver-devel \ openssl-devel \ pam-devel \ From f96ac1500522d3f804439db213392f0aedb9132f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Jul 2021 10:52:51 +0200 Subject: [PATCH 0988/1765] BuiltinX11VncServer: improve SHM support detection Make sure, deferred SHM ops are synchronized so errors can be ignored properly in the temporary X error handler. Also check XImage pointer for NULL. --- .../x11vnc-builtin/BuiltinX11VncServer.cpp | 1 + .../vncserver/x11vnc-builtin/x11vnc-veyon.c | 29 ++++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index dcad92de3..4ffed40f1 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -75,6 +75,7 @@ bool BuiltinX11VncServer::runServer( int serverPort, const Password& password ) if( hasWorkingXShm() == false ) { + vDebug() << "X shared memory extension not available - passing -noshm to x11vnc"; cmdline.append( QStringLiteral("-noshm") ); } diff --git a/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c b/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c index da91f6ed5..6a4b9ce50 100644 --- a/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c +++ b/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c @@ -20,6 +20,7 @@ static int handleXError( Display* display, XErrorEvent* error ) if( xshmOpCode > 0 && error->request_code == xshmOpCode ) { xshmAttachErrorCount++; + return 0; } return defaultXErrorHandler(display, error); @@ -32,7 +33,11 @@ static XImage* createXShmTestImage( Display* display, XShmSegmentInfo* shm ) shm->shmid = -1; shm->shmaddr = (char *) -1; - XImage* xim = XShmCreateImage(display, NULL, 32, ZPixmap, NULL, shm, 1, 1); + int screen = DefaultScreen(display); + + XImage* xim = XShmCreateImage(display, DefaultVisual(display, screen), + DefaultDepth(display, screen), + ZPixmap, NULL, shm, 1, 1); if( xim == NULL ) { return NULL; @@ -45,18 +50,26 @@ static XImage* createXShmTestImage( Display* display, XShmSegmentInfo* shm ) return xim; } - shm->shmaddr = xim->data = (char *) shmat(shm->shmid, 0, 0); + shm->shmaddr = xim->data = (char *) shmat(shm->shmid, NULL, 0); + shm->readOnly = 1; if( shm->shmaddr == (char *)-1 ) { return xim; } - if( !XShmAttach(display, shm) ) + if( XShmAttach(display, shm) ) + { + XSync(display, False); + XShmDetach(display, shm); + } + else { xshmAttachErrorCount++; } + XSync(display, False); + return xim; } @@ -94,15 +107,17 @@ int hasWorkingXShm() XShmSegmentInfo shm; XImage* xim = createXShmTestImage(display, &shm); - XShmDetach(display, &shm); - XDestroyImage(xim); + XSetErrorHandler(defaultXErrorHandler); + + if( xim ) + { + XDestroyImage(xim); + } shm_delete(&shm); XCloseDisplay(display); - XSetErrorHandler(defaultXErrorHandler); - return xshmAttachErrorCount == 0; } From 2c7deacb16ef770f7ea0b60054f58397ff53d413 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 30 Jul 2021 13:24:26 +0200 Subject: [PATCH 0989/1765] cmake: improve LibVNCServer integration Fix build when using a recent enough version of LibVNCServer for the VNC server plugin while integrating bundled version of LibVNCClient. --- CMakeLists.txt | 33 +------------------ cmake/modules/LibVNCServerIntegration.cmake | 20 +++++++++++ core/CMakeLists.txt | 4 +++ plugins/vncserver/headless/CMakeLists.txt | 2 ++ .../vncserver/x11vnc-builtin/CMakeLists.txt | 18 ---------- 5 files changed, 27 insertions(+), 50 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d775b2e89..bacd2aafb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,37 +180,6 @@ if(VEYON_BUILD_LINUX) include(XdgInstall) endif() -find_package(LibVNCClient 0.9.14) - -if(LibVNCClient_FOUND) - include(CheckCSourceCompiles) - set(CMAKE_REQUIRED_LIBRARIES LibVNC::LibVNCClient) - check_c_source_compiles(" -#include - -int main() -{ - rfbClient* client = rfbGetClient( 8, 3, 4 ); - client->connectTimeout = 1; - client->readTimeout = 1; - return 0; -} -" - LIBVNCCLIENT_SUPPORTS_TIMEOUTS) - if(NOT LIBVNCCLIENT_SUPPORTS_TIMEOUTS) - message(FATAL_ERROR "Outdated development version of LibVNCClient found") - endif() - unset(CMAKE_REQUIRED_LIBRARIES) -else() - message(WARNING "Performing internal build of LibVNCClient which requires additional development packages") - find_package(ZLIB REQUIRED) - find_package(PNG REQUIRED) - find_package(JPEG REQUIRED) - find_package(LZO REQUIRED) - set(CMAKE_THREAD_PREFER_PTHREAD TRUE) - find_package(Threads REQUIRED) -endif() - option(WITH_LTO "Build with link-time optimization" ON) option(WITH_PCH "Reduce compile time by using precompiled headers (requires CMake >= 3.16)" ON) option(WITH_UNITY_BUILD "Reduce compile time by using cmake unity builds (requires CMake >= 3.16)" ON) @@ -265,7 +234,7 @@ add_definitions( -DQT_STRICT_ITERATORS ) -file(GLOB_RECURSE IN_FILES RELATIVE ${CMAKE_SOURCE_DIR} "*config.h.in" "*.rc.in" "*.desktop.in" "*.policy.in" "*.service.in" "*.manifest.in" "*.nsi.in") +file(GLOB_RECURSE IN_FILES RELATIVE ${CMAKE_SOURCE_DIR} "veyonconfig.h.in" "*.rc.in" "*.desktop.in" "*.policy.in" "*.service.in" "*.manifest.in" "*.nsi.in") CONFIGURE_FILES(${IN_FILES}) set(CMAKE_AUTOMOC TRUE) diff --git a/cmake/modules/LibVNCServerIntegration.cmake b/cmake/modules/LibVNCServerIntegration.cmake index 06f012206..f8018c460 100644 --- a/cmake/modules/LibVNCServerIntegration.cmake +++ b/cmake/modules/LibVNCServerIntegration.cmake @@ -74,3 +74,23 @@ if(NOT HAVE_LIBVNCSERVER_IN_ADDR_T) endif() test_big_endian(LIBVNCSERVER_WORDS_BIGENDIAN) + +find_package(ZLIB REQUIRED) +find_package(PNG REQUIRED) +find_package(JPEG REQUIRED) +find_package(LZO REQUIRED) +set(CMAKE_THREAD_PREFER_PTHREAD TRUE) +find_package(Threads REQUIRED) + +set(_RFB_RFBCONFIG_H TRUE) +set(LIBVNCSERVER_HAVE_LIBJPEG TRUE) +set(LIBVNCSERVER_HAVE_LZO TRUE) +set(LIBVNCSERVER_HAVE_LIBPNG TRUE) +set(LIBVNCSERVER_HAVE_LIBPTHREAD TRUE) +set(LIBVNCSERVER_HAVE_LIBZ TRUE) +set(LIBVNCSERVER_HAVE_LIBSSL TRUE) +set(LIBVNCSERVER_ALLOW24BPP TRUE) +set(LIBVNCSERVER_IPv6 TRUE) + +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/rfb) +configure_file(${CMAKE_SOURCE_DIR}/3rdparty/libvncserver/rfb/rfbconfig.h.cmakein ${CMAKE_CURRENT_BINARY_DIR}/rfb/rfbconfig.h @ONLY) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 351885c82..47f195e80 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -13,7 +13,11 @@ set(core_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/builddata.qrc ) +find_package(LibVNCClient 0.9.14) + if(NOT LibVNCClient_FOUND) + message(WARNING "Performing internal build of LibVNCClient which requires additional development packages") + include(LibVNCServerIntegration) set(libvncclient_SOURCES ${libvncserver_DIR}/libvncclient/cursor.c ${libvncserver_DIR}/libvncclient/listen.c diff --git a/plugins/vncserver/headless/CMakeLists.txt b/plugins/vncserver/headless/CMakeLists.txt index b049d8883..a0b431598 100644 --- a/plugins/vncserver/headless/CMakeLists.txt +++ b/plugins/vncserver/headless/CMakeLists.txt @@ -12,5 +12,7 @@ build_veyon_plugin(headless-vnc-server target_link_libraries(headless-vnc-server LibVNC::LibVNCServer) +target_compile_options(headless-vnc-server PRIVATE -Wno-parentheses) + endif() diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index a4cbfda3e..337b62640 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -4,24 +4,7 @@ if(NOT VEYON_X11VNC_EXTERNAL) find_package(LibVNCServer 0.9.8) if(NOT LibVNCServer_FOUND) - ### BEGIN: libvncserver configuration include(LibVNCServerIntegration) - - set(_RFB_RFBCONFIG_H TRUE) - set(LIBVNCSERVER_HAVE_LIBJPEG TRUE) - set(LIBVNCSERVER_HAVE_LZO TRUE) - set(LIBVNCSERVER_HAVE_LIBPNG TRUE) - set(LIBVNCSERVER_HAVE_LIBPTHREAD TRUE) - set(LIBVNCSERVER_HAVE_LIBZ TRUE) - set(LIBVNCSERVER_HAVE_LIBSSL TRUE) - set(LIBVNCSERVER_ALLOW24BPP TRUE) - set(LIBVNCSERVER_IPv6 TRUE) - ### END: libvncserver configuration - - # write libvncserver configuration header - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb) - configure_file(${CMAKE_SOURCE_DIR}/3rdparty/libvncserver/rfb/rfbconfig.h.cmakein ${CMAKE_BINARY_DIR}/${VEYON_CORE_INCLUDE_DIR}/rfb/rfbconfig.h @ONLY) - endif() set(FULL_PACKAGE_NAME "Veyon") @@ -238,7 +221,6 @@ target_link_libraries(builtin-x11vnc-server ) if(LibVNCServer_FOUND) - #target_include_directories(builtin-x11vnc-server PRIVATE ${3rdparty_DIR} ${x11vnc_DIR}/src) target_link_libraries(builtin-x11vnc-server LibVNC::LibVNCServer) else() target_include_directories(builtin-x11vnc-server PRIVATE ${libvncserver_DIR}/libvncserver ${libvncserver_DIR}/common) From 4c3fc293efa938ff14b15e977939c90289385f87 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 4 Aug 2021 08:24:14 +0200 Subject: [PATCH 0990/1765] README.md: update description --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bd607b07b..db130269c 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,11 @@ ## What is Veyon? -Veyon is a free and open source software for computer monitoring and classroom -management supporting Windows and Linux. It enables teachers to view and control -computer labs and interact with students. Veyon is available in many different -languages and provides numerous features supporting teachers and administrators -at their daily work: +Veyon is a free and open source software for monitoring and controlling +computers across multiple platforms. Veyon supports you in teaching in digital +learning environments, performing virtual trainings or giving remote support. + +The following features are available in Veyon: * Overview: monitor all computers in one or multiple locations or classrooms * Remote access: view or control computers to watch and support users From e6d2578f3b01ca5c81a60769d7e51c02a7b80ff1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Aug 2021 10:04:15 +0200 Subject: [PATCH 0991/1765] CI: add openSUSE 15.3 builds --- .ci/linux.opensuse.15.3/Dockerfile | 19 +++++++++++++++++++ .ci/linux.opensuse.15.3/script.sh | 6 ++++++ .gitlab-ci.yml | 1 + 3 files changed, 26 insertions(+) create mode 100644 .ci/linux.opensuse.15.3/Dockerfile create mode 100755 .ci/linux.opensuse.15.3/script.sh diff --git a/.ci/linux.opensuse.15.3/Dockerfile b/.ci/linux.opensuse.15.3/Dockerfile new file mode 100644 index 000000000..2b8d06651 --- /dev/null +++ b/.ci/linux.opensuse.15.3/Dockerfile @@ -0,0 +1,19 @@ +FROM opensuse/leap:15.3 +MAINTAINER Tobias Junghans + +RUN \ + zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ + libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel libqt5-qtwebengine-devel \ + kitemmodels-devel \ + libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ + libfakekey-devel \ + libjpeg8-devel \ + zlib-devel \ + libpng16-devel libpng16-compat-devel \ + libopenssl-devel \ + procps-devel \ + pam-devel lzo-devel \ + libqca-qt5-devel libqca-qt5-plugins \ + cyrus-sasl-devel \ + openldap2-devel + diff --git a/.ci/linux.opensuse.15.3/script.sh b/.ci/linux.opensuse.15.3/script.sh new file mode 100755 index 000000000..6c97b69c7 --- /dev/null +++ b/.ci/linux.opensuse.15.3/script.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -e + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-rpm.sh $1 $2 "opensuse-15.3" diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a1b123e72..d13897229 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,6 +17,7 @@ build-linux: - fedora.33 - fedora.34 - opensuse.15.2 + - opensuse.15.3 - ubuntu.bionic - ubuntu.focal artifacts: From 50ee8d3bf7920dde6333053d633e48921eb3585f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Aug 2021 12:46:31 +0200 Subject: [PATCH 0992/1765] VncConnection: move constants to separate header This prevents including VncConnection in VeyonConfigurationProperties since it led to RFB headers being included which can infere with precompiled headers and platform-specific compile definitions. --- core/src/VeyonConfigurationProperties.h | 22 ++++++------- core/src/VncConnection.h | 35 +++++++-------------- core/src/VncConnectionConfiguration.h | 42 +++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 34 deletions(-) create mode 100644 core/src/VncConnectionConfiguration.h diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index fe1a7493e..b1c4d2032 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -33,7 +33,7 @@ #include "ComputerListModel.h" #include "Logger.h" #include "NetworkObjectDirectory.h" -#include "VncConnection.h" +#include "VncConnectionConfiguration.h" #define FOREACH_VEYON_CORE_CONFIG_PROPERTIES(OP) \ OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::ApplicationVersion, applicationVersion, setApplicationVersion, "ApplicationVersion", "Core", QVariant::fromValue(VeyonCore::ApplicationVersion::Version_4_0), Configuration::Property::Flag::Hidden ) \ @@ -42,16 +42,16 @@ #define FOREACH_VEYON_VNC_CONNECTION_CONFIG_PROPERTIES(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, useCustomVncConnectionSettings, setUseCustomVncConnectionSettings, "UseCustomSettings", "VncConnection", false, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionThreadTerminationTimeout, setVncConnectionThreadTerminationTimeout, "ThreadTerminationTimeout", "VncConnection", VncConnection::DefaultThreadTerminationTimeout, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionConnectTimeout, setVncConnectionConnectTimeout, "ConnectTimeout", "VncConnection", VncConnection::DefaultConnectTimeout, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionReadTimeout, setVncConnectionReadTimeout, "ReadTimeout", "VncConnection", VncConnection::DefaultReadTimeout, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionRetryInterval, setVncConnectionRetryInterval, "ConnectionRetryInterval", "VncConnection", VncConnection::DefaultConnectionRetryInterval, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionMessageWaitTimeout, setVncConnectionMessageWaitTimeout, "MessageWaitTimeout", "VncConnection", VncConnection::DefaultMessageWaitTimeout, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionFastFramebufferUpdateInterval, setVncConnectionFastFramebufferUpdateInterval, "FastFramebufferUpdateInterval", "VncConnection", VncConnection::DefaultFastFramebufferUpdateInterval, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionFramebufferUpdateWatchdogTimeout, setVncConnectionFramebufferUpdateWatchdogTimeout, "FramebufferUpdateWatchdogTimeout", "VncConnection", VncConnection::DefaultFramebufferUpdateWatchdogTimeout, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionSocketKeepaliveIdleTime, setVncConnectionSocketKeepaliveIdleTime, "SocketKeepaliveIdleTime", "VncConnection", VncConnection::DefaultSocketKeepaliveIdleTime, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionSocketKeepaliveInterval, setVncConnectionSocketKeepaliveInterval, "SocketKeepaliveInterval", "VncConnection", VncConnection::DefaultSocketKeepaliveInterval, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionSocketKeepaliveCount, setVncConnectionSocketKeepaliveCount, "SocketKeepaliveCount", "VncConnection", VncConnection::DefaultSocketKeepaliveCount, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionThreadTerminationTimeout, setVncConnectionThreadTerminationTimeout, "ThreadTerminationTimeout", "VncConnection", VncConnectionConfiguration::DefaultThreadTerminationTimeout, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionConnectTimeout, setVncConnectionConnectTimeout, "ConnectTimeout", "VncConnection", VncConnectionConfiguration::DefaultConnectTimeout, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionReadTimeout, setVncConnectionReadTimeout, "ReadTimeout", "VncConnection", VncConnectionConfiguration::DefaultReadTimeout, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionRetryInterval, setVncConnectionRetryInterval, "ConnectionRetryInterval", "VncConnection", VncConnectionConfiguration::DefaultConnectionRetryInterval, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionMessageWaitTimeout, setVncConnectionMessageWaitTimeout, "MessageWaitTimeout", "VncConnection", VncConnectionConfiguration::DefaultMessageWaitTimeout, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionFastFramebufferUpdateInterval, setVncConnectionFastFramebufferUpdateInterval, "FastFramebufferUpdateInterval", "VncConnection", VncConnectionConfiguration::DefaultFastFramebufferUpdateInterval, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionFramebufferUpdateWatchdogTimeout, setVncConnectionFramebufferUpdateWatchdogTimeout, "FramebufferUpdateWatchdogTimeout", "VncConnection", VncConnectionConfiguration::DefaultFramebufferUpdateWatchdogTimeout, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionSocketKeepaliveIdleTime, setVncConnectionSocketKeepaliveIdleTime, "SocketKeepaliveIdleTime", "VncConnection", VncConnectionConfiguration::DefaultSocketKeepaliveIdleTime, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionSocketKeepaliveInterval, setVncConnectionSocketKeepaliveInterval, "SocketKeepaliveInterval", "VncConnection", VncConnectionConfiguration::DefaultSocketKeepaliveInterval, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionSocketKeepaliveCount, setVncConnectionSocketKeepaliveCount, "SocketKeepaliveCount", "VncConnection", VncConnectionConfiguration::DefaultSocketKeepaliveCount, Configuration::Property::Flag::Hidden ) \ #define FOREACH_VEYON_UI_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QString, applicationName, setApplicationName, "ApplicationName", "UI", QStringLiteral("Veyon"), Configuration::Property::Flag::Hidden ) \ diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 738f781e2..65c023565 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -38,8 +38,9 @@ #include #include -#include "VeyonCore.h" #include "SocketDevice.h" +#include "VeyonCore.h" +#include "VncConnectionConfiguration.h" using rfbClient = struct _rfbClient; @@ -50,18 +51,6 @@ class VEYON_CORE_EXPORT VncConnection : public QThread { Q_OBJECT public: - // intervals and timeouts - static constexpr int DefaultThreadTerminationTimeout = 30000; - static constexpr int DefaultConnectTimeout = 10000; - static constexpr int DefaultReadTimeout = 30000; - static constexpr int DefaultConnectionRetryInterval = 1000; - static constexpr int DefaultMessageWaitTimeout = 500; - static constexpr int DefaultFastFramebufferUpdateInterval = 100; - static constexpr int DefaultFramebufferUpdateWatchdogTimeout = 10000; - static constexpr int DefaultSocketKeepaliveIdleTime = 1000; - static constexpr int DefaultSocketKeepaliveInterval = 500; - static constexpr int DefaultSocketKeepaliveCount = 5; - enum class Quality { Thumbnail, @@ -211,16 +200,16 @@ class VEYON_CORE_EXPORT VncConnection : public QThread void closeTlsSocket(); // intervals and timeouts - int m_threadTerminationTimeout{DefaultThreadTerminationTimeout}; - int m_connectTimeout{DefaultConnectTimeout}; - int m_readTimeout{DefaultReadTimeout}; - int m_connectionRetryInterval{DefaultConnectionRetryInterval}; - int m_messageWaitTimeout{DefaultMessageWaitTimeout}; - int m_fastFramebufferUpdateInterval{DefaultFastFramebufferUpdateInterval}; - int m_framebufferUpdateWatchdogTimeout{DefaultFramebufferUpdateWatchdogTimeout}; - int m_socketKeepaliveIdleTime{DefaultSocketKeepaliveIdleTime}; - int m_socketKeepaliveInterval{DefaultSocketKeepaliveInterval}; - int m_socketKeepaliveCount{DefaultSocketKeepaliveCount}; + int m_threadTerminationTimeout{VncConnectionConfiguration::DefaultThreadTerminationTimeout}; + int m_connectTimeout{VncConnectionConfiguration::DefaultConnectTimeout}; + int m_readTimeout{VncConnectionConfiguration::DefaultReadTimeout}; + int m_connectionRetryInterval{VncConnectionConfiguration::DefaultConnectionRetryInterval}; + int m_messageWaitTimeout{VncConnectionConfiguration::DefaultMessageWaitTimeout}; + int m_fastFramebufferUpdateInterval{VncConnectionConfiguration::DefaultFastFramebufferUpdateInterval}; + int m_framebufferUpdateWatchdogTimeout{VncConnectionConfiguration::DefaultFramebufferUpdateWatchdogTimeout}; + int m_socketKeepaliveIdleTime{VncConnectionConfiguration::DefaultSocketKeepaliveIdleTime}; + int m_socketKeepaliveInterval{VncConnectionConfiguration::DefaultSocketKeepaliveInterval}; + int m_socketKeepaliveCount{VncConnectionConfiguration::DefaultSocketKeepaliveCount}; // states and flags std::atomic m_state{State::Disconnected}; diff --git a/core/src/VncConnectionConfiguration.h b/core/src/VncConnectionConfiguration.h new file mode 100644 index 000000000..c63bb9326 --- /dev/null +++ b/core/src/VncConnectionConfiguration.h @@ -0,0 +1,42 @@ +/* + * VncConnectionConfiguration.h - declaration of VncConnectionConfiguration + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +class VncConnectionConfiguration +{ +public: + // intervals and timeouts + static constexpr int DefaultThreadTerminationTimeout = 30000; + static constexpr int DefaultConnectTimeout = 10000; + static constexpr int DefaultReadTimeout = 30000; + static constexpr int DefaultConnectionRetryInterval = 1000; + static constexpr int DefaultMessageWaitTimeout = 500; + static constexpr int DefaultFastFramebufferUpdateInterval = 100; + static constexpr int DefaultFramebufferUpdateWatchdogTimeout = 10000; + static constexpr int DefaultSocketKeepaliveIdleTime = 1000; + static constexpr int DefaultSocketKeepaliveInterval = 500; + static constexpr int DefaultSocketKeepaliveCount = 5; + +} ; From 177d185a4d18543977c65a9669eb498fc45c570c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Aug 2021 12:48:39 +0200 Subject: [PATCH 0993/1765] VncConnection: fix return value of openTlsSocket() --- core/src/VncConnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 9a051a8e7..9ccc0e45c 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -748,7 +748,7 @@ void VncConnection::framebufferCleanup( void* framebuffer ) -int VncConnection::openTlsSocket( const char* hostname, int port ) +rfbSocket VncConnection::openTlsSocket( const char* hostname, int port ) { delete m_sslSocket; From d32351efb50f913b58a9d089c681bbf031644787 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Aug 2021 12:49:08 +0200 Subject: [PATCH 0994/1765] cmake: check LibVNCClient for required features --- core/CMakeLists.txt | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 47f195e80..465cd4bf3 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -13,7 +13,29 @@ set(core_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/builddata.qrc ) -find_package(LibVNCClient 0.9.14) +find_package(LibVNCClient 0.9.13) + +if(LibVNCClient_FOUND) + include(CheckCSourceCompiles) + set(CMAKE_REQUIRED_LIBRARIES LibVNC::LibVNCClient) + check_c_source_compiles(" + #include + + int main() + { + rfbClient* client = rfbGetClient( 8, 3, 4 ); + client->ReadFromSocketProc = nullptr; + client->WriteToSocketProc = nullptr; + return 0; + } + " + LIBVNCCLIENT_SUPPORTS_CUSTOM_SOCKET_IO) + if(NOT LIBVNCCLIENT_SUPPORTS_CUSTOM_SOCKET_IO) + message(WARNING "Outdated development version of LibVNCClient found") + unset(LibVNCClient_FOUND) + endif() + unset(CMAKE_REQUIRED_LIBRARIES) +endif() if(NOT LibVNCClient_FOUND) message(WARNING "Performing internal build of LibVNCClient which requires additional development packages") From c51ab74afc8aa4eb33d717dd7de2ddcb7ec6d27e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Aug 2021 12:49:57 +0200 Subject: [PATCH 0995/1765] cmake: build with -DUNICODE/-D_UNICODE globally The only part not building with UNICODE support is UltraVNC so only disable it for this particular plugin. --- CMakeLists.txt | 1 + plugins/platform/windows/CMakeLists.txt | 6 +----- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 2 ++ 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bacd2aafb..98360ce7d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,6 +96,7 @@ endif() # set up basic platform variables if(WIN32) set(VEYON_BUILD_WIN32 1) + add_definitions(-DUNICODE -D_UNICODE) endif() if(APPLE) set(VEYON_BUILD_APPLE 1) diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index eaa63a574..9c63990dd 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -1,9 +1,5 @@ include(BuildVeyonPlugin) -add_definitions(-DUNICODE -D_UNICODE) - -set(WITH_PCH OFF) - build_veyon_plugin(windows-platform WindowsPlatformPlugin.cpp WindowsPlatformConfigurationPage.h @@ -63,4 +59,4 @@ target_include_directories(windows-platform PRIVATE target_link_libraries(windows-platform -lwtsapi32 -lnetapi32 -luserenv -linterception) target_compile_definitions(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) target_compile_options(windows-platform PRIVATE "-Wno-unknown-pragmas") -set_source_files_properties(WindowsNetworkFunctions.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) +set_source_files_properties(WindowsNetworkFunctions.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_PRECOMPILE_HEADERS TRUE) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index c306d3351..967c37c33 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -1,3 +1,5 @@ +remove_definitions(-DUNICODE -D_UNICODE) + add_subdirectory(vnchooks) include(BuildVeyonPlugin) From 189c001baeace67b7320c8c3d31ebc7b10aa88b9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Aug 2021 12:51:11 +0200 Subject: [PATCH 0996/1765] LDAP: Common: reuse global PCH --- plugins/ldap/common/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index b61da1f51..c55f3c995 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -29,6 +29,9 @@ target_include_directories(ldap-common PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(ldap-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(ldap-common kldap-light veyon-core) set_default_target_properties(ldap-common) +if(WITH_PCH) + target_precompile_headers(ldap-common REUSE_FROM veyon-pch) +endif() set_target_properties(ldap-common PROPERTIES LINK_FLAGS "-Wl,-no-undefined") if(NOT WITH_CORE_ONLY) install(TARGETS ldap-common DESTINATION ${VEYON_LIB_DIR}) From 10919746e91e9863411d036bc8a30404abcadc8c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Aug 2021 13:07:15 +0200 Subject: [PATCH 0997/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 719ea083a..77b4b09ce 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 719ea083a0c83af94c56ea6a11d17d0be9c22ea7 +Subproject commit 77b4b09ce2b8d375ea2dec8add7f8bbf104ff411 diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index 967c37c33..0645a38de 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -9,6 +9,7 @@ find_package(JPEG REQUIRED) find_package(LZO REQUIRED) set(ultravnc_CXX_SOURCES + ${ultravnc_DIR}/winvnc/winvnc/MouseSimulator.cpp ${ultravnc_DIR}/winvnc/winvnc/HideDesktop.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbRegion_win32.cpp ${ultravnc_DIR}/winvnc/winvnc/vistahook.cpp From 3da6d33e2749129a2985f1ef6c494136d60527d8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Aug 2021 13:08:21 +0200 Subject: [PATCH 0998/1765] PlatformSessionManager: add missing include --- plugins/platform/common/PlatformSessionManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index 75cc5060c..d4353004e 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include From b491ca6f474f55080ebbcfffdc04e13f8cea7d58 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 5 Aug 2021 13:46:54 +0200 Subject: [PATCH 0999/1765] cmake: CPackDefinitions: update summary/description --- cmake/CPackDefinitions.cmake | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/cmake/CPackDefinitions.cmake b/cmake/CPackDefinitions.cmake index 2cdd2ab23..1d86f3bc7 100644 --- a/cmake/CPackDefinitions.cmake +++ b/cmake/CPackDefinitions.cmake @@ -20,7 +20,7 @@ set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}-${CPACK_SYSTEM_NAME}") set(CPACK_PACKAGE_CONTACT "Tobias Junghans ") set(CPACK_PACKAGE_HOMEPAGE "https://veyon.io") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Open source computer monitoring and classroom management") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Cross-platform computer control and classroom management") set(CPACK_PACKAGE_VENDOR "Veyon Solutions") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING") set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") @@ -29,23 +29,23 @@ set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_SOURCE_DIR}/build/;${CMAKE_SOURCE_DIR}/.g set(CPACK_STRIP_FILES TRUE) # DEB package -set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "Open source computer monitoring and classroom management software - Veyon is a free and open source software for computer monitoring and classroom - management supporting Windows and Linux. It enables teachers to view and control - computer labs and interact with students. Veyon is available in many different - languages and provides numerous features supporting teachers and administrators - at their daily work: - . - * Overview: monitor all computers in one or multiple locations or classrooms - * Remote access: view or control computers to watch and support users - * Demo: broadcast the teacher's screen in realtime (fullscreen/window) - * Screen lock: draw attention to what matters right now - * Communication: send text messages to students - * Start and end lessons: log in and log out users all at once - * Screenshots: record learning progress and document infringements - * Programs & websites: launch programs and open website URLs remotely - * Teaching material: distribute and open documents, images and videos easily - * Administration: power on/off and reboot computers remotely") +set(CPACK_DEBIAN_PACKAGE_DESCRIPTION +"Veyon is a free and open source software for monitoring and controlling +computers across multiple platforms. Veyon supports you in teaching in digital +learning environments, performing virtual trainings or giving remote support. + +The following features are available in Veyon: + +* Overview: monitor all computers in one or multiple locations or classrooms +* Remote access: view or control computers to watch and support users +* Demo: broadcast the teacher's screen in realtime (fullscreen/window) +* Screen lock: draw attention to what matters right now +* Communication: send text messages to students +* Start and end lessons: log in and log out users all at once +* Screenshots: record learning progress and document infringements +* Programs & websites: launch programs and open website URLs remotely +* Teaching material: distribute and open documents, images and videos easily +* Administration: power on/off and reboot computers remotely") set(CPACK_DEBIAN_PACKAGE_SECTION "Education") set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqca-qt5-2-plugins, qml-module-qtquick2, qml-module-qtquick-dialogs, qml-module-qtquick-layouts, qml-module-qtqml-models2, qml-module-qtquick-controls2, qml-module-qtquick-window2") set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) From 230f9dda1afbe3ae3bfa568de7a86b114a9b480b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:59:59 +0100 Subject: [PATCH 1000/1765] WindowsCoreFunctions: add log messages --- plugins/platform/windows/WindowsCoreFunctions.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 4521c6b5a..45a0eb730 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -363,11 +363,13 @@ bool WindowsCoreFunctions::enablePrivilege( LPCWSTR privilegeName, bool enable ) if( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ, &token ) ) { + vCritical() << "could not open process token"; return false; } if( !LookupPrivilegeValue( nullptr, privilegeName, &luid ) ) { + vCritical() << "could lookup privilege value"; return false; } From abfb30a5cdde3ea6388dfd246aeabf32c20d41f0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 15:23:14 +0200 Subject: [PATCH 1001/1765] WindowsCoreFunctions: fix log message --- plugins/platform/windows/WindowsCoreFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 45a0eb730..2cffa0f45 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -369,7 +369,7 @@ bool WindowsCoreFunctions::enablePrivilege( LPCWSTR privilegeName, bool enable ) if( !LookupPrivilegeValue( nullptr, privilegeName, &luid ) ) { - vCritical() << "could lookup privilege value"; + vCritical() << "could not lookup privilege value"; return false; } From 64351c07582ea40e0279a1450da5e6cee8d1c774 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 15:27:53 +0200 Subject: [PATCH 1002/1765] WindowsUserFunctions: refactor domainController() Use DsGetDcName() before falling back to NetGetDCName(). This allows using DCs other than the PDC in multi-DC setups. --- .../platform/windows/WindowsUserFunctions.cpp | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index e70c176d5..611f38cde 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -22,6 +22,8 @@ * */ +#include + #include #include "DesktopInputController.h" @@ -297,21 +299,35 @@ bool WindowsUserFunctions::authenticate( const QString& username, const Password QString WindowsUserFunctions::domainController() { - QString dcName; - LPBYTE outBuffer = nullptr; + PDOMAIN_CONTROLLER_INFO dcInfo; - if( NetGetDCName( nullptr, nullptr, &outBuffer ) == NERR_Success ) + const auto dsResult = DsGetDcName( nullptr, nullptr, nullptr, nullptr, DS_DIRECTORY_SERVICE_REQUIRED, &dcInfo ); + if( dsResult == ERROR_SUCCESS ) { - dcName = QString::fromUtf16( reinterpret_cast( outBuffer ) ); + const auto dcName = QString::fromUtf16( reinterpret_cast( dcInfo->DomainControllerName ) ). + replace( QLatin1Char('\\'), QString() ); - NetApiBufferFree( outBuffer ); + NetApiBufferFree( dcInfo ); + + return dcName; } - else + + vWarning() << "DsGetDcName() failed with" << dsResult << "falling back to NetGetDCName()"; + + LPBYTE outBuffer = nullptr; + const auto netResult = NetGetDCName( nullptr, nullptr, &outBuffer ); + if( netResult == NERR_Success ) { - vWarning() << "could not query domain controller name!"; + const auto dcName = QString::fromUtf16( reinterpret_cast( outBuffer ) ); + + NetApiBufferFree( outBuffer ); + + return dcName; } - return dcName; + vWarning() << "querying domain controller for domain" << domainName << "failed with:" << netResult; + + return {}; } From 88d0106373ad39c07c9287443d5ab56139d92634 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 16:08:04 +0200 Subject: [PATCH 1003/1765] WindowsUserFunctions: allow passing domain name to domainController() --- plugins/platform/windows/WindowsUserFunctions.cpp | 9 ++++++--- plugins/platform/windows/WindowsUserFunctions.h | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 611f38cde..59561e3f4 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -297,11 +297,14 @@ bool WindowsUserFunctions::authenticate( const QString& username, const Password -QString WindowsUserFunctions::domainController() +QString WindowsUserFunctions::domainController( const QString& domainName ) { + const auto domainNamePointer = domainName.isEmpty() ? nullptr + : WindowsCoreFunctions::toConstWCharArray(domainName); + PDOMAIN_CONTROLLER_INFO dcInfo; - const auto dsResult = DsGetDcName( nullptr, nullptr, nullptr, nullptr, DS_DIRECTORY_SERVICE_REQUIRED, &dcInfo ); + const auto dsResult = DsGetDcName( nullptr, domainNamePointer, nullptr, nullptr, DS_DIRECTORY_SERVICE_REQUIRED, &dcInfo ); if( dsResult == ERROR_SUCCESS ) { const auto dcName = QString::fromUtf16( reinterpret_cast( dcInfo->DomainControllerName ) ). @@ -315,7 +318,7 @@ QString WindowsUserFunctions::domainController() vWarning() << "DsGetDcName() failed with" << dsResult << "falling back to NetGetDCName()"; LPBYTE outBuffer = nullptr; - const auto netResult = NetGetDCName( nullptr, nullptr, &outBuffer ); + const auto netResult = NetGetDCName( nullptr, domainNamePointer, &outBuffer ); if( netResult == NERR_Success ) { const auto dcName = QString::fromUtf16( reinterpret_cast( outBuffer ) ); diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index d59288425..93e506b96 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -51,7 +51,7 @@ class WindowsUserFunctions : public PlatformUserFunctions private: - static QString domainController(); + static QString domainController( const QString& domainName = {} ); static QStringList domainUserGroups(); static QStringList domainGroupsOfUser( const QString& username ); From 81aeb38b3f468ab78f0d8be54056460e9ed7459f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 16:10:11 +0200 Subject: [PATCH 1004/1765] WindowsUserFunctions: add domainFromUsername() --- plugins/platform/windows/WindowsUserFunctions.cpp | 13 +++++++++++++ plugins/platform/windows/WindowsUserFunctions.h | 1 + 2 files changed, 14 insertions(+) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 59561e3f4..32739368a 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -297,6 +297,19 @@ bool WindowsUserFunctions::authenticate( const QString& username, const Password +QString WindowsUserFunctions::domainFromUsername( const QString& username ) +{ + const auto nameParts = username.split( QLatin1Char('\\') ); + if( nameParts.size() > 1 ) + { + return nameParts[0]; + } + + return {}; +} + + + QString WindowsUserFunctions::domainController( const QString& domainName ) { const auto domainNamePointer = domainName.isEmpty() ? nullptr diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index 93e506b96..b543da699 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -51,6 +51,7 @@ class WindowsUserFunctions : public PlatformUserFunctions private: + static QString domainFromUsername( const QString& username ); static QString domainController( const QString& domainName = {} ); static QStringList domainUserGroups(); static QStringList domainGroupsOfUser( const QString& username ); From 3c6a6b9eb61e73e73419f10ffeb19d967fe8b89a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 16:11:19 +0200 Subject: [PATCH 1005/1765] WindowsUserFunctions: refactor fullName() Use the new helper methods for determining the domain controller as well as the domain name from the username. --- .../platform/windows/WindowsUserFunctions.cpp | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 32739368a..ce9b2e7bc 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -47,27 +47,24 @@ QString WindowsUserFunctions::fullName( const QString& username ) { - QString fullName; - - auto realUsername = username; - LPWSTR domainController = nullptr; + QString dcName; - const auto nameParts = username.split( QLatin1Char('\\') ); - if( nameParts.size() > 1 ) + const auto domain = domainFromUsername(username); + if( domain.isEmpty() == false ) { - realUsername = nameParts[1]; - if( NetGetDCName( nullptr, WindowsCoreFunctions::toConstWCharArray( nameParts[0] ), - reinterpret_cast( &domainController ) ) != NERR_Success ) - { - domainController = nullptr; - } + dcName = domainController(domain); } + const auto usernameWithoutDomain = VeyonCore::stripDomain(username); + LPUSER_INFO_2 buf = nullptr; - const auto nStatus = NetUserGetInfo( domainController, - WindowsCoreFunctions::toConstWCharArray( realUsername ), + const auto nStatus = NetUserGetInfo( dcName.isEmpty() ? nullptr + : WindowsCoreFunctions::toConstWCharArray(dcName), + WindowsCoreFunctions::toConstWCharArray( usernameWithoutDomain ), 2, reinterpret_cast( &buf ) ); + QString fullName; + if( nStatus == NERR_Success && buf != nullptr ) { fullName = QString::fromWCharArray( buf->usri2_full_name ); @@ -78,11 +75,6 @@ QString WindowsUserFunctions::fullName( const QString& username ) NetApiBufferFree( buf ); } - if( domainController != nullptr ) - { - NetApiBufferFree( domainController ); - } - return fullName; } From 3ee2e92bf214ae6a2e76093dd5eb1f1d631b4748 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 16:14:15 +0200 Subject: [PATCH 1006/1765] WindowsUserFunctions: extend log messages in domainUserGroups() --- .../platform/windows/WindowsUserFunctions.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index ce9b2e7bc..b103c20bc 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -344,17 +344,17 @@ QStringList WindowsUserFunctions::domainUserGroups() { const auto dc = domainController(); - QStringList groupList; - LPBYTE outBuffer = nullptr; DWORD entriesRead = 0; DWORD totalEntries = 0; - if( NetGroupEnum( WindowsCoreFunctions::toConstWCharArray( dc ), 0, &outBuffer, MAX_PREFERRED_LENGTH, - &entriesRead, &totalEntries, nullptr ) == NERR_Success ) + const auto status = NetGroupEnum( WindowsCoreFunctions::toConstWCharArray(dc), 0, &outBuffer, MAX_PREFERRED_LENGTH, + &entriesRead, &totalEntries, nullptr ); + if( status == NERR_Success ) { const auto* groupInfos = reinterpret_cast( outBuffer ); + QStringList groupList; groupList.reserve( static_cast( entriesRead ) ); for( DWORD i = 0; i < entriesRead; ++i ) @@ -364,17 +364,19 @@ QStringList WindowsUserFunctions::domainUserGroups() if( entriesRead < totalEntries ) { - vWarning() << "not all domain groups fetched"; + vWarning() << "not all domain groups fetched from DC" << dc << entriesRead << totalEntries; } NetApiBufferFree( outBuffer ); + + return groupList; } else { - vWarning() << "could not fetch domain groups"; + vWarning() << "failed to fetch domain groups from DC" << dc << status; } - return groupList; + return {}; } From 67241a17dd1b8af703b51195cff2027d952fb27d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 16:15:36 +0200 Subject: [PATCH 1007/1765] WindowsUserFunctions: extend log messages in localUserGroups() --- plugins/platform/windows/WindowsUserFunctions.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index b103c20bc..14791bef5 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -426,16 +426,17 @@ QStringList WindowsUserFunctions::domainGroupsOfUser( const QString& username ) QStringList WindowsUserFunctions::localUserGroups() { - QStringList groupList; - LPBYTE outBuffer = nullptr; DWORD entriesRead = 0; DWORD totalEntries = 0; - if( NetLocalGroupEnum( nullptr, 0, &outBuffer, MAX_PREFERRED_LENGTH, &entriesRead, &totalEntries, nullptr ) == NERR_Success ) + const auto result = NetLocalGroupEnum( nullptr, 0, &outBuffer, MAX_PREFERRED_LENGTH, + &entriesRead, &totalEntries, nullptr ); + if( result == NERR_Success ) { const auto* groupInfos = reinterpret_cast( outBuffer ); + QStringList groupList; groupList.reserve( static_cast( entriesRead ) ); for( DWORD i = 0; i < entriesRead; ++i ) @@ -445,17 +446,19 @@ QStringList WindowsUserFunctions::localUserGroups() if( entriesRead < totalEntries ) { - vWarning() << "not all local groups fetched"; + vWarning() << "not all local groups fetched" << entriesRead << totalEntries; } NetApiBufferFree( outBuffer ); + + return groupList; } else { - vWarning() << "could not fetch local groups"; + vWarning() << "failed to fetch local groups:" << result; } - return groupList; + return {}; } From 3c6ffd86ad2998c107d67aa827b7c41e0f41338d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 16:29:10 +0200 Subject: [PATCH 1008/1765] WindowsUserFunctions: extend log messages in localGroupsOfUser() --- .../platform/windows/WindowsUserFunctions.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 14791bef5..d80548eeb 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -465,18 +465,18 @@ QStringList WindowsUserFunctions::localUserGroups() QStringList WindowsUserFunctions::localGroupsOfUser( const QString& username ) { - QStringList groupList; - LPBYTE outBuffer = nullptr; DWORD entriesRead = 0; DWORD totalEntries = 0; - if( NetUserGetLocalGroups( nullptr, WindowsCoreFunctions::toConstWCharArray( username ), - 0, 0, &outBuffer, MAX_PREFERRED_LENGTH, - &entriesRead, &totalEntries ) == NERR_Success ) + const auto result = NetUserGetLocalGroups( nullptr, WindowsCoreFunctions::toConstWCharArray(username), + 0, 0, &outBuffer, MAX_PREFERRED_LENGTH, + &entriesRead, &totalEntries ); + if( result == NERR_Success ) { const auto* localGroupUsersInfo = reinterpret_cast( outBuffer ); + QStringList groupList; groupList.reserve( static_cast( entriesRead ) ); for( DWORD i = 0; i < entriesRead; ++i ) @@ -486,15 +486,17 @@ QStringList WindowsUserFunctions::localGroupsOfUser( const QString& username ) if( entriesRead < totalEntries ) { - vWarning() << "not all local groups fetched for user" << username; + vWarning() << "not all local groups fetched for user" << username << entriesRead << totalEntries; } NetApiBufferFree( outBuffer ); + + return groupList; } else { - vWarning() << "could not fetch local groups for user" << username; + vWarning() << "failed to fetch local groups for user" << username << result; } - return groupList; + return {}; } From 636c1988e0ee14dcd7c4e95aa6ffceb4e962df36 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 16:30:20 +0200 Subject: [PATCH 1009/1765] WindowsUserFunctions: refactor domainGroupsOfUser() Properly resolve the domain controller belonging to the domain of a user. Also extend log messages to include more information. --- .../platform/windows/WindowsUserFunctions.cpp | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index d80548eeb..57caa01b8 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -383,23 +383,22 @@ QStringList WindowsUserFunctions::domainUserGroups() QStringList WindowsUserFunctions::domainGroupsOfUser( const QString& username ) { - const auto dc = domainController(); - - QStringList groupList; + const auto dc = domainController( domainFromUsername(username) ); + const auto usernameWithoutDomain = VeyonCore::stripDomain(username); LPBYTE outBuffer = nullptr; DWORD entriesRead = 0; DWORD totalEntries = 0; - const auto usernameWithoutDomain = VeyonCore::stripDomain( username ); - - if( NetUserGetGroups( WindowsCoreFunctions::toConstWCharArray( dc ), - WindowsCoreFunctions::toConstWCharArray( usernameWithoutDomain ), - 0, &outBuffer, MAX_PREFERRED_LENGTH, - &entriesRead, &totalEntries ) == NERR_Success ) + const auto status = NetUserGetGroups( WindowsCoreFunctions::toConstWCharArray(dc), + WindowsCoreFunctions::toConstWCharArray(usernameWithoutDomain), + 0, &outBuffer, MAX_PREFERRED_LENGTH, + &entriesRead, &totalEntries ); + if( status == NERR_Success ) { const auto* groupUsersInfo = reinterpret_cast( outBuffer ); + QStringList groupList; groupList.reserve( static_cast( entriesRead ) ); for( DWORD i = 0; i < entriesRead; ++i ) @@ -409,17 +408,20 @@ QStringList WindowsUserFunctions::domainGroupsOfUser( const QString& username ) if( entriesRead < totalEntries ) { - vWarning() << "not all domain groups fetched for user" << username; + vWarning() << "not all domain groups fetched for user" << username << "from DC" << dc + << entriesRead << totalEntries; } NetApiBufferFree( outBuffer ); + + return groupList; } else { - vWarning() << "could not fetch domain groups for user" << username; + vWarning() << "failed to fetch domain groups for user" << username << "from DC" << dc << status; } - return groupList; + return {}; } From 6a520f67f7dce36b4f860278d0d3123aa5e6fbdf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Aug 2021 16:48:55 +0200 Subject: [PATCH 1010/1765] WindowsServiceControl: add more service dependencies Both the LSM and LanmanWorkstation may be required for properly resolving session and user information. --- plugins/platform/windows/WindowsServiceControl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 0df3e950c..cc5272232 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -172,7 +172,7 @@ bool WindowsServiceControl::install( const QString& filePath, const QString& dis WindowsCoreFunctions::toConstWCharArray( binaryPath ), // service's binary nullptr, // no load ordering group nullptr, // no tag identifier - L"Tcpip\0RpcSs\0\0", // dependencies + L"Tcpip\0RpcSs\0LSM\0LanmanWorkstation\0\0", // dependencies nullptr, // LocalSystem account nullptr ); // no password From 29840006e0c96c253f7e4a907bcb3751fb37e578 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Aug 2021 09:33:39 +0200 Subject: [PATCH 1011/1765] BuiltinX11VncServer: make SHM detection more robust There seem to be some corner cases where the server crashes when calling XCloseDisplay(). Therefore make sure to call XSync() before. Also use own implementation for SHM destruction to fix build with VEYON_X11VNC_EXTERNAL. --- .../vncserver/x11vnc-builtin/x11vnc-veyon.c | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c b/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c index 6a4b9ce50..a7a6ad3e7 100644 --- a/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c +++ b/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c @@ -12,14 +12,14 @@ #include static int xshmOpCode = 0; -static int xshmAttachErrorCount = 0; +static int shmErrorCount = 0; static XErrorHandler defaultXErrorHandler = NULL; static int handleXError( Display* display, XErrorEvent* error ) { if( xshmOpCode > 0 && error->request_code == xshmOpCode ) { - xshmAttachErrorCount++; + shmErrorCount++; return 0; } @@ -33,13 +33,14 @@ static XImage* createXShmTestImage( Display* display, XShmSegmentInfo* shm ) shm->shmid = -1; shm->shmaddr = (char *) -1; - int screen = DefaultScreen(display); + const int screen = DefaultScreen(display); XImage* xim = XShmCreateImage(display, DefaultVisual(display, screen), DefaultDepth(display, screen), ZPixmap, NULL, shm, 1, 1); if( xim == NULL ) { + shmErrorCount++; return NULL; } @@ -47,14 +48,16 @@ static XImage* createXShmTestImage( Display* display, XShmSegmentInfo* shm ) if( shm->shmid == -1 ) { + shmErrorCount++; return xim; } shm->shmaddr = xim->data = (char *) shmat(shm->shmid, NULL, 0); - shm->readOnly = 1; + shm->readOnly = False; if( shm->shmaddr == (char *)-1 ) { + shmErrorCount++; return xim; } @@ -65,7 +68,7 @@ static XImage* createXShmTestImage( Display* display, XShmSegmentInfo* shm ) } else { - xshmAttachErrorCount++; + shmErrorCount++; } XSync(display, False); @@ -77,15 +80,9 @@ static XImage* createXShmTestImage( Display* display, XShmSegmentInfo* shm ) int hasWorkingXShm() { - xshmAttachErrorCount = 0; + shmErrorCount = 0; - char* displayName = NULL; - if( getenv("DISPLAY") ) - { - displayName = getenv("DISPLAY"); - } - - Display* display = XOpenDisplay(displayName); + Display* display = XOpenDisplay(NULL); if( display == NULL ) { return 0; @@ -114,11 +111,21 @@ int hasWorkingXShm() XDestroyImage(xim); } - shm_delete(&shm); + if( shm.shmaddr != (char *) -1 ) + { + shmdt(shm.shmaddr); + } + + if( shm.shmid != -1 ) + { + shmctl(shm.shmid, IPC_RMID, 0); + } + + XSync(display, False); XCloseDisplay(display); - return xshmAttachErrorCount == 0; + return shmErrorCount == 0; } #else From 7e04aa461ba15f0206f087dd04ae24f50511060e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Aug 2021 19:41:50 +0200 Subject: [PATCH 1012/1765] NetworkObject: store reference to source directory Also add/use NetworkObjectDirectory::rootObject() to avoid object creations and use a consistent root object with directory reference. --- core/src/NetworkObject.cpp | 12 +++++-- core/src/NetworkObject.h | 13 +++++-- core/src/NetworkObjectDirectory.h | 9 +++-- plugins/builtindirectory/BuiltinDirectory.cpp | 9 +++-- .../BuiltinDirectoryConfigurationPage.cpp | 16 +++++---- .../BuiltinDirectoryPlugin.cpp | 24 +++++++------ .../common/LdapNetworkObjectDirectory.cpp | 36 +++++++++---------- .../ldap/common/LdapNetworkObjectDirectory.h | 3 +- 8 files changed, 74 insertions(+), 48 deletions(-) diff --git a/core/src/NetworkObject.cpp b/core/src/NetworkObject.cpp index ef7362918..31022e84a 100644 --- a/core/src/NetworkObject.cpp +++ b/core/src/NetworkObject.cpp @@ -34,6 +34,7 @@ const QUuid NetworkObject::networkObjectNamespace( QStringLiteral( "8a6c479e-243 NetworkObject::NetworkObject( const NetworkObject& other ) : + m_directory( other.directory() ), m_properties( other.properties() ), m_type( other.type() ), m_name( other.name() ), @@ -45,11 +46,13 @@ NetworkObject::NetworkObject( const NetworkObject& other ) : -NetworkObject::NetworkObject( NetworkObject::Type type, +NetworkObject::NetworkObject( NetworkObjectDirectory* directory, + NetworkObject::Type type, const Name& name, const QVariantMap& properties, Uid uid, Uid parentUid ) : + m_directory( directory ), m_properties( properties ), m_type( type ), m_name( name ), @@ -66,7 +69,8 @@ NetworkObject::NetworkObject( NetworkObject::Type type, -NetworkObject::NetworkObject( const QJsonObject& jsonObject ) : +NetworkObject::NetworkObject( const QJsonObject& jsonObject, NetworkObjectDirectory* directory ) : + m_directory( directory ), m_properties( jsonObject.toVariantMap() ), m_type( Type( jsonObject.value( propertyKey( Property::Type ) ).toInt() ) ), m_name( jsonObject.value( propertyKey( Property::Name ) ).toString() ), @@ -80,6 +84,7 @@ NetworkObject::NetworkObject( const QJsonObject& jsonObject ) : NetworkObject& NetworkObject::operator=( const NetworkObject& other ) { + m_directory = other.directory(); m_type = other.type(); m_name = other.name(); m_uid = other.uid(); @@ -100,7 +105,8 @@ bool NetworkObject::operator==( const NetworkObject& other ) const bool NetworkObject::exactMatch( const NetworkObject& other ) const { - return uid() == other.uid() && + return directory() == other.directory() && + uid() == other.uid() && type() == other.type() && name() == other.name() && properties() == other.properties() && diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index 8f6c49293..08be12328 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -30,6 +30,8 @@ #include "HashList.h" #include "VeyonCore.h" +class NetworkObjectDirectory; + class VEYON_CORE_EXPORT NetworkObject { Q_GADGET @@ -64,12 +66,13 @@ class VEYON_CORE_EXPORT NetworkObject Q_ENUM(Property) NetworkObject( const NetworkObject& other ); - explicit NetworkObject( Type type = Type::None, + explicit NetworkObject( NetworkObjectDirectory* directory = nullptr, + Type type = Type::None, const Name& name = {}, const Properties& properties = {}, Uid uid = {}, Uid parentUid = {} ); - explicit NetworkObject( const QJsonObject& jsonObject ); + explicit NetworkObject( const QJsonObject& jsonObject, NetworkObjectDirectory* directory = nullptr ); ~NetworkObject() = default; NetworkObject& operator=( const NetworkObject& other ); @@ -77,6 +80,11 @@ class VEYON_CORE_EXPORT NetworkObject bool operator==( const NetworkObject& other ) const; bool exactMatch( const NetworkObject& other ) const; + NetworkObjectDirectory* directory() const + { + return m_directory; + } + bool isValid() const { return type() != Type::None; @@ -131,6 +139,7 @@ class VEYON_CORE_EXPORT NetworkObject private: Uid calculateUid() const; + NetworkObjectDirectory* m_directory; Properties m_properties; Type m_type; QString m_name; diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 723cdede7..6f82e2af0 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -53,6 +53,11 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject NetworkObject::ModelId childId( NetworkObject::ModelId parent, int index ) const; NetworkObject::ModelId parentId( NetworkObject::ModelId child ) const; + const NetworkObject& rootObject() const + { + return m_rootObject; + } + NetworkObject::ModelId rootId() const; virtual NetworkObjectList queryObjects( NetworkObject::Type type, @@ -74,8 +79,8 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject private: QTimer* m_updateTimer{nullptr}; QHash m_objects{}; - NetworkObject m_invalidObject{NetworkObject::Type::None}; - NetworkObject m_rootObject{NetworkObject::Type::Root}; + NetworkObject m_invalidObject{this, NetworkObject::Type::None}; + NetworkObject m_rootObject{this, NetworkObject::Type::Root}; NetworkObjectList m_defaultObjectList{}; Q_SIGNALS: diff --git a/plugins/builtindirectory/BuiltinDirectory.cpp b/plugins/builtindirectory/BuiltinDirectory.cpp index f4e7fc977..ab5694433 100644 --- a/plugins/builtindirectory/BuiltinDirectory.cpp +++ b/plugins/builtindirectory/BuiltinDirectory.cpp @@ -44,23 +44,22 @@ void BuiltinDirectory::update() const auto networkObjects = m_configuration.networkObjects(); NetworkObjectUidList groupUids; - NetworkObject rootObject{ NetworkObject::Type::Root }; for( const auto& networkObjectValue : networkObjects ) { - const NetworkObject networkObject( networkObjectValue.toObject() ); + const NetworkObject networkObject{networkObjectValue.toObject(), this}; if( networkObject.type() == NetworkObject::Type::Location ) { groupUids.append( networkObject.uid() ); // clazy:exclude=reserve-candidates - addOrUpdateObject( networkObject, rootObject ); + addOrUpdateObject( networkObject, rootObject() ); updateLocation( networkObject, networkObjects ); } } - removeObjects( rootObject, [groupUids]( const NetworkObject& object ) { + removeObjects( rootObject(), [groupUids]( const NetworkObject& object ) { return object.type() == NetworkObject::Type::Location && groupUids.contains( object.uid() ) == false; } ); } @@ -72,7 +71,7 @@ void BuiltinDirectory::updateLocation( const NetworkObject& locationObject, cons for( const auto& networkObjectValue : networkObjects ) { - NetworkObject networkObject( networkObjectValue.toObject() ); + NetworkObject networkObject{networkObjectValue.toObject(), this}; if( networkObject.parentUid() == locationObject.uid() ) { diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp index c95bc41a9..92ff7c5a9 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp @@ -78,7 +78,8 @@ void BuiltinDirectoryConfigurationPage::applyConfiguration() void BuiltinDirectoryConfigurationPage::addLocation() { ObjectManager objectManager( m_configuration.networkObjects() ); - objectManager.add( NetworkObject( NetworkObject::Type::Location, tr( "New location" ), + objectManager.add( NetworkObject( nullptr, + NetworkObject::Type::Location, tr( "New location" ), {}, QUuid::createUuid() ) ); m_configuration.setNetworkObjects( objectManager.objects() ); @@ -140,7 +141,8 @@ void BuiltinDirectoryConfigurationPage::addComputer() } ObjectManager objectManager( m_configuration.networkObjects() ); - objectManager.add( NetworkObject( NetworkObject::Type::Host, tr( "New computer" ), + objectManager.add( NetworkObject( nullptr, + NetworkObject::Type::Host, tr( "New computer" ), {}, QUuid::createUuid(), currentLocationUid ) ); @@ -195,7 +197,7 @@ void BuiltinDirectoryConfigurationPage::populateLocations() const auto networkObjects = m_configuration.networkObjects(); for( const auto& networkObjectValue : networkObjects ) { - const NetworkObject networkObject( networkObjectValue.toObject() ); + const NetworkObject networkObject{networkObjectValue.toObject()}; if( networkObject.type() == NetworkObject::Type::Location ) { auto item = new QTableWidgetItem( networkObject.name() ); @@ -227,7 +229,7 @@ void BuiltinDirectoryConfigurationPage::populateComputers() const auto networkObjects = m_configuration.networkObjects(); for( const auto& networkObjectValue : networkObjects ) { - const NetworkObject networkObject( networkObjectValue.toObject() ); + const NetworkObject networkObject{networkObjectValue.toObject()}; if( networkObject.type() == NetworkObject::Type::Host && networkObject.parentUid() == parentUid ) @@ -254,7 +256,8 @@ NetworkObject BuiltinDirectoryConfigurationPage::currentLocationObject() const const auto selectedLocation = ui->locationTableWidget->currentItem(); if( selectedLocation ) { - return NetworkObject( NetworkObject::Type::Location, + return NetworkObject( nullptr, + NetworkObject::Type::Location, selectedLocation->text(), {}, selectedLocation->data( NetworkObjectModel::UidRole ).toUuid(), @@ -275,7 +278,8 @@ NetworkObject BuiltinDirectoryConfigurationPage::currentComputerObject() const auto hostAddressItem = ui->computerTableWidget->item( row, 1 ); auto macAddressItem = ui->computerTableWidget->item( row, 2 ); - return NetworkObject( NetworkObject::Type::Host, + return NetworkObject( nullptr, + NetworkObject::Type::Host, nameItem->text(), { { NetworkObject::propertyKey(NetworkObject::Property::HostAddress), hostAddressItem->text().trimmed() }, diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index b7bd9e762..5a02ca902 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -202,7 +202,7 @@ CommandLinePluginInterface::RunResult BuiltinDirectoryPlugin::handle_add( const if( type == typeLocation() ) { - object = NetworkObject( NetworkObject::Type::Location, name ); + object = NetworkObject( nullptr, NetworkObject::Type::Location, name ); } else if( type == typeComputer() ) { @@ -213,7 +213,7 @@ CommandLinePluginInterface::RunResult BuiltinDirectoryPlugin::handle_add( const } const auto macAddress = arguments.value( 3 ); const auto parent = findNetworkObject( arguments.value( 4 ) ); - object = NetworkObject( NetworkObject::Type::Host, name, + object = NetworkObject( nullptr, NetworkObject::Type::Host, name, { { NetworkObject::propertyKey(NetworkObject::Property::HostAddress), hostAddress }, { NetworkObject::propertyKey(NetworkObject::Property::MacAddress), macAddress } @@ -259,7 +259,7 @@ CommandLinePluginInterface::RunResult BuiltinDirectoryPlugin::handle_dump( const { for( const auto& networkObjectValue : objects ) { - tableRows.append( dumpNetworkObject( NetworkObject( networkObjectValue.toObject() ) ) ); + tableRows.append( dumpNetworkObject( NetworkObject{networkObjectValue.toObject()} ) ); } } else @@ -278,7 +278,7 @@ CommandLinePluginInterface::RunResult BuiltinDirectoryPlugin::handle_list( const { if( arguments.isEmpty() ) { - listObjects( m_configuration.networkObjects(), NetworkObject( NetworkObject::Type::None ) ); + listObjects( m_configuration.networkObjects(), NetworkObject{} ); } else { @@ -472,7 +472,7 @@ void BuiltinDirectoryPlugin::listObjects( const QJsonArray& objects, const Netwo { for( const auto& networkObjectValue : objects ) { - const NetworkObject networkObject( networkObjectValue.toObject() ); + const NetworkObject networkObject{networkObjectValue.toObject()}; if( ( parent.type() == NetworkObject::Type::None && networkObject.parentUid().isNull() ) || networkObject.parentUid() == parent.uid() ) @@ -611,14 +611,15 @@ bool BuiltinDirectoryPlugin::importFile( QFile& inputFile, } else if( parentLocation.isValid() == false ) { - parentLocation = NetworkObject( NetworkObject::Type::Location, it.key() ); + parentLocation = NetworkObject( nullptr, NetworkObject::Type::Location, it.key() ); objectManager.update( parentLocation, true ); parentLocationUid = parentLocation.uid(); } for( const NetworkObject& networkObject : qAsConst(it.value()) ) { - objectManager.update( NetworkObject( networkObject.type(), + objectManager.update( NetworkObject( nullptr, + networkObject.type(), networkObject.name(), networkObject.properties(), {}, @@ -650,7 +651,7 @@ bool BuiltinDirectoryPlugin::exportFile( QFile& outputFile, const QString& forma for( auto it = networkObjects.constBegin(), end = networkObjects.constEnd(); it != end; ++it ) { - const NetworkObject networkObject( it->toObject() ); + const NetworkObject networkObject{it->toObject()}; auto currentLocation = location; @@ -732,7 +733,7 @@ NetworkObject BuiltinDirectoryPlugin::toNetworkObject( const QString& line, cons if( objectType == NetworkObject::Type::Location ) { - return NetworkObject( NetworkObject::Type::Location, name ); + return NetworkObject( nullptr, NetworkObject::Type::Location, name ); } if( location.isEmpty() && locationIndex != -1 ) @@ -748,14 +749,15 @@ NetworkObject BuiltinDirectoryPlugin::toNetworkObject( const QString& line, cons { name = host; } - return NetworkObject( NetworkObject::Type::Host, name, + return NetworkObject( nullptr, + NetworkObject::Type::Host, name, { { NetworkObject::propertyKey(NetworkObject::Property::HostAddress), host }, { NetworkObject::propertyKey(NetworkObject::Property::MacAddress), mac } } ); } - return NetworkObject( NetworkObject::Type::None ); + return NetworkObject{}; } diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index 28f8f7526..2717ad138 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -56,15 +56,15 @@ NetworkObjectList LdapNetworkObjectDirectory::queryParents( const NetworkObject& switch( object.type() ) { case NetworkObject::Type::Host: - return { NetworkObject( NetworkObject::Type::Location, + return { NetworkObject( this, NetworkObject::Type::Location, m_ldapDirectory.locationsOfComputer( object.property( NetworkObject::Property::DirectoryAddress ).toString() ).value( 0 ) ) }; case NetworkObject::Type::Location: - return { NetworkObject( NetworkObject::Type::Root ) }; + return { rootObject() }; default: break; } - return { NetworkObject( NetworkObject::Type::None ) }; + return { NetworkObject( this, NetworkObject::Type::None ) }; } @@ -72,18 +72,17 @@ NetworkObjectList LdapNetworkObjectDirectory::queryParents( const NetworkObject& void LdapNetworkObjectDirectory::update() { const auto locations = m_ldapDirectory.computerLocations(); - const NetworkObject rootObject( NetworkObject::Type::Root ); for( const auto& location : qAsConst( locations ) ) { - const NetworkObject locationObject( NetworkObject::Type::Location, location ); + const NetworkObject locationObject{this, NetworkObject::Type::Location, location}; - addOrUpdateObject( locationObject, rootObject ); + addOrUpdateObject( locationObject, rootObject() ); updateLocation( locationObject ); } - removeObjects( NetworkObject( NetworkObject::Type::Root ), [locations]( const NetworkObject& object ) { + removeObjects( rootObject(), [locations]( const NetworkObject& object ) { return object.type() == NetworkObject::Type::Location && locations.contains( object.name() ) == false; } ); } @@ -95,7 +94,7 @@ void LdapNetworkObjectDirectory::updateLocation( const NetworkObject& locationOb for( const auto& computer : qAsConst( computers ) ) { - const auto hostObject = computerToObject( &m_ldapDirectory, computer ); + const auto hostObject = computerToObject( this, &m_ldapDirectory, computer ); if( hostObject.type() == NetworkObject::Type::Host ) { addOrUpdateObject( hostObject, locationObject ); @@ -134,7 +133,7 @@ NetworkObjectList LdapNetworkObjectDirectory::queryLocations( NetworkObject::Pro for( const auto& location : locations ) { - locationObjects.append( NetworkObject( NetworkObject::Type::Location, location ) ); + locationObjects.append( NetworkObject{this, NetworkObject::Type::Location, location} ); } return locationObjects; @@ -177,7 +176,7 @@ NetworkObjectList LdapNetworkObjectDirectory::queryHosts( NetworkObject::Propert for( const auto& computer : qAsConst(computers) ) { - const auto hostObject = computerToObject( &m_ldapDirectory, computer ); + const auto hostObject = computerToObject( this, &m_ldapDirectory, computer ); if( hostObject.isValid() ) { hostObjects.append( hostObject ); @@ -189,15 +188,16 @@ NetworkObjectList LdapNetworkObjectDirectory::queryHosts( NetworkObject::Propert -NetworkObject LdapNetworkObjectDirectory::computerToObject( LdapDirectory* directory, const QString& computerDn ) +NetworkObject LdapNetworkObjectDirectory::computerToObject( NetworkObjectDirectory* directory, + LdapDirectory* ldapDirectory, const QString& computerDn ) { - auto displayNameAttribute = directory->computerDisplayNameAttribute(); + auto displayNameAttribute = ldapDirectory->computerDisplayNameAttribute(); if( displayNameAttribute.isEmpty() ) { displayNameAttribute = LdapClient::cn(); } - auto hostNameAttribute = directory->computerHostNameAttribute(); + auto hostNameAttribute = ldapDirectory->computerHostNameAttribute(); if( hostNameAttribute.isEmpty() ) { hostNameAttribute = LdapClient::cn(); @@ -205,7 +205,7 @@ NetworkObject LdapNetworkObjectDirectory::computerToObject( LdapDirectory* direc QStringList computerAttributes{ LdapClient::cn(), displayNameAttribute, hostNameAttribute }; - auto macAddressAttribute = directory->computerMacAddressAttribute(); + auto macAddressAttribute = ldapDirectory->computerMacAddressAttribute(); if( macAddressAttribute.isEmpty() == false ) { computerAttributes.append( macAddressAttribute ); @@ -213,8 +213,8 @@ NetworkObject LdapNetworkObjectDirectory::computerToObject( LdapDirectory* direc computerAttributes.removeDuplicates(); - const auto computers = directory->client().queryObjects( computerDn, computerAttributes, - directory->computersFilter(), LdapClient::Scope::Base ); + const auto computers = ldapDirectory->client().queryObjects( computerDn, computerAttributes, + ldapDirectory->computersFilter(), LdapClient::Scope::Base ); if( computers.isEmpty() == false ) { const auto& computerDn = computers.firstKey(); @@ -241,8 +241,8 @@ NetworkObject LdapNetworkObjectDirectory::computerToObject( LdapDirectory* direc } properties[NetworkObject::propertyKey(NetworkObject::Property::DirectoryAddress)] = computerDn; - return NetworkObject{ NetworkObject::Type::Host, displayName, properties }; + return NetworkObject{directory, NetworkObject::Type::Host, displayName, properties}; } - return NetworkObject( NetworkObject::Type::None ); + return NetworkObject{directory, NetworkObject::Type::None}; } diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.h b/plugins/ldap/common/LdapNetworkObjectDirectory.h index bd38c7d84..3c966ac72 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.h @@ -37,7 +37,8 @@ class LDAP_COMMON_EXPORT LdapNetworkObjectDirectory : public NetworkObjectDirect NetworkObject::Property property, const QVariant& value ) override; NetworkObjectList queryParents( const NetworkObject& childId ) override; - static NetworkObject computerToObject( LdapDirectory* directory, const QString& computerDn ); + static NetworkObject computerToObject( NetworkObjectDirectory* directory, + LdapDirectory* ldapDirectory, const QString& computerDn ); private: void update() override; From 3426e71387503f2d79fd7fbf8b61cb801e58f198 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Aug 2021 19:45:13 +0200 Subject: [PATCH 1013/1765] NetworkObject: add isContainer() This simplifies adding container types in the future without the need to update all components relying on that property. --- core/src/NetworkObject.h | 11 +++++++++ core/src/NetworkObjectDirectory.cpp | 10 +++----- master/src/ComputerManager.cpp | 36 +++++++++++------------------ 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index 08be12328..4671a816a 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -119,6 +119,17 @@ class VEYON_CORE_EXPORT NetworkObject return m_type; } + bool isContainer() const + { + return isContainer( type() ); + } + + static bool isContainer( Type type ) + { + return type == Type::Location || + type == Type::DesktopGroup; + } + const Name& name() const { return m_name; diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index 31d743285..572e49e8d 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -58,9 +58,7 @@ void NetworkObjectDirectory::setUpdateInterval( int interval ) const NetworkObjectList& NetworkObjectDirectory::objects( const NetworkObject& parent ) const { - if( parent.type() == NetworkObject::Type::Root || - parent.type() == NetworkObject::Type::Location || - parent.type() == NetworkObject::Type::DesktopGroup ) + if( parent.type() == NetworkObject::Type::Root || parent.isContainer() ) { const auto it = m_objects.constFind( parent.modelId() ); if( it != m_objects.end() ) @@ -285,8 +283,7 @@ void NetworkObjectDirectory::addOrUpdateObject( const NetworkObject& networkObje Q_EMIT objectsAboutToBeInserted( parent, objectList.count(), 1 ); objectList.append( completeNetworkObject ); - if( completeNetworkObject.type() == NetworkObject::Type::Location || - completeNetworkObject.type() == NetworkObject::Type::DesktopGroup ) + if( completeNetworkObject.isContainer() ) { m_objects[completeNetworkObject.modelId()] = {}; } @@ -317,8 +314,7 @@ void NetworkObjectDirectory::removeObjects( const NetworkObject& parent, const N { if( removeObjectFilter( *it ) ) { - if( it->type() == NetworkObject::Type::Location || - it->type() == NetworkObject::Type::DesktopGroup ) + if( it->isContainer() ) { objectsToRemove.append( it->modelId() ); } diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 84f21ff19..7e67a6931 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -324,10 +324,9 @@ QString ComputerManager::findLocationOfComputer( const QStringList& hostNames, c { QModelIndex entryIndex = model->index( i, 0, parent ); - auto objectType = static_cast( model->data( entryIndex, NetworkObjectModel::TypeRole ).toInt() ); + const auto objectType = NetworkObject::Type( model->data(entryIndex, NetworkObjectModel::TypeRole).toInt() ); - if( objectType == NetworkObject::Type::Location || - objectType == NetworkObject::Type::DesktopGroup ) + if( NetworkObject::isContainer(objectType) ) { const auto location = findLocationOfComputer( hostNames, hostAddresses, entryIndex ); if( location.isEmpty() == false ) @@ -365,24 +364,21 @@ ComputerList ComputerManager::getComputersAtLocation( const QString& locationNam { QModelIndex entryIndex = model->index( i, 0, parent ); - auto objectType = static_cast( model->data( entryIndex, NetworkObjectModel::TypeRole ).toInt() ); + const auto objectType = NetworkObject::Type( model->data(entryIndex, NetworkObjectModel::TypeRole).toInt() ); - switch( objectType ) + if( NetworkObject::isContainer(objectType) ) { - case NetworkObject::Type::Location: - case NetworkObject::Type::DesktopGroup: if( model->data( entryIndex, NetworkObjectModel::NameRole ).toString() == locationName ) { computers += getComputersAtLocation( locationName, entryIndex ); } - break; - case NetworkObject::Type::Host: + } + else if( objectType == NetworkObject::Type::Host ) + { computers += Computer( model->data( entryIndex, NetworkObjectModel::UidRole ).toUuid(), model->data( entryIndex, NetworkObjectModel::NameRole ).toString(), model->data( entryIndex, NetworkObjectModel::HostAddressRole ).toString(), model->data( entryIndex, NetworkObjectModel::MacAddressRole ).toString() ); - break; - default: break; } } @@ -408,22 +404,19 @@ ComputerList ComputerManager::selectedComputers( const QModelIndex& parent ) continue; } - auto objectType = static_cast( model->data( entryIndex, NetworkObjectModel::TypeRole ).toInt() ); + const auto objectType = NetworkObject::Type( model->data(entryIndex, NetworkObjectModel::TypeRole).toInt() ); - switch( objectType ) + if( NetworkObject::isContainer(objectType) ) { - case NetworkObject::Type::Location: - case NetworkObject::Type::DesktopGroup: computers += selectedComputers( entryIndex ); - break; - case NetworkObject::Type::Host: + } + else if( objectType == NetworkObject::Type::Host ) + { computers += Computer( model->data( entryIndex, NetworkObjectModel::UidRole ).toUuid(), model->data( entryIndex, NetworkObjectModel::NameRole ).toString(), model->data( entryIndex, NetworkObjectModel::HostAddressRole ).toString(), model->data( entryIndex, NetworkObjectModel::MacAddressRole ).toString(), model->data( parent, NetworkObjectModel::NameRole ).toString() ); - break; - default: break; } } @@ -442,10 +435,9 @@ QModelIndex ComputerManager::findNetworkObject( NetworkObject::Uid networkObject { QModelIndex entryIndex = model->index( i, 0, parent ); - auto objectType = static_cast( model->data( entryIndex, NetworkObjectModel::TypeRole ).toInt() ); + const auto objectType = NetworkObject::Type( model->data(entryIndex, NetworkObjectModel::TypeRole).toInt() ); - if( objectType == NetworkObject::Type::Location || - objectType == NetworkObject::Type::DesktopGroup ) + if( NetworkObject::isContainer(objectType) ) { QModelIndex index = findNetworkObject( networkObjectUid, entryIndex ); if( index.isValid() ) From b128ac099e89866d73dfd25be311ad2bf2774d4e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Aug 2021 19:46:54 +0200 Subject: [PATCH 1014/1765] NetworkObject: add type SubDirectory --- core/src/NetworkObject.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index 4671a816a..d66bbe3e4 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -48,6 +48,7 @@ class VEYON_CORE_EXPORT NetworkObject Location, Host, Label, + SubDirectory, DesktopGroup } ; Q_ENUM(Type) @@ -127,6 +128,7 @@ class VEYON_CORE_EXPORT NetworkObject static bool isContainer( Type type ) { return type == Type::Location || + type == Type::SubDirectory || type == Type::DesktopGroup; } From c8d1888b3ea33b183364dd2dfb746cd45af85e9f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Aug 2021 20:02:21 +0200 Subject: [PATCH 1015/1765] NetworkObjectDirectory: add configurable name property This allows configuring individual names for each NOD. --- core/src/NetworkObjectDirectory.cpp | 3 +- core/src/NetworkObjectDirectory.h | 8 +- plugins/builtindirectory/BuiltinDirectory.cpp | 2 +- .../BuiltinDirectoryConfiguration.h | 1 + .../BuiltinDirectoryConfigurationPage.cpp | 3 + .../BuiltinDirectoryConfigurationPage.ui | 146 ++++++++++-------- plugins/ldap/common/LdapConfiguration.h | 1 + plugins/ldap/common/LdapConfigurationPage.ui | 14 ++ .../common/LdapNetworkObjectDirectory.cpp | 2 +- 9 files changed, 110 insertions(+), 70 deletions(-) diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index 572e49e8d..fb0b4cb56 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -29,8 +29,9 @@ #include "NetworkObjectDirectory.h" -NetworkObjectDirectory::NetworkObjectDirectory( QObject* parent ) : +NetworkObjectDirectory::NetworkObjectDirectory( const QString& name, QObject* parent ) : QObject( parent ), + m_name( name ), m_updateTimer( new QTimer( this ) ) { connect( m_updateTimer, &QTimer::timeout, this, &NetworkObjectDirectory::update ); diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 6f82e2af0..7bfeb28c9 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -41,7 +41,12 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject MaximumUpdateInterval = 3600 }; - explicit NetworkObjectDirectory( QObject* parent ); + explicit NetworkObjectDirectory( const QString& name, QObject* parent ); + + const QString& name() const + { + return m_name; + } void setUpdateInterval( int interval ); @@ -77,6 +82,7 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject void setObjectPopulated( const NetworkObject& networkObject ); private: + const QString m_name; QTimer* m_updateTimer{nullptr}; QHash m_objects{}; NetworkObject m_invalidObject{this, NetworkObject::Type::None}; diff --git a/plugins/builtindirectory/BuiltinDirectory.cpp b/plugins/builtindirectory/BuiltinDirectory.cpp index ab5694433..2954c70b0 100644 --- a/plugins/builtindirectory/BuiltinDirectory.cpp +++ b/plugins/builtindirectory/BuiltinDirectory.cpp @@ -30,7 +30,7 @@ BuiltinDirectory::BuiltinDirectory( BuiltinDirectoryConfiguration& configuration, QObject* parent ) : - NetworkObjectDirectory( parent ), + NetworkObjectDirectory( configuration.directoryName(), parent ), m_configuration( configuration ) { } diff --git a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h index 43c745c00..29bff2e81 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h @@ -29,6 +29,7 @@ #include "Configuration/Proxy.h" #define FOREACH_BUILTIN_DIRECTORY_CONFIG_PROPERTY(OP) \ + OP( BuiltinDirectoryConfiguration, m_configuration, QString, directoryName, setDirectoryName, "DirectoryName", "BuiltinDirectory", BuiltinDirectoryConfiguration::tr("Builtin directory"), Configuration::Property::Flag::Standard ) \ OP( BuiltinDirectoryConfiguration, m_configuration, QJsonArray, networkObjects, setNetworkObjects, "NetworkObjects", "BuiltinDirectory", QJsonArray(), Configuration::Property::Flag::Standard ) \ /* legacy properties required for upgrade */ \ OP( BuiltinDirectoryConfiguration, m_configuration, QJsonArray, legacyLocalDataNetworkObjects, setLegacyLocalDataNetworkObjects, "NetworkObjects", "LocalData", QJsonArray(), Configuration::Property::Flag::Legacy ) \ diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp index 92ff7c5a9..f2a1d894c 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp @@ -56,6 +56,8 @@ BuiltinDirectoryConfigurationPage::~BuiltinDirectoryConfigurationPage() void BuiltinDirectoryConfigurationPage::resetWidgets() { + FOREACH_BUILTIN_DIRECTORY_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); + populateLocations(); ui->locationTableWidget->setCurrentCell( 0, 0 ); @@ -65,6 +67,7 @@ void BuiltinDirectoryConfigurationPage::resetWidgets() void BuiltinDirectoryConfigurationPage::connectWidgetsToProperties() { + FOREACH_BUILTIN_DIRECTORY_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); } diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.ui b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.ui index c407cbf8a..7e5a0ba6c 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.ui +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.ui @@ -5,14 +5,91 @@ Builtin directory - + 0 0 + + + + + + Directory name + + + + + + + + + + + + Locations + + + + + + + Computers + + + + + + false + + + true + + + false + + + + Locations + + + + + + + + QAbstractItemView::SelectRows + + + 150 + + + true + + + false + + + + Name + + + + + Host address/IP + + + + + MAC address + + + + + @@ -57,38 +134,7 @@ - - - - QAbstractItemView::SelectRows - - - 150 - - - true - - - false - - - - Name - - - - - Host address/IP - - - - - MAC address - - - - - + @@ -133,39 +179,7 @@ - - - - Locations - - - - - - - false - - - true - - - false - - - - Locations - - - - - - - - Computers - - - - + diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index 5c024dce4..3d32013df 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -30,6 +30,7 @@ #include "LdapCommon.h" #define FOREACH_LDAP_CONFIG_PROPERTY(OP) \ + OP( LdapConfiguration, m_configuration, QString, directoryName, setDirectoryName, "DirectoryName", "LDAP", LdapConfiguration::tr("LDAP directory"), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, serverHost, setServerHost, "ServerHost", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, int, serverPort, setServerPort, "ServerPort", "LDAP", 389, Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, int, connectionSecurity, setConnectionSecurity, "ConnectionSecurity", "LDAP", LdapClient::ConnectionSecurityNone, Configuration::Property::Flag::Standard ) \ diff --git a/plugins/ldap/common/LdapConfigurationPage.ui b/plugins/ldap/common/LdapConfigurationPage.ui index 869e54f23..351628346 100644 --- a/plugins/ldap/common/LdapConfigurationPage.ui +++ b/plugins/ldap/common/LdapConfigurationPage.ui @@ -16,6 +16,20 @@ 0 + + + + + + Directory name + + + + + + + + diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index 2717ad138..c32cf6ad0 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -29,7 +29,7 @@ LdapNetworkObjectDirectory::LdapNetworkObjectDirectory( const LdapConfiguration& ldapConfiguration, QObject* parent ) : - NetworkObjectDirectory( parent ), + NetworkObjectDirectory( ldapConfiguration.directoryName(), parent ), m_ldapDirectory( ldapConfiguration ) { } From 8f719d248b04cf79f1d78bf63efcdd5f1ad4ea47 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Aug 2021 20:03:28 +0200 Subject: [PATCH 1016/1765] NestedNetworkObjectDirectory: add initial implementation This new NOD using several children NODs in parallel by adding top level objects for each directory and children objects with the actual NOD objects below. --- core/src/NestedNetworkObjectDirectory.cpp | 122 ++++++++++++++++++++++ core/src/NestedNetworkObjectDirectory.h | 50 +++++++++ 2 files changed, 172 insertions(+) create mode 100644 core/src/NestedNetworkObjectDirectory.cpp create mode 100644 core/src/NestedNetworkObjectDirectory.h diff --git a/core/src/NestedNetworkObjectDirectory.cpp b/core/src/NestedNetworkObjectDirectory.cpp new file mode 100644 index 000000000..fcf518844 --- /dev/null +++ b/core/src/NestedNetworkObjectDirectory.cpp @@ -0,0 +1,122 @@ +/* + * NestedNetworkObjectDirectory.cpp - implementation of NestedNetworkObjectDirectory + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "NestedNetworkObjectDirectory.h" + + +NestedNetworkObjectDirectory::NestedNetworkObjectDirectory( QObject* parent ) : + NetworkObjectDirectory( tr("All directories"), parent ) +{ +} + + + +void NestedNetworkObjectDirectory::addSubDirectory( NetworkObjectDirectory* subDirectory ) +{ + m_subDirectories.append( subDirectory ); +} + + + +NetworkObjectList NestedNetworkObjectDirectory::queryObjects( NetworkObject::Type type, + NetworkObject::Property property, const QVariant& value ) +{ + NetworkObjectList objects; + + for( auto* subDirectory : qAsConst(m_subDirectories) ) + { + objects += subDirectory->queryObjects( type, property, value ); + } + + return objects; +} + + + +NetworkObjectList NestedNetworkObjectDirectory::queryParents( const NetworkObject& object ) +{ + if( object.directory() && object.directory() != this ) + { + return object.directory()->queryParents( object ); + } + + return {}; +} + + + +void NestedNetworkObjectDirectory::update() +{ + QStringList subDirectoryNames; + subDirectoryNames.reserve( m_subDirectories.count() ); + + for( auto* subDirectory : qAsConst(m_subDirectories) ) + { + subDirectoryNames.append( subDirectory->name() ); + NetworkObject subDirectoryObject{this, NetworkObject::Type::SubDirectory, subDirectory->name(), {}, + {}, rootObject().uid() }; + addOrUpdateObject( subDirectoryObject, rootObject() ); + + subDirectory->update(); + + replaceObjectsRecursively( subDirectory, subDirectoryObject ); + } + + removeObjects( rootObject(), [subDirectoryNames]( const NetworkObject& object ) { + return object.type() == NetworkObject::Type::SubDirectory && + subDirectoryNames.contains( object.name() ) == false; + } ); + + setObjectPopulated( rootObject() ); +} + + + +void NestedNetworkObjectDirectory::fetchObjects( const NetworkObject& parent ) +{ + if( parent.directory() && parent.directory() != this ) + { + parent.directory()->fetchObjects( parent ); + replaceObjects( parent.directory()->objects(parent), parent ); + } + + setObjectPopulated( parent ); +} + + + +void NestedNetworkObjectDirectory::replaceObjectsRecursively( NetworkObjectDirectory* directory, + const NetworkObject& parent ) +{ + const auto objects = directory->objects( parent.type() == NetworkObject::Type::SubDirectory + ? directory->rootObject() : parent ); + for( const auto& object : objects ) + { + if( object.isPopulated() && object.isContainer() ) + { + replaceObjectsRecursively( directory, object ); + } + } + replaceObjects( objects, parent ); +} diff --git a/core/src/NestedNetworkObjectDirectory.h b/core/src/NestedNetworkObjectDirectory.h new file mode 100644 index 000000000..73bf9f0b5 --- /dev/null +++ b/core/src/NestedNetworkObjectDirectory.h @@ -0,0 +1,50 @@ +/* + * NestedNetworkObjectDirectory.cpp - header file for NestedNetworkObjectDirectory + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "NetworkObjectDirectory.h" + +class NestedNetworkObjectDirectory : public NetworkObjectDirectory +{ + Q_OBJECT +public: + NestedNetworkObjectDirectory( QObject* parent ); + + void addSubDirectory( NetworkObjectDirectory* subDirectory ); + + NetworkObjectList queryObjects( NetworkObject::Type type, + NetworkObject::Property property, const QVariant& value ) override; + NetworkObjectList queryParents( const NetworkObject& childId ) override; + + void update() override; + void fetchObjects( const NetworkObject& parent ) override; + +private: + void replaceObjectsRecursively( NetworkObjectDirectory* directory, + const NetworkObject& parent ); + + QList m_subDirectories; + +}; From 3de3653b4ffe41e19b910db08ac9f3cc998eed94 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Aug 2021 20:05:48 +0200 Subject: [PATCH 1017/1765] NetworkObjectDirectoryManager: integrate NestedNOD If more than one NOD is enabled, add them to a NestedNOD acting as the top level NOD. Now e.g. some statically configured hosts as well as hosts from an LDAP directory can be used in parallel. --- core/src/NetworkObjectDirectoryManager.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/src/NetworkObjectDirectoryManager.cpp b/core/src/NetworkObjectDirectoryManager.cpp index 9d5752239..942d5e919 100644 --- a/core/src/NetworkObjectDirectoryManager.cpp +++ b/core/src/NetworkObjectDirectoryManager.cpp @@ -26,6 +26,7 @@ #include "NetworkObjectDirectoryManager.h" #include "NetworkObjectDirectoryPluginInterface.h" #include "PluginManager.h" +#include "NestedNetworkObjectDirectory.h" NetworkObjectDirectoryManager::NetworkObjectDirectoryManager( QObject* parent ) : @@ -49,8 +50,20 @@ NetworkObjectDirectory* NetworkObjectDirectoryManager::configuredDirectory() { if( m_configuredDirectory == nullptr ) { - m_configuredDirectory = createDirectory( VeyonCore::config().enabledNetworkObjectDirectoryPlugins().value(0), - this ); + const auto enabledDirectories = VeyonCore::config().enabledNetworkObjectDirectoryPlugins(); + if( enabledDirectories.count() == 1 ) + { + m_configuredDirectory = createDirectory( enabledDirectories.constFirst(), this ); + } + else if( enabledDirectories.count() > 1 ) + { + const auto nestedDirectory = new NestedNetworkObjectDirectory( this ); + for( const auto& directoryUid : enabledDirectories ) + { + nestedDirectory->addSubDirectory( createDirectory( directoryUid, this ) ); + } + m_configuredDirectory = nestedDirectory; + } } return m_configuredDirectory; From ad8edc9c27871880d839a5523521ee9838b26a36 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Aug 2021 13:54:40 +0200 Subject: [PATCH 1018/1765] Demo: eval timer instead of client list When starting the demo server feature via WebAPI, m_demoServerClients is always empty so use the timer status as indicator instead. --- plugins/demo/DemoFeaturePlugin.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 0343787e6..445954c73 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -148,12 +148,18 @@ bool DemoFeaturePlugin::controlFeature( Feature::Uid featureUid, m_demoServerControlTimer.start( DemoServerControlInterval ); m_demoServerControlInterfaces = computerControlInterfaces; } - else + else if( operation == Operation::Stop ) { m_demoServerControlTimer.stop(); } + else + { + return false; + } + + controlDemoServer(); - return controlDemoServer(); + return true; } if( featureUid == m_demoClientFullScreenFeature.uid() || featureUid == m_demoClientWindowFeature.uid() ) @@ -266,8 +272,6 @@ bool DemoFeaturePlugin::stopFeature( VeyonMasterInterface& master, const Feature controlFeature( m_demoClientWindowFeature.uid(), Operation::Stop, {}, { master.localSessionControlInterface().weakPointer() } ); - controlDemoServer(); - // no demo clients left? if( m_demoServerClients.isEmpty() ) { @@ -278,6 +282,8 @@ bool DemoFeaturePlugin::stopFeature( VeyonMasterInterface& master, const Feature initializeCredentials(); } + controlDemoServer(); + return true; } @@ -566,12 +572,7 @@ QRect DemoFeaturePlugin::viewportFromScreenSelection() const bool DemoFeaturePlugin::controlDemoServer() { - if( m_demoServerClients.isEmpty() ) - { - sendFeatureMessage( FeatureMessage{ m_demoServerFeature.uid(), StopDemoServer }, - m_demoServerControlInterfaces ); - } - else + if( m_demoServerControlTimer.isActive() ) { const auto demoServerPort = m_demoServerArguments.value( argToString(Argument::DemoServerPort), VeyonCore::config().demoServerPort() + VeyonCore::sessionId() ).toInt(); @@ -585,11 +586,14 @@ bool DemoFeaturePlugin::controlDemoServer() .addArgument( Argument::VncServerPortOffset, vncServerPortOffset ) .addArgument( Argument::DemoServerPort, demoServerPort ), m_demoServerControlInterfaces ); - - return true; + } + else + { + sendFeatureMessage( FeatureMessage{ m_demoServerFeature.uid(), StopDemoServer }, + m_demoServerControlInterfaces ); } - return false; + return true; } From 9e87aacb2506b92a7d2d223ca171b9b1cd775b10 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Aug 2021 15:57:50 +0200 Subject: [PATCH 1019/1765] AuthenticationManager: add legacy auth type helpers --- core/src/AuthenticationManager.cpp | 20 +++++++++++++++++++- core/src/AuthenticationManager.h | 12 ++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/core/src/AuthenticationManager.cpp b/core/src/AuthenticationManager.cpp index a0bd40c55..5006094a6 100644 --- a/core/src/AuthenticationManager.cpp +++ b/core/src/AuthenticationManager.cpp @@ -27,7 +27,11 @@ #include "VeyonConfiguration.h" AuthenticationManager::AuthenticationManager( QObject* parent ) : - QObject( parent ) + QObject( parent ), + m_legacyAuthTypes( { + { LegacyAuthType::Logon, QStringLiteral("63611f7c-b457-42c7-832e-67d0f9281085") }, + { LegacyAuthType::KeyFile, QStringLiteral("0c69b301-81b4-42d6-8fae-128cdd113314") } + } ) { for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) { @@ -48,6 +52,20 @@ AuthenticationManager::AuthenticationManager( QObject* parent ) : +Plugin::Uid AuthenticationManager::fromLegacyAuthType( LegacyAuthType authType ) const +{ + return m_legacyAuthTypes.value( authType ); +} + + + +AuthenticationManager::LegacyAuthType AuthenticationManager::toLegacyAuthType( Plugin::Uid uid ) const +{ + return m_legacyAuthTypes.key( uid ); +} + + + Plugin::Uid AuthenticationManager::toUid( AuthenticationPluginInterface* authPlugin ) const { for( auto it = m_plugins.constBegin(), end = m_plugins.constEnd(); it != end; ++it ) diff --git a/core/src/AuthenticationManager.h b/core/src/AuthenticationManager.h index 387f546e1..2e8da274f 100644 --- a/core/src/AuthenticationManager.h +++ b/core/src/AuthenticationManager.h @@ -30,6 +30,14 @@ class VEYON_CORE_EXPORT AuthenticationManager : public QObject { Q_OBJECT public: + enum LegacyAuthType + { + Invalid = 0, + KeyFile = 3, + Logon = 4, + }; + Q_ENUM(LegacyAuthType) + using Plugins = QMap; using Types = QMap; @@ -40,6 +48,9 @@ class VEYON_CORE_EXPORT AuthenticationManager : public QObject return m_plugins; } + Plugin::Uid fromLegacyAuthType( LegacyAuthType authType ) const; + LegacyAuthType toLegacyAuthType( Plugin::Uid uid ) const; + Plugin::Uid toUid( AuthenticationPluginInterface* authPlugin ) const; Types availableMethods() const; @@ -58,6 +69,7 @@ class VEYON_CORE_EXPORT AuthenticationManager : public QObject } private: + const QMap m_legacyAuthTypes; Plugins m_plugins{}; AuthenticationPluginInterface* m_initializedPlugin{nullptr}; From 8a8efca225f0ba6c84042ad502b7f0e22f27c68b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Aug 2021 15:58:37 +0200 Subject: [PATCH 1020/1765] VariantArrayMessage: add atEnd() --- core/src/VariantArrayMessage.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/VariantArrayMessage.h b/core/src/VariantArrayMessage.h index 0027a6405..b38e56b2d 100644 --- a/core/src/VariantArrayMessage.h +++ b/core/src/VariantArrayMessage.h @@ -46,6 +46,11 @@ class VEYON_CORE_EXPORT VariantArrayMessage QVariant read(); // Flawfinder: ignore + bool atEnd() const + { + return m_buffer.atEnd(); + } + VariantArrayMessage& write( const QVariant& v ); QIODevice* ioDevice() const From a411b81bc64e60c3bb1844487548b1b1000ae8e4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Aug 2021 15:59:11 +0200 Subject: [PATCH 1021/1765] VeyonConnection: improve auth type handshaking Partly implements 75f6c54d9131a75466a2399508e62fa41d5502fb. --- core/src/VeyonConnection.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 07ff977da..d047a5ac5 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -159,9 +159,19 @@ int8_t VeyonConnection::handleSecTypeVeyon( rfbClient* client, uint32_t authSche SocketDevice socketDevice( VncConnection::libvncClientDispatcher, client ); VariantArrayMessage message( &socketDevice ); - message.receive(); + if( message.receive() == false ) + { + vDebug() << QThread::currentThreadId() << "invalid authentication message received"; + return false; + } + + const auto authTypeCount = message.read().toInt(); - int authTypeCount = message.read().toInt(); + if( authTypeCount == 0 ) + { + vDebug() << QThread::currentThreadId() << "no auth types received"; + return false; + } PluginUidList authTypes; authTypes.reserve( authTypeCount ); From 379060df183bd2e6300149859ededd88eeb34da1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Aug 2021 16:00:08 +0200 Subject: [PATCH 1022/1765] VeyonConnection: add support for legacy auth types Since only the authentication type IDs have been replaced by authentication method UUIDs, we can simply translate between UUIDs and authentication types. This way it's possible to connect to computers running a Veyon 4 server. --- core/src/VeyonConnection.cpp | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index d047a5ac5..60ddec230 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -173,12 +173,29 @@ int8_t VeyonConnection::handleSecTypeVeyon( rfbClient* client, uint32_t authSche return false; } + auto legacyAuth = false; PluginUidList authTypes; authTypes.reserve( authTypeCount ); for( int i = 0; i < authTypeCount; ++i ) { - authTypes.append( message.read().toUuid() ); + if( message.atEnd() ) + { + vDebug() << QThread::currentThreadId() << "less auth types received than announced"; + return false; + } + const auto authType = message.read(); + if( authType.userType() == QMetaType::QUuid ) + { + authTypes.append( authType.toUuid() ); + } + const auto legacyAuthType = VeyonCore::authenticationManager().fromLegacyAuthType( + authType.value() ); + if( legacyAuthType.isNull() == false ) + { + authTypes.append( legacyAuthType ); + legacyAuth = true; + } } vDebug() << QThread::currentThreadId() << "received authentication types:" << authTypes; @@ -201,12 +218,19 @@ int8_t VeyonConnection::handleSecTypeVeyon( rfbClient* client, uint32_t authSche return false; } - vDebug() << QThread::currentThreadId() << "chose authentication type:" << chosenAuthPlugin; - VariantArrayMessage authReplyMessage( &socketDevice ); - authReplyMessage.write( chosenAuthPlugin ); - + if( legacyAuth ) + { + const auto legacyAuthType = VeyonCore::authenticationManager().toLegacyAuthType( chosenAuthPlugin ); + vDebug() << QThread::currentThreadId() << "chose legacy authentication type:" << legacyAuthType; + authReplyMessage.write( legacyAuthType ); + } + else + { + vDebug() << QThread::currentThreadId() << "chose authentication method:" << chosenAuthPlugin; + authReplyMessage.write( chosenAuthPlugin ); + } // send username which is used when displaying an access confirm dialog authReplyMessage.write( VeyonCore::platform().userFunctions().currentUser() ); authReplyMessage.send(); From 58c984aa034b29aabd461a0b161c7dbc8121cea6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 6 Sep 2021 20:18:46 +0200 Subject: [PATCH 1023/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 77b4b09ce..965e94549 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 77b4b09ce2b8d375ea2dec8add7f8bbf104ff411 +Subproject commit 965e945496e9bcfcc777ce20edbb18abe299b57f From 99b80a00071448fa641811f27aa9f5044136d6b5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 7 Sep 2021 12:13:20 +0200 Subject: [PATCH 1024/1765] ComputerControlListModel: include name in tooltip Closes #745. --- master/src/ComputerControlListModel.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 8d53a52ea..a961c7dde 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -449,6 +449,7 @@ QImage ComputerControlListModel::scaleAndAlignIcon( const QImage& icon, QSize si QString ComputerControlListModel::computerToolTipRole( const ComputerControlInterface::Pointer& controlInterface ) const { const QString state( computerStateDescription( controlInterface ) ); + const QString name( tr( "Name: %1" ).arg( controlInterface->computer().name() ) ); const QString location( tr( "Location: %1" ).arg( controlInterface->computer().location() ) ); const QString host( tr( "Host/IP address: %1" ).arg( controlInterface->computer().hostAddress().isEmpty() ? QStringLiteral("<%1>").arg( tr("invalid") ) @@ -458,10 +459,10 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte if( user.isEmpty() ) { - return QStringLiteral( "%1
    %2
    %3
    %4" ).arg( state, location, host, features ); + return QStringLiteral("%1
    %2
    %3
    %4
    %5").arg(state, name, location, host, features); } - return QStringLiteral( "%1
    %2
    %3
    %4
    %5" ).arg( state, location, host, features, user); + return QStringLiteral("%1
    %2
    %3
    %4
    %5
    %6").arg(state, name, location, host, features, user); } From 1e17b8ccc8bfd1cd8e850b05be6547eace15e8e6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 11:11:13 +0200 Subject: [PATCH 1025/1765] LinuxCoreFunctions: add prepareSessionBusAccess() In order to access the user's session bus, not only the DBUS_SESSION_BUS_ADDRESS environment variable needs to be set accordingly, but also the effective UID of the caller must match the UID of the session user. --- plugins/platform/linux/LinuxCoreFunctions.cpp | 22 +++++++++++++++++++ plugins/platform/linux/LinuxCoreFunctions.h | 1 + 2 files changed, 23 insertions(+) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index a0b8b891a..36a9e4edc 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -304,6 +304,28 @@ QString LinuxCoreFunctions::genericUrlHandler() const +bool LinuxCoreFunctions::prepareSessionBusAccess() +{ + const auto uid = LinuxUserFunctions::userIdFromName( VeyonCore::platform().userFunctions().currentUser() ); + if( uid > 0 ) + { + if( seteuid(uid) == 0 ) + { + return true; + } + + vWarning() << "could not set effective UID - DBus calls on the session bus likely will fail"; + } + else + { + vWarning() << "could not determine UID of current user - DBus calls on the session bus likely will fail"; + } + + return false; +} + + + /*! Returns DBus interface for session manager of KDE desktop */ LinuxCoreFunctions::DBusInterfacePointer LinuxCoreFunctions::kdeSessionManager() { diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index 64098742b..5ecec2cb8 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -66,6 +66,7 @@ class LinuxCoreFunctions : public PlatformCoreFunctions using DBusInterfacePointer = QSharedPointer; + static bool prepareSessionBusAccess(); static DBusInterfacePointer kdeSessionManager(); static DBusInterfacePointer gnomeSessionManager(); static DBusInterfacePointer mateSessionManager(); From c50d6674505c933b40aade03a129e296f8c175e2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 11:12:37 +0200 Subject: [PATCH 1026/1765] LinuxDesktopIntegration: fix types for SM DBus call arguments GSM requires the arguments to Logout() to be unsigned integers. while KSM uses signed integers. --- plugins/platform/linux/LinuxDesktopIntegration.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/platform/linux/LinuxDesktopIntegration.h b/plugins/platform/linux/LinuxDesktopIntegration.h index c2bf75b8a..24608bd0d 100644 --- a/plugins/platform/linux/LinuxDesktopIntegration.h +++ b/plugins/platform/linux/LinuxDesktopIntegration.h @@ -29,19 +29,19 @@ class LinuxDesktopIntegration public: class KDE { public: - enum ShutdownConfirm { + enum ShutdownConfirm : int { ShutdownConfirmDefault = -1, ShutdownConfirmNo = 0, ShutdownConfirmYes = 1 }; - enum ShutdownMode { + enum ShutdownMode : int { ShutdownModeDefault = -1, ShutdownModeSchedule = 0, ShutdownModeTryNow = 1, ShutdownModeForceNow = 2, ShutdownModeInteractive = 3 }; - enum ShutdownType { + enum ShutdownType : int { ShutdownTypeDefault = -1, ShutdownTypeNone = 0, ShutdownTypeReboot = 1, @@ -52,7 +52,7 @@ class LinuxDesktopIntegration class Gnome { public: - enum GsmManagerLogoutMode { + enum GsmLogoutMode : uint { GSM_MANAGER_LOGOUT_MODE_NORMAL = 0, GSM_MANAGER_LOGOUT_MODE_NO_CONFIRMATION, GSM_MANAGER_LOGOUT_MODE_FORCE @@ -61,7 +61,7 @@ class LinuxDesktopIntegration class Mate { public: - enum { + enum GsmLogoutMode : uint { GSM_LOGOUT_MODE_NORMAL = 0, GSM_LOGOUT_MODE_NO_CONFIRMATION, GSM_LOGOUT_MODE_FORCE From eb384a9cae47c402c9a717d80f10a6a1b3a236d5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 11:15:11 +0200 Subject: [PATCH 1027/1765] LinuxUserFunctions: prepare session bus access in logoff() --- plugins/platform/linux/LinuxUserFunctions.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 1010cf20c..0c74efaa1 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -352,6 +352,8 @@ bool LinuxUserFunctions::performLogon( const QString& username, const Password& void LinuxUserFunctions::logoff() { + LinuxCoreFunctions::prepareSessionBusAccess(); + // logout via common session managers LinuxCoreFunctions::kdeSessionManager()->asyncCall( QStringLiteral("logout"), static_cast( LinuxDesktopIntegration::KDE::ShutdownConfirmNo ), From ec40f54f19b47ae5b8a22a592ee2c79ca22b3196 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 11:15:31 +0200 Subject: [PATCH 1028/1765] LinuxUserFunctions: fix/improve DBus calls in logoff() This fixes argument types according to c50d6674505c933b40a and also evaluates the call's result. If successful, there's no need to continue with other session managers or logoff mechanisms. --- plugins/platform/linux/LinuxUserFunctions.cpp | 36 ++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 0c74efaa1..8a4068c57 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -355,14 +355,34 @@ void LinuxUserFunctions::logoff() LinuxCoreFunctions::prepareSessionBusAccess(); // logout via common session managers - LinuxCoreFunctions::kdeSessionManager()->asyncCall( QStringLiteral("logout"), - static_cast( LinuxDesktopIntegration::KDE::ShutdownConfirmNo ), - static_cast( LinuxDesktopIntegration::KDE::ShutdownTypeLogout ), - static_cast( LinuxDesktopIntegration::KDE::ShutdownModeForceNow ) ); - LinuxCoreFunctions::gnomeSessionManager()->asyncCall( QStringLiteral("Logout"), - static_cast( LinuxDesktopIntegration::Gnome::GSM_MANAGER_LOGOUT_MODE_FORCE ) ); - LinuxCoreFunctions::mateSessionManager()->asyncCall( QStringLiteral("Logout"), - static_cast( LinuxDesktopIntegration::Mate::GSM_LOGOUT_MODE_FORCE ) ); + // logout via common session managers + for( auto call : std::initializer_list> + { + []() { + return LinuxCoreFunctions::kdeSessionManager() + ->call( QStringLiteral("logout"), + LinuxDesktopIntegration::KDE::ShutdownConfirmNo, + LinuxDesktopIntegration::KDE::ShutdownTypeLogout, + LinuxDesktopIntegration::KDE::ShutdownModeForceNow ); + }, + []() { + return LinuxCoreFunctions::gnomeSessionManager() + ->call( QStringLiteral("Logout"), + LinuxDesktopIntegration::Gnome::GSM_MANAGER_LOGOUT_MODE_FORCE ); + }, + []() { + return LinuxCoreFunctions::mateSessionManager() + ->call( QStringLiteral("Logout"), + LinuxDesktopIntegration::Mate::GSM_LOGOUT_MODE_FORCE ); + } + } ) + { + // call successful? + if( call().type() == QDBusMessage::ReplyMessage ) + { + return; + } + } // Xfce logout QProcess::startDetached( QStringLiteral("xfce4-session-logout --logout"), {} ); From 7b2213b85776dd980ac868b5732c5ef81fd5bf25 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 11:18:49 +0200 Subject: [PATCH 1029/1765] LinuxSessionFunctions: only log non-empty unknown session states --- plugins/platform/linux/LinuxSessionFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index b45c08b93..272baab8b 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -225,7 +225,7 @@ LinuxSessionFunctions::State LinuxSessionFunctions::getSessionState( const QStri const auto stateString = getSessionProperty( session, QStringLiteral("State") ).toString(); const auto state = stateMap.value( stateString, State::Unknown ); - if( state == State::Unknown ) + if( state == State::Unknown && stateString.isEmpty() == false ) { vDebug() << stateString; } From 3474ca972a833839de2557821053512fccddcd35 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 11:19:25 +0200 Subject: [PATCH 1030/1765] LinuxServiceCore: also stop service with unknown session state --- plugins/platform/linux/LinuxServiceCore.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 9161a0daa..5c26eb77f 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -295,7 +295,9 @@ void LinuxServiceCore::stopAllServers() void LinuxServiceCore::checkSessionState( const QString& sessionPath ) { - if( LinuxSessionFunctions::getSessionState( sessionPath ) == LinuxSessionFunctions::State::Closing ) + const auto sessionState = LinuxSessionFunctions::getSessionState( sessionPath ); + if( sessionState == LinuxSessionFunctions::State::Closing || + sessionState == LinuxSessionFunctions::State::Unknown ) { vDebug() << "Stopping server for currently closing session" << sessionPath; stopServer( sessionPath ); From 14cd6f3a7b517995349fd9f77ae6909353a94168 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 13:32:22 +0200 Subject: [PATCH 1031/1765] LinuxCoreFunctions: improve/clean up reboot() Evaluate result of DBus calls and drop legacy call of /sbin/reboot. --- plugins/platform/linux/LinuxCoreFunctions.cpp | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 36a9e4edc..f8885764c 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -65,28 +65,15 @@ void LinuxCoreFunctions::writeToNativeLoggingSystem( const QString& message, Log void LinuxCoreFunctions::reboot() { - systemdLoginManager()->asyncCall( QStringLiteral("Reboot"), false ); - consoleKitManager()->asyncCall( QStringLiteral("Restart") ); - - if( isRunningAsAdmin() ) + if( systemdLoginManager()->call( QStringLiteral("Reboot"), false ).type() != QDBusMessage::ReplyMessage && + consoleKitManager()->call( QStringLiteral("Restart") ).type() != QDBusMessage::ReplyMessage ) { - for( const auto& file : { QStringLiteral("/sbin/reboot"), QStringLiteral("/usr/sbin/reboot") } ) - { - if( QFileInfo::exists( file ) ) - { - QProcess::startDetached( file, {} ); - return; - } - } + prepareSessionBusAccess(); - QProcess::startDetached( QStringLiteral("reboot"), {} ); - } - else - { kdeSessionManager()->asyncCall( QStringLiteral("logout"), - static_cast( LinuxDesktopIntegration::KDE::ShutdownConfirmNo ), - static_cast( LinuxDesktopIntegration::KDE::ShutdownTypeReboot ), - static_cast( LinuxDesktopIntegration::KDE::ShutdownModeForceNow ) ); + LinuxDesktopIntegration::KDE::ShutdownConfirmNo, + LinuxDesktopIntegration::KDE::ShutdownTypeReboot, + LinuxDesktopIntegration::KDE::ShutdownModeForceNow ); gnomeSessionManager()->asyncCall( QStringLiteral("RequestReboot") ); mateSessionManager()->asyncCall( QStringLiteral("RequestReboot") ); xfcePowerManager()->asyncCall( QStringLiteral("Reboot") ); From 7a5c096c99f438b8760c8e4878cdfdc2fe8ad995 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 13:33:52 +0200 Subject: [PATCH 1032/1765] LinuxCoreFunctions: improve/clean up powerDown() Evaluate result of DBus calls and drop legacy call of /sbin/poweroff. --- plugins/platform/linux/LinuxCoreFunctions.cpp | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index f8885764c..1be471d75 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -86,28 +86,15 @@ void LinuxCoreFunctions::powerDown( bool installUpdates ) { Q_UNUSED(installUpdates) - systemdLoginManager()->asyncCall( QStringLiteral("PowerOff"), false ); - consoleKitManager()->asyncCall( QStringLiteral("Stop") ); - - if( isRunningAsAdmin() ) + if( systemdLoginManager()->call( QStringLiteral("PowerOff"), false ).type() != QDBusMessage::ReplyMessage && + consoleKitManager()->call( QStringLiteral("Stop") ).type() != QDBusMessage::ReplyMessage ) { - for( const auto& file : { QStringLiteral("/sbin/poweroff"), QStringLiteral("/usr/sbin/poweroff") } ) - { - if( QFileInfo::exists( file ) ) - { - QProcess::startDetached( file, {} ); - return; - } - } + prepareSessionBusAccess(); - QProcess::startDetached( QStringLiteral("poweroff"), {} ); - } - else - { kdeSessionManager()->asyncCall( QStringLiteral("logout"), - static_cast( LinuxDesktopIntegration::KDE::ShutdownConfirmNo ), - static_cast( LinuxDesktopIntegration::KDE::ShutdownTypeHalt ), - static_cast( LinuxDesktopIntegration::KDE::ShutdownModeForceNow ) ); + LinuxDesktopIntegration::KDE::ShutdownConfirmNo, + LinuxDesktopIntegration::KDE::ShutdownTypeHalt, + LinuxDesktopIntegration::KDE::ShutdownModeForceNow ); gnomeSessionManager()->asyncCall( QStringLiteral("RequestShutdown") ); mateSessionManager()->asyncCall( QStringLiteral("RequestShutdown") ); xfcePowerManager()->asyncCall( QStringLiteral("Shutdown") ); From 3fb789a1893bfb8988724c895294e68ae3abddd1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 14:02:03 +0200 Subject: [PATCH 1033/1765] LinuxServiceCore: restart previously stopped servers In single session mode, we stop any running server as soon as a new user session has been started. This can lead to the situation that no server is running after this user session has been closed again and e.g. the preempted display manager session got active again. Therefore make sure to (re-)start server instances for preempted/suspended sessions. --- plugins/platform/linux/LinuxServiceCore.cpp | 29 ++++++++++++++++----- plugins/platform/linux/LinuxServiceCore.h | 1 + 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 5c26eb77f..58391bb42 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -58,12 +58,7 @@ LinuxServiceCore::~LinuxServiceCore() void LinuxServiceCore::run() { - const auto sessions = LinuxSessionFunctions::listSessions(); - - for( const auto& s : sessions ) - { - startServer( s, QDBusObjectPath( s ) ); - } + startServers(); QEventLoop eventLoop; eventLoop.exec(); @@ -199,6 +194,12 @@ void LinuxServiceCore::stopServer( const QString& login1SessionId, const QDBusOb { stopServer( sessionPath ); } + + // make sure to (re-)start server instances for preempted/suspended sessions such as the login manager session + if( m_sessionManager.multiSession() == false ) + { + startServers(); + } } @@ -230,6 +231,22 @@ void LinuxServiceCore::connectToLoginManager() +void LinuxServiceCore::startServers() +{ + const auto sessions = LinuxSessionFunctions::listSessions(); + + for( const auto& s : sessions ) + { + if( m_serverProcesses.contains( s ) == false && + ( m_sessionManager.multiSession() || m_serverProcesses.isEmpty() ) ) + { + startServer( QString{}, QDBusObjectPath( s ) ); + } + } +} + + + void LinuxServiceCore::stopServer( const QString& sessionPath ) { m_sessionManager.closeSession( sessionPath ); diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index cb65c21ff..a24f94568 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -56,6 +56,7 @@ private Q_SLOTS: static constexpr auto SessionUptimeProbingInterval = 1000; void connectToLoginManager(); + void startServers(); void stopServer( const QString& sessionPath ); void stopAllServers(); From 546b6c8f82915e4784488d6d7c066be7efbca0ff Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 14:16:39 +0200 Subject: [PATCH 1034/1765] UserSessionControl: don't log off non-user sessions On Linux this can terminate the display manager session which renders the computer unusuable until rebooting. --- .../usersessioncontrol/UserSessionControlPlugin.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp index e4af983d9..012dcc95e 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp @@ -24,6 +24,7 @@ #include +#include "PlatformSessionFunctions.h" #include "PlatformUserFunctions.h" #include "UserLoginDialog.h" #include "UserSessionControlPlugin.h" @@ -144,7 +145,14 @@ bool UserSessionControlPlugin::handleFeatureMessage( VeyonServerInterface& serve if( message.featureUid() == m_userLogoffFeature.uid() ) { - VeyonCore::platform().userFunctions().logoff(); + if( VeyonCore::platform().sessionFunctions().currentSessionHasUser() ) + { + VeyonCore::platform().userFunctions().logoff(); + } + else + { + vDebug() << "not logging off since not running in a user session"; + } return true; } From 8d5a71b7b0cd22b0e1f4f163d8132239e71edd3e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 14:23:36 +0200 Subject: [PATCH 1035/1765] MonitoringMode: report empty user for non-user sessions --- core/src/MonitoringMode.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index d7fa98036..bc57e6601 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -111,13 +111,16 @@ void MonitoringMode::queryUserInformation() // asynchronously query information about logged on user (which might block // due to domain controller queries and timeouts etc.) (void) QtConcurrent::run( [=]() { - const auto userLoginName = VeyonCore::platform().userFunctions().currentUser(); - const auto userFullName = VeyonCore::platform().userFunctions().fullName( userLoginName ); - const auto userSessionId = VeyonCore::sessionId(); - m_userDataLock.lockForWrite(); - m_userLoginName = userLoginName; - m_userFullName = userFullName; - m_userSessionId = userSessionId; - m_userDataLock.unlock(); + if( VeyonCore::platform().sessionFunctions().currentSessionHasUser() ) + { + const auto userLoginName = VeyonCore::platform().userFunctions().currentUser(); + const auto userFullName = VeyonCore::platform().userFunctions().fullName( userLoginName ); + const auto userSessionId = VeyonCore::sessionId(); + m_userDataLock.lockForWrite(); + m_userLoginName = userLoginName; + m_userFullName = userFullName; + m_userSessionId = userSessionId; + m_userDataLock.unlock(); + } } ); } From c9bf4344db6df6cf9286b7c8163b34333af7131c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 14:24:32 +0200 Subject: [PATCH 1036/1765] LinuxServiceCore: only skip TTY sessions explicitly --- plugins/platform/linux/LinuxServiceCore.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 58391bb42..01bd136d1 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -79,8 +79,9 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO } // do not start server for non-graphical sessions - if( sessionType != LinuxSessionFunctions::Type::X11 ) + if( sessionType == LinuxSessionFunctions::Type::TTY ) { + vDebug() << "Not starting Veyon Server in TTY session"; return; } From a774ad394ec40d8cbe3679f98475e0a004f7e90c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 14:26:19 +0200 Subject: [PATCH 1037/1765] LinuxServiceCore: only print warning for Wayland sessions In case of a false-positive, still try to start a Veyon Server instance. --- plugins/platform/linux/LinuxServiceCore.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 01bd136d1..1bb23b95c 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -74,8 +74,8 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO if( sessionType == LinuxSessionFunctions::Type::Wayland ) { - vCritical() << "Can't start Veyon Server in Wayland sessions as this is not yet supported. Please switch to X11-based sessions!"; - return; + vWarning() << "Wayland session detected but trying to start Veyon Server anyway, even though Veyon Server does " + "not supported Wayland sessions. If you encounter problems, please switch to X11-based sessions!"; } // do not start server for non-graphical sessions From 15426bc2dc588b1cb00f1bcd39708d3fc8170f3f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 14:26:51 +0200 Subject: [PATCH 1038/1765] LinuxSessionFunctions: log unspecified session types --- plugins/platform/linux/LinuxSessionFunctions.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 272baab8b..e96b4e70c 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -200,6 +200,11 @@ LinuxSessionFunctions::Type LinuxSessionFunctions::getSessionType( const QString return Type::Wayland; } + if( type.isEmpty() == false ) + { + vWarning() << "unspecified session type" << type; + } + return Type::Unspecified; } From d22eaee4a7e3c44c51314b955d733d57b213048f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 14:30:40 +0200 Subject: [PATCH 1039/1765] WtsSessionManager: treat multiseat sessions as active --- plugins/platform/windows/WtsSessionManager.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index c637dcafc..4c179b2e4 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -66,8 +66,10 @@ WtsSessionManager::SessionList WtsSessionManager::activeSessions() for( DWORD sessionIndex = 0; sessionIndex < sessionCount; ++sessionIndex ) { - auto session = &sessions[sessionIndex]; - if( session->State == WTSActive ) + const auto session = &sessions[sessionIndex]; + if( session->State == WTSActive || + QString::fromWCharArray(session->pWinStationName) + .compare( QLatin1String("multiseat"), Qt::CaseInsensitive ) == 0 ) { sessionList.append( session->SessionId ); } @@ -100,7 +102,7 @@ QString WtsSessionManager::querySessionInformation( SessionId sessionId, Session } QString result; - LPTSTR pBuffer = nullptr; + LPWSTR pBuffer = nullptr; DWORD dwBufferLen; if( WTSQuerySessionInformation( WTS_CURRENT_SERVER_HANDLE, sessionId, infoClass, From a15ecf3ae69361e6be57e9a76536b7beb90db087 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 20:08:36 +0200 Subject: [PATCH 1040/1765] LinuxCoreFunctions: add waitForProcess() --- plugins/platform/linux/LinuxCoreFunctions.cpp | 21 +++++++++++++++++++ plugins/platform/linux/LinuxCoreFunctions.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 1be471d75..97cf86e23 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -428,3 +429,23 @@ void LinuxCoreFunctions::forEachChildProcess( const std::function closeproc( proc ); } + + + +bool LinuxCoreFunctions::waitForProcess( qint64 pid, int timeout, int sleepInterval ) +{ + QElapsedTimer timeoutTimer; + timeoutTimer.start(); + + while( QFileInfo::exists( QStringLiteral("/proc/%1").arg( pid ) ) ) + { + if( timeoutTimer.elapsed() >= timeout ) + { + return false; + } + + QThread::msleep( static_cast( sleepInterval ) ); + } + + return true; +} diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index 5ecec2cb8..eb83235f1 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -81,6 +81,8 @@ class LinuxCoreFunctions : public PlatformCoreFunctions static void forEachChildProcess( const std::function& visitor, int parentPid, int flags, bool visitParent ); + static bool waitForProcess( qint64 pid, int timeout, int sleepInterval ); + private: int m_screenSaverTimeout{0}; int m_screenSaverPreferBlanking{0}; From a633a33e58a03dce4983117ed433e664446929d1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 20:09:48 +0200 Subject: [PATCH 1041/1765] LinuxServiceCore: refactor to LinuxServerProcess This improves the server termination, i.e. it avoids zombie processes by not relying on QProcess::terminate()/kill()/state() which seem to have some issues when not being used event-driven. --- plugins/platform/linux/CMakeLists.txt | 2 + plugins/platform/linux/LinuxServerProcess.cpp | 122 ++++++++++++++++++ plugins/platform/linux/LinuxServerProcess.h | 51 ++++++++ plugins/platform/linux/LinuxServiceCore.cpp | 79 ++---------- plugins/platform/linux/LinuxServiceCore.h | 8 +- 5 files changed, 186 insertions(+), 76 deletions(-) create mode 100644 plugins/platform/linux/LinuxServerProcess.cpp create mode 100644 plugins/platform/linux/LinuxServerProcess.h diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index d32c1f554..d90e1716b 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -23,6 +23,7 @@ build_veyon_plugin(linux-platform LinuxFilesystemFunctions.cpp LinuxInputDeviceFunctions.cpp LinuxNetworkFunctions.cpp + LinuxServerProcess.cpp LinuxServiceCore.cpp LinuxServiceFunctions.cpp LinuxSessionFunctions.cpp @@ -37,6 +38,7 @@ build_veyon_plugin(linux-platform LinuxKeyboardInput.cpp LinuxKeyboardShortcutTrapper.h LinuxNetworkFunctions.h + LinuxServerProcess.h LinuxServiceCore.h LinuxServiceFunctions.h LinuxSessionFunctions.h diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp new file mode 100644 index 000000000..a8ea669cd --- /dev/null +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -0,0 +1,122 @@ +/* + * LinuxServiceFunctions.cpp - implementation of LinuxServerProcess class + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include + +#include +#include +#include +#include + +#include "Filesystem.h" +#include "LinuxCoreFunctions.h" +#include "LinuxServerProcess.h" +#include "VeyonConfiguration.h" + + +LinuxServerProcess::LinuxServerProcess( const QProcessEnvironment& processEnvironment, + const QString& sessionPath, int sessionId, QObject* parent ) : + QProcess( parent ), + m_sessionPath( sessionPath ), + m_sessionId( sessionId ) +{ + setProcessEnvironment( processEnvironment ); +} + + + +LinuxServerProcess::~LinuxServerProcess() +{ + stop(); +} + + + +void LinuxServerProcess::start() +{ + if( VeyonCore::config().logToSystem() ) + { + setProcessChannelMode( QProcess::ForwardedChannels ); + } + + const auto catchsegv{ QStringLiteral("/usr/bin/catchsegv") }; + if( qEnvironmentVariableIsSet("VEYON_VALGRIND_SERVERS") ) + { + QProcess::start( QStringLiteral("/usr/bin/valgrind"), + { QStringLiteral("--error-limit=no"), + QStringLiteral("--log-file=valgrind-veyon-server-%1.log").arg(m_sessionId), + VeyonCore::filesystem().serverFilePath() } ); + } + else if( VeyonCore::isDebugging() && QFileInfo::exists( catchsegv ) ) + { + QProcess::start( catchsegv, { VeyonCore::filesystem().serverFilePath() } ); + } + else + { + QProcess::start( VeyonCore::filesystem().serverFilePath(), QStringList{} ); + } +} + + + +void LinuxServerProcess::stop() +{ + const auto sendSignalRecursively = []( int pid, int sig ) { + if( pid > 0 ) + { + LinuxCoreFunctions::forEachChildProcess( + [=]( proc_t* procInfo ) { + if( procInfo->tid > 0 ) + { + ::kill( procInfo->tid, sig ); + } + return true; + }, + pid, 0, true ); + + // clean up process + waitpid( pid, nullptr, WNOHANG ); + } + }; + + const auto pid = processId(); + + // manually set process state since we're managing the process termination on our own + setProcessState( QProcess::NotRunning ); + + // tell x11vnc and child processes (in case spawned via catchsegv) to shutdown + sendSignalRecursively( pid, SIGINT ); + + if( LinuxCoreFunctions::waitForProcess( pid, ServerShutdownTimeout, ServerWaitSleepInterval ) == false ) + { + sendSignalRecursively( pid, SIGTERM ); + + if( LinuxCoreFunctions::waitForProcess( pid, ServerTerminateTimeout, ServerWaitSleepInterval ) == false ) + { + vWarning() << "server for session" << m_sessionPath << "still running - killing now"; + sendSignalRecursively( pid, SIGKILL ); + LinuxCoreFunctions::waitForProcess( pid, ServerKillTimeout, ServerWaitSleepInterval ); + } + } +} diff --git a/plugins/platform/linux/LinuxServerProcess.h b/plugins/platform/linux/LinuxServerProcess.h new file mode 100644 index 000000000..dbe840752 --- /dev/null +++ b/plugins/platform/linux/LinuxServerProcess.h @@ -0,0 +1,51 @@ +/* + * LinuxServerProcess.h - declaration of LinuxServerProcess class + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include + +// clazy:excludeall=copyable-polymorphic + +class LinuxServerProcess : public QProcess +{ + Q_OBJECT +public: + explicit LinuxServerProcess( const QProcessEnvironment& processEnvironment, + const QString& sessionPath, int sessionId, + QObject* parent = nullptr ); + ~LinuxServerProcess() override; + + void start(); + void stop(); + +private: + static constexpr auto ServerShutdownTimeout = 1000; + static constexpr auto ServerTerminateTimeout = 3000; + static constexpr auto ServerKillTimeout = 3000; + static constexpr auto ServerWaitSleepInterval = 100; + + const QString m_sessionPath; + int m_sessionId; +}; diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 1bb23b95c..b8c06cb6f 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -25,19 +25,12 @@ #include #include #include -#include #include -#include -#include -#include - -#include "Filesystem.h" -#include "LinuxCoreFunctions.h" #include "LinuxPlatformConfiguration.h" +#include "LinuxServerProcess.h" #include "LinuxServiceCore.h" #include "LinuxSessionFunctions.h" -#include "ProcessHelper.h" #include "VeyonConfiguration.h" @@ -153,34 +146,12 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO sessionEnvironment.insert( QLatin1String( ServiceDataManager::serviceDataTokenEnvironmentVariable() ), QString::fromUtf8( m_dataManager.token().toByteArray() ) ); - auto process = new QProcess( this ); - process->setProcessEnvironment( sessionEnvironment ); - - if( VeyonCore::config().logToSystem() ) - { - process->setProcessChannelMode( QProcess::ForwardedChannels ); - } - - const auto catchsegv{ QStringLiteral("/usr/bin/catchsegv") }; - if( qEnvironmentVariableIsSet("VEYON_VALGRIND_SERVERS") ) - { - process->start( QStringLiteral("/usr/bin/valgrind"), - { QStringLiteral("--error-limit=no"), - QStringLiteral("--log-file=valgrind-veyon-server-%1.log").arg(sessionId), - VeyonCore::filesystem().serverFilePath() } ); - } - else if( VeyonCore::isDebugging() && QFileInfo::exists( catchsegv ) ) - { - process->start( catchsegv, { VeyonCore::filesystem().serverFilePath() } ); - } - else - { - process->start( VeyonCore::filesystem().serverFilePath(), QStringList{} ); - } + auto serverProcess = new LinuxServerProcess( sessionEnvironment, sessionPath, sessionId, this ); + serverProcess->start(); - connect( process, &QProcess::stateChanged, this, [=]() { checkSessionState( sessionPath ); } ); + connect( serverProcess, &QProcess::stateChanged, this, [=]() { checkSessionState( sessionPath ); } ); - m_serverProcesses[sessionPath] = process; + m_serverProcesses[sessionPath] = serverProcess; } @@ -259,43 +230,11 @@ void LinuxServiceCore::stopServer( const QString& sessionPath ) vInfo() << "stopping server for removed session" << sessionPath; - auto process = qAsConst(m_serverProcesses)[sessionPath]; - - const auto sendSignalRecursively = []( int pid, int sig ) { - if( pid > 0 ) - { - LinuxCoreFunctions::forEachChildProcess( - [=]( proc_t* procInfo ) { - if( procInfo->tid > 0 ) - { - kill( procInfo->tid, sig ); - } - return true; - }, - pid, 0, true ); - } - }; - - const auto pid = process->processId(); - - // tell x11vnc and child processes (in case spawned via catchsegv) to shutdown - sendSignalRecursively( pid, SIGINT ); - - if( ProcessHelper::waitForProcess( process, ServerShutdownTimeout, ServerWaitSleepInterval ) == false ) - { - process->terminate(); - sendSignalRecursively( pid, SIGTERM ); - - if( ProcessHelper::waitForProcess( process, ServerTerminateTimeout, ServerWaitSleepInterval ) == false ) - { - vWarning() << "server for session" << sessionPath << "still running - killing now"; - process->kill(); - sendSignalRecursively( pid, SIGKILL ); - ProcessHelper::waitForProcess( process, ServerKillTimeout, ServerWaitSleepInterval ); - } - } + auto serverProcess = qAsConst(m_serverProcesses)[sessionPath]; + serverProcess->disconnect(this); + serverProcess->stop(); + serverProcess->deleteLater(); - process->deleteLater(); m_serverProcesses.remove( sessionPath ); } diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index a24f94568..b37187ed1 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -28,7 +28,7 @@ #include "PlatformSessionManager.h" #include "ServiceDataManager.h" -class QProcess; +class LinuxServerProcess; // clazy:excludeall=copyable-polymorphic @@ -47,10 +47,6 @@ private Q_SLOTS: private: static constexpr auto LoginManagerReconnectInterval = 3000; - static constexpr auto ServerShutdownTimeout = 1000; - static constexpr auto ServerTerminateTimeout = 3000; - static constexpr auto ServerKillTimeout = 3000; - static constexpr auto ServerWaitSleepInterval = 100; static constexpr auto SessionEnvironmentProbingInterval = 1000; static constexpr auto SessionStateProbingInterval = 1000; static constexpr auto SessionUptimeProbingInterval = 1000; @@ -63,7 +59,7 @@ private Q_SLOTS: void checkSessionState( const QString& sessionPath ); LinuxCoreFunctions::DBusInterfacePointer m_loginManager{LinuxCoreFunctions::systemdLoginManager()}; - QMap m_serverProcesses; + QMap m_serverProcesses; ServiceDataManager m_dataManager{}; PlatformSessionManager m_sessionManager{}; From 46f7fe2f82a86ac03cff78ad41787f424b9e1b78 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Sep 2021 20:14:48 +0200 Subject: [PATCH 1042/1765] ProcessHelper: drop waitForProcess() This reverts commit 64cda7719cd653c2ff4161c0970cd43746f27447. --- core/src/ProcessHelper.cpp | 23 ----------------------- core/src/ProcessHelper.h | 2 -- 2 files changed, 25 deletions(-) diff --git a/core/src/ProcessHelper.cpp b/core/src/ProcessHelper.cpp index 5e86c5c8d..d281a8cac 100644 --- a/core/src/ProcessHelper.cpp +++ b/core/src/ProcessHelper.cpp @@ -22,9 +22,6 @@ * */ -#include -#include - #include "ProcessHelper.h" @@ -58,23 +55,3 @@ QByteArray ProcessHelper::runAndReadAll() return QByteArray(); } - - - -bool ProcessHelper::waitForProcess( QProcess* process, int timeout, int sleepInterval ) -{ - QElapsedTimer timeoutTimer; - timeoutTimer.start(); - - while( process->state() != QProcess::NotRunning ) - { - if( timeoutTimer.elapsed() >= timeout ) - { - return false; - } - - QThread::msleep( static_cast( sleepInterval ) ); - } - - return true; -} diff --git a/core/src/ProcessHelper.h b/core/src/ProcessHelper.h index c37dad6d6..24dd3b760 100644 --- a/core/src/ProcessHelper.h +++ b/core/src/ProcessHelper.h @@ -35,8 +35,6 @@ class VEYON_CORE_EXPORT ProcessHelper { int run(); QByteArray runAndReadAll(); - static bool waitForProcess( QProcess* process, int timeout, int sleepInterval ); - private: QProcess m_process{}; From 231b16b84629acfda39c271e1605c0e8c97a9188 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 09:17:36 +0200 Subject: [PATCH 1043/1765] LinuxServiceCore: implement deferred server start When deferring a server start for a new session (e.g. because of session state or insufficient uptime) and closing the previous session, take care of not initiating another server start for the new session while a start is already deferred. --- plugins/platform/linux/LinuxServiceCore.cpp | 155 ++++++++++++-------- plugins/platform/linux/LinuxServiceCore.h | 4 +- 2 files changed, 95 insertions(+), 64 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index b8c06cb6f..064bd2e97 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -61,8 +61,87 @@ void LinuxServiceCore::run() void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusObjectPath& sessionObjectPath ) { + Q_UNUSED(login1SessionId) + + const auto sessionPath = sessionObjectPath.path(); + + vDebug() << "new session" << sessionPath; + + startServer( sessionPath ); +} + + + +void LinuxServiceCore::stopServer( const QString& login1SessionId, const QDBusObjectPath& sessionObjectPath ) +{ + Q_UNUSED(login1SessionId) + const auto sessionPath = sessionObjectPath.path(); + vDebug() << "session removed" << sessionPath; + + if( m_serverProcesses.contains( sessionPath ) ) + { + stopServer( sessionPath ); + + // make sure to (re-)start server instances for preempted/suspended sessions such as the login manager session + if( m_sessionManager.multiSession() == false ) + { + startServers(); + } + } +} + + + +void LinuxServiceCore::connectToLoginManager() +{ + bool success = true; + + const auto service = m_loginManager->service(); + const auto path = m_loginManager->path(); + const auto interface = m_loginManager->interface(); + + success &= QDBusConnection::systemBus().connect( service, path, interface, QStringLiteral("SessionNew"), + this, SLOT(startServer(QString,QDBusObjectPath)) ); + + success &= QDBusConnection::systemBus().connect( service, path, interface, QStringLiteral("SessionRemoved"), + this, SLOT(stopServer(QString,QDBusObjectPath)) ); + + if( success == false ) + { + vWarning() << "could not connect to login manager! retrying in" << LoginManagerReconnectInterval << "msecs"; + QTimer::singleShot( LoginManagerReconnectInterval, this, &LinuxServiceCore::connectToLoginManager ); + } + else + { + vDebug() << "connected to login manager"; + } +} + + + +void LinuxServiceCore::startServers() +{ + vDebug(); + + const auto sessions = LinuxSessionFunctions::listSessions(); + + for( const auto& s : sessions ) + { + if( m_serverProcesses.contains( s ) == false && + m_deferredServerSessions.contains( s ) == false && + ( m_sessionManager.multiSession() || m_serverProcesses.isEmpty() ) ) + { + startServer( s ); + } + } +} + + + +void LinuxServiceCore::startServer( const QString& sessionPath ) +{ const auto sessionType = LinuxSessionFunctions::getSessionType( sessionPath ); if( sessionType == LinuxSessionFunctions::Type::Wayland ) @@ -81,8 +160,8 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO const auto sessionState = LinuxSessionFunctions::getSessionState( sessionPath ); if( sessionState == LinuxSessionFunctions::State::Opening ) { - vDebug() << "Session" << sessionPath << "still opening - retrying in" << SessionStateProbingInterval << "msecs"; - QTimer::singleShot( SessionStateProbingInterval, this, [=]() { startServer( login1SessionId, sessionObjectPath ); } ); + vDebug() << "Session" << sessionPath << "still is being opening - retrying in" << SessionStateProbingInterval << "msecs"; + deferServerStart( sessionPath, SessionStateProbingInterval ); return; } @@ -90,7 +169,7 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO if( sessionState != LinuxSessionFunctions::State::Online && sessionState != LinuxSessionFunctions::State::Active ) { - vDebug() << "Not starting server for session" << sessionPath << "in state" << sessionState; + vInfo() << "Not starting server for session" << sessionPath << "in state" << sessionState; return; } @@ -107,8 +186,7 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO { vWarning() << "Environment for session" << sessionPath << "not yet available - retrying in" << SessionEnvironmentProbingInterval << "msecs"; - QTimer::singleShot( SessionEnvironmentProbingInterval, this, - [=]() { startServer( login1SessionId, sessionObjectPath ); } ); + deferServerStart( sessionPath, SessionEnvironmentProbingInterval ); return; } @@ -119,12 +197,13 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO } const auto sessionUptime = LinuxSessionFunctions::getSessionUptimeSeconds( sessionPath ); + const auto minimumSessionUptime = LinuxPlatformConfiguration(&VeyonCore::config()).minimumUserSessionLifetime(); if( sessionUptime >= 0 && - sessionUptime < LinuxPlatformConfiguration(&VeyonCore::config()).minimumUserSessionLifetime() ) + sessionUptime < minimumSessionUptime ) { - vDebug() << "Session" << sessionPath << "too young - retrying in" << SessionUptimeProbingInterval << "msecs"; - QTimer::singleShot( SessionUptimeProbingInterval, this, [=]() { startServer( login1SessionId, sessionObjectPath ); } ); + vDebug() << "Session" << sessionPath << "too young - retrying in" << minimumSessionUptime - sessionUptime << "msecs"; + deferServerStart( sessionPath, minimumSessionUptime - sessionUptime ); return; } @@ -152,68 +231,18 @@ void LinuxServiceCore::startServer( const QString& login1SessionId, const QDBusO connect( serverProcess, &QProcess::stateChanged, this, [=]() { checkSessionState( sessionPath ); } ); m_serverProcesses[sessionPath] = serverProcess; + m_deferredServerSessions.removeAll( sessionPath ); } -void LinuxServiceCore::stopServer( const QString& login1SessionId, const QDBusObjectPath& sessionObjectPath ) -{ - Q_UNUSED(login1SessionId) - - const auto sessionPath = sessionObjectPath.path(); - - if( m_serverProcesses.contains( sessionPath ) ) - { - stopServer( sessionPath ); - } - - // make sure to (re-)start server instances for preempted/suspended sessions such as the login manager session - if( m_sessionManager.multiSession() == false ) - { - startServers(); - } -} - - - -void LinuxServiceCore::connectToLoginManager() -{ - bool success = true; - - const auto service = m_loginManager->service(); - const auto path = m_loginManager->path(); - const auto interface = m_loginManager->interface(); - - success &= QDBusConnection::systemBus().connect( service, path, interface, QStringLiteral("SessionNew"), - this, SLOT(startServer(QString,QDBusObjectPath)) ); - - success &= QDBusConnection::systemBus().connect( service, path, interface, QStringLiteral("SessionRemoved"), - this, SLOT(stopServer(QString,QDBusObjectPath)) ); - - if( success == false ) - { - vWarning() << "could not connect to login manager! retrying in" << LoginManagerReconnectInterval << "msecs"; - QTimer::singleShot( LoginManagerReconnectInterval, this, &LinuxServiceCore::connectToLoginManager ); - } - else - { - vDebug() << "connected to login manager"; - } -} - - - -void LinuxServiceCore::startServers() +void LinuxServiceCore::deferServerStart( const QString& sessionPath, int delay ) { - const auto sessions = LinuxSessionFunctions::listSessions(); + QTimer::singleShot( delay, this, [=]() { startServer( sessionPath ); } ); - for( const auto& s : sessions ) + if( m_deferredServerSessions.contains( sessionPath ) == false ) { - if( m_serverProcesses.contains( s ) == false && - ( m_sessionManager.multiSession() || m_serverProcesses.isEmpty() ) ) - { - startServer( QString{}, QDBusObjectPath( s ) ); - } + m_deferredServerSessions.append( sessionPath ); } } diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index b37187ed1..da6aca7aa 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -49,10 +49,11 @@ private Q_SLOTS: static constexpr auto LoginManagerReconnectInterval = 3000; static constexpr auto SessionEnvironmentProbingInterval = 1000; static constexpr auto SessionStateProbingInterval = 1000; - static constexpr auto SessionUptimeProbingInterval = 1000; void connectToLoginManager(); void startServers(); + void startServer( const QString& sessionPath ); + void deferServerStart( const QString& sessionPath, int delay ); void stopServer( const QString& sessionPath ); void stopAllServers(); @@ -60,6 +61,7 @@ private Q_SLOTS: LinuxCoreFunctions::DBusInterfacePointer m_loginManager{LinuxCoreFunctions::systemdLoginManager()}; QMap m_serverProcesses; + QStringList m_deferredServerSessions; ServiceDataManager m_dataManager{}; PlatformSessionManager m_sessionManager{}; From a4297dfa93faf066b53d45e87296af337c9d446d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 10:03:39 +0200 Subject: [PATCH 1044/1765] HostAddress: cache local FQDN --- core/src/HostAddress.cpp | 48 ++++++++++++++++++++++++++-------------- core/src/HostAddress.h | 3 +++ 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index b58163e93..79d4d85f5 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -29,6 +29,8 @@ #include "HostAddress.h" +QString HostAddress::s_cachedLocalFQDN; + HostAddress::HostAddress( const QString& address ) : m_type( determineType( address ) ), m_address( address ) @@ -155,26 +157,12 @@ int HostAddress::parsePortNumber( const QString& address ) QString HostAddress::localFQDN() { - const auto localHostName = QHostInfo::localHostName(); - const auto type = determineType( localHostName ); - - switch( type ) + if( s_cachedLocalFQDN.isEmpty() ) { - case Type::HostName: - if( QHostInfo::localDomainName().isEmpty() == false ) - { - return localHostName + QStringLiteral( "." ) + QHostInfo::localDomainName(); - } - - case Type::FullyQualifiedDomainName: - return localHostName; - - default: - vWarning() << "Could not determine local host name:" << localHostName; - break; + s_cachedLocalFQDN = resolveLocalFQDN(); } - return HostAddress( localHostName ).tryConvert( Type::FullyQualifiedDomainName ); + return s_cachedLocalFQDN; } @@ -305,3 +293,29 @@ QString HostAddress::fqdnToHostName( const QString& fqdn ) { return fqdn.split( QLatin1Char( '.' ) ).constFirst(); } + + + +QString HostAddress::resolveLocalFQDN() +{ + const auto localHostName = QHostInfo::localHostName(); + const auto type = determineType( localHostName ); + + switch( type ) + { + case Type::HostName: + if( QHostInfo::localDomainName().isEmpty() == false ) + { + return localHostName + QStringLiteral( "." ) + QHostInfo::localDomainName(); + } + + case Type::FullyQualifiedDomainName: + return localHostName; + + default: + vWarning() << "Could not determine local host name:" << localHostName; + break; + } + + return HostAddress( localHostName ).tryConvert( Type::FullyQualifiedDomainName ); +} diff --git a/core/src/HostAddress.h b/core/src/HostAddress.h index 1db2aa07b..c782977db 100644 --- a/core/src/HostAddress.h +++ b/core/src/HostAddress.h @@ -64,6 +64,9 @@ class VEYON_CORE_EXPORT HostAddress static QString toHostName( Type type, const QString& address ); static QString toFQDN( Type type, const QString& address ); static QString fqdnToHostName( const QString& fqdn ); + static QString resolveLocalFQDN(); + + static QString s_cachedLocalFQDN; Type m_type; QString m_address; From f3adad4f29b6480cca0b1acacefe90ff6791733d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 10:13:33 +0200 Subject: [PATCH 1045/1765] ComputerControlServer: add resolveFQDNs() --- server/src/ComputerControlServer.cpp | 22 ++++++++++++++++++++++ server/src/ComputerControlServer.h | 5 ++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index d8ba52926..1c856e8d6 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -227,6 +227,28 @@ void ComputerControlServer::showAccessControlMessage( VncServerClient* client ) +QFutureWatcher* ComputerControlServer::resolveFQDNs( const QStringList& hosts ) +{ + auto watcher = new QFutureWatcher(); + + watcher->setFuture( QtConcurrent::run( [this, hosts]() { + for( const auto& host : hosts ) + { + const auto fqdn = HostAddress( host ).tryConvert( HostAddress::Type::FullyQualifiedDomainName ); + + m_dataMutex.lock(); + m_resolvedHostNames[host] = fqdn; + m_dataMutex.unlock(); + } + } ) ); + + connect( watcher, &QFutureWatcher::finished, watcher, &QObject::deleteLater ); + + return watcher; +} + + + void ComputerControlServer::updateTrayIconToolTip() { auto toolTip = tr( "%1 Service %2 at %3:%4" ).arg( VeyonCore::applicationName(), VeyonCore::versionString(), diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index aae7cf555..921c847d8 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -25,7 +25,7 @@ #pragma once #include -#include +#include #include "FeatureManager.h" #include "FeatureWorkerManager.h" @@ -78,12 +78,15 @@ class ComputerControlServer : public QObject, VncProxyConnectionFactory, VeyonSe void checkForIncompleteAuthentication( VncServerClient* client ); void showAuthenticationMessage( VncServerClient* client ); void showAccessControlMessage( VncServerClient* client ); + QFutureWatcher* resolveFQDNs( const QStringList& hosts ); void updateTrayIconToolTip(); QMutex m_dataMutex{}; QStringList m_allowedIPs{}; + QMap m_resolvedHostNames; + QStringList m_failedAuthHosts{}; QStringList m_failedAccessControlHosts{}; From d522d80909eee2a7307f821945d7b5f1b6d6f8db Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 10:14:52 +0200 Subject: [PATCH 1046/1765] ComputerControlServer: avoid blocking in updateTrayIconToolTip() When performing a reverse lookup for the addresses of the connected peers, this can block for quite a while, especially in case of missing reverse PTR records in the DNS server. This new implementation starts populating the tooltip with IP addresses and updates the tooltip later as soon as the FQDNs have been resolved. --- server/src/ComputerControlServer.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 1c856e8d6..a26ad3a84 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -255,11 +255,28 @@ void ComputerControlServer::updateTrayIconToolTip() HostAddress::localFQDN(), QString::number( VeyonCore::config().veyonServerPort() + VeyonCore::sessionId() ) ); + QMutexLocker locker( &m_dataMutex ); + QStringList clients; + QStringList hostsToResolve; for( const auto* client : m_vncProxyServer.clients() ) { - const auto clientAddress = HostAddress( client->proxyClientSocket()->peerAddress().toString() ); - clients.append( clientAddress.tryConvert( HostAddress::Type::FullyQualifiedDomainName ) ); + const auto clientIpAddress = client->proxyClientSocket()->peerAddress().toString(); + if( m_resolvedHostNames.contains( clientIpAddress ) == false ) + { + hostsToResolve.append( clientIpAddress ); + clients.append( clientIpAddress ); + } + else + { + clients.append( m_resolvedHostNames[clientIpAddress] ); + } + } + + if( hostsToResolve.isEmpty() == false ) + { + auto watcher = resolveFQDNs( hostsToResolve ); + connect( watcher, &QFutureWatcher::finished, this, &ComputerControlServer::updateTrayIconToolTip ); } if( clients.isEmpty() == false ) From 8efe95eab2faf93c97497fe873cc305119b904c3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 12:21:48 +0200 Subject: [PATCH 1047/1765] VncEvents: add VncUpdateFormatAndEncodingsEvent --- core/src/VncEvents.cpp | 7 +++++++ core/src/VncEvents.h | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/core/src/VncEvents.cpp b/core/src/VncEvents.cpp index 6cd223497..25add6c17 100644 --- a/core/src/VncEvents.cpp +++ b/core/src/VncEvents.cpp @@ -68,3 +68,10 @@ void VncClientCutEvent::fire( rfbClient* client ) { SendClientCutText( client, m_text.data(), m_text.size() ); // clazy:exclude=detaching-member } + + + +void VncUpdateFormatAndEncodingsEvent::fire( rfbClient* client ) +{ + SetFormatAndEncodings(client); +} diff --git a/core/src/VncEvents.h b/core/src/VncEvents.h index 0027e7cf5..13eceacb1 100644 --- a/core/src/VncEvents.h +++ b/core/src/VncEvents.h @@ -76,3 +76,9 @@ class VncClientCutEvent : public VncEvent private: QByteArray m_text; } ; + +class VncUpdateFormatAndEncodingsEvent : public VncEvent +{ +public: + void fire( rfbClient* client ) override; +}; From ba46c12b0a1c77f9fd31efbe9d0d497616ac96c4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 12:22:39 +0200 Subject: [PATCH 1048/1765] VncConnection: add setUseRemoteCursor() --- core/src/VncConnection.cpp | 13 ++++++++++++- core/src/VncConnection.h | 3 +++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 9ccc0e45c..aefb3466c 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -191,6 +191,17 @@ void VncConnection::setPort( int port ) +void VncConnection::setUseRemoteCursor( bool enabled ) +{ + m_useRemoteCursor = enabled; + + m_client->appData.useRemoteCursor = enabled; + + enqueueEvent( new VncUpdateFormatAndEncodingsEvent, true ); +} + + + void VncConnection::setServerReachable() { setControlFlag( ControlFlag::ServerReachable, true ); @@ -604,7 +615,7 @@ rfbBool VncConnection::initFrameBuffer( rfbClient* client ) client->format.blueMax = 0xff; client->appData.encodingsString = "zrle ultra copyrect hextile zlib corre rre raw"; - client->appData.useRemoteCursor = false; + client->appData.useRemoteCursor = m_useRemoteCursor; client->appData.compressLevel = 0; client->appData.useBGR233 = false; client->appData.qualityLevel = 9; diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 65c023565..d9608a4a3 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -113,6 +113,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread m_quality = quality ; } + void setUseRemoteCursor( bool enabled ); + void setServerReachable(); void enqueueEvent( VncEvent* event, bool wake ); @@ -225,6 +227,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread QString m_host{}; int m_port{-1}; int m_defaultPort{-1}; + bool m_useRemoteCursor{false}; // thread and timing control QMutex m_globalMutex{}; From f7ea57acfe9fd905c71e67a8abe355b514b97381 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 12:24:54 +0200 Subject: [PATCH 1049/1765] VncView: don't use remote cursor in view only mode Simplify cursor shape handling by avoiding to paint the shape manually at all. --- core/src/VncConnection.cpp | 3 --- core/src/VncView.cpp | 40 ++++++++------------------------------ core/src/VncView.h | 15 -------------- core/src/VncViewWidget.cpp | 11 ----------- 4 files changed, 8 insertions(+), 61 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index aefb3466c..88dc5b188 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -627,9 +627,6 @@ rfbBool VncConnection::initFrameBuffer( rfbClient* client ) // make sure to use lossless raw encoding client->appData.encodingsString = "raw"; break; - case Quality::RemoteControl: - client->appData.useRemoteCursor = true; - break; case Quality::Thumbnail: client->appData.compressLevel = 9; client->appData.qualityLevel = 5; diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index 313447d16..d25d289b3 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -89,18 +89,24 @@ void VncView::setViewOnly( bool viewOnly ) { return; } + m_viewOnly = viewOnly; + if( m_connection ) + { + m_connection->setUseRemoteCursor( !viewOnly ); + } + if( m_viewOnly ) { m_keyboardShortcutTrapper->setEnabled( false ); - updateLocalCursor(); } else { - updateLocalCursor(); m_keyboardShortcutTrapper->setEnabled( true ); } + + updateLocalCursor(); } @@ -224,24 +230,6 @@ QRect VncView::mapFromFramebuffer( QRect r ) -void VncView::updateCursorPos( int x, int y ) -{ - if( viewOnly() ) - { - if( m_cursorShape.isNull() == false ) - { - updatePaintedCursor(); - } - m_cursorPos = { x, y }; - if( m_cursorShape.isNull() == false ) - { - updatePaintedCursor(); - } - } -} - - - void VncView::updateCursorShape( const QPixmap& cursorShape, int xh, int yh ) { const auto scale = scaleFactor(); @@ -251,11 +239,6 @@ void VncView::updateCursorShape( const QPixmap& cursorShape, int xh, int yh ) int( cursorShape.height()*scale ), Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); - if( viewOnly() ) - { - updateView( m_cursorPos.x(), m_cursorPos.y(), m_cursorShape.width(), m_cursorShape.height() ); - } - updateLocalCursor(); } @@ -629,13 +612,6 @@ void VncView::updateLocalCursor() -void VncView::updatePaintedCursor() -{ - updateView( m_cursorPos.x(), m_cursorPos.y(), m_cursorShape.width(), m_cursorShape.height() ); -} - - - void VncView::pressKey( unsigned int key ) { m_connection->keyEvent( key, true ); diff --git a/core/src/VncView.h b/core/src/VncView.h index 4fc8cef6e..2a39c4693 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -102,8 +102,6 @@ class VEYON_CORE_EXPORT VncView QObject::connect( connection(), &VncConnection::framebufferSizeChanged, object, [this]( int w, int h ) { updateFramebufferSize( w, h ); } ); - QObject::connect( connection(), &VncConnection::cursorPosChanged, object, - [this]( int x, int y ) { updateCursorPos( x, y ); } ); QObject::connect( connection(), &VncConnection::cursorShapeUpdated, object, [this]( const QPixmap& cursorShape, int xh, int yh ) { updateCursorShape( cursorShape, xh, yh ); } ); } @@ -112,7 +110,6 @@ class VEYON_CORE_EXPORT VncView virtual QSize viewSize() const = 0; virtual void setViewCursor( const QCursor& cursor ) = 0; - virtual void updateCursorPos( int x, int y ); virtual void updateCursorShape( const QPixmap& cursorShape, int xh, int yh ); virtual void updateFramebufferSize( int w, int h ); virtual void updateImage( int x, int y, int w, int h ); @@ -134,16 +131,6 @@ class VEYON_CORE_EXPORT VncView return m_cursorShape; } - auto cursorPos() const - { - return m_cursorPos; - } - - auto cursorHot() const - { - return m_cursorHot; - } - qreal scaleFactor() const; QPoint mapToFramebuffer( QPoint pos ); QRect mapFromFramebuffer( QRect rect ); @@ -151,13 +138,11 @@ class VEYON_CORE_EXPORT VncView void updateLocalCursor(); private: - void updatePaintedCursor(); void pressKey( unsigned int key ); void unpressKey( unsigned int key ); VncConnection* m_connection{nullptr}; QPixmap m_cursorShape{}; - QPoint m_cursorPos{0, 0}; QPoint m_cursorHot{0, 0}; QSize m_framebufferSize{0, 0}; bool m_viewOnly{true}; diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index 0f0432c57..d52f0d5a6 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -303,17 +303,6 @@ void VncViewWidget::paintEvent( QPaintEvent* paintEvent ) p.drawImage( { 0, 0 }, image, source ); } - if( viewOnly() && cursorShape().isNull() == false ) - { - const auto cursorRect = mapFromFramebuffer( QRect( cursorPos() - cursorHot(), cursorShape().size() ) ); - // parts of cursor within updated region? - if( paintEvent->region().intersects( cursorRect ) ) - { - // then repaint it - p.drawPixmap( cursorRect.topLeft(), cursorShape() ); - } - } - // draw black borders if neccessary const int screenWidth = scaledSize().width(); if( screenWidth < width() ) From 3763ea02b95f129d43c128238409636af606f342 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 12:28:35 +0200 Subject: [PATCH 1050/1765] RemoteAccessWidget: rename to setViewOnly() Make method name match what the method actually does. --- plugins/remoteaccess/RemoteAccessWidget.cpp | 6 +++--- plugins/remoteaccess/RemoteAccessWidget.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index ff86a5392..12ab9c5c9 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -69,7 +69,7 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent m_viewOnlyButton->setCheckable( true ); m_viewOnlyButton->setChecked( startViewOnly ); connect( m_viewOnlyButton, &ToolButton::toggled, this, &RemoteAccessWidgetToolBar::updateControls ); - connect( m_viewOnlyButton, &QAbstractButton::toggled, parent, &RemoteAccessWidget::toggleViewOnly ); + connect( m_viewOnlyButton, &QAbstractButton::toggled, parent, &RemoteAccessWidget::setViewOnly ); } m_fullScreenButton->setCheckable( true ); @@ -280,7 +280,7 @@ RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& showNormal(); - toggleViewOnly( startViewOnly ); + setViewOnly( startViewOnly ); } @@ -374,7 +374,7 @@ void RemoteAccessWidget::toggleFullScreen( bool _on ) -void RemoteAccessWidget::toggleViewOnly( bool viewOnly ) +void RemoteAccessWidget::setViewOnly( bool viewOnly ) { m_vncView->setViewOnly( viewOnly ); m_toolBar->updateControls( viewOnly ); diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index 3bcc6417f..b7a805735 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -93,7 +93,7 @@ class RemoteAccessWidget : public QWidget } void toggleFullScreen( bool ); - void toggleViewOnly( bool viewOnly ); + void setViewOnly( bool viewOnly ); void takeScreenshot(); protected: From 740cec2f8bbe9e5b7695041b97d7e26250a7c232 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 12:33:37 +0200 Subject: [PATCH 1051/1765] MasterConfigurationPage: fix label column span --- configurator/src/MasterConfigurationPage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index b4cc48dd5..d4f8e6767 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -390,7 +390,7 @@
    - + Open feature windows on the same screen as the main window From 66b5a245aa06954e3ad2ce1a72c1337edcc99ec1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 13:21:49 +0200 Subject: [PATCH 1052/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 965e94549..9d8dfcb3d 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 965e945496e9bcfcc777ce20edbb18abe299b57f +Subproject commit 9d8dfcb3d8f46fd1253271c4a63a04b2bc534486 From 3808c2ad7577cfde31d0eda6a6b85c4ba4b4acfc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 13:35:40 +0200 Subject: [PATCH 1053/1765] SpotlightPanel: don't show message if there's nothing to remove --- master/src/SpotlightPanel.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index a29f4650d..f38be730c 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -135,18 +135,11 @@ void SpotlightPanel::add() void SpotlightPanel::remove() { auto selection = ui->monitoringWidget->selectionModel()->selectedIndexes(); - if( selection.isEmpty() ) + if( selection.isEmpty() && m_model->rowCount() > 0 ) { - if( m_model->rowCount() > 0 ) - { - const auto lastIndex = m_model->index(m_model->rowCount() - 1, 0); - ui->monitoringWidget->selectionModel()->select(lastIndex, QItemSelectionModel::Select); - selection = ui->monitoringWidget->selectionModel()->selectedIndexes(); - } else { - QMessageBox::information( this, tr("Spotlight"), - tr( "Please select at least one computer to remove.") ); - return; - } + const auto lastIndex = m_model->index(m_model->rowCount() - 1, 0); + ui->monitoringWidget->selectionModel()->select(lastIndex, QItemSelectionModel::Select); + selection = ui->monitoringWidget->selectionModel()->selectedIndexes(); } while( selection.isEmpty() == false ) From 697cc0d69374a33187fe8d48c07a46133d65a170 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 13:37:10 +0200 Subject: [PATCH 1054/1765] ComputerMonitoringWidget: fix code indentation --- master/src/ComputerMonitoringWidget.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 9aade90da..287dbe31b 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -274,18 +274,18 @@ void ComputerMonitoringWidget::runDoubleClickFeature( const QModelIndex& index ) void ComputerMonitoringWidget::runMousePressAndHoldFeature( ) { - const auto selectedInterfaces = selectedComputerControlInterfaces(); - if ( !m_ignoreMousePressAndHoldEvent && + const auto selectedInterfaces = selectedComputerControlInterfaces(); + if ( !m_ignoreMousePressAndHoldEvent && selectedInterfaces.count() > 0 && selectedInterfaces.count() < 2 && selectedInterfaces.first()->state() == ComputerControlInterface::State::Connected && selectedInterfaces.first()->hasValidFramebuffer() ) - { + { m_ignoreMousePressAndHoldEvent = true; delete m_computerZoomWidget; m_computerZoomWidget = new ComputerZoomWidget( selectedInterfaces.first() ); QApplication::setOverrideCursor(Qt::BlankCursor); - } + } } From f4e81175fd1517b29e818db9cb91a2cf325b4b63 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 13:40:38 +0200 Subject: [PATCH 1055/1765] SpotlightPanel: improve help text --- master/src/SpotlightPanel.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/SpotlightPanel.ui b/master/src/SpotlightPanel.ui index bbb1f8c32..09c3fae88 100644 --- a/master/src/SpotlightPanel.ui +++ b/master/src/SpotlightPanel.ui @@ -86,7 +86,7 @@ Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. Qt::AlignCenter From 16395ef730eb8cb0a216463c78ba3ae41c869093 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 14:01:42 +0200 Subject: [PATCH 1056/1765] QtCompat: drop QDeadlineTimer handling Simply call QWaitCondition::wait() overload taking the timeout as unsigned long. --- core/src/QtCompat.h | 6 ------ core/src/VncConnection.cpp | 8 ++++---- plugins/platform/windows/DesktopInputController.cpp | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/core/src/QtCompat.h b/core/src/QtCompat.h index 15cb72b69..5eb642241 100644 --- a/core/src/QtCompat.h +++ b/core/src/QtCompat.h @@ -82,9 +82,3 @@ struct QOverload : QConstOverload, QNonConstOverload { return ptr; } }; #endif - -#if QT_VERSION < QT_VERSION_CHECK(5, 12, 0) -#define QDeadlineTimer(x) static_cast(x) -#else -#include -#endif diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 88dc5b188..2c8486147 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -466,12 +466,12 @@ void VncConnection::establishConnection() sleeperMutex.lock(); if( m_framebufferUpdateInterval > 0 ) { - m_updateIntervalSleeper.wait( &sleeperMutex, QDeadlineTimer( m_framebufferUpdateInterval ) ); + m_updateIntervalSleeper.wait( &sleeperMutex, m_framebufferUpdateInterval ); } else { // default: retry every second - m_updateIntervalSleeper.wait( &sleeperMutex, QDeadlineTimer( m_connectionRetryInterval ) ); + m_updateIntervalSleeper.wait( &sleeperMutex, m_connectionRetryInterval ); } sleeperMutex.unlock(); } @@ -523,7 +523,7 @@ void VncConnection::handleConnection() const auto remainingFastUpdateInterval = m_fastFramebufferUpdateInterval - loopTimer.elapsed(); sleeperMutex.lock(); - m_updateIntervalSleeper.wait( &sleeperMutex, QDeadlineTimer( remainingFastUpdateInterval ) ); + m_updateIntervalSleeper.wait( &sleeperMutex, remainingFastUpdateInterval ); sleeperMutex.unlock(); } else if( m_framebufferState == FramebufferState::Valid && @@ -531,7 +531,7 @@ void VncConnection::handleConnection() isControlFlagSet( ControlFlag::TerminateThread ) == false ) { sleeperMutex.lock(); - m_updateIntervalSleeper.wait( &sleeperMutex, QDeadlineTimer( remainingUpdateInterval ) ); + m_updateIntervalSleeper.wait( &sleeperMutex, remainingUpdateInterval ); sleeperMutex.unlock(); } diff --git a/plugins/platform/windows/DesktopInputController.cpp b/plugins/platform/windows/DesktopInputController.cpp index 21f965b90..3844bf8b5 100644 --- a/plugins/platform/windows/DesktopInputController.cpp +++ b/plugins/platform/windows/DesktopInputController.cpp @@ -115,7 +115,7 @@ void DesktopInputController::run() while( isInterruptionRequested() == false ) { waitMutex.lock(); - m_inputWaitCondition.wait( &waitMutex, QDeadlineTimer( ThreadSleepInterval ) ); + m_inputWaitCondition.wait( &waitMutex, ThreadSleepInterval ); waitMutex.unlock(); m_dataMutex.lock(); From 2af8ab8d9914c59b16c29d5a762f7cc2dcbdca08 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 14:04:25 +0200 Subject: [PATCH 1057/1765] QtCompat: drop support for Qt < 5.7 --- core/src/QtCompat.h | 51 ++------------------------------------------- 1 file changed, 2 insertions(+), 49 deletions(-) diff --git a/core/src/QtCompat.h b/core/src/QtCompat.h index 5eb642241..eb1b90e2c 100644 --- a/core/src/QtCompat.h +++ b/core/src/QtCompat.h @@ -26,8 +26,8 @@ #include -#if QT_VERSION < QT_VERSION_CHECK(5, 6, 0) -#error Qt < 5.6 not supported +#if QT_VERSION < QT_VERSION_CHECK(5, 7, 0) +#error Qt < 5.7 not supported #endif #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0) @@ -35,50 +35,3 @@ Class(const Class &&) Q_DECL_EQ_DELETE;\ Class &operator=(const Class &&) Q_DECL_EQ_DELETE; #endif - -#if QT_VERSION < QT_VERSION_CHECK(5, 7, 0) -template struct QAddConst { using Type = const T; }; -template constexpr typename QAddConst::Type &qAsConst(T &t) { return t; } -template void qAsConst(const T &&) = delete; - -template -struct QNonConstOverload -{ - template - Q_DECL_CONSTEXPR auto operator()(R (T::*ptr)(Args...)) const Q_DECL_NOTHROW -> decltype(ptr) - { return ptr; } - - template - static Q_DECL_CONSTEXPR auto of(R (T::*ptr)(Args...)) Q_DECL_NOTHROW -> decltype(ptr) - { return ptr; } -}; - -template -struct QConstOverload -{ - template - Q_DECL_CONSTEXPR auto operator()(R (T::*ptr)(Args...) const) const Q_DECL_NOTHROW -> decltype(ptr) - { return ptr; } - - template - static Q_DECL_CONSTEXPR auto of(R (T::*ptr)(Args...) const) Q_DECL_NOTHROW -> decltype(ptr) - { return ptr; } -}; - -template -struct QOverload : QConstOverload, QNonConstOverload -{ - using QConstOverload::of; - using QConstOverload::operator(); - using QNonConstOverload::of; - using QNonConstOverload::operator(); - - template - Q_DECL_CONSTEXPR auto operator()(R (*ptr)(Args...)) const Q_DECL_NOTHROW -> decltype(ptr) - { return ptr; } - - template - static Q_DECL_CONSTEXPR auto of(R (*ptr)(Args...)) Q_DECL_NOTHROW -> decltype(ptr) - { return ptr; } -}; -#endif From 49baddc6ba89978dedba70e555ca231b3f28f376 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Sep 2021 15:39:41 +0200 Subject: [PATCH 1058/1765] PlatformSessionManager: add maximumSessionCount() --- plugins/platform/common/PlatformSessionManager.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/platform/common/PlatformSessionManager.h b/plugins/platform/common/PlatformSessionManager.h index 9bceb103d..fae135e99 100644 --- a/plugins/platform/common/PlatformSessionManager.h +++ b/plugins/platform/common/PlatformSessionManager.h @@ -52,6 +52,11 @@ class PlatformSessionManager : public QThread return m_multiSession; } + int maximumSessionCount() const + { + return m_maximumSessionCount; + } + using SessionMap = QMap; protected: From d3c680e5f550e248033cd12b9031738a235e2cb1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 13 Sep 2021 09:33:08 +0200 Subject: [PATCH 1059/1765] VeyonConfiguration: add active session mode property --- configurator/src/ServiceConfigurationPage.ui | 25 ++++++++++++++++---- core/src/VeyonConfigurationProperties.h | 1 + 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/configurator/src/ServiceConfigurationPage.ui b/configurator/src/ServiceConfigurationPage.ui index 113a22716..dcb8dfee3 100644 --- a/configurator/src/ServiceConfigurationPage.ui +++ b/configurator/src/ServiceConfigurationPage.ui @@ -111,13 +111,13 @@ - Sessions + Session mode - + - Single session mode (create server instance for local/physical session only) + Local session mode (single server instance for primary local session) true @@ -127,6 +127,20 @@ + + + + Enabling this option will make the service launch a server process for every interactive session on a computer. +Typically this is required to support terminal servers. + + + Active session mode (single server instance for active local or remote session) + + + sessionModeButtonGroup + + + @@ -134,7 +148,7 @@ Typically this is required to support terminal servers. - Multi session mode (create server instance for each local and remote desktop session) + Multi session mode (distinct server instance for each local and remote desktop session) sessionModeButtonGroup @@ -333,7 +347,8 @@ Typically this is required to support terminal servers. autostartService startService stopService - singleSessionModeEnabled + localSessionModeEnabled + activeSessionModeEnabled multiSessionModeEnabled maximumSessionCount veyonServerPort diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index b1c4d2032..cc499aeae 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -61,6 +61,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, isTrayIconHidden, setTrayIconHidden, "HideTrayIcon", "Service", false, Configuration::Property::Flag::Advanced ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, failedAuthenticationNotificationsEnabled, setFailedAuthenticationNotificationsEnabled, "FailedAuthenticationNotifications", "Service", true, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, remoteConnectionNotificationsEnabled, setRemoteConnectionNotificationsEnabled, "RemoteConnectionNotifications", "Service", false, Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, activeSessionModeEnabled, setActiveSessionModeEnabled, "ActiveSession", "Service", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, multiSessionModeEnabled, setMultiSessionModeEnabled, "MultiSession", "Service", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, maximumSessionCount, setMaximumSessionCount, "MaximumSessionCount", "Service", 100, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, autostartService, setServiceAutostart, "Autostart", "Service", true, Configuration::Property::Flag::Advanced ) \ From a3aca162e51dd71ef1989126e8606432ce1e5573 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 13 Sep 2021 09:34:46 +0200 Subject: [PATCH 1060/1765] PlatformSessionManager: add mode enum/property --- .../platform/common/PlatformSessionManager.cpp | 8 ++++++-- plugins/platform/common/PlatformSessionManager.h | 15 ++++++++++++--- plugins/platform/linux/LinuxServiceCore.cpp | 6 +++--- plugins/platform/windows/WindowsServiceCore.cpp | 6 +++--- plugins/platform/windows/WindowsServiceCore.h | 2 +- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index d4353004e..a32615397 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -34,7 +34,11 @@ PlatformSessionManager::PlatformSessionManager( QObject* parent ) : QThread( parent ), - m_multiSession( VeyonCore::config().multiSessionModeEnabled() ), + m_mode( VeyonCore::config().multiSessionModeEnabled() ? Mode::Multi : + VeyonCore::config().activeSessionModeEnabled() ? + Mode::Active : + Mode::Local + ), m_maximumSessionCount( VeyonCore::config().maximumSessionCount() ) { vDebug(); @@ -56,7 +60,7 @@ PlatformSessionManager::~PlatformSessionManager() void PlatformSessionManager::run() { - if( m_multiSession ) + if( mode() == Mode::Multi ) { auto server = new QLocalServer; server->setSocketOptions( QLocalServer::WorldAccessOption ); diff --git a/plugins/platform/common/PlatformSessionManager.h b/plugins/platform/common/PlatformSessionManager.h index fae135e99..13fd0d6cc 100644 --- a/plugins/platform/common/PlatformSessionManager.h +++ b/plugins/platform/common/PlatformSessionManager.h @@ -35,7 +35,16 @@ class QLocalSocket; class PlatformSessionManager : public QThread { + Q_OBJECT public: + enum class Mode + { + Local, + Active, + Multi + }; + Q_ENUM(Mode) + using SessionId = PlatformSessionFunctions::SessionId; using PlatformSessionId = QString; @@ -47,9 +56,9 @@ class PlatformSessionManager : public QThread static SessionId resolveSessionId( const PlatformSessionId& platformSessionId ); - bool multiSession() const + Mode mode() const { - return m_multiSession; + return m_mode; } int maximumSessionCount() const @@ -74,7 +83,7 @@ class PlatformSessionManager : public QThread static bool waitForMessage( QLocalSocket* socket ); - const bool m_multiSession; + const Mode m_mode; const int m_maximumSessionCount; QMutex m_mutex; diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 064bd2e97..d66c118ed 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -85,7 +85,7 @@ void LinuxServiceCore::stopServer( const QString& login1SessionId, const QDBusOb stopServer( sessionPath ); // make sure to (re-)start server instances for preempted/suspended sessions such as the login manager session - if( m_sessionManager.multiSession() == false ) + if( m_sessionManager.mode() != PlatformSessionManager::Mode::Multi ) { startServers(); } @@ -131,7 +131,7 @@ void LinuxServiceCore::startServers() { if( m_serverProcesses.contains( s ) == false && m_deferredServerSessions.contains( s ) == false && - ( m_sessionManager.multiSession() || m_serverProcesses.isEmpty() ) ) + ( m_sessionManager.mode() == PlatformSessionManager::Mode::Multi || m_serverProcesses.isEmpty() ) ) { startServer( s ); } @@ -190,7 +190,7 @@ void LinuxServiceCore::startServer( const QString& sessionPath ) return; } - if( m_sessionManager.multiSession() == false ) + if( m_sessionManager.mode() != PlatformSessionManager::Mode::Multi ) { // make sure no other server is still running stopAllServers(); diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index a8b8d5522..aaaa5a2cf 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -167,13 +167,13 @@ void WindowsServiceCore::manageServerInstances() m_serverShutdownEvent = CreateEvent( nullptr, false, false, L"Global\\SessionEventUltra" ); ResetEvent( m_serverShutdownEvent ); - if( m_sessionManager.multiSession() ) + if( m_sessionManager.mode() != PlatformSessionManager::Mode::Local ) { manageServersForAllSessions(); } else { - manageServerForActiveConsoleSession(); + manageServerForConsoleSession(); } CloseHandle( m_serverShutdownEvent ); @@ -239,7 +239,7 @@ void WindowsServiceCore::manageServersForAllSessions() -void WindowsServiceCore::manageServerForActiveConsoleSession() +void WindowsServiceCore::manageServerForConsoleSession() { VeyonServerProcess veyonServerProcess; diff --git a/plugins/platform/windows/WindowsServiceCore.h b/plugins/platform/windows/WindowsServiceCore.h index 6f6033367..4bef7b8ec 100644 --- a/plugins/platform/windows/WindowsServiceCore.h +++ b/plugins/platform/windows/WindowsServiceCore.h @@ -44,7 +44,7 @@ class WindowsServiceCore private: void manageServersForAllSessions(); - void manageServerForActiveConsoleSession(); + void manageServerForConsoleSession(); static void WINAPI serviceMainStatic( DWORD argc, LPWSTR* argv ); static DWORD WINAPI serviceCtrlStatic( DWORD ctrlCode, DWORD eventType, LPVOID eventData, LPVOID context ); From b553734ba1eeef677f0eae6ae710c1f4c6de2fc6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 13 Sep 2021 09:44:17 +0200 Subject: [PATCH 1061/1765] WindowsServiceCore: implement active session mode This is a first draft to implement the active session mode discussed in #735. It starts only one server instance in the currently active and/or most recently activated session (can be console or RD session). --- .../platform/windows/WindowsServiceCore.cpp | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index aaaa5a2cf..8337c0a20 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -124,7 +124,12 @@ WindowsServiceCore::WindowsServiceCore( const QString& name, s_instance = this; // allocate session 0 (PlatformSessionFunctions::DefaultSessionId) so we can always assign it to the console session - m_sessionManager.openSession( QStringLiteral("0 (console)") ); + if( m_sessionManager.mode() != PlatformSessionManager::Mode::Active || + ( WtsSessionManager::activeSessions().size() <= 1 && + WtsSessionManager::activeConsoleSession() != WtsSessionManager::InvalidSession ) ) + { + m_sessionManager.openSession( QStringLiteral("0 (console)") ); + } // enable privileges required to create process with access token from other process WindowsCoreFunctions::enablePrivilege( SE_ASSIGNPRIMARYTOKEN_NAME, true ); @@ -185,6 +190,8 @@ void WindowsServiceCore::manageServersForAllSessions() { QMap serverProcesses; + const auto activeSessionOnly = m_sessionManager.mode() == PlatformSessionManager::Mode::Active; + while( WaitForSingleObject( m_stopServiceEvent, SessionPollingInterval ) == WAIT_TIMEOUT ) { auto wtsSessionIds = WtsSessionManager::activeSessions(); @@ -196,12 +203,23 @@ void WindowsServiceCore::manageServersForAllSessions() wtsSessionIds.append( consoleSessionId ); } + const auto includeConsoleSession = activeSessionOnly && + wtsSessionIds.size() == 1 && + wtsSessionIds.first() == consoleSessionId; + const auto excludeConsoleSession = activeSessionOnly && + wtsSessionIds.size() > 1; + + if( excludeConsoleSession ) + { + wtsSessionIds.removeAll( consoleSessionId ); + } + for( auto it = serverProcesses.begin(); it != serverProcesses.end(); ) { if( wtsSessionIds.contains( it.key() ) == false ) { delete it.value(); - if( it.key() != consoleSessionId ) + if( it.key() != consoleSessionId || excludeConsoleSession ) { m_sessionManager.closeSession( QString::number(it.key() ) ); } @@ -217,7 +235,7 @@ void WindowsServiceCore::manageServersForAllSessions() { if( serverProcesses.contains( wtsSessionId ) == false ) { - if( wtsSessionId != consoleSessionId ) + if( wtsSessionId != consoleSessionId || includeConsoleSession ) { m_sessionManager.openSession( QString::number(wtsSessionId) ); } From 1c9945ba9dd4b3609ea925a5110db3f02e6938ba Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 16 Sep 2021 15:14:51 +0200 Subject: [PATCH 1062/1765] LinuxServerProcess: kill top level process When killing all children of a given process, we must not forget to kill the actual top level process. --- plugins/platform/linux/LinuxServerProcess.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index a8ea669cd..3ac51da1a 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -95,6 +96,11 @@ void LinuxServerProcess::stop() }, pid, 0, true ); + if( ::kill( pid, sig ) < 0 && errno != ESRCH ) + { + vCritical() << "kill() failed with" << errno; + } + // clean up process waitpid( pid, nullptr, WNOHANG ); } From 322cd5ce9b71ea19ef4a116e51f6e564a9fe6ff3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 16 Sep 2021 15:15:46 +0200 Subject: [PATCH 1063/1765] LinuxServerProcess: log message when kill() fails --- plugins/platform/linux/LinuxServerProcess.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index 3ac51da1a..a4a3933e8 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -88,9 +88,9 @@ void LinuxServerProcess::stop() { LinuxCoreFunctions::forEachChildProcess( [=]( proc_t* procInfo ) { - if( procInfo->tid > 0 ) + if( procInfo->tid > 0 && ::kill( procInfo->tid, sig ) < 0 && errno != ESRCH ) { - ::kill( procInfo->tid, sig ); + vCritical() << "kill() failed with" << errno; } return true; }, From 15fbdad55a02c75e9a21965ce7f36dbffab382ef Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 11:06:45 +0200 Subject: [PATCH 1064/1765] ComputerControlInterface: allow specifying port explicitly --- core/src/ComputerControlInterface.cpp | 8 ++++++-- core/src/ComputerControlInterface.h | 5 +++-- master/src/VeyonMaster.cpp | 6 +++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 56b12fa28..f23fb62de 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -32,10 +32,10 @@ #include "VncConnection.h" -ComputerControlInterface::ComputerControlInterface( const Computer& computer, - QObject* parent ) : +ComputerControlInterface::ComputerControlInterface( const Computer& computer, int port, QObject* parent ) : QObject( parent ), m_computer( computer ), + m_port( port ), m_state( State::Disconnected ), m_userLoginName(), m_userFullName(), @@ -74,6 +74,10 @@ void ComputerControlInterface::start( QSize scaledScreenSize, UpdateMode updateM { m_vncConnection = new VncConnection(); m_vncConnection->setHost( m_computer.hostAddress() ); + if( m_port > 0 ) + { + m_vncConnection->setPort( m_port ); + } m_vncConnection->setQuality( VncConnection::Quality::Thumbnail ); m_vncConnection->setScaledSize( m_scaledScreenSize ); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 245eb2572..3afc23a02 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -55,7 +55,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab using State = VncConnection::State; - explicit ComputerControlInterface( const Computer& computer, QObject* parent = nullptr ); + explicit ComputerControlInterface( const Computer& computer, int port = -1, QObject* parent = nullptr ); ~ComputerControlInterface() override; VeyonConnection* connection() const @@ -166,7 +166,8 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab static constexpr int ConnectionWatchdogTimeout = 10000; static constexpr int UpdateIntervalDisabled = 5000; - Computer m_computer; + const Computer m_computer; + const int m_port; UpdateMode m_updateMode{UpdateMode::Disabled}; diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 4083f9a32..d06199f7a 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -56,9 +56,9 @@ VeyonMaster::VeyonMaster( QObject* parent ) : m_computerSelectModel( new ComputerSelectModel( m_computerManager->computerTreeModel(), this ) ), m_localSessionControlInterface( Computer( NetworkObject::Uid::createUuid(), QStringLiteral("localhost"), - QStringLiteral("%1:%2"). - arg( QHostAddress( QHostAddress::LocalHost ).toString() ). - arg( VeyonCore::config().veyonServerPort() + VeyonCore::sessionId() ) ), + QStringLiteral("%1"). + arg( QHostAddress( QHostAddress::LocalHost ).toString() ) ), + VeyonCore::config().veyonServerPort() + VeyonCore::sessionId(), this ), m_currentMode( VeyonCore::builtinFeatures().monitoringMode().feature().uid() ) { From c3210bbec6f3d4d9567a37e1108526a0814fc48d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 11:09:13 +0200 Subject: [PATCH 1065/1765] VncView: refactor to operate on ComputerControlInterfaces In cases such as remote access and the computer zoom feature there's already an existing ComputerControlInterface which we simply can reuse. This avoids establishing additional connections, resulting in immediate access to computers. --- core/src/VncView.cpp | 22 ++++++++++++++++++--- core/src/VncView.h | 13 +++++++++--- core/src/VncViewItem.cpp | 14 +++++-------- core/src/VncViewItem.h | 5 +---- core/src/VncViewWidget.cpp | 18 +++-------------- core/src/VncViewWidget.h | 6 ++++-- master/src/ComputerZoomWidget.cpp | 5 ++--- plugins/demo/DemoClient.cpp | 5 +++-- plugins/demo/DemoClient.h | 8 ++++++-- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- 10 files changed, 54 insertions(+), 44 deletions(-) diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index d25d289b3..affeadd34 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -32,13 +32,23 @@ #include "PlatformInputDeviceFunctions.h" #include "KeyboardShortcutTrapper.h" +#include "VeyonConnection.h" #include "VncConnection.h" #include "VncView.h" -VncView::VncView( VncConnection* connection ) : - m_connection( connection ), - m_framebufferSize( connection->image().size() ), +VncView::VncView( ComputerControlInterface::Pointer computerControlInterface ) : + m_computerControlInterface( [computerControlInterface]() { + if( computerControlInterface->state() == ComputerControlInterface::State::Disconnected || + computerControlInterface->connection() == nullptr ) + { + computerControlInterface->start(); + } + return computerControlInterface; + }() ), + m_previousUpdateMode( m_computerControlInterface->updateMode() ), + m_connection( computerControlInterface->connection()->vncConnection() ), + m_framebufferSize( m_connection->image().size() ), m_keyboardShortcutTrapper( VeyonCore::platform().inputDeviceFunctions().createKeyboardShortcutTrapper( nullptr ) ) { // handle/forward trapped keyboard shortcuts @@ -46,12 +56,18 @@ VncView::VncView( VncConnection* connection ) : m_keyboardShortcutTrapper, [this]( KeyboardShortcutTrapper::Shortcut shortcut ) { handleShortcut( shortcut ); } ); + + m_computerControlInterface->setUpdateMode( ComputerControlInterface::UpdateMode::Live ); } VncView::~VncView() { + unpressModifiers(); + + m_computerControlInterface->setUpdateMode( m_previousUpdateMode ); + delete m_keyboardShortcutTrapper; } diff --git a/core/src/VncView.h b/core/src/VncView.h index 2a39c4693..007d58cf2 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -28,14 +28,13 @@ #include #include "KeyboardShortcutTrapper.h" -#include "VncConnection.h" +#include "ComputerControlInterface.h" class QHoverEvent; class QKeyEvent; class QMouseEvent; class QWheelEvent; class KeyboardShortcutTrapper; -class VncConnection; // clazy:excludeall=copyable-polymorphic @@ -63,9 +62,14 @@ class VEYON_CORE_EXPORT VncView ShortcutCount } ; - VncView( VncConnection* connection ); + VncView( ComputerControlInterface::Pointer computerControlInterface ); virtual ~VncView(); + ComputerControlInterface::Pointer computerControlInterface() const + { + return m_computerControlInterface; + } + VncConnection* connection() const { return m_connection; @@ -141,6 +145,9 @@ class VEYON_CORE_EXPORT VncView void pressKey( unsigned int key ); void unpressKey( unsigned int key ); + ComputerControlInterface::Pointer m_computerControlInterface; + ComputerControlInterface::UpdateMode m_previousUpdateMode; + VncConnection* m_connection{nullptr}; QPixmap m_cursorShape{}; QPoint m_cursorHot{0, 0}; diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index efd59208a..ed6025b2f 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -26,20 +26,15 @@ #include #include "QSGImageTexture.h" -#include "VeyonConnection.h" #include "VncViewItem.h" VncViewItem::VncViewItem( ComputerControlInterface::Pointer computerControlInterface, QQuickItem* parent ) : QQuickItem( parent ), - VncView( computerControlInterface->connection()->vncConnection() ), - m_computerControlInterface( computerControlInterface ), - m_previousUpdateMode( m_computerControlInterface->updateMode() ) + VncView( computerControlInterface ) { connectUpdateFunctions( this ); - m_computerControlInterface->setUpdateMode( ComputerControlInterface::UpdateMode::Live ); - setAcceptHoverEvents( true ); setAcceptedMouseButtons( Qt::AllButtons ); setKeepMouseGrab( true ); @@ -52,7 +47,8 @@ VncViewItem::VncViewItem( ComputerControlInterface::Pointer computerControlInter VncViewItem::~VncViewItem() { - m_computerControlInterface->setUpdateMode( m_previousUpdateMode ); + // do not receive any signals during connection shutdown + connection()->disconnect( this ); } @@ -77,11 +73,11 @@ QSGNode* VncViewItem::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* up if( viewport().isValid() ) { - texture->setImage( m_computerControlInterface->screen().copy( viewport() ) ); + texture->setImage( computerControlInterface()->screen().copy( viewport() ) ); } else { - texture->setImage( m_computerControlInterface->screen() ); + texture->setImage( computerControlInterface()->screen() ); } node->setRect( boundingRect() ); diff --git a/core/src/VncViewItem.h b/core/src/VncViewItem.h index a428fbd1f..bb8ffe136 100644 --- a/core/src/VncViewItem.h +++ b/core/src/VncViewItem.h @@ -24,9 +24,8 @@ #pragma once -#include +#include -#include "ComputerControlInterface.h" #include "VncView.h" class VEYON_CORE_EXPORT VncViewItem : public QQuickItem, public VncView @@ -46,8 +45,6 @@ class VEYON_CORE_EXPORT VncViewItem : public QQuickItem, public VncView bool event( QEvent* event ) override; private: - ComputerControlInterface::Pointer m_computerControlInterface; - ComputerControlInterface::UpdateMode m_previousUpdateMode; QSize m_framebufferSize; }; diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index d52f0d5a6..38e2ba3cf 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -39,18 +39,15 @@ #include "VncViewWidget.h" -VncViewWidget::VncViewWidget( const QString& host, int port, QWidget* parent, Mode mode, const QRect& viewport ) : +VncViewWidget::VncViewWidget( ComputerControlInterface::Pointer computerControlInterface, Mode mode, + const QRect& viewport, QWidget* parent ) : QWidget( parent ), - VncView( new VncConnection( QCoreApplication::instance() ) ), - m_veyonConnection( new VeyonConnection( connection() ) ) + VncView( computerControlInterface ) { setViewport( viewport ); connectUpdateFunctions( this ); - connection()->setHost( host ); - connection()->setPort( port ); - if( mode == DemoMode ) { connection()->setQuality( VncConnection::Quality::Default ); @@ -91,8 +88,6 @@ VncViewWidget::VncViewWidget( const QString& host, int port, QWidget* parent, Mo setFocusPolicy( Qt::StrongFocus ); setFocus(); - - connection()->start(); } @@ -101,13 +96,6 @@ VncViewWidget::~VncViewWidget() { // do not receive any signals during connection shutdown connection()->disconnect( this ); - - unpressModifiers(); - - delete m_veyonConnection; - m_veyonConnection = nullptr; - - connection()->stopAndDeleteLater(); } diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index 08e238652..18a6db581 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -28,15 +28,17 @@ #include #include "VncView.h" +#include "ComputerControlInterface.h" class ProgressWidget; -class VeyonConnection; class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView { Q_OBJECT public: - VncViewWidget( const QString& host, int port, QWidget* parent, Mode mode, const QRect& viewport = {} ); + VncViewWidget( ComputerControlInterface::Pointer computerControlInterface, Mode mode, const QRect& viewport, + QWidget* parent ); + ~VncViewWidget() override; QSize sizeHint() const override; diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index d7c3af7ca..11c430b25 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -34,10 +34,9 @@ #include "VncViewWidget.h" -ComputerZoomWidget::ComputerZoomWidget(const ComputerControlInterface::Pointer& computerControlInterface ) : +ComputerZoomWidget::ComputerZoomWidget( const ComputerControlInterface::Pointer& computerControlInterface ) : QWidget( nullptr ), - m_computerControlInterface( computerControlInterface ), - m_vncView( new VncViewWidget( computerControlInterface->computer().hostAddress(), -1, this, VncView::RemoteControlMode ) ) + m_vncView( new VncViewWidget( computerControlInterface, VncView::RemoteControlMode, {}, this ) ) { const auto openOnMasterScreen = VeyonCore::config().showFeatureWindowsOnSameScreen(); const auto master = VeyonCore::instance()->findChild(); diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index eeb5f59d5..e10315f2b 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -40,7 +40,8 @@ DemoClient::DemoClient( const QString& host, int port, bool fullscreen, const QRect& viewport, QObject* parent ) : QObject( parent ), - m_toplevel( nullptr ) + m_toplevel( nullptr ), + m_computerControlInterface( ComputerControlInterface::Pointer::create( Computer( {}, host, host ), port, this ) ) { if( fullscreen ) { @@ -68,7 +69,7 @@ DemoClient::DemoClient( const QString& host, int port, bool fullscreen, const QR m_toplevel->resize( screenGeometry.size() - QSize( 10, 30 ) ); } - m_vncView = new VncViewWidget( host, port, m_toplevel, VncView::DemoMode, viewport ); + m_vncView = new VncViewWidget( m_computerControlInterface, VncView::DemoMode, viewport, m_toplevel ); auto toplevelLayout = new QVBoxLayout; toplevelLayout->setContentsMargins( 0, 0, 0, 0 ); diff --git a/plugins/demo/DemoClient.h b/plugins/demo/DemoClient.h index 567244187..1a9b39e76 100644 --- a/plugins/demo/DemoClient.h +++ b/plugins/demo/DemoClient.h @@ -26,6 +26,8 @@ #include +#include "ComputerControlInterface.h" + class VncViewWidget; class DemoClient : public QObject @@ -39,7 +41,9 @@ class DemoClient : public QObject void viewDestroyed( QObject* obj ); void resizeToplevelWidget(); - QWidget* m_toplevel; - VncViewWidget* m_vncView; + QWidget* m_toplevel{nullptr}; + + ComputerControlInterface::Pointer m_computerControlInterface; + VncViewWidget* m_vncView{nullptr}; } ; diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 12ab9c5c9..3ec7cae64 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -251,7 +251,7 @@ RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& bool startViewOnly, bool showViewOnlyToggleButton ) : QWidget( nullptr ), m_computerControlInterface( computerControlInterface ), - m_vncView( new VncViewWidget( computerControlInterface->computer().hostAddress(), -1, this, VncView::RemoteControlMode ) ), + m_vncView( new VncViewWidget( computerControlInterface, VncView::RemoteControlMode, {}, this ) ), m_toolBar( new RemoteAccessWidgetToolBar( this, startViewOnly, showViewOnlyToggleButton ) ) { const auto openOnMasterScreen = VeyonCore::config().showFeatureWindowsOnSameScreen(); From 84aaaa2769a3ff11315fdc55935928e7972367ca Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 13:39:12 +0200 Subject: [PATCH 1066/1765] VncConnection: check client pointer in setUseRemoteCursor() --- core/src/VncConnection.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 2c8486147..71d511722 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -195,9 +195,12 @@ void VncConnection::setUseRemoteCursor( bool enabled ) { m_useRemoteCursor = enabled; - m_client->appData.useRemoteCursor = enabled; + if( m_client ) + { + m_client->appData.useRemoteCursor = enabled; - enqueueEvent( new VncUpdateFormatAndEncodingsEvent, true ); + enqueueEvent( new VncUpdateFormatAndEncodingsEvent, true ); + } } From 744a59194f904b7c0546818234502e1c4fcc38de Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 13:44:06 +0200 Subject: [PATCH 1067/1765] VncViewWidget: draw busy indicator when connecting Always indicate that the connection is being (re-)restablished by drawing a busy indicator. This replaces the old-fashioned ProgressWidget which was used for the demo window only anyway. --- core/src/VncViewWidget.cpp | 73 +++++++++++++++++++++++++++----------- core/src/VncViewWidget.h | 7 ++-- 2 files changed, 56 insertions(+), 24 deletions(-) diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index 38e2ba3cf..f3b512742 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -33,7 +33,6 @@ #include #endif -#include "ProgressWidget.h" #include "VeyonConnection.h" #include "VncConnection.h" #include "VncViewWidget.h" @@ -48,19 +47,10 @@ VncViewWidget::VncViewWidget( ComputerControlInterface::Pointer computerControlI connectUpdateFunctions( this ); - if( mode == DemoMode ) - { - connection()->setQuality( VncConnection::Quality::Default ); - m_establishingConnectionWidget = new ProgressWidget( - tr( "Establishing connection to %1 ..." ).arg( connection()->host() ), - QStringLiteral( ":/core/watch%1.png" ), 16, this ); - connect( connection(), &VncConnection::stateChanged, - this, &VncViewWidget::updateConnectionState ); - } - else if( mode == RemoteControlMode ) - { - connection()->setQuality( VncConnection::Quality::RemoteControl ); - } + connect( connection(), &VncConnection::stateChanged, this, &VncViewWidget::updateConnectionState ); + connect( &m_busyIndicatorTimer, &QTimer::timeout, this, QOverload<>::of(&QWidget::repaint) ); + + connection()->setQuality( VncConnection::Quality::Default ); // set up mouse border signal timer m_mouseBorderSignalTimer.setSingleShot( true ); @@ -88,6 +78,8 @@ VncViewWidget::VncViewWidget( ComputerControlInterface::Pointer computerControlI setFocusPolicy( Qt::StrongFocus ); setFocus(); + + updateConnectionState(); } @@ -272,6 +264,7 @@ void VncViewWidget::paintEvent( QPaintEvent* paintEvent ) if( image.isNull() || image.format() == QImage::Format_Invalid ) { p.fillRect( paintEvent->rect(), Qt::black ); + drawBusyIndicator( &p ); return; } @@ -291,6 +284,11 @@ void VncViewWidget::paintEvent( QPaintEvent* paintEvent ) p.drawImage( { 0, 0 }, image, source ); } + if( connection()->state() != VncConnection::State::Connected ) + { + drawBusyIndicator( &p ); + } + // draw black borders if neccessary const int screenWidth = scaledSize().width(); if( screenWidth < width() ) @@ -311,11 +309,6 @@ void VncViewWidget::resizeEvent( QResizeEvent* event ) { update(); - if( m_establishingConnectionWidget ) - { - m_establishingConnectionWidget->move( 10, 10 ); - } - updateLocalCursor(); QWidget::resizeEvent( event ); @@ -323,10 +316,48 @@ void VncViewWidget::resizeEvent( QResizeEvent* event ) +void VncViewWidget::drawBusyIndicator( QPainter* painter ) +{ + static constexpr int BusyIndicatorSize = 100; + static constexpr int BusyIndicatorSpeed = 5; + + QRect drawingRect{ + ( width() - BusyIndicatorSize ) / 2, + ( height() - BusyIndicatorSize ) / 2, + BusyIndicatorSize, BusyIndicatorSize, + }; + + QColor color(QStringLiteral("#00acdc")); + QConicalGradient gradient; + gradient.setCenter(drawingRect.center()); + gradient.setAngle((360 - m_busyIndicatorState) % 360); + gradient.setColorAt(0, color); + color.setAlpha(0); + gradient.setColorAt(0.75, color); + color.setAlpha(255); + gradient.setColorAt(1, color); + + QPen pen(QBrush(gradient), 20); + pen.setCapStyle(Qt::RoundCap); + painter->setPen(pen); + + painter->setRenderHint(QPainter::Antialiasing); + painter->drawArc( drawingRect, + ( 360 - ( m_busyIndicatorState % 360 ) ) * 16, 270 * 16 ); + + m_busyIndicatorState += BusyIndicatorSpeed; +} + + + void VncViewWidget::updateConnectionState() { - if( m_establishingConnectionWidget ) + if( connection()->state() != VncConnection::State::Connected ) + { + m_busyIndicatorTimer.start( BusyIndicatorUpdateInterval ); + } + else { - m_establishingConnectionWidget->setVisible( connection()->state() != VncConnection::State::Connected ); + m_busyIndicatorTimer.stop(); } } diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index 18a6db581..fb29f2fc3 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -30,8 +30,6 @@ #include "VncView.h" #include "ComputerControlInterface.h" -class ProgressWidget; - class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView { Q_OBJECT @@ -68,6 +66,7 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView void resizeEvent( QResizeEvent* handleEvent ) override; private: + void drawBusyIndicator( QPainter* painter ); void updateConnectionState(); VeyonConnection* m_veyonConnection{nullptr}; @@ -75,7 +74,9 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView bool m_viewOnlyFocus{true}; bool m_initDone{false}; - ProgressWidget* m_establishingConnectionWidget{nullptr}; + static constexpr auto BusyIndicatorUpdateInterval = 25; + QTimer m_busyIndicatorTimer{this}; + int m_busyIndicatorState{0}; static constexpr int MouseBorderSignalDelay = 500; QTimer m_mouseBorderSignalTimer{this}; From ddd9d316d7c5920e1987a8d82a583d90a4368f0b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 13:46:43 +0200 Subject: [PATCH 1068/1765] VncView: drop unused Mode enumeration --- core/src/VncView.h | 8 -------- core/src/VncViewWidget.cpp | 2 +- core/src/VncViewWidget.h | 2 +- master/src/ComputerZoomWidget.cpp | 2 +- plugins/demo/DemoClient.cpp | 2 +- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- 6 files changed, 5 insertions(+), 13 deletions(-) diff --git a/core/src/VncView.h b/core/src/VncView.h index 007d58cf2..b03447625 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -41,14 +41,6 @@ class KeyboardShortcutTrapper; class VEYON_CORE_EXPORT VncView { public: - enum Modes - { - RemoteControlMode, - DemoMode, - NumModes - } ; - using Mode = Modes; - enum Shortcut { ShortcutCtrlAltDel, diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index f3b512742..f41cc7140 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -38,7 +38,7 @@ #include "VncViewWidget.h" -VncViewWidget::VncViewWidget( ComputerControlInterface::Pointer computerControlInterface, Mode mode, +VncViewWidget::VncViewWidget( ComputerControlInterface::Pointer computerControlInterface, const QRect& viewport, QWidget* parent ) : QWidget( parent ), VncView( computerControlInterface ) diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index fb29f2fc3..cd3bcc975 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -34,7 +34,7 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView { Q_OBJECT public: - VncViewWidget( ComputerControlInterface::Pointer computerControlInterface, Mode mode, const QRect& viewport, + VncViewWidget( ComputerControlInterface::Pointer computerControlInterface, const QRect& viewport, QWidget* parent ); ~VncViewWidget() override; diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 11c430b25..0206a6258 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -36,7 +36,7 @@ ComputerZoomWidget::ComputerZoomWidget( const ComputerControlInterface::Pointer& computerControlInterface ) : QWidget( nullptr ), - m_vncView( new VncViewWidget( computerControlInterface, VncView::RemoteControlMode, {}, this ) ) + m_vncView( new VncViewWidget( computerControlInterface, {}, this ) ) { const auto openOnMasterScreen = VeyonCore::config().showFeatureWindowsOnSameScreen(); const auto master = VeyonCore::instance()->findChild(); diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index e10315f2b..b15be5b0d 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -69,7 +69,7 @@ DemoClient::DemoClient( const QString& host, int port, bool fullscreen, const QR m_toplevel->resize( screenGeometry.size() - QSize( 10, 30 ) ); } - m_vncView = new VncViewWidget( m_computerControlInterface, VncView::DemoMode, viewport, m_toplevel ); + m_vncView = new VncViewWidget( m_computerControlInterface, viewport, m_toplevel ); auto toplevelLayout = new QVBoxLayout; toplevelLayout->setContentsMargins( 0, 0, 0, 0 ); diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 3ec7cae64..202d07dd4 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -251,7 +251,7 @@ RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& bool startViewOnly, bool showViewOnlyToggleButton ) : QWidget( nullptr ), m_computerControlInterface( computerControlInterface ), - m_vncView( new VncViewWidget( computerControlInterface, VncView::RemoteControlMode, {}, this ) ), + m_vncView( new VncViewWidget( computerControlInterface, {}, this ) ), m_toolBar( new RemoteAccessWidgetToolBar( this, startViewOnly, showViewOnlyToggleButton ) ) { const auto openOnMasterScreen = VeyonCore::config().showFeatureWindowsOnSameScreen(); From 055242a3b4b03425eaf9a9f00f466890d9e9ac18 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 13:46:08 +0200 Subject: [PATCH 1069/1765] Core: drop ProgressWidget --- core/resources/core.qrc | 16 -------- core/resources/watch1.png | Bin 2616 -> 0 bytes core/resources/watch10.png | Bin 2635 -> 0 bytes core/resources/watch11.png | Bin 2585 -> 0 bytes core/resources/watch12.png | Bin 2630 -> 0 bytes core/resources/watch13.png | Bin 2630 -> 0 bytes core/resources/watch14.png | Bin 2609 -> 0 bytes core/resources/watch15.png | Bin 2534 -> 0 bytes core/resources/watch16.png | Bin 2655 -> 0 bytes core/resources/watch2.png | Bin 2605 -> 0 bytes core/resources/watch3.png | Bin 2568 -> 0 bytes core/resources/watch4.png | Bin 2603 -> 0 bytes core/resources/watch5.png | Bin 2630 -> 0 bytes core/resources/watch6.png | Bin 2623 -> 0 bytes core/resources/watch7.png | Bin 2568 -> 0 bytes core/resources/watch8.png | Bin 2625 -> 0 bytes core/resources/watch9.png | Bin 2641 -> 0 bytes core/src/ProgressWidget.cpp | 80 ------------------------------------ core/src/ProgressWidget.h | 49 ---------------------- 19 files changed, 145 deletions(-) delete mode 100644 core/resources/watch1.png delete mode 100644 core/resources/watch10.png delete mode 100644 core/resources/watch11.png delete mode 100644 core/resources/watch12.png delete mode 100644 core/resources/watch13.png delete mode 100644 core/resources/watch14.png delete mode 100644 core/resources/watch15.png delete mode 100644 core/resources/watch16.png delete mode 100644 core/resources/watch2.png delete mode 100644 core/resources/watch3.png delete mode 100644 core/resources/watch4.png delete mode 100644 core/resources/watch5.png delete mode 100644 core/resources/watch6.png delete mode 100644 core/resources/watch7.png delete mode 100644 core/resources/watch8.png delete mode 100644 core/resources/watch9.png delete mode 100644 core/src/ProgressWidget.cpp delete mode 100644 core/src/ProgressWidget.h diff --git a/core/resources/core.qrc b/core/resources/core.qrc index b2ebda5e3..3cc66939d 100644 --- a/core/resources/core.qrc +++ b/core/resources/core.qrc @@ -10,22 +10,6 @@ icon16.png icon22.png icon32.png - watch1.png - watch2.png - watch3.png - watch4.png - watch5.png - watch6.png - watch7.png - watch8.png - watch9.png - watch10.png - watch11.png - watch12.png - watch13.png - watch14.png - watch15.png - watch16.png toolbar-background.png document-open.png document-save.png diff --git a/core/resources/watch1.png b/core/resources/watch1.png deleted file mode 100644 index a3e5fc112b1579e456a3de83d1f6d7222c324614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2616 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 diff --git a/core/resources/watch12.png b/core/resources/watch12.png deleted file mode 100644 index d3b37cc42401ec18ad1ad6ce3020064e9828cf45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2630 zcmV-M3c2-(P)@2HQ*UHxaBpO3pY$&$0000EbVXQnL3MO! zZ*l-tZfkCDcW#U!4DtW~03Lc&Sad{Xb7OL8aCB*JZU6vyoJ&+F$V@INElLFd5MKj+ z>hujP000S43q6~}+~t@CEa_IR0iNgO+?NkX7C2~`Lol!~$l5EKd} z2wD&UArKNMaO`xG^0!draIJJ{Fb{pH+8P9n3nYY|~ z`7mRr2^F+(q@%01%=`b(Isdu$9KnmQg9rbSh@#?WrPM=8=|Qb^Dh#6urSvSQ$=hyw z!?#|{_W;Cyd*QzOPTFhMME6Un-=dUkaU3gjUB`A^8`HEXmn%A-uSAtf&6H9KDdj_k z5xw{J+i%JKUj($)Vr1m+-v{-Hc-)Qp`qJ*eKp&vd8no5`D5X(Kp|z$`sd3`O88tVT z6TV*?_5JcYKKrcHw)U#Rf2KV9O9Ob74U)xwHagO*mCo}M@zoi2%1hn1_7 ztXP@AbWF0@Ii7y4|Ecb$EelRws<_bFg||z)N?bjOkmHR zj~=jXbKUmso6Sq=VeklXTAN?yw{;;2IyKdyVoj0O{O%Un^iAb|` zoy&N61=F)x`ue&6Vcm4oyLJGB0LGz1CvKGzqr1DE%b7e!&s+3$nOLrc)B-=y)O8m4euJ?TLPE5<Hd;MZz^v7$}S@1SD8y!wmx# z=BD||-dmYCdm6`$ar1jVOroQYdZ3pH)C0|QM)K_C2&tedTBuZNB$FOm<1{tcWhkZ6 zu4@a>RBH;$)QmrwVS1`WJcvHN>xSnT!vt=LS%WA%QfQh7)t4-zrSZ_jcZvJT7%RQB{j2CMRE%P z6_VSsJoDzn`YbYo7w%Qx6sqKf+*62k!T3j)D5B1 zI0Cg6gta_|;ZQ1-ky3@t68IJvj}!`(cK}9DXM%J*z!WYqN8mXE&utQL1g_o4K;3JU z(6&ullP<}aAe4e2)R;}7E}7Dxq(+4WAWbGy)Im^RXg;nP&pcE9k?#j)wOV8K%1+j{ z`J$ei zoBeZ>K-Ku}6b$63+tQ7o2_GBS=H{q_E4b+XN5sk<*+nATw!G5pegRylJ7l@Qx*h;QjbP7|!X zHOVb|KEV2oLwKfvYk*^bV_X4mh!(0d7io1hT5BdIW>l?KyO7JxSAZfAEVpDo{po?( zo}P5~4L58to<2Xz(;4X8Fi0wC5|0_gmO;Q4jp&zZ99?rp)B;Vpu9%&J!O^q!8!l7^o>@g$=UKf;>+ zG)igCoSBf-YI$PczI(pigc}F4R}lah8QFh$*RI#!Ff)@~ACJex;6M+y3ORl36bM18 zvmM(I*arBO2*);9y`}}(EW^auMMn1h4yq-3yW8>ofHP+%r0@I1`|tnS$C|Bt9(bxL z!sl(v?Yr;3=f}Oh{d>B*yTtJD5K<~;XERLCW|3OsIyS9s2|O>x<;z*}`3l8CiG=6U zo=Or$l3cFH`1rHBQYoH&;DK-6)!g|iz@yC)@NXGd+B=ROJ#?_8rK8r;(z$DVe990) zh~C~Vx;k6wNF{M>lb{|@E|&3Jo7QBERBHm)u_+cSjE+vq`T4Avo15JC^Phk3-e%-= z;CORgw*NGm*}(ALy`SH^X3fz1v?k_xuIlVe8J_3R7|l$w*#h}|nL?qY7Z*!PN+}A3 z#S_2y#SibP)$&V`E&!*1@LG`nIvWE0z~$q;2aIbKksDpLI^;kR2zW-zOh9ZF86}$Ut&$Sjl}%J)Bpeg07*qoM6N<$f(8ij*8l(j diff --git a/core/resources/watch13.png b/core/resources/watch13.png deleted file mode 100644 index 4010c1bb0bafe47577ca5943b12f57b6cc3ee669..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2630 zcmV-M3c2-(P)@2HQ*UHxaBpO3pY$&$0000EbVXQnL3MO! zZ*l-tZfkCDcW#U!4DtW~03Lc&Sad{Xb7OL8aCB*JZU6vyoJ&+F$V@INElLFd5MKj+ z>hujP000SXTLtPKk4)BR#7_Ld} zuJ-o6`<`?7uxnXKO(DZG^Phcp-gnRc|NNh4-{%~`JBX*B{&ll4wJ&OI2I5$EXsuI9 zsW+9<=Z)dnJ$r8d#XDIKK>WT3jvhVg$8qrQN|}!+r4qJnRXxvdkSij-}HHv1`|e)LJt=v&eHVFY@YafafRZZ?);qS{P%PT-LmCDJBX_^mvO5bqj7C z9mH{LCMMqG`0>}x+}!LV`}Y0a{Xq0~K5OHbv9TAnD#eR^eeH7l_CZ;xggk!uEZ;r? zy*;gbWLFb6UgL6Iug7aAmN+xM!Y4o8%S|HzH*9O7WVi6h|2WJ}ouxf((cjxfI-L?r zOU0c-LnE7CdTHzs5MNcm(W9?sl;TV_+hmQ5Y_XSDOFaDZa~xmFa@VbCI@1>Ej6+vf zl61x;m3HXvOVQDj#C9#*z^1#)<4HF<<@M zrzsZlOr0L*nhwEob{GHs@;TyIF*0(E?C9vb6BxSez68)(-*oM@Jyxw2Gd`80y)8kk z4C&UOPHe6aMH|UCxbW0}9N-^6yO&gRnooaaKZ83*(Z*tAi_cW0gX!subal0%wUKw+ zvF8IoAAme~@Wq>rF;+I4=F(!G=g%eR*koaQHVQ!)87iSBip^Uy-*ElRfBlq){`wOH z$rPXZ@_x4NdOw-=KBCx=Nl6OLLrk8}5yzTD!c&8T*WCeh1K3jPzw$g!0rKq3DofRX zehqfQr5YKu0i_{UU|R-D3WNY5z!-S$>Bo8K{(Eq}fCv6zAH(myg-l03VGW`h6f5Ak z4*8-WjukB}8GCs-zZJ*;fvq*$g21zlfwi*2_bikVXv7r(3T&$mDWP1<^YAym#>>YJ zG49CN?a~;t#q%5i zhH9vAgkfrYh56Ys)yPl@4aJIPDX+M&sF=PO^Mh}Fla z0haTcxn;#0^EC=3&BgJHM5`qt;ZrV$1c8q+*bM=`ZH#to+rpT-&052SiB&S~NmAJW zr8L@rYYQA3Y)cS@RpK}%3_}3g26hm%4pOcfYOz5INO}TGK=I-lUcy0SETSmFbzPKN z9|4}NHH+nPwHpk9Z(-Sz(Z3ufnY5`!8qW~~j=*&UjxBI3xc#pC_@})Ob8KvkKil&+ zboF$R3M94I5Y@o038XX#VYub)5h|fZOrJvtL7`B@m{>IgICdPzv*mL5E@KdZqmdF+ zP2<=C-<9~Tz;^|nQ+L6(1*iHksj<>i8@R;zQ3+Z7qdwQq!B%_^5G^lr{D*j&KE;5lMF z`@j<LgyOOn1I;a?GaMKp-=5}Oi|T1}D9uj#qD=_3sRW%;p> z{b}A9y)Zt0jzq$zt0}^_Vmzn*STm?=7Z?3mX7)E!`&Mu0XnTre!bkZA?iIy&5TLQa5Xp1_zC&8BxG#qgx*s^}# z7GT>DtreI!_yql(8N#s2&l{(=H$sKT`HB% zJ^JX^_c!QH0fn~+0628$i9@@0fABr?^SNuAo0FoqyA4a#I5GAT#u&0~n{cGSkx;9| zSW?h8(1dD~Ve<48hYmc2F6QZIX{K6@IC*l))M{bz```cP&lsZ&un4?OPo6OhFVz2iP_mV9yxH}U;nL&W>#0%v{G6Y3b|K* z_OoyA%jXv>jkOkmS2kw;hX{cBmTe0#v}4D6dp`W(JMT*-o40{TYHb{)wA5OKQ52WL zu)HumedeiWp83gG{m%%EtWN{8zl-4a9!?u!10z5WS1;S!V-1)GCfRTX_+tcYj3%H3 o2mrri_3w(`0%z`+wvrNPh5!Hn07*qoM6N<$f;lq-_5c6? diff --git a/core/resources/watch14.png b/core/resources/watch14.png deleted file mode 100644 index 1b17692ed26fe129194af2bddc7cde4f3ae301e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2609 zcmV-13eNS3P)@2HQ*UHxaBpO3pY$&$0000EbVXQnL3MO! zZ*l-tZfkCDcW#U!4DtW~03Lc&Sad{Xb7OL8aCB*JZU6vyoJ&+F$V@INElLFd5MKj+ z>hujP000SqNklU$;ml6mwj2w zhjWs)fLwIVd=GoCwfFzGzV&@;eM|5j+LKQ{8HLQZwN`7wP&2koEiJ>J@?%HUzf&s}8MXY682?!?PUv#}qexc{!WcMY!zZ1VJRjgMT-fI(dxttU-5Ij!Y&grlv|8SFO6F>%f5* z_5j{n0t^fcq-!+>GntgJc5Sbmnkn<>b0>LaD$AF)rD%ysk|~Rhe3VSqA)2u1S{|o; zSq#HAup=fN?G9I8k>c1wmZx`}B55tKa(OGRYqPKrZgQM>VR-n}1AuxHzzsLt`WM5H zeOtDyH>y>SKlYzsBxvKq?~7nrlCEVjQfV7$2ow-c+GN`z1R4SjzHaz8(9qLqqfh{vW^q0Q>eGS{(%8eVaC|k&a{W%-@dj!dRBA8(iFo zNq$)j(~@XFH}ON=u;6@C4G=GYbX-tzS~&6AQMy|#y1H5!9v(G%d)Fog23~v#C;>=- zFbsYdk4JSn9p_)elRWl{%jN4_6oPC=6eR?{0$)M>4d&^F`HP+iG=8A*e8t*s$#{A* zFB}*_DOkC(TXuD=xE5GLGXo_+5QLk1d-Kxw0}c%pNVh~$p(fc9X$b3cLf-k}Os-2CCy?0n#E*7rp?QflM%Q&aTxbfC4cuDRy=ZNM@B+24QQTBU@@<WC6$2T6agI zj-fS_Dn70)3AI2W&H;pA8V!>Y(29rdyPM&|18m&-5q@|752%#qS#j|uKJ~Tlu(`N$eHOfT3}?Opcbxb*D(=VyIA|G}xxVGQl(i^=bvnvZ&Q+n3lt> zKYWP3O&=sw27aJ1q$XwyM5rmeK1a?rAnoA$1uV;4I>-Rm3`0FtsnnK%7LEm`CE5Jh z)x={KwYtK!1rbYNTLQ}zSO#qS5OE}~EpTmtV>P^Bnu1iq zVWBj~Wgq$|ANlm>S=Q4<5NP~BGy>JojX-T~Tv`i)Y5~JYQYw`R!?4x_@J+45{l#Ks zJ3vP+MlR+du^ThD1retSU<(|p;enFXaA7nSA>Y|X+!gqt!1Fc6VxTtLVi0RpM=8b3 z%)G8vs}s%cy7WBve&6@Za=AixKEsM+38@v1C6;C%aRgCE5OW2wh{Q1(0EQH}mLTRz zVy+Pq1XDDY&=ielM}liM#zdButYNk(sGk_1CFN4B)(8S+?A`m=GfjZAi_ZGy=;)O8 zJde#AmeVCq;Vt-B&EQ-7k=+z)NvGKH^_$tSaTBg=K-dy&c}~0$v{0WuP15qwT66U1 zsc>Oo{z#=#3V=DFx>S-q_}~+#^7;0zE3Q~C|9y0f!LyR=>R!@ugQzQUmqfr4V2E>T z9K7L-sCt@mO)+z($l$Y2(c77&P$+Wr=%{|;iC^9{F)>mEjsPc@!ew^0aNYR$Sur{~ z$?CpN+RXyt>@=n!Fq?v=Xox!!TnUk;M=S}ZZ1kG~OcR3Y0)x-|nVx)xTCK*hV`F-9 z^3uI}FTU006Li_g|jh zy7lTU32kxj==R6u! z(2GE@DE6kZ90>RA>wl)TwJosiyia#l`Ej6Aw?=e<7;f?5dFfR};#`C@N(HM4=sZn@=-Z(MZI`kS=Y zk!aM_t*vS4I1bUMjbRv^Jv&FSSf*Gk>FMct6$HL07Uy1m{PADjS1!*kicJ9nfd593 zce)!2pa)pJcI_pd+qZxDYpGOvy;35fl(x0jG6+IXsjyb7RnHC&AO1ss|0Da)``)LK zZewpJ@NSv}E&^5n*1H%V&`7hRyv1$ke*rkZC4hFoZJJGEUF$UR`z*~AdpGSrVlau$ Tyq~MT00000NkvXXu0mjf(&O}N diff --git a/core/resources/watch15.png b/core/resources/watch15.png deleted file mode 100644 index af32f9877a8ffbfd9cf40d2ab4feece48778b348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2534 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 diff --git a/core/resources/watch16.png b/core/resources/watch16.png deleted file mode 100644 index e8ef8c33096febf8d6d85ab452b2b9a5b1a376ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2655 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 diff --git a/core/resources/watch4.png b/core/resources/watch4.png deleted file mode 100644 index 630b1a9fd9c8ee8845832109e35fa8054f29f49c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2603 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 diff --git a/core/resources/watch6.png b/core/resources/watch6.png deleted file mode 100644 index f16493053e30db409ae29d90569760d8f043982c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2623 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 diff --git a/core/src/ProgressWidget.cpp b/core/src/ProgressWidget.cpp deleted file mode 100644 index c319e3fa5..000000000 --- a/core/src/ProgressWidget.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ProgressWidget.cpp - widget with animated progress indicator - * - * Copyright (c) 2006-2021 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include "ProgressWidget.h" - -#include -#include - -// clazy:excludeall=detaching-member - -ProgressWidget::ProgressWidget( const QString& text, const QString& animationPixmapBase, int frames, QWidget* parent ) : - QWidget( parent ), - m_text( text ), - m_frames( frames ), - m_curFrame( 0 ) -{ - m_pixmaps.reserve( m_frames ); - - for( int i = 0; i < m_frames; ++i ) - { - m_pixmaps.push_back( QPixmap( animationPixmapBase.arg( QString::number( i+1 ) ) ) ); - } - - QFont f = font(); - f.setPointSize( 12 ); - setFont( f ); - - setFixedSize( 30 + m_pixmaps[0].width() + fontMetrics().boundingRect( m_text ).width(), - m_pixmaps[0].height() * 5 / 4 ); - - auto t = new QTimer( this ); - connect( t, &QTimer::timeout, this, &ProgressWidget::nextFrame ); - t->start( 150 ); -} - - - -void ProgressWidget::nextFrame() -{ - m_curFrame = ( m_curFrame+1 ) % m_frames; - - update(); -} - - - -void ProgressWidget::paintEvent( QPaintEvent* event ) -{ - Q_UNUSED(event) - - QPainter p( this ); - p.setRenderHint( QPainter::Antialiasing ); - p.setPen( QColor( 0x55, 0x55, 0x55 ) ); - - p.setBrush( Qt::white ); - p.drawRect( 0, 0, width() - 1, height() - 1 ); - p.drawPixmap( 6, ( height() - m_pixmaps[m_curFrame].height() ) / 2 - 1, m_pixmaps[m_curFrame] ); - - p.drawText( 14 + m_pixmaps[m_curFrame].width(), 25, m_text ); -} diff --git a/core/src/ProgressWidget.h b/core/src/ProgressWidget.h deleted file mode 100644 index fd0636044..000000000 --- a/core/src/ProgressWidget.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ProgressWidget.h - widget with animated progress indicator - * - * Copyright (c) 2006-2021 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#pragma once - -#include -#include -#include - -class ProgressWidget : public QWidget -{ - Q_OBJECT -public: - ProgressWidget( const QString& text, const QString& animationPixmapBase, int frames, QWidget* parent = nullptr ); - ~ProgressWidget() override = default; - -protected: - void paintEvent( QPaintEvent* event ) override; - -private: - void nextFrame(); - - QString m_text; - int m_frames; - int m_curFrame; - - QVector m_pixmaps; - -} ; From 3e5e254b95858ec2baefc11a200fc5cfd9d89667 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 14:23:36 +0200 Subject: [PATCH 1070/1765] RemoteAccessWidget: refactor/clean up toolbar implementation Since VncViewWidget now draws a busy indicator, there's no need to implement visual feedback through the connection state label in the toolbar any longer. Also clean up logic for showing/hiding the toolbar. --- plugins/remoteaccess/RemoteAccessWidget.cpp | 79 +++++---------------- plugins/remoteaccess/RemoteAccessWidget.h | 7 +- 2 files changed, 19 insertions(+), 67 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 202d07dd4..1791e485e 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -47,8 +47,6 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent QWidget( parent ), m_parent( parent ), m_showHideTimeLine( ShowHideAnimationDuration, this ), - m_iconStateTimeLine( 0, this ), - m_connecting( false ), m_viewOnlyButton( showViewOnlyToggleButton ? new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/kmag.png") ), tr( "View only" ), tr( "Remote control" ) ) : nullptr ), m_sendShortcutButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/preferences-desktop-keyboard.png") ), tr( "Send shortcut" ) ) ), m_screenshotButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/camera-photo.png") ), tr( "Screenshot" ) ) ), @@ -62,7 +60,6 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent setAttribute( Qt::WA_NoSystemBackground, true ); move( 0, 0 ); show(); - startConnection(); if( m_viewOnlyButton ) { @@ -80,6 +77,7 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent connect( m_exitButton, &QAbstractButton::clicked, parent, &QWidget::close ); auto vncView = parent->vncView(); + connect( vncView->connection(), &VncConnection::stateChanged, this, &RemoteAccessWidgetToolBar::updateConnectionState ); auto shortcutMenu = new QMenu(); shortcutMenu->addAction( tr( "Ctrl+Alt+Del" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlAltDel ); } ); @@ -108,19 +106,10 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent layout->addWidget( m_fullScreenButton ); layout->addWidget( m_exitButton ); layout->addSpacing( 5 ); - connect( vncView, &VncViewWidget::startConnection, this, &RemoteAccessWidgetToolBar::startConnection ); - connect( vncView, &VncViewWidget::connectionEstablished, this, &RemoteAccessWidgetToolBar::connectionEstablished ); setFixedHeight( m_exitButton->height() ); connect( &m_showHideTimeLine, &QTimeLine::valueChanged, this, &RemoteAccessWidgetToolBar::updatePosition ); - - m_iconStateTimeLine.setFrameRange( 0, 100 ); - m_iconStateTimeLine.setDuration( 1500 ); - m_iconStateTimeLine.setUpdateInterval( 60 ); - m_iconStateTimeLine.easingCurve().setType( QEasingCurve::SineCurve ); - connect( &m_iconStateTimeLine, &QTimeLine::valueChanged, this, &RemoteAccessWidgetToolBar::updateConnectionAnimation ); - connect( &m_iconStateTimeLine, &QTimeLine::finished, &m_iconStateTimeLine, &QTimeLine::start ); } @@ -138,7 +127,7 @@ void RemoteAccessWidgetToolBar::appear() void RemoteAccessWidgetToolBar::disappear() { - if( !m_connecting && !rect().contains( mapFromGlobal( QCursor::pos() ) ) ) + if( rect().contains( mapFromGlobal( QCursor::pos() ) ) == false ) { QTimer::singleShot( DisappearDelay, this, [this]() { if( m_showHideTimeLine.state() != QTimeLine::Running ) @@ -170,43 +159,21 @@ void RemoteAccessWidgetToolBar::leaveEvent( QEvent *event ) void RemoteAccessWidgetToolBar::paintEvent( QPaintEvent *paintEv ) { QPainter p( this ); - QFont f = p.font(); - p.setOpacity( 0.8-0.8*m_showHideTimeLine.currentValue() ); + p.setOpacity( 0.8 ); p.fillRect( paintEv->rect(), palette().brush( QPalette::Window ) ); p.setOpacity( 1 ); - f.setPointSize( 12 ); + auto f = p.font(); + f.setPointSize( 10 ); f.setBold( true ); p.setFont( f ); - //p.setPen( Qt::white ); - //p.drawText( 64, 22, m_parent->windowTitle() ); - p.setPen( QColor( 192, 192, 192 ) ); - f.setPointSize( 10 ); - p.setFont( f ); - - if( m_connecting ) - { - QString dots; - for( int i = 0; i < ( m_iconStateTimeLine.currentTime() / 120 ) % 6; ++i ) - { - dots += QLatin1Char('.'); - } - p.drawText( 32, height() / 2 + fontMetrics().height(), tr( "Connecting %1" ).arg( dots ) ); - } - else - { - p.drawText( 32, height() / 2 + fontMetrics().height(), tr( "Connected." ) ); - } -} - - - -void RemoteAccessWidgetToolBar::updateConnectionAnimation() -{ - repaint(); + p.drawText( height() / 2, height() / 2 + fontMetrics().height() / 2, + m_parent->vncView() && m_parent->vncView()->connection() && + m_parent->vncView()->connection()->state() == VncConnection::State::Connected ? + tr( "Connected." ) : tr( "Connecting..." ) ); } @@ -223,30 +190,20 @@ void RemoteAccessWidgetToolBar::updatePosition() -void RemoteAccessWidgetToolBar::startConnection() -{ - m_connecting = true; - m_iconStateTimeLine.start(); - appear(); - update(); -} - - - - -void RemoteAccessWidgetToolBar::connectionEstablished() +void RemoteAccessWidgetToolBar::updateConnectionState() { - m_connecting = false; - m_iconStateTimeLine.stop(); - disappear(); - - // within the next 1000ms the username should be known and therefore we update - QTimer::singleShot( 1000, this, QOverload<>::of( &RemoteAccessWidgetToolBar::update ) ); + if( m_parent->vncView()->connection()->state() == VncConnection::State::Connected ) + { + disappear(); + } + else + { + appear(); + } } - RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& computerControlInterface, bool startViewOnly, bool showViewOnlyToggleButton ) : QWidget( nullptr ), diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index b7a805735..0f03ed43f 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -53,16 +53,11 @@ class RemoteAccessWidgetToolBar : public QWidget private: - void updateConnectionAnimation(); void updatePosition(); - void startConnection(); - void connectionEstablished(); + void updateConnectionState(); RemoteAccessWidget * m_parent; QTimeLine m_showHideTimeLine; - QTimeLine m_iconStateTimeLine; - - bool m_connecting; ToolButton* m_viewOnlyButton; ToolButton* m_sendShortcutButton; From 345ea219cfc731e1433ce2df37eedc25c4cb180e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 14:26:24 +0200 Subject: [PATCH 1071/1765] VncViewWidget: clean up unused signals --- core/src/VncViewWidget.cpp | 1 - core/src/VncViewWidget.h | 2 -- 2 files changed, 3 deletions(-) diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index f41cc7140..07d1fa05c 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -164,7 +164,6 @@ void VncViewWidget::updateImage( int x, int y, int w, int h ) resize( sizeHint() ); - Q_EMIT connectionEstablished(); m_initDone = true; } diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index cd3bcc975..37c2bf196 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -45,8 +45,6 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView Q_SIGNALS: void mouseAtBorder(); - void startConnection(); - void connectionEstablished(); void sizeHintChanged(); protected: From fe32d691ebe7bebac70e275ad6a770437456ef4d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 14:26:46 +0200 Subject: [PATCH 1072/1765] VncConnection: clean up unused signal --- core/src/VncConnection.cpp | 2 -- core/src/VncConnection.h | 1 - 2 files changed, 3 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 71d511722..2dde14cf6 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -424,8 +424,6 @@ void VncConnection::establishConnection() { m_framebufferUpdateWatchdog.restart(); - Q_EMIT connectionEstablished(); - VeyonCore::platform().networkFunctions(). configureSocketKeepalive( static_cast( m_client->sock ), true, m_socketKeepaliveIdleTime, m_socketKeepaliveInterval, m_socketKeepaliveCount ); diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index d9608a4a3..0b2a7a49c 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -148,7 +148,6 @@ class VEYON_CORE_EXPORT VncConnection : public QThread Q_SIGNALS: void connectionPrepared(); - void connectionEstablished(); void imageUpdated( int x, int y, int w, int h ); void framebufferUpdateComplete(); void framebufferSizeChanged( int w, int h ); From d3d64df9289710a4460941fa57d7655c8d9006f2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 14:31:01 +0200 Subject: [PATCH 1073/1765] VncViewWidget: refactor widget initialization Widget settings can be set in the constructor already while resizing happens through updateConnectionState(). --- core/src/VncViewWidget.cpp | 32 +++++++++----------------------- core/src/VncViewWidget.h | 2 -- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index 07d1fa05c..b17ff8f19 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -76,9 +76,14 @@ VncViewWidget::VncViewWidget( ComputerControlInterface::Pointer computerControlI resize( screenGeometry.size() - QSize( 10, 30 ) ); - setFocusPolicy( Qt::StrongFocus ); + setFocusPolicy( Qt::WheelFocus ); setFocus(); + setAttribute( Qt::WA_OpaquePaintEvent ); + installEventFilter( this ); + + setMouseTracking( true ); + updateConnectionState(); } @@ -145,34 +150,13 @@ void VncViewWidget::updateFramebufferSize( int w, int h ) { VncView::updateFramebufferSize( w, h ); - resize( w, h ); + resize( effectiveFramebufferSize() ); Q_EMIT sizeHintChanged(); } -void VncViewWidget::updateImage( int x, int y, int w, int h ) -{ - if( m_initDone == false ) - { - setAttribute( Qt::WA_OpaquePaintEvent ); - installEventFilter( this ); - - setMouseTracking( true ); // get mouse events even when there is no mousebutton pressed - setFocusPolicy( Qt::WheelFocus ); - - resize( sizeHint() ); - - m_initDone = true; - - } - - VncView::updateImage( x, y, w, h ); -} - - - bool VncViewWidget::event( QEvent* event ) { return VncView::handleEvent( event ) || QWidget::event( event ); @@ -358,5 +342,7 @@ void VncViewWidget::updateConnectionState() else { m_busyIndicatorTimer.stop(); + + resize( effectiveFramebufferSize() ); } } diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index 37c2bf196..d1009b5d7 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -53,7 +53,6 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView void setViewCursor( const QCursor& cursor ) override; void updateFramebufferSize( int w, int h ) override; - void updateImage( int x, int y, int w, int h ) override; bool event( QEvent* handleEvent ) override; bool eventFilter( QObject* obj, QEvent* handleEvent ) override; @@ -70,7 +69,6 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView VeyonConnection* m_veyonConnection{nullptr}; bool m_viewOnlyFocus{true}; - bool m_initDone{false}; static constexpr auto BusyIndicatorUpdateInterval = 25; QTimer m_busyIndicatorTimer{this}; From d175eee04f9d39025f20e93969025893cc2995d3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 14:41:54 +0200 Subject: [PATCH 1074/1765] ComputerZoomWidget: clean up + drop CCI pointer --- master/src/ComputerZoomWidget.cpp | 25 ++++++++++++------------- master/src/ComputerZoomWidget.h | 3 +-- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 0206a6258..84dcf7c9d 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.cpp - fullscreen preview widget * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * @@ -22,11 +22,8 @@ * */ -#include #include -#include -#include "ComputerControlInterface.h" #include "ComputerZoomWidget.h" #include "VeyonConfiguration.h" #include "VeyonMasterInterface.h" @@ -35,7 +32,7 @@ ComputerZoomWidget::ComputerZoomWidget( const ComputerControlInterface::Pointer& computerControlInterface ) : - QWidget( nullptr ), + QWidget(), m_vncView( new VncViewWidget( computerControlInterface, {}, this ) ) { const auto openOnMasterScreen = VeyonCore::config().showFeatureWindowsOnSameScreen(); @@ -49,7 +46,8 @@ ComputerZoomWidget::ComputerZoomWidget( const ComputerControlInterface::Pointer& } updateComputerZoomWidgetTitle(); - connect( m_computerControlInterface.data(), &ComputerControlInterface::userChanged, this, &ComputerZoomWidget::updateComputerZoomWidgetTitle ); + connect( m_vncView->computerControlInterface().data(), &ComputerControlInterface::userChanged, + this, &ComputerZoomWidget::updateComputerZoomWidgetTitle ); setWindowIcon( QPixmap( QStringLiteral(":/remoteaccess/kmag.png") ) ); setAttribute( Qt::WA_DeleteOnClose, true ); @@ -71,14 +69,15 @@ ComputerZoomWidget::~ComputerZoomWidget() void ComputerZoomWidget::updateComputerZoomWidgetTitle() { - if ( m_computerControlInterface->userFullName().isEmpty() ) + if ( m_vncView->computerControlInterface()->userFullName().isEmpty() ) { - setWindowTitle( tr( "%1 - %2 Computer Zoom Widget" ).arg( m_computerControlInterface->computer().name(), - VeyonCore::applicationName() ) ); - } else + setWindowTitle( QStringLiteral( "%1 - %2" ).arg( m_vncView->computerControlInterface()->computer().name(), + VeyonCore::applicationName() ) ); + } + else { - setWindowTitle( tr( "%1 - %2 - %3 Computer Zoom Widget" ).arg( m_computerControlInterface->userFullName(), - m_computerControlInterface->computer().name(), - VeyonCore::applicationName() ) ); + setWindowTitle( QStringLiteral( "%1 - %2 - %3" ).arg( m_vncView->computerControlInterface()->userFullName(), + m_vncView->computerControlInterface()->computer().name(), + VeyonCore::applicationName() ) ); } } diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index 7091a7115..324718113 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.h - fullscreen preview widget * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2021 Tobias Junghans * * This file is part of Veyon - https://veyon.io * @@ -40,7 +40,6 @@ class ComputerZoomWidget : public QWidget private: void updateComputerZoomWidgetTitle(); - ComputerControlInterface::Pointer m_computerControlInterface; VncViewWidget* m_vncView; } ; From f80d86371a5c171bd4ddeb527401d087ce649c2e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Sep 2021 14:43:41 +0200 Subject: [PATCH 1075/1765] Update translations --- translations/veyon.ts | 189 +++++--- translations/veyon_ar.ts | 193 +++++--- translations/veyon_bg.ts | 199 +++++--- translations/veyon_ca_ES.ts | 193 +++++--- translations/veyon_cs.ts | 201 +++++--- translations/veyon_de.ts | 209 +++++---- translations/veyon_el.ts | 191 +++++--- translations/veyon_es_ES.ts | 208 +++++---- translations/veyon_et.ts | 308 +++++++----- translations/veyon_fa.ts | 191 +++++--- translations/veyon_fr.ts | 207 ++++++--- translations/veyon_he.ts | 197 +++++--- translations/veyon_hu.ts | 203 +++++--- translations/veyon_id.ts | 197 +++++--- translations/veyon_it.ts | 207 ++++++--- translations/veyon_ja.ts | 899 +++++++++++++++++++----------------- translations/veyon_ko.ts | 199 +++++--- translations/veyon_lt.ts | 205 +++++--- translations/veyon_lv.ts | 193 +++++--- translations/veyon_mn.ts | 193 +++++--- translations/veyon_nl.ts | 195 +++++--- translations/veyon_no_NO.ts | 193 +++++--- translations/veyon_pl.ts | 205 +++++--- translations/veyon_pt_BR.ts | 197 +++++--- translations/veyon_pt_PT.ts | 189 +++++--- translations/veyon_ru.ts | 208 +++++---- translations/veyon_sl.ts | 205 +++++--- translations/veyon_sr.ts | 205 +++++--- translations/veyon_sv.ts | 193 +++++--- translations/veyon_th.ts | 195 +++++--- translations/veyon_tr.ts | 201 +++++--- translations/veyon_uk.ts | 207 ++++++--- translations/veyon_vi.ts | 189 +++++--- translations/veyon_zh_CN.ts | 249 ++++++---- translations/veyon_zh_TW.ts | 306 +++++++----- 35 files changed, 4885 insertions(+), 3034 deletions(-) diff --git a/translations/veyon.ts b/translations/veyon.ts index fd9c1f40b..633429f02 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -381,10 +381,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - - Introduction @@ -726,6 +722,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -748,10 +748,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General @@ -870,10 +866,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. @@ -890,6 +882,13 @@ The public key is used on client computers to authenticate incoming connection r + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -924,10 +923,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -941,11 +936,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1256,6 +1255,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1384,17 +1391,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1984,18 +1980,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2033,11 +2017,31 @@ The public key is used on client computers to authenticate incoming connection r - seconds + Write to logging system of operating system - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + + + + Host certificate file + + + + Host private key file @@ -2367,6 +2371,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2754,6 +2762,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3080,6 +3111,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3271,6 +3306,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3575,10 +3635,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - - Connected. @@ -3591,6 +3647,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3787,39 +3847,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server - Internal VNC server + Miscellaneous network settings - Feature manager + Session mode - Demo server + Local session mode (single server instance for primary local session) - Miscellaneous network settings + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3949,13 +4013,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4223,13 +4283,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - - - WindowsPlatformConfiguration diff --git a/translations/veyon_ar.ts b/translations/veyon_ar.ts index 55c6f12e4..4e55a09b8 100644 --- a/translations/veyon_ar.ts +++ b/translations/veyon_ar.ts @@ -379,10 +379,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - - Introduction @@ -724,6 +720,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -746,10 +746,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General عام @@ -868,10 +864,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - طرق التوثيق - Authentication is set up properly on this computer. @@ -888,6 +880,13 @@ The public key is used on client computers to authenticate incoming connection r إختبار + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -922,10 +921,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -939,11 +934,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1254,6 +1253,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1382,17 +1389,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1982,18 +1978,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output الدخول إلى خرج الاخطاء القياسية - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2031,11 +2015,31 @@ The public key is used on client computers to authenticate incoming connection r - seconds - ثواني + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2365,6 +2369,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2752,6 +2760,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3078,6 +3109,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3269,6 +3304,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + ثواني + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3573,10 +3633,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - توصيل 1%‏ - Connected. متصل @@ -3589,6 +3645,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3785,39 +3845,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + خادم العرض + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - خادم العرض + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3947,13 +4011,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4221,13 +4281,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - انشاء اتصال بـ 1% - - WindowsPlatformConfiguration diff --git a/translations/veyon_bg.ts b/translations/veyon_bg.ts index d40514577..87123e6af 100644 --- a/translations/veyon_bg.ts +++ b/translations/veyon_bg.ts @@ -381,10 +381,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - Authentication keys - Introduction Introduction @@ -729,6 +725,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General Общи настройки @@ -873,10 +869,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. Authentication is set up properly on this computer. @@ -893,6 +885,13 @@ The public key is used on client computers to authenticate incoming connection r Тест + + BuiltinDirectoryConfiguration + + Builtin directory + Builtin directory + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory Builtin directory - - Locations & computers - Locations & computers - Locations Locations @@ -943,14 +938,18 @@ The public key is used on client computers to authenticate incoming connection r Remove selected location Remove selected location - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - New location New location + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output Log to standard error output - - Network object directory - Network object directory - - - Backend: - Backend: - - - Update interval: - Update interval: - %1 service %1 service @@ -2035,14 +2019,34 @@ The public key is used on client computers to authenticate incoming connection r x x - - seconds - seconds - Write to logging system of operating system Write to logging system of operating system + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2389,6 +2393,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2776,6 +2784,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3102,6 +3133,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + Locations & computers + MasterConfigurationPage @@ -3293,6 +3328,31 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Update interval: + + + seconds + seconds + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3599,10 +3659,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Connecting %1 - Connected. Connected. @@ -3615,6 +3671,10 @@ Please save your work and close all programs. Exit Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3812,39 +3872,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Demo server + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Demo server + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3974,13 +4038,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4248,13 +4308,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon Service - - VncViewWidget - - Establishing connection to %1 ... - Establishing connection to %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_ca_ES.ts b/translations/veyon_ca_ES.ts index 1d9744cd1..1371fe57e 100644 --- a/translations/veyon_ca_ES.ts +++ b/translations/veyon_ca_ES.ts @@ -379,10 +379,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - - Introduction @@ -724,6 +720,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -746,10 +746,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General General @@ -868,10 +864,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - Métodes d'autentificació - Authentication is set up properly on this computer. @@ -888,6 +880,13 @@ The public key is used on client computers to authenticate incoming connection r Comprova + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -922,10 +921,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -939,11 +934,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1254,6 +1253,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1382,17 +1389,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1982,18 +1978,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output Registra en la sortida d'error estàndard - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2031,11 +2015,31 @@ The public key is used on client computers to authenticate incoming connection r - seconds - segons + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2365,6 +2369,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2752,6 +2760,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3078,6 +3109,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3269,6 +3304,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + segons + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3573,10 +3633,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - S'està connectant a %1 - Connected. Connectat. @@ -3589,6 +3645,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3785,39 +3845,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Servidor demo + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Servidor demo + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3947,13 +4011,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4221,13 +4281,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - S'està establint connexió amb %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_cs.ts b/translations/veyon_cs.ts index a491cb2d8..ff330f810 100644 --- a/translations/veyon_cs.ts +++ b/translations/veyon_cs.ts @@ -381,10 +381,6 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně AuthKeysConfigurationWidget - - Authentication keys - Ověřovací klíče - Introduction Úvod @@ -729,6 +725,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří AuthLdapConfigurationWidget - - LDAP authentication - - General Obecné @@ -873,10 +869,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří AuthenticationPage - - Authentication methods - Metody ověřování - Authentication is set up properly on this computer. Ověřování je na tomto počítači nastaveno správně @@ -893,6 +885,13 @@ Veřejná část je použita na klientských počítačích pro ověření pří Vyzkoušet funkčnost + + BuiltinDirectoryConfiguration + + Builtin directory + Vestavěný adresář + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Builtin directory Vestavěný adresář - - Locations & computers - Umístění a počítače - Locations Umístění @@ -943,14 +938,18 @@ Veřejná část je použita na klientských počítačích pro ověření pří Remove selected location Odebrat označené umístění - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - Import CSV souborů je možný prostřednictvím rozhraní pro příkazový řádek. Další informace jsou k dispozici v <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">dokumentaci na webu</a>. - New location Nové umístění + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ Veřejná část je použita na klientských počítačích pro ověření pří Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Nedaří se zapsat seznam počítačů a uživatelů do %1! Zkontrolujte přístupová práva souboru. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Log to standard error output Zaznamenávat na standardní chybový výstup - - Network object directory - Adresář síťových objektů - - - Backend: - Podpůrná vrstva (backend): - - - Update interval: - Interval aktualizace: - %1 service služba %1 @@ -2035,14 +2019,34 @@ Veřejná část je použita na klientských počítačích pro ověření pří x x - - seconds - sekund - Write to logging system of operating system Zapisovat do systému záznamu událostí operačního systému + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2385,6 +2389,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří %1 %2 have been queried successfully using the configured filter. S nastaveným filtrem úspěšně dotázáno na %1 %2. + + LDAP directory + + LdapConfigurationPage @@ -2772,6 +2780,29 @@ Veřejná část je použita na klientských počítačích pro ověření pří Configured attribute for user login name or computer hostname (OpenLDAP) Nastavený atribut pro uživatelské jméno nebo název počítače (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3096,7 +3127,11 @@ Veřejná část je použita na klientských počítačích pro ověření pří Veyon Master - + Veyon – hlavní + + + Locations & computers + Umístění a počítače @@ -3289,6 +3324,31 @@ Veřejná část je použita na klientských počítačích pro ověření pří Tento režim umožňuje monitorovat veškeré počítače v jednom a více umístěních. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Interval aktualizace: + + + seconds + sekund + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3595,10 +3655,6 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Připojování k %1… - Connected. Připojeno. @@ -3611,6 +3667,10 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Exit Ukončit + + Connecting... + + ScreenLockFeaturePlugin @@ -3808,39 +3868,43 @@ Typicky je toto třeba na terminálových serverech. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Ukázkový server + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Ukázkový server + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3970,13 +4034,9 @@ Typicky je toto třeba na terminálových serverech. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4244,13 +4304,6 @@ The second button will remove the selected computer. If nothing is selected the Služba Veyon - - VncViewWidget - - Establishing connection to %1 ... - Připojování k %1… - - WindowsPlatformConfiguration diff --git a/translations/veyon_de.ts b/translations/veyon_de.ts index f83c54829..7e54eb305 100644 --- a/translations/veyon_de.ts +++ b/translations/veyon_de.ts @@ -379,10 +379,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - Authentifizierungsschlüssel - Introduction Einführung @@ -726,6 +722,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Key file Schlüsseldatei + + Please specify the key name (e.g. "teacher/public") as the first argument. + Bitte geben Sie den Schlüsselname (z.B. "teacher/public") als erstes Argument an. + AuthKeysTableModel @@ -748,10 +748,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e AuthLdapConfigurationWidget - - LDAP authentication - LDAP-Authentifizierung - General Allgemein @@ -870,10 +866,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e AuthenticationPage - - Authentication methods - Authentifizierungsmethoden - Authentication is set up properly on this computer. Authentifizierung ist auf diesem Computer ordnungsgemäß eingerichtet. @@ -890,6 +882,13 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Testen + + BuiltinDirectoryConfiguration + + Builtin directory + Integriertes Verzeichnis + + BuiltinDirectoryConfigurationPage @@ -924,10 +923,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Builtin directory Integriertes Verzeichnis - - Locations & computers - Standorte & Computer - Locations Standorte @@ -940,14 +935,18 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Remove selected location Gewählten Standort entfernen - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - Der Import von CSV-Dateien ist über die Kommandozeilenschnittstelle möglich. Weitere Informationen finden Sie in der <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">Online-Dokumentation</a>. - New location Neuer Standort + + Directory name + Verzeichnisname + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + Der Import von CSV-Dateien ist über die Kommandozeilenschnittstelle möglich. Weitere Informationen finden Sie in der <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">Online-Dokumentation</a>. + BuiltinDirectoryPlugin @@ -1256,6 +1255,14 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Veyon Server unreachable or not running Veyon-Server nicht erreichbar oder läuft nicht + + Name: %1 + Name: %1 + + + invalid + ungültig + ComputerControlServer @@ -1384,17 +1391,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Die Computer- und Benutzerliste konnte nicht in die Datei %1 geschrieben werden. Bitte überprüfen Sie die Dateizugriffsrechte. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - %1 - %2 Computer-Zoom-Ansicht - - - %1 - %2 - %3 Computer Zoom Widget - %1 - %2 - %3 Computer-Zoom-Ansicht - - ConfigCommands @@ -1984,18 +1980,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Log to standard error output Nach Standardfehlerausgabe loggen - - Network object directory - Netzwerkobjektverzeichnis - - - Backend: - Backend: - - - Update interval: - Aktualisierungsintervall: - %1 service %1-Dienst @@ -2032,14 +2016,34 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e x x - - seconds - Sekunden - Write to logging system of operating system In Ereignisprotokollierung des Betriebssystems schreiben + + TLS configuration + TLS-Konfiguration + + + Use certificate authority for TLS connections + Zertifikatsautorität für TLS-Verbindungen verwenden + + + CA certificate file + CA-Zertifikatsdatei + + + ... + ... + + + Host certificate file + Host-Zertifikatsdatei + + + Host private key file + Private Host-Schlüsseldatei + HeadlessVncServer @@ -2386,6 +2390,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e %1 %2 have been queried successfully using the configured filter. %1 %2 wurden mit dem konfigurierten Filter erfolgreich abgefragt. + + LDAP directory + LDAP-Verzeichnis + LdapConfigurationPage @@ -2773,6 +2781,29 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Configured attribute for user login name or computer hostname (OpenLDAP) Konfiguriertes Attribut für Benutzeranmeldename oder Computerhostname (OpenLDAP) + + Directory name + Verzeichnisname + + + Query options + Abfrageoptionen + + + Query nested user groups (supported by AD only) + Verschachtelte Benutzergruppen abfragen (nur von AD unterstützt) + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + Bitte verwenden Sie die globale LDAP-Konfigurationsseite, um festzulegen, wie Standorte und Computer von Ihrem LDAP-basierten Verzeichnisdienst abgefragt werden sollen. + LdapPlugin @@ -3097,7 +3128,11 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Veyon Master - + Veyon Master + + + Locations & computers + Standorte & Computer @@ -3290,6 +3325,31 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Dieser Modus erlaubt es Ihnen, alle Computer an einem oder mehreren Standorten zu beobachten. + + NestedNetworkObjectDirectory + + All directories + Alle Verzeichnisse + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Aktualisierungsintervall: + + + seconds + Sekunden + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Aktiviert + + NetworkObjectTreeModel @@ -3596,13 +3656,9 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Alt+Ctrl+F1 Alt+Strg+F1 - - Connecting %1 - Verbindung wird hergestellt %1 - Connected. - Verbindung hergestellt. + Verbunden. Screenshot @@ -3612,6 +3668,10 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Exit Beenden + + Connecting... + Verbinde... + ScreenLockFeaturePlugin @@ -3808,18 +3868,6 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Maximum session count Maximale Sitzungsanzahl - - Sessions - Sitzungen - - - Single session mode (create server instance for local/physical session only) - Einzelsitzungsmodus (Serverinstanz nur für lokale/physische Sitzung erstellen) - - - Multi session mode (create server instance for each local and remote desktop session) - Mehrfachsitzungsmodus (Serverinstanz für jede lokale und Remote-Desktop-Sitzung erstellen) - Network port numbers Netzwerk-Portnummern @@ -3844,6 +3892,22 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Miscellaneous network settings Diverse Netzwerkeinstellungen + + Session mode + Sitzungsmodus + + + Local session mode (single server instance for primary local session) + Lokaler Sitzungsmodus (einzelne Serverinstanz für primäre lokale Sitzung) + + + Active session mode (single server instance for active local or remote session) + Aktiver Sitzungsmodus (einzelne Serverinstanz für aktive lokale oder entfernte Sitzung) + + + Multi session mode (distinct server instance for each local and remote desktop session) + Mehrsitzungsmodus (eigene Serverinstanz für jede lokale und entfernte Desktop-Sitzung) + ServiceControl @@ -3971,15 +4035,11 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Please select at least one computer to add. Bitte wählen Sie mindestens einen hinzuzufügenden Computer aus. - - Please select at least one computer to remove. - Bitte wählen Sie mindestens einen zu entfernenden Computer aus. - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. Computer durch Klick mit der mittleren Maustaste oder mit Hilfe des ersten Buttons hinzufügen. -Der zweite Button entfernt den gewählten Computer. Wenn nichts ausgewählt ist, wird der letzte Computer entfernt. +Der zweite Button entfernt den gewählten oder letzten Computer. @@ -4246,13 +4306,6 @@ Der zweite Button entfernt den gewählten Computer. Wenn nichts ausgewählt ist, Veyon-Dienst - - VncViewWidget - - Establishing connection to %1 ... - Verbindung zu %1 wird hergestellt ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_el.ts b/translations/veyon_el.ts index 4bd2ecdf5..df08ae472 100644 --- a/translations/veyon_el.ts +++ b/translations/veyon_el.ts @@ -381,10 +381,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - - Introduction Εισαγωγή @@ -726,6 +722,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -748,10 +748,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General Γενικά @@ -870,10 +866,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. @@ -890,6 +882,13 @@ The public key is used on client computers to authenticate incoming connection r Δοκιμή + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -924,10 +923,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -941,11 +936,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1256,6 +1255,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1384,17 +1391,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1984,18 +1980,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - - Network object directory - - - - Backend: - - - - Update interval: - Ρυθμός ανανέωσης: - %1 service υπηρεσία %1 @@ -2033,11 +2017,31 @@ The public key is used on client computers to authenticate incoming connection r x - seconds - δευτερόλεπτα + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2367,6 +2371,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2754,6 +2762,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3080,6 +3111,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3271,6 +3306,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Ρυθμός ανανέωσης: + + + seconds + δευτερόλεπτα + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3575,10 +3635,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Σύνδεση σε %1 - Connected. Συνδεδεμένος @@ -3591,6 +3647,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3787,39 +3847,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server - Internal VNC server + Miscellaneous network settings - Feature manager + Session mode - Demo server + Local session mode (single server instance for primary local session) - Miscellaneous network settings + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3949,13 +4013,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4223,13 +4283,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - - - WindowsPlatformConfiguration diff --git a/translations/veyon_es_ES.ts b/translations/veyon_es_ES.ts index c9d083693..62f4886d2 100644 --- a/translations/veyon_es_ES.ts +++ b/translations/veyon_es_ES.ts @@ -383,10 +383,6 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla AuthKeysConfigurationWidget - - Authentication keys - Claves de autenticación - Introduction Introducción @@ -731,6 +727,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Key file Archivo de clave + + Please specify the key name (e.g. "teacher/public") as the first argument. + Especifique el nombre de la clave (p. ej., "teacher/public") como primer argumento. + AuthKeysTableModel @@ -753,10 +753,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu AuthLdapConfigurationWidget - - LDAP authentication - Autenticación LDAP - General General @@ -875,10 +871,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu AuthenticationPage - - Authentication methods - Métodos de autenticación - Authentication is set up properly on this computer. La autenticación está configurada correctamente en esta computadora. @@ -895,6 +887,13 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Comprobar + + BuiltinDirectoryConfiguration + + Builtin directory + Directorio incorporado + + BuiltinDirectoryConfigurationPage @@ -929,10 +928,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Builtin directory Directorio incorporado - - Locations & computers - Ubicaciones y equipos - Locations Ubicaciones @@ -945,14 +940,18 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Remove selected location Eliminar ubicación seleccionada - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - La importación de archivos CSV es posible a través de la interfaz de línea de comandos. Para más información, consulte la <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">documentación en línea</a>. - New location Nueva ubicación + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1261,6 +1260,14 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Veyon Server unreachable or not running Veyon Server es inaccesible o no se está ejecutando + + Name: %1 + + + + invalid + invalido + ComputerControlServer @@ -1389,17 +1396,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu No se pudo escribir la lista de equipos y usuarios en %1. Por favor, compruebe los permisos de acceso al archivo. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - %1 - %2 Widget de Zoom de Computadora - - - %1 - %2 - %3 Computer Zoom Widget - %1 - %2 - %3 Widget de Zoom de Computadora - - ConfigCommands @@ -1989,18 +1985,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Log to standard error output Registro a salida de errores estándar - - Network object directory - Directorio de objetos de red - - - Backend: - Backend: - - - Update interval: - Intervalo de actualización: - %1 service servicio %1 @@ -2037,14 +2021,34 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu x x - - seconds - segundos - Write to logging system of operating system Escribir en el sistema de registro del sistema operativo + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2391,6 +2395,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu %1 %2 have been queried successfully using the configured filter. %1 %2 se han consultado correctamente con el filtro configurado. + + LDAP directory + + LdapConfigurationPage @@ -2778,6 +2786,29 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Configured attribute for user login name or computer hostname (OpenLDAP) Atributo configurado para el nombre de inicio de sesión del usuario o el nombre de host de la computadora (OpenLDAP) + + Directory name + + + + Query options + Opciones de consulta + + + Query nested user groups (supported by AD only) + Consultar grupos de usuarios anidados (compatible solo con AD) + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3102,7 +3133,11 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Veyon Master - + Veyon Master + + + Locations & computers + Ubicaciones y equipos @@ -3295,6 +3330,31 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Este modo le permite monitorear todos los equipos en una o más ubicaciones. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Intervalo de actualización: + + + seconds + segundos + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Habilitado + + NetworkObjectTreeModel @@ -3601,10 +3661,6 @@ Por favor guarde su trabajo y cierre todos los programas. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Conectando %1 - Connected. Conectado. @@ -3617,6 +3673,10 @@ Por favor guarde su trabajo y cierre todos los programas. Exit Salir + + Connecting... + + ScreenLockFeaturePlugin @@ -3813,18 +3873,6 @@ Por lo general, esto es necesario para admitir servidores de terminales.Maximum session count Número máximo de sesiones - - Sessions - Sesiones - - - Single session mode (create server instance for local/physical session only) - Modo de sesión única (crear una instancia de servidor para sesión local/física únicamente) - - - Multi session mode (create server instance for each local and remote desktop session) - Modo de sesión múltiple (crear una instancia de servidor para cada sesión de escritorio local y remota) - Network port numbers Números de puerto de red @@ -3849,6 +3897,22 @@ Por lo general, esto es necesario para admitir servidores de terminales.Miscellaneous network settings Configuraciones de red diversas + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3976,15 +4040,10 @@ Por lo general, esto es necesario para admitir servidores de terminales.Please select at least one computer to add. Seleccione al menos una computadora para añadir. - - Please select at least one computer to remove. - Seleccione al menos una computadora para eliminar. - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. - Añada computadoras haciendo clic con el botón central del ratón o haciendo clic en el primer botón a continuación. -El segundo botón eliminará la computadora seleccionada. Si no se selecciona nada, se eliminará el último. +The second button removes the selected or last computer. + @@ -4251,13 +4310,6 @@ El segundo botón eliminará la computadora seleccionada. Si no se selecciona na Veyon Service - - VncViewWidget - - Establishing connection to %1 ... - Estableciendo conexión con %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_et.ts b/translations/veyon_et.ts index ae48ce40f..763c50483 100644 --- a/translations/veyon_et.ts +++ b/translations/veyon_et.ts @@ -217,35 +217,35 @@ If you're interested in translating Veyon into your local or another langua Accessing computer and local computer - + Juurdepääs arvutile ja kohalikule arvutile User being accessed - + Juurdepääs kasutajale is logged in locally - + on sisse logitud kohapeal is logged in remotely - + on sisse logitud kaugjuhtimisega No user is logged in locally - + Ükski kasutaja pole kohapeal sisse logitud One or multiple users are logged in locally - + Üks või mitu kasutajat on kohalikult sisse logitud No user is logged in remotely - + Ükski kasutaja pole kaugjuhtimisega sisse logitud One or multiple users are logged in remotely - + Üks või mitu kasutajat on sisse logitud eemalt is located at @@ -253,15 +253,15 @@ If you're interested in translating Veyon into your local or another langua is not located at - + ei asu aadressil are located at the same location - + asuvad samal aadressil are not located the same location - + ei asu samal aadressil is member of group @@ -269,59 +269,59 @@ If you're interested in translating Veyon into your local or another langua is not member of group - + ei ole grupi liige is authenticated via - + on autentitud is not authenticated via - + pole autentitud has one or more groups in common with user being accessed - + on juurdepääsetava kasutajaga üks või mitu ühist rühma has no groups in common with user being accessed - + ei oma kasutajaga ühiseid rühmi equals user being accessed - + võrdub juurdepääsuga kasutajale is different from user being accessed - + erineb juurdepääsetavast kasutajast is already connected - + on juba ühendatud is not connected - + ei ole ühendatud is local computer - + on kohalik arvuti is not local computer - + ei ole kohalik arvuti Computer being accessed - + Juurdepääs arvutile Session being accessed is a user session - + Seanss, millele pääseb juurde, on kasutaja seanss Session being accessed is a login screen - + Seanss, millele pääseb juurde, on sisselogimisekraan @@ -381,10 +381,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - Autentimisvõtmed - Introduction Juhend @@ -729,6 +725,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Key file Võtmefail + + Please specify the key name (e.g. "teacher/public") as the first argument. + Palun määrake esimese argumendina võtme nimi (näiteks „õpetaja/avalik”). + AuthKeysTableModel @@ -751,10 +751,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten AuthLdapConfigurationWidget - - LDAP authentication - LDAP autentimine - General Üldine @@ -873,10 +869,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten AuthenticationPage - - Authentication methods - Autentimise meetodid - Authentication is set up properly on this computer. Autentimine on selles arvutis õigesti seadistatud. @@ -893,6 +885,13 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Test + + BuiltinDirectoryConfiguration + + Builtin directory + Sisseehitatud kataloog + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Builtin directory Sisseehitatud kataloog - - Locations & computers - Asukohad & arvutid - Locations Asukohad @@ -943,14 +938,18 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Remove selected location Eemalda valitud asukohad - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - CSV-failide importimine on võimalik käsurea liidese kaudu. Lisateavet leiate <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">veebidokumentatsioonist</a>. - New location Uus asukoht + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Veyon Server unreachable or not running Veyon Server pole kättesaadav või ei tööta + + Name: %1 + + + + invalid + kehtetu + ComputerControlServer @@ -1387,17 +1394,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Arvutit ja kasutajate loendi %1 kirjutamine nurjus! Kontrollige failidele juurdepääsu õigusi. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - %1 - %2 Arvuti suumi vidin - - - %1 - %2 - %3 Computer Zoom Widget - %1 - %2 - %3 Arvuti suumi vidin - - ConfigCommands @@ -1672,27 +1668,27 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Applications & websites - + Rakendused ja veebisaidid Predefined applications - + Eelmääratud rakendused Add new application - + Lisa uus rakendus Remove selected application - + Eemalda valitud rakendus Add new website - + Lisage uus veebisait New application - + Uus rakendus @@ -1715,23 +1711,23 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Start application - + Käivita rakendus Click this button to start an application on all computers. - + Rakenduse käivitamiseks kõikides arvutites klõpsake seda nuppu. Start application "%1" - + Käivitage rakendus "%1" Custom application - + Kohandatud rakendus Start apps and open websites in user sessions - + Käivitage rakendusi ja avage veebisaite kasutajaseanssidel @@ -1778,7 +1774,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Custom application - + Kohandatud rakendus @@ -1987,18 +1983,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Log to standard error output Logige standardvea väljundisse - - Network object directory - Võrguobjektide kataloog - - - Backend: - Taustaprogramm: - - - Update interval: - Värskenduse sagedus: - %1 service %1 teenus @@ -2035,14 +2019,34 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten x x - - seconds - sekundit - Write to logging system of operating system Kirjutage operatsioonisüsteemi logimissüsteemi + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2389,6 +2393,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten %1 %2 have been queried successfully using the configured filter. %1 %2 on konfigureeritud filtri abil edukalt päritud. + + LDAP directory + + LdapConfigurationPage @@ -2776,6 +2784,29 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Configured attribute for user login name or computer hostname (OpenLDAP) Konfigureeritud atribuut kasutaja sisselogimisnimele või arvuti hostinimele (OpenLDAP) + + Directory name + + + + Query options + Päringu valikud + + + Query nested user groups (supported by AD only) + Pesastatud kasutajarühmade päring (toetab ainult AD) + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -2852,11 +2883,11 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten User sessions - + Kasutaja seansid Minimum session lifetime before server start - + Minimaalne seansi eluiga enne serveri käivitamist User login @@ -2864,7 +2895,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Login key sequence - + Sisselogimisvõtmete järjestus @@ -3100,7 +3131,11 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Veyon Master - + Veyon Master + + + Locations & computers + Asukohad&arvutid @@ -3293,6 +3328,31 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten See režiim võimaldab teil jälgida kõiki arvuteid ühes või mitmes kohas. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Värskenduse sagedus: + + + seconds + sekundit + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Lubatud + + NetworkObjectTreeModel @@ -3328,7 +3388,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Website name - + Veebisaidi nimi @@ -3462,15 +3522,15 @@ Salvestage oma töö ja sulgege kõik programmid. Do you really want to reboot <b>ALL</b> computers? - + Kas soovite tõesti taaskäivitada <b>KÕIK</b> arvutid? Do you really want to power down <b>ALL</b> computers? - + Kas soovite tõesti välja lülitada <b>KÕIK</b> arvutid? Do you really want to power down the selected computers? - + Kas soovite tõesti välja lülitada valitud arvutid? @@ -3599,10 +3659,6 @@ Salvestage oma töö ja sulgege kõik programmid. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Ühendamine %1 - Connected. Ühendatud @@ -3615,6 +3671,10 @@ Salvestage oma töö ja sulgege kõik programmid. Exit Välju + + Connecting... + + ScreenLockFeaturePlugin @@ -3811,18 +3871,6 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Maximum session count Maksimaalne seansside arv - - Sessions - Sessioonid - - - Single session mode (create server instance for local/physical session only) - Ühe seansi režiim (loo serveri eksemplar ainult kohaliku/füüsilise seansi jaoks) - - - Multi session mode (create server instance for each local and remote desktop session) - Mitme seansi režiim (looge iga kohaliku ja kaugtöölaua seansi jaoks serveri eksemplar) - Network port numbers Võrgu pordi numbrid @@ -3847,6 +3895,22 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Miscellaneous network settings Mitmesugused võrguseaded + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3974,26 +4038,21 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Please select at least one computer to add. Valige lisamiseks vähemalt üks arvuti. - - Please select at least one computer to remove. - Valige eemaldamiseks vähemalt üks arvuti. - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. - Arvutite lisamiseks klõpsake hiire keskmise nupuga või klõpsake allolevat esimest nuppu. -Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viimane. +The second button removes the selected or last computer. + StartAppDialog Start application - + Käivita rakendus Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + Palun sisestage valitud arvutites käivitamiseks vajalikud rakendused. Saate eraldada mitu rakendust eri ridades. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" @@ -4001,11 +4060,11 @@ Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viiman Remember and add to application menu - + Pidage meeles ja lisage rakendus menüüsse Application name - + Rakenduse nimetus Name: @@ -4053,7 +4112,7 @@ Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viiman Please enter your message which send to all selected users. - + Sisestage oma sõnum, mis saadetakse kõigile valitud kasutajatele. @@ -4168,7 +4227,7 @@ Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viiman Do you really want to log off <b>ALL</b> users? - + Kas soovite tõesti välja logida <b>KÕIK</b> kasutajad? @@ -4249,13 +4308,6 @@ Teine nupp eemaldab valitud arvuti. Kui midagi pole valitud, eemaldatakse viiman Veyoni teenus - - VncViewWidget - - Establishing connection to %1 ... - Ühenduse loomine kasutajaga %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_fa.ts b/translations/veyon_fa.ts index 700102ba6..25254a7df 100644 --- a/translations/veyon_fa.ts +++ b/translations/veyon_fa.ts @@ -380,10 +380,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - کلیدهای احراز هویت - Introduction معرفی @@ -725,6 +721,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -747,10 +747,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General عمومی @@ -869,10 +865,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - روش های احراز هویت - Authentication is set up properly on this computer. @@ -889,6 +881,13 @@ The public key is used on client computers to authenticate incoming connection r تست + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -923,10 +922,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -940,11 +935,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1255,6 +1254,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1383,17 +1390,6 @@ The public key is used on client computers to authenticate incoming connection r لیست کامپیوتر و کاربران را به٪ 1 نمی توان نوشت! لطفا مجوز دسترسی به فایل را بررسی کنید. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1983,18 +1979,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output ثبت گزارش به خروجی استاندارد خطا - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2032,11 +2016,31 @@ The public key is used on client computers to authenticate incoming connection r - seconds + Write to logging system of operating system - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2366,6 +2370,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2753,6 +2761,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3079,6 +3110,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3270,6 +3305,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3574,10 +3634,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - اتصال٪ 1 - Connected. متصل شد. @@ -3590,6 +3646,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3786,39 +3846,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + نمایش سرور + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - نمایش سرور + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3948,13 +4012,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4222,13 +4282,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - ایجاد اتصال به٪ 1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_fr.ts b/translations/veyon_fr.ts index 829365650..fc85236e7 100644 --- a/translations/veyon_fr.ts +++ b/translations/veyon_fr.ts @@ -381,10 +381,6 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, AuthKeysConfigurationWidget - - Authentication keys - Clés d'authentification - Introduction Introduction @@ -729,6 +725,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Key file Fichier clé + + Please specify the key name (e.g. "teacher/public") as the first argument. + Veuillez spécifier le nom de la clé (par exemple "enseignant/public") comme premier argument. + AuthKeysTableModel @@ -751,10 +751,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif AuthLdapConfigurationWidget - - LDAP authentication - Authentification LDAP - General Général @@ -873,10 +869,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif AuthenticationPage - - Authentication methods - Méthodes d'authentification - Authentication is set up properly on this computer. L'authentification est correctement configurée sur cet ordinateur. @@ -893,6 +885,13 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Test + + BuiltinDirectoryConfiguration + + Builtin directory + Répertoire intégré + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Builtin directory Répertoire intégré - - Locations & computers - Emplacements & ordinateurs - Locations Emplacements @@ -943,14 +938,18 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Remove selected location Retirer l'emplacement sélectionné - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - L'import de fichiers CSV est possible à travers l'interface en ligne de commande. Pour plus d'informations, voir la <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">documentation en ligne</a>. - New location Nouvel emplacement + + Directory name + Nom du répertoire + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + L'importation de fichiers CSV est possible via l'interface de ligne de commande. Pour plus d'informations, consultez la <a href="https://docs.veyon.io/fr/latest/admin/cli.html#network-object-directory">documentation en ligne</a>. + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Veyon Server unreachable or not running Serveur Veyon inaccessible ou ne fonctionne pas + + Name: %1 + Nom: %1 + + + invalid + invalide + ComputerControlServer @@ -1387,17 +1394,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Impossible d'écrire la liste des ordinateurs et des utilisateurs dans %1! Vérifiez le fichier des permissions d'accès. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - %1 - %2 Widget Zoom de l'ordinateur - - - %1 - %2 - %3 Computer Zoom Widget - %1 - %2 - %3 Widget Zoom de l'ordinateur - - ConfigCommands @@ -1987,18 +1983,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Log to standard error output Journaliser via la sortie standard - - Network object directory - Répertoire objets réseau - - - Backend: - Méthode de fonctionnement: - - - Update interval: - Intervalle de rafraichissement: - %1 service Service %1 @@ -2035,14 +2019,34 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif x x - - seconds - secondes - Write to logging system of operating system Écrire dans le système de journalisation du système d'exploitation + + TLS configuration + Configuration TLS + + + Use certificate authority for TLS connections + Utiliser l'autorité de certification pour les connexions TLS + + + CA certificate file + Fichiers de certificat CA + + + ... + ... + + + Host certificate file + Fichier de certificat d'hôte + + + Host private key file + Fichier de clé privée de l'hôte + HeadlessVncServer @@ -2389,6 +2393,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif %1 %2 have been queried successfully using the configured filter. %2 %1 a été interrogé avec succès en appliquant le filtre. + + LDAP directory + Annuaire LDAP + LdapConfigurationPage @@ -2776,6 +2784,29 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Configured attribute for user login name or computer hostname (OpenLDAP) Attribut configuré pour l'identifiant utilisateur ou le nom d'hôte de l'ordinateur (OpenLDAP) + + Directory name + Nom du répertoire + + + Query options + Options de requête + + + Query nested user groups (supported by AD only) + Interroger des groupes d'utilisateurs imbriqués (pris en charge par AD uniquement) + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + Veuillez utiliser la page de configuration LDAP globale pour configurer comment récupérer les emplacements et les ordinateurs de votre service d'annuaire LDAP. + LdapPlugin @@ -3100,7 +3131,11 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Veyon Master - + Veyon Maître + + + Locations & computers + Emplacements & ordinateurs @@ -3293,6 +3328,31 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Ce mode vous permet de surveiller tous les ordinateurs d'un ou de plusieurs emplacements. + + NestedNetworkObjectDirectory + + All directories + Tous les répertoires + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Intervalle de rafraichissement: + + + seconds + secondes + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Activé + + NetworkObjectTreeModel @@ -3599,10 +3659,6 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Connexion à %1... - Connected. Connecté. @@ -3615,6 +3671,10 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Exit Quitter + + Connecting... + + ScreenLockFeaturePlugin @@ -3811,18 +3871,6 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Maximum session count Nombre maximum de sessions - - Sessions - Sessions - - - Single session mode (create server instance for local/physical session only) - Mode de session unique (créer une instance de serveur pour une session locale / physique uniquement) - - - Multi session mode (create server instance for each local and remote desktop session) - Mode multi-session (créer une instance de serveur pour chaque session de bureau local et distant) - Network port numbers Numéros de port réseau @@ -3847,6 +3895,22 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Miscellaneous network settings Divers paramètres réseau + + Session mode + Mode Session + + + Local session mode (single server instance for primary local session) + Mode session locale (instance de serveur unique pour la session locale principale) + + + Active session mode (single server instance for active local or remote session) + Mode session active (instance de serveur unique pour une session locale ou distante active) + + + Multi session mode (distinct server instance for each local and remote desktop session) + Mode multi-session (instance de serveur distincte pour chaque session de bureau local et distant) + ServiceControl @@ -3974,15 +4038,11 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Please select at least one computer to add. Veuillez sélectionner au moins un ordinateur à ajouter. - - Please select at least one computer to remove. - Veuillez sélectionner au moins un ordinateur à supprimer. - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. Ajoutez des ordinateurs en cliquant avec le bouton central de la souris ou en cliquant sur le premier bouton ci-dessous. -Le deuxième bouton supprimera l'ordinateur sélectionné. Si rien n'est sélectionné, le dernier sera supprimé. +Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordinateur. @@ -4249,13 +4309,6 @@ Le deuxième bouton supprimera l'ordinateur sélectionné. Si rien n'e Service Veyon - - VncViewWidget - - Establishing connection to %1 ... - Établissement de la connexion à %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_he.ts b/translations/veyon_he.ts index 7d4778cbe..466440e87 100644 --- a/translations/veyon_he.ts +++ b/translations/veyon_he.ts @@ -379,10 +379,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - מפתחות התחברות - Introduction מבוא @@ -727,6 +723,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -749,10 +749,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General כללי @@ -871,10 +867,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. @@ -891,6 +883,13 @@ The public key is used on client computers to authenticate incoming connection r בדיקה + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -925,10 +924,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -942,11 +937,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1257,6 +1256,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1385,17 +1392,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1986,18 +1982,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2035,11 +2019,31 @@ The public key is used on client computers to authenticate incoming connection r - seconds - שניות + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2369,6 +2373,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2756,6 +2764,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3080,6 +3111,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + Veyon מאסטר + + + Locations & computers @@ -3273,6 +3308,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + שניות + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3577,10 +3637,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - - Connected. מחובר. @@ -3593,6 +3649,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3788,18 +3848,6 @@ Typically this is required to support terminal servers. Maximum session count - - Sessions - - - - Single session mode (create server instance for local/physical session only) - - - - Multi session mode (create server instance for each local and remote desktop session) - - Network port numbers מספרי מפתחים (פורטים) @@ -3824,6 +3872,22 @@ Typically this is required to support terminal servers. Miscellaneous network settings + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3951,13 +4015,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. נא לבחור לפחות מחשב אחד להוספה. - - Please select at least one computer to remove. - נא לבחור לפחות מחשב אחד להסדרה. - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4225,13 +4285,6 @@ The second button will remove the selected computer. If nothing is selected the שירות Veyon - - VncViewWidget - - Establishing connection to %1 ... - - - WindowsPlatformConfiguration diff --git a/translations/veyon_hu.ts b/translations/veyon_hu.ts index 7a75f292b..20212a35e 100644 --- a/translations/veyon_hu.ts +++ b/translations/veyon_hu.ts @@ -381,10 +381,6 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő AuthKeysConfigurationWidget - - Authentication keys - Hitelesítési kulcs - Introduction Bevezetés @@ -729,6 +725,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso AuthLdapConfigurationWidget - - LDAP authentication - - General Általános @@ -873,10 +869,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso AuthenticationPage - - Authentication methods - Hitelesítési módok: - Authentication is set up properly on this computer. A hitelesítés megfelelően van beállítva ezen a számítógépen. @@ -893,6 +885,13 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Tesztelés + + BuiltinDirectoryConfiguration + + Builtin directory + Beépített mappa + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Builtin directory Beépített mappa - - Locations & computers - Helyszínek és számítógépek - Locations Helyszínek @@ -943,14 +938,18 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Remove selected location Kiválasztott helyszín eltávolítása - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - CSV fájlok importálása parancssori interfészen keresztül lehetséges. Bővebb információért látogassa meg az <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online dokumentációt</a>. - New location Új helyszín + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Nem sikerült a számítógép- és a felhasználólista kiírása ide: %1. Ellenőrizd a hozzáférési jogosultságaidat. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Log to standard error output Naplózás standard hibakimenetre - - Network object directory - Hálózatobjektum-mappa - - - Backend: - Háttér: - - - Update interval: - Frissítési időköz: - %1 service %1 szolgáltatás @@ -2035,14 +2019,34 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso x x - - seconds - másodpercek - Write to logging system of operating system Írás az operációs rendszer naplózási rendszerébe + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2389,6 +2393,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso %1 %2 have been queried successfully using the configured filter. %1 %2-t sikeresen lekérdezted a a konfigurált szűrő használatával. + + LDAP directory + + LdapConfigurationPage @@ -2776,6 +2784,29 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Configured attribute for user login name or computer hostname (OpenLDAP) A felhasználó bejelentkezési nevéhez vagy a számítógép kiszolgálónevéhez beállított attribútum (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3102,6 +3133,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Veyon Master + + Locations & computers + Helyszínek és számítógépek + MasterConfigurationPage @@ -3293,6 +3328,31 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Ez az alapértelmezett mód, ami lehetővé teszi, hogy monitorozd az egy vagy több helyszínen lévő összes számítógépet. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Frissítési időköz: + + + seconds + másodpercek + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3597,10 +3657,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - %1 csatlakozik - Connected. Sikeresen csatlakozott. @@ -3613,6 +3669,10 @@ Please save your work and close all programs. Exit Kilépés + + Connecting... + + ScreenLockFeaturePlugin @@ -3808,18 +3868,6 @@ Typically this is required to support terminal servers. Maximum session count - - Sessions - - - - Single session mode (create server instance for local/physical session only) - - - - Multi session mode (create server instance for each local and remote desktop session) - - Network port numbers @@ -3844,6 +3892,22 @@ Typically this is required to support terminal servers. Miscellaneous network settings + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3971,13 +4035,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4245,13 +4305,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon szolgáltatás - - VncViewWidget - - Establishing connection to %1 ... - Kapcsolat létrehozása: %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_id.ts b/translations/veyon_id.ts index 7d65b721d..3f92bd54c 100644 --- a/translations/veyon_id.ts +++ b/translations/veyon_id.ts @@ -381,10 +381,6 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a AuthKeysConfigurationWidget - - Authentication keys - Kunci otentikasi - Introduction Perkenalan @@ -729,6 +725,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone AuthLdapConfigurationWidget - - LDAP authentication - - General Umum @@ -873,10 +869,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. @@ -893,6 +885,13 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Tes + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Builtin directory - - Locations & computers - Lokasi & komputer - Locations Lokasi @@ -943,14 +938,18 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Remove selected location Hapus lokasi terpilih - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - Impor berkas CSV dimungkinkan melalui antarmuka baris perintah. Informasi lebih lanjut, lihat <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">dokumentasi daring</a>. - New location Lokasi baru + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Log to standard error output - - Network object directory - Direktori objek jaringan - - - Backend: - Backend: - - - Update interval: - - %1 service @@ -2036,11 +2020,31 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone - seconds + Write to logging system of operating system - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2370,6 +2374,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2757,6 +2765,29 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3083,6 +3114,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Veyon Master + + Locations & computers + Lokasi & komputer + MasterConfigurationPage @@ -3274,6 +3309,31 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3578,10 +3638,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - - Connected. Tersambung. @@ -3594,6 +3650,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3790,39 +3850,43 @@ Typically this is required to support terminal servers. - Sessions - Sesi sesi + Network port numbers + - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Server demo + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Server demo + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3952,13 +4016,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4226,13 +4286,6 @@ The second button will remove the selected computer. If nothing is selected the Layanan Veyon - - VncViewWidget - - Establishing connection to %1 ... - - - WindowsPlatformConfiguration diff --git a/translations/veyon_it.ts b/translations/veyon_it.ts index 4f8b02350..a972f2e2d 100644 --- a/translations/veyon_it.ts +++ b/translations/veyon_it.ts @@ -381,10 +381,6 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche AuthKeysConfigurationWidget - - Authentication keys - Chiavi di autenticazione - Introduction Introduzione @@ -726,6 +722,10 @@ The public key is used on client computers to authenticate incoming connection r Key file File chiave + + Please specify the key name (e.g. "teacher/public") as the first argument. + Si prega di specificare il nome della chiave (ad es. "insegnante/pubblico") come primo argomento. + AuthKeysTableModel @@ -748,10 +748,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - Autenticazione LDAP - General Generale @@ -870,10 +866,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - Metodi di autenticazione - Authentication is set up properly on this computer. L'autenticazione è configurata correttamente su questo computer. @@ -890,6 +882,13 @@ The public key is used on client computers to authenticate incoming connection r Prova + + BuiltinDirectoryConfiguration + + Builtin directory + Directory incorporata + + BuiltinDirectoryConfigurationPage @@ -924,10 +923,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory Directory incorporata - - Locations & computers - Posizioni e computers - Locations Posizioni @@ -940,14 +935,18 @@ The public key is used on client computers to authenticate incoming connection r Remove selected location Rimuovi la posizione selezionata - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - L'importazione di file CSV è possibile tramite l'interfaccia della riga di comando. Per ulteriori informazioni, consultare la documentazione online.<a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory"> - New location Nuova posizione + + Directory name + Nome Directory + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + Il'importazione di file CSV è possibile tramite l'interfaccia della riga di comando. Per ulteriori informazioni, vedere la<a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">documentazione in linea</a>. + BuiltinDirectoryPlugin @@ -1256,6 +1255,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running Veyon Server irraggiungibile o non in esecuzione + + Name: %1 + Nome: %1 + + + invalid + non valido + ComputerControlServer @@ -1384,17 +1391,6 @@ The public key is used on client computers to authenticate incoming connection r Impossibile scrivere l'elenco computer e utenti su %1! Controllare i permessi di accesso al file. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - %1 -%2 Widget per lo Zoom del Computer - - - %1 - %2 - %3 Computer Zoom Widget - %1 -%2 -%3 Widget per lo Zoom del Computer - - ConfigCommands @@ -1984,18 +1980,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output Log sullo standard error output - - Network object directory - Directory dell'oggetto di rete - - - Backend: - Backend: - - - Update interval: - Intervallo di aggiornamento: - %1 service Servizio %1 @@ -2032,14 +2016,34 @@ The public key is used on client computers to authenticate incoming connection r x x - - seconds - secondi - Write to logging system of operating system Scrivi nel sistema di log del sistema operativo + + TLS configuration + Configurazione TLS + + + Use certificate authority for TLS connections + Usa l'autorità di certificazione per le connessioni TLS + + + CA certificate file + File certificato CA + + + ... + ... + + + Host certificate file + File del certificato host + + + Host private key file + File della chiave privata dell'host + HeadlessVncServer @@ -2376,6 +2380,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. %1 %2 sono stati interrogati con successo usando il filtro configurato. + + LDAP directory + Directory LDAP + LdapConfigurationPage @@ -2763,6 +2771,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) Attributo configurato per il nome di accesso dell'utente o il nome host del computer (OpenLDAP) + + Directory name + Nome Directory + + + Query options + Opzioni di query + + + Query nested user groups (supported by AD only) + Interroga gruppi di utenti annidati (supportato solo da AD) + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + Utilizza la pagina di configurazione LDAP globale per configurare come recuperare posizioni e computer dal servizio di directory basato su LDAP. + LdapPlugin @@ -3087,7 +3118,11 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master - + Veyon Master + + + Locations & computers + Posizioni e computers @@ -3280,6 +3315,31 @@ The public key is used on client computers to authenticate incoming connection r Questa modalità consente di monitorare tutti i computer in una o più posizioni. + + NestedNetworkObjectDirectory + + All directories + Tutte le directory + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Intervallo di aggiornamento: + + + seconds + secondi + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Abilitato + + NetworkObjectTreeModel @@ -3586,10 +3646,6 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Connessione con %1 - Connected. Connesso. @@ -3602,6 +3658,10 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Exit Uscita + + Connecting... + + ScreenLockFeaturePlugin @@ -3797,18 +3857,6 @@ Typically this is required to support terminal servers. Maximum session count Numero massimo di sessioni - - Sessions - Sessioni - - - Single session mode (create server instance for local/physical session only) - Modalità sessione singola (crea istanza del server solo per sessione locale/fisica) - - - Multi session mode (create server instance for each local and remote desktop session) - Modalità multisessione (crea istanza del server per ogni sessione desktop locale e remota) - Network port numbers Numeri di porta di rete @@ -3833,6 +3881,22 @@ Typically this is required to support terminal servers. Miscellaneous network settings Impostazioni di rete varie + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3960,15 +4024,11 @@ Typically this is required to support terminal servers. Please select at least one computer to add. Seleziona almeno un computer da aggiungere. - - Please select at least one computer to remove. - Seleziona almeno un computer da rimuovere. - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. Aggiungi computer facendo clic con il pulsante centrale del mouse o facendo clic sul primo pulsante in basso. -Il secondo pulsante rimuoverà il computer selezionato. Se non viene selezionato nulla, l'ultimo verrà rimosso. +Il secondo pulsante rimuove il computer selezionato o l'ultimo. @@ -4235,13 +4295,6 @@ Il secondo pulsante rimuoverà il computer selezionato. Se non viene selezionato Servizio Veyon - - VncViewWidget - - Establishing connection to %1 ... - Connessione a %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_ja.ts b/translations/veyon_ja.ts index 3864f12f9..5538e2ae3 100644 --- a/translations/veyon_ja.ts +++ b/translations/veyon_ja.ts @@ -222,31 +222,31 @@ If you're interested in translating Veyon into your local or another langua User being accessed - + アクセスされるユーザー is logged in locally - + はローカルでログインしています is logged in remotely - + はリモートでログインしています No user is logged in locally - + ローカルでログインしているユーザーはいません One or multiple users are logged in locally - + 一人、または複数のユーザーがローカルでログインしています No user is logged in remotely - + リモートでログインしているユーザーはいません One or multiple users are logged in remotely - + 一人、または複数のユーザーがリモートでログインしています is located at @@ -314,7 +314,7 @@ If you're interested in translating Veyon into your local or another langua Computer being accessed - + コンピューターへのアクセス Session being accessed is a user session @@ -377,15 +377,11 @@ If you're interested in translating Veyon into your local or another langua Authentication method - + 認証方式 AuthKeysConfigurationWidget - - Authentication keys - 認証キー - Introduction 紹介 @@ -728,7 +724,11 @@ The public key is used on client computers to authenticate incoming connection r Key file - + キーファイル + + + Please specify the key name (e.g. "teacher/public") as the first argument. + 第一引数にキー名(例:"teacher/public")を指定してください。 @@ -752,10 +752,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General 一般 @@ -766,7 +762,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + 例:%username%@DOMAIN または cn=%username%,ou=users,dc=example,dc=org @@ -777,7 +773,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + コンピューターにアクセスするためには、ドメイン/LDAPのユーザー名とパスワードを入力してください。 Username @@ -835,7 +831,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + ログオン @@ -874,26 +870,29 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. - + このコンピューターでは認証が正しく設定されています。 AuthenticationPageTab Enabled - + 有効 Test テスト + + BuiltinDirectoryConfiguration + + Builtin directory + ビルドインディクショナリー + + BuiltinDirectoryConfigurationPage @@ -928,10 +927,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory ビルドインディクショナリー - - Locations & computers - 場所&コンピューター - Locations 場所 @@ -944,14 +939,18 @@ The public key is used on client computers to authenticate incoming connection r Remove selected location 選択した場所を削除 - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - コマンドラインでCSVを使ってインポートできます。詳細は<a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">オンラインドキュメント</a>を確認してください。 - New location 新しい場所 + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1101,15 +1100,15 @@ The public key is used on client computers to authenticate incoming connection r FORMAT-STRING-WITH-PLACEHOLDERS - + プレースホルダ付きフォーマット文字列 REGULAR-EXPRESSION-WITH-PLACEHOLDER - + プレースホルダ付き正規表現 Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + 指定されたフォーマット文字列か、1つまたは複数のプレースホルダーを含む正規表現を使用して、指定されたテキストファイルからオブジェクトをインポートします。 有効なプレースホルダーは次のとおりです:%1 Import simple CSV file to a single room @@ -1121,23 +1120,23 @@ The public key is used on client computers to authenticate incoming connection r Import text file with with key/value pairs using regular expressions - + 正規表現を使ってキーと値のペアを持つテキストファイルをインポート Import arbitrarily formatted data - + 任意のフォーマットのデータをインポート Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + 1つまたは複数のプレースホルダーを含む指定のフォーマット文字列を使用して、オブジェクトを指定のテキストファイルにエクスポートします。有効なプレースホルダーは次のとおりです。%1 Export all objects to a CSV file - + すべてのオブジェクトをCSVファイルにエクスポート Export all computers in a specific location to a CSV file - + 特定の場所にあるすべてのコンピューターをCSVファイルにエクスポート TYPE @@ -1149,23 +1148,23 @@ The public key is used on client computers to authenticate incoming connection r PARENT - + Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + %1が「%2」または「%3」のいずれかになり得るオブジェクトを追加します。 %4は、名前またはUUIDで指定できます。 Add a room - + 部屋を追加 Add a computer to room %1 - + 新しいコンピューターを部屋"%1"に追加 OBJECT - + オブジェクト Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. @@ -1173,72 +1172,72 @@ The public key is used on client computers to authenticate incoming connection r Remove a computer by name - + 名前を指定してコンピューターを削除 Remove an object by UUID - + UUIDを指定してオブジェクトを削除 "Room 01" - + "ルーム01" "Computer 01" - + "コンピューター01" HOST ADDRESS - + ホストアドレス MAC ADDRESS - + MACアドレス BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + ビルトインVNCサーバー(UltraVNC) BuiltinX11VncServer Builtin VNC server (x11vnc) - + ビルトインVNCサーバー(x11vnc) ComputerControlListModel Host/IP address: %1 - + ホスト/IPアドレス: %1 Active features: %1 - + アクティブな機能: %1 Online and connected - + オンラインで接続 Establishing connection - + 接続の確立 Computer offline or switched off - + コンピューターがオフライン、または電源OFF Authentication failed or access denied - + 認証失敗、またはアクセス拒否 Disconnected - + 切断 No user logged on @@ -1246,20 +1245,28 @@ The public key is used on client computers to authenticate incoming connection r Logged on user: %1 - + ログインしたユーザー: %1 Location: %1 - + 場所: %1 [no user] - + [ユーザー無し] Veyon Server unreachable or not running + Veyonサーバーに到達できないか動作していない + + + Name: %1 + + invalid + 無効 + ComputerControlServer @@ -1277,30 +1284,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + 現在ホスト"%2"のユーザー"%1"がこのコンピューターにアクセスしています。 User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + ホスト"%2"のユーザー"%1"がこのコンピューターにアクセスしようとしましたが、正常に認証できませんでした。 Access control error - + アクセスコントロールエラー User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + ホスト"%2"のユーザー"%1"がこのコンピューターにアクセスしようとしましたが、アクセスコントロール設定によりブロックされました。 Active connections: - + アクティブな接続: ComputerGroupSelector Group %1 - + グループ %1 @@ -1319,7 +1326,7 @@ The public key is used on client computers to authenticate incoming connection r Location detection failed - + 場所の検出に失敗 Computer name;Hostname;User @@ -1327,7 +1334,7 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + このコンピューターの場所を特定できませんでした。これは、システム構成に問題があることを示しています。 代わりに、すべての場所がコンピューターの選択パネルに表示されます。 @@ -1338,84 +1345,73 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + ユーザーとコンピューターを検索 Select all - + すべて選択 Unselect all - + すべて選択解除 Add to group - + グループに追加 Remove from group - + グループから削除 ComputerSelectPanel Computer search - + コンピューターを検索 Add location - + 場所を追加 Save computer/user list - + コンピューター/ユーザーのリストを保存 Select output filename - + 出力先ファイル名を選択 CSV files (*.csv) - + CSVファイル(*.csv) File error - + ファイルエラー Could not write the computer and users list to %1! Please check the file access permissions. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands Clear system-wide Veyon configuration - + システム全体のVeyon設定をクリア List all configuration keys and values - + すべての設定のキーと値の一覧を表示 Import configuration from given file - + 設定をファイルからインポート Export configuration to given file - + 設定をファイルにエクスポート Read and output configuration value for given key @@ -1516,7 +1512,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + 調整可能 ms @@ -1524,19 +1520,19 @@ The public key is used on client computers to authenticate incoming connection r Key frame interval - + キーフレーム間隔 Memory limit - + メモリ制限 MB - + MB Update interval - + 更新間隔 s @@ -1544,14 +1540,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - + デモの実行中はサムネイルの更新を遅くする DemoFeaturePlugin Stop demo - + デモ停止 Window demo @@ -1567,7 +1563,7 @@ The public key is used on client computers to authenticate incoming connection r Demo - + デモ Share your screen or allow a user to share his screen with other users. @@ -1575,51 +1571,51 @@ The public key is used on client computers to authenticate incoming connection r Full screen demo - + フルスクリーンデモ Share your own screen in fullscreen mode - + 自分のスクリーンをフルスクリーンモードで共有 In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + このモードでは、全てのコンピューターの入力を停止し、このコンピューターの画面をフルスクリーンで全てのPCに表示します。 Share your own screen in a window - + 自分のスクリーンをウィンドウモードで共有 Share selected user's screen in fullscreen mode - + 選択したユーザーのスクリーンをフルスクリーンモードで共有 In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + このモードでは、全てのコンピューターの入力を停止し、選択したユーザーの画面をフルスクリーンで全てのPCに表示します。 Share selected user's screen in a window - + 選択したユーザーの画面をウィンドウで共有 In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + このモードでは、選択したユーザーの画面が全てのコンピューターの画面にウィンドウとして表示されます。全てのユーザーは必要に応じて他のウィンドウに切り替えることができます。 Please select a user screen to share. - + 共有するユーザーの画面を選択してください。 Please select only one user screen to share. - + 共有するユーザーの画面を一つだけ選択してください。 All screens - + 全ての画面 Screen %1 [%2] - + 画面 %1 [%2] @@ -1653,15 +1649,15 @@ The public key is used on client computers to authenticate incoming connection r Path - + パス Predefined websites - + 定義済みWebサイト Remove selected website - + 選択したWebサイトを削除 URL @@ -1669,54 +1665,54 @@ The public key is used on client computers to authenticate incoming connection r New website - + 新しいWebサイト Applications & websites - + アプリケーションとWebサイト Predefined applications - + 定義済みアプリケーション Add new application - + 新しいアプリケーションを追加 Remove selected application - + 選択したアプリケーションを削除 Add new website - + 新しいWebサイトを追加 New application - + 新しいアプリケーション DesktopServicesFeaturePlugin Open website - + Webサイトを開く Click this button to open a website on all computers. - + 全てのコンピューターでWebサイトを開きます。 Open website "%1" - + Webサイト "%1" を開く Custom website - + カスタムWebサイト Start application - + アプリケーションを開始 Click this button to start an application on all computers. @@ -1724,11 +1720,11 @@ The public key is used on client computers to authenticate incoming connection r Start application "%1" - + アプリケーション "%1" を開始 Custom application - + カスタムアプリケーション Start apps and open websites in user sessions @@ -1739,7 +1735,7 @@ The public key is used on client computers to authenticate incoming connection r DocumentationFigureCreator Teacher - + 先生 Room %1 @@ -1751,11 +1747,11 @@ The public key is used on client computers to authenticate incoming connection r Custom website - + カスタムWebサイト Open file manager - + ファイルマネージャーを開く Start learning tool @@ -1763,11 +1759,11 @@ The public key is used on client computers to authenticate incoming connection r Play tutorial video - + チュートリアルビデオを再生 Handout - + 配布資料 Texts to read @@ -1779,29 +1775,29 @@ The public key is used on client computers to authenticate incoming connection r Custom application - + カスタムアプリケーション ExternalVncServer External VNC server - + 外部VNCサーバー ExternalVncServerConfigurationWidget External VNC server configuration - + 外部VNCサーバー構成 Port: - + ポート: Password: - + パスワード: @@ -1815,7 +1811,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferConfigurationPage File transfer - + ファイル転送 Directories @@ -1823,11 +1819,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + 宛先ディレクトリ Default source directory - + デフォルトのソースディレクトリ Options @@ -1835,11 +1831,11 @@ The public key is used on client computers to authenticate incoming connection r Remember last source directory - + 最後に使用したソースディレクトリを記憶する Create destination directory if it does not exist - + 宛先ディレクトリが存在しない場合は作成する @@ -1853,7 +1849,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferDialog File transfer - + ファイル転送 Options @@ -1861,49 +1857,49 @@ The public key is used on client computers to authenticate incoming connection r Transfer only - + 転送のみ Transfer and open file(s) with associated program - + 転送後、割り当てられているプログラムでファイルを開く Transfer and open destination folder - + 転送後、宛先フォルダを開く Files - + ファイル Start - + 開始 Overwrite existing files - + 既存のファイルを上書き FileTransferFileDialog Select one or more files to transfer - + 一つ、または複数の配布ファイルを選択 FileTransferPlugin File transfer - + ファイル転送 Click this button to transfer files from your computer to all computers. - + 全てのコンピューターへファイルを転送します。 Select one or more files to transfer - + 一つ、または複数の配布ファイルを選択 Transfer files to remote computer @@ -1930,19 +1926,19 @@ The public key is used on client computers to authenticate incoming connection r Language: - + 言語: Use system language setting - + システムの言語設定を使用する Veyon - + Veyon Logging - + ロギング Log file directory @@ -1970,7 +1966,7 @@ The public key is used on client computers to authenticate incoming connection r Information, warnings and errors - + 情報、警告とエラー Debug messages and everything else @@ -1978,70 +1974,78 @@ The public key is used on client computers to authenticate incoming connection r Limit log file size - + ログファイルサイズ上限 Clear all log files - + すべてのログファイルをクリア Log to standard error output - Network object directory - + %1 service + %1 サービス - Backend: - バックエンド + The %1 service needs to be stopped temporarily in order to remove the log files. Continue? + ログファイルを削除するには %1 サービスを一時的に停止する必要があります。続行しますか? - Update interval: + Log files cleared - %1 service + All log files were cleared successfully. - The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Error + エラー - Log files cleared + Could not remove all log files. - All log files were cleared successfully. + MB + MB + + + Rotate log files - Error + x - Could not remove all log files. + Write to logging system of operating system - MB + TLS configuration - Rotate log files + Use certificate authority for TLS connections - x + CA certificate file - seconds - + ... + ... - Write to logging system of operating system + Host certificate file + + + + Host private key file @@ -2070,7 +2074,7 @@ The public key is used on client computers to authenticate incoming connection r LdapConfiguration LDAP connection failed - + LDAP接続失敗 Could not connect to the LDAP server. Please check the server parameters. @@ -2080,7 +2084,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP bind failed - + LDAPバインド失敗 Could not bind to the LDAP server. Please check the server parameters and bind credentials. @@ -2090,7 +2094,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP bind successful - + LDAPバインド成功 Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. @@ -2201,7 +2205,7 @@ The public key is used on client computers to authenticate incoming connection r Invalid hostname - + 無効なホスト名 You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. @@ -2225,7 +2229,7 @@ The public key is used on client computers to authenticate incoming connection r computer locations - + コンピューターの場所 Computer location attribute @@ -2297,7 +2301,7 @@ The public key is used on client computers to authenticate incoming connection r Computer locations identification - + コンピューターの場所の識別 Filter for computer groups @@ -2371,12 +2375,16 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage Basic settings - + 基本設定 General @@ -2384,11 +2392,11 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + LDAPサーバとポート Bind DN - + Bind DN Bind password @@ -2412,7 +2420,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. dc=example,dc=org - + 例: dc=example,dc=org Discover base DN by naming context @@ -2424,7 +2432,7 @@ The public key is used on client computers to authenticate incoming connection r Environment settings - + 環境設定 Object trees @@ -2436,7 +2444,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. OU=Groups - + 例:OU=Groups User tree @@ -2444,11 +2452,11 @@ The public key is used on client computers to authenticate incoming connection r e.g. OU=Users - + 例:OU=Users e.g. OU=Computers - + 例:OU=Computers Group tree @@ -2464,15 +2472,15 @@ The public key is used on client computers to authenticate incoming connection r e.g. hwAddress - + 例:hwAddress e.g. member or memberUid - + 例:member または memberUid e.g. dNSHostName - + 例:dNSHostName Computer MAC address attribute @@ -2484,11 +2492,11 @@ The public key is used on client computers to authenticate incoming connection r e.g. uid or sAMAccountName - + 例:uid または sAMAccountName Advanced settings - + 拡張設定 Optional object filters @@ -2536,7 +2544,7 @@ The public key is used on client computers to authenticate incoming connection r Enter group name - + グループ名を入力 Please enter a group name whose members to query: @@ -2544,11 +2552,11 @@ The public key is used on client computers to authenticate incoming connection r Enter computer name - + コンピューター名を入力 Enter computer DN - + コンピューターDNを入力 Please enter the DN of a computer whose MAC address to query: @@ -2560,7 +2568,7 @@ The public key is used on client computers to authenticate incoming connection r Enter computer IP address - + コンピューターのIPアドレスを入力 Please enter a computer IP address which to resolve to an computer object: @@ -2580,11 +2588,11 @@ The public key is used on client computers to authenticate incoming connection r e.g. room or computerLab - + 例:room または computerLab Integration tests - + 統合テスト Computer groups @@ -2592,7 +2600,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. name or description - + 例:name または description Filter for computer containers @@ -2608,7 +2616,7 @@ The public key is used on client computers to authenticate incoming connection r TLS certificate verification - + TLS証明書の検証 System defaults @@ -2628,11 +2636,11 @@ The public key is used on client computers to authenticate incoming connection r TLS - + TLS SSL - + SSL e.g. (objectClass=computer) @@ -2660,7 +2668,7 @@ The public key is used on client computers to authenticate incoming connection r Encryption protocol - + 暗号化プロトコル Computer location attribute @@ -2680,7 +2688,7 @@ The public key is used on client computers to authenticate incoming connection r Computer locations identification - + コンピューターの場所の識別 Identify computer locations (e.g. rooms) via: @@ -2696,7 +2704,7 @@ The public key is used on client computers to authenticate incoming connection r List all locations - + すべての場所をリスト Enter computer display name @@ -2716,7 +2724,7 @@ The public key is used on client computers to authenticate incoming connection r Enter location name - + 場所の名前を入力 Please enter the name of a location whose entries to query: @@ -2724,7 +2732,7 @@ The public key is used on client computers to authenticate incoming connection r Browse - + 参照 Test @@ -2758,6 +2766,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -2822,7 +2853,7 @@ The public key is used on client computers to authenticate incoming connection r LinuxPlatformConfigurationPage Linux - + Linux Custom PAM service for user authentication @@ -2830,11 +2861,11 @@ The public key is used on client computers to authenticate incoming connection r User authentication - + ユーザー認証 User sessions - + ユーザーセッション Minimum session lifetime before server start @@ -2842,7 +2873,7 @@ The public key is used on client computers to authenticate incoming connection r User login - + ユーザーログイン Login key sequence @@ -2860,26 +2891,26 @@ The public key is used on client computers to authenticate incoming connection r LocationDialog Select location - + 場所を選択 enter search filter... - + 検索フィルターを入力... MainToolBar Configuration - + 構成 Disable balloon tooltips - + バルーン通知を無効 Show icons only - + アイコンのみ表示 @@ -2902,19 +2933,19 @@ The public key is used on client computers to authenticate incoming connection r &Help - + &ヘルプ &Quit - + &終了 Ctrl+Q - + Ctrl+Q Ctrl+S - + Ctrl+S L&oad settings from file @@ -2922,11 +2953,11 @@ The public key is used on client computers to authenticate incoming connection r Ctrl+O - + Ctrl+O About Qt - + Qtについて Configuration not writable @@ -2934,35 +2965,35 @@ The public key is used on client computers to authenticate incoming connection r Load settings from file - + 設定をファイルから読み込む Save settings to file - + 設定をファイルに保存する Unsaved settings - + 未保存の設定 There are unsaved settings. Quit anyway? - + 未保存の設定があります。終了しますか? Veyon Configurator - + Veyon構成 Service - + サービス Master - + マスター Access control - + アクセスコントロール About Veyon @@ -2970,7 +3001,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + 自動 About @@ -2982,7 +3013,7 @@ The public key is used on client computers to authenticate incoming connection r JSON files (*.json) - + JSON files (*.json) The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. @@ -2998,7 +3029,7 @@ The public key is used on client computers to authenticate incoming connection r Screenshots - + スクリーンショット Feature active @@ -3010,7 +3041,7 @@ The public key is used on client computers to authenticate incoming connection r Reset configuration - + 構成のリセット Do you really want to reset the local configuration and revert all settings to their defaults? @@ -3018,11 +3049,11 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + ユーザーとコンピューターを検索 Align computers to grid - + コンピューターをグリッドに揃える %1 Configurator @@ -3030,7 +3061,7 @@ The public key is used on client computers to authenticate incoming connection r Insufficient privileges - + 権限が不足 Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. @@ -3038,7 +3069,7 @@ The public key is used on client computers to authenticate incoming connection r Only show powered on computers - + 電源ONのコンピューターのみ表示 &Save settings to file @@ -3046,15 +3077,15 @@ The public key is used on client computers to authenticate incoming connection r &View - + &表示 &Standard - + 標準 &Advanced - + 拡張 Use custom computer arrangement @@ -3062,7 +3093,7 @@ The public key is used on client computers to authenticate incoming connection r Locations && computers - + 場所とコンピューター Authentication @@ -3070,19 +3101,23 @@ The public key is used on client computers to authenticate incoming connection r Adjust size of computer icons automatically - + コンピューターアイコンのサイズを自動で調整する Slideshow - + スライドショー Spotlight - + スポットライト Veyon Master - + Veyon Master + + + Locations & computers + 場所&コンピューター @@ -3093,47 +3128,47 @@ The public key is used on client computers to authenticate incoming connection r User configuration - + ユーザー構成 Feature on computer double click: - + コンピューターをダブルクリックした時の機能: Features - + 機能 All features - + すべての機能 Disabled features - + 無効な機能 Screenshots - + スクリーンショット <no feature> - + 機能指定無し Basic settings - + 基本設定 Behaviour - + 動作 Enforce selected mode for client computers - + クライアントコンピューターに選択したモードを適用する Hide local computer - + ローカルコンピューターを隠す Hide computer filter field @@ -3149,11 +3184,11 @@ The public key is used on client computers to authenticate incoming connection r Background color - + 背景色 Thumbnail update interval - + サムネイル更新間隔 ms @@ -3161,71 +3196,71 @@ The public key is used on client computers to authenticate incoming connection r Program start - + 起動設定 Modes and features - + モードと機能 User and computer name - + ユーザー名とコンピューター名 Only user name - + ユーザー名のみ Only computer name - + コンピューター名のみ Computer thumbnail caption - + コンピューターサムネイルの見出し Text color - + 文字色 Sort order - + ソート順 Computer and user name - + コンピューター名とユーザー名 Computer locations - + コンピューターの場所 Show current location only - + 現在の場所のみを表示 Allow adding hidden locations manually - + 非表示の場所を手動で追加することを許可する Hide empty locations - + 空の場所を隠す Show confirmation dialog for potentially unsafe actions - + 安全ではない可能性のあるアクションに対する確認ダイアログを表示する Perform access control - + アクセスコントロールの実行 Automatically select current location - + 自動的に現在の場所を選択する Automatically open computer select panel - + 自動的にコンピューター選択パネルを開く Use modern user interface (experimental) @@ -3233,11 +3268,11 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail spacing - + サムネイル間隔 px - + px Hide local session @@ -3245,26 +3280,26 @@ The public key is used on client computers to authenticate incoming connection r Auto - + 自動 Thumbnail aspect ratio - + サムネイルアスペクト比 Automatically adjust computer icon size - + 自動的にコンピューターのアイコンサイズを調整する Open feature windows on the same screen as the main window - + メインウィンドウと同じ画面で機能ウィンドウを開く MonitoringMode Monitoring - + モニタリング Builtin monitoring mode @@ -3275,22 +3310,47 @@ The public key is used on client computers to authenticate incoming connection r このモードでは、全てのコンピューターを1つ以上の場所でモニターできるようになります。 + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + 更新間隔: + + + seconds + + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + 有効 + + NetworkObjectTreeModel Locations/Computers - + 場所/コンピューター OpenWebsiteDialog Open website - + Webサイトを開く e.g. Veyon - + 例:Veyon Remember and add to website menu @@ -3298,7 +3358,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. www.veyon.io - + 例:www.veyon.io Please enter the URL of the website to open: @@ -3306,11 +3366,11 @@ The public key is used on client computers to authenticate incoming connection r Name: - + 例: Website name - + Webサイト名 @@ -3356,23 +3416,23 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - + 全てのコンピューターの電源をオンにします。各コンピューターの電源を手動でオンにする必要はありません。 Reboot - + 再起動 Click this button to reboot all computers. - + 全てのコンピューターを再起動します。 Power down - + 電源オフ Click this button to power down all computers. This way you do not have to power down each computer by hand. - + 全てのコンピューターの電源をオフにします。各コンピューターの電源を手動でオフにする必要はありません。 Power on/down or reboot a computer @@ -3392,11 +3452,11 @@ The public key is used on client computers to authenticate incoming connection r Power on a computer via Wake-on-LAN (WOL) - + Wake-on-LANでコンピュータの電源を入れる MAC ADDRESS - + MACアドレス This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. @@ -3416,19 +3476,19 @@ The public key is used on client computers to authenticate incoming connection r Power down now - + 今すぐ電源オフ Install updates and power down - + 更新をインストールしてシャットダウン Power down after user confirmation - + ユーザーに確認後にシャットダウン Power down after timeout - + タイムアウト後にシャットダウン The computer was remotely requested to power down. Do you want to power down the computer now? @@ -3458,7 +3518,7 @@ Please save your work and close all programs. PowerDownTimeInputDialog Power down - + 電源オフ Please specify a timeout for powering down the selected computers: @@ -3550,7 +3610,7 @@ Please save your work and close all programs. Ctrl+Alt+Del - + Ctrl+Alt+Del Ctrl+Esc @@ -3580,22 +3640,22 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - - Connected. Screenshot - + スクリーンショット Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3640,7 +3700,7 @@ Please save your work and close all programs. Screenshot - + スクリーンショット Could not open screenshot file %1 for writing. @@ -3651,11 +3711,11 @@ Please save your work and close all programs. ScreenshotFeaturePlugin Screenshot - + スクリーンショット Use this function to take a screenshot of selected computers. - + 選択しているコンピューターのスクリーンショットを取得します。 Screenshots taken @@ -3674,7 +3734,7 @@ Please save your work and close all programs. ScreenshotManagementPage Screenshots - + スクリーンショット @@ -3685,31 +3745,31 @@ Please save your work and close all programs. User: - + ユーザー: Computer: - + コンピューター: Date: - + 日付: Time: - + 時刻: Show - + 表示 Delete - + 削除 Screenshot - + スクリーンショット Do you really want to delete all selected screenshots? @@ -3752,15 +3812,15 @@ Please save your work and close all programs. Allow connections from localhost only - + localhostからの接続のみ許可 VNC server - + VNCサーバー Plugin: - + プラグイン: Restart %1 Service @@ -3772,7 +3832,7 @@ Please save your work and close all programs. Running - + 実行中 Enabling this option will make the service launch a server process for every interactive session on a computer. @@ -3781,7 +3841,7 @@ Typically this is required to support terminal servers. Show notification on remote connection - + リモート接続時、通知を表示 Show notification when an unauthorized access is blocked @@ -3789,42 +3849,46 @@ Typically this is required to support terminal servers. Maximum session count - + 最大セッション数 - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) - + Veyon server + Veyonサーバ - Multi session mode (create server instance for each local and remote desktop session) - + Internal VNC server + 内部VNCサーバー - Network port numbers + Feature manager - Veyon server + Demo server + デモサーバー + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - デモサーバー + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3832,58 +3896,58 @@ Typically this is required to support terminal servers. ServiceControl Starting service %1 - + サービス %1 を開始 Stopping service %1 - + サービス %1 を停止 Registering service %1 - + サービス %1 を登録 Unregistering service %1 - + サービス %1 の登録を解除 Service control - + サービス制御 ServiceControlPlugin Service is running - + サービス実行中 Service is not running - + サービス停止中 Configure and control Veyon service - + Veyonサービスの構成と制御 Register Veyon Service - + Veyonサービスを登録 Unregister Veyon Service - + Veyonサービスの登録を解除 Start Veyon Service - + Veyonサービスを開始 Stop Veyon Service - + Veyonサービスを停止 Restart Veyon Service - + Veyonサービスを再起動 Query status of Veyon Service @@ -3917,30 +3981,30 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + 前へ Start/pause - + 開始/一時停止 Next - + 次へ Duration: - + 期限: SpotlightPanel Add selected computers - + 選択したコンピューターを追加 Remove selected computers - + 選択したコンピューターを削除 Update computers in realtime @@ -3948,19 +4012,15 @@ Typically this is required to support terminal servers. Spotlight - + スポットライト Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -3968,7 +4028,7 @@ The second button will remove the selected computer. If nothing is selected the StartAppDialog Start application - + アプリケーションを開始 Please enter the applications to start on the selected computers. You can separate multiple applications by line. @@ -3984,22 +4044,22 @@ The second button will remove the selected computer. If nothing is selected the Application name - + アプリケーション名 Name: - + 例: e.g. VLC - + (例) VLC SystemTrayIcon System tray icon - + システムトレイアイコン @@ -4028,7 +4088,7 @@ The second button will remove the selected computer. If nothing is selected the TextMessageDialog Send text message - + テキストメッセージを送信 Please enter your message which send to all selected users. @@ -4039,7 +4099,7 @@ The second button will remove the selected computer. If nothing is selected the TextMessageFeaturePlugin Text message - + テキストメッセージ Use this function to send a text message to all users e.g. to assign them new tasks. @@ -4051,7 +4111,7 @@ The second button will remove the selected computer. If nothing is selected the Send a message to a user - + ユーザーへメッセージを送信 @@ -4070,11 +4130,11 @@ The second button will remove the selected computer. If nothing is selected the Builtin UltraVNC server configuration - + ビルトインUltraVNCサーバー構成 Enable multi monitor support - + マルチモニターサポートを有効 Enable Desktop Duplication Engine on Windows 8 and newer @@ -4100,7 +4160,7 @@ The second button will remove the selected computer. If nothing is selected the UserLoginDialog User login - + ユーザーログイン Please enter a username and password for automatic login on all computers. @@ -4119,19 +4179,19 @@ The second button will remove the selected computer. If nothing is selected the UserSessionControlPlugin Log in - + ログイン Click this button to log in a specific user on all computers. - + 全てのコンピューターに特定のユーザーでログインします。 Log off - + ログオフ Click this button to log off users from all computers. - + 全てのコンピューターをログオフします。 Confirm user logoff @@ -4154,11 +4214,11 @@ The second button will remove the selected computer. If nothing is selected the VeyonCore [OK] - + [OK] [FAIL] - + [失敗] Invalid command! @@ -4178,11 +4238,11 @@ The second button will remove the selected computer. If nothing is selected the Unknown result! - + 不明な結果! Available modules: - + 有効なモジュール: No module specified or module not found - available modules are: @@ -4190,49 +4250,42 @@ The second button will remove the selected computer. If nothing is selected the Plugin not licensed - + プラグインはライセンスされていません INFO - + ERROR - + エラー USAGE - + 使用法 DESCRIPTION - + 説明 EXAMPLES - + WARNING - + 警告 Authentication test - + 認証テスト VeyonServiceControl Veyon Service - - - - - VncViewWidget - - Establishing connection to %1 ... - + Veyon サービス @@ -4246,7 +4299,7 @@ The second button will remove the selected computer. If nothing is selected the WindowsPlatformConfigurationPage Windows - + Windows General @@ -4254,7 +4307,7 @@ The second button will remove the selected computer. If nothing is selected the Enable SAS generation by software (Ctrl+Alt+Del) - + ソフトウェアによるSAS生成を有効にする(Ctrl + Alt + Del) Screen lock @@ -4262,19 +4315,19 @@ The second button will remove the selected computer. If nothing is selected the Hide taskbar - + タスクバーを隠す Hide start menu - + スタートメニュー隠す Hide desktop - + デスクトップを隠す User authentication - + ユーザー認証 Use alternative user authentication mechanism @@ -4282,15 +4335,15 @@ The second button will remove the selected computer. If nothing is selected the User login - + ユーザーログイン Input start delay - + 入力開始遅延 Simulated key presses interval - + キー押下シミュレート間隔 Confirm legal notice (message displayed before user logs in) @@ -4336,18 +4389,18 @@ The second button will remove the selected computer. If nothing is selected the Service "%1" could not be found. - + サービス "%1"が見つかりませんでした。 X11VncConfigurationWidget Builtin x11vnc server configuration - + ビルトインx11vncサーバー構成 Custom x11vnc parameters: - + カスタムx11vncパラメーター: Do not use X Damage extension diff --git a/translations/veyon_ko.ts b/translations/veyon_ko.ts index 0032fbef1..3c117430a 100644 --- a/translations/veyon_ko.ts +++ b/translations/veyon_ko.ts @@ -381,10 +381,6 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 AuthKeysConfigurationWidget - - Authentication keys - 인증 키 - Introduction 소개 @@ -729,6 +725,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General 일반사항 @@ -873,10 +869,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - 인증 방법 - Authentication is set up properly on this computer. 이 컴퓨터에서 인증이 적절히 설정되었습니다. @@ -893,6 +885,13 @@ The public key is used on client computers to authenticate incoming connection r 테스트 + + BuiltinDirectoryConfiguration + + Builtin directory + 게시물 폴더 + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory 게시물 폴더 - - Locations & computers - 위치 및 컴퓨터들 - Locations 위치 @@ -943,14 +938,18 @@ The public key is used on client computers to authenticate incoming connection r Remove selected location 선택한 위치 삭제 - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - CSV 화일 불러오기는 커맨드라인 인터페이스로 가능합니다. 자세한 정보는, 다음 참조 <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">온라인 문서</a>. - New location 새로운 위치 + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ The public key is used on client computers to authenticate incoming connection r 컴퓨터와 사용자 리스트를 %1에 저장하지 못함. 접근 권한을 확인하세요. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output 표준 에러 출력장치에 기록 - - Network object directory - 네트워크 개체 폴더 - - - Backend: - 백엔드: - - - Update interval: - 화면업데이트 간격: - %1 service %1 서비스 @@ -2035,14 +2019,34 @@ The public key is used on client computers to authenticate incoming connection r x x - - seconds - - Write to logging system of operating system 운영체계의 로깅시스템에 기록 + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2387,6 +2391,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. 컴퓨터 필터를 사용한 %1 %2 검색 조회 성공 + + LDAP directory + + LdapConfigurationPage @@ -2774,6 +2782,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) 사용자 로그인 또는 컴퓨터 호스트 이름 (OpenLDAP)의 속성 설정됨 + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3100,6 +3131,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + 위치 및 컴퓨터들 + MasterConfigurationPage @@ -3291,6 +3326,31 @@ The public key is used on client computers to authenticate incoming connection r 이모드는 하나 또는 많은 위치에 있는 모든 컴퓨터들의 모니터를 가능하게 합니다. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + 화면업데이트 간격: + + + seconds + + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3597,10 +3657,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - %1에 연결중 - Connected. 연결됨 @@ -3613,6 +3669,10 @@ Please save your work and close all programs. Exit 나가기 + + Connecting... + + ScreenLockFeaturePlugin @@ -3810,39 +3870,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + 데모 서버 + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - 데모 서버 + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3972,13 +4036,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4246,13 +4306,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon Service - - VncViewWidget - - Establishing connection to %1 ... - ... %1 로 연결 중입니다 - - WindowsPlatformConfiguration diff --git a/translations/veyon_lt.ts b/translations/veyon_lt.ts index af1736bc4..2c7e4d0a9 100644 --- a/translations/veyon_lt.ts +++ b/translations/veyon_lt.ts @@ -380,10 +380,6 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p AuthKeysConfigurationWidget - - Authentication keys - Prieigos raktai - Introduction Įvadas @@ -728,6 +724,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Key file Rakto failas + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -750,10 +750,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u AuthLdapConfigurationWidget - - LDAP authentication - LDAP autorizavimas - General Pagrindinis @@ -872,10 +868,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u AuthenticationPage - - Authentication methods - Autorizavimo metodai - Authentication is set up properly on this computer. Autorizacija nustatyta tinkamai šiame kompiuteryje. @@ -892,6 +884,13 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Testuoti + + BuiltinDirectoryConfiguration + + Builtin directory + Standartinė direktorija + + BuiltinDirectoryConfigurationPage @@ -926,10 +925,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Builtin directory Standartinė direktorija - - Locations & computers - Vietos ir kompiuteriai - Locations Vietos @@ -942,14 +937,18 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Remove selected location Ištrinti pasirinktą vietą - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - CSV failų importavimas įmanomas naudojant komandinę eilutę. Daugiau informacijos žiūrėkite skiltyje <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">internetinėje dokumentacijoje </a>. - New location Nauja vieta + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1258,6 +1257,14 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Veyon Server unreachable or not running Veyon Serveris nepasiekiamas ar nepaleistas + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1386,17 +1393,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Neįmanoma įrašyti kompiuterio ir vartotojų sąrašo į %1! Patikrinkite failo prieigos teises. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - %1 - %2 Kompiuterio priartinimo valdiklis. - - - %1 - %2 - %3 Computer Zoom Widget - %1 - %2 - %3 Kompiuterio priartinimo valdiklis. - - ConfigCommands @@ -1986,18 +1982,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Log to standard error output Persijungti į įvykių žurnalą - - Network object directory - Tinklo objektų direktorija - - - Backend: - Sisteminė konfigūracija - - - Update interval: - Atnaujinimo intervalai: - %1 service %1 servisas @@ -2034,14 +2018,34 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u x x - - seconds - Sekundės - Write to logging system of operating system Įrašyti į operacinės sistemos įvykių žurnalą + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2370,6 +2374,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2757,6 +2765,29 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3081,7 +3112,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Veyon Master - + Veyon Master + + + Locations & computers + Vietos ir kompiuteriai @@ -3274,6 +3309,31 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Atnaujinimo intervalai: + + + seconds + Sekundės + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Įgalintas + + NetworkObjectTreeModel @@ -3578,10 +3638,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Jungiamasi su %1 - Connected. Prisijungta. @@ -3594,6 +3650,10 @@ Please save your work and close all programs. Exit Išeiti + + Connecting... + + ScreenLockFeaturePlugin @@ -3789,18 +3849,6 @@ Typically this is required to support terminal servers. Maximum session count - - Sessions - - - - Single session mode (create server instance for local/physical session only) - - - - Multi session mode (create server instance for each local and remote desktop session) - - Network port numbers @@ -3825,6 +3873,22 @@ Typically this is required to support terminal servers. Miscellaneous network settings + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3952,13 +4016,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4226,13 +4286,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon Service - - VncViewWidget - - Establishing connection to %1 ... - Vykdomas sujungimas su %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_lv.ts b/translations/veyon_lv.ts index 2c88d2767..66496920d 100644 --- a/translations/veyon_lv.ts +++ b/translations/veyon_lv.ts @@ -381,10 +381,6 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l AuthKeysConfigurationWidget - - Authentication keys - Autorizācijas atslēga - Introduction Ievads @@ -726,6 +722,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -748,10 +748,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General Vispārīgi @@ -870,10 +866,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. @@ -890,6 +882,13 @@ The public key is used on client computers to authenticate incoming connection r Tests + + BuiltinDirectoryConfiguration + + Builtin directory + Iebūvētās mapes + + BuiltinDirectoryConfigurationPage @@ -924,10 +923,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory Iebūvētās mapes - - Locations & computers - - Locations @@ -941,11 +936,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1256,6 +1255,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1384,17 +1391,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1984,18 +1980,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service %1 pakalpojums @@ -2033,11 +2017,31 @@ The public key is used on client computers to authenticate incoming connection r x - seconds - sekundes + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2367,6 +2371,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2754,6 +2762,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3080,6 +3111,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3271,6 +3306,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + sekundes + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3575,10 +3635,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Pieslēdzas %1 - Connected. Pieslēdzies. @@ -3591,6 +3647,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3787,39 +3847,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Demonstrējuma serveris + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Demonstrējuma serveris + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3949,13 +4013,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4223,13 +4283,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon pakalpojums - - VncViewWidget - - Establishing connection to %1 ... - Veido savienojumu ar %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_mn.ts b/translations/veyon_mn.ts index a56240f0a..92f447550 100644 --- a/translations/veyon_mn.ts +++ b/translations/veyon_mn.ts @@ -379,10 +379,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - - Introduction @@ -724,6 +720,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -746,10 +746,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General Ерөнхий @@ -868,10 +864,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - Нэвтрэх аргууд - Authentication is set up properly on this computer. @@ -888,6 +880,13 @@ The public key is used on client computers to authenticate incoming connection r Тест + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -922,10 +921,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -939,11 +934,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1254,6 +1253,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1382,17 +1389,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1982,18 +1978,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output Нэвтрэх үеийн энгийн алдааны гаралт - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2031,11 +2015,31 @@ The public key is used on client computers to authenticate incoming connection r - seconds - секунд + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2365,6 +2369,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2752,6 +2760,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3078,6 +3109,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3269,6 +3304,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + секунд + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3573,10 +3633,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - Холбогдож байна %1 - Connected. Холбогдсон. @@ -3589,6 +3645,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3785,39 +3845,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Демо сервер + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Демо сервер + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3947,13 +4011,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4221,13 +4281,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - Үүлчилгээг бүртгүүлэх боломжгүй %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_nl.ts b/translations/veyon_nl.ts index 80bbd8b58..bb790e5c2 100644 --- a/translations/veyon_nl.ts +++ b/translations/veyon_nl.ts @@ -381,10 +381,6 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an AuthKeysConfigurationWidget - - Authentication keys - Authenticatie sleutels - Introduction Inleiding @@ -726,6 +722,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -748,10 +748,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General Algemeen @@ -870,10 +866,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - Verificatiemethoden - Authentication is set up properly on this computer. @@ -890,6 +882,13 @@ The public key is used on client computers to authenticate incoming connection r Test + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -924,10 +923,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - Locaties & computers - Locations @@ -941,12 +936,16 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location + Nieuwe locatie + + + Directory name - New location - Nieuwe locatie + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + @@ -1256,6 +1255,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1384,17 +1391,6 @@ The public key is used on client computers to authenticate incoming connection r Kon de computer en gebruikerslijst niet schrijven naar %1! Controleer de toegangsrechten voor het bestand. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1984,18 +1980,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output Log naar standaard fout uitgang - - Network object directory - Netwerk object map - - - Backend: - Backend: - - - Update interval: - Update interval: - %1 service %1 service @@ -2033,11 +2017,31 @@ The public key is used on client computers to authenticate incoming connection r x - seconds - seconden + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2374,6 +2378,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. %1 %2 zijn met succes opgevraagd gebruikmakend van de ingestelde filter. + + LDAP directory + + LdapConfigurationPage @@ -2761,6 +2769,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3087,6 +3118,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + Locaties & computers + MasterConfigurationPage @@ -3278,6 +3313,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Update interval: + + + seconds + seconden + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3582,10 +3642,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Verbinden met %1 - Connected. Verbonden. @@ -3598,6 +3654,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3794,39 +3854,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Demo server + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Demo server + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3956,13 +4020,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4230,13 +4290,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon Service - - VncViewWidget - - Establishing connection to %1 ... - Verbinding tot stand brengen naar %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_no_NO.ts b/translations/veyon_no_NO.ts index e8f7af265..bb375bfeb 100644 --- a/translations/veyon_no_NO.ts +++ b/translations/veyon_no_NO.ts @@ -379,10 +379,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - - Introduction @@ -724,6 +720,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -746,10 +746,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General Generelt @@ -868,10 +864,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. @@ -888,6 +880,13 @@ The public key is used on client computers to authenticate incoming connection r Test + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -922,10 +921,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -939,11 +934,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1254,6 +1253,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1382,17 +1389,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1982,18 +1978,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2031,11 +2015,31 @@ The public key is used on client computers to authenticate incoming connection r x - seconds - sekunder + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2365,6 +2369,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2752,6 +2760,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3078,6 +3109,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3269,6 +3304,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + sekunder + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3573,10 +3633,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - - Connected. @@ -3589,6 +3645,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3785,39 +3845,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Demo server + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Demo server + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3947,13 +4011,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4221,13 +4281,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - - - WindowsPlatformConfiguration diff --git a/translations/veyon_pl.ts b/translations/veyon_pl.ts index ffb70a1f4..dd77a6f62 100644 --- a/translations/veyon_pl.ts +++ b/translations/veyon_pl.ts @@ -381,10 +381,6 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne AuthKeysConfigurationWidget - - Authentication keys - Klucze uwierzytelniające - Introduction Wprowadzenie @@ -729,6 +725,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Key file Plik z kluczem + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc AuthLdapConfigurationWidget - - LDAP authentication - Uwierzytelnienie LDAP - General Ogólne @@ -873,10 +869,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc AuthenticationPage - - Authentication methods - Metody uwierzytelniania - Authentication is set up properly on this computer. Uwierzytelnianie jest poprawnie skonfigurowane na tym komputerze. @@ -893,6 +885,13 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Test + + BuiltinDirectoryConfiguration + + Builtin directory + Wbudowany katalog + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Builtin directory Wbudowany katalog - - Locations & computers - Sale i komputery - Locations Sale @@ -943,14 +938,18 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Remove selected location Usuń wybraną lokalizację - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - Import plików CSV jest możliwy poprzez interfejs wiersza poleceń. Aby uzyskać więcej informacji, zobacz <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">dokumentację online</a>. - New location Nowa lokalizacja + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Veyon Server unreachable or not running Serwer Veyon nieosiagalny lub nie uruchomiony + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Nie można zapisać listy komputerów i użytkowników w %1! Sprawdź prawa dostępu do pliku - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Log to standard error output Loguj do standardowego wyjścia błędów - - Network object directory - Adres obiektu sieciowego - - - Backend: - Zaplecze: - - - Update interval: - Interwał odświeżania: - %1 service Usługa %1 @@ -2035,14 +2019,34 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc x x - - seconds - sekundy - Write to logging system of operating system Zapisz w logach systemu operacyjnego + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2383,6 +2387,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc %1 %2 have been queried successfully using the configured filter. Zadanie %1 %2 zakończyło się pomyślnie przy użyciu skonfigurowanego filtra. + + LDAP directory + + LdapConfigurationPage @@ -2771,6 +2779,29 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Configured attribute for user login name or computer hostname (OpenLDAP) Skonfigurowany atrybut użytkownik lub komputer (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3095,7 +3126,11 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Veyon Master - + Veyon Master + + + Locations & computers + Sale i komputery @@ -3288,6 +3323,31 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Ten tryb umożliwia monitorowanie wszystkich komputerów w co najmniej jednej lokalizacji. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Interwał odświeżania: + + + seconds + sekundy + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Włączony + + NetworkObjectTreeModel @@ -3594,10 +3654,6 @@ Zapisz swoją pracę i zamknij wszystkie programy. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Łączenie z %1 - Connected. Połączono. @@ -3610,6 +3666,10 @@ Zapisz swoją pracę i zamknij wszystkie programy. Exit Wyjście + + Connecting... + + ScreenLockFeaturePlugin @@ -3806,18 +3866,6 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Maximum session count Maksymalna liczba sesji - - Sessions - Sesje - - - Single session mode (create server instance for local/physical session only) - - - - Multi session mode (create server instance for each local and remote desktop session) - Tryb wielosesyjny (utwórz instancję serwera dla każdej sesji pulpitu lokalnego i zdalnego) - Network port numbers @@ -3842,6 +3890,22 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Miscellaneous network settings Różne ustawienia sieci + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3969,13 +4033,9 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4243,13 +4303,6 @@ The second button will remove the selected computer. If nothing is selected the Usługa Veyon - - VncViewWidget - - Establishing connection to %1 ... - Nawiązywanie połączenia z %1 - - WindowsPlatformConfiguration diff --git a/translations/veyon_pt_BR.ts b/translations/veyon_pt_BR.ts index 4556de942..8b59fc85f 100644 --- a/translations/veyon_pt_BR.ts +++ b/translations/veyon_pt_BR.ts @@ -381,10 +381,6 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi AuthKeysConfigurationWidget - - Authentication keys - Chaves de autenticação - Introduction Introdução @@ -729,6 +725,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Key file Arquivo da chave + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç AuthLdapConfigurationWidget - - LDAP authentication - Autenticação LDAP - General Geral @@ -873,10 +869,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç AuthenticationPage - - Authentication methods - Métodos de autenticação - Authentication is set up properly on this computer. A autenticação está configurada corretamente neste computador. @@ -893,6 +885,13 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Teste + + BuiltinDirectoryConfiguration + + Builtin directory + Diretório integrado + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Builtin directory Diretório integrado - - Locations & computers - Locais e computadores - Locations Locais @@ -944,12 +939,16 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Remover local selecionado - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location + Novo local + + + Directory name - New location - Novo local + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + @@ -1259,6 +1258,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Não foi possível salvar a lista de computadores e usuários em %1! Verifique as permissões de acesso ao arquivo. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Log to standard error output Log para a saída de erro padrão - - Network object directory - Diretório de objetos de rede - - - Backend: - Backend: - - - Update interval: - Intervalo de atualização: - %1 service serviço %1 @@ -2035,14 +2019,34 @@ A chave pública é usada no computadores clientes para autenticar as requisiç x x - - seconds - segundos - Write to logging system of operating system Grave no sistema de registro do sistema operacional + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2375,6 +2379,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç %1 %2 have been queried successfully using the configured filter. %1 %2 foram consultados com sucesso usando o filtro configurado. + + LDAP directory + + LdapConfigurationPage @@ -2762,6 +2770,29 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3088,6 +3119,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Veyon Master + + Locations & computers + Locais e computadores + MasterConfigurationPage @@ -3279,6 +3314,31 @@ A chave pública é usada no computadores clientes para autenticar as requisiç + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Intervalo de atualização: + + + seconds + segundos + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Ativado + + NetworkObjectTreeModel @@ -3583,10 +3643,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Conectando %1 - Connected. Conectado. @@ -3599,6 +3655,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3795,39 +3855,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Servidor de exibição + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Servidor de exibição + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3957,13 +4021,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. Selecione pelo menos um computador para adicionar. - - Please select at least one computer to remove. - Selecione pelo menos um computador para remover. - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4231,13 +4291,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - Estabelecendo conexão para %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_pt_PT.ts b/translations/veyon_pt_PT.ts index 304192d54..ae6ecdec5 100644 --- a/translations/veyon_pt_PT.ts +++ b/translations/veyon_pt_PT.ts @@ -381,10 +381,6 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma AuthKeysConfigurationWidget - - Authentication keys - - Introduction @@ -726,6 +722,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -748,10 +748,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General Geral @@ -870,10 +866,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. @@ -890,6 +882,13 @@ The public key is used on client computers to authenticate incoming connection r Teste + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -924,10 +923,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -941,11 +936,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1256,6 +1255,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1384,17 +1391,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1984,18 +1980,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2033,11 +2017,31 @@ The public key is used on client computers to authenticate incoming connection r - seconds + Write to logging system of operating system - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2367,6 +2371,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2754,6 +2762,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3080,6 +3111,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3271,6 +3306,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3575,10 +3635,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - Ligando %1 - Connected. Ligado @@ -3591,6 +3647,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3787,39 +3847,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server - Internal VNC server + Miscellaneous network settings - Feature manager + Session mode - Demo server + Local session mode (single server instance for primary local session) - Miscellaneous network settings + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3949,13 +4013,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4223,13 +4283,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - - - WindowsPlatformConfiguration diff --git a/translations/veyon_ru.ts b/translations/veyon_ru.ts index 2f7f81d6e..b5112df66 100644 --- a/translations/veyon_ru.ts +++ b/translations/veyon_ru.ts @@ -381,10 +381,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - Ключи аутентификации - Introduction Вступление @@ -729,6 +725,10 @@ The public key is used on client computers to authenticate incoming connection r Key file Ключевой файл + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - LDAP аутентификация - General Главное @@ -873,10 +869,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - Методы аутентификации - Authentication is set up properly on this computer. На этом компьютере аутентификация установлена правильно. @@ -893,6 +885,13 @@ The public key is used on client computers to authenticate incoming connection r Тестировать + + BuiltinDirectoryConfiguration + + Builtin directory + Встроенный каталог + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory Встроенный каталог - - Locations & computers - Места и компьютеры - Locations Места @@ -943,14 +938,18 @@ The public key is used on client computers to authenticate incoming connection r Remove selected location Удалить выделенное место - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - Импорт файлов CSV можно выполнить с помощью интерфейса командной строки. Подробное описание можно найти в <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">интернет-документации</a>. - New location Новое место + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running Сервер Veyon недоступен или не запущен + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ The public key is used on client computers to authenticate incoming connection r Не удалось записать список компьютеров и пользователей в %1! Пожалуйста, проверьте права доступа к файлу. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - %1 - %2 Виджет масштабирования компьютера - - - %1 - %2 - %3 Computer Zoom Widget - %1 - %2 - %3 Виджет масштабирования компьютера - - ConfigCommands @@ -1987,18 +1983,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output Обычное журналирование - - Network object directory - Каталог сетевых объектов - - - Backend: - Бэкэнд: - - - Update interval: - Интервал обновления: - %1 service сервис %1 @@ -2035,14 +2019,34 @@ The public key is used on client computers to authenticate incoming connection r x x - - seconds - секунд - Write to logging system of operating system Записывать в журнал операционной системы + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2389,6 +2393,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. %1 %2 успешно опрошен с помощью настроенного фильтра. + + LDAP directory + + LdapConfigurationPage @@ -2776,6 +2784,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) Настроенный атрибут для имени пользователя для входа или имени хоста компьютера (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3100,7 +3131,11 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master - + Veyon Мастер + + + Locations & computers + Места и компьютеры @@ -3293,6 +3328,31 @@ The public key is used on client computers to authenticate incoming connection r В этом режиме вы можете наблюдать за всеми компьютерами в одном или нескольких местах. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Интервал обновления: + + + seconds + секунд + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Включено + + NetworkObjectTreeModel @@ -3599,10 +3659,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Соединение с %1 - Connected. Подключен. @@ -3615,6 +3671,10 @@ Please save your work and close all programs. Exit Выход + + Connecting... + + ScreenLockFeaturePlugin @@ -3811,18 +3871,6 @@ Typically this is required to support terminal servers. Maximum session count Максимальное количество сеансов - - Sessions - Сессии - - - Single session mode (create server instance for local/physical session only) - Режим одиночного сеанса (создание сервера только для локального / физического сеанса) - - - Multi session mode (create server instance for each local and remote desktop session) - Многосессионный режим (создание сервера для каждого сеанса локального и удаленного рабочего стола) - Network port numbers Номера сетевых портов @@ -3847,6 +3895,22 @@ Typically this is required to support terminal servers. Miscellaneous network settings Дополнительные настройки сети + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3974,15 +4038,10 @@ Typically this is required to support terminal servers. Please select at least one computer to add. Выберите хотя бы один компьютер для добавления. - - Please select at least one computer to remove. - Выберите хотя бы один компьютер для удаления. - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. - Добавьте компьютеры, щелкнув средней кнопкой мыши или нажав первую кнопку ниже. -Вторая кнопка удалит выбранный компьютер. Если ничего не выбрано, будет удален последний компьютер. +The second button removes the selected or last computer. + @@ -4249,13 +4308,6 @@ The second button will remove the selected computer. If nothing is selected the Сервис Veyon - - VncViewWidget - - Establishing connection to %1 ... - Восстановление соединения с %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_sl.ts b/translations/veyon_sl.ts index d5c96e775..abfa621eb 100644 --- a/translations/veyon_sl.ts +++ b/translations/veyon_sl.ts @@ -381,10 +381,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - Ključi preverjanja pristnosti - Introduction Uvod @@ -729,6 +725,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Key file Datoteka ključa + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti AuthLdapConfigurationWidget - - LDAP authentication - - General Splošno @@ -873,10 +869,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti AuthenticationPage - - Authentication methods - Načini overjanja - Authentication is set up properly on this computer. Preverjanje pristnosti je pravilno nastavljeno v tem računalniku. @@ -893,6 +885,13 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Preizkus + + BuiltinDirectoryConfiguration + + Builtin directory + Vgrajen imenik + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Builtin directory Vgrajen imenik - - Locations & computers - Lokacije in računalniki - Locations Lokacije @@ -943,14 +938,18 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Remove selected location Odstrani izbrano lokacijo - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - Uvoz CSV datotek je možen prek vmesnika ukazne vrstice. Za več informacij, glejte <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">spletna dokumentacija</a>. - New location Nova lokacija + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Računalnika in uporabnikov ni mogoče vpisati v seznam %1! Preverite dovoljenja za dostop do datotek. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Log to standard error output Dnevnik na standardni izhod za napako - - Network object directory - Imenik omrežnih objektov - - - Backend: - Ozadje: - - - Update interval: - Posodobi interval: - %1 service %1 storitev @@ -2035,14 +2019,34 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti x x - - seconds - sekund - Write to logging system of operating system Zapiši v sistem beleženja operacijskega sistema + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2389,6 +2393,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti %1 %2 have been queried successfully using the configured filter. %1 %2 je bilo uspešno vprašanih z uporabo nastavljenega filtra. + + LDAP directory + + LdapConfigurationPage @@ -2776,6 +2784,29 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Configured attribute for user login name or computer hostname (OpenLDAP) Konfiguriran atribut za uporabniško ime za prijavo ali ime gostitelja računalnika (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3100,7 +3131,11 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Veyon Master - + Veyon Master + + + Locations & computers + Lokacije in računalniki @@ -3293,6 +3328,31 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Ta način omogoča nadzor vseh računalnikov na eni ali več lokacijah. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Posodobi interval: + + + seconds + sekund + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3597,10 +3657,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Povezujem %1 - Connected. Povezan. @@ -3613,6 +3669,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3809,18 +3869,6 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Maximum session count - - Sessions - - - - Single session mode (create server instance for local/physical session only) - - - - Multi session mode (create server instance for each local and remote desktop session) - - Network port numbers @@ -3845,6 +3893,22 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Miscellaneous network settings + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3972,13 +4036,9 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4246,13 +4306,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon storitev - - VncViewWidget - - Establishing connection to %1 ... - Vzspostavljam povezavo na %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_sr.ts b/translations/veyon_sr.ts index 57c6005e9..a675c7045 100644 --- a/translations/veyon_sr.ts +++ b/translations/veyon_sr.ts @@ -381,10 +381,6 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili AuthKeysConfigurationWidget - - Authentication keys - Ključevi za autentifikaciju - Introduction Uvod @@ -729,6 +725,10 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Key file Datoteka ključa + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z AuthLdapConfigurationWidget - - LDAP authentication - - General Opšte @@ -875,10 +871,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u AuthenticationPage - - Authentication methods - Metoda provjere - Authentication is set up properly on this computer. Autentifikacija je na ovom računaru pravilno postavljena. @@ -895,6 +887,13 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Test + + BuiltinDirectoryConfiguration + + Builtin directory + Ugradjeni direktorijum + + BuiltinDirectoryConfigurationPage @@ -929,10 +928,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Builtin directory Ugradjeni direktorijum - - Locations & computers - Lokacije & računari - Locations Lokacije @@ -945,14 +940,18 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Remove selected location Ukloni obeleženu lokaciju - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - Uvoz CSV datoteka moguć je putem sistema komandne linije. Za više informacija pogledajte <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory"> online dokumentaciju </a>. - New location Nova lokacija + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1261,6 +1260,14 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1389,17 +1396,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Ne može se zapisati lista računara i korisnika na %1! Proverite dozvole za pristup datoteci. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1989,18 +1985,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Log to standard error output Prijavite se na standardni izlaz greške - - Network object directory - Mrežni direktorijum objekata - - - Backend: - Pozadina: - - - Update interval: - Ažuriraj interval: - %1 service %1 usluga @@ -2037,14 +2021,34 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u x x - - seconds - sekunde - Write to logging system of operating system Zapisati u sistem za prijavu operativnog sistema + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2391,6 +2395,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u %1 %2 have been queried successfully using the configured filter. %1 %2 uspešno je ispitan pomoću konfigurisanog filtera. + + LDAP directory + + LdapConfigurationPage @@ -2778,6 +2786,29 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Configured attribute for user login name or computer hostname (OpenLDAP) Konfigurisani atribut za korisničko ime za prijavu ili domaćin računara (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3102,7 +3133,11 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Veyon Master - + Veyon Master + + + Locations & computers + Lokacije & računari @@ -3295,6 +3330,31 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Ovaj način rada omogućuje vam praćenje svih računara na jednoj ili više lokacija. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Ažuriraj interval: + + + seconds + sekunde + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3601,10 +3661,6 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - Spajanje %1 - Connected. Spojen. @@ -3617,6 +3673,10 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Exit Izlaz + + Connecting... + + ScreenLockFeaturePlugin @@ -3813,18 +3873,6 @@ Obično je ovo zahtevano kao podrška trminal serverima. Maximum session count - - Sessions - - - - Single session mode (create server instance for local/physical session only) - - - - Multi session mode (create server instance for each local and remote desktop session) - - Network port numbers @@ -3849,6 +3897,22 @@ Obično je ovo zahtevano kao podrška trminal serverima. Miscellaneous network settings + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3976,13 +4040,9 @@ Obično je ovo zahtevano kao podrška trminal serverima. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4250,13 +4310,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon servis - - VncViewWidget - - Establishing connection to %1 ... - Uspostava konekcije prema %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_sv.ts b/translations/veyon_sv.ts index 06a34c344..217696e8b 100644 --- a/translations/veyon_sv.ts +++ b/translations/veyon_sv.ts @@ -381,10 +381,6 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an AuthKeysConfigurationWidget - - Authentication keys - - Introduction @@ -726,6 +722,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -748,10 +748,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General Allmänt @@ -870,10 +866,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - Autentiseringsmetoder - Authentication is set up properly on this computer. @@ -890,6 +882,13 @@ The public key is used on client computers to authenticate incoming connection r Test + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -924,10 +923,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - - Locations @@ -941,11 +936,15 @@ The public key is used on client computers to authenticate incoming connection r - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1256,6 +1255,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1384,17 +1391,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1984,18 +1980,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2033,11 +2017,31 @@ The public key is used on client computers to authenticate incoming connection r - seconds - sekunder + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2367,6 +2371,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2754,6 +2762,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3080,6 +3111,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3271,6 +3306,31 @@ The public key is used on client computers to authenticate incoming connection r + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + sekunder + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3575,10 +3635,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - Ansluter %1 - Connected. Ansluten. @@ -3591,6 +3647,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3787,39 +3847,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Demoserver + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Demoserver + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3949,13 +4013,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4223,13 +4283,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - Etablerar anslutning till %1... - - WindowsPlatformConfiguration diff --git a/translations/veyon_th.ts b/translations/veyon_th.ts index 321fdca05..37486516b 100644 --- a/translations/veyon_th.ts +++ b/translations/veyon_th.ts @@ -379,10 +379,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - - Introduction @@ -727,6 +723,10 @@ The public key is used on client computers to authenticate incoming connection r Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -749,10 +749,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - - General ทั่วไป @@ -871,10 +867,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. การยืนยันตัวตนถูกติดตั้งบนคอมพิวเตอร์ได้อย่างถูกต้องแล้ว @@ -891,6 +883,13 @@ The public key is used on client computers to authenticate incoming connection r ทดสอบ + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -925,10 +924,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - - Locations & computers - สถานที่และคอมพิวเตอร์ - Locations สถานที่ @@ -942,12 +937,16 @@ The public key is used on client computers to authenticate incoming connection r ลบสถานที่ที่เลือก - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location + สถานที่ใหม่ + + + Directory name - New location - สถานที่ใหม่ + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + @@ -1257,6 +1256,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1385,17 +1392,6 @@ The public key is used on client computers to authenticate incoming connection r - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1985,18 +1981,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2034,11 +2018,31 @@ The public key is used on client computers to authenticate incoming connection r x - seconds - วินาที + Write to logging system of operating system + - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2368,6 +2372,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2755,6 +2763,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3081,6 +3112,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + สถานที่และคอมพิวเตอร์ + MasterConfigurationPage @@ -3272,6 +3307,31 @@ The public key is used on client computers to authenticate incoming connection r โหมดนี้จะให้คุณได้สังเกตการณ์คอมพิวเตอร์ทุกเครื่องจากสถานที่ใดสถานที่หนึ่งหรือมากกว่านั้น + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + วินาที + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3577,10 +3637,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - กำลังเชื่อมต่อ %1 - Connected. เชื่อมต่อแล้ว @@ -3593,6 +3649,10 @@ Please save your work and close all programs. Exit ออก + + Connecting... + + ScreenLockFeaturePlugin @@ -3789,39 +3849,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + เซิฟเวอร์สาธิต + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - เซิฟเวอร์สาธิต + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3951,13 +4015,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4225,13 +4285,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon Service - - VncViewWidget - - Establishing connection to %1 ... - กำลังสร้างการเชื่อมต่อไปยัง %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_tr.ts b/translations/veyon_tr.ts index b15e041f9..380ca6fda 100644 --- a/translations/veyon_tr.ts +++ b/translations/veyon_tr.ts @@ -381,10 +381,6 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v AuthKeysConfigurationWidget - - Authentication keys - Yetkilendirme anahtarları - Introduction Giriş @@ -729,6 +725,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Key file Anahtar dosya + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do AuthLdapConfigurationWidget - - LDAP authentication - LDAP kimlik doğrulaması - General Genel @@ -873,10 +869,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do AuthenticationPage - - Authentication methods - Yetkilendirme yöntemleri - Authentication is set up properly on this computer. Kimlik doğrulama bu bilgisayarda doğru şekilde ayarlandı. @@ -893,6 +885,13 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Sına + + BuiltinDirectoryConfiguration + + Builtin directory + Yerleşik dizin + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Builtin directory Yerleşik dizin - - Locations & computers - Konumlar ve bilgisayarlar - Locations Konumlar @@ -943,14 +938,18 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Remove selected location Seçilen konumu sil - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - CSV dosyalarının içe aktarılması, komut satırı arayüzü üzerinden mümkündür. Daha fazla bilgi için <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory"> çevrimiçi belgelere </a> bakın. - New location Yeni konum + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Bilgisayar ve kullanıcı listesi %1 konumuna yazılamadı! Lütfen dosya erişim izinlerini gözden geçirin. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Log to standard error output Standart hata çıktısına günlükle - - Network object directory - Ağ nesnesi dizini - - - Backend: - Arka uç: - - - Update interval: - Güncelleme aralığı: - %1 service %1 hizmeti @@ -2035,14 +2019,34 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do x x - - seconds - saniye - Write to logging system of operating system İşletim sisteminin günlükleme sistemine yaz + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2381,6 +2385,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do %1 %2 have been queried successfully using the configured filter. Yapılandırılmış süzgeç kullanılarak %1 %2 başarıyla sorgulandı. + + LDAP directory + + LdapConfigurationPage @@ -2768,6 +2776,29 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3092,7 +3123,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Veyon Master - + Veyon Usta + + + Locations & computers + Konumlar ve bilgisayarlar @@ -3285,6 +3320,31 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Bu mod, bir veya daha fazla konumdaki tüm bilgisayarları izlemenizi sağlar. + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Güncelleme aralığı: + + + seconds + saniye + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Aktif edildi + + NetworkObjectTreeModel @@ -3591,10 +3651,6 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - %1 bağlanıyor - Connected. Bağlandı. @@ -3607,6 +3663,10 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.Exit Çıkış + + Connecting... + + ScreenLockFeaturePlugin @@ -3804,39 +3864,43 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + Tanıtım sunucusu + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - Tanıtım sunucusu + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3966,13 +4030,9 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4240,13 +4300,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon Hizmeti - - VncViewWidget - - Establishing connection to %1 ... - %1 ile bağlantı kuruluyor... - - WindowsPlatformConfiguration diff --git a/translations/veyon_uk.ts b/translations/veyon_uk.ts index c38300a17..2ed0fcbf8 100644 --- a/translations/veyon_uk.ts +++ b/translations/veyon_uk.ts @@ -381,10 +381,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - Ключі розпізнавання - Introduction Вступ @@ -726,6 +722,10 @@ The public key is used on client computers to authenticate incoming connection r Key file Файл ключа + + Please specify the key name (e.g. "teacher/public") as the first argument. + Будь ласка, вкажіть назву ключа (наприклад «teacher/public») першим аргументом. + AuthKeysTableModel @@ -748,10 +748,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - Розпізнавання у LDAP - General Загальні @@ -870,10 +866,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - Способи розпізнавання - Authentication is set up properly on this computer. На цьому комп'ютері належним чином налаштовано розпізнавання. @@ -890,6 +882,13 @@ The public key is used on client computers to authenticate incoming connection r Перевірити + + BuiltinDirectoryConfiguration + + Builtin directory + Вбудований каталог + + BuiltinDirectoryConfigurationPage @@ -924,10 +923,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory Вбудований каталог - - Locations & computers - Місця і комп'ютери - Locations Місця @@ -940,14 +935,18 @@ The public key is used on client computers to authenticate incoming connection r Remove selected location Вилучити позначене місце - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - Імпортування файлів CSV можна виконати за допомогою інтерфейсу командного рядка. Докладніший опис можна знайти у <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">інтернет-документації</a>. - New location Нове місце + + Directory name + Назва каталогу + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + Імпортування файлів CSV можна виконати за допомогою інтерфейсу командного рядка. Докладніший опис можна знайти у <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">інтернет-документації</a>. + BuiltinDirectoryPlugin @@ -1256,6 +1255,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running Сервер Veyon є недоступним або сервер не запущено + + Name: %1 + Назва: %1 + + + invalid + некоректний + ComputerControlServer @@ -1384,17 +1391,6 @@ The public key is used on client computers to authenticate incoming connection r Не вдалося записати список комп’ютерів і користувачів до %1! Будь ласка, перевірте, чи є у вас належні права для доступу до цього файла. - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - %1 — віджет масштабування комп'ютерів %2 - - - %1 - %2 - %3 Computer Zoom Widget - %1 — %2 — віджет масштабування комп'ютерів %3 - - ConfigCommands @@ -1984,18 +1980,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output Виводити повідомлення до стандартного виводу помилок - - Network object directory - Каталог мережевих об’єктів - - - Backend: - Модуль: - - - Update interval: - Інтервал оновлення: - %1 service Служба %1 @@ -2032,14 +2016,34 @@ The public key is used on client computers to authenticate incoming connection r x x - - seconds - секунд - Write to logging system of operating system Записувати до журналу операційної системи + + TLS configuration + Налаштування TLS + + + Use certificate authority for TLS connections + Використовувати службу сертифікації для з'єднань TLS + + + CA certificate file + Файл сертифіката CA + + + ... + ... + + + Host certificate file + Файл сертифіката вузла + + + Host private key file + Файл закритого ключа вузла + HeadlessVncServer @@ -2388,6 +2392,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. %1 %2 було успішно опитано за допомогою налаштованого фільтра. + + LDAP directory + Каталог LDAP + LdapConfigurationPage @@ -2775,6 +2783,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) Налаштований атрибут для імені користувача або назви вузла комп’ютера (OpenLDAP) + + Directory name + Назва каталогу + + + Query options + Параметри запиту + + + Query nested user groups (supported by AD only) + Опитати вкладені групи користувачів (лише для AD) + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + Будь ласка, скористайтеся загальною сторінкою налаштувань LDAP для налаштовування способу отримання даних щодо розташування та комп'ютерів з вашої служби каталогів на основі LDAP. + LdapPlugin @@ -3099,7 +3130,11 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master - + Головний комп'ютер Veyon (Veyon Master) + + + Locations & computers + Місця і комп'ютери @@ -3292,6 +3327,31 @@ The public key is used on client computers to authenticate incoming connection r У цьому режимі ви можете спостерігати за усіма комп'ютерами у одному або декількох місцях. + + NestedNetworkObjectDirectory + + All directories + Усі каталоги + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + Інтервал оновлення: + + + seconds + секунд + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + Увімкнено + + NetworkObjectTreeModel @@ -3598,10 +3658,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - З’єднання з %1 - Connected. З’єднано. @@ -3614,6 +3670,10 @@ Please save your work and close all programs. Exit Вийти + + Connecting... + + ScreenLockFeaturePlugin @@ -3810,18 +3870,6 @@ Typically this is required to support terminal servers. Maximum session count Максимальна кількість сеансів - - Sessions - Сеанси - - - Single session mode (create server instance for local/physical session only) - Режим єдиного сеансу (створювати екземпляр сервера лише для локального/фізичного сеансу) - - - Multi session mode (create server instance for each local and remote desktop session) - Режим із багатьма сеансами (створювати екземпляр сервера для кожного локального і віддаленого сеансу) - Network port numbers Номери портів мережі @@ -3846,6 +3894,22 @@ Typically this is required to support terminal servers. Miscellaneous network settings Різноманітні параметри мережі + + Session mode + Режим сеансу + + + Local session mode (single server instance for primary local session) + Режим локального сеансу (один екземпляр сервера для основного локального сеансу) + + + Active session mode (single server instance for active local or remote session) + Режим активного сеансу (один екземпляр сервера для активного локального або віддаленого сеансу) + + + Multi session mode (distinct server instance for each local and remote desktop session) + Режим багатьох сеансів (окремий екземпляр сервера для кожного локального і віддаленого стільничного сеансу) + ServiceControl @@ -3973,15 +4037,11 @@ Typically this is required to support terminal servers. Please select at least one computer to add. Будь ласка, позначте принаймні один комп'ютер для додавання. - - Please select at least one computer to remove. - Будь ласка, позначте принаймні один комп'ютер для вилучення. - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. Додайте комп'ютери клацанням середньої кнопки миші або натисканням першої кнопки нижче. -Другу кнопку призначено для вилучення позначеного комп'ютера. Якщо нічого не позначено, буде вилучено останній з комп'ютерів. +Другу кнопку призначено для вилучення позначеного або останнього запису комп'ютера. @@ -4248,13 +4308,6 @@ The second button will remove the selected computer. If nothing is selected the Служба Veyon - - VncViewWidget - - Establishing connection to %1 ... - Встановлення зв’язку з %1 ... - - WindowsPlatformConfiguration diff --git a/translations/veyon_vi.ts b/translations/veyon_vi.ts index a121c17a0..df9e9edbe 100644 --- a/translations/veyon_vi.ts +++ b/translations/veyon_vi.ts @@ -381,10 +381,6 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa AuthKeysConfigurationWidget - - Authentication keys - Khóa xác thực - Introduction Giới thiệu @@ -729,6 +725,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Key file + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -751,10 +751,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực AuthLdapConfigurationWidget - - LDAP authentication - - General Chung @@ -873,10 +869,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực AuthenticationPage - - Authentication methods - - Authentication is set up properly on this computer. @@ -893,6 +885,13 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Kiểm tra + + BuiltinDirectoryConfiguration + + Builtin directory + + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Builtin directory - - Locations & computers - - Locations @@ -944,11 +939,15 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + New location - New location + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1259,6 +1258,14 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1387,17 +1394,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1987,18 +1983,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Log to standard error output - - Network object directory - - - - Backend: - - - - Update interval: - - %1 service @@ -2036,11 +2020,31 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - seconds + Write to logging system of operating system - Write to logging system of operating system + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file @@ -2370,6 +2374,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực %1 %2 have been queried successfully using the configured filter. + + LDAP directory + + LdapConfigurationPage @@ -2757,6 +2765,29 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Configured attribute for user login name or computer hostname (OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3083,6 +3114,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Veyon Master + + Locations & computers + + MasterConfigurationPage @@ -3274,6 +3309,31 @@ Khóa công được sử dụng trên các máy tính khách để xác thực + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + + + + seconds + + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + + + NetworkObjectTreeModel @@ -3578,10 +3638,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 - - Connecting %1 - - Connected. @@ -3594,6 +3650,10 @@ Please save your work and close all programs. Exit + + Connecting... + + ScreenLockFeaturePlugin @@ -3790,39 +3850,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server - Internal VNC server + Miscellaneous network settings - Feature manager + Session mode - Demo server + Local session mode (single server instance for primary local session) - Miscellaneous network settings + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3952,13 +4016,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4226,13 +4286,6 @@ The second button will remove the selected computer. If nothing is selected the - - VncViewWidget - - Establishing connection to %1 ... - - - WindowsPlatformConfiguration diff --git a/translations/veyon_zh_CN.ts b/translations/veyon_zh_CN.ts index 29e59a396..0dbd96bf7 100644 --- a/translations/veyon_zh_CN.ts +++ b/translations/veyon_zh_CN.ts @@ -217,35 +217,35 @@ If you're interested in translating Veyon into your local or another langua Accessing computer and local computer - + 正在访问计算机和本地计算机 User being accessed - + 使用者正在访问 is logged in locally - + 本地登录 is logged in remotely - + 远程登录 No user is logged in locally - + 没有用户本地登录 One or multiple users are logged in locally - + 一个或多个用户本地登录 No user is logged in remotely - + 没有用户远程登录 One or multiple users are logged in remotely - + 一个或多个用户远程登录 is located at @@ -253,15 +253,15 @@ If you're interested in translating Veyon into your local or another langua is not located at - + 没有位于 are located at the same location - + 位于同一位置 are not located the same location - + 位于不同位置 is member of group @@ -269,59 +269,59 @@ If you're interested in translating Veyon into your local or another langua is not member of group - + 不是组成员 is authenticated via - + 身份验证通过 is not authenticated via - + 未身份验证通过 has one or more groups in common with user being accessed - + 有一个或多个公共组的用户正在访问 has no groups in common with user being accessed - + 没有公共组的用户正在访问 equals user being accessed - + 等于用户正在访问 is different from user being accessed - + 不同于用户被访问 is already connected - + 已连接 is not connected - + 未连接 is local computer - + 是本地计算机 is not local computer - + 不是本地计算机 Computer being accessed - + 计算机正在被访问 Session being accessed is a user session - + 正在被访问的会话是用户会话 Session being accessed is a login screen - + 正在被访问的会话是登录界面 @@ -381,10 +381,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - 验证密钥 - Introduction 介绍 @@ -730,6 +726,10 @@ The public key is used on client computers to authenticate incoming connection r Key file 密钥文件 + + Please specify the key name (e.g. "teacher/public") as the first argument. + + AuthKeysTableModel @@ -752,10 +752,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - LDAP验证 - General 常规 @@ -874,10 +870,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - 验证模式 - Authentication is set up properly on this computer. 身份验证已在此计算机上正确配置。 @@ -894,6 +886,13 @@ The public key is used on client computers to authenticate incoming connection r 测试 + + BuiltinDirectoryConfiguration + + Builtin directory + 内置目录 + + BuiltinDirectoryConfigurationPage @@ -928,10 +927,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory 内置目录 - - Locations & computers - 地点及计算机 - Locations 地点 @@ -944,14 +939,18 @@ The public key is used on client computers to authenticate incoming connection r Remove selected location 移除选中的地点 - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - 通过命令行界面可导入CSV文件。更多信息,请参看<a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">在线文档</a>。 - New location 新地点 + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1260,6 +1259,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running + + Name: %1 + + + + invalid + + ComputerControlServer @@ -1388,17 +1395,6 @@ The public key is used on client computers to authenticate incoming connection r 无法将计算机和用户列表写入 %1!请检查文件访问权限。 - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - - - - %1 - %2 - %3 Computer Zoom Widget - - - ConfigCommands @@ -1988,18 +1984,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output 日志显示于标准输出设备(显示器) - - Network object directory - 网络对象文件夹 - - - Backend: - 后端: - - - Update interval: - 更新频率: - %1 service %1 服务 @@ -2036,14 +2020,34 @@ The public key is used on client computers to authenticate incoming connection r x x - - seconds - - Write to logging system of operating system 写入操作系统的日志记录系统 + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2390,6 +2394,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. %1 %2 使用配置的过滤器成功查询。 + + LDAP directory + + LdapConfigurationPage @@ -2777,6 +2785,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) 用户登录名或计算机主机名的配置属性(OpenLDAP) + + Directory name + + + + Query options + + + + Query nested user groups (supported by AD only) + + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -3103,6 +3134,10 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master + + Locations & computers + 地点及计算机 + MasterConfigurationPage @@ -3294,6 +3329,31 @@ The public key is used on client computers to authenticate incoming connection r 此模式允许您在一个或多个地点监控所有计算机。 + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + 更新频率: + + + seconds + + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + 已启用 + + NetworkObjectTreeModel @@ -3600,10 +3660,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - 正在连接 %1 - Connected. 已连接。 @@ -3616,6 +3672,10 @@ Please save your work and close all programs. Exit 退出 + + Connecting... + + ScreenLockFeaturePlugin @@ -3813,39 +3873,43 @@ Typically this is required to support terminal servers. - Sessions + Network port numbers - Single session mode (create server instance for local/physical session only) + Veyon server - Multi session mode (create server instance for each local and remote desktop session) + Internal VNC server - Network port numbers + Feature manager - Veyon server + Demo server + 演示服务 + + + Miscellaneous network settings - Internal VNC server + Session mode - Feature manager + Local session mode (single server instance for primary local session) - Demo server - 演示服务 + Active session mode (single server instance for active local or remote session) + - Miscellaneous network settings + Multi session mode (distinct server instance for each local and remote desktop session) @@ -3975,13 +4039,9 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - - Please select at least one computer to remove. - - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. +The second button removes the selected or last computer. @@ -4249,13 +4309,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon 服务 - - VncViewWidget - - Establishing connection to %1 ... - 正在建立到 %1 的连接... - - WindowsPlatformConfiguration diff --git a/translations/veyon_zh_TW.ts b/translations/veyon_zh_TW.ts index 0fc245205..7bf7c01a1 100644 --- a/translations/veyon_zh_TW.ts +++ b/translations/veyon_zh_TW.ts @@ -217,35 +217,35 @@ If you're interested in translating Veyon into your local or another langua Accessing computer and local computer - + 存取電腦和本機電腦 User being accessed - + 使用者正在存取 is logged in locally - + 本機登入 is logged in remotely - + 遠端登入 No user is logged in locally - + 沒有使用者本機登入 One or multiple users are logged in locally - + 一個或多個使用者本機登入 No user is logged in remotely - + 沒有使用者遠端登入 One or multiple users are logged in remotely - + 一個或多個使用者遠端登入 is located at @@ -253,15 +253,15 @@ If you're interested in translating Veyon into your local or another langua is not located at - + 沒有位於 are located at the same location - + 位於同一位置 are not located the same location - + 位於不同位置 is member of group @@ -269,59 +269,59 @@ If you're interested in translating Veyon into your local or another langua is not member of group - + 不是群組成員 is authenticated via - + 身份驗證透過 is not authenticated via - + 未身份驗證透過 has one or more groups in common with user being accessed - + 有一個或多個通用中群組的使用者正在存取 has no groups in common with user being accessed - + 沒有通用中群組的使用者正在存取 equals user being accessed - + 等於使用者正在存取 is different from user being accessed - + 不同的使用者正在存取 is already connected - + 已經連接 is not connected - + 未連接 is local computer - + 是本機電腦 is not local computer - + 不是本機電腦 Computer being accessed - + 電腦正在存取 Session being accessed is a user session - + 正在存取的工作階段是使用者工作階段 Session being accessed is a login screen - + 正在存取的工作階段是登入畫面 @@ -381,10 +381,6 @@ If you're interested in translating Veyon into your local or another langua AuthKeysConfigurationWidget - - Authentication keys - 身份驗證金鑰 - Introduction 介紹 @@ -729,6 +725,10 @@ The public key is used on client computers to authenticate incoming connection r Key file 金鑰檔 + + Please specify the key name (e.g. "teacher/public") as the first argument. + 請指定金鑰名稱 (例如: "teacher/public") 作為第一個引數。 + AuthKeysTableModel @@ -751,10 +751,6 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapConfigurationWidget - - LDAP authentication - LDAP 身份驗證 - General 一般 @@ -873,10 +869,6 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPage - - Authentication methods - 身份驗證方法 - Authentication is set up properly on this computer. 在這部電腦中正確設定身份驗證。 @@ -893,6 +885,13 @@ The public key is used on client computers to authenticate incoming connection r 測試 + + BuiltinDirectoryConfiguration + + Builtin directory + 內建目錄 + + BuiltinDirectoryConfigurationPage @@ -927,10 +926,6 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory 內建目錄 - - Locations & computers - 位置 & 電腦 - Locations 位置 @@ -943,14 +938,18 @@ The public key is used on client computers to authenticate incoming connection r Remove selected location 移除選取的位置 - - The import of CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - 可以通過命令列介面匯入 CSV 檔。 有關詳細資訊,請參閱 <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">線上文件</a>。 - New location 新位置 + + Directory name + + + + Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. + + BuiltinDirectoryPlugin @@ -1259,6 +1258,14 @@ The public key is used on client computers to authenticate incoming connection r Veyon Server unreachable or not running Veyon 伺服器無法存取或未執行 + + Name: %1 + + + + invalid + 無效 + ComputerControlServer @@ -1387,17 +1394,6 @@ The public key is used on client computers to authenticate incoming connection r 無法寫入電腦和使用者清單到 %1! 請檢查檔案的存取權限。 - - ComputerZoomWidget - - %1 - %2 Computer Zoom Widget - %1 - %2 電腦縮放小工具 - - - %1 - %2 - %3 Computer Zoom Widget - %1 - %2 - %3 電腦縮放小工具 - - ConfigCommands @@ -1672,27 +1668,27 @@ The public key is used on client computers to authenticate incoming connection r Applications & websites - + 應用程式 & 網站 Predefined applications - + 預先定義應用程式 Add new application - + 新增應用程式 Remove selected application - + 移除選取的應用程式 Add new website - + 新增網站 New application - + 新應用程式 @@ -1715,23 +1711,23 @@ The public key is used on client computers to authenticate incoming connection r Start application - + 啟動應用程式 Click this button to start an application on all computers. - + 按一下這個按鈕以在所有電腦啟動一個應用程式。 Start application "%1" - + 啟動應用程式 "%1" Custom application - + 自訂應用程式 Start apps and open websites in user sessions - + 啟動應用程式和開啟網站在使用者工作階段 @@ -1778,7 +1774,7 @@ The public key is used on client computers to authenticate incoming connection r Custom application - + 自訂應用程式 @@ -1987,18 +1983,6 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output 紀錄到標準錯誤輸出 - - Network object directory - 網路物件目錄 - - - Backend: - 後端: - - - Update interval: - 更新間隔: - %1 service %1 服務 @@ -2035,14 +2019,34 @@ The public key is used on client computers to authenticate incoming connection r x x - - seconds - - Write to logging system of operating system 寫入到作業系統的記錄系統 + + TLS configuration + + + + Use certificate authority for TLS connections + + + + CA certificate file + + + + ... + ... + + + Host certificate file + + + + Host private key file + + HeadlessVncServer @@ -2389,6 +2393,10 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully using the configured filter. %1 %2 使用組態的篩選器查詢成功。 + + LDAP directory + + LdapConfigurationPage @@ -2776,6 +2784,29 @@ The public key is used on client computers to authenticate incoming connection r Configured attribute for user login name or computer hostname (OpenLDAP) 為使用者登入名稱或電腦主機名稱組態的屬性 (OpenLDAP) + + Directory name + + + + Query options + 查詢選項 + + + Query nested user groups (supported by AD only) + 查詢巢狀使用者群組 (只有 AD 支援) + + + + LdapNetworkObjectDirectoryConfigurationPage + + LDAP + LDAP + + + Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. + + LdapPlugin @@ -2852,11 +2883,11 @@ The public key is used on client computers to authenticate incoming connection r User sessions - + 使用者工作階段 Minimum session lifetime before server start - + 伺服器啟動前的最小工作階段長度 User login @@ -3100,7 +3131,11 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master - + Veyon Master + + + Locations & computers + 位置 & 電腦 @@ -3293,6 +3328,31 @@ The public key is used on client computers to authenticate incoming connection r 這個模式允許您監視在一個或數個位置的所有電腦。 + + NestedNetworkObjectDirectory + + All directories + + + + + NetworkObjectDirectoryConfigurationPage + + Update interval: + 更新間隔: + + + seconds + + + + + NetworkObjectDirectoryConfigurationPageTab + + Enabled + 啟用 + + NetworkObjectTreeModel @@ -3328,7 +3388,7 @@ The public key is used on client computers to authenticate incoming connection r Website name - + 網站名稱 @@ -3462,15 +3522,15 @@ Please save your work and close all programs. Do you really want to reboot <b>ALL</b> computers? - + 您真的要重新啟動 <b>所有的</b> 電腦? Do you really want to power down <b>ALL</b> computers? - + 您真的要關閉 <b>所有的</b> 電腦? Do you really want to power down the selected computers? - + 您真的要關閉選取的電腦? @@ -3599,10 +3659,6 @@ Please save your work and close all programs. Alt+Ctrl+F1 Alt+Ctrl+F1 - - Connecting %1 - 正在連線 %1 - Connected. 已連線。 @@ -3615,6 +3671,10 @@ Please save your work and close all programs. Exit 結束 + + Connecting... + + ScreenLockFeaturePlugin @@ -3811,18 +3871,6 @@ Typically this is required to support terminal servers. Maximum session count 最大工作階段數 - - Sessions - 工作階段 - - - Single session mode (create server instance for local/physical session only) - 單一工作階段模式 (只為本地端/實體工作階段建立伺服器實例) - - - Multi session mode (create server instance for each local and remote desktop session) - 多工作階段模式 (為每個本地端與遠端桌面工作階段建立伺服器實例) - Network port numbers 網路埠號 @@ -3847,6 +3895,22 @@ Typically this is required to support terminal servers. Miscellaneous network settings 其它網路設定 + + Session mode + + + + Local session mode (single server instance for primary local session) + + + + Active session mode (single server instance for active local or remote session) + + + + Multi session mode (distinct server instance for each local and remote desktop session) + + ServiceControl @@ -3974,26 +4038,21 @@ Typically this is required to support terminal servers. Please select at least one computer to add. 請選擇至少一台電腦來加入。 - - Please select at least one computer to remove. - 請選擇至少一台電腦來移除。 - Add computers by clicking with the middle mouse button or clicking the first button below. -The second button will remove the selected computer. If nothing is selected the last one will be removed. - 使用按一下滑鼠中鍵或按一下以下的第一個按鈕來加入電腦。 -第二個按鈕將移除選取的電腦。 如果未選取任何內容,則將移除最後一個。 +The second button removes the selected or last computer. + StartAppDialog Start application - + 啟動應用程式 Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + 請輸入應用程式以在選取的電腦啟動。 您可以以行分隔多個應用程式。 e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" @@ -4001,11 +4060,11 @@ The second button will remove the selected computer. If nothing is selected the Remember and add to application menu - + 記住並加入到應用程式功能表 Application name - + 應用程式名稱 Name: @@ -4053,7 +4112,7 @@ The second button will remove the selected computer. If nothing is selected the Please enter your message which send to all selected users. - + 請輸入您要傳送給所有選取使用者的訊息。 @@ -4168,7 +4227,7 @@ The second button will remove the selected computer. If nothing is selected the Do you really want to log off <b>ALL</b> users? - + 您真的要登出 <b>所有的</b> 使用者? @@ -4249,13 +4308,6 @@ The second button will remove the selected computer. If nothing is selected the Veyon 服務 - - VncViewWidget - - Establishing connection to %1 ... - 正在建立與 %1 連線... - - WindowsPlatformConfiguration From 2937bb71408e19d8d7a1693c2c3f446218bcb619 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Sep 2021 09:25:49 +0200 Subject: [PATCH 1076/1765] DesktopServicesFeaturePlugin: fix argument name Since multiple website URLs can be passed as string list, correctly identify the argument as WebsiteUrls. --- .../desktopservices/DesktopServicesFeaturePlugin.cpp | 10 +++++----- plugins/desktopservices/DesktopServicesFeaturePlugin.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index a13d04f61..b6601f647 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -102,10 +102,10 @@ bool DesktopServicesFeaturePlugin::controlFeature( Feature::Uid featureUid, Oper if( featureUid == m_openWebsiteFeature.uid() ) { - const auto websites = arguments.value( argToString(Argument::WebsiteUrl) ).toStringList(); + const auto websites = arguments.value( argToString(Argument::WebsiteUrls) ).toStringList(); sendFeatureMessage( FeatureMessage{ featureUid, FeatureMessage::DefaultCommand } - .addArgument( Argument::WebsiteUrl, websites ), + .addArgument( Argument::WebsiteUrls, websites ), computerControlInterfaces ); return true; @@ -136,7 +136,7 @@ bool DesktopServicesFeaturePlugin::startFeature( VeyonMasterInterface& master, c else if( m_predefinedWebsitesFeatures.contains( feature ) ) { sendFeatureMessage( FeatureMessage( m_openWebsiteFeature.uid(), FeatureMessage::DefaultCommand ). - addArgument( Argument::WebsiteUrl, predefinedServicePath( feature.uid() ) ), computerControlInterfaces ); + addArgument( Argument::WebsiteUrls, predefinedServicePath( feature.uid() ) ), computerControlInterfaces ); } else @@ -184,7 +184,7 @@ bool DesktopServicesFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& w if( message.featureUid() == m_openWebsiteFeature.uid() ) { - openWebsite( message.argument( Argument::WebsiteUrl ).toString() ); + openWebsite( message.argument( Argument::WebsiteUrls ).toString() ); return true; } @@ -367,7 +367,7 @@ void DesktopServicesFeaturePlugin::openWebsite( const QString& website, const QS const ComputerControlInterfaceList& computerControlInterfaces ) { controlFeature( m_openWebsiteFeature.uid(), Operation::Start, - { { argToString(Argument::WebsiteUrl), website } }, + { { argToString(Argument::WebsiteUrls), website } }, computerControlInterfaces ); if( saveItemName.isEmpty() == false ) diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index e99e4feee..43ba2bd89 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -42,7 +42,7 @@ class DesktopServicesFeaturePlugin : public QObject, PluginInterface, enum class Argument { Applications, - WebsiteUrl + WebsiteUrls }; Q_ENUM(Argument) From 20afa84b13717c1c865d6b449295ed0dd56c04b3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Sep 2021 09:36:04 +0200 Subject: [PATCH 1077/1765] DesktopServicesFeaturePlugin: treat 1.2 as upgraded Veyon 4.6 already uses the new naming scheme. --- plugins/desktopservices/DesktopServicesFeaturePlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index b6601f647..55fd3bcfb 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -72,7 +72,7 @@ DesktopServicesFeaturePlugin::DesktopServicesFeaturePlugin( QObject* parent ) : void DesktopServicesFeaturePlugin::upgrade(const QVersionNumber& oldVersion) { - if( oldVersion < QVersionNumber( 2, 0 ) && + if( oldVersion < QVersionNumber( 1, 2 ) && m_configuration.legacyPredefinedPrograms().isEmpty() == false ) { m_configuration.setPredefinedApplications( m_configuration.legacyPredefinedPrograms() ); From d7c199b0f6b71cdb73c2fda4235864f342a1e727 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Sep 2021 10:09:30 +0200 Subject: [PATCH 1078/1765] CMake: fix indentation + various clean ups --- CMakeLists.txt | 68 +-- cmake/CPackDefinitions.cmake | 50 +-- cmake/modules/ConfigureFiles.cmake | 2 +- cmake/modules/FindQtTranslations.cmake | 4 +- cmake/modules/LibVNCServerIntegration.cmake | 12 +- .../modules/SetDefaultTargetProperties.cmake | 3 +- cmake/modules/WindowsBuildHelpers.cmake | 16 +- cmake/modules/XdgInstall.cmake | 2 +- configurator/CMakeLists.txt | 2 +- core/CMakeLists.txt | 28 +- plugins/CMakeLists.txt | 6 +- plugins/authkeys/CMakeLists.txt | 2 +- plugins/authlogon/CMakeLists.txt | 2 +- plugins/authsimple/CMakeLists.txt | 2 +- plugins/builtindirectory/CMakeLists.txt | 2 +- plugins/demo/CMakeLists.txt | 4 +- plugins/desktopservices/CMakeLists.txt | 3 +- plugins/filetransfer/CMakeLists.txt | 2 +- plugins/ldap/CMakeLists.txt | 2 +- plugins/ldap/common/CMakeLists.txt | 2 +- plugins/ldap/kldap/CMakeLists.txt | 4 +- plugins/platform/CMakeLists.txt | 4 +- plugins/platform/linux/CMakeLists.txt | 12 +- plugins/platform/windows/CMakeLists.txt | 4 +- plugins/powercontrol/CMakeLists.txt | 2 +- plugins/remoteaccess/CMakeLists.txt | 3 +- plugins/screenshot/CMakeLists.txt | 2 +- plugins/servicecontrol/CMakeLists.txt | 2 +- plugins/systemusergroups/CMakeLists.txt | 2 +- plugins/testing/CMakeLists.txt | 2 +- plugins/textmessage/CMakeLists.txt | 3 +- plugins/usersessioncontrol/CMakeLists.txt | 3 +- plugins/vncserver/CMakeLists.txt | 4 +- plugins/vncserver/external/CMakeLists.txt | 3 +- plugins/vncserver/headless/CMakeLists.txt | 15 +- .../vncserver/ultravnc-builtin/CMakeLists.txt | 2 +- .../vncserver/x11vnc-builtin/CMakeLists.txt | 424 +++++++++--------- service/CMakeLists.txt | 1 - 38 files changed, 349 insertions(+), 357 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 98360ce7d..820b35ae3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,19 +47,19 @@ find_package(Git) if(GIT_FOUND) execute_process(COMMAND "${GIT_EXECUTABLE}" describe --tags - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_VARIABLE VERSION_STRING) + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE VERSION_STRING) string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" VERSION_MAJOR "${VERSION_STRING}") string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${VERSION_STRING}") string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${VERSION_STRING}") # determine build number to use in NSIS installer and resource files execute_process(COMMAND "${GIT_EXECUTABLE}" describe --tags - COMMAND cut -d "-" -f2 - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_VARIABLE VERSION_BUILD) + COMMAND cut -d "-" -f2 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE VERSION_BUILD) if(NOT VERSION_BUILD GREATER 0) set(VERSION_BUILD 0) endif() @@ -72,11 +72,11 @@ if(GIT_FOUND) set(CONTRIBUTORS "${CMAKE_BINARY_DIR}/CONTRIBUTORS") if(NOT EXISTS "${CONTRIBUTORS}") execute_process(COMMAND "${GIT_EXECUTABLE}" shortlog -s d160d147165271516589c304cb1b8f5e48f8527d..HEAD - COMMAND cut -c8- - COMMAND sort -f - OUTPUT_FILE "${CONTRIBUTORS}" - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - TIMEOUT 10) + COMMAND cut -c8- + COMMAND sort -f + OUTPUT_FILE "${CONTRIBUTORS}" + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + TIMEOUT 10) endif() endif() @@ -197,8 +197,8 @@ elseif(WITH_UNITY_BUILD) endif() if(WITH_SANITIZERS) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fsanitize=undefined") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fsanitize=undefined") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fsanitize=undefined") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fsanitize=undefined") endif() set(VEYON_COMPILE_OPTIONS "-Wall;-Werror") @@ -210,7 +210,7 @@ set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) if(VEYON_BUILD_WIN32 OR VEYON_BUILD_WIN64) -set(WITH_LTO OFF) + set(WITH_LTO OFF) endif() if(WITH_MODEL_TESTERS) @@ -233,10 +233,10 @@ add_definitions( -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_USE_QSTRINGBUILDER -DQT_STRICT_ITERATORS -) + ) file(GLOB_RECURSE IN_FILES RELATIVE ${CMAKE_SOURCE_DIR} "veyonconfig.h.in" "*.rc.in" "*.desktop.in" "*.policy.in" "*.service.in" "*.manifest.in" "*.nsi.in") -CONFIGURE_FILES(${IN_FILES}) +configure_files(${IN_FILES}) set(CMAKE_AUTOMOC TRUE) set(CMAKE_AUTOUIC TRUE) @@ -262,14 +262,14 @@ if(VEYON_BUILD_ANDROID) set(ANDROID_EXTRA_LIBS) list(APPEND ANDROID_EXTRA_LIBS "${ANDROID_SYSROOT_GENERIC}/libc++_shared.so") list(APPEND ANDROID_EXTRA_LIBS "${QT_DIR}/lib/libldap.so" - "${QT_DIR}/lib/liblber.so" - "${QT_DIR}/lib/libsasl2.so") + "${QT_DIR}/lib/liblber.so" + "${QT_DIR}/lib/libsasl2.so") add_custom_target(prepare-apk COMMAND rm -rf ${ANDROID_INSTALL_DIR} COMMAND cd ${CMAKE_BINARY_DIR}/core && make DESTDIR=${ANDROID_INSTALL_DIR} install COMMAND cd ${CMAKE_BINARY_DIR}/plugins && make DESTDIR=${ANDROID_INSTALL_DIR} install - ) + ) endif() # make sub-directories @@ -307,17 +307,17 @@ include(cmake/CPackDefinitions.cmake) # message("\n" -"Veyon build summary\n" -"--------------------\n" -"* Version : ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD} (${VERSION_STRING})\n" -"* Install prefix : ${CMAKE_INSTALL_PREFIX}\n" -"* Library directory : ${CMAKE_INSTALL_PREFIX}/${VEYON_LIB_DIR}\n" -"* Plugin directory : ${CMAKE_INSTALL_PREFIX}/${VEYON_INSTALL_PLUGIN_DIR}\n" -"* Build type : ${CMAKE_BUILD_TYPE}\n" -"* Build platform : ${CMAKE_SYSTEM_PROCESSOR}\n" -"* Compile flags : ${CMAKE_C_FLAGS} (CXX: ${CMAKE_CXX_FLAGS})\n" -"* Link-time optimization : ${WITH_LTO}\n" -"* Use precompiled headers : ${WITH_PCH}\n" -"* Use unity build : ${WITH_UNITY_BUILD}\n" -"* Build with sanitizers : ${WITH_SANITIZERS}\n" -) + "Veyon build summary\n" + "--------------------\n" + "* Version : ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD} (${VERSION_STRING})\n" + "* Install prefix : ${CMAKE_INSTALL_PREFIX}\n" + "* Library directory : ${CMAKE_INSTALL_PREFIX}/${VEYON_LIB_DIR}\n" + "* Plugin directory : ${CMAKE_INSTALL_PREFIX}/${VEYON_INSTALL_PLUGIN_DIR}\n" + "* Build type : ${CMAKE_BUILD_TYPE}\n" + "* Build platform : ${CMAKE_SYSTEM_PROCESSOR}\n" + "* Compile flags : ${CMAKE_C_FLAGS} (CXX: ${CMAKE_CXX_FLAGS})\n" + "* Link-time optimization : ${WITH_LTO}\n" + "* Use precompiled headers : ${WITH_PCH}\n" + "* Use unity build : ${WITH_UNITY_BUILD}\n" + "* Build with sanitizers : ${WITH_SANITIZERS}\n" + ) diff --git a/cmake/CPackDefinitions.cmake b/cmake/CPackDefinitions.cmake index 1d86f3bc7..fa1004f9e 100644 --- a/cmake/CPackDefinitions.cmake +++ b/cmake/CPackDefinitions.cmake @@ -52,31 +52,31 @@ set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) set(CPACK_DEBIAN_COMPRESSION_TYPE "xz") function(ReadRelease valuename FROM filename INTO varname) - file (STRINGS ${filename} _distrib - REGEX "^${valuename}=" - ) - string (REGEX REPLACE - "^${valuename}=\"?\(.*\)" "\\1" ${varname} "${_distrib}" - ) - # remove trailing quote that got globbed by the wildcard (greedy match) - string (REGEX REPLACE - "\"$" "" ${varname} "${${varname}}" - ) - set (${varname} "${${varname}}" PARENT_SCOPE) -ENDfunction() + file (STRINGS ${filename} _distrib + REGEX "^${valuename}=" + ) + string (REGEX REPLACE + "^${valuename}=\"?\(.*\)" "\\1" ${varname} "${_distrib}" + ) + # remove trailing quote that got globbed by the wildcard (greedy match) + string (REGEX REPLACE + "\"$" "" ${varname} "${${varname}}" + ) + set (${varname} "${${varname}}" PARENT_SCOPE) +endfunction() # RPM package if(EXISTS /etc/os-release) -ReadRelease("NAME" FROM /etc/os-release INTO OS_NAME) -if(OS_NAME MATCHES ".*openSUSE.*") - set(OS_OPENSUSE TRUE) -endif() + ReadRelease("NAME" FROM /etc/os-release INTO OS_NAME) + if(OS_NAME MATCHES ".*openSUSE.*") + set(OS_OPENSUSE TRUE) + endif() endif() if(OS_OPENSUSE) -set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "libqca-qt5-plugins, libqt5-qtquickcontrols2") + set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "libqca-qt5-plugins, libqt5-qtquickcontrols2") else() -set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "qca-qt5-ossl, qt5-qtquickcontrols2") + set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "qca-qt5-ossl, qt5-qtquickcontrols2") endif() set(CPACK_RPM_PACKAGE_LICENSE "GPLv2") set(CPACK_RPM_PACKAGE_DESCRIPTION ${CPACK_DEBIAN_PACKAGE_DESCRIPTION}) @@ -92,20 +92,20 @@ if(WIN32) # TODO endif() set(CPACK_SOURCE_GENERATOR "ZIP") elseif( ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # TODO - set(CPACK_GENERATOR "PackageMake") + set(CPACK_GENERATOR "PackageMake") else() - if(EXISTS /etc/redhat-release OR EXISTS /etc/fedora-release OR OS_OPENSUSE) + if(EXISTS /etc/redhat-release OR EXISTS /etc/fedora-release OR OS_OPENSUSE) set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}.${CPACK_SYSTEM_NAME}") set(CPACK_GENERATOR "RPM") - endif() - if(EXISTS /etc/debian_version) + endif() + if(EXISTS /etc/debian_version) if(CPACK_SYSTEM_NAME STREQUAL "x86_64") - set(CPACK_SYSTEM_NAME "amd64") + set(CPACK_SYSTEM_NAME "amd64") endif() set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_BUILD}_${CPACK_SYSTEM_NAME}") set(CPACK_GENERATOR "DEB") - endif() - set(CPACK_SOURCE_GENERATOR "TGZ") + endif() + set(CPACK_SOURCE_GENERATOR "TGZ") endif() include(CPack) diff --git a/cmake/modules/ConfigureFiles.cmake b/cmake/modules/ConfigureFiles.cmake index 3a6580c7d..8d1a8e2bb 100644 --- a/cmake/modules/ConfigureFiles.cmake +++ b/cmake/modules/ConfigureFiles.cmake @@ -1,4 +1,4 @@ -macro(CONFIGURE_FILES) +macro(configure_files) foreach(f ${ARGN}) string(REPLACE ".in" "" OUT_FILE "${f}") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${f} ${CMAKE_CURRENT_BINARY_DIR}/${OUT_FILE} @ONLY) diff --git a/cmake/modules/FindQtTranslations.cmake b/cmake/modules/FindQtTranslations.cmake index 02441dac7..00c8055c7 100644 --- a/cmake/modules/FindQtTranslations.cmake +++ b/cmake/modules/FindQtTranslations.cmake @@ -14,8 +14,8 @@ function(find_qt_translations) get_target_property(QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) endif() execute_process(COMMAND "${QT_QMAKE_EXECUTABLE}" -query QT_INSTALL_TRANSLATIONS - OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_VARIABLE QT_INSTALL_TRANSLATIONS) + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE QT_INSTALL_TRANSLATIONS) message(STATUS "Found Qt translations: ${QT_INSTALL_TRANSLATIONS}") if(WIN32) file(GLOB QT_TRANSLATIONS "${QT_INSTALL_TRANSLATIONS}/qt_*.qm") diff --git a/cmake/modules/LibVNCServerIntegration.cmake b/cmake/modules/LibVNCServerIntegration.cmake index f8018c460..cfbba76a7 100644 --- a/cmake/modules/LibVNCServerIntegration.cmake +++ b/cmake/modules/LibVNCServerIntegration.cmake @@ -30,7 +30,7 @@ check_include_file("sys/types.h" HAVE_SYS_TYPES_H) # error out if required headers not found if(NOT HAVE_STDINT_H) - message(FATAL_ERROR "Could NOT find required header stdint.h") + message(FATAL_ERROR "Could NOT find required header stdint.h") endif() check_function_exists(gettimeofday LIBVNCSERVER_HAVE_GETTIMEOFDAY) @@ -57,12 +57,12 @@ check_symbol_exists(htobe64 "endian.h" LIBVNCSERVER_HAVE_HTOBE64) check_symbol_exists(OSSwapHostToBigInt64 "libkern/OSByteOrder.h" LIBVNCSERVER_HAVE_OSSWAPHOSTTOBIGINT64) if(LIBVNCSERVER_HAVE_SYS_SOCKET_H) - # socklen_t - list(APPEND CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") + # socklen_t + list(APPEND CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") endif() if(HAVE_ARPA_INET_H) - # in_addr_t - list(APPEND CMAKE_EXTRA_INCLUDE_FILES "arpa/inet.h") + # in_addr_t + list(APPEND CMAKE_EXTRA_INCLUDE_FILES "arpa/inet.h") endif() check_type_size(pid_t LIBVNCSERVER_PID_T) @@ -70,7 +70,7 @@ check_type_size(size_t LIBVNCSERVER_SIZE_T) check_type_size(socklen_t LIBVNCSERVER_SOCKLEN_T) check_type_size(in_addr_t LIBVNCSERVER_IN_ADDR_T) if(NOT HAVE_LIBVNCSERVER_IN_ADDR_T) - set(LIBVNCSERVER_NEED_INADDR_T 1) + set(LIBVNCSERVER_NEED_INADDR_T 1) endif() test_big_endian(LIBVNCSERVER_WORDS_BIGENDIAN) diff --git a/cmake/modules/SetDefaultTargetProperties.cmake b/cmake/modules/SetDefaultTargetProperties.cmake index e1a2e1641..7619189b7 100644 --- a/cmake/modules/SetDefaultTargetProperties.cmake +++ b/cmake/modules/SetDefaultTargetProperties.cmake @@ -3,7 +3,6 @@ macro(set_default_target_properties TARGET_NAME) set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD 17) set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) if(WITH_LTO AND NOT VEYON_DEBUG) - set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) + set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) endif() endmacro() - diff --git a/cmake/modules/WindowsBuildHelpers.cmake b/cmake/modules/WindowsBuildHelpers.cmake index 735e545be..c29123b8d 100644 --- a/cmake/modules/WindowsBuildHelpers.cmake +++ b/cmake/modules/WindowsBuildHelpers.cmake @@ -1,24 +1,24 @@ -macro(ADD_WINDOWS_RESOURCE TARGET) +macro(add_windows_resource TARGET) if(VEYON_BUILD_WIN32) set(WINRC "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.rc") set(RCOBJ "${CMAKE_CURRENT_BINARY_DIR}/winrc-${TARGET}.obj") add_custom_command(OUTPUT ${RCOBJ} - COMMAND ${WINDRES} - -I${CMAKE_CURRENT_SOURCE_DIR} - -o${RCOBJ} - -i${WINRC} - DEPENDS ${WINRC}) + COMMAND ${WINDRES} + -I${CMAKE_CURRENT_SOURCE_DIR} + -o${RCOBJ} + -i${WINRC} + DEPENDS ${WINRC}) target_sources(${TARGET} PUBLIC ${RCOBJ}) endif() endmacro() -macro(MAKE_GRAPHICAL_APP TARGET) +macro(make_graphical_app TARGET) if(VEYON_BUILD_WIN32) set_target_properties(${TARGET} PROPERTIES LINK_FLAGS -mwindows) endif() endmacro() -macro(MAKE_CONSOLE_APP TARGET) +macro(make_console_app TARGET) if(VEYON_BUILD_WIN32) set_target_properties(${TARGET} PROPERTIES LINK_FLAGS -mconsole) endif() diff --git a/cmake/modules/XdgInstall.cmake b/cmake/modules/XdgInstall.cmake index 8b9ff8892..0f395504b 100644 --- a/cmake/modules/XdgInstall.cmake +++ b/cmake/modules/XdgInstall.cmake @@ -1,7 +1,7 @@ find_program(XDG_DESKTOP_MENU_EXECUTABLE xdg-desktop-menu) set(XDG_APPS_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/share/applications) -macro(XDG_INSTALL DESKTOP_FILE ICON_XPM ICON_PNG ICON_SVG) +macro(xdg_install DESKTOP_FILE ICON_XPM ICON_PNG ICON_SVG) install(FILES ${DESKTOP_FILE} DESTINATION ${XDG_APPS_INSTALL_DIR}) install(FILES ${ICON_XPM} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps) install(FILES ${ICON_PNG} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps) diff --git a/configurator/CMakeLists.txt b/configurator/CMakeLists.txt index 293c123e9..6c1b4a7fc 100644 --- a/configurator/CMakeLists.txt +++ b/configurator/CMakeLists.txt @@ -39,7 +39,7 @@ build_veyon_application(veyon-configurator src/ServiceConfigurationPage.h src/ServiceConfigurationPage.ui resources/configurator.qrc -) + ) add_windows_resource(veyon-configurator) make_graphical_app(veyon-configurator) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 465cd4bf3..a0f326317 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -1,17 +1,17 @@ file(GLOB veyoncore_SOURCES - ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h - ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/*.ui - ${CMAKE_CURRENT_SOURCE_DIR}/src/Configuration/*.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/Configuration/*.h -) + ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/*.ui + ${CMAKE_CURRENT_SOURCE_DIR}/src/Configuration/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/Configuration/*.h + ) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/builddata.qrc.in ${CMAKE_CURRENT_BINARY_DIR}/builddata.qrc) set(core_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/resources/core.qrc ${CMAKE_CURRENT_BINARY_DIR}/builddata.qrc -) + ) find_package(LibVNCClient 0.9.13) @@ -66,7 +66,7 @@ target_include_directories(veyon-core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src ${QCA_INCLUDE_DIR} -) + ) if(WITH_QT6) target_link_libraries(veyon-core @@ -96,18 +96,18 @@ else() ${ZLIB_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} ${LZO_INCLUDE_DIR} - ) + ) target_include_directories(veyon-core PUBLIC ${libvncserver_DIR}/common/ ${libvncserver_DIR} - ) + ) target_link_libraries(veyon-core Threads::Threads PNG::PNG ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${LZO_LIBRARIES} - ) + ) endif() if(VEYON_BUILD_WIN32) @@ -138,8 +138,8 @@ if(WITH_PCH) if(${CMAKE_VERSION} VERSION_GREATER "3.17.5") file(GENERATE - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx - CONTENT "/*empty file*/") + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx + CONTENT "/*empty file*/") set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_AUTOGEN TRUE) target_sources(veyon-pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx) endif() diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 825ab4090..e311eb745 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -1,7 +1,7 @@ file(GLOB plugins RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*) foreach(plugin ${plugins}) - if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${plugin}) - add_subdirectory(${plugin}) - endif() + if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${plugin}) + add_subdirectory(${plugin}) + endif() endforeach() diff --git a/plugins/authkeys/CMakeLists.txt b/plugins/authkeys/CMakeLists.txt index dafc48028..c96104c50 100644 --- a/plugins/authkeys/CMakeLists.txt +++ b/plugins/authkeys/CMakeLists.txt @@ -11,4 +11,4 @@ build_veyon_plugin(authkeys AuthKeysConfiguration.h AuthKeysTableModel.h AuthKeysManager.h -) + ) diff --git a/plugins/authlogon/CMakeLists.txt b/plugins/authlogon/CMakeLists.txt index 1e1945a04..646956ed4 100644 --- a/plugins/authlogon/CMakeLists.txt +++ b/plugins/authlogon/CMakeLists.txt @@ -6,4 +6,4 @@ build_veyon_plugin(authlogon AuthLogonDialog.cpp AuthLogonDialog.h AuthLogonDialog.ui -) + ) diff --git a/plugins/authsimple/CMakeLists.txt b/plugins/authsimple/CMakeLists.txt index ede9c0337..8ae1d2f25 100644 --- a/plugins/authsimple/CMakeLists.txt +++ b/plugins/authsimple/CMakeLists.txt @@ -7,4 +7,4 @@ build_veyon_plugin(authsimple AuthSimpleDialog.cpp AuthSimpleDialog.h AuthSimpleDialog.ui -) + ) diff --git a/plugins/builtindirectory/CMakeLists.txt b/plugins/builtindirectory/CMakeLists.txt index ffd40b59e..f435247e6 100644 --- a/plugins/builtindirectory/CMakeLists.txt +++ b/plugins/builtindirectory/CMakeLists.txt @@ -9,4 +9,4 @@ build_veyon_plugin(builtindirectory BuiltinDirectoryConfiguration.h BuiltinDirectoryConfigurationPage.h BuiltinDirectory.h -) + ) diff --git a/plugins/demo/CMakeLists.txt b/plugins/demo/CMakeLists.txt index 9b6d9d7f0..41a175172 100644 --- a/plugins/demo/CMakeLists.txt +++ b/plugins/demo/CMakeLists.txt @@ -18,6 +18,4 @@ build_veyon_plugin(demo DemoServerProtocol.h DemoClient.h demo.qrc -) - -target_link_libraries(demo ${LZO_LIBRARIES}) + ) diff --git a/plugins/desktopservices/CMakeLists.txt b/plugins/desktopservices/CMakeLists.txt index 2eb7d70d2..f2445e4ae 100644 --- a/plugins/desktopservices/CMakeLists.txt +++ b/plugins/desktopservices/CMakeLists.txt @@ -16,5 +16,4 @@ build_veyon_plugin(desktopservices DesktopServicesConfigurationPage.h DesktopServicesFeaturePlugin.h desktopservices.qrc -) - + ) diff --git a/plugins/filetransfer/CMakeLists.txt b/plugins/filetransfer/CMakeLists.txt index 1fd463945..7a0278882 100644 --- a/plugins/filetransfer/CMakeLists.txt +++ b/plugins/filetransfer/CMakeLists.txt @@ -18,4 +18,4 @@ build_veyon_plugin(filetransfer FileReadThread.cpp FileReadThread.h filetransfer.qrc -) + ) diff --git a/plugins/ldap/CMakeLists.txt b/plugins/ldap/CMakeLists.txt index 11bd77a61..1a43ce91b 100644 --- a/plugins/ldap/CMakeLists.txt +++ b/plugins/ldap/CMakeLists.txt @@ -15,6 +15,6 @@ build_veyon_plugin(ldap AuthLdapDialog.cpp AuthLdapDialog.h AuthLdapDialog.ui -) + ) target_link_libraries(ldap ldap-common) diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index c55f3c995..178077cd8 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -34,5 +34,5 @@ if(WITH_PCH) endif() set_target_properties(ldap-common PROPERTIES LINK_FLAGS "-Wl,-no-undefined") if(NOT WITH_CORE_ONLY) -install(TARGETS ldap-common DESTINATION ${VEYON_LIB_DIR}) + install(TARGETS ldap-common DESTINATION ${VEYON_LIB_DIR}) endif() diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index c03935f1e..001bcb1d1 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -31,7 +31,7 @@ set(kldap_SOURCES ${kldap_SOURCE_DIR}/ldapcontrol.cpp ${kldap_SOURCE_DIR}/ldapdn.cpp ${CMAKE_CURRENT_SOURCE_DIR}/KLdapIntegration.cpp -) + ) add_library(kldap-light SHARED ${kldap_SOURCES}) target_compile_options(kldap-light PRIVATE ${VEYON_COMPILE_OPTIONS}) @@ -46,5 +46,5 @@ target_include_directories(kldap-light PUBLIC ${kldap_SOURCE_DIR} ${CMAKE_CURREN set_default_target_properties(kldap-light) set_target_properties(kldap-light PROPERTIES LINK_FLAGS "-Wl,-no-undefined") if(NOT WITH_CORE_ONLY) -install(TARGETS kldap-light DESTINATION ${VEYON_LIB_DIR}) + install(TARGETS kldap-light DESTINATION ${VEYON_LIB_DIR}) endif() diff --git a/plugins/platform/CMakeLists.txt b/plugins/platform/CMakeLists.txt index a3773ea24..31642a3b6 100644 --- a/plugins/platform/CMakeLists.txt +++ b/plugins/platform/CMakeLists.txt @@ -1,7 +1,7 @@ if(VEYON_BUILD_WIN32) -add_subdirectory(windows) + add_subdirectory(windows) endif() if(VEYON_BUILD_LINUX) -add_subdirectory(linux) + add_subdirectory(linux) endif() diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index d90e1716b..e007ca2e2 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -53,7 +53,7 @@ build_veyon_plugin(linux-platform ../common/ServiceDataManager.h ../common/ServiceDataManager.cpp ${libfakekey_SOURCES} -) + ) set_source_files_properties(LinuxCoreFunctions.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) @@ -61,7 +61,7 @@ target_include_directories(linux-platform PRIVATE ../common ${libfakekey_DIR} ${procps_INCLUDE_DIRS} -) + ) if(WITH_QT6) find_package(Qt6 COMPONENTS DBus REQUIRED) @@ -76,9 +76,9 @@ target_link_libraries(linux-platform ${procps_LDFLAGS}) if(fakekey_FOUND) -target_include_directories(linux-platform PRIVATE ${fakekey_INCLUDE_DIRS}) -target_link_libraries(linux-platform ${fakekey_LDFLAGS}) + target_include_directories(linux-platform PRIVATE ${fakekey_INCLUDE_DIRS}) + target_link_libraries(linux-platform ${fakekey_LDFLAGS}) else() -target_include_directories(linux-platform PRIVATE ${libfakekey_DIR}) -target_link_libraries(linux-platform ${X11_XTest_LIB}) + target_include_directories(linux-platform PRIVATE ${libfakekey_DIR}) + target_link_libraries(linux-platform ${X11_XTest_LIB}) endif() diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index 9c63990dd..4491ae7c9 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -47,7 +47,7 @@ build_veyon_plugin(windows-platform ../common/ServiceDataManager.cpp XEventLog.h windows.qrc -) + ) target_include_directories(windows-platform PRIVATE ../common @@ -55,7 +55,7 @@ target_include_directories(windows-platform PRIVATE ${ultravnc_DIR}/winvnc/winvnc ${ultravnc_DIR} ${Qt5Gui_PRIVATE_INCLUDE_DIRS} -) + ) target_link_libraries(windows-platform -lwtsapi32 -lnetapi32 -luserenv -linterception) target_compile_definitions(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) target_compile_options(windows-platform PRIVATE "-Wno-unknown-pragmas") diff --git a/plugins/powercontrol/CMakeLists.txt b/plugins/powercontrol/CMakeLists.txt index 500817ddb..524288d7e 100644 --- a/plugins/powercontrol/CMakeLists.txt +++ b/plugins/powercontrol/CMakeLists.txt @@ -7,4 +7,4 @@ build_veyon_plugin(powercontrol PowerDownTimeInputDialog.h PowerDownTimeInputDialog.ui powercontrol.qrc -) + ) diff --git a/plugins/remoteaccess/CMakeLists.txt b/plugins/remoteaccess/CMakeLists.txt index e3b1074a0..1fbd4f558 100644 --- a/plugins/remoteaccess/CMakeLists.txt +++ b/plugins/remoteaccess/CMakeLists.txt @@ -7,4 +7,5 @@ build_veyon_plugin(remoteaccess RemoteAccessPage.cpp RemoteAccessWidget.h RemoteAccessWidget.cpp - remoteaccess.qrc) + remoteaccess.qrc + ) diff --git a/plugins/screenshot/CMakeLists.txt b/plugins/screenshot/CMakeLists.txt index bfc4dead1..7e08d889c 100644 --- a/plugins/screenshot/CMakeLists.txt +++ b/plugins/screenshot/CMakeLists.txt @@ -6,4 +6,4 @@ build_veyon_plugin(screenshot ScreenshotListModel.cpp ScreenshotListModel.h screenshot.qrc -) + ) diff --git a/plugins/servicecontrol/CMakeLists.txt b/plugins/servicecontrol/CMakeLists.txt index 14a023f60..03f790bb1 100644 --- a/plugins/servicecontrol/CMakeLists.txt +++ b/plugins/servicecontrol/CMakeLists.txt @@ -3,4 +3,4 @@ include(BuildVeyonPlugin) build_veyon_plugin(servicecontrol ServiceControlPlugin.cpp ServiceControlPlugin.h -) + ) diff --git a/plugins/systemusergroups/CMakeLists.txt b/plugins/systemusergroups/CMakeLists.txt index 35ef9bbf0..c3b0c626f 100644 --- a/plugins/systemusergroups/CMakeLists.txt +++ b/plugins/systemusergroups/CMakeLists.txt @@ -3,4 +3,4 @@ include(BuildVeyonPlugin) build_veyon_plugin(systemusergroups SystemUserGroupsPlugin.cpp SystemUserGroupsPlugin.h -) + ) diff --git a/plugins/testing/CMakeLists.txt b/plugins/testing/CMakeLists.txt index 6611efebd..562be4a63 100644 --- a/plugins/testing/CMakeLists.txt +++ b/plugins/testing/CMakeLists.txt @@ -1,5 +1,5 @@ include(BuildVeyonPlugin) if(VEYON_DEBUG) -build_veyon_plugin(testing TestingCommandLinePlugin.cpp TestingCommandLinePlugin.h) + build_veyon_plugin(testing TestingCommandLinePlugin.cpp TestingCommandLinePlugin.h) endif() diff --git a/plugins/textmessage/CMakeLists.txt b/plugins/textmessage/CMakeLists.txt index a321af4e2..964438667 100644 --- a/plugins/textmessage/CMakeLists.txt +++ b/plugins/textmessage/CMakeLists.txt @@ -7,5 +7,4 @@ build_veyon_plugin(textmessage TextMessageFeaturePlugin.h TextMessageDialog.h textmessage.qrc -) - + ) diff --git a/plugins/usersessioncontrol/CMakeLists.txt b/plugins/usersessioncontrol/CMakeLists.txt index 168fd01f7..447203508 100644 --- a/plugins/usersessioncontrol/CMakeLists.txt +++ b/plugins/usersessioncontrol/CMakeLists.txt @@ -7,5 +7,4 @@ build_veyon_plugin(usersessioncontrol UserLoginDialog.h UserLoginDialog.ui usersessioncontrol.qrc -) - + ) diff --git a/plugins/vncserver/CMakeLists.txt b/plugins/vncserver/CMakeLists.txt index cb9f1289e..b685119c1 100644 --- a/plugins/vncserver/CMakeLists.txt +++ b/plugins/vncserver/CMakeLists.txt @@ -1,9 +1,9 @@ if(VEYON_BUILD_WIN32) -add_subdirectory(ultravnc-builtin) + add_subdirectory(ultravnc-builtin) endif() if(VEYON_BUILD_LINUX) -add_subdirectory(x11vnc-builtin) + add_subdirectory(x11vnc-builtin) endif() add_subdirectory(external) diff --git a/plugins/vncserver/external/CMakeLists.txt b/plugins/vncserver/external/CMakeLists.txt index 6d42bdb00..552194aa2 100644 --- a/plugins/vncserver/external/CMakeLists.txt +++ b/plugins/vncserver/external/CMakeLists.txt @@ -7,5 +7,4 @@ build_veyon_plugin(external-vnc-server ExternalVncServer.h ExternalVncServerConfiguration.h ExternalVncServerConfigurationWidget.h -) - + ) diff --git a/plugins/vncserver/headless/CMakeLists.txt b/plugins/vncserver/headless/CMakeLists.txt index a0b431598..c98aefc65 100644 --- a/plugins/vncserver/headless/CMakeLists.txt +++ b/plugins/vncserver/headless/CMakeLists.txt @@ -4,15 +4,14 @@ find_package(LibVNCServer 0.9.8) if(LibVNCServer_FOUND) -build_veyon_plugin(headless-vnc-server - HeadlessVncServer.cpp - HeadlessVncServer.h - HeadlessVncConfiguration.h -) + build_veyon_plugin(headless-vnc-server + HeadlessVncServer.cpp + HeadlessVncServer.h + HeadlessVncConfiguration.h + ) -target_link_libraries(headless-vnc-server LibVNC::LibVNCServer) + target_link_libraries(headless-vnc-server LibVNC::LibVNCServer) -target_compile_options(headless-vnc-server PRIVATE -Wno-parentheses) + target_compile_options(headless-vnc-server PRIVATE -Wno-parentheses) endif() - diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index 0645a38de..c99f449c8 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -84,7 +84,7 @@ build_veyon_plugin(builtin-ultravnc-server LogoffEventFilter.h UltraVncConfigurationWidget.h UltraVncConfiguration.h -) + ) target_link_libraries(builtin-ultravnc-server -luserenv -lole32 -lversion -lgdi32 -limm32 -lwinmm ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${LZO_LIBRARIES}) target_include_directories(builtin-ultravnc-server PRIVATE diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 337b62640..7bff96f3b 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -2,189 +2,189 @@ include(BuildVeyonPlugin) if(NOT VEYON_X11VNC_EXTERNAL) -find_package(LibVNCServer 0.9.8) -if(NOT LibVNCServer_FOUND) - include(LibVNCServerIntegration) -endif() - -set(FULL_PACKAGE_NAME "Veyon") -set(PACKAGE_VERSION "${VERSION_STRING}") -set(VERSION_PATCHLEVEL "${VERSION_PATCH}") - -# check for x11vnc requirements -set(FUNCS getpwnam getspnam getuid grantpt initgroups seteuid setegid setgid setsid setuid shmat waitpid) -foreach(_func ${FUNCS}) - string(TOUPPER "${_func}" fuc) - check_function_exists(${_func} HAVE_${fuc}) -endforeach() - -check_c_source_compiles("static __thread int p = 0; int main() {}" HAVE_TLS) - -# x11vnc header macros -check_include_files(linux/fb.h HAVE_LINUX_FB_H) -check_include_files(linux/input.h HAVE_LINUX_INPUT_H) -check_include_files(linux/uinput.h HAVE_LINUX_UINPUT_H) -check_include_files(linux/videodev.h HAVE_LINUX_VIDEODEV_H) -check_include_files(linux/videodev2.h HAVE_LINUX_VIDEODEV2_H) -check_include_files(netdb.h HAVE_NETDB_H) -check_include_files(netinet/in.h HAVE_NETINET_IN_H) -check_include_files(pwd.h HAVE_PWD_H) -check_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H) -check_include_files(sys/stropts.h HAVE_SYS_STROPTS_H) -check_include_files(sys/wait.h HAVE_SYS_WAIT_H) -check_include_files(termios.h HAVE_TERMIOS_H) -check_include_files(utmpx.h HAVE_UTMPX_H) - -find_package(X11 REQUIRED) - -if(NOT X11_XTest_FOUND) - message(FATAL_ERROR "XTest library or headers not found - please install libxtst-dev or libXtst-devel") -endif() - -if(NOT X11_Xrandr_FOUND) - message(FATAL_ERROR "Xrandr library or headers not found - please install libxrandr-dev or libXrandr-devel") -endif() - -if(NOT X11_Xinerama_FOUND) - message(FATAL_ERROR "Xinerama library or headers not found - please install libxinerama-dev or libXinerama-devel") -endif() - -if(NOT X11_Xdamage_FOUND) - message(FATAL_ERROR "Xdamage library or headers not found - please install libxdamage-dev or libXdamage-devel") -endif() - -if(NOT X11_Xfixes_FOUND) - message(FATAL_ERROR "Xfixes library or headers not found - please install libxfixes-dev or libXfixes-devel") -endif() - -set(HAVE_X11 TRUE) -set(HAVE_XTEST TRUE) -set(HAVE_LIBSSL TRUE) -set(HAVE_LIBXINERAMA TRUE) -set(HAVE_LIBXRANDR TRUE) -set(HAVE_LIBXDAMAGE TRUE) -set(HAVE_LIBXFIXES TRUE) - -if(X11_XShm_FOUND) - set(HAVE_XSHM TRUE) -else() - message("WARNING: XShm library or headers not found - building VNC server without XShm support") -endif() - -if(X11_Xinput_FOUND) - set(HAVE_XI2 TRUE) -else() - message("WARNING: Xinput library or headers not found - building VNC server without Xinput support") -endif() - -if(X11_Xcomposite_FOUND) - set(HAVE_LIBXCOMPOSITE TRUE) -else() - message("WARNING: Xcomposite library or headers not found - building VNC server without Xcomposite support") -endif() - -if(X11_Xcursor_FOUND) - set(HAVE_LIBXCURSOR TRUE) -else() - message("WARNING: Xcursor library or headers not found - building VNC server without Xcursor support") -endif() - -set(CMAKE_REQUIRED_LIBRARIES ${X11_LIBRARIES} ${X11_XTest_LIB}) - -check_function_exists(XReadScreen HAVE_SOLARIS_XREADSCREEN) -check_function_exists(FBPMForceLevel HAVE_FBPM) -check_function_exists(DPMSForceLevel HAVE_DPMS) -check_function_exists(XTestGrabControl HAVE_XTESTGRABCONTROL) -check_function_exists(XRecordEnableContextAsync HAVE_RECORD) -check_include_files(X11/extensions/readdisplay.h HAVE_IRIX_XREADDISPLAY) -check_include_files(X11/XKBlib.h HAVE_XKBLIB_H) -if(HAVE_XKBLIB_H) - check_function_exists(XkbSelectEvents HAVE_XKEYBOARD) -endif() - -set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES}) -check_function_exists(X509_print_ex_fp HAVE_X509_PRINT_EX_FP) - -unset(CMAKE_REQUIRED_LIBRARIES) - -set(X11VNC_CONFIG ${CMAKE_BINARY_DIR}/config.h) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY) -if(NOT LibVNCServer_FOUND) -set(libvncserver_SOURCES - ${libvncserver_DIR}/libvncserver/auth.c - ${libvncserver_DIR}/libvncserver/cargs.c - ${libvncserver_DIR}/libvncserver/corre.c - ${libvncserver_DIR}/libvncserver/cursor.c - ${libvncserver_DIR}/libvncserver/cutpaste.c - ${libvncserver_DIR}/libvncserver/draw.c - ${libvncserver_DIR}/libvncserver/font.c - ${libvncserver_DIR}/libvncserver/hextile.c - ${libvncserver_DIR}/libvncserver/httpd.c - ${libvncserver_DIR}/libvncserver/main.c - ${libvncserver_DIR}/libvncserver/rfbregion.c - ${libvncserver_DIR}/libvncserver/rfbserver.c - ${libvncserver_DIR}/libvncserver/rre.c - ${libvncserver_DIR}/libvncserver/scale.c - ${libvncserver_DIR}/libvncserver/selbox.c - ${libvncserver_DIR}/libvncserver/sockets.c - ${libvncserver_DIR}/libvncserver/stats.c - ${libvncserver_DIR}/libvncserver/translate.c - ${libvncserver_DIR}/libvncserver/ultra.c - ${libvncserver_DIR}/libvncserver/zlib.c - ${libvncserver_DIR}/libvncserver/zrle.c - ${libvncserver_DIR}/libvncserver/zrleoutstream.c - ${libvncserver_DIR}/libvncserver/zrlepalettehelper.c - ${libvncserver_DIR}/libvncserver/tight.c - ${libvncserver_DIR}/common/d3des.c - ${libvncserver_DIR}/common/turbojpeg.c - ${libvncserver_DIR}/common/vncauth.c) -endif() - -set(x11vnc_SOURCES x11vnc-veyon.c - ${x11vnc_DIR}/src/appshare.c - ${x11vnc_DIR}/src/avahi.c - ${x11vnc_DIR}/src/rates.c - ${x11vnc_DIR}/src/cleanup.c - ${x11vnc_DIR}/src/remote.c - ${x11vnc_DIR}/src/pointer.c - ${x11vnc_DIR}/src/userinput.c - ${x11vnc_DIR}/src/unixpw.c - ${x11vnc_DIR}/src/gui.c - ${x11vnc_DIR}/src/xkb_bell.c - ${x11vnc_DIR}/src/xinerama.c - ${x11vnc_DIR}/src/solid.c - ${x11vnc_DIR}/src/selection.c - ${x11vnc_DIR}/src/xrandr.c - ${x11vnc_DIR}/src/win_utils.c - ${x11vnc_DIR}/src/cursor.c - ${x11vnc_DIR}/src/screen.c - ${x11vnc_DIR}/src/xevents.c - ${x11vnc_DIR}/src/help.c - ${x11vnc_DIR}/src/inet.c - ${x11vnc_DIR}/src/sslcmds.c - ${x11vnc_DIR}/src/xwrappers.c - ${x11vnc_DIR}/src/scan.c - ${x11vnc_DIR}/src/options.c - ${x11vnc_DIR}/src/user.c - ${x11vnc_DIR}/src/util.c - ${x11vnc_DIR}/src/x11vnc_defs.c - ${x11vnc_DIR}/src/xrecord.c - ${x11vnc_DIR}/src/8to24.c - ${x11vnc_DIR}/src/xdamage.c - ${x11vnc_DIR}/src/keyboard.c - ${x11vnc_DIR}/src/connections.c - ${x11vnc_DIR}/src/sslhelper.c - ${x11vnc_DIR}/src/linuxfb.c - ${x11vnc_DIR}/src/v4l.c - ${x11vnc_DIR}/src/macosx.c - ${x11vnc_DIR}/src/macosxCG.c - ${x11vnc_DIR}/src/macosxCGP.c - ${x11vnc_DIR}/src/macosxCGS.c - ${x11vnc_DIR}/src/xi2_devices.c - ${x11vnc_DIR}/src/uinput.c -) - -set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros") + find_package(LibVNCServer 0.9.8) + if(NOT LibVNCServer_FOUND) + include(LibVNCServerIntegration) + endif() + + set(FULL_PACKAGE_NAME "Veyon") + set(PACKAGE_VERSION "${VERSION_STRING}") + set(VERSION_PATCHLEVEL "${VERSION_PATCH}") + + # check for x11vnc requirements + set(FUNCS getpwnam getspnam getuid grantpt initgroups seteuid setegid setgid setsid setuid shmat waitpid) + foreach(_func ${FUNCS}) + string(TOUPPER "${_func}" fuc) + check_function_exists(${_func} HAVE_${fuc}) + endforeach() + + check_c_source_compiles("static __thread int p = 0; int main() {}" HAVE_TLS) + + # x11vnc header macros + check_include_files(linux/fb.h HAVE_LINUX_FB_H) + check_include_files(linux/input.h HAVE_LINUX_INPUT_H) + check_include_files(linux/uinput.h HAVE_LINUX_UINPUT_H) + check_include_files(linux/videodev.h HAVE_LINUX_VIDEODEV_H) + check_include_files(linux/videodev2.h HAVE_LINUX_VIDEODEV2_H) + check_include_files(netdb.h HAVE_NETDB_H) + check_include_files(netinet/in.h HAVE_NETINET_IN_H) + check_include_files(pwd.h HAVE_PWD_H) + check_include_files(sys/ioctl.h HAVE_SYS_IOCTL_H) + check_include_files(sys/stropts.h HAVE_SYS_STROPTS_H) + check_include_files(sys/wait.h HAVE_SYS_WAIT_H) + check_include_files(termios.h HAVE_TERMIOS_H) + check_include_files(utmpx.h HAVE_UTMPX_H) + + find_package(X11 REQUIRED) + + if(NOT X11_XTest_FOUND) + message(FATAL_ERROR "XTest library or headers not found - please install libxtst-dev or libXtst-devel") + endif() + + if(NOT X11_Xrandr_FOUND) + message(FATAL_ERROR "Xrandr library or headers not found - please install libxrandr-dev or libXrandr-devel") + endif() + + if(NOT X11_Xinerama_FOUND) + message(FATAL_ERROR "Xinerama library or headers not found - please install libxinerama-dev or libXinerama-devel") + endif() + + if(NOT X11_Xdamage_FOUND) + message(FATAL_ERROR "Xdamage library or headers not found - please install libxdamage-dev or libXdamage-devel") + endif() + + if(NOT X11_Xfixes_FOUND) + message(FATAL_ERROR "Xfixes library or headers not found - please install libxfixes-dev or libXfixes-devel") + endif() + + set(HAVE_X11 TRUE) + set(HAVE_XTEST TRUE) + set(HAVE_LIBSSL TRUE) + set(HAVE_LIBXINERAMA TRUE) + set(HAVE_LIBXRANDR TRUE) + set(HAVE_LIBXDAMAGE TRUE) + set(HAVE_LIBXFIXES TRUE) + + if(X11_XShm_FOUND) + set(HAVE_XSHM TRUE) + else() + message("WARNING: XShm library or headers not found - building VNC server without XShm support") + endif() + + if(X11_Xinput_FOUND) + set(HAVE_XI2 TRUE) + else() + message("WARNING: Xinput library or headers not found - building VNC server without Xinput support") + endif() + + if(X11_Xcomposite_FOUND) + set(HAVE_LIBXCOMPOSITE TRUE) + else() + message("WARNING: Xcomposite library or headers not found - building VNC server without Xcomposite support") + endif() + + if(X11_Xcursor_FOUND) + set(HAVE_LIBXCURSOR TRUE) + else() + message("WARNING: Xcursor library or headers not found - building VNC server without Xcursor support") + endif() + + set(CMAKE_REQUIRED_LIBRARIES ${X11_LIBRARIES} ${X11_XTest_LIB}) + + check_function_exists(XReadScreen HAVE_SOLARIS_XREADSCREEN) + check_function_exists(FBPMForceLevel HAVE_FBPM) + check_function_exists(DPMSForceLevel HAVE_DPMS) + check_function_exists(XTestGrabControl HAVE_XTESTGRABCONTROL) + check_function_exists(XRecordEnableContextAsync HAVE_RECORD) + check_include_files(X11/extensions/readdisplay.h HAVE_IRIX_XREADDISPLAY) + check_include_files(X11/XKBlib.h HAVE_XKBLIB_H) + if(HAVE_XKBLIB_H) + check_function_exists(XkbSelectEvents HAVE_XKEYBOARD) + endif() + + set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES}) + check_function_exists(X509_print_ex_fp HAVE_X509_PRINT_EX_FP) + + unset(CMAKE_REQUIRED_LIBRARIES) + + set(X11VNC_CONFIG ${CMAKE_BINARY_DIR}/config.h) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY) + if(NOT LibVNCServer_FOUND) + set(libvncserver_SOURCES + ${libvncserver_DIR}/libvncserver/auth.c + ${libvncserver_DIR}/libvncserver/cargs.c + ${libvncserver_DIR}/libvncserver/corre.c + ${libvncserver_DIR}/libvncserver/cursor.c + ${libvncserver_DIR}/libvncserver/cutpaste.c + ${libvncserver_DIR}/libvncserver/draw.c + ${libvncserver_DIR}/libvncserver/font.c + ${libvncserver_DIR}/libvncserver/hextile.c + ${libvncserver_DIR}/libvncserver/httpd.c + ${libvncserver_DIR}/libvncserver/main.c + ${libvncserver_DIR}/libvncserver/rfbregion.c + ${libvncserver_DIR}/libvncserver/rfbserver.c + ${libvncserver_DIR}/libvncserver/rre.c + ${libvncserver_DIR}/libvncserver/scale.c + ${libvncserver_DIR}/libvncserver/selbox.c + ${libvncserver_DIR}/libvncserver/sockets.c + ${libvncserver_DIR}/libvncserver/stats.c + ${libvncserver_DIR}/libvncserver/translate.c + ${libvncserver_DIR}/libvncserver/ultra.c + ${libvncserver_DIR}/libvncserver/zlib.c + ${libvncserver_DIR}/libvncserver/zrle.c + ${libvncserver_DIR}/libvncserver/zrleoutstream.c + ${libvncserver_DIR}/libvncserver/zrlepalettehelper.c + ${libvncserver_DIR}/libvncserver/tight.c + ${libvncserver_DIR}/common/d3des.c + ${libvncserver_DIR}/common/turbojpeg.c + ${libvncserver_DIR}/common/vncauth.c) + endif() + + set(x11vnc_SOURCES x11vnc-veyon.c + ${x11vnc_DIR}/src/appshare.c + ${x11vnc_DIR}/src/avahi.c + ${x11vnc_DIR}/src/rates.c + ${x11vnc_DIR}/src/cleanup.c + ${x11vnc_DIR}/src/remote.c + ${x11vnc_DIR}/src/pointer.c + ${x11vnc_DIR}/src/userinput.c + ${x11vnc_DIR}/src/unixpw.c + ${x11vnc_DIR}/src/gui.c + ${x11vnc_DIR}/src/xkb_bell.c + ${x11vnc_DIR}/src/xinerama.c + ${x11vnc_DIR}/src/solid.c + ${x11vnc_DIR}/src/selection.c + ${x11vnc_DIR}/src/xrandr.c + ${x11vnc_DIR}/src/win_utils.c + ${x11vnc_DIR}/src/cursor.c + ${x11vnc_DIR}/src/screen.c + ${x11vnc_DIR}/src/xevents.c + ${x11vnc_DIR}/src/help.c + ${x11vnc_DIR}/src/inet.c + ${x11vnc_DIR}/src/sslcmds.c + ${x11vnc_DIR}/src/xwrappers.c + ${x11vnc_DIR}/src/scan.c + ${x11vnc_DIR}/src/options.c + ${x11vnc_DIR}/src/user.c + ${x11vnc_DIR}/src/util.c + ${x11vnc_DIR}/src/x11vnc_defs.c + ${x11vnc_DIR}/src/xrecord.c + ${x11vnc_DIR}/src/8to24.c + ${x11vnc_DIR}/src/xdamage.c + ${x11vnc_DIR}/src/keyboard.c + ${x11vnc_DIR}/src/connections.c + ${x11vnc_DIR}/src/sslhelper.c + ${x11vnc_DIR}/src/linuxfb.c + ${x11vnc_DIR}/src/v4l.c + ${x11vnc_DIR}/src/macosx.c + ${x11vnc_DIR}/src/macosxCG.c + ${x11vnc_DIR}/src/macosxCGP.c + ${x11vnc_DIR}/src/macosxCGS.c + ${x11vnc_DIR}/src/xi2_devices.c + ${x11vnc_DIR}/src/uinput.c + ) + + set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros") endif() @@ -199,47 +199,47 @@ build_veyon_plugin(builtin-x11vnc-server BuiltinX11VncServer.h X11VncConfigurationWidget.h X11VncConfiguration.h -) + ) if(VEYON_X11VNC_EXTERNAL) -target_compile_definitions(builtin-x11vnc-server PRIVATE VEYON_X11VNC_EXTERNAL) + target_compile_definitions(builtin-x11vnc-server PRIVATE VEYON_X11VNC_EXTERNAL) else() -target_compile_definitions(builtin-x11vnc-server PRIVATE VNCSHARED FOREVER NOREPEAT=0 NOPW=1 REMOTE_CONTROL=0 EXTERNAL_COMMANDS=0 FILEXFER=0 NOGUI SMALL_FOOTPRINT) + target_compile_definitions(builtin-x11vnc-server PRIVATE VNCSHARED FOREVER NOREPEAT=0 NOPW=1 REMOTE_CONTROL=0 EXTERNAL_COMMANDS=0 FILEXFER=0 NOGUI SMALL_FOOTPRINT) -target_include_directories(builtin-x11vnc-server PRIVATE ${x11vnc_DIR}/src) + target_include_directories(builtin-x11vnc-server PRIVATE ${x11vnc_DIR}/src) -target_link_libraries(builtin-x11vnc-server - ${X11_LIBRARIES} - ${X11_XTest_LIB} - ${X11_Xfixes_LIB} - ${X11_Xinerama_LIB} - ${X11_Xdamage_LIB} - ${X11_Xrandr_LIB} -) + target_link_libraries(builtin-x11vnc-server + ${X11_LIBRARIES} + ${X11_XTest_LIB} + ${X11_Xfixes_LIB} + ${X11_Xinerama_LIB} + ${X11_Xdamage_LIB} + ${X11_Xrandr_LIB} + ) -if(LibVNCServer_FOUND) - target_link_libraries(builtin-x11vnc-server LibVNC::LibVNCServer) -else() - target_include_directories(builtin-x11vnc-server PRIVATE ${libvncserver_DIR}/libvncserver ${libvncserver_DIR}/common) -endif() + if(LibVNCServer_FOUND) + target_link_libraries(builtin-x11vnc-server LibVNC::LibVNCServer) + else() + target_include_directories(builtin-x11vnc-server PRIVATE ${libvncserver_DIR}/libvncserver ${libvncserver_DIR}/common) + endif() -if(X11_XShm_FOUND) -target_link_libraries(builtin-x11vnc-server ${X11_XShm_LIB}) -endif() + if(X11_XShm_FOUND) + target_link_libraries(builtin-x11vnc-server ${X11_XShm_LIB}) + endif() -if(X11_Xcomposite_FOUND) -target_link_libraries(builtin-x11vnc-server ${X11_Xcomposite_LIB}) -endif() + if(X11_Xcomposite_FOUND) + target_link_libraries(builtin-x11vnc-server ${X11_Xcomposite_LIB}) + endif() -if(X11_Xcursor_FOUND) -target_link_libraries(builtin-x11vnc-server ${X11_Xcursor_LIB}) -endif() + if(X11_Xcursor_FOUND) + target_link_libraries(builtin-x11vnc-server ${X11_Xcursor_LIB}) + endif() -if(X11_Xinput_FOUND) -target_link_libraries(builtin-x11vnc-server ${X11_Xinput_LIB}) -endif() + if(X11_Xinput_FOUND) + target_link_libraries(builtin-x11vnc-server ${X11_Xinput_LIB}) + endif() endif() diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt index 8946c8c5f..57378e6f1 100644 --- a/service/CMakeLists.txt +++ b/service/CMakeLists.txt @@ -13,4 +13,3 @@ if(VEYON_BUILD_LINUX) endif() install(FILES ${CMAKE_CURRENT_BINARY_DIR}/veyon.service DESTINATION ${SYSTEMD_SERVICE_INSTALL_DIR}) endif() - From bdabe07468df3b4facfede8e2b31425adf5e9246 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Sep 2021 10:34:30 +0200 Subject: [PATCH 1079/1765] worker: cmake: don't use file globbing --- worker/CMakeLists.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/worker/CMakeLists.txt b/worker/CMakeLists.txt index f4c00ff48..997815800 100644 --- a/worker/CMakeLists.txt +++ b/worker/CMakeLists.txt @@ -1,9 +1,13 @@ include(BuildVeyonApplication) include(WindowsBuildHelpers) -file(GLOB worker_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) - -build_veyon_application(veyon-worker ${worker_SOURCES}) +build_veyon_application(veyon-worker + src/FeatureWorkerManagerConnection.cpp + src/FeatureWorkerManagerConnection.h + src/main.cpp + src/VeyonWorker.cpp + src/VeyonWorker.h + ) add_windows_resource(veyon-worker) make_graphical_app(veyon-worker) From 2ede276ce31243ddfdb2af6539c1ed501a2655c5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Sep 2021 10:44:07 +0200 Subject: [PATCH 1080/1765] VeyonCore: drop unused version() method --- core/src/VeyonCore.cpp | 7 ------- core/src/VeyonCore.h | 1 - 2 files changed, 8 deletions(-) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 44b74d084..08c4b5719 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -158,13 +158,6 @@ VeyonCore* VeyonCore::instance() -QVersionNumber VeyonCore::version() -{ - return QVersionNumber::fromString( versionString() ); -} - - - QString VeyonCore::versionString() { return QStringLiteral( VEYON_VERSION ); diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 12048665f..753542a2e 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -95,7 +95,6 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject static VeyonCore* instance(); - static QVersionNumber version(); static QString versionString(); static QString pluginDir(); static QString translationsDirectory(); From c386d6fc32f46d54ef82631916cb6901123c22b3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Sep 2021 10:51:26 +0200 Subject: [PATCH 1081/1765] CLI: cmake: add header files --- cli/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 8459a4255..21898b993 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -4,7 +4,10 @@ include(WindowsBuildHelpers) set(cli_SOURCES src/main.cpp src/ConfigCommands.cpp - src/PluginsCommands.cpp) + src/ConfigCommands.h + src/PluginsCommands.cpp + src/PluginsCommands.h + ) build_veyon_application(veyon-cli ${cli_SOURCES}) From 1e4e2ca97af193957e3d30f46301f85ac835ef7e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Sep 2021 12:09:05 +0200 Subject: [PATCH 1082/1765] CMake: drop unused variable --- CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 820b35ae3..4da707d13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,8 +140,6 @@ else() endif() -set(VEYON_CORE_INCLUDE_DIR core/src) - # find required Qt modules option(WITH_QT6 "Build for Qt 6" OFF) if(WITH_QT6) From e5c1593c3594b7a129f88574c8c4399bac9a4cb6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Sep 2021 12:48:12 +0200 Subject: [PATCH 1083/1765] Use custom flags for parallel LTO with GCC --- CMakeLists.txt | 14 ++++++++++---- cmake/modules/SetDefaultTargetProperties.cmake | 9 +++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4da707d13..100f36828 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -194,6 +194,16 @@ elseif(WITH_UNITY_BUILD) set(CMAKE_UNITY_BUILD ON) endif() +if(VEYON_BUILD_WIN32 OR VEYON_BUILD_WIN64) + set(WITH_LTO OFF) +endif() + +if(WITH_LTO) + include(ProcessorCount) + ProcessorCount(CPU_COUNT) + set(GCC_LTO_FLAGS "-flto=${CPU_COUNT} -fno-fat-lto-objects") +endif() + if(WITH_SANITIZERS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fsanitize=undefined") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fsanitize=undefined") @@ -207,10 +217,6 @@ set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) -if(VEYON_BUILD_WIN32 OR VEYON_BUILD_WIN64) - set(WITH_LTO OFF) -endif() - if(WITH_MODEL_TESTERS) if(WITH_QT6) find_package(Qt6 COMPONENTS Test REQUIRED) diff --git a/cmake/modules/SetDefaultTargetProperties.cmake b/cmake/modules/SetDefaultTargetProperties.cmake index 7619189b7..82137c3e8 100644 --- a/cmake/modules/SetDefaultTargetProperties.cmake +++ b/cmake/modules/SetDefaultTargetProperties.cmake @@ -2,7 +2,12 @@ macro(set_default_target_properties TARGET_NAME) set_property(TARGET ${TARGET_NAME} PROPERTY NO_SYSTEM_FROM_IMPORTED ON) set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD 17) set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) - if(WITH_LTO AND NOT VEYON_DEBUG) - set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) + if(WITH_LTO) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + target_compile_options(${TARGET_NAME} PRIVATE ${GCC_LTO_FLAGS}) + target_link_options(${TARGET_NAME} PRIVATE ${GCC_LTO_FLAGS}) + else() + set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) + endif() endif() endmacro() From cd45a6d32d9569ba9c2e53bcfd871e6396fc4f0f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 21 Sep 2021 10:39:06 +0200 Subject: [PATCH 1084/1765] WindowsServiceControl: only depend on LSM on Win10 The LSM service does not exist prior to Windows 10. --- plugins/platform/windows/WindowsServiceControl.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index cc5272232..2902c116f 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -22,6 +22,8 @@ * */ +#include + #include "WindowsCoreFunctions.h" #include "WindowsServiceControl.h" @@ -160,6 +162,10 @@ bool WindowsServiceControl::install( const QString& filePath, const QString& dis { const auto binaryPath = QStringLiteral("\"%1\"").arg( QString( filePath ).replace( QLatin1Char('"'), QString() ) ); + const wchar_t* dependencies = QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows10 ? + L"Tcpip\0RpcSs\0LanmanWorkstation\0\0" : + L"Tcpip\0RpcSs\0LSM\0LanmanWorkstation\0\0"; + m_serviceHandle = CreateService( m_serviceManager, // SCManager database WindowsCoreFunctions::toConstWCharArray( m_name ), // name of service @@ -172,7 +178,7 @@ bool WindowsServiceControl::install( const QString& filePath, const QString& dis WindowsCoreFunctions::toConstWCharArray( binaryPath ), // service's binary nullptr, // no load ordering group nullptr, // no tag identifier - L"Tcpip\0RpcSs\0LSM\0LanmanWorkstation\0\0", // dependencies + dependencies, // dependencies nullptr, // LocalSystem account nullptr ); // no password From a65a2d52160fd59ecac0ca6ba44d0a7facda242e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 09:05:07 +0200 Subject: [PATCH 1085/1765] Move ShellCommandLinePlugin to CLI/ShellCommands --- cli/CMakeLists.txt | 2 ++ .../src/ShellCommands.cpp | 20 +++++++++---------- .../src/ShellCommands.h | 8 ++++---- cli/src/main.cpp | 2 ++ plugins/shell/CMakeLists.txt | 3 --- 5 files changed, 18 insertions(+), 17 deletions(-) rename plugins/shell/ShellCommandLinePlugin.cpp => cli/src/ShellCommands.cpp (74%) rename plugins/shell/ShellCommandLinePlugin.h => cli/src/ShellCommands.h (88%) delete mode 100644 plugins/shell/CMakeLists.txt diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 21898b993..00236277f 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -7,6 +7,8 @@ set(cli_SOURCES src/ConfigCommands.h src/PluginsCommands.cpp src/PluginsCommands.h + src/ShellCommands.cpp + src/ShellCommands.h ) build_veyon_application(veyon-cli ${cli_SOURCES}) diff --git a/plugins/shell/ShellCommandLinePlugin.cpp b/cli/src/ShellCommands.cpp similarity index 74% rename from plugins/shell/ShellCommandLinePlugin.cpp rename to cli/src/ShellCommands.cpp index ccb7a22b1..ca02170d5 100644 --- a/plugins/shell/ShellCommandLinePlugin.cpp +++ b/cli/src/ShellCommands.cpp @@ -1,5 +1,5 @@ /* - * ShellCommandLinePlugin.cpp - implementation of ShellCommandLinePlugin class + * ShellCommands.cpp - implementation of ShellCommands class * * Copyright (c) 2018-2021 Tobias Junghans * @@ -27,34 +27,34 @@ #include #include "CommandLineIO.h" -#include "ShellCommandLinePlugin.h" +#include "ShellCommands.h" -ShellCommandLinePlugin::ShellCommandLinePlugin( QObject* parent ) : +ShellCommands::ShellCommands( QObject* parent ) : QObject( parent ), m_commands( { -{ QStringLiteral("run"), tr( "Run command file" ) }, - } ) + { QStringLiteral("run"), tr( "Run command file" ) }, + } ) { } -QStringList ShellCommandLinePlugin::commands() const +QStringList ShellCommands::commands() const { return m_commands.keys(); } -QString ShellCommandLinePlugin::commandHelp( const QString& command ) const +QString ShellCommands::commandHelp( const QString& command ) const { return m_commands.value( command ); } -CommandLinePluginInterface::RunResult ShellCommandLinePlugin::handle_main() +CommandLinePluginInterface::RunResult ShellCommands::handle_main() { QTextStream stream( stdin ); @@ -78,7 +78,7 @@ CommandLinePluginInterface::RunResult ShellCommandLinePlugin::handle_main() -CommandLinePluginInterface::RunResult ShellCommandLinePlugin::handle_run( const QStringList& arguments ) +CommandLinePluginInterface::RunResult ShellCommands::handle_run( const QStringList& arguments ) { QFile scriptFile( arguments.value( 0 ) ); if( scriptFile.exists() == false ) @@ -97,7 +97,7 @@ CommandLinePluginInterface::RunResult ShellCommandLinePlugin::handle_run( const -void ShellCommandLinePlugin::runCommand( const QString& command ) +void ShellCommands::runCommand( const QString& command ) { // TODO: properly split arguments containing spaces QProcess::execute( QCoreApplication::applicationFilePath(), command.split( QLatin1Char(' ') ) ); diff --git a/plugins/shell/ShellCommandLinePlugin.h b/cli/src/ShellCommands.h similarity index 88% rename from plugins/shell/ShellCommandLinePlugin.h rename to cli/src/ShellCommands.h index 6e1f067f8..b35a60c3c 100644 --- a/plugins/shell/ShellCommandLinePlugin.h +++ b/cli/src/ShellCommands.h @@ -1,5 +1,5 @@ /* - * ShellCommandLinePlugin.h - declaration of ShellCommandLinePlugin class + * ShellCommands.h - declaration of ShellCommands class * * Copyright (c) 2018-2021 Tobias Junghans * @@ -26,14 +26,14 @@ #include "CommandLinePluginInterface.h" -class ShellCommandLinePlugin : public QObject, CommandLinePluginInterface, PluginInterface +class ShellCommands : public QObject, CommandLinePluginInterface, PluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.ShellCommandLineInterface") Q_INTERFACES(PluginInterface CommandLinePluginInterface) public: - explicit ShellCommandLinePlugin( QObject* parent = nullptr ); - ~ShellCommandLinePlugin() override = default; + explicit ShellCommands( QObject* parent = nullptr ); + ~ShellCommands() override = default; Plugin::Uid uid() const override { diff --git a/cli/src/main.cpp b/cli/src/main.cpp index aa18cc377..8808fb315 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -30,6 +30,7 @@ #include "Logger.h" #include "PluginsCommands.h" #include "PluginManager.h" +#include "ShellCommands.h" int main( int argc, char **argv ) @@ -84,6 +85,7 @@ int main( int argc, char **argv ) auto core = new VeyonCore( app, VeyonCore::Component::CLI, QStringLiteral("CLI") ); VeyonCore::pluginManager().registerExtraPluginInterface( new ConfigCommands( core ) ); VeyonCore::pluginManager().registerExtraPluginInterface( new PluginsCommands( core ) ); + VeyonCore::pluginManager().registerExtraPluginInterface( new ShellCommands( core ) ); QHash commandLinePluginInterfaces; const auto pluginObjects = VeyonCore::pluginManager().pluginObjects(); diff --git a/plugins/shell/CMakeLists.txt b/plugins/shell/CMakeLists.txt deleted file mode 100644 index 8a6bf5730..000000000 --- a/plugins/shell/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -include(BuildVeyonPlugin) - -build_veyon_plugin(shell ShellCommandLinePlugin.cpp ShellCommandLinePlugin.h) From ba897847dd8e92b42ca2ed90ed5bbee3fa28c7a1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 09:14:01 +0200 Subject: [PATCH 1086/1765] Move ServiceControlPlugin to CLI/ServiceControlCommands --- cli/CMakeLists.txt | 2 ++ .../src/ServiceControlCommands.cpp | 18 +++++++++--------- .../src/ServiceControlCommands.h | 9 ++++----- cli/src/ShellCommands.h | 1 - cli/src/main.cpp | 2 ++ plugins/servicecontrol/CMakeLists.txt | 6 ------ 6 files changed, 17 insertions(+), 21 deletions(-) rename plugins/servicecontrol/ServiceControlPlugin.cpp => cli/src/ServiceControlCommands.cpp (73%) rename plugins/servicecontrol/ServiceControlPlugin.h => cli/src/ServiceControlCommands.h (88%) delete mode 100644 plugins/servicecontrol/CMakeLists.txt diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 00236277f..9ec533f83 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -7,6 +7,8 @@ set(cli_SOURCES src/ConfigCommands.h src/PluginsCommands.cpp src/PluginsCommands.h + src/ServiceControlCommands.cpp + src/ServiceControlCommands.h src/ShellCommands.cpp src/ShellCommands.h ) diff --git a/plugins/servicecontrol/ServiceControlPlugin.cpp b/cli/src/ServiceControlCommands.cpp similarity index 73% rename from plugins/servicecontrol/ServiceControlPlugin.cpp rename to cli/src/ServiceControlCommands.cpp index ca9842452..6cdc32564 100644 --- a/plugins/servicecontrol/ServiceControlPlugin.cpp +++ b/cli/src/ServiceControlCommands.cpp @@ -1,5 +1,5 @@ /* - * ServiceControlPlugin.cpp - implementation of ServiceControlPlugin class + * ServiceControlCommands.cpp - implementation of ServiceControlCommands class * * Copyright (c) 2017-2021 Tobias Junghans * @@ -23,10 +23,10 @@ */ #include "CommandLineIO.h" -#include "ServiceControlPlugin.h" +#include "ServiceControlCommands.h" #include "VeyonServiceControl.h" -ServiceControlPlugin::ServiceControlPlugin( QObject* parent ) : +ServiceControlCommands::ServiceControlCommands( QObject* parent ) : QObject( parent ), m_commands( { { QStringLiteral("register"), tr( "Register Veyon Service" ) }, @@ -41,7 +41,7 @@ ServiceControlPlugin::ServiceControlPlugin( QObject* parent ) : -CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_register( const QStringList& arguments ) +CommandLinePluginInterface::RunResult ServiceControlCommands::handle_register( const QStringList& arguments ) { Q_UNUSED(arguments) @@ -53,7 +53,7 @@ CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_register( con -CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_unregister( const QStringList& arguments ) +CommandLinePluginInterface::RunResult ServiceControlCommands::handle_unregister( const QStringList& arguments ) { Q_UNUSED(arguments) VeyonServiceControl serviceControl; @@ -64,7 +64,7 @@ CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_unregister( c -CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_start( const QStringList& arguments ) +CommandLinePluginInterface::RunResult ServiceControlCommands::handle_start( const QStringList& arguments ) { Q_UNUSED(arguments) @@ -76,7 +76,7 @@ CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_start( const -CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_stop( const QStringList& arguments ) +CommandLinePluginInterface::RunResult ServiceControlCommands::handle_stop( const QStringList& arguments ) { Q_UNUSED(arguments) @@ -88,7 +88,7 @@ CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_stop( const Q -CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_restart( const QStringList& arguments ) +CommandLinePluginInterface::RunResult ServiceControlCommands::handle_restart( const QStringList& arguments ) { handle_stop( arguments ); return handle_start( arguments ); @@ -96,7 +96,7 @@ CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_restart( cons -CommandLinePluginInterface::RunResult ServiceControlPlugin::handle_status( const QStringList& arguments ) +CommandLinePluginInterface::RunResult ServiceControlCommands::handle_status( const QStringList& arguments ) { Q_UNUSED(arguments) diff --git a/plugins/servicecontrol/ServiceControlPlugin.h b/cli/src/ServiceControlCommands.h similarity index 88% rename from plugins/servicecontrol/ServiceControlPlugin.h rename to cli/src/ServiceControlCommands.h index 3b969f13a..ff5f03319 100644 --- a/plugins/servicecontrol/ServiceControlPlugin.h +++ b/cli/src/ServiceControlCommands.h @@ -1,5 +1,5 @@ /* - * ServiceControlPlugin.h - declaration of ServiceControlPlugin class + * ServiceControlCommands.h - declaration of ServiceControlCommands class * * Copyright (c) 2017-2021 Tobias Junghans * @@ -26,14 +26,13 @@ #include "CommandLinePluginInterface.h" -class ServiceControlPlugin : public QObject, CommandLinePluginInterface, PluginInterface +class ServiceControlCommands : public QObject, CommandLinePluginInterface, PluginInterface { Q_OBJECT - Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.ServiceControl") Q_INTERFACES(PluginInterface CommandLinePluginInterface) public: - explicit ServiceControlPlugin( QObject* parent = nullptr ); - ~ServiceControlPlugin() override = default; + explicit ServiceControlCommands( QObject* parent = nullptr ); + ~ServiceControlCommands() override = default; Plugin::Uid uid() const override { diff --git a/cli/src/ShellCommands.h b/cli/src/ShellCommands.h index b35a60c3c..a4424ce9f 100644 --- a/cli/src/ShellCommands.h +++ b/cli/src/ShellCommands.h @@ -29,7 +29,6 @@ class ShellCommands : public QObject, CommandLinePluginInterface, PluginInterface { Q_OBJECT - Q_PLUGIN_METADATA(IID "io.veyon.Veyon.Plugins.ShellCommandLineInterface") Q_INTERFACES(PluginInterface CommandLinePluginInterface) public: explicit ShellCommands( QObject* parent = nullptr ); diff --git a/cli/src/main.cpp b/cli/src/main.cpp index 8808fb315..e4ba5bced 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -30,6 +30,7 @@ #include "Logger.h" #include "PluginsCommands.h" #include "PluginManager.h" +#include "ServiceControlCommands.h" #include "ShellCommands.h" @@ -85,6 +86,7 @@ int main( int argc, char **argv ) auto core = new VeyonCore( app, VeyonCore::Component::CLI, QStringLiteral("CLI") ); VeyonCore::pluginManager().registerExtraPluginInterface( new ConfigCommands( core ) ); VeyonCore::pluginManager().registerExtraPluginInterface( new PluginsCommands( core ) ); + VeyonCore::pluginManager().registerExtraPluginInterface( new ServiceControlCommands( core ) ); VeyonCore::pluginManager().registerExtraPluginInterface( new ShellCommands( core ) ); QHash commandLinePluginInterfaces; diff --git a/plugins/servicecontrol/CMakeLists.txt b/plugins/servicecontrol/CMakeLists.txt deleted file mode 100644 index 03f790bb1..000000000 --- a/plugins/servicecontrol/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -include(BuildVeyonPlugin) - -build_veyon_plugin(servicecontrol - ServiceControlPlugin.cpp - ServiceControlPlugin.h - ) From c598a7178604e2e4dcfdaed065071aa145fe3adc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 09:18:42 +0200 Subject: [PATCH 1087/1765] 3rdparty: kldap: update submodule --- 3rdparty/kldap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/kldap b/3rdparty/kldap index 497435947..0736944c1 160000 --- a/3rdparty/kldap +++ b/3rdparty/kldap @@ -1 +1 @@ -Subproject commit 4974359470669f8a2fcb017a2cbc6974aa8e6f3a +Subproject commit 0736944c1c01a86e702bf0ed258c10923388652c From f37153c2567f74456f05040c00fd3f60ebe4a346 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 09:30:13 +0200 Subject: [PATCH 1088/1765] 3rdparty: add kldap-qt-compat --- .gitmodules | 3 +++ 3rdparty/kldap-qt-compat | 1 + 2 files changed, 4 insertions(+) create mode 160000 3rdparty/kldap-qt-compat diff --git a/.gitmodules b/.gitmodules index 5f0ebd58a..9bf91624f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -17,3 +17,6 @@ [submodule "3rdparty/qthttpserver"] path = 3rdparty/qthttpserver url = https://code.qt.io/qt-labs/qthttpserver.git +[submodule "3rdparty/kldap-qt-compat"] + path = 3rdparty/kldap-qt-compat + url = https://invent.kde.org/pim/kldap.git diff --git a/3rdparty/kldap-qt-compat b/3rdparty/kldap-qt-compat new file mode 160000 index 000000000..497435947 --- /dev/null +++ b/3rdparty/kldap-qt-compat @@ -0,0 +1 @@ +Subproject commit 4974359470669f8a2fcb017a2cbc6974aa8e6f3a From ae9a8a9519899f4889caaafeb2b3362fc6266e4b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 09:30:33 +0200 Subject: [PATCH 1089/1765] LDAP: use kldap-qt-compat for Qt < 5.14.0 kldap-qt-compat contains an older version of kldap which still builds with older versions of Qt. --- plugins/ldap/kldap/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index 001bcb1d1..28a5e0a6b 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -17,7 +17,12 @@ CHECK_SYMBOL_EXISTS(ldap_extended_operation_s ldap.h HAVE_LDAP_EXTENDED_OPERATIO check_include_files(ldap.h HAVE_LDAP_H) set(LDAP_FOUND TRUE) -set(kldap_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/kldap/src/core) +if(Qt5Core_VERSION VERSION_LESS 5.14.0) + set(kldap_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/kldap-qt-compat/src/core) +else() + set(kldap_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/kldap/src/core) +endif() + configure_file(${kldap_SOURCE_DIR}/../kldap_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/kldap_config.h) set(kldap_SOURCES From 31d24d555d9ee86f4a3bfd8fecc0a7e1aa6abe14 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 09:31:44 +0200 Subject: [PATCH 1090/1765] CI: strip-kldap-sources: extend for kldap-qt-compat --- .ci/common/strip-kldap-sources.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.ci/common/strip-kldap-sources.sh b/.ci/common/strip-kldap-sources.sh index 03d3ef02f..aa005768e 100755 --- a/.ci/common/strip-kldap-sources.sh +++ b/.ci/common/strip-kldap-sources.sh @@ -1,7 +1,12 @@ #!/bin/sh -cd 3rdparty/kldap && \ +(cd 3rdparty/kldap && \ rm -rf \ autotests \ - kioslave - + kioslave \ + src/widgets) +(cd 3rdparty/kldap-qt-compat && \ +rm -rf \ + autotests \ + kioslave \ + src/widgets) From aba5e71c21fe627f2f7ace59ce13ddaf190c984d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 10:18:46 +0200 Subject: [PATCH 1091/1765] CMake: set CMP0022 to NEW --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 100f36828..340e6a780 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS 1) if(COMMAND CMAKE_POLICY) cmake_policy(SET CMP0009 NEW) cmake_policy(SET CMP0020 NEW) + cmake_policy(SET CMP0022 NEW) cmake_policy(SET CMP0058 NEW) cmake_policy(SET CMP0063 NEW) if(${CMAKE_VERSION} VERSION_GREATER "3.8.0") From 206f0b390e78a2ce6bb0c02b198e9e19aada864f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 10:19:59 +0200 Subject: [PATCH 1092/1765] Feature: rename Flag and make it an enum class --- configurator/src/MasterConfigurationPage.cpp | 8 +++---- core/src/DesktopAccessDialog.cpp | 2 +- core/src/Feature.h | 12 +++++----- core/src/FeatureControl.cpp | 2 +- core/src/FeatureManager.cpp | 2 +- core/src/MonitoringMode.cpp | 4 ++-- core/src/SystemTrayIcon.cpp | 2 +- master/src/ComputerMonitoringView.cpp | 6 ++--- master/src/ComputerMonitoringWidget.cpp | 4 ++-- master/src/MainWindow.cpp | 14 +++++------ master/src/VeyonMaster.cpp | 20 ++++++++-------- plugins/demo/DemoFeaturePlugin.cpp | 24 +++++++++---------- .../DesktopServicesFeaturePlugin.cpp | 8 +++---- plugins/filetransfer/FileTransferPlugin.cpp | 2 +- .../PowerControlFeaturePlugin.cpp | 14 +++++------ .../RemoteAccessFeaturePlugin.cpp | 4 ++-- .../screenlock/ScreenLockFeaturePlugin.cpp | 4 ++-- .../screenshot/ScreenshotFeaturePlugin.cpp | 2 +- .../textmessage/TextMessageFeaturePlugin.cpp | 2 +- .../UserSessionControlPlugin.cpp | 4 ++-- 20 files changed, 70 insertions(+), 70 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index f082820aa..e04df1e2e 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -140,8 +140,8 @@ void MasterConfigurationPage::populateFeatureComboBox() for( const auto& feature : m_featureManager.features() ) { - if( feature.testFlag( Feature::Master ) && - feature.testFlag( Feature::Meta ) == false ) + if( feature.testFlag( Feature::Flag::Master ) && + feature.testFlag( Feature::Flag::Meta ) == false ) { ui->computerDoubleClickFeature->addItem( QIcon( feature.iconUrl() ), feature.displayName(), @@ -162,8 +162,8 @@ void MasterConfigurationPage::updateFeatureLists() for( const auto& feature : qAsConst( m_featureManager.features() ) ) { - if( feature.testFlag( Feature::Master ) == false || - feature.testFlag( Feature::Meta ) || + if( feature.testFlag( Feature::Flag::Master ) == false || + feature.testFlag( Feature::Flag::Meta ) || feature == VeyonCore::builtinFeatures().monitoringMode().feature() ) { continue; diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index b044f95cb..1bdb6d1c3 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -39,7 +39,7 @@ DesktopAccessDialog::DesktopAccessDialog( QObject* parent ) : QObject( parent ), m_desktopAccessDialogFeature( Feature( QLatin1String( staticMetaObject.className() ), - Feature::Service | Feature::Worker | Feature::Builtin, + Feature::Flag::Service | Feature::Flag::Worker | Feature::Flag::Builtin, Feature::Uid( "3dd8ec3e-7004-4936-8f2a-70699b9819be" ), Feature::Uid(), tr( "Desktop access dialog" ), {}, {} ) ), diff --git a/core/src/Feature.h b/core/src/Feature.h index 264cca44b..60925aafd 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -37,9 +37,9 @@ class VEYON_CORE_EXPORT Feature public: using Uid = QUuid; - enum FeatureFlag + enum class Flag { - NoFlags, + None = 0x0000, Mode = 0x0001, Action = 0x0002, Session = 0x0004, @@ -53,7 +53,7 @@ class VEYON_CORE_EXPORT Feature AllComponents = Master | Service | Worker } ; - Q_DECLARE_FLAGS(Flags, FeatureFlag) + Q_DECLARE_FLAGS(Flags, Flag) Q_FLAG(Flags) explicit Feature( const QString& name, @@ -79,7 +79,7 @@ class VEYON_CORE_EXPORT Feature explicit Feature( Uid uid = Uid() ) : m_name(), - m_flags( NoFlags ), + m_flags( Flag::None ), m_uid( uid ), m_parentUid( QUuid() ), m_displayName(), @@ -132,10 +132,10 @@ class VEYON_CORE_EXPORT Feature bool isValid() const { - return m_flags != NoFlags; + return m_flags != QFlags::Int(Flag::None); } - bool testFlag( FeatureFlag flag ) const + bool testFlag( Flag flag ) const { return m_flags.testFlag( flag ); } diff --git a/core/src/FeatureControl.cpp b/core/src/FeatureControl.cpp index d4b7cab60..73d0297d2 100644 --- a/core/src/FeatureControl.cpp +++ b/core/src/FeatureControl.cpp @@ -31,7 +31,7 @@ FeatureControl::FeatureControl( QObject* parent ) : QObject( parent ), m_featureControlFeature( Feature( QLatin1String( staticMetaObject.className() ), - Feature::Service | Feature::Worker | Feature::Builtin, + Feature::Flag::Service | Feature::Flag::Worker | Feature::Flag::Builtin, Feature::Uid( "a0a96fba-425d-414a-aaf4-352b76d7c4f3" ), Feature::Uid(), tr( "Feature control" ), {}, {}, {}, {} ) ), diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 46cfe9dbd..491656170 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -155,7 +155,7 @@ void FeatureManager::startFeature( VeyonMasterInterface& master, featureInterface->startFeature( master, feature, computerControlInterfaces ); } - if( feature.testFlag( Feature::Mode ) ) + if( feature.testFlag( Feature::Flag::Mode ) ) { for( const auto& controlInterface : computerControlInterfaces ) { diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index bc57e6601..229ee51f0 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -33,14 +33,14 @@ MonitoringMode::MonitoringMode( QObject* parent ) : QObject( parent ), m_monitoringModeFeature( QLatin1String( staticMetaObject.className() ), - Feature::Mode | Feature::Master | Feature::Builtin, + Feature::Flag::Mode | Feature::Flag::Master | Feature::Flag::Builtin, Feature::Uid( "edad8259-b4ef-4ca5-90e6-f238d0fda694" ), Feature::Uid(), tr( "Monitoring" ), tr( "Monitoring" ), tr( "This mode allows you to monitor all computers at one or more locations." ), QStringLiteral( ":/core/presentation-none.png" ) ), m_queryLoggedOnUserInfoFeature( QStringLiteral("UserSessionInfo"), - Feature::Session | Feature::Service | Feature::Worker | Feature::Builtin, + Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Worker | Feature::Flag::Builtin, Feature::Uid( "79a5e74d-50bd-4aab-8012-0e70dc08cc72" ), Feature::Uid(), {}, {}, {} ), m_features( { m_monitoringModeFeature, m_queryLoggedOnUserInfoFeature } ) diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index 729041d01..eefb97f88 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -35,7 +35,7 @@ SystemTrayIcon::SystemTrayIcon( QObject* parent ) : QObject( parent ), m_systemTrayIconFeature( Feature( QLatin1String( staticMetaObject.className() ), - Feature::Session | Feature::Service | Feature::Worker | Feature::Builtin, + Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Worker | Feature::Flag::Builtin, Feature::Uid( "8e997d84-ebb9-430f-8f72-d45d9821963d" ), Feature::Uid(), tr( "System tray icon"), {}, {} ) ), diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index d4d58ddb8..8c3375bde 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -195,7 +195,7 @@ void ComputerMonitoringView::runFeature( const Feature& feature ) } // mode feature already active? - if( feature.testFlag( Feature::Mode ) && + if( feature.testFlag( Feature::Flag::Mode ) && isFeatureOrSubFeatureActive( computerControlInterfaces, feature.uid() ) ) { // then stop it @@ -204,11 +204,11 @@ void ComputerMonitoringView::runFeature( const Feature& feature ) else { // stop all other active mode feature - if( feature.testFlag( Feature::Mode ) ) + if( feature.testFlag( Feature::Flag::Mode ) ) { for( const auto& currentFeature : m_master->features() ) { - if( currentFeature.testFlag( Feature::Mode ) && currentFeature != feature ) + if( currentFeature.testFlag( Feature::Flag::Mode ) && currentFeature != feature ) { m_master->featureManager().stopFeature( *m_master, currentFeature, computerControlInterfaces ); } diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 287dbe31b..f38e8ad0e 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -197,7 +197,7 @@ void ComputerMonitoringWidget::populateFeatureMenu( const ComputerControlInterf for( const auto& feature : master()->features() ) { - if( feature.testFlag( Feature::Meta ) ) + if( feature.testFlag( Feature::Flag::Meta ) ) { continue; } @@ -206,7 +206,7 @@ void ComputerMonitoringWidget::populateFeatureMenu( const ComputerControlInterf if( previousPluginUid.isNull() == false && pluginUid != previousPluginUid && - feature.testFlag( Feature::Mode ) == false ) + feature.testFlag( Feature::Flag::Mode ) == false ) { m_featureMenu->addSeparator(); } diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 17213e931..e147ef111 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -416,7 +416,7 @@ void MainWindow::addFeaturesToToolBar() { for( const auto& feature : m_master.features() ) { - if( feature.testFlag( Feature::Meta ) ) + if( feature.testFlag( Feature::Flag::Meta ) ) { continue; } @@ -429,7 +429,7 @@ void MainWindow::addFeaturesToToolBar() connect( btn, &QToolButton::clicked, this, [=] () { m_master.runFeature( feature ); updateModeButtonGroup(); - if( feature.testFlag( Feature::Mode ) ) + if( feature.testFlag( Feature::Flag::Mode ) ) { reloadSubFeatures(); } @@ -437,7 +437,7 @@ void MainWindow::addFeaturesToToolBar() btn->setObjectName( feature.name() ); btn->addTo( ui->toolBar ); - if( feature.testFlag( Feature::Mode ) ) + if( feature.testFlag( Feature::Flag::Mode ) ) { btn->setCheckable( true ); m_modeGroup->addButton( btn, buttonId( feature ) ); @@ -456,7 +456,7 @@ void MainWindow::addSubFeaturesToToolButton( QToolButton* button, const Feature& button->setMenu( nullptr ); } - const auto parentFeatureIsMode = parentFeature.testFlag( Feature::Mode ); + const auto parentFeatureIsMode = parentFeature.testFlag( Feature::Flag::Mode ); const auto subFeatures = m_master.subFeatures( parentFeature.uid() ); if( subFeatures.isEmpty() || @@ -476,7 +476,7 @@ void MainWindow::addSubFeaturesToToolButton( QToolButton* button, const Feature& m_master.runFeature( subFeature ); if( parentFeatureIsMode ) { - if( subFeature.testFlag( Feature::Option ) == false ) + if( subFeature.testFlag( Feature::Flag::Option ) == false ) { button->setChecked( true ); } @@ -487,10 +487,10 @@ void MainWindow::addSubFeaturesToToolButton( QToolButton* button, const Feature& action->setToolTip( subFeature.description() ); action->setObjectName( subFeature.uid().toString() ); - if( subFeature.testFlag( Feature::Option ) ) + if( subFeature.testFlag( Feature::Flag::Option ) ) { action->setCheckable( true ); - action->setChecked( subFeature.testFlag( Feature::Checked ) ); + action->setChecked( subFeature.testFlag( Feature::Flag::Checked ) ); } } diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index d06199f7a..d89a23472 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -108,7 +108,7 @@ FeatureList VeyonMaster::subFeatures( Feature::Uid parentFeatureUid ) const { for( const auto& feature : m_featureManager->features( pluginUid ) ) { - if( feature.testFlag( Feature::Master ) && + if( feature.testFlag( Feature::Flag::Master ) && feature.parentUid() == parentFeatureUid && disabledFeatures.contains( parentFeatureUid.toString() ) == false && disabledFeatures.contains( feature.uid().toString() ) == false ) @@ -134,7 +134,7 @@ FeatureUidList VeyonMaster::subFeaturesUids( Feature::Uid parentFeatureUid ) con { for( const auto& feature : m_featureManager->features( pluginUid ) ) { - if( feature.testFlag( Feature::Master ) && + if( feature.testFlag( Feature::Flag::Master ) && feature.parentUid() == parentFeatureUid && disabledFeatures.contains( parentFeatureUid.toString() ) == false && disabledFeatures.contains( feature.uid().toString() ) == false ) @@ -174,7 +174,7 @@ FeatureList VeyonMaster::modeFeatures() const for( const auto& feature : qAsConst( features() ) ) { - if( feature.testFlag( Feature::Mode ) ) + if( feature.testFlag( Feature::Flag::Mode ) ) { featureList.append( feature ); const auto modeSubFeatures = subFeatures( feature.uid() ); @@ -255,7 +255,7 @@ void VeyonMaster::runFeature( const Feature& feature ) { const auto computerControlInterfaces = filteredComputerControlInterfaces(); - if( feature.testFlag( Feature::Mode ) ) + if( feature.testFlag( Feature::Flag::Mode ) ) { stopAllModeFeatures( computerControlInterfaces ); @@ -372,9 +372,9 @@ FeatureList VeyonMaster::featureList() const { for( const auto& feature : m_featureManager->features( pluginUid ) ) { - if( feature.testFlag( Feature::Master ) && - feature.testFlag( Feature::Mode ) && - feature.testFlag( Feature::Meta ) == false && + if( feature.testFlag( Feature::Flag::Master ) && + feature.testFlag( Feature::Flag::Mode ) && + feature.testFlag( Feature::Flag::Meta ) == false && feature.parentUid().isNull() && disabledFeatures.contains( feature.uid().toString() ) == false ) { @@ -387,9 +387,9 @@ FeatureList VeyonMaster::featureList() const { for( const auto& feature : m_featureManager->features( pluginUid ) ) { - if( feature.testFlag( Feature::Master ) && - feature.testFlag( Feature::Mode ) == false && - feature.testFlag( Feature::Meta ) == false && + if( feature.testFlag( Feature::Flag::Master ) && + feature.testFlag( Feature::Flag::Mode ) == false && + feature.testFlag( Feature::Flag::Meta ) == false && feature.parentUid().isNull() && disabledFeatures.contains( feature.uid().toString() ) == false ) { diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 445954c73..1cae5481c 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -44,22 +44,22 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : QObject( parent ), DemoAuthentication( uid() ), m_demoFeature( QStringLiteral( "Demo" ), - Feature::Mode | Feature::AllComponents, + Feature::Flag::Mode | Feature::Flag::AllComponents, Feature::Uid( "6f4cd922-b63e-40bf-9451-536065c7cdf9" ), Feature::Uid(), tr( "Demo" ), tr( "Stop demo" ), tr( "Share your screen or allow a user to share his screen with other users." ), QStringLiteral(":/demo/demo.png") ), m_demoClientFullScreenFeature( QStringLiteral( "FullScreenDemo" ), - Feature::Meta | Feature::AllComponents, + Feature::Flag::Meta | Feature::Flag::AllComponents, Feature::Uid( "7b6231bd-eb89-45d3-af32-f70663b2f878" ), {}, tr("Full screen demo"), {}, {} ), m_demoClientWindowFeature( QStringLiteral( "WindowDemo" ), - Feature::Meta | Feature::AllComponents, + Feature::Flag::Meta | Feature::Flag::AllComponents, Feature::Uid( "ae45c3db-dc2e-4204-ae8b-374cdab8c62c" ), {}, tr("Window demo"), {}, {} ), m_shareOwnScreenFullScreenFeature( QStringLiteral( "ShareOwnScreenFullScreen" ), - Feature::Mode | Feature::AllComponents, + Feature::Flag::Mode | Feature::Flag::AllComponents, Feature::Uid( "07b375e1-8ab6-4b48-bcb7-75fb3d56035b" ), m_demoFeature.uid(), tr( "Share your own screen in fullscreen mode" ), {}, @@ -68,7 +68,7 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : "devices of the users are locked." ), QStringLiteral(":/demo/presentation-fullscreen.png") ), m_shareOwnScreenWindowFeature( QStringLiteral( "ShareOwnScreenWindow" ), - Feature::Mode | Feature::AllComponents, + Feature::Flag::Mode | Feature::Flag::AllComponents, Feature::Uid( "68c55fb9-127e-4c9f-9c90-28b998bf1a47" ), m_demoFeature.uid(), tr( "Share your own screen in a window" ), {}, @@ -77,7 +77,7 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : "able to switch to other windows as needed." ), QStringLiteral(":/demo/presentation-window.png") ), m_shareUserScreenFullScreenFeature( QStringLiteral( "ShareUserScreenFullScreen" ), - Feature::Mode | Feature::AllComponents, + Feature::Flag::Mode | Feature::Flag::AllComponents, Feature::Uid( "b4e542e2-1deb-48ac-910a-bbf8ac9a0bde" ), m_demoFeature.uid(), tr( "Share selected user's screen in fullscreen mode" ), {}, @@ -86,7 +86,7 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : "devices of the users are locked." ), QStringLiteral(":/demo/presentation-fullscreen.png") ), m_shareUserScreenWindowFeature( QStringLiteral( "ShareUserScreenWindow" ), - Feature::Mode | Feature::AllComponents, + Feature::Flag::Mode | Feature::Flag::AllComponents, Feature::Uid( "ebfc5ec4-f725-4bfc-a93a-c6d4864c6806" ), m_demoFeature.uid(), tr( "Share selected user's screen in a window" ), {}, @@ -95,7 +95,7 @@ DemoFeaturePlugin::DemoFeaturePlugin( QObject* parent ) : "able to switch to other windows as needed." ), QStringLiteral(":/demo/presentation-window.png") ), m_demoServerFeature( QStringLiteral( "DemoServer" ), - Feature::Session | Feature::Service | Feature::Worker, + Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Worker, Feature::Uid( "e4b6e743-1f5b-491d-9364-e091086200f4" ), m_demoFeature.uid(), {}, {}, {} ), @@ -494,10 +494,10 @@ void DemoFeaturePlugin::updateFeatures() { m_screenSelectionFeatures.reserve( m_screens.size() + 1 ); - auto allScreensFlags = Feature::Option | Feature::Master; + auto allScreensFlags = Feature::Flag::Option | Feature::Flag::Master; if( m_screenSelection <= ScreenSelectionNone ) { - allScreensFlags |= Feature::Checked; + allScreensFlags |= Feature::Flag::Checked; } m_screenSelectionFeatures.append( Feature{ QStringLiteral("DemoAllScreens"), @@ -520,10 +520,10 @@ void DemoFeaturePlugin::updateFeatures() } #endif - auto flags = Feature::Option | Feature::Master; + auto flags = Feature::Flag::Option | Feature::Flag::Master; if( index == m_screenSelection ) { - flags |= Feature::Checked; + flags |= Feature::Flag::Checked; } m_screenSelectionFeatures.append( Feature{ name, flags, diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index 55fd3bcfb..1ea4f5c70 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -49,14 +49,14 @@ DesktopServicesFeaturePlugin::DesktopServicesFeaturePlugin( QObject* parent ) : QObject( parent ), m_configuration( &VeyonCore::config() ), m_startAppFeature( QStringLiteral( "StartApp" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "da9ca56a-b2ad-4fff-8f8a-929b2927b442" ), Feature::Uid(), tr( "Start application" ), {}, tr( "Click this button to start an application on all computers." ), QStringLiteral(":/desktopservices/preferences-desktop-launch-feedback.png") ), m_openWebsiteFeature( QStringLiteral( "OpenWebsite" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "8a11a75d-b3db-48b6-b9cb-f8422ddd5b0c" ), Feature::Uid(), tr( "Open website" ), {}, @@ -495,7 +495,7 @@ void DesktopServicesFeaturePlugin::updatePredefinedApplicationFeatures() for( const auto& app : qAsConst(m_predefinedApps) ) { const auto appObject = DesktopServiceObject( app.toObject() ); - m_predefinedAppsFeatures.append( Feature( m_startAppFeature.name(), Feature::Action | Feature::Master, + m_predefinedAppsFeatures.append( Feature( m_startAppFeature.name(), Feature::Flag::Action | Feature::Flag::Master, appObject.uid(), m_startAppFeature.uid(), appObject.name(), {}, tr("Start application \"%1\"").arg( appObject.path() ) ) ); @@ -524,7 +524,7 @@ void DesktopServicesFeaturePlugin::updatePredefinedWebsiteFeatures() for( const auto& website : qAsConst(m_predefinedWebsites) ) { const auto websiteObject = DesktopServiceObject( website.toObject() ); - m_predefinedWebsitesFeatures.append( Feature( m_openWebsiteFeature.name(), Feature::Action | Feature::Master, + m_predefinedWebsitesFeatures.append( Feature( m_openWebsiteFeature.name(), Feature::Flag::Action | Feature::Flag::Master, websiteObject.uid(), m_openWebsiteFeature.uid(), websiteObject.name(), {}, tr("Open website \"%1\"").arg( websiteObject.path() ) ) ); diff --git a/plugins/filetransfer/FileTransferPlugin.cpp b/plugins/filetransfer/FileTransferPlugin.cpp index 9ecda9df4..0b2d528a0 100644 --- a/plugins/filetransfer/FileTransferPlugin.cpp +++ b/plugins/filetransfer/FileTransferPlugin.cpp @@ -47,7 +47,7 @@ FileTransferPlugin::FileTransferPlugin( QObject* parent ) : QObject( parent ), m_fileTransferFeature( QStringLiteral( "FileTransfer" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "4a70bd5a-fab2-4a4b-a92a-a1e81d2b75ed" ), Feature::Uid(), tr( "File transfer" ), {}, diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 606a9ef8d..36c6b0dc3 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -46,7 +46,7 @@ PowerControlFeaturePlugin::PowerControlFeaturePlugin( QObject* parent ) : { QStringLiteral("on"), tr( "Power on a computer via Wake-on-LAN (WOL)" ) }, } ), m_powerOnFeature( QStringLiteral( "PowerOn" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "f483c659-b5e7-4dbc-bd91-2c9403e70ebd" ), Feature::Uid(), tr( "Power on" ), {}, @@ -54,14 +54,14 @@ PowerControlFeaturePlugin::PowerControlFeaturePlugin( QObject* parent ) : "This way you do not have to power on each computer by hand." ), QStringLiteral(":/powercontrol/preferences-system-power-management.png") ), m_rebootFeature( QStringLiteral( "Reboot" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "4f7d98f0-395a-4fff-b968-e49b8d0f748c" ), Feature::Uid(), tr( "Reboot" ), {}, tr( "Click this button to reboot all computers." ), QStringLiteral(":/powercontrol/system-reboot.png") ), m_powerDownFeature( QStringLiteral( "PowerDown" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "6f5a27a0-0e2f-496e-afcc-7aae62eede10" ), Feature::Uid(), tr( "Power down" ), {}, @@ -69,22 +69,22 @@ PowerControlFeaturePlugin::PowerControlFeaturePlugin( QObject* parent ) : "This way you do not have to power down each computer by hand." ), QStringLiteral(":/powercontrol/system-shutdown.png") ), m_powerDownNowFeature( QStringLiteral( "PowerDownNow" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "a88039f2-6716-40d8-b4e1-9f5cd48e91ed" ), m_powerDownFeature.uid(), tr( "Power down now" ), {}, {} ), m_installUpdatesAndPowerDownFeature( QStringLiteral( "InstallUpdatesAndPowerDown" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "09bcb3a1-fc11-4d03-8cf1-efd26be8655b" ), m_powerDownFeature.uid(), tr( "Install updates and power down" ), {}, {} ), m_powerDownConfirmedFeature( QStringLiteral( "PowerDownConfirmed" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "ea2406be-d5c7-42b8-9f04-53469d3cc34c" ), m_powerDownFeature.uid(), tr( "Power down after user confirmation" ), {}, {} ), m_powerDownDelayedFeature( QStringLiteral( "PowerDownDelayed" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "352de795-7fc4-4850-bc57-525bcb7033f5" ), m_powerDownFeature.uid(), tr( "Power down after timeout" ), {}, {} ), diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 54dbf0110..81689e2c3 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -37,14 +37,14 @@ RemoteAccessFeaturePlugin::RemoteAccessFeaturePlugin( QObject* parent ) : QObject( parent ), m_remoteViewFeature( QStringLiteral( "RemoteView" ), - Feature::Session | Feature::Master, + Feature::Flag::Session | Feature::Flag::Master, Feature::Uid( "a18e545b-1321-4d4e-ac34-adc421c6e9c8" ), Feature::Uid(), tr( "Remote view" ), {}, tr( "Open a remote view for a computer without interaction." ), QStringLiteral(":/remoteaccess/kmag.png") ), m_remoteControlFeature( QStringLiteral( "RemoteControl" ), - Feature::Session | Feature::Master, + Feature::Flag::Session | Feature::Flag::Master, Feature::Uid( "ca00ad68-1709-4abe-85e2-48dff6ccf8a2" ), Feature::Uid(), tr( "Remote control" ), {}, diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.cpp b/plugins/screenlock/ScreenLockFeaturePlugin.cpp index 1c24c930d..d2d9c6cbb 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.cpp +++ b/plugins/screenlock/ScreenLockFeaturePlugin.cpp @@ -35,7 +35,7 @@ ScreenLockFeaturePlugin::ScreenLockFeaturePlugin( QObject* parent ) : QObject( parent ), m_screenLockFeature( QStringLiteral( "ScreenLock" ), - Feature::Mode | Feature::AllComponents, + Feature::Flag::Mode | Feature::Flag::AllComponents, Feature::Uid( "ccb535a2-1d24-4cc1-a709-8b47d2b2ac79" ), Feature::Uid(), tr( "Lock" ), tr( "Unlock" ), @@ -45,7 +45,7 @@ ScreenLockFeaturePlugin::ScreenLockFeaturePlugin( QObject* parent ) : "the screens are blacked." ), QStringLiteral(":/screenlock/system-lock-screen.png") ), m_lockInputDevicesFeature( QStringLiteral( "InputDevicesLock" ), - Feature::Mode | Feature::AllComponents | Feature::Meta, + Feature::Flag::Mode | Feature::Flag::AllComponents | Feature::Flag::Meta, Feature::Uid( "e4a77879-e544-4fec-bc18-e534f33b934c" ), {}, tr( "Lock input devices" ), tr( "Unlock input devices" ), diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.cpp b/plugins/screenshot/ScreenshotFeaturePlugin.cpp index 563ed3920..ea357c9dd 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.cpp +++ b/plugins/screenshot/ScreenshotFeaturePlugin.cpp @@ -35,7 +35,7 @@ ScreenshotFeaturePlugin::ScreenshotFeaturePlugin( QObject* parent ) : QObject( parent ), m_screenshotFeature( Feature( QStringLiteral( "Screenshot" ), - Feature::Action | Feature::Master, + Feature::Flag::Action | Feature::Flag::Master, Feature::Uid( "d5ee3aac-2a87-4d05-b827-0c20344490bd" ), Feature::Uid(), tr( "Screenshot" ), {}, diff --git a/plugins/textmessage/TextMessageFeaturePlugin.cpp b/plugins/textmessage/TextMessageFeaturePlugin.cpp index e50a4c894..ec8b8c791 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.cpp +++ b/plugins/textmessage/TextMessageFeaturePlugin.cpp @@ -37,7 +37,7 @@ TextMessageFeaturePlugin::TextMessageFeaturePlugin( QObject* parent ) : QObject( parent ), m_textMessageFeature( Feature( QStringLiteral( "TextMessage" ), - Feature::Action | Feature::AllComponents, + Feature::Flag::Action | Feature::Flag::AllComponents, Feature::Uid( "e75ae9c8-ac17-4d00-8f0d-019348346208" ), Feature::Uid(), tr( "Text message" ), {}, diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp index 012dcc95e..b84a0e706 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp @@ -35,14 +35,14 @@ UserSessionControlPlugin::UserSessionControlPlugin( QObject* parent ) : QObject( parent ), m_userLoginFeature( QStringLiteral( "UserLogin" ), - Feature::Action | Feature::Master | Feature::Service, + Feature::Flag::Action | Feature::Flag::Master | Feature::Flag::Service, Feature::Uid( "7310707d-3918-460d-a949-65bd152cb958" ), Feature::Uid(), tr( "Log in" ), {}, tr( "Click this button to log in a specific user on all computers." ), QStringLiteral( ":/usersessioncontrol/login-user.png" ) ), m_userLogoffFeature( QStringLiteral( "UserLogoff" ), - Feature::Action | Feature::Master | Feature::Service, + Feature::Flag::Action | Feature::Flag::Master | Feature::Flag::Service, Feature::Uid( "7311d43d-ab53-439e-a03a-8cb25f7ed526" ), Feature::Uid(), tr( "Log off" ), {}, From f4d0e36c2afb208d3a8de4362bc0431634c36676 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 10:22:29 +0200 Subject: [PATCH 1093/1765] CLI: rename PluginsCommands to PluginCommand --- cli/CMakeLists.txt | 4 ++-- cli/src/{PluginsCommands.cpp => PluginCommands.cpp} | 12 ++++++------ cli/src/{PluginsCommands.h => PluginCommands.h} | 10 +++++----- cli/src/ShellCommands.h | 2 +- cli/src/main.cpp | 4 ++-- 5 files changed, 16 insertions(+), 16 deletions(-) rename cli/src/{PluginsCommands.cpp => PluginCommands.cpp} (84%) rename cli/src/{PluginsCommands.h => PluginCommands.h} (88%) diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 9ec533f83..66e75dc97 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -5,8 +5,8 @@ set(cli_SOURCES src/main.cpp src/ConfigCommands.cpp src/ConfigCommands.h - src/PluginsCommands.cpp - src/PluginsCommands.h + src/PluginCommands.cpp + src/PluginCommands.h src/ServiceControlCommands.cpp src/ServiceControlCommands.h src/ShellCommands.cpp diff --git a/cli/src/PluginsCommands.cpp b/cli/src/PluginCommands.cpp similarity index 84% rename from cli/src/PluginsCommands.cpp rename to cli/src/PluginCommands.cpp index 1e80369cc..38617a44b 100644 --- a/cli/src/PluginsCommands.cpp +++ b/cli/src/PluginCommands.cpp @@ -23,11 +23,11 @@ */ #include "CommandLineIO.h" -#include "PluginsCommands.h" +#include "PluginCommands.h" #include "PluginManager.h" -PluginsCommands::PluginsCommands( QObject* parent ) : +PluginCommands::PluginCommands( QObject* parent ) : QObject( parent ), m_commands( { { QStringLiteral("list"), tr( "List names of all installed plugins" ) }, @@ -38,21 +38,21 @@ PluginsCommands::PluginsCommands( QObject* parent ) : -QStringList PluginsCommands::commands() const +QStringList PluginCommands::commands() const { return m_commands.keys(); } -QString PluginsCommands::commandHelp( const QString& command ) const +QString PluginCommands::commandHelp( const QString& command ) const { return m_commands.value( command ); } -CommandLinePluginInterface::RunResult PluginsCommands::handle_list( const QStringList& arguments ) +CommandLinePluginInterface::RunResult PluginCommands::handle_list( const QStringList& arguments ) { Q_UNUSED(arguments) @@ -67,7 +67,7 @@ CommandLinePluginInterface::RunResult PluginsCommands::handle_list( const QStrin -CommandLinePluginInterface::RunResult PluginsCommands::handle_show( const QStringList& arguments ) +CommandLinePluginInterface::RunResult PluginCommands::handle_show( const QStringList& arguments ) { Q_UNUSED(arguments) diff --git a/cli/src/PluginsCommands.h b/cli/src/PluginCommands.h similarity index 88% rename from cli/src/PluginsCommands.h rename to cli/src/PluginCommands.h index dff496a3c..71ce5ed33 100644 --- a/cli/src/PluginsCommands.h +++ b/cli/src/PluginCommands.h @@ -27,13 +27,13 @@ #include "CommandLinePluginInterface.h" #include "CommandLineIO.h" -class PluginsCommands : public QObject, CommandLinePluginInterface, PluginInterface, CommandLineIO +class PluginCommands : public QObject, CommandLinePluginInterface, PluginInterface, CommandLineIO { Q_OBJECT Q_INTERFACES(PluginInterface CommandLinePluginInterface) public: - explicit PluginsCommands( QObject* parent = nullptr ); - ~PluginsCommands() override = default; + explicit PluginCommands( QObject* parent = nullptr ); + ~PluginCommands() override = default; Plugin::Uid uid() const override { @@ -47,7 +47,7 @@ class PluginsCommands : public QObject, CommandLinePluginInterface, PluginInterf QString name() const override { - return QStringLiteral( "Plugins" ); + return QStringLiteral( "Plugin" ); } QString description() const override @@ -67,7 +67,7 @@ class PluginsCommands : public QObject, CommandLinePluginInterface, PluginInterf QString commandLineModuleName() const override { - return QStringLiteral( "plugins" ); + return QStringLiteral( "plugin" ); } QString commandLineModuleHelp() const override diff --git a/cli/src/ShellCommands.h b/cli/src/ShellCommands.h index a4424ce9f..3f091a1f2 100644 --- a/cli/src/ShellCommands.h +++ b/cli/src/ShellCommands.h @@ -51,7 +51,7 @@ class ShellCommands : public QObject, CommandLinePluginInterface, PluginInterfac QString description() const override { - return tr( "Interactive shell and script execution for Veyon Control" ); + return tr( "Interactive shell and script execution for Veyon CLI" ); } QString vendor() const override diff --git a/cli/src/main.cpp b/cli/src/main.cpp index e4ba5bced..dd97f82ef 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -28,7 +28,7 @@ #include "ConfigCommands.h" #include "Logger.h" -#include "PluginsCommands.h" +#include "PluginCommands.h" #include "PluginManager.h" #include "ServiceControlCommands.h" #include "ShellCommands.h" @@ -85,7 +85,7 @@ int main( int argc, char **argv ) auto core = new VeyonCore( app, VeyonCore::Component::CLI, QStringLiteral("CLI") ); VeyonCore::pluginManager().registerExtraPluginInterface( new ConfigCommands( core ) ); - VeyonCore::pluginManager().registerExtraPluginInterface( new PluginsCommands( core ) ); + VeyonCore::pluginManager().registerExtraPluginInterface( new PluginCommands( core ) ); VeyonCore::pluginManager().registerExtraPluginInterface( new ServiceControlCommands( core ) ); VeyonCore::pluginManager().registerExtraPluginInterface( new ShellCommands( core ) ); From 45d1c9236d084732f497ec4bf16bb8abf5f0028c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 12:47:41 +0200 Subject: [PATCH 1094/1765] PowerControlFeaturePlugin: check feature in controlFeature() 669d23af785cc4e7241619eecf31276fe09db1b7 unintentionally removed a required check from controlFeature() which made it send default messages for other features. --- plugins/powercontrol/PowerControlFeaturePlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 36c6b0dc3..e04e56e9f 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -121,7 +121,7 @@ bool PowerControlFeaturePlugin::controlFeature( Feature::Uid featureUid, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ) { - if( operation != Operation::Start ) + if( operation != Operation::Start || hasFeature( featureUid ) == false ) { return false; } From 095363d3a6cba6bd69f83ced9a4cad7165366724 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 12:49:26 +0200 Subject: [PATCH 1095/1765] CLI: PluginCommands: clean up headers --- cli/src/PluginCommands.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/cli/src/PluginCommands.cpp b/cli/src/PluginCommands.cpp index 38617a44b..b3d2e4963 100644 --- a/cli/src/PluginCommands.cpp +++ b/cli/src/PluginCommands.cpp @@ -22,7 +22,6 @@ * */ -#include "CommandLineIO.h" #include "PluginCommands.h" #include "PluginManager.h" From f78c5e7a915e4aeee78a9c6f452f1f97d229a8c3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 12:49:51 +0200 Subject: [PATCH 1096/1765] CLI: add FeatureCommands This adds the new "feature" module allowing to query features and control them remotely. Closes #585. --- cli/CMakeLists.txt | 2 + cli/src/FeatureCommands.cpp | 307 ++++++++++++++++++++++++++++++++++++ cli/src/FeatureCommands.h | 104 ++++++++++++ cli/src/main.cpp | 2 + 4 files changed, 415 insertions(+) create mode 100644 cli/src/FeatureCommands.cpp create mode 100644 cli/src/FeatureCommands.h diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 66e75dc97..5b825315c 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -5,6 +5,8 @@ set(cli_SOURCES src/main.cpp src/ConfigCommands.cpp src/ConfigCommands.h + src/FeatureCommands.cpp + src/FeatureCommands.h src/PluginCommands.cpp src/PluginCommands.h src/ServiceControlCommands.cpp diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp new file mode 100644 index 000000000..2f9a6202f --- /dev/null +++ b/cli/src/FeatureCommands.cpp @@ -0,0 +1,307 @@ +/* + * FeatureCommands.cpp - implementation of FeatureCommands class + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include +#include +#include +#include +#include + +#include "AuthenticationManager.h" +#include "ComputerControlInterface.h" +#include "FeatureCommands.h" +#include "FeatureManager.h" +#include "PluginManager.h" + + +FeatureCommands::FeatureCommands( QObject* parent ) : + QObject( parent ), + m_commands( { + { QStringLiteral("list"), tr( "List names of all available features" ) }, + { QStringLiteral("show"), tr( "Show table with details of all available features" ) }, + { startCommand(), tr( "Start a feature on a remote host" ) }, + { stopCommand(), tr( "Stop a feature on a remote host" ) } + } ) +{ +} + + + +QStringList FeatureCommands::commands() const +{ + return m_commands.keys(); +} + + + +QString FeatureCommands::commandHelp( const QString& command ) const +{ + return m_commands.value( command ); +} + + + +CommandLinePluginInterface::RunResult FeatureCommands::handle_help( const QStringList& arguments ) +{ + const auto command = arguments.value( 0 ); + if( command.isEmpty() ) + { + error( tr("Please specify the command to display help for.") ); + return NoResult; + } + + if( command == startCommand() ) + { + printUsage( commandLineModuleName(), startCommand(), + { { tr("HOST ADDRESS"), {} }, { tr("FEATURE"), {} } }, + { { tr("ARGUMENTS"), {} } } ); + + printDescription( tr("Starts the specified feature on the specified host by connecting to " + "the Veyon Server running remotely. The feature can be specified by name " + "or UID. Use the ``show`` command to see all available features. " + "Depending on the feature, additional arguments (such as the text message to display) " + "encoded as a single JSON string have to be specified. Please refer to " + "the developer documentation for more information") ); + + printExamples( commandLineModuleName(), startCommand(), + { + { tr( "Lock the screen" ), + { QStringLiteral("192.168.1.2"), QStringLiteral("ScreenLock") } + }, + { tr( "Display a text message" ), + { QStringLiteral("192.168.1.2"), QStringLiteral("TextMessage"), + QStringLiteral("\"{\\\"text\\\":\\\"%1\\\"}\"").arg( tr("Test message") ) } + }, + { tr( "Start an application" ), + { QStringLiteral("192.168.1.2"), QStringLiteral("da9ca56a-b2ad-4fff-8f8a-929b2927b442"), + QStringLiteral("\"{\\\"applications\\\":\\\"notepad\\\"}\"") } + } + } ); + + return NoResult; + } + + if( command == stopCommand() ) + { + printUsage( commandLineModuleName(), stopCommand(), + { { tr("HOST ADDRESS"), {} }, { tr("FEATURE"), {} } }, {} ); + + printDescription( tr("Stops the specified feature on the specified host by connecting to " + "the Veyon Server running remotely. The feature can be specified by name " + "or UID. Use the ``show`` command to see all available features.") ); + + printExamples( commandLineModuleName(), stopCommand(), + { + { tr( "Unlock the screen" ), + { QStringLiteral("192.168.1.2"), QStringLiteral("ScreenLock") } + } + } ); + + return NoResult; + } + + error( tr("The specified command does not exist or no help is available for it.") ); + + return NoResult; +} + + +CommandLinePluginInterface::RunResult FeatureCommands::handle_list( const QStringList& arguments ) +{ + Q_UNUSED(arguments) + + FeatureManager featureManager; + for( const auto& feature : qAsConst(featureManager.features()) ) + { + print( feature.name() ); + } + + return NoResult; +} + + + +CommandLinePluginInterface::RunResult FeatureCommands::handle_show( const QStringList& arguments ) +{ + Q_UNUSED(arguments) + + FeatureManager featureManager; + const auto& features = featureManager.features(); + + TableHeader tableHeader( { tr("Name"), tr("Description"), tr("Master"), tr("Service"), tr("Worker"), tr("UID"), tr("Plugin") } ); + TableRows tableRows; + tableRows.reserve( features.count() ); + + for( const auto& feature : features ) + { + if( feature.testFlag( Feature::Flag::Meta) ) + { + continue; + } + + tableRows.append( { + feature.name(), + feature.displayName(), + feature.testFlag(Feature::Flag::Master) ? QLatin1String("x") : QString(), + feature.testFlag(Feature::Flag::Service) ? QLatin1String("x") : QString(), + feature.testFlag(Feature::Flag::Worker) ? QLatin1String("x") : QString(), +#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) + feature.uid().toString( QUuid::WithoutBraces ), +#else + VeyonCore::formattedUuid( feature.uid().toString() ), +#endif + VeyonCore::pluginManager().pluginName( featureManager.pluginUid(feature) ) + } ); + } + + std::sort( tableRows.begin(), tableRows.end(), []( const TableRow& a, const TableRow& b ) { + return a.first() < b.first(); + }) ; + + printTable( Table( tableHeader, tableRows ) ); + + return NoResult; +} + + + +CommandLinePluginInterface::RunResult FeatureCommands::handle_start( const QStringList& arguments ) +{ + return controlComputer( FeatureProviderInterface::Operation::Start, arguments ); +} + + + +CommandLinePluginInterface::RunResult FeatureCommands::handle_stop( const QStringList& arguments ) +{ + return controlComputer( FeatureProviderInterface::Operation::Stop, arguments ); +} + + + +CommandLinePluginInterface::RunResult FeatureCommands::controlComputer( FeatureProviderInterface::Operation operation, + const QStringList& arguments ) +{ + if( arguments.count() < 2 ) + { + return NotEnoughArguments; + } + + const auto host = arguments[0]; + const auto featureNameOrUid = arguments[1]; + const auto featureArguments = arguments.value(2); + + FeatureManager featureManager; + + Feature::Uid featureUid{featureNameOrUid}; + if( featureUid.isNull() ) + { + for( const auto& feature : featureManager.features() ) + { + if( feature.name() == featureNameOrUid ) + { + featureUid = feature.uid(); + break; + } + } + } + else if( featureManager.feature( featureUid ).isValid() == false ) + { + featureUid = Feature::Uid{}; + } + + if( featureUid.isNull() ) + { + error( tr("Invalid feature name or UID specified") ); + return InvalidArguments; + } + + QJsonParseError parseError; + const auto featureArgsJson = QJsonDocument::fromJson( featureArguments.toUtf8(), &parseError ); + + if( featureArguments.isEmpty() == false && parseError.error != QJsonParseError::NoError ) + { + error( tr("Error parsing the JSON-encoded arguments: %1").arg( parseError.errorString() ) ); + return InvalidArguments; + } + + if( VeyonCore::authenticationManager().initializeCredentials() == false || + VeyonCore::authenticationManager().initializedPlugin()->checkCredentials() == false ) + { + error( tr("Failed to initialize credentials") ); + return Failed; + } + + Computer computer; + computer.setHostAddress( host ); + + auto computerControlInterface = ComputerControlInterface::Pointer::create( computer ); + computerControlInterface->start(); + + static constexpr auto ConnectTimeout = 30 * 1000; + QTimer timeoutTimer; + timeoutTimer.start( ConnectTimeout ); + + QEventLoop eventLoop; + connect( &timeoutTimer, &QTimer::timeout, &eventLoop, &QEventLoop::quit ); + connect( computerControlInterface.data(), &ComputerControlInterface::stateChanged, this, + [&]() { + if( computerControlInterface->state() == ComputerControlInterface::State::Connected ) + { + eventLoop.quit(); + } + } ); + + eventLoop.exec(); + + if( computerControlInterface->state() != ComputerControlInterface::State::Connected ) + { + error( tr("Could not establish a connection to host %1").arg( host ) ); + return Failed; + } + + featureManager.controlFeature( featureUid, operation, + featureArgsJson.toVariant().toMap(), + { computerControlInterface } ); + + static constexpr auto MessageQueueWaitTimeout = 10 * 1000; + static constexpr auto MessageQueuePollInterval = 10; + + QElapsedTimer messageQueueWaitTimer; + messageQueueWaitTimer.start(); + + while( computerControlInterface->isMessageQueueEmpty() == false && + messageQueueWaitTimer.elapsed() < MessageQueueWaitTimeout ) + { + QThread::msleep(MessageQueuePollInterval); + } + + if( messageQueueWaitTimer.elapsed() >= MessageQueueWaitTimeout ) + { + error( tr("Failed to send feature control message to host %1").arg( host ) ); + return Failed; + } + + return Successful; +} diff --git a/cli/src/FeatureCommands.h b/cli/src/FeatureCommands.h new file mode 100644 index 000000000..abac731ed --- /dev/null +++ b/cli/src/FeatureCommands.h @@ -0,0 +1,104 @@ +/* + * FeatureCommands.h - declaration of FeatureCommands class + * + * Copyright (c) 2021 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include "CommandLinePluginInterface.h" +#include "CommandLineIO.h" +#include "FeatureProviderInterface.h" + +class FeatureCommands : public QObject, CommandLinePluginInterface, PluginInterface, CommandLineIO +{ + Q_OBJECT + Q_INTERFACES(PluginInterface CommandLinePluginInterface) +public: + explicit FeatureCommands( QObject* parent = nullptr ); + ~FeatureCommands() override = default; + + Plugin::Uid uid() const override + { + return Plugin::Uid{ QStringLiteral("2376b972-0bf1-4f50-bcfd-79d4d90730c6") }; + } + + QVersionNumber version() const override + { + return QVersionNumber( 1, 0 ); + } + + QString name() const override + { + return QStringLiteral( "FeatureCommands" ); + } + + QString description() const override + { + return tr( "Feature-related CLI operations" ); + } + + QString vendor() const override + { + return QStringLiteral( "Veyon Community" ); + } + + QString copyright() const override + { + return QStringLiteral( "Tobias Junghans" ); + } + + QString commandLineModuleName() const override + { + return QStringLiteral( "feature" ); + } + + QString commandLineModuleHelp() const override + { + return tr( "Commands for controlling features" ); + } + + QStringList commands() const override; + QString commandHelp( const QString& command ) const override; + +public Q_SLOTS: + CommandLinePluginInterface::RunResult handle_help( const QStringList& arguments ); + CommandLinePluginInterface::RunResult handle_list( const QStringList& arguments ); + CommandLinePluginInterface::RunResult handle_show( const QStringList& arguments ); + CommandLinePluginInterface::RunResult handle_start( const QStringList& arguments ); + CommandLinePluginInterface::RunResult handle_stop( const QStringList& arguments ); + +private: + static QString startCommand() + { + return QStringLiteral("start"); + } + + static QString stopCommand() + { + return QStringLiteral("stop"); + } + + RunResult controlComputer( FeatureProviderInterface::Operation operation, const QStringList& arguments ); + + const QMap m_commands; + +}; diff --git a/cli/src/main.cpp b/cli/src/main.cpp index dd97f82ef..80adea022 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -27,6 +27,7 @@ #include #include "ConfigCommands.h" +#include "FeatureCommands.h" #include "Logger.h" #include "PluginCommands.h" #include "PluginManager.h" @@ -85,6 +86,7 @@ int main( int argc, char **argv ) auto core = new VeyonCore( app, VeyonCore::Component::CLI, QStringLiteral("CLI") ); VeyonCore::pluginManager().registerExtraPluginInterface( new ConfigCommands( core ) ); + VeyonCore::pluginManager().registerExtraPluginInterface( new FeatureCommands( core ) ); VeyonCore::pluginManager().registerExtraPluginInterface( new PluginCommands( core ) ); VeyonCore::pluginManager().registerExtraPluginInterface( new ServiceControlCommands( core ) ); VeyonCore::pluginManager().registerExtraPluginInterface( new ShellCommands( core ) ); From 17b9d21f720a5a5e66894017feb34cdbc9a378f9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 13:45:35 +0200 Subject: [PATCH 1097/1765] AuthKeys: improve messages in help handler --- plugins/authkeys/AuthKeysPlugin.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index dd81b44d9..fb24f6057 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -242,6 +242,11 @@ QString AuthKeysPlugin::commandHelp( const QString& command ) const CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_help( const QStringList& arguments ) { const auto command = arguments.value( 0 ); + if( command.isEmpty() ) + { + error( tr("Please specify the command to display help for.") ); + return NoResult; + } const QMap commands = { { QStringLiteral("create"), @@ -285,9 +290,9 @@ CommandLinePluginInterface::RunResult AuthKeysPlugin::handle_help( const QString return NoResult; } - print( tr("Please specify the command to display help for!") ); + error( tr("The specified command does not exist or no help is available for it.") ); - return Unknown; + return NoResult; } From e0b1ce8bd47347a00a8546e3a28138863fe772e3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 13:46:36 +0200 Subject: [PATCH 1098/1765] BuiltinDirectory: improve messages in help handler --- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 5a02ca902..97624c4de 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -183,7 +183,9 @@ CommandLinePluginInterface::RunResult BuiltinDirectoryPlugin::handle_help( const return NoResult; } - return Unknown; + error( tr("The specified command does not exist or no help is available for it.") ); + + return NoResult; } From b2214a3c28f72ff0b5b7cc67d7c8fe3c10e19f90 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 14:32:12 +0200 Subject: [PATCH 1099/1765] Core: don't cast to rfbBool implicitly --- core/src/VeyonConnection.cpp | 4 ++-- core/src/VncConnection.cpp | 4 ++-- core/src/VncEvents.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 60ddec230..cde24e6a1 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -42,7 +42,7 @@ rfbBool handleVeyonMessage( rfbClient* client, rfbServerToClientMsg* msg ) auto connection = reinterpret_cast( VncConnection::clientData( client, VeyonConnection::VeyonConnectionTag ) ); if( connection ) { - return connection->handleServerMessage( client, msg->type ); + return connection->handleServerMessage( client, msg->type ) ? TRUE : FALSE; } return false; @@ -238,7 +238,7 @@ int8_t VeyonConnection::handleSecTypeVeyon( rfbClient* client, uint32_t authSche VariantArrayMessage authAckMessage( &socketDevice ); authAckMessage.receive(); - return plugins[chosenAuthPlugin]->authenticate( &socketDevice ); + return plugins[chosenAuthPlugin]->authenticate( &socketDevice ) ? TRUE : FALSE; } diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 2dde14cf6..1f25c75dd 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -197,7 +197,7 @@ void VncConnection::setUseRemoteCursor( bool enabled ) if( m_client ) { - m_client->appData.useRemoteCursor = enabled; + m_client->appData.useRemoteCursor = enabled ? TRUE : FALSE; enqueueEvent( new VncUpdateFormatAndEncodingsEvent, true ); } @@ -616,7 +616,7 @@ rfbBool VncConnection::initFrameBuffer( rfbClient* client ) client->format.blueMax = 0xff; client->appData.encodingsString = "zrle ultra copyrect hextile zlib corre rre raw"; - client->appData.useRemoteCursor = m_useRemoteCursor; + client->appData.useRemoteCursor = m_useRemoteCursor ? TRUE : FALSE; client->appData.compressLevel = 0; client->appData.useBGR233 = false; client->appData.qualityLevel = 9; diff --git a/core/src/VncEvents.cpp b/core/src/VncEvents.cpp index 25add6c17..e7d2d12fa 100644 --- a/core/src/VncEvents.cpp +++ b/core/src/VncEvents.cpp @@ -36,7 +36,7 @@ VncKeyEvent::VncKeyEvent( unsigned int key, bool pressed ) : void VncKeyEvent::fire( rfbClient* client ) { - SendKeyEvent( client, m_key, m_pressed ); + SendKeyEvent( client, m_key, m_pressed ? TRUE : FALSE ); } From 16d711160de1f470934d2681f37cf801675ca019 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 14:50:31 +0200 Subject: [PATCH 1100/1765] Fix or silence various clang-tidy/clazy warnings --- configurator/src/MasterConfigurationPage.cpp | 2 +- ...etworkObjectDirectoryConfigurationPage.cpp | 6 +-- core/src/AccessControlRule.cpp | 2 +- core/src/Configuration/Object.cpp | 3 +- core/src/CryptoCore.cpp | 3 +- core/src/Filesystem.h | 1 + core/src/NetworkObject.cpp | 5 ++ core/src/UserGroupsBackendManager.cpp | 4 +- core/src/VncView.cpp | 2 +- core/src/VncView.h | 4 +- core/src/VncViewItem.cpp | 4 +- core/src/VncViewItem.h | 2 +- core/src/VncViewWidget.cpp | 4 +- core/src/VncViewWidget.h | 2 +- master/src/ComputerImageProvider.h | 1 + master/src/ComputerManager.cpp | 1 + master/src/ComputerZoomWidget.h | 1 + master/src/MainWindow.cpp | 47 +++++++++++-------- master/src/SpotlightModel.cpp | 2 +- master/src/SpotlightModel.h | 2 +- .../authkeys/AuthKeysConfigurationWidget.h | 1 + plugins/demo/DemoClient.cpp | 3 +- plugins/demo/DemoClient.h | 2 +- plugins/demo/DemoServerConnection.cpp | 4 +- plugins/filetransfer/FileTransferController.h | 1 + plugins/ldap/AuthLdapConfigurationWidget.h | 1 + plugins/platform/linux/LinuxCoreFunctions.cpp | 2 +- .../linux/LinuxFilesystemFunctions.cpp | 2 +- .../linux/LinuxPlatformConfigurationPage.h | 1 + .../platform/linux/LinuxPlatformPlugin.cpp | 2 +- plugins/platform/linux/LinuxServerProcess.cpp | 4 +- plugins/platform/linux/LinuxServiceCore.cpp | 2 +- plugins/platform/linux/LinuxUserFunctions.cpp | 2 +- .../textmessage/TextMessageFeaturePlugin.cpp | 6 +-- server/src/ComputerControlServer.cpp | 3 ++ 35 files changed, 78 insertions(+), 56 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index e04df1e2e..683730fe0 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -169,7 +169,7 @@ void MasterConfigurationPage::updateFeatureLists() continue; } - QListWidgetItem* item = new QListWidgetItem( QIcon( feature.iconUrl() ), feature.displayName() ); + auto item = new QListWidgetItem( QIcon( feature.iconUrl() ), feature.displayName() ); item->setData( Qt::UserRole, feature.uid().toString() ); if( m_disabledFeatures.contains( feature.uid().toString() ) ) diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp index 6107f1e26..ed4aded8c 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp @@ -55,7 +55,7 @@ void NetworkObjectDirectoryConfigurationPage::resetWidgets() { FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); - for( const auto* tab : m_tabs ) + for( const auto* tab : qAsConst(m_tabs) ) { tab->content()->resetWidgets(); tab->enabledCheckBox()->setChecked( VeyonCore::networkObjectDirectoryManager().isEnabled( tab->plugin() ) ); @@ -69,7 +69,7 @@ void NetworkObjectDirectoryConfigurationPage::connectWidgetsToProperties() { FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); - for( const auto* tab : m_tabs ) + for( const auto* tab : qAsConst(m_tabs) ) { const auto plugin = tab->plugin(); const auto checkBox = tab->enabledCheckBox(); @@ -84,7 +84,7 @@ void NetworkObjectDirectoryConfigurationPage::connectWidgetsToProperties() void NetworkObjectDirectoryConfigurationPage::applyConfiguration() { - for( auto tab : m_tabs ) + for( const auto* tab : qAsConst(m_tabs) ) { tab->content()->applyConfiguration(); } diff --git a/core/src/AccessControlRule.cpp b/core/src/AccessControlRule.cpp index 8075c06cc..9909bd4da 100644 --- a/core/src/AccessControlRule.cpp +++ b/core/src/AccessControlRule.cpp @@ -65,7 +65,7 @@ AccessControlRule::AccessControlRule( const QJsonValue& jsonValue ) : const auto parameters = json[QStringLiteral("Parameters")].toArray(); - for( auto parametersValue : parameters ) + for( const auto& parametersValue : parameters ) { QJsonObject parametersObj = parametersValue.toObject(); auto condition = static_cast( parametersObj[QStringLiteral("Condition")].toInt() ); diff --git a/core/src/Configuration/Object.cpp b/core/src/Configuration/Object.cpp index f875eb015..61f798704 100644 --- a/core/src/Configuration/Object.cpp +++ b/core/src/Configuration/Object.cpp @@ -49,8 +49,7 @@ Object::Object( Store* store ) : -Object::Object( const Object& obj ) : - m_store( nullptr ) +Object::Object( const Object& obj ) { *this = obj; } diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index 27e6636aa..5d4099d49 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -113,7 +113,8 @@ CryptoCore::Certificate CryptoCore::createSelfSignedHostCertificate( const Priva { QCA::CertificateInfoTypeKnown::DNS, HostAddress::localFQDN() } }; - for( const auto& address : QNetworkInterface::allAddresses() ) + const auto allAddresses = QNetworkInterface::allAddresses(); + for( const auto& address : allAddresses ) { certInfo.insert( QCA::CertificateInfoTypeKnown::IPAddress, address.toString() ); } diff --git a/core/src/Filesystem.h b/core/src/Filesystem.h index 918d7488f..df54fe2df 100644 --- a/core/src/Filesystem.h +++ b/core/src/Filesystem.h @@ -28,6 +28,7 @@ // clazy:excludeall=rule-of-three +// clazy:excludeall=ctor-missing-parent-argument class VEYON_CORE_EXPORT Filesystem : public QObject { Q_OBJECT diff --git a/core/src/NetworkObject.cpp b/core/src/NetworkObject.cpp index 31022e84a..33b159e6c 100644 --- a/core/src/NetworkObject.cpp +++ b/core/src/NetworkObject.cpp @@ -84,6 +84,11 @@ NetworkObject::NetworkObject( const QJsonObject& jsonObject, NetworkObjectDirect NetworkObject& NetworkObject::operator=( const NetworkObject& other ) { + if( this == &other ) + { + return *this; + } + m_directory = other.directory(); m_type = other.type(); m_name = other.name(); diff --git a/core/src/UserGroupsBackendManager.cpp b/core/src/UserGroupsBackendManager.cpp index 48f1997d4..07caabd73 100644 --- a/core/src/UserGroupsBackendManager.cpp +++ b/core/src/UserGroupsBackendManager.cpp @@ -28,9 +28,7 @@ UserGroupsBackendManager::UserGroupsBackendManager( QObject* parent ) : - QObject( parent ), - m_defaultBackend( nullptr ), - m_accessControlBackend( nullptr ) + QObject( parent ) { for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) { diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index affeadd34..9e5cad39b 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -37,7 +37,7 @@ #include "VncView.h" -VncView::VncView( ComputerControlInterface::Pointer computerControlInterface ) : +VncView::VncView( const ComputerControlInterface::Pointer& computerControlInterface ) : m_computerControlInterface( [computerControlInterface]() { if( computerControlInterface->state() == ComputerControlInterface::State::Disconnected || computerControlInterface->connection() == nullptr ) diff --git a/core/src/VncView.h b/core/src/VncView.h index b03447625..a9c36c7b9 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -54,7 +54,7 @@ class VEYON_CORE_EXPORT VncView ShortcutCount } ; - VncView( ComputerControlInterface::Pointer computerControlInterface ); + VncView( const ComputerControlInterface::Pointer& computerControlInterface ); virtual ~VncView(); ComputerControlInterface::Pointer computerControlInterface() const @@ -81,7 +81,7 @@ class VEYON_CORE_EXPORT VncView return m_viewport; } - void setViewport( const QRect& viewport ) + void setViewport( QRect viewport ) { m_viewport = viewport; } diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index ed6025b2f..652c8dc06 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -29,7 +29,7 @@ #include "VncViewItem.h" -VncViewItem::VncViewItem( ComputerControlInterface::Pointer computerControlInterface, QQuickItem* parent ) : +VncViewItem::VncViewItem( const ComputerControlInterface::Pointer& computerControlInterface, QQuickItem* parent ) : QQuickItem( parent ), VncView( computerControlInterface ) { @@ -69,7 +69,7 @@ QSGNode* VncViewItem::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* up node->setTexture( texture ); } - const auto texture = dynamic_cast( node->texture() ); + const auto texture = qobject_cast( node->texture() ); if( viewport().isValid() ) { diff --git a/core/src/VncViewItem.h b/core/src/VncViewItem.h index bb8ffe136..5eeb42b7b 100644 --- a/core/src/VncViewItem.h +++ b/core/src/VncViewItem.h @@ -32,7 +32,7 @@ class VEYON_CORE_EXPORT VncViewItem : public QQuickItem, public VncView { Q_OBJECT public: - VncViewItem( ComputerControlInterface::Pointer computerControlInterface, QQuickItem* parent = nullptr ); + VncViewItem( const ComputerControlInterface::Pointer& computerControlInterface, QQuickItem* parent = nullptr ); ~VncViewItem() override; QSGNode* updatePaintNode( QSGNode *oldNode, UpdatePaintNodeData* updatePaintNodeData ) override; diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index b17ff8f19..cad93133b 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -38,8 +38,8 @@ #include "VncViewWidget.h" -VncViewWidget::VncViewWidget( ComputerControlInterface::Pointer computerControlInterface, - const QRect& viewport, QWidget* parent ) : +VncViewWidget::VncViewWidget( const ComputerControlInterface::Pointer& computerControlInterface, + QRect viewport, QWidget* parent ) : QWidget( parent ), VncView( computerControlInterface ) { diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index d1009b5d7..3305c5f3b 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -34,7 +34,7 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView { Q_OBJECT public: - VncViewWidget( ComputerControlInterface::Pointer computerControlInterface, const QRect& viewport, + VncViewWidget( const ComputerControlInterface::Pointer& computerControlInterface, QRect viewport, QWidget* parent ); ~VncViewWidget() override; diff --git a/master/src/ComputerImageProvider.h b/master/src/ComputerImageProvider.h index 228d3c6a5..b037f3d14 100644 --- a/master/src/ComputerImageProvider.h +++ b/master/src/ComputerImageProvider.h @@ -28,6 +28,7 @@ class ComputerControlListModel; +// clazy:excludeall=copyable-polymorphic class ComputerImageProvider : public QQuickImageProvider { public: diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 7e67a6931..1264825db 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -359,6 +359,7 @@ ComputerList ComputerManager::getComputersAtLocation( const QString& locationNam int rows = model->rowCount( parent ); ComputerList computers; + computers.reserve( rows ); for( int i = 0; i < rows; ++i ) { diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index 324718113..15339d58d 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -30,6 +30,7 @@ class VncViewWidget; +// clazy:excludeall=ctor-missing-parent-argument class ComputerZoomWidget : public QWidget { Q_OBJECT diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index e147ef111..dd14d7529 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -128,6 +128,7 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : connect( *it, &QAbstractButton::toggled, it.key(), &QWidget::setVisible ); } + QList splitterSizes; for( auto* splitter : { slideshowSpotlightSplitter, monitoringSplitter, mainSplitter } ) { splitter->setHandleWidth( 7 ); @@ -135,31 +136,37 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : splitter->installEventFilter( this ); - QList splitterSizes; int index = 0; - for( const auto& sizeObject : m_master.userConfig().splitterStates()[splitter->objectName()].toArray() ) + const auto splitterStates = m_master.userConfig().splitterStates()[splitter->objectName()].toArray(); + splitterSizes.clear(); + splitterSizes.reserve( splitterStates.size() ); + + for( const auto& sizeObject : splitterStates ) { auto size = sizeObject.toInt(); const auto widget = splitter->widget( index ); const auto button = panelButtons.value( widget ); - if( widget && button ) - { - widget->setVisible( size > 0 ); - button->setChecked( size > 0 ); - } - size = qAbs( size ); - if( splitter->orientation() == Qt::Horizontal ) + if( widget ) { - widget->resize( size, widget->height() ); - } - else - { - widget->resize( widget->width(), size ); - } + if( button ) + { + widget->setVisible( size > 0 ); + button->setChecked( size > 0 ); + } + size = qAbs( size ); + if( splitter->orientation() == Qt::Horizontal ) + { + widget->resize( size, widget->height() ); + } + else + { + widget->resize( widget->width(), size ); + } - widget->setProperty( originalSizePropertyName(), widget->size() ); + widget->setProperty( originalSizePropertyName(), widget->size() ); + } splitterSizes.append( size ); ++index; } @@ -331,12 +338,14 @@ void MainWindow::closeEvent( QCloseEvent* event ) } QJsonObject splitterStates; - for( const auto* splitter : findChildren() ) + const auto splitters = findChildren(); + for( const auto* splitter : splitters ) { + const auto sizes = splitter->sizes(); QJsonArray splitterSizes; int i = 0; int hiddenSize = 0; - for( auto size : splitter->sizes() ) + for( auto size : sizes ) { auto widget = splitter->widget(i); const auto originalSize = widget->property( originalSizePropertyName() ).toSize(); @@ -421,7 +430,7 @@ void MainWindow::addFeaturesToToolBar() continue; } - ToolButton* btn = new ToolButton( QIcon( feature.iconUrl() ), + auto btn = new ToolButton( QIcon( feature.iconUrl() ), feature.displayName(), feature.displayNameActive(), feature.description(), diff --git a/master/src/SpotlightModel.cpp b/master/src/SpotlightModel.cpp index 706c3247e..77052000a 100644 --- a/master/src/SpotlightModel.cpp +++ b/master/src/SpotlightModel.cpp @@ -46,7 +46,7 @@ void SpotlightModel::setUpdateInRealtime( bool enabled ) { m_updateInRealtime = enabled; - for( const auto& controlInterface : m_controlInterfaces ) + for( const auto& controlInterface : qAsConst(m_controlInterfaces) ) { controlInterface->setUpdateMode( m_updateInRealtime ? ComputerControlInterface::UpdateMode::Live diff --git a/master/src/SpotlightModel.h b/master/src/SpotlightModel.h index c585fddc9..c56a4008a 100644 --- a/master/src/SpotlightModel.h +++ b/master/src/SpotlightModel.h @@ -49,7 +49,7 @@ class SpotlightModel : public QSortFilterProxyModel private: QSize m_iconSize; - bool m_updateInRealtime; + bool m_updateInRealtime{false}; ComputerControlInterfaceList m_controlInterfaces; diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.h b/plugins/authkeys/AuthKeysConfigurationWidget.h index a66870400..8a3963a6f 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.h +++ b/plugins/authkeys/AuthKeysConfigurationWidget.h @@ -35,6 +35,7 @@ class AuthKeysConfigurationWidget; class AuthKeysConfiguration; class AuthKeysManager; +// clazy:excludeall=ctor-missing-parent-argument class AuthKeysConfigurationWidget : public QWidget { Q_OBJECT diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index b15be5b0d..80939bba4 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -38,9 +38,8 @@ #include "VncViewWidget.h" -DemoClient::DemoClient( const QString& host, int port, bool fullscreen, const QRect& viewport, QObject* parent ) : +DemoClient::DemoClient( const QString& host, int port, bool fullscreen, QRect viewport, QObject* parent ) : QObject( parent ), - m_toplevel( nullptr ), m_computerControlInterface( ComputerControlInterface::Pointer::create( Computer( {}, host, host ), port, this ) ) { if( fullscreen ) diff --git a/plugins/demo/DemoClient.h b/plugins/demo/DemoClient.h index 1a9b39e76..e5df96214 100644 --- a/plugins/demo/DemoClient.h +++ b/plugins/demo/DemoClient.h @@ -34,7 +34,7 @@ class DemoClient : public QObject { Q_OBJECT public: - DemoClient( const QString& host, int port, bool fullscreen, const QRect& viewport, QObject* parent = nullptr ); + DemoClient( const QString& host, int port, bool fullscreen, QRect viewport, QObject* parent = nullptr ); ~DemoClient() override; private: diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 0b44d3438..6fdcccbc0 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -98,7 +98,7 @@ void DemoServerConnection::processClient() // try again later in case we could not proceed because of // external protocol dependencies or in case we're finished // and already have RFB messages in receive queue - QTimer::singleShot( ProtocolRetryTime, [this]() { processClient(); } ); + QTimer::singleShot( ProtocolRetryTime, this, [this]() { processClient(); } ); } else { @@ -192,6 +192,6 @@ void DemoServerConnection::sendFramebufferUpdate() if( sentUpdates == false ) { // did not send updates but client still waiting for update? then try again soon - QTimer::singleShot( m_framebufferUpdateInterval, [this]() { sendFramebufferUpdate(); } ); + QTimer::singleShot( m_framebufferUpdateInterval, this, [this]() { sendFramebufferUpdate(); } ); } } diff --git a/plugins/filetransfer/FileTransferController.h b/plugins/filetransfer/FileTransferController.h index 4d0ce91d5..b9b950b3b 100644 --- a/plugins/filetransfer/FileTransferController.h +++ b/plugins/filetransfer/FileTransferController.h @@ -31,6 +31,7 @@ class FileReadThread; class FileTransferPlugin; +// clazy:excludeall=ctor-missing-parent-argument class FileTransferController : public QObject { Q_OBJECT diff --git a/plugins/ldap/AuthLdapConfigurationWidget.h b/plugins/ldap/AuthLdapConfigurationWidget.h index c265f8f0c..bbcaa43c9 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.h +++ b/plugins/ldap/AuthLdapConfigurationWidget.h @@ -32,6 +32,7 @@ class AuthLdapConfigurationWidget; class AuthLdapConfiguration; +// clazy:excludeall=ctor-missing-parent-argument class AuthLdapConfigurationWidget : public QWidget { Q_OBJECT diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 97cf86e23..cb1a28469 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -444,7 +444,7 @@ bool LinuxCoreFunctions::waitForProcess( qint64 pid, int timeout, int sleepInter return false; } - QThread::msleep( static_cast( sleepInterval ) ); + QThread::msleep( static_cast( sleepInterval ) ); } return true; diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.cpp b/plugins/platform/linux/LinuxFilesystemFunctions.cpp index ed5738619..d84058667 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.cpp +++ b/plugins/platform/linux/LinuxFilesystemFunctions.cpp @@ -163,7 +163,7 @@ bool LinuxFilesystemFunctions::openFileSafely( QFile* file, QIODevice::OpenMode return false; } - struct stat s; + struct stat s{}; if( fstat(fd, &s) != 0 ) { close(fd); diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.h b/plugins/platform/linux/LinuxPlatformConfigurationPage.h index 2cbc22cb1..d1b3031d5 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.h +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.h @@ -31,6 +31,7 @@ namespace Ui { class LinuxPlatformConfigurationPage; } +// clazy:excludeall=ctor-missing-parent-argument class LinuxPlatformConfigurationPage : public ConfigurationPage { Q_OBJECT diff --git a/plugins/platform/linux/LinuxPlatformPlugin.cpp b/plugins/platform/linux/LinuxPlatformPlugin.cpp index 78d046ffa..514f38de0 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.cpp +++ b/plugins/platform/linux/LinuxPlatformPlugin.cpp @@ -22,7 +22,7 @@ * */ -#include +#include #include "LinuxPlatformPlugin.h" #include "LinuxPlatformConfiguration.h" diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index a4a3933e8..89112aee5 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -83,7 +83,7 @@ void LinuxServerProcess::start() void LinuxServerProcess::stop() { - const auto sendSignalRecursively = []( int pid, int sig ) { + const auto sendSignalRecursively = []( pid_t pid, int sig ) { if( pid > 0 ) { LinuxCoreFunctions::forEachChildProcess( @@ -106,7 +106,7 @@ void LinuxServerProcess::stop() } }; - const auto pid = processId(); + const auto pid = pid_t(processId()); // manually set process state since we're managing the process termination on our own setProcessState( QProcess::NotRunning ); diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index d66c118ed..dc0e81b06 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -203,7 +203,7 @@ void LinuxServiceCore::startServer( const QString& sessionPath ) sessionUptime < minimumSessionUptime ) { vDebug() << "Session" << sessionPath << "too young - retrying in" << minimumSessionUptime - sessionUptime << "msecs"; - deferServerStart( sessionPath, minimumSessionUptime - sessionUptime ); + deferServerStart( sessionPath, int(minimumSessionUptime - sessionUptime) ); return; } diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 8a4068c57..3521b06e2 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -356,7 +356,7 @@ void LinuxUserFunctions::logoff() // logout via common session managers // logout via common session managers - for( auto call : std::initializer_list> + for( const auto& call : std::initializer_list> { []() { return LinuxCoreFunctions::kdeSessionManager() diff --git a/plugins/textmessage/TextMessageFeaturePlugin.cpp b/plugins/textmessage/TextMessageFeaturePlugin.cpp index ec8b8c791..a4142fbb9 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.cpp +++ b/plugins/textmessage/TextMessageFeaturePlugin.cpp @@ -158,9 +158,9 @@ bool TextMessageFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worke if( message.featureUid() == m_textMessageFeature.uid() ) { - QMessageBox* messageBox = new QMessageBox( static_cast( message.argument( Argument::Icon ).toInt() ), - tr( "Message from teacher" ), - message.argument( Argument::Text ).toString() ); + auto messageBox = new QMessageBox( static_cast( message.argument( Argument::Icon ).toInt() ), + tr( "Message from teacher" ), + message.argument( Argument::Text ).toString() ); messageBox->show(); connect( messageBox, &QMessageBox::accepted, messageBox, &QMessageBox::deleteLater ); diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index a26ad3a84..1b9e43af1 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -259,6 +259,9 @@ void ComputerControlServer::updateTrayIconToolTip() QStringList clients; QStringList hostsToResolve; + clients.reserve( m_vncProxyServer.clients().size() ); + hostsToResolve.reserve( m_vncProxyServer.clients().size() ); + for( const auto* client : m_vncProxyServer.clients() ) { const auto clientIpAddress = client->proxyClientSocket()->peerAddress().toString(); From cdd047d08b621a870e061ba1802bbbeea4560654 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 14:51:13 +0200 Subject: [PATCH 1101/1765] Demo: call Master::selectedComputerControlInterfaces() only once --- plugins/demo/DemoFeaturePlugin.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 1cae5481c..98af776a2 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -191,14 +191,15 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur if( feature == m_shareUserScreenWindowFeature || feature == m_shareUserScreenFullScreenFeature ) { - if( master.selectedComputerControlInterfaces().size() < 1 ) + const auto selectedComputerControlInterfaces = master.selectedComputerControlInterfaces(); + if( selectedComputerControlInterfaces.size() < 1 ) { QMessageBox::critical( master.mainWindow(), feature.name(), tr( "Please select a user screen to share.") ); return true; } - if( master.selectedComputerControlInterfaces().size() > 1 ) + if( selectedComputerControlInterfaces.size() > 1 ) { QMessageBox::critical( master.mainWindow(), feature.name(), tr( "Please select only one user screen to share.") ); @@ -208,7 +209,7 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur auto vncServerPortOffset = 0; auto demoServerPort = VeyonCore::config().demoServerPort(); - const auto demoServerInterface = master.selectedComputerControlInterfaces().first(); + const auto& demoServerInterface = selectedComputerControlInterfaces.constFirst(); const auto demoServerHost = demoServerInterface->computer().hostAddress(); const auto primaryServerPort = HostAddress::parsePortNumber( demoServerHost ); @@ -241,7 +242,7 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur { argToString(Argument::VncServerPortOffset), vncServerPortOffset }, { argToString(Argument::DemoServerPort), demoServerPort }, }, - master.selectedComputerControlInterfaces() ); + selectedComputerControlInterfaces ); return true; } From 77e29425493051ca1bdf6597b84f03c48d59dd44 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 14:51:48 +0200 Subject: [PATCH 1102/1765] DemoServer: fix receiver for terminate() call --- plugins/demo/DemoServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 37d1e19a0..0159fecda 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -92,7 +92,7 @@ void DemoServer::terminate() connection->wait( ConnectionThreadWaitTime ); } - QTimer::singleShot( TerminateRetryInterval, 0, &DemoServer::terminate ); + QTimer::singleShot( TerminateRetryInterval, this, &DemoServer::terminate ); } } From 39bd166828e540fa3a84360bc73fc5b1f8a378f2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 15:16:07 +0200 Subject: [PATCH 1103/1765] Feature: add workaround for Qt < 5.12 --- core/src/Feature.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/Feature.h b/core/src/Feature.h index 60925aafd..91859ea08 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -54,7 +54,10 @@ class VEYON_CORE_EXPORT Feature } ; Q_DECLARE_FLAGS(Flags, Flag) + // work around QTBUG-47652 where Q_FLAG() is broken for enum classes when using Qt < 5.12 +#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) Q_FLAG(Flags) +#endif explicit Feature( const QString& name, Flags flags, From 6bd598db1bbec1b91ffe3acffb3c9dccf86c5125 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 20:34:36 +0200 Subject: [PATCH 1104/1765] DemoServerConnection: fix context for socket I/O --- plugins/demo/DemoServerConnection.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 6fdcccbc0..1e611a5f3 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -98,7 +98,7 @@ void DemoServerConnection::processClient() // try again later in case we could not proceed because of // external protocol dependencies or in case we're finished // and already have RFB messages in receive queue - QTimer::singleShot( ProtocolRetryTime, this, [this]() { processClient(); } ); + QTimer::singleShot( ProtocolRetryTime, m_socket, [this]() { processClient(); } ); } else { @@ -192,6 +192,6 @@ void DemoServerConnection::sendFramebufferUpdate() if( sentUpdates == false ) { // did not send updates but client still waiting for update? then try again soon - QTimer::singleShot( m_framebufferUpdateInterval, this, [this]() { sendFramebufferUpdate(); } ); + QTimer::singleShot( m_framebufferUpdateInterval, m_socket, [this]() { sendFramebufferUpdate(); } ); } } From 9b7f69963e7835598443daf175abe33bf14a24ff Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 20:35:33 +0200 Subject: [PATCH 1105/1765] DemoServerConnection: handle FeatureMessages Now that VncView operates on top of a ComputerControlInterface, some Veyon-specific queries are sent by the (demo) client. Even though we ignore them, we still have to receive them to keep the protocol in sync. --- plugins/demo/DemoServerConnection.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 1e611a5f3..a322b2203 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -30,6 +30,7 @@ #include "DemoConfiguration.h" #include "DemoServer.h" #include "DemoServerConnection.h" +#include "FeatureMessage.h" DemoServerConnection::DemoServerConnection( DemoServer* demoServer, @@ -135,6 +136,18 @@ bool DemoServerConnection::receiveClientMessage() } break; + case FeatureMessage::RfbMessageType: + { + FeatureMessage featureMessage; + m_socket->getChar(nullptr); + if( featureMessage.isReadyForReceive(m_socket) && featureMessage.receive(m_socket) ) + { + return true; + } + m_socket->ungetChar(messageType); + break; + } + default: if( m_rfbClientToServerMessageSizes.contains( messageType ) == false ) { From b903cb19e44a74f8f376327faa318a95cdd44815 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Sep 2021 20:37:15 +0200 Subject: [PATCH 1106/1765] FeatureCommands: add help for show/list commands --- cli/src/FeatureCommands.cpp | 20 ++++++++++++++++++-- cli/src/FeatureCommands.h | 10 ++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index 2f9a6202f..8595d5029 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -38,8 +38,8 @@ FeatureCommands::FeatureCommands( QObject* parent ) : QObject( parent ), m_commands( { - { QStringLiteral("list"), tr( "List names of all available features" ) }, - { QStringLiteral("show"), tr( "Show table with details of all available features" ) }, + { listCommand(), tr( "List names of all available features" ) }, + { showCommand(), tr( "Show table with details of all available features" ) }, { startCommand(), tr( "Start a feature on a remote host" ) }, { stopCommand(), tr( "Stop a feature on a remote host" ) } } ) @@ -71,6 +71,22 @@ CommandLinePluginInterface::RunResult FeatureCommands::handle_help( const QStrin return NoResult; } + if( command == listCommand() ) + { + printUsage( commandLineModuleName(), listCommand(), {}, {} ); + printDescription( tr("Displays a list with the names of all available features.") ); + return NoResult; + } + + if( command == showCommand() ) + { + printUsage( commandLineModuleName(), showCommand(), {}, {} ); + printDescription( tr("Displays a table with detailed information about all available features. " + "These information include a description, the UID, the name of the plugin " + "providing the respective feature and some other implementation related details.") ); + return NoResult; + } + if( command == startCommand() ) { printUsage( commandLineModuleName(), startCommand(), diff --git a/cli/src/FeatureCommands.h b/cli/src/FeatureCommands.h index abac731ed..e72c1b4f3 100644 --- a/cli/src/FeatureCommands.h +++ b/cli/src/FeatureCommands.h @@ -87,6 +87,16 @@ public Q_SLOTS: CommandLinePluginInterface::RunResult handle_stop( const QStringList& arguments ); private: + static QString listCommand() + { + return QStringLiteral("list"); + } + + static QString showCommand() + { + return QStringLiteral("show"); + } + static QString startCommand() { return QStringLiteral("start"); From 63e0867ca68a73911dead0b3628fe4fb4ae37561 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 23 Sep 2021 12:43:41 +0200 Subject: [PATCH 1107/1765] FeatureCommands: fix minor grammar issues Thanks to Yuri Chornoivan for pointing out. --- cli/src/FeatureCommands.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index 8595d5029..a43ad31f0 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -82,8 +82,8 @@ CommandLinePluginInterface::RunResult FeatureCommands::handle_help( const QStrin { printUsage( commandLineModuleName(), showCommand(), {}, {} ); printDescription( tr("Displays a table with detailed information about all available features. " - "These information include a description, the UID, the name of the plugin " - "providing the respective feature and some other implementation related details.") ); + "This information include a description, the UID, the name of the plugin " + "providing the respective feature and some other implementation-related details.") ); return NoResult; } From a9accaec63c816ddcf629630cf40d28d5610e87e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Sep 2021 11:58:28 +0200 Subject: [PATCH 1108/1765] Core: refactor ownerships and destruction of connections Now that ComputerControlInterface is the only user of VeyonConnection, we can make VeyonConnection have a VncConnection instance internally instead of being attached to. Additionally refactor the destruction mechanisms and order since it did not work properly with dynamically created and destructed event loops (e.g. when used in thread pools via QtConcurrent). Connecting the deleteMethod() with receiver `this` eventually did not call the deleteMethod() if the thread or event loop for the object disappeared in the meanwhile. --- core/src/ComputerControlInterface.cpp | 89 ++++++++++++--------------- core/src/ComputerControlInterface.h | 19 ++---- core/src/VeyonConnection.cpp | 26 ++++---- core/src/VeyonConnection.h | 9 ++- core/src/VncConnection.cpp | 43 ++++++++----- core/src/VncConnection.h | 6 +- core/src/VncViewWidget.h | 2 - 7 files changed, 101 insertions(+), 93 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index f23fb62de..2dcc3f571 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -40,7 +40,6 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in m_userLoginName(), m_userFullName(), m_scaledScreenSize(), - m_vncConnection( nullptr ), m_connection( nullptr ), m_connectionWatchdogTimer( this ), m_userUpdateTimer( this ), @@ -72,40 +71,38 @@ void ComputerControlInterface::start( QSize scaledScreenSize, UpdateMode updateM if( m_computer.hostAddress().isEmpty() == false ) { - m_vncConnection = new VncConnection(); - m_vncConnection->setHost( m_computer.hostAddress() ); + m_connection = new VeyonConnection; + + auto vncConnection = m_connection->vncConnection(); + vncConnection->setHost( m_computer.hostAddress() ); if( m_port > 0 ) { - m_vncConnection->setPort( m_port ); + vncConnection->setPort( m_port ); } - m_vncConnection->setQuality( VncConnection::Quality::Thumbnail ); - m_vncConnection->setScaledSize( m_scaledScreenSize ); - - setUpdateMode( updateMode ); - - m_connection = new VeyonConnection( m_vncConnection ); - - m_vncConnection->start(); + vncConnection->setQuality( VncConnection::Quality::Thumbnail ); + vncConnection->setScaledSize( m_scaledScreenSize ); - connect( m_vncConnection, &VncConnection::imageUpdated, this, [this]( int x, int y, int w, int h ) + connect( vncConnection, &VncConnection::imageUpdated, this, [this]( int x, int y, int w, int h ) { Q_EMIT screenUpdated( QRect( x, y, w, h ) ); } ); - connect( m_vncConnection, &VncConnection::framebufferUpdateComplete, this, [this]() { + connect( vncConnection, &VncConnection::framebufferUpdateComplete, this, [this]() { resetWatchdog(); ++m_timestamp; Q_EMIT scaledScreenUpdated(); } ); - connect( m_vncConnection, &VncConnection::framebufferSizeChanged, this, &ComputerControlInterface::screenSizeChanged ); - - connect( m_vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); - connect( m_vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateUser ); - connect( m_vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateActiveFeatures ); - connect( m_vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::stateChanged ); + connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); + connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateUser ); + connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateActiveFeatures ); + connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::stateChanged ); connect( m_connection, &VeyonConnection::featureMessageReceived, this, &ComputerControlInterface::handleFeatureMessage ); connect( m_connection, &VeyonConnection::featureMessageReceived, this, &ComputerControlInterface::resetWatchdog ); + + setUpdateMode( updateMode ); + + vncConnection->start(); } else { @@ -117,14 +114,10 @@ void ComputerControlInterface::start( QSize scaledScreenSize, UpdateMode updateM void ComputerControlInterface::stop() { - // VeyonConnection destroys itself when VncConnection is destroyed - m_connection = nullptr; - - if( m_vncConnection ) + if( m_connection ) { - // do not delete VNC connection but let it delete itself after stopping automatically - m_vncConnection->stopAndDeleteLater(); - m_vncConnection = nullptr; + m_connection->stopAndDeleteLater(); + m_connection = nullptr; } m_activeFeaturesUpdateTimer.stop(); @@ -138,16 +131,16 @@ void ComputerControlInterface::stop() bool ComputerControlInterface::hasValidFramebuffer() const { - return m_vncConnection && m_vncConnection->hasValidFramebuffer(); + return vncConnection() && vncConnection()->hasValidFramebuffer(); } QSize ComputerControlInterface::screenSize() const { - if( m_vncConnection ) + if( vncConnection() ) { - return m_vncConnection->image().size(); + return vncConnection()->image().size(); } return {}; @@ -159,9 +152,9 @@ void ComputerControlInterface::setScaledScreenSize( QSize scaledScreenSize ) { m_scaledScreenSize = scaledScreenSize; - if( m_vncConnection ) + if( vncConnection() ) { - m_vncConnection->setScaledSize( m_scaledScreenSize ); + vncConnection()->setScaledSize( m_scaledScreenSize ); } ++m_timestamp; @@ -173,9 +166,9 @@ void ComputerControlInterface::setScaledScreenSize( QSize scaledScreenSize ) QImage ComputerControlInterface::scaledScreen() const { - if( m_vncConnection && m_vncConnection->isConnected() ) + if( vncConnection() && vncConnection()->isConnected() ) { - return m_vncConnection->scaledScreen(); + return vncConnection()->scaledScreen(); } return {}; @@ -185,9 +178,9 @@ QImage ComputerControlInterface::scaledScreen() const QImage ComputerControlInterface::screen() const { - if( m_vncConnection && m_vncConnection->isConnected() ) + if( vncConnection() && vncConnection()->isConnected() ) { - return m_vncConnection->image(); + return vncConnection()->image(); } return {}; @@ -227,7 +220,7 @@ void ComputerControlInterface::updateActiveFeatures() { lock(); - if( m_vncConnection && m_connection && state() == State::Connected ) + if( vncConnection() && state() == State::Connected ) { VeyonCore::builtinFeatures().featureControl().queryActiveFeatures( { weakPointer() } ); } @@ -253,9 +246,9 @@ void ComputerControlInterface::sendFeatureMessage( const FeatureMessage& feature bool ComputerControlInterface::isMessageQueueEmpty() { - if( m_vncConnection && m_vncConnection->isConnected() ) + if( vncConnection() && vncConnection()->isConnected() ) { - return m_vncConnection->isEventQueueEmpty(); + return vncConnection()->isEventQueueEmpty(); } return true; @@ -271,9 +264,9 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) switch( updateMode ) { case UpdateMode::Disabled: - if( m_vncConnection ) + if( vncConnection() ) { - m_vncConnection->setFramebufferUpdateInterval( UpdateIntervalDisabled ); + vncConnection()->setFramebufferUpdateInterval( UpdateIntervalDisabled ); } m_userUpdateTimer.stop(); @@ -282,9 +275,9 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) case UpdateMode::Monitoring: case UpdateMode::Live: - if( m_vncConnection ) + if( vncConnection() ) { - m_vncConnection->setFramebufferUpdateInterval( updateMode == UpdateMode::Monitoring ? + vncConnection()->setFramebufferUpdateInterval( updateMode == UpdateMode::Monitoring ? computerMonitoringUpdateInterval : -1 ); } @@ -315,10 +308,10 @@ void ComputerControlInterface::resetWatchdog() void ComputerControlInterface::restartConnection() { - if( m_vncConnection ) + if( vncConnection() ) { vDebug(); - m_vncConnection->restart(); + vncConnection()->restart(); m_connectionWatchdogTimer.stop(); } @@ -330,9 +323,9 @@ void ComputerControlInterface::updateState() { lock(); - if( m_vncConnection ) + if( vncConnection() ) { - switch( m_vncConnection->state() ) + switch( vncConnection()->state() ) { case VncConnection::State::Disconnected: m_state = State::Disconnected; break; case VncConnection::State::Connecting: m_state = State::Connecting; break; @@ -357,7 +350,7 @@ void ComputerControlInterface::updateUser() { lock(); - if( m_vncConnection && m_connection && state() == State::Connected ) + if( vncConnection() && state() == State::Connected ) { if( userLoginName().isEmpty() ) { diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 3afc23a02..fa8642f46 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -24,22 +24,11 @@ #pragma once -#include -#include -#include -#include - #include "Computer.h" #include "Feature.h" #include "Lockable.h" #include "VeyonCore.h" -#include "VncConnection.h" - -class QImage; - -class FeatureMessage; -class VncConnection; -class VeyonConnection; +#include "VeyonConnection.h" class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockable { @@ -63,6 +52,11 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_connection; } + VncConnection* vncConnection() const + { + return m_connection ? m_connection->vncConnection() : nullptr; + } + void start( QSize scaledScreenSize = {}, UpdateMode updateMode = UpdateMode::Monitoring ); void stop(); @@ -181,7 +175,6 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QSize m_scaledScreenSize; int m_timestamp{0}; - VncConnection* m_vncConnection; VeyonConnection* m_connection; QTimer m_connectionWatchdogTimer; QTimer m_userUpdateTimer; diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index cde24e6a1..288b9cf14 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -50,8 +50,7 @@ rfbBool handleVeyonMessage( rfbClient* client, rfbServerToClientMsg* msg ) -VeyonConnection::VeyonConnection( VncConnection* vncConnection ): - m_vncConnection( vncConnection ), +VeyonConnection::VeyonConnection(): m_user(), m_userHomeDir() { @@ -68,27 +67,32 @@ VeyonConnection::VeyonConnection( VncConnection* vncConnection ): } connect( m_vncConnection, &VncConnection::connectionPrepared, this, &VeyonConnection::registerConnection, Qt::DirectConnection ); - connect( m_vncConnection, &VncConnection::destroyed, this, &VeyonConnection::deleteLater ); + connect( m_vncConnection, &VncConnection::destroyed, VeyonCore::instance(), [this]() { + delete this; + } ); } -VeyonConnection::~VeyonConnection() +void VeyonConnection::stopAndDeleteLater() { unregisterConnection(); + + if( m_vncConnection ) + { + m_vncConnection->stopAndDeleteLater(); + m_vncConnection = nullptr; + } } void VeyonConnection::sendFeatureMessage( const FeatureMessage& featureMessage, bool wake ) { - if( m_vncConnection.isNull() ) + if( m_vncConnection ) { - vCritical() << "cannot enqueue event as VNC connection is invalid"; - return; + m_vncConnection->enqueueEvent( new VncFeatureMessageEvent( featureMessage ), wake ); } - - m_vncConnection->enqueueEvent( new VncFeatureMessageEvent( featureMessage ), wake ); } @@ -124,7 +128,7 @@ bool VeyonConnection::handleServerMessage( rfbClient* client, uint8_t msg ) void VeyonConnection::registerConnection() { - if( m_vncConnection.isNull() == false ) + if( m_vncConnection ) { m_vncConnection->setClientData( VeyonConnectionTag, this ); } @@ -134,7 +138,7 @@ void VeyonConnection::registerConnection() void VeyonConnection::unregisterConnection() { - if( m_vncConnection.isNull() == false ) + if( m_vncConnection ) { m_vncConnection->setClientData( VeyonConnectionTag, nullptr ); } diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index 7a8e67e3d..3fdd76749 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -35,8 +35,9 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject { Q_OBJECT public: - explicit VeyonConnection( VncConnection* vncConnection ); - ~VeyonConnection() override; + VeyonConnection(); + + void stopAndDeleteLater(); VncConnection* vncConnection() { @@ -74,6 +75,8 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject void featureMessageReceived( const FeatureMessage& ); private: + ~VeyonConnection() override = default; + void registerConnection(); void unregisterConnection(); @@ -81,7 +84,7 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject static int8_t handleSecTypeVeyon( rfbClient* client, uint32_t authScheme ); static void hookPrepareAuthentication( rfbClient* client ); - QPointer m_vncConnection; + VncConnection* m_vncConnection{new VncConnection}; QString m_user; QString m_userHomeDir; diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 1f25c75dd..de7ed9323 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -67,8 +67,6 @@ VncConnection::VncConnection( QObject* parent ) : VncConnection::~VncConnection() { - stop(); - if( isRunning() ) { vWarning() << "Waiting for VNC connection thread to finish."; @@ -134,12 +132,12 @@ void VncConnection::stopAndDeleteLater() { if( isRunning() ) { - connect( this, &VncConnection::finished, this, &VncConnection::deleteLater ); + setControlFlag( ControlFlag::DeleteAfterFinished, true ); stop(); } else { - deleteLater(); + deleteLaterInMainThread(); } } @@ -365,6 +363,11 @@ void VncConnection::run() handleConnection(); closeConnection(); } + + if( isControlFlagSet( ControlFlag::DeleteAfterFinished ) ) + { + deleteLaterInMainThread(); + } } @@ -419,8 +422,20 @@ void VncConnection::establishConnection() setControlFlag( ControlFlag::ServerReachable, false ); - if( rfbInitClient( m_client, nullptr, nullptr ) && - isControlFlagSet( ControlFlag::TerminateThread ) == false ) + const auto clientInitialized = rfbInitClient( m_client, nullptr, nullptr ); + if( clientInitialized == FALSE ) + { + // rfbInitClient() calls rfbClientCleanup() when failed + m_client = nullptr; + } + + // do not continue/sleep when already requested to stop + if( isControlFlagSet( ControlFlag::TerminateThread ) ) + { + return; + } + + if( clientInitialized ) { m_framebufferUpdateWatchdog.restart(); @@ -432,15 +447,6 @@ void VncConnection::establishConnection() } else { - // rfbInitClient() calls rfbClientCleanup() when failed - m_client = nullptr; - - // do not sleep when already requested to stop - if( isControlFlagSet( ControlFlag::TerminateThread ) ) - { - break; - } - // guess reason why connection failed if( isControlFlagSet( ControlFlag::ServerReachable ) == false ) { @@ -724,6 +730,13 @@ void VncConnection::sendEvents() +void VncConnection::deleteLaterInMainThread() +{ + QTimer::singleShot( 0, VeyonCore::instance(), [this]() { delete this; } ); +} + + + void VncConnection::rfbClientLogDebug( const char* format, ... ) { va_list args; diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 0b2a7a49c..ef75877e6 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -80,7 +80,6 @@ class VEYON_CORE_EXPORT VncConnection : public QThread Q_ENUM(State) explicit VncConnection( QObject *parent = nullptr ); - ~VncConnection() override; static void initLogging( bool debug ); @@ -171,8 +170,11 @@ class VEYON_CORE_EXPORT VncConnection : public QThread ServerReachable = 0x02, TerminateThread = 0x04, RestartConnection = 0x08, + DeleteAfterFinished = 0x10 }; + ~VncConnection() override; + void establishConnection(); void handleConnection(); void closeConnection(); @@ -191,6 +193,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread void sendEvents(); + void deleteLaterInMainThread(); + static void rfbClientLogDebug( const char* format, ... ); static void rfbClientLogNone( const char* format, ... ); static void framebufferCleanup( void* framebuffer ); diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index 3305c5f3b..799a302ba 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -66,8 +66,6 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView void drawBusyIndicator( QPainter* painter ); void updateConnectionState(); - VeyonConnection* m_veyonConnection{nullptr}; - bool m_viewOnlyFocus{true}; static constexpr auto BusyIndicatorUpdateInterval = 25; From 416cda23c8ae85fa0c3dc0771ad275c43b2b7cbb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Sep 2021 12:42:16 +0200 Subject: [PATCH 1109/1765] VncConnection: add ControlFlag::SkipHostPing --- core/src/VncConnection.cpp | 3 ++- core/src/VncConnection.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index de7ed9323..70a2ddeb3 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -450,7 +450,8 @@ void VncConnection::establishConnection() // guess reason why connection failed if( isControlFlagSet( ControlFlag::ServerReachable ) == false ) { - if( VeyonCore::platform().networkFunctions().ping( m_host ) == false ) + if( isControlFlagSet( ControlFlag::SkipHostPing ) || + VeyonCore::platform().networkFunctions().ping( m_host ) == false ) { setState( State::HostOffline ); } diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index ef75877e6..d6225b1d2 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -170,7 +170,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread ServerReachable = 0x02, TerminateThread = 0x04, RestartConnection = 0x08, - DeleteAfterFinished = 0x10 + DeleteAfterFinished = 0x10, + SkipHostPing = 0x20 }; ~VncConnection() override; From e3b4d4878a1ef637093575c08665a8f346691bed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Sep 2021 13:23:20 +0200 Subject: [PATCH 1110/1765] VncConnection: add setSkipHostPing() --- core/src/VncConnection.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index d6225b1d2..8bb1d10ce 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -131,6 +131,11 @@ class VEYON_CORE_EXPORT VncConnection : public QThread void setFramebufferUpdateInterval( int interval ); + void setSkipHostPing( bool on ) + { + setControlFlag( ControlFlag::SkipHostPing, on ); + } + void rescaleScreen(); static constexpr int VncConnectionTag = 0x590123; From 8672c7d9d0532cdd1987b1b7fea08f541bd70e1e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Sep 2021 13:24:07 +0200 Subject: [PATCH 1111/1765] ComputerControlInterface: add UpdateMode::Basic This new update mode is similar to UpdateMode::Monitoring but skips the host ping in case no connection can be established. --- core/src/ComputerControlInterface.cpp | 11 +++++++++-- core/src/ComputerControlInterface.h | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 2dcc3f571..6b88980a8 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -261,7 +261,7 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) const auto computerMonitoringUpdateInterval = VeyonCore::config().computerMonitoringUpdateInterval(); - switch( updateMode ) + switch( m_updateMode ) { case UpdateMode::Disabled: if( vncConnection() ) @@ -273,11 +273,13 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) m_activeFeaturesUpdateTimer.start( UpdateIntervalDisabled ); break; + case UpdateMode::Basic: case UpdateMode::Monitoring: case UpdateMode::Live: if( vncConnection() ) { - vncConnection()->setFramebufferUpdateInterval( updateMode == UpdateMode::Monitoring ? + vncConnection()->setFramebufferUpdateInterval( ( m_updateMode == UpdateMode::Basic || + m_updateMode == UpdateMode::Monitoring ) ? computerMonitoringUpdateInterval : -1 ); } @@ -285,6 +287,11 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) m_activeFeaturesUpdateTimer.start( computerMonitoringUpdateInterval ); break; } + + if( m_updateMode == UpdateMode::Basic ) + { + vncConnection()->setSkipHostPing( true ); + } } diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index fa8642f46..5942aeec0 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -36,6 +36,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab public: enum class UpdateMode { Disabled, + Basic, Monitoring, Live }; From 0ce0c6c5fb96cf0fdc71a5e5bf6562f3f79b0dcd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Sep 2021 14:01:57 +0200 Subject: [PATCH 1112/1765] CMake: fix LTO with CMake < 3.13 --- cmake/modules/SetDefaultTargetProperties.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/SetDefaultTargetProperties.cmake b/cmake/modules/SetDefaultTargetProperties.cmake index 82137c3e8..4ef5cf592 100644 --- a/cmake/modules/SetDefaultTargetProperties.cmake +++ b/cmake/modules/SetDefaultTargetProperties.cmake @@ -3,7 +3,7 @@ macro(set_default_target_properties TARGET_NAME) set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD 17) set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) if(WITH_LTO) - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") target_compile_options(${TARGET_NAME} PRIVATE ${GCC_LTO_FLAGS}) target_link_options(${TARGET_NAME} PRIVATE ${GCC_LTO_FLAGS}) else() From dfabf43e0bbd850e8ca2c2e834a03bb0d3697ca4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 27 Sep 2021 09:25:29 +0200 Subject: [PATCH 1113/1765] Use QRegularExpression API of QSFPM with Qt >= 5.15.1 only Due to a bug in Qt < 5.15.1 QSortFilterProxyModel does not honor the case sensitivity setting when using the QRegularExpression API. Closes #755. --- master/src/ComputerMonitoringView.cpp | 2 +- master/src/LocationDialog.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 8c3375bde..dd3d58893 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -96,7 +96,7 @@ QString ComputerMonitoringView::searchFilter() const void ComputerMonitoringView::setSearchFilter( const QString& searchFilter ) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 1) dataModel()->setFilterRegularExpression( searchFilter ); #else dataModel()->setFilterRegExp( searchFilter ); diff --git a/master/src/LocationDialog.cpp b/master/src/LocationDialog.cpp index 3f1736a0c..092c15dbb 100644 --- a/master/src/LocationDialog.cpp +++ b/master/src/LocationDialog.cpp @@ -34,6 +34,7 @@ LocationDialog::LocationDialog( QAbstractItemModel* locationListModel, QWidget* ui->setupUi( this ); m_sortFilterProxyModel.setSourceModel( locationListModel ); + m_sortFilterProxyModel.setFilterCaseSensitivity( Qt::CaseInsensitive ); m_sortFilterProxyModel.sort( 0 ); ui->listView->setModel( &m_sortFilterProxyModel ); @@ -55,12 +56,11 @@ LocationDialog::~LocationDialog() void LocationDialog::updateSearchFilter() { -#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 1) m_sortFilterProxyModel.setFilterRegularExpression( ui->filterLineEdit->text() ); #else m_sortFilterProxyModel.setFilterRegExp( ui->filterLineEdit->text() ); #endif - m_sortFilterProxyModel.setFilterCaseSensitivity( Qt::CaseInsensitive ); ui->listView->selectionModel()->setCurrentIndex( m_sortFilterProxyModel.index( 0, 0 ), QItemSelectionModel::ClearAndSelect ); From 732edd1dc645e81b6c405d1098d2ff20a8f3d77a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 27 Sep 2021 10:08:55 +0200 Subject: [PATCH 1114/1765] CLI: suppress compiler warning on __DATE__ usage --- cli/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 5b825315c..8f2bb8b2b 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -17,6 +17,8 @@ set(cli_SOURCES build_veyon_application(veyon-cli ${cli_SOURCES}) +target_compile_options(veyon-cli PRIVATE -Wno-date-time) + add_windows_resource(veyon-cli ${CMAKE_CURRENT_BINARY_DIR}/veyon-cli.rc) make_console_app(veyon-cli) From d2bb31487082e1e8bbebd53a76c945e5c3e616b4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 27 Sep 2021 10:29:11 +0200 Subject: [PATCH 1115/1765] BuiltinX11VncServer: suppress more compiler warnings for x11vnc --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 7bff96f3b..ed15d4000 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -184,7 +184,7 @@ if(NOT VEYON_X11VNC_EXTERNAL) ${x11vnc_DIR}/src/uinput.c ) - set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros") + set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros -Wno-stringop-truncation -Wno-stringop-overflow -Wno-format-overflow") endif() From 1ac323300e1ef9c3b2a39cfde6f491ed09fec817 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 1 Oct 2021 09:22:04 +0200 Subject: [PATCH 1116/1765] Core: CMake: fix LibVNCClient suitability check --- core/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index a0f326317..5e0569b49 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -24,8 +24,8 @@ if(LibVNCClient_FOUND) int main() { rfbClient* client = rfbGetClient( 8, 3, 4 ); - client->ReadFromSocketProc = nullptr; - client->WriteToSocketProc = nullptr; + client->ReadFromSocket = NULL; + client->WriteToSocket = NULL; return 0; } " From 6eff0918482d7db122c711c298f5eebb3f2e3674 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 1 Oct 2021 09:22:59 +0200 Subject: [PATCH 1117/1765] Core: CMake: set global HAVE_LIBVNCCLIENT property --- core/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 5e0569b49..3a1c388a1 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -37,7 +37,9 @@ if(LibVNCClient_FOUND) unset(CMAKE_REQUIRED_LIBRARIES) endif() -if(NOT LibVNCClient_FOUND) +if(LibVNCClient_FOUND) + set_property(GLOBAL PROPERTY HAVE_LIBVNCCLIENT TRUE) +else() message(WARNING "Performing internal build of LibVNCClient which requires additional development packages") include(LibVNCServerIntegration) set(libvncclient_SOURCES From 37f76ae2934067e226697ee59b43ffdda411ccf2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 1 Oct 2021 09:24:09 +0200 Subject: [PATCH 1118/1765] CMake: restrict usage of external libvncserver We must not use external libvncserver library for BuiltinX11VncServer while using builtin libvncclient for VeyonCore due to binary compatibility issues. --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index ed15d4000..f8a57cf10 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -2,7 +2,13 @@ include(BuildVeyonPlugin) if(NOT VEYON_X11VNC_EXTERNAL) - find_package(LibVNCServer 0.9.8) + get_property(HAVE_LIBVNCCLIENT GLOBAL PROPERTY HAVE_LIBVNCCLIENT) + if(HAVE_LIBVNCCLIENT) + find_package(LibVNCServer 0.9.8) + else() + message(WARNING "No suitable LibVNCClient library found therefore performing internal build of LibVNCServer as well to avoid binary compatibility issues") + endif() + if(NOT LibVNCServer_FOUND) include(LibVNCServerIntegration) endif() From 4599f15153486c2ac3ec8a90e802f60454382b97 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 1 Oct 2021 09:42:51 +0200 Subject: [PATCH 1119/1765] 3rdparty: libfakekey: use mirror on GitHub --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 9bf91624f..51ec629c1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,7 +12,7 @@ url = https://github.com/veyon/x11vnc.git [submodule "3rdparty/libfakekey"] path = 3rdparty/libfakekey - url = https://git.yoctoproject.org/git/libfakekey + url = https://github.com/veyon/libfakekey.git branch = master [submodule "3rdparty/qthttpserver"] path = 3rdparty/qthttpserver From b104748d12a4ba1d69b688d82b130f3f6be35ed5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 1 Oct 2021 09:53:08 +0200 Subject: [PATCH 1120/1765] CMake: improve CMAKE_BUILD_TYPE handling dh-cmake sets CMAKE_BUILD_TYPE to "None" while the default should be "RelWithDebInfo". --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 340e6a780..7dc53733a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,8 +5,8 @@ project(veyon) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH}) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(VEYON_DEBUG TRUE) -elseif(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE relwithdebinfo) +elseif(NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None") + set(CMAKE_BUILD_TYPE RelWithDebInfo) endif() if(VEYON_DEBUG) From 695ffa79779a1669758bea12b4b733fbcecd6fac Mon Sep 17 00:00:00 2001 From: OlesyaGerasimenko <53296253+OlesyaGerasimenko@users.noreply.github.com> Date: Fri, 1 Oct 2021 13:11:48 +0300 Subject: [PATCH 1121/1765] Add Russian translation of the "Comment" in the .desktop files --- configurator/data/veyon-configurator.desktop.in | 1 + master/data/veyon-master.desktop.in | 1 + 2 files changed, 2 insertions(+) diff --git a/configurator/data/veyon-configurator.desktop.in b/configurator/data/veyon-configurator.desktop.in index 28d9246ba..f90bf3a35 100644 --- a/configurator/data/veyon-configurator.desktop.in +++ b/configurator/data/veyon-configurator.desktop.in @@ -7,5 +7,6 @@ Terminal=false Name=Veyon Configurator Comment=Configuration tool for Veyon (Virtual Eye On Networks) Comment[de]=Einrichtungswerkzeug für Veyon (Virtual Eye On Networks) +Comment[ru]=Конфигуратор программы Veyon (Virtual Eye On Networks) Categories=Qt;Education;Network;Settings;System;RemoteAccess; Keywords=classroom,control,computer,room,lab,monitoring,teacher,student,settings,configuration diff --git a/master/data/veyon-master.desktop.in b/master/data/veyon-master.desktop.in index 34f1c0373..7ad220897 100644 --- a/master/data/veyon-master.desktop.in +++ b/master/data/veyon-master.desktop.in @@ -7,5 +7,6 @@ Terminal=false Name=Veyon Master Comment=Monitor and control remote computers Comment[de]=Entfernte Computer beobachten und steuern +Comment[ru]=Наблюдение за удалёнными компьютерами и управление ими Categories=Qt;Education;Network;RemoteAccess; Keywords=classroom,control,computer,room,lab,monitoring,teacher,student From 94b98b6d5caff06dcda80df74b1e2963e99f89b8 Mon Sep 17 00:00:00 2001 From: Paulo Ferreira Date: Thu, 7 Oct 2021 03:54:11 -0300 Subject: [PATCH 1122/1765] Add Portuguese translation of the "Comment" in the .desktop files (#759) --- configurator/data/veyon-configurator.desktop.in | 1 + master/data/veyon-master.desktop.in | 1 + 2 files changed, 2 insertions(+) diff --git a/configurator/data/veyon-configurator.desktop.in b/configurator/data/veyon-configurator.desktop.in index f90bf3a35..c830090de 100644 --- a/configurator/data/veyon-configurator.desktop.in +++ b/configurator/data/veyon-configurator.desktop.in @@ -8,5 +8,6 @@ Name=Veyon Configurator Comment=Configuration tool for Veyon (Virtual Eye On Networks) Comment[de]=Einrichtungswerkzeug für Veyon (Virtual Eye On Networks) Comment[ru]=Конфигуратор программы Veyon (Virtual Eye On Networks) +Comment[pt]=Ferramenta de configuração do Veyon (Virtual Eye On Networks) Categories=Qt;Education;Network;Settings;System;RemoteAccess; Keywords=classroom,control,computer,room,lab,monitoring,teacher,student,settings,configuration diff --git a/master/data/veyon-master.desktop.in b/master/data/veyon-master.desktop.in index 7ad220897..061704d1f 100644 --- a/master/data/veyon-master.desktop.in +++ b/master/data/veyon-master.desktop.in @@ -8,5 +8,6 @@ Name=Veyon Master Comment=Monitor and control remote computers Comment[de]=Entfernte Computer beobachten und steuern Comment[ru]=Наблюдение за удалёнными компьютерами и управление ими +Comment[pt]=Monitore e controle computadores remotos Categories=Qt;Education;Network;RemoteAccess; Keywords=classroom,control,computer,room,lab,monitoring,teacher,student From f23c58765112f0478f405d578811fe57b757740d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 19 Oct 2021 10:54:52 +0200 Subject: [PATCH 1123/1765] WindowsNetworkFunctions: init WinSock explicitly Even though Qt initializes WinSock on it's own when calling functions such as QSysInfo::machineHostName(), we shouldn't rely on these functions being called (e.g. in VeyonCore::initSystemInfo() where the aforementioned function is called with debug log level only). Therefore initialize WinSock explicitly to make all socket and network-related operations work properly early and in all cases. --- plugins/platform/windows/WindowsNetworkFunctions.cpp | 12 ++++++++++++ plugins/platform/windows/WindowsNetworkFunctions.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/plugins/platform/windows/WindowsNetworkFunctions.cpp b/plugins/platform/windows/WindowsNetworkFunctions.cpp index e0cd25c4d..232e7fe9b 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.cpp +++ b/plugins/platform/windows/WindowsNetworkFunctions.cpp @@ -206,6 +206,18 @@ static bool configureFirewallException( INetFwPolicy2* fwPolicy2, const wchar_t* +WindowsNetworkFunctions::WindowsNetworkFunctions() : PlatformNetworkFunctions() +{ + WSADATA wsadata; + const auto error = WSAStartup( MAKEWORD(2,0), &wsadata ); + if( error != S_OK ) + { + vCritical() << "failed to initialize WinSock:" << error; + } +} + + + bool WindowsNetworkFunctions::ping( const QString& hostAddress ) { QProcess pingProcess; diff --git a/plugins/platform/windows/WindowsNetworkFunctions.h b/plugins/platform/windows/WindowsNetworkFunctions.h index 679e87716..1c20843c0 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.h +++ b/plugins/platform/windows/WindowsNetworkFunctions.h @@ -31,6 +31,8 @@ class WindowsNetworkFunctions : public PlatformNetworkFunctions { public: + WindowsNetworkFunctions(); + bool ping( const QString& hostAddress ) override; bool configureFirewallException( const QString& applicationPath, const QString& description, bool enabled ) override; From 5135cfbaeff100d2d8d2b942c85a60bcf96aa33a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 19 Oct 2021 11:18:25 +0200 Subject: [PATCH 1124/1765] LdapDirectory: use LDAP_MATCHING_RULE_IN_CHAIN for filters only When querying members of a group (and not groups of an entity), we must not append the LDAP_MATCHING_RULE_IN_CHAIN filter to the attribute. Closes #761. --- plugins/ldap/common/LdapDirectory.cpp | 17 +++++++++-------- plugins/ldap/common/LdapDirectory.h | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index fa9ed0c79..746aa206b 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -44,10 +44,11 @@ LdapDirectory::LdapDirectory( const LdapConfiguration& configuration, QObject* p m_userLoginNameAttribute = m_configuration.userLoginNameAttribute(); m_groupMemberAttribute = m_configuration.groupMemberAttribute(); + m_groupMemberFilterAttribute = m_groupMemberAttribute; if( m_configuration.queryNestedUserGroups() && - m_groupMemberAttribute.contains( QLatin1Char(':') ) == false ) + m_groupMemberFilterAttribute.contains( QLatin1Char(':') ) == false ) { - m_groupMemberAttribute.append( QLatin1String(":1.2.840.113556.1.4.1941:") ); + m_groupMemberFilterAttribute.append( QLatin1String(":1.2.840.113556.1.4.1941:") ); } m_computerDisplayNameAttribute = m_configuration.computerDisplayNameAttribute(); @@ -277,13 +278,13 @@ QStringList LdapDirectory::groupMembers( const QString& groupDn ) QStringList LdapDirectory::groupsOfUser( const QString& userDn ) { const auto userId = groupMemberUserIdentification( userDn ); - if( m_groupMemberAttribute.isEmpty() || userId.isEmpty() ) + if( m_groupMemberFilterAttribute.isEmpty() || userId.isEmpty() ) { return {}; } return m_client.queryDistinguishedNames( groupsDn(), - LdapClient::constructQueryFilter( m_groupMemberAttribute, userId, m_userGroupsFilter ), + LdapClient::constructQueryFilter( m_groupMemberFilterAttribute, userId, m_userGroupsFilter ), m_defaultSearchScope ); } @@ -292,13 +293,13 @@ QStringList LdapDirectory::groupsOfUser( const QString& userDn ) QStringList LdapDirectory::groupsOfComputer( const QString& computerDn ) { const auto computerId = groupMemberComputerIdentification( computerDn ); - if( m_groupMemberAttribute.isEmpty() || computerId.isEmpty() ) + if( m_groupMemberFilterAttribute.isEmpty() || computerId.isEmpty() ) { return {}; } return m_client.queryDistinguishedNames( computerGroupsDn(), - LdapClient::constructQueryFilter( m_groupMemberAttribute, computerId, m_computerGroupsFilter ), + LdapClient::constructQueryFilter( m_groupMemberFilterAttribute, computerId, m_computerGroupsFilter ), m_defaultSearchScope ); } @@ -317,14 +318,14 @@ QStringList LdapDirectory::locationsOfComputer( const QString& computerDn ) } const auto computerId = groupMemberComputerIdentification( computerDn ); - if( m_groupMemberAttribute.isEmpty() || computerId.isEmpty() ) + if( m_groupMemberFilterAttribute.isEmpty() || computerId.isEmpty() ) { return {}; } return m_client.queryAttributeValues( computerGroupsDn(), m_locationNameAttribute, - LdapClient::constructQueryFilter( m_groupMemberAttribute, computerId, m_computerGroupsFilter ), + LdapClient::constructQueryFilter( m_groupMemberFilterAttribute, computerId, m_computerGroupsFilter ), m_defaultSearchScope ); } diff --git a/plugins/ldap/common/LdapDirectory.h b/plugins/ldap/common/LdapDirectory.h index e2f331216..887a1934a 100644 --- a/plugins/ldap/common/LdapDirectory.h +++ b/plugins/ldap/common/LdapDirectory.h @@ -132,6 +132,7 @@ class LDAP_COMMON_EXPORT LdapDirectory : public QObject QString m_userLoginNameAttribute; QString m_groupMemberAttribute; + QString m_groupMemberFilterAttribute; QString m_computerDisplayNameAttribute; QString m_computerHostNameAttribute; QString m_computerMacAddressAttribute; From f8d21b28fe3465962c8b789273bded148c685b6b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:45:25 +0200 Subject: [PATCH 1125/1765] VeyonCore: add stringify() for QVariantMap --- core/src/VeyonCore.cpp | 8 ++++++++ core/src/VeyonCore.h | 1 + 2 files changed, 9 insertions(+) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 08c4b5719..aec2be6b4 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -476,6 +477,13 @@ QString VeyonCore::formattedUuid( QUuid uuid ) +QString VeyonCore::stringify( const QVariantMap& map ) +{ + return QString::fromUtf8( QJsonDocument(QJsonObject::fromVariantMap(map)).toJson(QJsonDocument::Compact) ); +} + + + int VeyonCore::exec() { Q_EMIT applicationLoaded(); diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 753542a2e..78b0c4c56 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -181,6 +181,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject static QString stripDomain( const QString& username ); static QString formattedUuid( QUuid uuid ); + static QString stringify( const QVariantMap& map ); int exec(); From 461fe1511f65045009add217b50c51456d37803e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:46:08 +0200 Subject: [PATCH 1126/1765] FeatureMessage: add QDebug stream operator --- core/src/FeatureMessage.cpp | 11 +++++++++++ core/src/FeatureMessage.h | 2 ++ 2 files changed, 13 insertions(+) diff --git a/core/src/FeatureMessage.cpp b/core/src/FeatureMessage.cpp index fda931edb..cc219dbfa 100644 --- a/core/src/FeatureMessage.cpp +++ b/core/src/FeatureMessage.cpp @@ -77,3 +77,14 @@ bool FeatureMessage::receive( QIODevice* ioDevice ) return false; } + + + +QDebug operator<<(QDebug stream, const FeatureMessage& message) +{ + stream << QStringLiteral("FeatureMessage(%1,%2,%3)") + .arg(VeyonCore::formattedUuid(message.featureUid())) + .arg(message.command()) + .arg(VeyonCore::stringify(message.arguments())).toUtf8().constData(); + return stream; +} diff --git a/core/src/FeatureMessage.h b/core/src/FeatureMessage.h index ffa8085df..d3b174ad6 100644 --- a/core/src/FeatureMessage.h +++ b/core/src/FeatureMessage.h @@ -111,3 +111,5 @@ class VEYON_CORE_EXPORT FeatureMessage Arguments m_arguments; } ; + +VEYON_CORE_EXPORT QDebug operator<<(QDebug stream, const FeatureMessage& message); From 134d9198b9aac1fc57ef532d39af9ea378dcf6b1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:46:49 +0200 Subject: [PATCH 1127/1765] ComputerControlInterface: add QDebug stream operators --- core/src/ComputerControlInterface.cpp | 24 ++++++++++++++++++++++++ core/src/ComputerControlInterface.h | 3 +++ 2 files changed, 27 insertions(+) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 6b88980a8..50735813f 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -378,3 +378,27 @@ void ComputerControlInterface::handleFeatureMessage( const FeatureMessage& messa { Q_EMIT featureMessageReceived( message, weakPointer() ); } + + + +QDebug operator<<(QDebug stream, ComputerControlInterface::Pointer computerControlInterface) +{ + stream << qUtf8Printable(computerControlInterface->computer().hostAddress()); + return stream; +} + + + +QDebug operator<<(QDebug stream, const ComputerControlInterfaceList& computerControlInterfaces) +{ + QStringList hostAddresses; + hostAddresses.reserve(computerControlInterfaces.size()); + for(const auto& computerControlInterface : computerControlInterfaces) + { + hostAddresses.append(computerControlInterface->computer().hostAddress()); + } + + stream << QStringLiteral("[%1]").arg(hostAddresses.join(QLatin1Char(','))).toUtf8().constData(); + + return stream; +} diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 5942aeec0..22dc17b97 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -196,4 +196,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab using ComputerControlInterfaceList = QVector; +VEYON_CORE_EXPORT QDebug operator<<(QDebug stream, ComputerControlInterface::Pointer computerControlInterface); +VEYON_CORE_EXPORT QDebug operator<<(QDebug stream, const ComputerControlInterfaceList& computerControlInterfaces); + Q_DECLARE_METATYPE(ComputerControlInterface::Pointer) From b74894bdab5c4c8226f672e95811d07ff37e6302 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:49:52 +0200 Subject: [PATCH 1128/1765] Core: use new QDebug stream operators --- core/src/FeatureManager.cpp | 16 +++++----------- core/src/VeyonConnection.cpp | 3 +-- core/src/VncFeatureMessageEvent.cpp | 6 ++---- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 491656170..a576e5360 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -148,7 +148,7 @@ void FeatureManager::startFeature( VeyonMasterInterface& master, const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) const { - vDebug() << "feature" << feature.name() << feature.uid() << computerControlInterfaces; + vDebug() << feature.name() << computerControlInterfaces; for( auto featureInterface : qAsConst( m_featurePluginInterfaces ) ) { @@ -172,7 +172,7 @@ void FeatureManager::stopFeature( VeyonMasterInterface& master, const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) const { - vDebug() << "feature" << feature.name() << feature.uid() << computerControlInterfaces; + vDebug() << feature.name() << computerControlInterfaces; for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) { @@ -205,9 +205,7 @@ void FeatureManager::updateActiveFeatures( const ComputerControlInterfaceList& c bool FeatureManager::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message ) const { - vDebug() << "feature" << feature(message.featureUid()).name() - << "command" << message.command() - << "arguments" << message.arguments(); + vDebug() << feature(message.featureUid()).name().toUtf8().constData() << message << computerControlInterface; bool handled = false; @@ -228,9 +226,7 @@ bool FeatureManager::handleFeatureMessage( VeyonServerInterface& server, const MessageContext& messageContext, const FeatureMessage& message ) const { - vDebug() << "feature" << feature(message.featureUid()).name() - << "command" << message.command() - << "arguments" << message.arguments(); + vDebug() << feature(message.featureUid()).name().toUtf8().constData() << message; if( VeyonCore::config().disabledFeatures().contains( message.featureUid().toString() ) ) { @@ -255,9 +251,7 @@ bool FeatureManager::handleFeatureMessage( VeyonServerInterface& server, bool FeatureManager::handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) const { - vDebug() << "feature" << feature(message.featureUid()).name() - << "command" << message.command() - << "arguments" << message.arguments(); + vDebug() << feature(message.featureUid()).name().toUtf8().constData() << message; bool handled = false; diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 288b9cf14..d89fe00c5 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -110,8 +110,7 @@ bool VeyonConnection::handleServerMessage( rfbClient* client, uint8_t msg ) return false; } - vDebug() << "received feature message" << featureMessage.command() - << "with arguments" << featureMessage.arguments(); + vDebug() << featureMessage; Q_EMIT featureMessageReceived( featureMessage ); diff --git a/core/src/VncFeatureMessageEvent.cpp b/core/src/VncFeatureMessageEvent.cpp index ea298d83e..8e7513637 100644 --- a/core/src/VncFeatureMessageEvent.cpp +++ b/core/src/VncFeatureMessageEvent.cpp @@ -28,7 +28,7 @@ VncFeatureMessageEvent::VncFeatureMessageEvent( const FeatureMessage& featureMessage ) : - m_featureMessage( featureMessage ) + m_featureMessage( featureMessage ) { } @@ -36,9 +36,7 @@ VncFeatureMessageEvent::VncFeatureMessageEvent( const FeatureMessage& featureMes void VncFeatureMessageEvent::fire( rfbClient* client ) { - vDebug() << "sending message" << m_featureMessage.featureUid() - << "command" << m_featureMessage.command() - << "arguments" << m_featureMessage.arguments(); + vDebug() << m_featureMessage; SocketDevice socketDevice( VncConnection::libvncClientDispatcher, client ); const char messageType = FeatureMessage::RfbMessageType; From 36356209bf6e65158b130c10ab44613a54064fd3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:50:42 +0200 Subject: [PATCH 1129/1765] TextMessage: make message text selectable/copyable --- plugins/textmessage/TextMessageFeaturePlugin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/textmessage/TextMessageFeaturePlugin.cpp b/plugins/textmessage/TextMessageFeaturePlugin.cpp index a4142fbb9..5c8566d50 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.cpp +++ b/plugins/textmessage/TextMessageFeaturePlugin.cpp @@ -161,6 +161,7 @@ bool TextMessageFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worke auto messageBox = new QMessageBox( static_cast( message.argument( Argument::Icon ).toInt() ), tr( "Message from teacher" ), message.argument( Argument::Text ).toString() ); + messageBox->setTextInteractionFlags( Qt::TextBrowserInteraction | Qt::TextSelectableByKeyboard ); messageBox->show(); connect( messageBox, &QMessageBox::accepted, messageBox, &QMessageBox::deleteLater ); From 4eb284a2d21aee3da87916c01e538e166ca6fc98 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:51:52 +0200 Subject: [PATCH 1130/1765] TextMessage: add rich text support This allows users to paste formatted text including hyperlinks in the TextMessageDialog which is displayed 1:1 in the client-side message box. --- plugins/textmessage/TextMessageDialog.cpp | 2 +- plugins/textmessage/TextMessageFeaturePlugin.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/textmessage/TextMessageDialog.cpp b/plugins/textmessage/TextMessageDialog.cpp index ec75331e1..9bd700fd0 100644 --- a/plugins/textmessage/TextMessageDialog.cpp +++ b/plugins/textmessage/TextMessageDialog.cpp @@ -51,6 +51,6 @@ TextMessageDialog::~TextMessageDialog() void TextMessageDialog::accept() { - m_msgStr = ui->textEdit->toPlainText(); + m_msgStr = ui->textEdit->toHtml(); QDialog::accept(); } diff --git a/plugins/textmessage/TextMessageFeaturePlugin.cpp b/plugins/textmessage/TextMessageFeaturePlugin.cpp index 5c8566d50..706275e06 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.cpp +++ b/plugins/textmessage/TextMessageFeaturePlugin.cpp @@ -161,6 +161,7 @@ bool TextMessageFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& worke auto messageBox = new QMessageBox( static_cast( message.argument( Argument::Icon ).toInt() ), tr( "Message from teacher" ), message.argument( Argument::Text ).toString() ); + messageBox->setTextFormat( Qt::RichText ); messageBox->setTextInteractionFlags( Qt::TextBrowserInteraction | Qt::TextSelectableByKeyboard ); messageBox->show(); From f4ff870a3dc5ac2bcae545f684efd34808e98b29 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:54:51 +0200 Subject: [PATCH 1131/1765] FeatureProviderInterface: add isFeatureActive() --- core/src/FeatureProviderInterface.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index fbb94a0d5..4c3702395 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -164,6 +164,14 @@ class VEYON_CORE_EXPORT FeatureProviderInterface return false; } + virtual bool isFeatureActive( VeyonServerInterface& server, Feature::Uid featureUid ) const + { + Q_UNUSED(featureUid) + Q_UNUSED(server) + + return false; + } + protected: void sendFeatureMessage( const FeatureMessage& message, const ComputerControlInterfaceList& computerControlInterfaces, From 0bd5233df379f9004bbf73314998e41057ccbd52 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:56:36 +0200 Subject: [PATCH 1132/1765] VeyonServerInterface: add featureManager() --- core/src/VeyonServerInterface.h | 2 ++ server/src/ComputerControlServer.h | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index c9be3d9a6..4cb4e5b1d 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -25,6 +25,7 @@ #pragma once class BuiltinFeatures; +class FeatureManager; class FeatureMessage; class FeatureWorkerManager; class MessageContext; @@ -36,6 +37,7 @@ class VeyonServerInterface public: virtual ~VeyonServerInterface() = default; + virtual FeatureManager& featureManager() = 0; virtual FeatureWorkerManager& featureWorkerManager() = 0; virtual bool sendFeatureMessageReply( const MessageContext& context, const FeatureMessage& reply ) = 0; diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index 921c847d8..bea1f583f 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -64,6 +64,11 @@ class ComputerControlServer : public QObject, VncProxyConnectionFactory, VeyonSe bool sendFeatureMessageReply( const MessageContext& context, const FeatureMessage& reply ) override; + FeatureManager& featureManager() override + { + return m_featureManager; + } + FeatureWorkerManager& featureWorkerManager() override { return m_featureWorkerManager; From 0f81bfeb96217b9b61deda283859d3c4c3687eb2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:57:00 +0200 Subject: [PATCH 1133/1765] FeatureManager: add activeFeatures() --- core/src/FeatureManager.cpp | 23 +++++++++++++++++++++++ core/src/FeatureManager.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index a576e5360..9de7a6b27 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -24,9 +24,11 @@ #include "FeatureManager.h" #include "FeatureMessage.h" +#include "FeatureWorkerManager.h" #include "PluginInterface.h" #include "PluginManager.h" #include "VeyonConfiguration.h" +#include "VeyonServerInterface.h" Q_DECLARE_METATYPE(Feature) Q_DECLARE_METATYPE(FeatureMessage) @@ -265,3 +267,24 @@ bool FeatureManager::handleFeatureMessage( VeyonWorkerInterface& worker, const F return handled; } + + + +FeatureUidList FeatureManager::activeFeatures( VeyonServerInterface& server ) const +{ + FeatureUidList features; + + for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) + { + for( const auto& feature : featureInterface->featureList() ) + { + if( featureInterface->isFeatureActive( server, feature.uid() ) || + server.featureWorkerManager().isWorkerRunning( feature.uid() ) ) + { + features.append( feature.uid() ); + } + } + } + + return features; +} diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index 8c6dd9886..fc2361590 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -75,6 +75,8 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject const FeatureMessage& message ) const; bool handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) const; + FeatureUidList activeFeatures( VeyonServerInterface& server ) const; + private: FeatureList m_features{}; const FeatureList m_emptyFeatureList{}; From 29879d1501bef91091efa2a84126bf0206941d25 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:57:25 +0200 Subject: [PATCH 1134/1765] FeatureControl: use FeatureManager::activeFeatures() This new method returns a complete list of active features including those which are not based on worker processes. --- core/src/FeatureControl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/FeatureControl.cpp b/core/src/FeatureControl.cpp index 73d0297d2..8c0d43058 100644 --- a/core/src/FeatureControl.cpp +++ b/core/src/FeatureControl.cpp @@ -23,7 +23,7 @@ */ #include "FeatureControl.h" -#include "FeatureWorkerManager.h" +#include "FeatureManager.h" #include "VeyonCore.h" #include "VeyonServerInterface.h" @@ -80,7 +80,7 @@ bool FeatureControl::handleFeatureMessage( VeyonServerInterface& server, { if( m_featureControlFeature.uid() == message.featureUid() ) { - const auto featureUids = server.featureWorkerManager().runningWorkers(); + const auto featureUids = server.featureManager().activeFeatures( server ); QStringList featureUidStrings; featureUidStrings.reserve( featureUids.size() ); From 62061dfdaeccbd4df8da6fd59dd57d74acc9940f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 19:58:35 +0200 Subject: [PATCH 1135/1765] FeatureWorkerManager: remove runningWorkers() --- core/src/FeatureWorkerManager.cpp | 9 --------- core/src/FeatureWorkerManager.h | 1 - 2 files changed, 10 deletions(-) diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index 93a3fa5dd..761fb5ea7 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -242,15 +242,6 @@ bool FeatureWorkerManager::isWorkerRunning( Feature::Uid featureUid ) -FeatureUidList FeatureWorkerManager::runningWorkers() -{ - QMutexLocker locker( &m_workersMutex ); - - return m_workers.keys(); -} - - - void FeatureWorkerManager::acceptConnection() { vDebug() << "accepting connection"; diff --git a/core/src/FeatureWorkerManager.h b/core/src/FeatureWorkerManager.h index 23937cebf..7ff75231d 100644 --- a/core/src/FeatureWorkerManager.h +++ b/core/src/FeatureWorkerManager.h @@ -56,7 +56,6 @@ class VEYON_CORE_EXPORT FeatureWorkerManager : public QObject void sendMessageToUnmanagedSessionWorker( const FeatureMessage& message ); bool isWorkerRunning( Feature::Uid featureUid ); - FeatureUidList runningWorkers(); private: void acceptConnection(); From 7a473450b550021b32b89c079da8d4eec75a1a24 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 20:02:06 +0200 Subject: [PATCH 1136/1765] FeatureManager: make pluginUid() take a UID --- cli/src/FeatureCommands.cpp | 2 +- core/src/FeatureManager.cpp | 7 +++++-- core/src/FeatureManager.h | 3 ++- master/src/ComputerMonitoringWidget.cpp | 2 +- master/src/DocumentationFigureCreator.cpp | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index a43ad31f0..853b37b1b 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -187,7 +187,7 @@ CommandLinePluginInterface::RunResult FeatureCommands::handle_show( const QStrin #else VeyonCore::formattedUuid( feature.uid().toString() ), #endif - VeyonCore::pluginManager().pluginName( featureManager.pluginUid(feature) ) + VeyonCore::pluginManager().pluginName( featureManager.pluginUid(feature.uid()) ) } ); } diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 9de7a6b27..792061791 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -112,7 +112,7 @@ Feature::Uid FeatureManager::metaFeatureUid( Feature::Uid featureUid ) const -Plugin::Uid FeatureManager::pluginUid( const Feature& feature ) const +Plugin::Uid FeatureManager::pluginUid( Feature::Uid featureUid ) const { for( auto pluginObject : m_pluginObjects ) { @@ -120,7 +120,10 @@ Plugin::Uid FeatureManager::pluginUid( const Feature& feature ) const auto featurePluginInterface = qobject_cast( pluginObject ); if( pluginInterface && featurePluginInterface && - featurePluginInterface->featureList().contains( feature ) ) + std::find_if( featurePluginInterface->featureList().begin(), + featurePluginInterface->featureList().end(), + [&featureUid]( const Feature& feature ) { return feature.uid() == featureUid; } ) + != featurePluginInterface->featureList().end() ) { return pluginInterface->uid(); } diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index fc2361590..ff04db346 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -52,7 +52,8 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject Feature::Uid metaFeatureUid( Feature::Uid featureUid ) const; - Plugin::Uid pluginUid( const Feature& feature ) const; + Plugin::Uid pluginUid( Feature::Uid featureUid ) const; + void controlFeature( Feature::Uid featureUid, FeatureProviderInterface::Operation operation, diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index f38e8ad0e..7829c0e40 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -202,7 +202,7 @@ void ComputerMonitoringWidget::populateFeatureMenu( const ComputerControlInterf continue; } - Plugin::Uid pluginUid = master()->featureManager().pluginUid( feature ); + Plugin::Uid pluginUid = master()->featureManager().pluginUid( feature.uid() ); if( previousPluginUid.isNull() == false && pluginUid != previousPluginUid && diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index b1534fda9..d3660eaa0 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -105,7 +105,7 @@ void DocumentationFigureCreator::createFeatureFigures() for( const auto& feature : features ) { auto btn = toolbar->findChild( feature.name() ); - const auto pluginUid = m_master.featureManager().pluginUid( feature ); + const auto pluginUid = m_master.featureManager().pluginUid( feature.uid() ); if( previousPluginUid.isNull() ) { From 272cd189e37e0558e5c7348800fae3091cd8dc78 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 20:03:07 +0200 Subject: [PATCH 1137/1765] FeatureManager: add relatedFeatures() --- core/src/FeatureManager.cpp | 7 +++++++ core/src/FeatureManager.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 792061791..7fdac3ca1 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -94,6 +94,13 @@ const Feature& FeatureManager::feature( Feature::Uid featureUid ) const +const FeatureList& FeatureManager::relatedFeatures( Feature::Uid featureUid ) const +{ + return features( pluginUid( featureUid ) ); +} + + + Feature::Uid FeatureManager::metaFeatureUid( Feature::Uid featureUid ) const { for( const auto& featureInterface : m_featurePluginInterfaces ) diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index ff04db346..1c1c9ebb5 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -50,6 +50,8 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject const Feature& feature( Feature::Uid featureUid ) const; + const FeatureList& relatedFeatures( Feature::Uid featureUid ) const; + Feature::Uid metaFeatureUid( Feature::Uid featureUid ) const; Plugin::Uid pluginUid( Feature::Uid featureUid ) const; From fd1a95bedd06697460dd261f23d372793239d2d3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 20:04:50 +0200 Subject: [PATCH 1138/1765] VeyonMaster: refactor featureList() Deduplicate code via lambda and sort plugin UIDs instead of doing so every time in PluginManager::pluginUids(). --- core/src/PluginManager.cpp | 2 -- master/src/VeyonMaster.cpp | 41 ++++++++++++++++---------------------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index a8bf22651..f1957928e 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -121,8 +121,6 @@ PluginUidList PluginManager::pluginUids() const pluginUidList += pluginInterface->uid(); } - std::sort( pluginUidList.begin(), pluginUidList.end() ); - return pluginUidList; } diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index d89a23472..a22315a36 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -366,37 +366,30 @@ FeatureList VeyonMaster::featureList() const FeatureList features; const auto disabledFeatures = VeyonCore::config().disabledFeatures(); - const auto pluginUids = VeyonCore::pluginManager().pluginUids(); + auto pluginUids = VeyonCore::pluginManager().pluginUids(); - for( const auto& pluginUid : pluginUids ) - { - for( const auto& feature : m_featureManager->features( pluginUid ) ) - { - if( feature.testFlag( Feature::Flag::Master ) && - feature.testFlag( Feature::Flag::Mode ) && - feature.testFlag( Feature::Flag::Meta ) == false && - feature.parentUid().isNull() && - disabledFeatures.contains( feature.uid().toString() ) == false ) - { - features += feature; - } - } - } + std::sort( pluginUids.begin(), pluginUids.end() ); - for( const auto& pluginUid : pluginUids ) + const auto addFeatures = [&]( const std::function& extraFilter ) { - for( const auto& feature : m_featureManager->features( pluginUid ) ) + for( const auto& pluginUid : pluginUids ) { - if( feature.testFlag( Feature::Flag::Master ) && - feature.testFlag( Feature::Flag::Mode ) == false && - feature.testFlag( Feature::Flag::Meta ) == false && - feature.parentUid().isNull() && - disabledFeatures.contains( feature.uid().toString() ) == false ) + for( const auto& feature : m_featureManager->features( pluginUid ) ) { - features += feature; + if( feature.testFlag( Feature::Flag::Master ) && + feature.testFlag( Feature::Flag::Meta ) == false && + feature.parentUid().isNull() && + disabledFeatures.contains( feature.uid().toString() ) == false && + extraFilter( feature ) ) + { + features += feature; + } } } - } + }; + + addFeatures( []( const Feature& feature ) { return feature.testFlag( Feature::Flag::Mode ); } ); + addFeatures( []( const Feature& feature ) { return feature.testFlag( Feature::Flag::Mode ) == false; } ); return features; } From f79e9ec7148ddb1922e89e864e78539ba8cd2731 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 20:06:16 +0200 Subject: [PATCH 1139/1765] VeyonMaster: add shutdown() When stopping all mode features, wait until all message queues are empty so no messages get lost when aborting connections at program exit. --- master/src/VeyonMaster.cpp | 35 ++++++++++++++++++++++++++++++++++- master/src/VeyonMaster.h | 2 ++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index a22315a36..edc0634d0 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -82,7 +82,7 @@ VeyonMaster::VeyonMaster( QObject* parent ) : VeyonMaster::~VeyonMaster() { - stopAllModeFeatures( m_computerControlListModel->computerControlInterfaces() ); + shutdown(); delete m_qmlAppEngine; delete m_mainWindow; @@ -361,6 +361,39 @@ void VeyonMaster::setAppContainer( QQuickItem* appContainer ) +void VeyonMaster::shutdown() +{ + stopAllModeFeatures( m_computerControlListModel->computerControlInterfaces() ); + + const auto allMessageQueuesEmpty = [&]() { + for( const auto& computerControlInterface : m_computerControlListModel->computerControlInterfaces() ) + { + if( computerControlInterface->isMessageQueueEmpty() == false ) + { + return false; + } + } + + return true; + }; + + static constexpr auto MessageQueueWaitTimeout = 60 * 1000; + static constexpr auto MessageQueuePollInterval = 10; + + QElapsedTimer messageQueueWaitTimer; + messageQueueWaitTimer.start(); + + while( allMessageQueuesEmpty() == false && + messageQueueWaitTimer.elapsed() < MessageQueueWaitTimeout ) + { + QThread::msleep(MessageQueuePollInterval); + } + + vDebug() << "finished in" << messageQueueWaitTimer.elapsed() << "ms"; +} + + + FeatureList VeyonMaster::featureList() const { FeatureList features; diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 64b2576e3..74f0333fe 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -141,6 +141,8 @@ public Q_SLOTS: void appContainerChanged(); private: + void shutdown(); + void initUserInterface(); void setAppWindow( QQuickWindow* appWindow ); From 1898875cb1bfcb33a9ed291e7bd3229f6328f5b2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 20:08:49 +0200 Subject: [PATCH 1140/1765] VeyonCore: don't assert on s_instance == nullptr When the application quits and VeyonCore is already destroyed, still VncConnection::deleteLaterInMainThread() may be called a few times. Since it doesn't hurt to call QTimer::singleShot() with nullptr, remove the assertion from VeyonCore::instance(). --- core/src/VeyonCore.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index aec2be6b4..c1bd72289 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -152,8 +152,6 @@ VeyonCore::~VeyonCore() VeyonCore* VeyonCore::instance() { - Q_ASSERT(s_instance != nullptr); - return s_instance; } From ca828c65b879139202db118296335be9bff2d6de Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Oct 2021 20:11:33 +0200 Subject: [PATCH 1141/1765] ComputerMonitoringWidget: simplify populateFeatureMenu() This eleminates unnecessary calls to VeyonMaster::subFeatures(). --- master/src/ComputerMonitoringWidget.cpp | 26 ++++++++++++------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 7829c0e40..fd7053643 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -189,7 +189,7 @@ void ComputerMonitoringWidget::loadComputerPositions( const QJsonArray& position -void ComputerMonitoringWidget::populateFeatureMenu( const ComputerControlInterfaceList& computerControlInterfaces ) +void ComputerMonitoringWidget::populateFeatureMenu( const ComputerControlInterfaceList& computerControlInterfaces ) { Plugin::Uid previousPluginUid; @@ -213,24 +213,22 @@ void ComputerMonitoringWidget::populateFeatureMenu( const ComputerControlInterf previousPluginUid = pluginUid; - auto active = false; - - auto label = feature.displayName(); if( feature.displayNameActive().isEmpty() == false && isFeatureOrSubFeatureActive( computerControlInterfaces, feature.uid() ) ) { - label = feature.displayNameActive(); - active = true; - } - - const auto subFeatures = master()->subFeatures( feature.uid() ); - if( subFeatures.isEmpty() || active ) - { - addFeatureToMenu( feature, label ); + addFeatureToMenu( feature, feature.displayNameActive() ); } else { - addSubFeaturesToMenu( feature, subFeatures, label ); + const auto subFeatures = master()->subFeatures( feature.uid() ); + if( subFeatures.isEmpty() ) + { + addFeatureToMenu( feature, feature.displayName() ); + } + else + { + addSubFeaturesToMenu( feature, subFeatures, feature.displayName() ); + } } } } @@ -275,7 +273,7 @@ void ComputerMonitoringWidget::runDoubleClickFeature( const QModelIndex& index ) void ComputerMonitoringWidget::runMousePressAndHoldFeature( ) { const auto selectedInterfaces = selectedComputerControlInterfaces(); - if ( !m_ignoreMousePressAndHoldEvent && + if( !m_ignoreMousePressAndHoldEvent && selectedInterfaces.count() > 0 && selectedInterfaces.count() < 2 && selectedInterfaces.first()->state() == ComputerControlInterface::State::Connected && From 75a6975ae2de1d8dcc2f4ad98b5637d16ef836a0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Oct 2021 08:47:33 +0200 Subject: [PATCH 1142/1765] CCLM: examine all features in activeFeatures() With some plugins (e.g. Demo), meta features are active which are not returned by VeyonMaster::features(). Instead iterate over all available features (including meta features) and filter for items with the proper flags. This fixes the demo features not being reported as active features in the tooltip. --- master/src/ComputerControlListModel.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index a961c7dde..1b2ad4875 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -577,10 +577,12 @@ QString ComputerControlListModel::loggedOnUserInformation( const ComputerControl QString ComputerControlListModel::activeFeatures( const ComputerControlInterface::Pointer& controlInterface ) const { QStringList featureNames; + featureNames.reserve( controlInterface->activeFeatures().size() ); - for( const auto& feature : m_master->features() ) + for( const auto& feature : m_master->featureManager().features() ) { - if( controlInterface->activeFeatures().contains( feature.uid() ) ) + if( feature.testFlag( Feature::Flag::Master ) && + controlInterface->activeFeatures().contains( feature.uid() ) ) { featureNames.append( feature.displayName() ); } From 2d59aa29c3648fb361d7cc3e34ffdc9db99a9211 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Oct 2021 08:50:41 +0200 Subject: [PATCH 1143/1765] CCLM: return special string for no active features --- master/src/ComputerControlListModel.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 1b2ad4875..d81ec21af 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -590,5 +590,10 @@ QString ComputerControlListModel::activeFeatures( const ComputerControlInterface featureNames.removeAll( {} ); + if( featureNames.isEmpty() ) + { + return tr("[none]"); + } + return featureNames.join( QStringLiteral(", ") ); } From 602d0a05512fe9e2b1ba1f075f696d03e53ea241 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Oct 2021 08:54:53 +0200 Subject: [PATCH 1144/1765] ComputerMonitoringView: refactor isFeatureOrRelatedFeatureActive() Iterate over static feature list returned by FeatureManager::relatedFeatures() to reduce allocations. --- master/src/ComputerMonitoringView.cpp | 19 ++++++++++--------- master/src/ComputerMonitoringView.h | 4 ++-- master/src/ComputerMonitoringWidget.cpp | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index dd3d58893..9d0d7dc54 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -221,20 +221,21 @@ void ComputerMonitoringView::runFeature( const Feature& feature ) -bool ComputerMonitoringView::isFeatureOrSubFeatureActive( const ComputerControlInterfaceList& computerControlInterfaces, - Feature::Uid featureUid ) const +bool ComputerMonitoringView::isFeatureOrRelatedFeatureActive( const ComputerControlInterfaceList& computerControlInterfaces, + Feature::Uid featureUid ) const { - auto featureList = FeatureUidList{ featureUid } + m_master->subFeaturesUids( featureUid ); - featureList.append( m_master->metaFeaturesUids( featureList ) ); + const auto& relatedFeatures = m_master->featureManager().relatedFeatures( featureUid ); for( const auto& controlInterface : computerControlInterfaces ) { - for( const auto& activeFeature : controlInterface->activeFeatures() ) + if( controlInterface->activeFeatures().contains( featureUid ) || + std::find_if( relatedFeatures.begin(), relatedFeatures.end(), + [&controlInterface](const auto& relatedFeature) { + return controlInterface->activeFeatures().contains( relatedFeature.uid() ); + } ) + != relatedFeatures.end() ) { - if( featureList.contains( activeFeature ) ) - { - return true; - } + return true; } } diff --git a/master/src/ComputerMonitoringView.h b/master/src/ComputerMonitoringView.h index 266d576ab..bf2d642ce 100644 --- a/master/src/ComputerMonitoringView.h +++ b/master/src/ComputerMonitoringView.h @@ -93,8 +93,8 @@ class ComputerMonitoringView void runFeature( const Feature& feature ); - bool isFeatureOrSubFeatureActive( const ComputerControlInterfaceList& computerControlInterfaces, - Feature::Uid featureUid ) const; + bool isFeatureOrRelatedFeatureActive( const ComputerControlInterfaceList& computerControlInterfaces, + Feature::Uid featureUid ) const; private: VeyonMaster* m_master{nullptr}; diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index fd7053643..2e295fcda 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -214,7 +214,7 @@ void ComputerMonitoringWidget::populateFeatureMenu( const ComputerControlInterfa previousPluginUid = pluginUid; if( feature.displayNameActive().isEmpty() == false && - isFeatureOrSubFeatureActive( computerControlInterfaces, feature.uid() ) ) + isFeatureOrRelatedFeatureActive( computerControlInterfaces, feature.uid() ) ) { addFeatureToMenu( feature, feature.displayNameActive() ); } From d856a8df07ad1a2997e7c4ddbc4026b860971fb7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Oct 2021 09:27:55 +0200 Subject: [PATCH 1145/1765] ComputerMonitoringView: fix stopping meta features in runFeature() --- master/src/ComputerMonitoringView.cpp | 28 ++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 9d0d7dc54..24f3414a1 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -194,27 +194,29 @@ void ComputerMonitoringView::runFeature( const Feature& feature ) computerControlInterfaces = m_master->filteredComputerControlInterfaces(); } - // mode feature already active? - if( feature.testFlag( Feature::Flag::Mode ) && - isFeatureOrSubFeatureActive( computerControlInterfaces, feature.uid() ) ) - { - // then stop it - m_master->featureManager().stopFeature( *m_master, feature, computerControlInterfaces ); - } - else + const auto alreadyActive = feature.testFlag( Feature::Flag::Mode ) && + isFeatureOrRelatedFeatureActive( computerControlInterfaces, feature.uid() ); + + if( feature.testFlag( Feature::Flag::Mode ) ) { - // stop all other active mode feature - if( feature.testFlag( Feature::Flag::Mode ) ) + for( const auto& currentFeature : m_master->features() ) { - for( const auto& currentFeature : m_master->features() ) + // stop already active or all other active mode features + if( currentFeature.testFlag( Feature::Flag::Mode ) && ( alreadyActive || currentFeature != feature ) ) { - if( currentFeature.testFlag( Feature::Flag::Mode ) && currentFeature != feature ) + m_master->featureManager().stopFeature( *m_master, currentFeature, computerControlInterfaces ); + + const auto subFeatures = m_master->subFeatures( currentFeature.uid() ); + for( const auto& subFeature : subFeatures ) { - m_master->featureManager().stopFeature( *m_master, currentFeature, computerControlInterfaces ); + m_master->featureManager().stopFeature( *m_master, subFeature, computerControlInterfaces ); } } } + } + if( alreadyActive == false ) + { m_master->featureManager().startFeature( *m_master, feature, computerControlInterfaces ); } } From 14cac53635ff27025899215facc825ec071eef5b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Oct 2021 09:30:43 +0200 Subject: [PATCH 1146/1765] VeyonMaster: iterate over related features only in subFeatures() --- master/src/VeyonMaster.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index edc0634d0..8428d250d 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -99,26 +99,28 @@ VeyonMaster::~VeyonMaster() FeatureList VeyonMaster::subFeatures( Feature::Uid parentFeatureUid ) const { - FeatureList features; - const auto disabledFeatures = VeyonCore::config().disabledFeatures(); - const auto pluginUids = VeyonCore::pluginManager().pluginUids(); + if( disabledFeatures.contains( parentFeatureUid.toString() ) ) + { + return {}; + } - for( const auto& pluginUid : pluginUids ) + const auto& relatedFeatures = m_featureManager->relatedFeatures( parentFeatureUid ); + + FeatureList subFeatures; + subFeatures.reserve( relatedFeatures.size() ); + + for( const auto& relatedFeature : relatedFeatures ) { - for( const auto& feature : m_featureManager->features( pluginUid ) ) + if( relatedFeature.testFlag( Feature::Flag::Master ) && + relatedFeature.parentUid() == parentFeatureUid && + disabledFeatures.contains( relatedFeature.uid().toString() ) == false ) { - if( feature.testFlag( Feature::Flag::Master ) && - feature.parentUid() == parentFeatureUid && - disabledFeatures.contains( parentFeatureUid.toString() ) == false && - disabledFeatures.contains( feature.uid().toString() ) == false ) - { - features += feature; - } + subFeatures += relatedFeature; } } - return features; + return subFeatures; } From 0bcbec8bd047ea0e0199d37c88f887ae49bd7eed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Oct 2021 09:32:09 +0200 Subject: [PATCH 1147/1765] VeyonMaster: drop unused subFeaturesUids()/metaFeaturesUids() --- master/src/VeyonMaster.cpp | 45 -------------------------------------- master/src/VeyonMaster.h | 2 -- 2 files changed, 47 deletions(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 8428d250d..37ddea976 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -125,51 +125,6 @@ FeatureList VeyonMaster::subFeatures( Feature::Uid parentFeatureUid ) const -FeatureUidList VeyonMaster::subFeaturesUids( Feature::Uid parentFeatureUid ) const -{ - FeatureUidList featureUids; - - const auto disabledFeatures = VeyonCore::config().disabledFeatures(); - const auto pluginUids = VeyonCore::pluginManager().pluginUids(); - - for( const auto& pluginUid : pluginUids ) - { - for( const auto& feature : m_featureManager->features( pluginUid ) ) - { - if( feature.testFlag( Feature::Flag::Master ) && - feature.parentUid() == parentFeatureUid && - disabledFeatures.contains( parentFeatureUid.toString() ) == false && - disabledFeatures.contains( feature.uid().toString() ) == false ) - { - featureUids += feature.uid(); - } - } - } - - return featureUids; -} - - - -FeatureUidList VeyonMaster::metaFeaturesUids( const FeatureUidList& featureUids ) const -{ - FeatureUidList metaFeatureUids; - metaFeatureUids.reserve( featureUids.size() ); - - for( const auto& featureUid : featureUids ) - { - const auto metaFeatureUid = m_featureManager->metaFeatureUid( featureUid ); - if( metaFeatureUid.isNull() == false ) - { - metaFeatureUids.append( metaFeatureUid ); - } - } - - return metaFeatureUids; -} - - - FeatureList VeyonMaster::modeFeatures() const { FeatureList featureList; diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 74f0333fe..0532bd7ee 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -97,8 +97,6 @@ class VeyonMaster : public VeyonMasterInterface } FeatureList subFeatures( Feature::Uid parentFeatureUid ) const; - FeatureUidList subFeaturesUids( Feature::Uid parentFeatureUid ) const; - FeatureUidList metaFeaturesUids( const FeatureUidList& featureUids ) const; FeatureList modeFeatures() const; From 92c5ed322f32e9e9828643af1806edd975e4f75d Mon Sep 17 00:00:00 2001 From: Yeji Hong Date: Wed, 27 Oct 2021 13:25:00 +0900 Subject: [PATCH 1148/1765] Core: remove unused variable 'index' --- core/src/NetworkObjectDirectory.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index fb0b4cb56..c4fb10c61 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -83,14 +83,12 @@ const NetworkObject& NetworkObjectDirectory::object( NetworkObject::ModelId pare const auto it = m_objects.constFind( parent ); if( it != m_objects.end() ) { - int index = 0; for( const auto& entry : *it ) { if( entry.modelId() == object ) { return entry; } - ++index; } } From a3d1106cc82f6fb067634d1699357eb11981d3d2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 11:22:48 +0100 Subject: [PATCH 1149/1765] ComputerListModel: add UserLoginNameRole --- core/src/ComputerListModel.cpp | 1 + core/src/ComputerListModel.h | 1 + 2 files changed, 2 insertions(+) diff --git a/core/src/ComputerListModel.cpp b/core/src/ComputerListModel.cpp index 5d5294287..323c1a55b 100644 --- a/core/src/ComputerListModel.cpp +++ b/core/src/ComputerListModel.cpp @@ -55,6 +55,7 @@ QHash ComputerListModel::roleNames() const auto roles = QAbstractListModel::roleNames(); roles[UidRole] = "uid"; roles[StateRole] = "state"; + roles[UserLoginNameRole] = "userLoginName"; roles[ImageIdRole] = "imageId"; roles[GroupsRole] = "groups"; return roles; diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index 43d19cac1..a988f50cc 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -35,6 +35,7 @@ class VEYON_CORE_EXPORT ComputerListModel : public QAbstractListModel enum { UidRole = Qt::UserRole, StateRole, + UserLoginNameRole, ImageIdRole, GroupsRole, ScreenRole, From b525f3e4ea539a6defdd5786a4fbc361d6254d18 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 11:23:17 +0100 Subject: [PATCH 1150/1765] ComputerControlListModel: add support for UserLoginNameRole --- master/src/ComputerControlListModel.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index d81ec21af..1553cbfda 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -107,6 +107,9 @@ QVariant ComputerControlListModel::data( const QModelIndex& index, int role ) co case StateRole: return QVariant::fromValue( computerControl->state() ); + case UserLoginNameRole: + return computerControl->userLoginName(); + case ImageIdRole: return QStringLiteral("image://%1/%2/%3").arg( imageProvider()->id(), VeyonCore::formattedUuid( computerControl->computer().networkObjectUid() ), From b0a9384332f783722faacdcf06191c8724709aed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 11:24:30 +0100 Subject: [PATCH 1151/1765] ComputerMonitoringModel: add support for filtering for non-empty user login names --- master/src/ComputerMonitoringModel.cpp | 30 ++++++++++++++++++++++++++ master/src/ComputerMonitoringModel.h | 16 ++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/master/src/ComputerMonitoringModel.cpp b/master/src/ComputerMonitoringModel.cpp index 720ebb754..f249b48f5 100644 --- a/master/src/ComputerMonitoringModel.cpp +++ b/master/src/ComputerMonitoringModel.cpp @@ -41,6 +41,7 @@ ComputerMonitoringModel::ComputerMonitoringModel( ComputerControlListModel* sour setFilterCaseSensitivity( Qt::CaseInsensitive ); setSortRole( Qt::InitialSortOrderRole ); setStateRole( ComputerControlListModel::StateRole ); + setUserLoginNameRole( ComputerControlListModel::UserLoginNameRole ); setGroupsRole( ComputerControlListModel::GroupsRole ); sort( 0 ); } @@ -56,6 +57,15 @@ void ComputerMonitoringModel::setStateRole( int role ) +void ComputerMonitoringModel::setUserLoginNameRole( int role ) +{ + beginResetModel(); + m_userLoginNameRole = role; + endResetModel(); +} + + + void ComputerMonitoringModel::setGroupsRole( int role ) { beginResetModel(); @@ -74,6 +84,18 @@ void ComputerMonitoringModel::setStateFilter( ComputerControlInterface::State st +void ComputerMonitoringModel::setFilterNonEmptyUserLoginNames( bool enabled ) +{ + if( enabled != m_filterNonEmptyUserLoginNames ) + { + beginResetModel(); + m_filterNonEmptyUserLoginNames = enabled; + endResetModel(); + } +} + + + void ComputerMonitoringModel::setGroupsFilter( const QStringList& groups ) { beginResetModel(); @@ -97,6 +119,14 @@ bool ComputerMonitoringModel::filterAcceptsRow( int sourceRow, const QModelIndex return false; } + if( m_filterNonEmptyUserLoginNames && + userLoginNameRole() >= 0 && + sourceModel()->data( sourceModel()->index( sourceRow, 0, sourceParent ), + m_userLoginNameRole ).toString().isEmpty() ) + { + return false; + } + if( m_groupsRole >= 0 && groupsFilter().isEmpty() == false ) { const auto groups = sourceModel()->data( sourceModel()->index( sourceRow, 0, sourceParent ), m_groupsRole ).toStringList(); diff --git a/master/src/ComputerMonitoringModel.h b/master/src/ComputerMonitoringModel.h index 251d14849..5a2af9fd3 100644 --- a/master/src/ComputerMonitoringModel.h +++ b/master/src/ComputerMonitoringModel.h @@ -43,6 +43,13 @@ class ComputerMonitoringModel : public QSortFilterProxyModel void setStateRole( int role ); + int userLoginNameRole() const + { + return m_userLoginNameRole; + } + + void setUserLoginNameRole( int role ); + int groupsRole() const { return m_groupsRole; @@ -57,6 +64,13 @@ class ComputerMonitoringModel : public QSortFilterProxyModel void setStateFilter( ComputerControlInterface::State state ); + bool filterNonEmptyUserLoginNames() const + { + return m_filterNonEmptyUserLoginNames; + } + + void setFilterNonEmptyUserLoginNames( bool enabled ); + const QSet& groupsFilter() const { return m_groupsFilter; @@ -69,8 +83,10 @@ class ComputerMonitoringModel : public QSortFilterProxyModel private: int m_stateRole{-1}; + int m_userLoginNameRole{-1}; int m_groupsRole{-1}; ComputerControlInterface::State m_stateFilter{ComputerControlInterface::State::None}; + bool m_filterNonEmptyUserLoginNames{false}; QSet m_groupsFilter; }; From 1feb743b385be4c9407f9753bebe2b7ff0decc7a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 11:25:45 +0100 Subject: [PATCH 1152/1765] Master: UserConfig: add UI/FilterComputersWithLoggedOnUsers --- master/src/UserConfig.h | 1 + 1 file changed, 1 insertion(+) diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index 48906ebbc..2f357bda2 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -46,6 +46,7 @@ class UserConfig : public Configuration::Object OP( UserConfig, VeyonMaster::userConfig(), QJsonArray, computerPositions, setComputerPositions, "ComputerPositions", "UI", QJsonArray(), Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), bool, useCustomComputerPositions, setUseCustomComputerPositions, "UseCustomComputerPositions", "UI", false, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), bool, filterPoweredOnComputers, setFilterPoweredOnComputers, "FilterPoweredOnComputers", "UI", false, Configuration::Property::Flag::Standard ) \ + OP( UserConfig, VeyonMaster::userConfig(), bool, filterComputersWithLoggedOnUsers, setFilterComputersWithLoggedOnUsers, "FilterComputersWithLoggedOnUsers", "UI", false, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), int, monitoringScreenSize, setMonitoringScreenSize, "MonitoringScreenSize", "UI", ComputerMonitoringView::DefaultComputerScreenSize, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), bool, autoAdjustMonitoringIconSize, setAutoAdjustMonitoringIconSize, "AutoAdjustMonitoringIconSize", "UI", false, Configuration::Property::Flag::Standard ) \ OP( UserConfig, VeyonMaster::userConfig(), int, slideshowDuration, setSlideshowDuration, "SlideshowDuration", "UI", SlideshowPanel::DefaultDuration, Configuration::Property::Flag::Standard ) \ From c27f0302cefdb8e313331580757600c0aaac6d2d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 11:26:03 +0100 Subject: [PATCH 1153/1765] ComputerMonitoringView: add support for filtering for non-empty user login names --- master/src/ComputerMonitoringView.cpp | 8 ++++++++ master/src/ComputerMonitoringView.h | 1 + 2 files changed, 9 insertions(+) diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 24f3414a1..ab170b520 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -70,6 +70,7 @@ void ComputerMonitoringView::initializeView( QObject* self ) void ComputerMonitoringView::saveConfiguration() { m_master->userConfig().setFilterPoweredOnComputers( dataModel()->stateFilter() != ComputerControlInterface::State::None ); + m_master->userConfig().setFilterComputersWithLoggedOnUsers( dataModel()->filterNonEmptyUserLoginNames() ); m_master->userConfig().setComputerPositions( saveComputerPositions() ); m_master->userConfig().setUseCustomComputerPositions( useCustomComputerPositions() ); } @@ -113,6 +114,13 @@ void ComputerMonitoringView::setFilterPoweredOnComputers( bool enabled ) +void ComputerMonitoringView::setFilterComputersWithLoggedOnUsers( bool enabled ) +{ + dataModel()->setFilterNonEmptyUserLoginNames( enabled ); +} + + + QStringList ComputerMonitoringView::groupFilter() const { #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) diff --git a/master/src/ComputerMonitoringView.h b/master/src/ComputerMonitoringView.h index bf2d642ce..fafca5baf 100644 --- a/master/src/ComputerMonitoringView.h +++ b/master/src/ComputerMonitoringView.h @@ -59,6 +59,7 @@ class ComputerMonitoringView void setSearchFilter( const QString& searchFilter ); void setFilterPoweredOnComputers( bool enabled ); + void setFilterComputersWithLoggedOnUsers( bool enabled ); QStringList groupFilter() const; void setGroupFilter( const QStringList& groups ); From 1a181e16001144b10484dd41d8bedfeaa8ba4e58 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 11:26:49 +0100 Subject: [PATCH 1154/1765] Master: MainWindow: add button for filtering computers with logged on users Closes #762. --- master/src/MainWindow.cpp | 4 ++++ master/src/MainWindow.ui | 30 ++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index dd14d7529..e177adb8d 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -70,6 +70,7 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : ui->statusBar->addWidget( ui->spacerLabel1 ); ui->statusBar->addWidget( ui->filterLineEdit, 2 ); ui->statusBar->addWidget( ui->filterPoweredOnComputersButton ); + ui->statusBar->addWidget( ui->filterComputersWithLoggedOnUsersButton ); ui->statusBar->addWidget( ui->spacerLabel2, 1 ); ui->statusBar->addWidget( ui->gridSizeSlider, 2 ); ui->statusBar->addWidget( ui->autoAdjustComputerIconSizeButton ); @@ -196,10 +197,13 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : // initialize search filter ui->filterPoweredOnComputersButton->setChecked( m_master.userConfig().filterPoweredOnComputers() ); + ui->filterComputersWithLoggedOnUsersButton->setChecked( m_master.userConfig().filterComputersWithLoggedOnUsers() ); connect( ui->filterLineEdit, &QLineEdit::textChanged, this, [this]( const QString& filter ) { ui->computerMonitoringWidget->setSearchFilter( filter ); } ); connect( ui->filterPoweredOnComputersButton, &QToolButton::toggled, this, [this]( bool enabled ) { ui->computerMonitoringWidget->setFilterPoweredOnComputers( enabled ); } ); + connect( ui->filterComputersWithLoggedOnUsersButton, &QToolButton::toggled, + this, [this]( bool enabled ) { ui->computerMonitoringWidget->setFilterComputersWithLoggedOnUsers( enabled ); } ); // initialize monitoring screen size slider ui->gridSizeSlider->setMinimum( ComputerMonitoringWidget::MinimumComputerScreenSize ); diff --git a/master/src/MainWindow.ui b/master/src/MainWindow.ui index d444fb832..1c8555c5e 100644 --- a/master/src/MainWindow.ui +++ b/master/src/MainWindow.ui @@ -145,7 +145,7 @@ - 560 + 470 570 113 38 @@ -233,7 +233,7 @@ - 680 + 590 570 69 37 @@ -384,6 +384,32 @@ + + + + 670 + 570 + 69 + 37 + + + + Only show computers with logged on users + + + + :/core/user-group-new.png:/core/user-group-new.png + + + + 32 + 32 + + + + true + +
    From 9f4b65acecf5129a185b2c73c69e5a240f8a533a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 11:55:03 +0100 Subject: [PATCH 1155/1765] WindowsServiceControl: always log error code --- .../windows/WindowsServiceControl.cpp | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 2902c116f..143e5c89d 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -41,12 +41,15 @@ WindowsServiceControl::WindowsServiceControl( const QString& name ) : SERVICE_ALL_ACCESS ); if( m_serviceHandle == nullptr ) { - vCritical() << "could not open service" << m_name; + const auto error = GetLastError(); + vCritical() << qUtf8Printable( QStringLiteral("failed to open service \"%1\" (error %2)") + .arg(m_name).arg(error) ); } } else { - vCritical() << "the Service Control Manager could not be contacted - service " << m_name << "can't be controlled."; + const auto error = GetLastError(); + vCritical() << qUtf8Printable( QStringLiteral("failed to contact the Service Control Manager (error %1)").arg(error) ); } } @@ -191,7 +194,8 @@ bool WindowsServiceControl::install( const QString& filePath, const QString& dis } else { - vCritical() << qUtf8Printable( tr( "The service \"%1\" could not be installed." ).arg( m_name ) ); + vCritical() << qUtf8Printable( tr("The service \"%1\" could not be installed (error %2).") + .arg( m_name ).arg( error ) ); } return false; @@ -207,7 +211,13 @@ bool WindowsServiceControl::install( const QString& filePath, const QString& dis serviceFailureActions.lpCommand = nullptr; serviceFailureActions.lpsaActions = &serviceActions; serviceFailureActions.cActions = 1; - ChangeServiceConfig2( m_serviceHandle, SERVICE_CONFIG_FAILURE_ACTIONS, &serviceFailureActions ); + if( ChangeServiceConfig2( m_serviceHandle, SERVICE_CONFIG_FAILURE_ACTIONS, &serviceFailureActions ) == false ) + { + const auto error = GetLastError(); + vCritical() << qUtf8Printable( tr("Could not change the failure actions config for service \"%1\" (error %2).") + .arg( m_name ).arg( error ) ); + return false; + } // Everything went fine vInfo() << qUtf8Printable( tr( "The service \"%1\" has been installed successfully." ).arg( m_name ) ); @@ -231,7 +241,9 @@ bool WindowsServiceControl::uninstall() if( DeleteService( m_serviceHandle ) == false ) { - vCritical() << qUtf8Printable( tr( "The service \"%1\" could not be uninstalled." ).arg( m_name ) ); + const auto error = GetLastError(); + vCritical() << qUtf8Printable( tr( "The service \"%1\" could not be uninstalled (error %2)." ) + .arg( m_name ).arg( error ) ); return false; } @@ -255,13 +267,15 @@ int WindowsServiceControl::startType() if( QueryServiceConfig( m_serviceHandle, nullptr, 0, &bytesNeeded ) == false ) { - if( GetLastError() == ERROR_INSUFFICIENT_BUFFER ) + const auto error = GetLastError(); + if( error == ERROR_INSUFFICIENT_BUFFER ) { bufferSize = bytesNeeded; serviceConfig = LPQUERY_SERVICE_CONFIG(LocalAlloc(LMEM_FIXED, bufferSize)); } else { + vCritical() << "error while querying service configuration" << m_name << error; return InvalidStartType; } } @@ -273,7 +287,7 @@ int WindowsServiceControl::startType() if( QueryServiceConfig( m_serviceHandle, serviceConfig, bufferSize, &bytesNeeded ) == false ) { const auto error = GetLastError(); - vCritical() << error; + vCritical() << "error while querying service configuration" << m_name << error; LocalFree( serviceConfig ); return InvalidStartType; } @@ -307,7 +321,9 @@ bool WindowsServiceControl::setStartType( int startType ) nullptr // lpDisplayName ) == false ) { - vCritical() << qUtf8Printable( tr( "The start type of service \"%1\" could not be changed." ).arg( m_name ) ); + const auto error = GetLastError(); + vCritical() << qUtf8Printable( tr("The start type of service \"%1\" could not be changed (error %2).") + .arg( m_name ).arg( error ) ); return false; } From d28ab7fae6aa4fdc27dfff6a5e7e106bb545cfcb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 13:35:47 +0100 Subject: [PATCH 1156/1765] WindowsServiceControl: make stop() more resilient Handle cases where the service is already stopped or being stopped and log error codes. Closes #751. --- .../windows/WindowsServiceControl.cpp | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 143e5c89d..559d93d79 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -133,8 +133,30 @@ bool WindowsServiceControl::stop() } SERVICE_STATUS status; + if( QueryServiceStatus( m_serviceHandle, &status ) && + status.dwCurrentState == SERVICE_STOPPED ) + { + return true; + } + + while( status.dwCurrentState == SERVICE_STOP_PENDING ) + { + Sleep( 1000 ); + if( QueryServiceStatus( m_serviceHandle, &status ) == false ) + { + const auto error = GetLastError(); + vWarning() << "failed to wait for stopping service" << m_name + << qUtf8Printable(QStringLiteral("(error %1)").arg(error)); + + return false; + } + + if( status.dwCurrentState == SERVICE_STOPPED ) + { + return true; + } + } - // Try to stop the service if( ControlService( m_serviceHandle, SERVICE_CONTROL_STOP, &status ) ) { while( QueryServiceStatus( m_serviceHandle, &status ) ) @@ -151,12 +173,18 @@ bool WindowsServiceControl::stop() if( status.dwCurrentState != SERVICE_STOPPED ) { - vWarning() << "service" << m_name << "could not be stopped."; + vWarning() << "failed to stop service" << m_name; return false; } + + return true; } - return true; + const auto error = GetLastError(); + vWarning() << "failed to stop service" << m_name + << qUtf8Printable(QStringLiteral("(error %1)").arg(error)); + + return false; } From bd89403845e00dc843cd2cefc54b95ebfda7c0a3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 15:27:59 +0100 Subject: [PATCH 1157/1765] Testing: add ping test --- plugins/testing/TestingCommandLinePlugin.cpp | 13 +++++++++++++ plugins/testing/TestingCommandLinePlugin.h | 1 + 2 files changed, 14 insertions(+) diff --git a/plugins/testing/TestingCommandLinePlugin.cpp b/plugins/testing/TestingCommandLinePlugin.cpp index c636de268..554dbfa95 100644 --- a/plugins/testing/TestingCommandLinePlugin.cpp +++ b/plugins/testing/TestingCommandLinePlugin.cpp @@ -24,6 +24,7 @@ #include "CommandLineIO.h" #include "AccessControlProvider.h" +#include "PlatformNetworkFunctions.h" #include "TestingCommandLinePlugin.h" @@ -120,3 +121,15 @@ CommandLinePluginInterface::RunResult TestingCommandLinePlugin::handle_isaccessd return Successful; } + + + +CommandLinePluginInterface::RunResult TestingCommandLinePlugin::handle_ping( const QStringList& arguments ) +{ + if( arguments.count() < 1 ) + { + return NotEnoughArguments; + } + + return VeyonCore::platform().networkFunctions().ping( arguments.first() ) ? Successful : Failed; +} diff --git a/plugins/testing/TestingCommandLinePlugin.h b/plugins/testing/TestingCommandLinePlugin.h index 6546821ba..8e47371e5 100644 --- a/plugins/testing/TestingCommandLinePlugin.h +++ b/plugins/testing/TestingCommandLinePlugin.h @@ -84,6 +84,7 @@ public Q_SLOTS: CommandLinePluginInterface::RunResult handle_authorizedgroups( const QStringList& arguments ); CommandLinePluginInterface::RunResult handle_accesscontrolrules( const QStringList& arguments ); CommandLinePluginInterface::RunResult handle_isaccessdeniedbylocalstate( const QStringList& arguments ); + CommandLinePluginInterface::RunResult handle_ping( const QStringList& arguments ); private: QMap m_commands; From b7655b687e1344d0993b2a69884cc643962bb3fa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 15:39:29 +0100 Subject: [PATCH 1158/1765] WindowsNetworkFunctions: make ping() use ICMP API Prefer ICMP API over launching the external ping utility. Closes #335. --- plugins/platform/windows/CMakeLists.txt | 2 +- .../windows/WindowsNetworkFunctions.cpp | 163 +++++++++++++++++- .../windows/WindowsNetworkFunctions.h | 5 + 3 files changed, 165 insertions(+), 5 deletions(-) diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index 4491ae7c9..44547420a 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -56,7 +56,7 @@ target_include_directories(windows-platform PRIVATE ${ultravnc_DIR} ${Qt5Gui_PRIVATE_INCLUDE_DIRS} ) -target_link_libraries(windows-platform -lwtsapi32 -lnetapi32 -luserenv -linterception) +target_link_libraries(windows-platform -lwtsapi32 -lnetapi32 -luserenv -linterception -liphlpapi) target_compile_definitions(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) target_compile_options(windows-platform PRIVATE "-Wno-unknown-pragmas") set_source_files_properties(WindowsNetworkFunctions.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_PRECOMPILE_HEADERS TRUE) diff --git a/plugins/platform/windows/WindowsNetworkFunctions.cpp b/plugins/platform/windows/WindowsNetworkFunctions.cpp index 232e7fe9b..dba5e80e3 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.cpp +++ b/plugins/platform/windows/WindowsNetworkFunctions.cpp @@ -27,9 +27,15 @@ #include #include #include +#include +#include +#include +#include +#include #include +#include "HostAddress.h" #include "WindowsCoreFunctions.h" #include "WindowsNetworkFunctions.h" @@ -220,11 +226,22 @@ WindowsNetworkFunctions::WindowsNetworkFunctions() : PlatformNetworkFunctions() bool WindowsNetworkFunctions::ping( const QString& hostAddress ) { - QProcess pingProcess; - pingProcess.start( QStringLiteral("ping"), { QStringLiteral("-n"), QStringLiteral("1"), QStringLiteral("-w"), QString::number( PingTimeout ), hostAddress } ); - pingProcess.waitForFinished( PingProcessTimeout ); + bool result; - return pingProcess.exitCode() == 0; + const auto convertedAddress = HostAddress(hostAddress).tryConvert(HostAddress::Type::IpAddress); + const auto addressProtocol = QHostAddress(convertedAddress).protocol(); + + if( addressProtocol == QAbstractSocket::IPv4Protocol && pingIPv4Address(convertedAddress, &result) ) + { + return result; + } + + if( addressProtocol == QAbstractSocket::IPv6Protocol && pingIPv6Address(convertedAddress, &result) ) + { + return result; + } + + return pingViaUtility(hostAddress); } @@ -308,3 +325,141 @@ bool WindowsNetworkFunctions::configureSocketKeepalive( Socket socket, bool enab return true; } + + + +bool WindowsNetworkFunctions::pingIPv4Address( const QString& hostAddress, bool* result ) +{ + if( result == nullptr ) + { + return false; + } + + *result = false; + + const IPAddr ipAddress = inet_addr(hostAddress.toLatin1().constData()); + if( ipAddress == INADDR_NONE ) + { + return false; + } + + const auto icmpHandle = IcmpCreateFile(); + if( icmpHandle == INVALID_HANDLE_VALUE ) + { + IcmpCloseHandle(icmpHandle); + return false; + } + + std::array sendData{'V', 'e', 'y', 'o', 'n', 0}; + std::array replyBuffer; + + const auto success = IcmpSendEcho(icmpHandle, ipAddress, sendData.data(), sendData.size(), + nullptr, replyBuffer.data(), replyBuffer.size(), PingTimeout) > 0 && + reinterpret_cast(replyBuffer.data())->Status == IP_SUCCESS; + + const auto error = GetLastError(); + + IcmpCloseHandle(icmpHandle); + + if( success ) + { + *result = true; + return true; + } + + return error == IP_REQ_TIMED_OUT; +} + + + +bool WindowsNetworkFunctions::pingIPv6Address( const QString& hostAddress, bool* result ) +{ + if( result == nullptr ) + { + return false; + } + + *result = false; + + SOCKADDR_IN6 icmp6LocalAddr{}; + icmp6LocalAddr.sin6_addr = in6addr_any; + icmp6LocalAddr.sin6_family = AF_INET6; + + SOCKADDR_IN6 icmp6RemoteAddr{}; + struct addrinfo hints{}; + struct addrinfo *res = nullptr; + + hints.ai_family = AF_INET6; + hints.ai_socktype = SOCK_STREAM; + + if( getaddrinfo(hostAddress.toLatin1().constData(), nullptr, &hints, &res) != 0 ) + { + return false; + } + + auto resalloc = res; + + while( res != nullptr ) + { + if( res->ai_family == AF_INET6 ) + { + memcpy( &icmp6RemoteAddr, res->ai_addr, res->ai_addrlen ); + icmp6RemoteAddr.sin6_family = AF_INET6; + break; + } + + res = res->ai_next; + } + + freeaddrinfo(resalloc); + + if( icmp6RemoteAddr.sin6_family != AF_INET6 ) + { + return false; + } + + const auto icmpFile = Icmp6CreateFile(); + if( icmpFile == INVALID_HANDLE_VALUE ) + { + return false; + } + + using ICMPV6_ECHO_REPLY = struct { + IPV6_ADDRESS_EX Address; + ULONG Status; + unsigned int RoundTripTime; + }; + + std::array sendData{'V', 'e', 'y', 'o', 'n', 0}; + std::array replyBuffer; + + const auto success = Icmp6SendEcho2(icmpFile, nullptr, nullptr, nullptr, + &icmp6LocalAddr, + &icmp6RemoteAddr, + sendData.data(), sendData.size(), + nullptr, replyBuffer.data(), replyBuffer.size(), PingTimeout) > 0 && + reinterpret_cast(replyBuffer.data())->Status == IP_SUCCESS; + + const auto error = GetLastError(); + + IcmpCloseHandle(icmpFile); + + if( success ) + { + *result = true; + return true; + } + + return error == IP_REQ_TIMED_OUT; +} + + + +bool WindowsNetworkFunctions::pingViaUtility( const QString& hostAddress ) +{ + QProcess pingProcess; + pingProcess.start( QStringLiteral("ping"), { QStringLiteral("-n"), QStringLiteral("1"), QStringLiteral("-w"), QString::number( PingTimeout ), hostAddress } ); + pingProcess.waitForFinished( PingProcessTimeout ); + + return pingProcess.exitCode() == 0; +} diff --git a/plugins/platform/windows/WindowsNetworkFunctions.h b/plugins/platform/windows/WindowsNetworkFunctions.h index 1c20843c0..7ee07cc93 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.h +++ b/plugins/platform/windows/WindowsNetworkFunctions.h @@ -38,4 +38,9 @@ class WindowsNetworkFunctions : public PlatformNetworkFunctions bool configureSocketKeepalive( Socket socket, bool enabled, int idleTime, int interval, int probes ) override; +private: + bool pingIPv4Address( const QString& hostAddress, bool* result ); + bool pingIPv6Address( const QString& hostAddress, bool* result ); + bool pingViaUtility( const QString& hostAddress ); + }; From 3e6f2d48a76f77d44e9318bfe23ee3aaceae0ec8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Nov 2021 15:46:50 +0100 Subject: [PATCH 1159/1765] LinuxNetworkFunctions: fix ping parameter order Even though at the moment 1 is passed for both parameters, fix the order of the parameters so it still works properly when changing PingTimeout. At the same time switch from timeout to deadline semantics. --- plugins/platform/linux/LinuxNetworkFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxNetworkFunctions.cpp b/plugins/platform/linux/LinuxNetworkFunctions.cpp index f6db36471..50bad23ea 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.cpp +++ b/plugins/platform/linux/LinuxNetworkFunctions.cpp @@ -32,7 +32,7 @@ bool LinuxNetworkFunctions::ping( const QString& hostAddress ) { QProcess pingProcess; - pingProcess.start( QStringLiteral("ping"), { QStringLiteral("-W"), QStringLiteral("1"), QStringLiteral("-c"), QString::number( PingTimeout / 1000 ), hostAddress } ); + pingProcess.start( QStringLiteral("ping"), { QStringLiteral("-c"), QStringLiteral("1"), QStringLiteral("-w"), QString::number( PingTimeout / 1000 ), hostAddress } ); pingProcess.waitForFinished( PingProcessTimeout ); return pingProcess.exitCode() == 0; From 7e1b3db1f765e3135f3ac7ad748758e9158f31da Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Nov 2021 19:40:25 +0100 Subject: [PATCH 1160/1765] Core: MessageContext: add default parameter This allows using MessageContext in containers. --- core/src/MessageContext.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/MessageContext.h b/core/src/MessageContext.h index 17ac0daa7..5eb16cebe 100644 --- a/core/src/MessageContext.h +++ b/core/src/MessageContext.h @@ -35,7 +35,7 @@ class VEYON_CORE_EXPORT MessageContext public: using IODevice = QPointer; - explicit MessageContext( QIODevice* ioDevice ) : + explicit MessageContext( QIODevice* ioDevice = nullptr ) : m_ioDevice( ioDevice ) { } From f262da6024f956aa85a464e34615cfd3c1f99b97 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Nov 2021 19:41:35 +0100 Subject: [PATCH 1161/1765] VeyonMasterInterface: add filteredComputerControlInterfaces() --- core/src/VeyonMasterInterface.h | 1 + master/src/VeyonMaster.cpp | 2 +- master/src/VeyonMaster.h | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/VeyonMasterInterface.h b/core/src/VeyonMasterInterface.h index 8815dcf23..1c6031abd 100644 --- a/core/src/VeyonMasterInterface.h +++ b/core/src/VeyonMasterInterface.h @@ -54,5 +54,6 @@ class VEYON_CORE_EXPORT VeyonMasterInterface : public QObject virtual ComputerControlInterface& localSessionControlInterface() = 0; virtual ComputerControlInterfaceList selectedComputerControlInterfaces() const = 0; + virtual ComputerControlInterfaceList filteredComputerControlInterfaces() const = 0; }; diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 37ddea976..adfcc148e 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -189,7 +189,7 @@ ComputerControlInterfaceList VeyonMaster::selectedComputerControlInterfaces() co -ComputerControlInterfaceList VeyonMaster::filteredComputerControlInterfaces() +ComputerControlInterfaceList VeyonMaster::filteredComputerControlInterfaces() const { const auto rowCount = m_computerMonitoringModel->rowCount(); diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 0532bd7ee..0bb25cab2 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -127,7 +127,7 @@ class VeyonMaster : public VeyonMasterInterface ComputerControlInterfaceList selectedComputerControlInterfaces() const override; - ComputerControlInterfaceList filteredComputerControlInterfaces(); + ComputerControlInterfaceList filteredComputerControlInterfaces() const override; public Q_SLOTS: void runFeature( const Feature& feature ); From 199e620d4b9baf4444e80e99b05bd00698681428 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Nov 2021 19:48:20 +0100 Subject: [PATCH 1162/1765] VeyonMasterInterface: add allComputerControlInterfaces() --- core/src/VeyonMasterInterface.h | 1 + master/src/VeyonMaster.cpp | 7 +++++++ master/src/VeyonMaster.h | 2 ++ 3 files changed, 10 insertions(+) diff --git a/core/src/VeyonMasterInterface.h b/core/src/VeyonMasterInterface.h index 1c6031abd..d9caa6fb9 100644 --- a/core/src/VeyonMasterInterface.h +++ b/core/src/VeyonMasterInterface.h @@ -53,6 +53,7 @@ class VEYON_CORE_EXPORT VeyonMasterInterface : public QObject virtual ComputerControlInterface& localSessionControlInterface() = 0; + virtual const ComputerControlInterfaceList& allComputerControlInterfaces() const = 0; virtual ComputerControlInterfaceList selectedComputerControlInterfaces() const = 0; virtual ComputerControlInterfaceList filteredComputerControlInterfaces() const = 0; diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index adfcc148e..ae61f231f 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -171,6 +171,13 @@ void VeyonMaster::reloadSubFeatures() +const ComputerControlInterfaceList& VeyonMaster::allComputerControlInterfaces() const +{ + return m_computerControlListModel->computerControlInterfaces(); +} + + + ComputerControlInterfaceList VeyonMaster::selectedComputerControlInterfaces() const { if( m_mainWindow ) diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 0bb25cab2..947b3f056 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -125,6 +125,8 @@ class VeyonMaster : public VeyonMasterInterface return m_localSessionControlInterface; } + const ComputerControlInterfaceList& allComputerControlInterfaces() const override; + ComputerControlInterfaceList selectedComputerControlInterfaces() const override; ComputerControlInterfaceList filteredComputerControlInterfaces() const override; From 66bc061b07bba618d80b8c0ced56919bde2af656 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 5 Nov 2021 19:51:02 +0100 Subject: [PATCH 1163/1765] VeyonMaster: stop all features when shutting down --- master/src/ComputerControlListModel.cpp | 2 +- master/src/VeyonMaster.cpp | 21 +++++++++------------ master/src/VeyonMaster.h | 4 ++-- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 1553cbfda..4ecc75a4a 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -404,7 +404,7 @@ void ComputerControlListModel::startComputerControlInterface( ComputerControlInt void ComputerControlListModel::stopComputerControlInterface( const ComputerControlInterface::Pointer& controlInterface ) { - m_master->stopAllModeFeatures( { controlInterface } ); + m_master->stopAllFeatures( { controlInterface } ); controlInterface->disconnect( &m_master->computerManager() ); diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index ae61f231f..ea79a505a 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -125,20 +125,17 @@ FeatureList VeyonMaster::subFeatures( Feature::Uid parentFeatureUid ) const -FeatureList VeyonMaster::modeFeatures() const +FeatureList VeyonMaster::allFeatures() const { FeatureList featureList; for( const auto& feature : qAsConst( features() ) ) { - if( feature.testFlag( Feature::Flag::Mode ) ) + featureList.append( feature ); + const auto modeSubFeatures = subFeatures( feature.uid() ); + for( const auto& subFeature : modeSubFeatures ) { - featureList.append( feature ); - const auto modeSubFeatures = subFeatures( feature.uid() ); - for( const auto& subFeature : modeSubFeatures ) - { - featureList.append( subFeature ); - } + featureList.append( subFeature ); } } @@ -221,7 +218,7 @@ void VeyonMaster::runFeature( const Feature& feature ) if( feature.testFlag( Feature::Flag::Mode ) ) { - stopAllModeFeatures( computerControlInterfaces ); + stopAllFeatures( computerControlInterfaces ); if( m_currentMode == feature.uid() || subFeatures( feature.uid() ).contains( m_featureManager->feature( m_currentMode ) ) ) @@ -263,9 +260,9 @@ void VeyonMaster::enforceDesignatedMode( const QModelIndex& index ) -void VeyonMaster::stopAllModeFeatures( const ComputerControlInterfaceList& computerControlInterfaces ) +void VeyonMaster::stopAllFeatures( const ComputerControlInterfaceList& computerControlInterfaces ) { - const auto features = modeFeatures(); + const auto features = allFeatures(); for( const auto& feature : features ) { @@ -327,7 +324,7 @@ void VeyonMaster::setAppContainer( QQuickItem* appContainer ) void VeyonMaster::shutdown() { - stopAllModeFeatures( m_computerControlListModel->computerControlInterfaces() ); + stopAllFeatures( m_computerControlListModel->computerControlInterfaces() ); const auto allMessageQueuesEmpty = [&]() { for( const auto& computerControlInterface : m_computerControlListModel->computerControlInterfaces() ) diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 947b3f056..cab49366e 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -98,7 +98,7 @@ class VeyonMaster : public VeyonMasterInterface FeatureList subFeatures( Feature::Uid parentFeatureUid ) const; - FeatureList modeFeatures() const; + FeatureList allFeatures() const; const Feature::Uid& currentMode() const { @@ -134,7 +134,7 @@ class VeyonMaster : public VeyonMasterInterface public Q_SLOTS: void runFeature( const Feature& feature ); void enforceDesignatedMode( const QModelIndex& index ); - void stopAllModeFeatures( const ComputerControlInterfaceList& computerControlInterfaces ); + void stopAllFeatures( const ComputerControlInterfaceList& computerControlInterfaces ); Q_SIGNALS: void appWindowChanged(); From c05cb192bee3b85afb1b026b5ad2c38699442a85 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:50:07 +0100 Subject: [PATCH 1164/1765] WindowsCoreFunctions: refactor screen saver settings management Use std::array and private static constexpr members. (cherry picked from commit fb99f434a195fc83b50fea181152b147f877cf1f) --- .../platform/windows/WindowsCoreFunctions.cpp | 26 ++++--------------- .../platform/windows/WindowsCoreFunctions.h | 14 ++++++++++ 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 2cffa0f45..fb616bff5 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -39,22 +39,6 @@ #define SHUTDOWN_FLAGS (SHUTDOWN_FORCE_OTHERS | SHUTDOWN_FORCE_SELF) #define SHUTDOWN_REASON (SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_FLAG_PLANNED) -static const int screenSaverSettingsCount = 3; -static const UINT screenSaverSettingsGetList[screenSaverSettingsCount] = -{ - SPI_GETLOWPOWERTIMEOUT, - SPI_GETPOWEROFFTIMEOUT, - SPI_GETSCREENSAVETIMEOUT -}; - -static const UINT screenSaverSettingsSetList[screenSaverSettingsCount] = -{ - SPI_SETLOWPOWERTIMEOUT, - SPI_SETPOWEROFFTIMEOUT, - SPI_SETSCREENSAVETIMEOUT -}; - -static UINT screenSaverSettings[screenSaverSettingsCount]; static bool configureSoftwareSAS( bool enabled ) { @@ -205,10 +189,10 @@ void WindowsCoreFunctions::raiseWindow( QWidget* widget, bool stayOnTop ) void WindowsCoreFunctions::disableScreenSaver() { - for( int i = 0; i < screenSaverSettingsCount; ++i ) + for( size_t i = 0; i < ScreenSaverSettingsCount; ++i ) { - SystemParametersInfo( screenSaverSettingsGetList[i], 0, &screenSaverSettings[i], 0 ); - SystemParametersInfo( screenSaverSettingsSetList[i], 0, nullptr, 0 ); + SystemParametersInfo( ScreenSaverSettingsGetList.at(i), 0, &m_screenSaverSettings.at(i), 0 ); + SystemParametersInfo( ScreenSaverSettingsSetList.at(i), 0, nullptr, 0 ); } SetThreadExecutionState( ES_CONTINUOUS | ES_DISPLAY_REQUIRED ); @@ -218,9 +202,9 @@ void WindowsCoreFunctions::disableScreenSaver() void WindowsCoreFunctions::restoreScreenSaverSettings() { - for( int i = 0; i < screenSaverSettingsCount; ++i ) + for( size_t i = 0; i < ScreenSaverSettingsCount; ++i ) { - SystemParametersInfo( screenSaverSettingsSetList[i], screenSaverSettings[i], nullptr, 0 ); + SystemParametersInfo( ScreenSaverSettingsSetList.at(i), m_screenSaverSettings.at(i), nullptr, 0 ); } SetThreadExecutionState( ES_CONTINUOUS ); diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index 003a2f4dc..15a374171 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -83,6 +83,19 @@ class WindowsCoreFunctions : public PlatformCoreFunctions private: static constexpr int ConsoleOutputBufferSize = 256; static constexpr DWORD DefaultProcessTerminationTimeout = 5000; + static constexpr size_t ScreenSaverSettingsCount = 3; + + const std::array ScreenSaverSettingsGetList = { + SPI_GETLOWPOWERTIMEOUT, + SPI_GETPOWEROFFTIMEOUT, + SPI_GETSCREENSAVETIMEOUT + }; + + const std::array ScreenSaverSettingsSetList = { + SPI_SETLOWPOWERTIMEOUT, + SPI_SETPOWEROFFTIMEOUT, + SPI_SETSCREENSAVETIMEOUT + }; static wchar_t* appendToEnvironmentBlock( const wchar_t* env, const QStringList& strings ); static void setTaskbarState( bool enabled ); @@ -90,5 +103,6 @@ class WindowsCoreFunctions : public PlatformCoreFunctions static void setDesktopState( bool enabled ); CXEventLog* m_eventLog; + std::array m_screenSaverSettings{}; }; From c2428a1b4dba538ceeecdcf616531483e60825f5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:56:38 +0100 Subject: [PATCH 1165/1765] WindowsCoreFunctions: limit extra env to 1 MB (cherry picked from commit 2a3243a62d70b31033ce9006febcbe65c2b6a924) --- .../platform/windows/WindowsCoreFunctions.cpp | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index fb616bff5..0101a0b89 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -530,28 +530,36 @@ bool WindowsCoreFunctions::terminateProcess( ProcessId processId, DWORD timeout wchar_t* WindowsCoreFunctions::appendToEnvironmentBlock( const wchar_t* env, const QStringList& strings ) { - static constexpr auto ENV_POS_MAX = 1024*1024; + static constexpr auto MaximumEnvironmentSize = 1024*1024; + static constexpr auto MaximumExtraStringsLength = 1024*1024; size_t envPos = 0; - while( envPos < ENV_POS_MAX-1 && !(env[envPos] == 0 && env[envPos+1] == 0) ) + while( envPos < MaximumEnvironmentSize-1 && !(env[envPos] == 0 && env[envPos+1] == 0) ) { ++envPos; } ++envPos; - if( envPos >= ENV_POS_MAX-1 ) + if( envPos >= MaximumEnvironmentSize-1 ) { return nullptr; } - auto newEnv = new wchar_t[envPos+static_cast( strings.join( QLatin1Char(' ') ).size())+2]; - memcpy( newEnv, env, envPos*2 ); + const auto stringsTotalLength = size_t( strings.join( QLatin1Char(' ') ).size() ); + if( stringsTotalLength >= MaximumExtraStringsLength ) + { + return nullptr; + } + + auto newEnv = new wchar_t[envPos + stringsTotalLength + 2]; + memcpy( newEnv, env, envPos*2 ); // Flawfinder: ignore for( const auto& string : strings ) { - memcpy( &newEnv[envPos], toConstWCharArray( string ), static_cast( string.size()*2 ) ); - envPos += static_cast( string.size() ); + const auto stringLength = size_t(string.size()); + memcpy( &newEnv[envPos], toConstWCharArray( string ), stringLength * sizeof(wchar_t) ); // Flawfinder: ignore + envPos += stringLength; newEnv[envPos] = 0; ++envPos; } From 1d4f4204ac0287b1a612df0ae7911c845a397d92 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:52:06 +0100 Subject: [PATCH 1166/1765] WindowsCoreFunctions: refactor shutdown flags (cherry picked from commit 48d2037d70c4f1179bb1185800df1a22abfe750e) --- plugins/platform/windows/WindowsCoreFunctions.cpp | 9 +++------ plugins/platform/windows/WindowsCoreFunctions.h | 3 +++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 0101a0b89..97ddba6f7 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -36,9 +36,6 @@ #include "XEventLog.h" -#define SHUTDOWN_FLAGS (SHUTDOWN_FORCE_OTHERS | SHUTDOWN_FORCE_SELF) -#define SHUTDOWN_REASON (SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_FLAG_PLANNED) - static bool configureSoftwareSAS( bool enabled ) { @@ -136,7 +133,7 @@ void WindowsCoreFunctions::writeToNativeLoggingSystem( const QString& message, L void WindowsCoreFunctions::reboot() { enablePrivilege( SE_SHUTDOWN_NAME, true ); - InitiateShutdown( nullptr, nullptr, 0, SHUTDOWN_FLAGS | SHUTDOWN_RESTART, SHUTDOWN_REASON ); + InitiateShutdown( nullptr, nullptr, 0, ShutdownFlags | SHUTDOWN_RESTART, ShutdownReason ); } @@ -145,8 +142,8 @@ void WindowsCoreFunctions::powerDown( bool installUpdates ) { enablePrivilege( SE_SHUTDOWN_NAME, true ); InitiateShutdown( nullptr, nullptr, 0, - SHUTDOWN_FLAGS | SHUTDOWN_POWEROFF | ( installUpdates ? SHUTDOWN_INSTALL_UPDATES : 0 ), - SHUTDOWN_REASON ); + ShutdownFlags | SHUTDOWN_POWEROFF | ( installUpdates ? SHUTDOWN_INSTALL_UPDATES : 0 ), + ShutdownReason ); } diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index 15a374171..af46be59a 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -85,6 +85,9 @@ class WindowsCoreFunctions : public PlatformCoreFunctions static constexpr DWORD DefaultProcessTerminationTimeout = 5000; static constexpr size_t ScreenSaverSettingsCount = 3; + static constexpr auto ShutdownFlags = SHUTDOWN_FORCE_OTHERS | SHUTDOWN_FORCE_SELF; + static constexpr auto ShutdownReason = SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_FLAG_PLANNED; + const std::array ScreenSaverSettingsGetList = { SPI_GETLOWPOWERTIMEOUT, SPI_GETPOWEROFFTIMEOUT, From 358056756181f622338643040ee5af4f74b4683e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:55:12 +0100 Subject: [PATCH 1167/1765] WindowsCoreFunctions: various code modernizations (cherry picked from commit e99b352af6ae6cef4460d8c63c3caf46e29a1161) --- plugins/platform/windows/WindowsCoreFunctions.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 97ddba6f7..53eac7418 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -39,7 +39,8 @@ static bool configureSoftwareSAS( bool enabled ) { - HKEY hkLocal, hkLocalKey; + HKEY hkLocal; + HKEY hkLocalKey; DWORD dw; if( RegCreateKeyEx( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies", @@ -172,11 +173,11 @@ void WindowsCoreFunctions::raiseWindow( QWidget* widget, bool stayOnTop ) widget->activateWindow(); widget->raise(); - QWindow* window = windowForWidget( widget ); + auto window = windowForWidget( widget ); if( window ) { - QPlatformNativeInterface* interfacep = QGuiApplication::platformNativeInterface(); - auto windowHandle = static_cast( interfacep->nativeResourceForWindow( QByteArrayLiteral( "handle" ), window ) ); + auto windowHandle = HWND( QGuiApplication::platformNativeInterface()-> + nativeResourceForWindow( QByteArrayLiteral( "handle" ), window ) ); SetWindowPos( windowHandle, stayOnTop ? HWND_TOPMOST : HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE ); } @@ -284,7 +285,7 @@ bool WindowsCoreFunctions::runProgramAsAdmin( const QString& program, const QStr { const auto parametersJoined = parameters.join( QLatin1Char(' ') ); - SHELLEXECUTEINFO sei{0}; + SHELLEXECUTEINFO sei{}; sei.cbSize = sizeof(sei); sei.lpVerb = L"runas"; sei.lpFile = toConstWCharArray( program ); @@ -358,7 +359,7 @@ bool WindowsCoreFunctions::enablePrivilege( LPCWSTR privilegeName, bool enable ) tokenPrivileges.Privileges[0].Luid = luid; tokenPrivileges.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0; - bool ret = AdjustTokenPrivileges( token, false, &tokenPrivileges, 0, nullptr, nullptr ); + const auto ret = AdjustTokenPrivileges( token, false, &tokenPrivileges, 0, nullptr, nullptr ); CloseHandle( token ); @@ -373,7 +374,7 @@ QSharedPointer WindowsCoreFunctions::toWCharArray( const QString& qstri qstring.toWCharArray( wcharArray ); wcharArray[qstring.size()] = 0; - return { wcharArray, []( wchar_t* buffer ) { delete[] buffer; } }; + return { wcharArray, []( const wchar_t* buffer ) { delete[] buffer; } }; } From acd979dccf49784eb8996d119bef640010467a9c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:55:28 +0100 Subject: [PATCH 1168/1765] WindowsCoreFunctions: use std::array for desktop name (cherry picked from commit 1eac6c582cbaded996b032bb1a8aae5626850fe7) --- plugins/platform/windows/WindowsCoreFunctions.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 53eac7418..157e90da3 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -238,12 +238,10 @@ QString WindowsCoreFunctions::activeDesktopName() auto desktopHandle = GetThreadDesktop( GetCurrentThreadId() ); - wchar_t inputDesktopName[256]; // Flawfinder: ignore - inputDesktopName[0] = 0; - if( GetUserObjectInformation( desktopHandle, UOI_NAME, inputDesktopName, - sizeof( inputDesktopName ) / sizeof( wchar_t ), nullptr ) ) + std::array inputDesktopName{}; + if( GetUserObjectInformation( desktopHandle, UOI_NAME, inputDesktopName.data(), inputDesktopName.size(), nullptr ) ) { - desktopName = QString( QStringLiteral( "winsta0\\%1" ) ).arg( QString::fromWCharArray( inputDesktopName ) ); + desktopName = QString( QStringLiteral( "winsta0\\%1" ) ).arg( QString::fromWCharArray( inputDesktopName.data() ) ); } return desktopName; From ac1833233002ba35769f83d86bf49247f205c223 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:54:02 +0100 Subject: [PATCH 1169/1765] WindowsCoreFunctions: modernize instance management (cherry picked from commit 3a0ef5c79f5531dc7e623b7bcd720e166d1c6ea5) --- plugins/platform/windows/WindowsCoreFunctions.cpp | 9 +-------- plugins/platform/windows/WindowsCoreFunctions.h | 4 ++-- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 157e90da3..62d524eea 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -69,13 +69,6 @@ static bool configureSoftwareSAS( bool enabled ) -WindowsCoreFunctions::WindowsCoreFunctions() : - m_eventLog( nullptr ) -{ -} - - - WindowsCoreFunctions::~WindowsCoreFunctions() { delete m_eventLog; @@ -123,7 +116,7 @@ void WindowsCoreFunctions::writeToNativeLoggingSystem( const QString& message, L break; } - if( messageType > 0 ) + if( messageType > 0 && m_eventLog ) { m_eventLog->Write( static_cast( messageType ), toConstWCharArray( message ) ); } diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index af46be59a..0fc73b54d 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -37,7 +37,7 @@ class WindowsCoreFunctions : public PlatformCoreFunctions public: using ProcessId = DWORD; - WindowsCoreFunctions(); + WindowsCoreFunctions() = default; ~WindowsCoreFunctions() override; bool applyConfiguration() override; @@ -105,7 +105,7 @@ class WindowsCoreFunctions : public PlatformCoreFunctions static void setStartMenuState( bool enabled ); static void setDesktopState( bool enabled ); - CXEventLog* m_eventLog; + CXEventLog* m_eventLog{nullptr}; std::array m_screenSaverSettings{}; }; From c0f4add81720967601b48f0c084c67f876498ba5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:59:08 +0100 Subject: [PATCH 1170/1765] Windows: use std::array instead of C arrays (cherry picked from commit 15d71a89b13bf2c40dcbb6babf6c5ad7cca54c33) --- .../windows/WindowsFilesystemFunctions.cpp | 23 +++++++++---------- .../platform/windows/WindowsServiceCore.cpp | 6 ++--- .../platform/windows/WindowsUserFunctions.cpp | 8 +++---- .../platform/windows/WtsSessionManager.cpp | 13 +++++------ 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.cpp b/plugins/platform/windows/WindowsFilesystemFunctions.cpp index ce6754541..f55a1f367 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.cpp +++ b/plugins/platform/windows/WindowsFilesystemFunctions.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "WindowsCoreFunctions.h" #include "WindowsFilesystemFunctions.h" @@ -119,15 +120,15 @@ QString WindowsFilesystemFunctions::fileOwnerGroup( const QString& filePath ) bool WindowsFilesystemFunctions::setFileOwnerGroup( const QString& filePath, const QString& ownerGroup ) { DWORD sidLen = SECURITY_MAX_SID_SIZE; - char ownerGroupSID[SECURITY_MAX_SID_SIZE]; // Flawfinder: ignore - wchar_t domain[PATH_MAX]; // Flawfinder: ignore - domain[0] = 0; - DWORD domainLen = PATH_MAX; + std::array ownerGroupSID{}; + std::array domain{}; + + DWORD domainLen = domain.size(); SID_NAME_USE sidNameUse; if( LookupAccountName( nullptr, WindowsCoreFunctions::toConstWCharArray( ownerGroup ), - ownerGroupSID, &sidLen, - domain, &domainLen, &sidNameUse ) == false ) + ownerGroupSID.data(), &sidLen, + domain.data(), &domainLen, &sidNameUse ) == false ) { vCritical() << "Could not look up SID structure:" << GetLastError(); return false; @@ -139,7 +140,7 @@ bool WindowsFilesystemFunctions::setFileOwnerGroup( const QString& filePath, con const auto filePathWide = WindowsCoreFunctions::toWCharArray( filePath ); const auto result = SetNamedSecurityInfo( filePathWide.data(), SE_FILE_OBJECT, - OWNER_SECURITY_INFORMATION, ownerGroupSID, nullptr, nullptr, nullptr ); + OWNER_SECURITY_INFORMATION, ownerGroupSID.data(), nullptr, nullptr, nullptr ); if( result != ERROR_SUCCESS ) { @@ -178,10 +179,8 @@ bool WindowsFilesystemFunctions::setFileOwnerGroupPermissions( const QString& fi return false; } - const int NUM_ACES = 2; - EXPLICIT_ACCESS ea[NUM_ACES]; - - ZeroMemory( &ea, NUM_ACES * sizeof(EXPLICIT_ACCESS) ); + static constexpr auto ExplicitAccessCount = 2; + std::array ea{}; // set read access for owner ea[0].grfAccessPermissions = 0; @@ -212,7 +211,7 @@ bool WindowsFilesystemFunctions::setFileOwnerGroupPermissions( const QString& fi ea[1].Trustee.ptstrName = (LPTSTR) adminSID; PACL acl = nullptr; - if( SetEntriesInAcl( NUM_ACES, ea, nullptr, &acl ) != ERROR_SUCCESS ) + if( SetEntriesInAcl( ExplicitAccessCount, ea.data(), nullptr, &acl ) != ERROR_SUCCESS ) { vCritical() << "SetEntriesInAcl() failed"; FreeSid( adminSID ); diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index 8337c0a20..44667ea97 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -149,14 +149,14 @@ WindowsServiceCore *WindowsServiceCore::instance() bool WindowsServiceCore::runAsService() { - static const SERVICE_TABLE_ENTRY dispatchTable[] = { + static const std::array dispatchTable = { { { m_name.data(), serviceMainStatic }, { nullptr, nullptr } - } ; + } } ; WindowsInputDeviceFunctions::checkInterceptionInstallation(); - if( !StartServiceCtrlDispatcher( dispatchTable ) ) + if( !StartServiceCtrlDispatcher( dispatchTable.data() ) ) { vCritical() << "StartServiceCtrlDispatcher failed."; return false; diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 57caa01b8..6e9fcf15f 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -158,11 +158,11 @@ QString WindowsUserFunctions::currentUser() // check whether we just got the name of the local computer if( !domainName.isEmpty() ) { - wchar_t computerName[MAX_PATH]; // Flawfinder: ignore - DWORD size = MAX_PATH; - GetComputerName( computerName, &size ); + std::array computerName{}; // Flawfinder: ignore + DWORD size = MAX_COMPUTERNAME_LENGTH; + GetComputerName( computerName.data(), &size ); - if( domainName == QString::fromWCharArray( computerName ) ) + if( domainName == QString::fromWCharArray( computerName.data() ) ) { // reset domain name as we do not need to store local computer name domainName.clear(); diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 4c179b2e4..9d1190b42 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -190,17 +190,16 @@ WtsSessionManager::ProcessId WtsSessionManager::findWinlogonProcessId( SessionId WtsSessionManager::ProcessId WtsSessionManager::findUserProcessId( const QString& userName ) { DWORD sidLen = SECURITY_MAX_SID_SIZE; // Flawfinder: ignore - char userSID[SECURITY_MAX_SID_SIZE]; // Flawfinder: ignore - wchar_t domainName[MAX_PATH]; // Flawfinder: ignore - domainName[0] = 0; - DWORD domainLen = MAX_PATH; + std::array userSID{}; + std::array domainName{}; + DWORD domainLen = domainName.size(); SID_NAME_USE sidNameUse; if( LookupAccountName( nullptr, // system name WindowsCoreFunctions::toConstWCharArray( userName ), - userSID, + userSID.data(), &sidLen, - domainName, + domainName.data(), &domainLen, &sidNameUse ) == false ) { @@ -223,7 +222,7 @@ WtsSessionManager::ProcessId WtsSessionManager::findUserProcessId( const QString { if( processInfo[proc].ProcessId > 0 && processInfo[proc].pUserSid != nullptr && - EqualSid( processInfo[proc].pUserSid, userSID ) ) + EqualSid( processInfo[proc].pUserSid, userSID.data() ) ) { pid = processInfo[proc].ProcessId; break; From 2fb662cfcdd48dc2174bbee55fef252719dd23ab Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 15:04:41 +0100 Subject: [PATCH 1171/1765] WindowsServiceCore: use default initialization (cherry picked from commit 17220da262769d8f87e8e52659a557876e4a1b2d) --- plugins/platform/windows/WindowsServiceCore.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index 44667ea97..3bab5e3be 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -41,10 +41,7 @@ class VeyonServerProcess { public: - VeyonServerProcess() : - m_subProcessHandle( nullptr ) - { - } + VeyonServerProcess() = default; ~VeyonServerProcess() { @@ -107,7 +104,7 @@ class VeyonServerProcess static constexpr auto ServerWaitTime = 5000; static constexpr auto ServerPostStopWaitTime = 1000; - HANDLE m_subProcessHandle; + HANDLE m_subProcessHandle{nullptr}; } ; From a23184f95565f9fb4baee369c9717f3a31ae41ea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 15:01:53 +0100 Subject: [PATCH 1172/1765] WindowsFilesystemFunctions: modernize code (cherry picked from commit eac631f27d5e38a23a0766c14408ad8f047d294d) --- plugins/platform/windows/WindowsFilesystemFunctions.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.cpp b/plugins/platform/windows/WindowsFilesystemFunctions.cpp index f55a1f367..1d1d6c27d 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.cpp +++ b/plugins/platform/windows/WindowsFilesystemFunctions.cpp @@ -96,8 +96,8 @@ QString WindowsFilesystemFunctions::fileOwnerGroup( const QString& filePath ) return {}; } - wchar_t* name = new wchar_t[nameSize]; - wchar_t* domain = new wchar_t[domainSize]; + auto name = new wchar_t[nameSize]; + auto domain = new wchar_t[domainSize]; if( LookupAccountSid( nullptr, ownerSID, name, &nameSize, domain, &domainSize, &sidNameUse ) == false ) { @@ -200,7 +200,7 @@ bool WindowsFilesystemFunctions::setFileOwnerGroupPermissions( const QString& fi ea[0].grfInheritance = NO_INHERITANCE; ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID; ea[0].Trustee.TrusteeType = TRUSTEE_IS_GROUP; - ea[0].Trustee.ptstrName = (LPTSTR) ownerSID; + ea[0].Trustee.ptstrName = LPTSTR(ownerSID); // set full control for Administrators ea[1].grfAccessPermissions = GENERIC_ALL; @@ -208,7 +208,7 @@ bool WindowsFilesystemFunctions::setFileOwnerGroupPermissions( const QString& fi ea[1].grfInheritance = NO_INHERITANCE; ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID; ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP; - ea[1].Trustee.ptstrName = (LPTSTR) adminSID; + ea[1].Trustee.ptstrName = LPTSTR(adminSID); PACL acl = nullptr; if( SetEntriesInAcl( ExplicitAccessCount, ea.data(), nullptr, &acl ) != ERROR_SUCCESS ) From 3991d54c9978d4dc077ed7d73300d85d8e011587 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 15:01:34 +0100 Subject: [PATCH 1173/1765] WindowsInputDeviceFunctions: use default initializations (cherry picked from commit a05e81aff790337cb2ae0a723038c70e0a0e47d2) --- .../windows/WindowsInputDeviceFunctions.cpp | 11 ----------- .../platform/windows/WindowsInputDeviceFunctions.h | 14 +++++++------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp index 53f3aefbb..b3056dc77 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp @@ -46,17 +46,6 @@ static int interception_is_any( InterceptionDevice device ) -WindowsInputDeviceFunctions::WindowsInputDeviceFunctions() : - m_inputDevicesDisabled( false ), - m_interceptionContext( nullptr ), - m_hidServiceName( QStringLiteral("hidserv") ), - m_hidServiceStatusInitialized( false ), - m_hidServiceActivated( false ) -{ -} - - - WindowsInputDeviceFunctions::~WindowsInputDeviceFunctions() { if( m_inputDevicesDisabled ) diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.h b/plugins/platform/windows/WindowsInputDeviceFunctions.h index 651534504..51c21868e 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.h +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.h @@ -33,8 +33,8 @@ class WindowsInputDeviceFunctions : public PlatformInputDeviceFunctions { public: - WindowsInputDeviceFunctions(); - ~WindowsInputDeviceFunctions() override; + WindowsInputDeviceFunctions() = default; + virtual ~WindowsInputDeviceFunctions(); void enableInputDevices() override; void disableInputDevices() override; @@ -60,10 +60,10 @@ class WindowsInputDeviceFunctions : public PlatformInputDeviceFunctions static bool uninstallInterception(); static int interceptionInstaller( const QString& argument ); - bool m_inputDevicesDisabled; - InterceptionContext m_interceptionContext; - QString m_hidServiceName; - bool m_hidServiceStatusInitialized; - bool m_hidServiceActivated; + bool m_inputDevicesDisabled{false}; + InterceptionContext m_interceptionContext{nullptr}; + QString m_hidServiceName{QStringLiteral("hidserv")}; + bool m_hidServiceStatusInitialized{false}; + bool m_hidServiceActivated{false}; }; From 6aeb09998ca6c49a87192d07cdabf9a6dd09d5b8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 9 Nov 2021 13:28:51 +0100 Subject: [PATCH 1174/1765] Revert "PlatformInputDeviceFunctions: add synthesizeKeyEvent()" This reverts commit f80c90811d230ed0326980b7ad75a68030e5c1c7. --- core/src/PlatformInputDeviceFunctions.h | 4 --- .../linux/LinuxInputDeviceFunctions.cpp | 27 ------------------- .../linux/LinuxInputDeviceFunctions.h | 7 ----- .../windows/WindowsInputDeviceFunctions.cpp | 9 +------ .../windows/WindowsInputDeviceFunctions.h | 2 -- 5 files changed, 1 insertion(+), 48 deletions(-) diff --git a/core/src/PlatformInputDeviceFunctions.h b/core/src/PlatformInputDeviceFunctions.h index 9b33f2ee4..628c31d75 100644 --- a/core/src/PlatformInputDeviceFunctions.h +++ b/core/src/PlatformInputDeviceFunctions.h @@ -33,8 +33,6 @@ class KeyboardShortcutTrapper; class PlatformInputDeviceFunctions { public: - using KeySym = uint32_t; - virtual ~PlatformInputDeviceFunctions() = default; virtual void enableInputDevices() = 0; @@ -42,6 +40,4 @@ class PlatformInputDeviceFunctions virtual KeyboardShortcutTrapper* createKeyboardShortcutTrapper( QObject* parent ) = 0; - virtual void synthesizeKeyEvent( KeySym keySym, bool down ) = 0; - }; diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp index 41fc680df..dca935e4d 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp @@ -24,19 +24,11 @@ #include "PlatformServiceFunctions.h" #include "LinuxInputDeviceFunctions.h" -#include "LinuxKeyboardInput.h" #include "LinuxKeyboardShortcutTrapper.h" #include -LinuxInputDeviceFunctions::~LinuxInputDeviceFunctions() -{ - delete m_keyboardInput; -} - - - void LinuxInputDeviceFunctions::enableInputDevices() { if( m_inputDevicesDisabled ) @@ -68,25 +60,6 @@ KeyboardShortcutTrapper* LinuxInputDeviceFunctions::createKeyboardShortcutTrappe -void LinuxInputDeviceFunctions::synthesizeKeyEvent( LinuxInputDeviceFunctions::KeySym keySym, bool down ) -{ - if( m_keyboardInput == nullptr ) - { - m_keyboardInput = new LinuxKeyboardInput; - } - - if( down ) - { - m_keyboardInput->pressKey( keySym ); - } - else - { - m_keyboardInput->releaseKey( keySym ); - } -} - - - void LinuxInputDeviceFunctions::setEmptyKeyMapTable() { if( m_origKeyTable ) diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.h b/plugins/platform/linux/LinuxInputDeviceFunctions.h index 32a32197c..bf5bdc2b4 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.h +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.h @@ -26,23 +26,18 @@ #include "PlatformInputDeviceFunctions.h" -class LinuxKeyboardInput; - // clazy:excludeall=copyable-polymorphic class LinuxInputDeviceFunctions : public PlatformInputDeviceFunctions { public: LinuxInputDeviceFunctions() = default; - ~LinuxInputDeviceFunctions() override; void enableInputDevices() override; void disableInputDevices() override; KeyboardShortcutTrapper* createKeyboardShortcutTrapper( QObject* parent ) override; - void synthesizeKeyEvent( KeySym keySym, bool down ) override; - private: void setEmptyKeyMapTable(); void restoreKeyMapTable(); @@ -54,6 +49,4 @@ class LinuxInputDeviceFunctions : public PlatformInputDeviceFunctions int m_keyCodeCount{0}; int m_keySymsPerKeyCode{0}; - LinuxKeyboardInput* m_keyboardInput{nullptr}; - }; diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp index b3056dc77..a3e7cb4e1 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp @@ -22,7 +22,7 @@ * */ -#include "vnckeymap.h" +#include #include #include @@ -89,13 +89,6 @@ KeyboardShortcutTrapper* WindowsInputDeviceFunctions::createKeyboardShortcutTrap -void WindowsInputDeviceFunctions::synthesizeKeyEvent( KeySym key, bool down ) -{ - vncKeymap::keyEvent( key, down, false, false ); -} - - - void WindowsInputDeviceFunctions::checkInterceptionInstallation() { if( VeyonCore::config().multiSessionModeEnabled() ) diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.h b/plugins/platform/windows/WindowsInputDeviceFunctions.h index 51c21868e..7e98b1b47 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.h +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.h @@ -41,8 +41,6 @@ class WindowsInputDeviceFunctions : public PlatformInputDeviceFunctions KeyboardShortcutTrapper* createKeyboardShortcutTrapper( QObject* parent ) override; - void synthesizeKeyEvent( KeySym keySym, bool down ) override; - static void checkInterceptionInstallation(); static void stopOnScreenKeyboard(); From 37cc8d5c3795e1af3f6343dc5268cfea07db0f98 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 15:03:13 +0100 Subject: [PATCH 1175/1765] WindowsServiceControl: add misc constants (cherry picked from commit 818666d5b41cfafb9a31e0000ae70975085bf690) --- plugins/platform/windows/WindowsServiceControl.cpp | 6 +++--- plugins/platform/windows/WindowsServiceControl.h | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 559d93d79..b4287cfce 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -104,7 +104,7 @@ bool WindowsServiceControl::start() { if( status.dwCurrentState == SERVICE_START_PENDING ) { - Sleep( 1000 ); + Sleep( ServiceWaitSleepInterval ); } else { @@ -163,7 +163,7 @@ bool WindowsServiceControl::stop() { if( status.dwCurrentState == SERVICE_STOP_PENDING ) { - Sleep( 1000 ); + Sleep( ServiceWaitSleepInterval ); } else { @@ -230,7 +230,7 @@ bool WindowsServiceControl::install( const QString& filePath, const QString& dis } SC_ACTION serviceActions; - serviceActions.Delay = 10000; + serviceActions.Delay = ServiceActionDelay; serviceActions.Type = SC_ACTION_RESTART; SERVICE_FAILURE_ACTIONS serviceFailureActions; diff --git a/plugins/platform/windows/WindowsServiceControl.h b/plugins/platform/windows/WindowsServiceControl.h index c1020a447..00c199c76 100644 --- a/plugins/platform/windows/WindowsServiceControl.h +++ b/plugins/platform/windows/WindowsServiceControl.h @@ -49,6 +49,9 @@ class WindowsServiceControl : public QObject private: bool checkService() const; + static constexpr auto ServiceActionDelay = 10000; + static constexpr auto ServiceWaitSleepInterval = 1000; + const QString m_name; SC_HANDLE m_serviceManager; SC_HANDLE m_serviceHandle; From ba77587505f0ab1e00eb1b65bc641fdd83b57c6d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 15:02:10 +0100 Subject: [PATCH 1176/1765] WindowsKeyboardShortcutTrapper: use default initializations (cherry picked from commit a46db6dc557414b9912f11ef18d2fa86aa9f124b) --- plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp | 1 - plugins/platform/windows/WindowsKeyboardShortcutTrapper.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp index 4befc2581..0eaf98994 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp @@ -105,7 +105,6 @@ LRESULT CALLBACK TaskKeyHookLL( int nCode, WPARAM wp, LPARAM lp ) WindowsKeyboardShortcutTrapper::WindowsKeyboardShortcutTrapper( QObject* parent ) : KeyboardShortcutTrapper( parent ), - m_enabled( false ), m_pollTimer( this ) { connect( &m_pollTimer, &QTimer::timeout, diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h index f9c0e966c..8c3d75ea5 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h @@ -46,7 +46,7 @@ class WindowsKeyboardShortcutTrapper : public KeyboardShortcutTrapper static QMutex s_refCntMutex; static int s_refCnt; - bool m_enabled; + bool m_enabled{false}; QTimer m_pollTimer; } ; From 1e5307d74edc2f2b2a3e050971bbde510293d9ac Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 15:02:38 +0100 Subject: [PATCH 1177/1765] WindowsNetworkFunctions: add constant for FW error (cherry picked from commit b918679781b548e564fc19c1c68b557c52374c6d) --- plugins/platform/windows/WindowsNetworkFunctions.cpp | 2 +- plugins/platform/windows/WindowsNetworkFunctions.h | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/platform/windows/WindowsNetworkFunctions.cpp b/plugins/platform/windows/WindowsNetworkFunctions.cpp index dba5e80e3..4fc343879 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.cpp +++ b/plugins/platform/windows/WindowsNetworkFunctions.cpp @@ -194,7 +194,7 @@ static bool configureFirewallException( INetFwPolicy2* fwPolicy2, const wchar_t* if( hr != S_OK ) { // failed because firewall service not running / disabled? - if( hr == static_cast( 0x800706D9 ) ) + if( hr == WindowsNetworkFunctions::WindowsFirewallServiceError ) { // then assume this is intended, log a warning and // pretend everything went well diff --git a/plugins/platform/windows/WindowsNetworkFunctions.h b/plugins/platform/windows/WindowsNetworkFunctions.h index 7ee07cc93..9136ffb8a 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.h +++ b/plugins/platform/windows/WindowsNetworkFunctions.h @@ -26,7 +26,9 @@ #include "PlatformNetworkFunctions.h" -// clazy:excludeall=copyable-polymorphic +#include + +// clazy:exclude=copyable-polymorphic class WindowsNetworkFunctions : public PlatformNetworkFunctions { @@ -38,6 +40,8 @@ class WindowsNetworkFunctions : public PlatformNetworkFunctions bool configureSocketKeepalive( Socket socket, bool enabled, int idleTime, int interval, int probes ) override; + static constexpr auto WindowsFirewallServiceError = HRESULT(0x800706D9); + private: bool pingIPv4Address( const QString& hostAddress, bool* result ); bool pingIPv6Address( const QString& hostAddress, bool* result ); From 10774e8ea9c917a4e4e1b37824e0eafe7bee4289 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 15:00:46 +0100 Subject: [PATCH 1178/1765] WindowsPlatformPlugin: use default initializations (cherry picked from commit 456e5635033660accd0e0dff6a7d58e9d7b96283) --- plugins/platform/windows/WindowsPlatformPlugin.cpp | 8 +------- plugins/platform/windows/WindowsPlatformPlugin.h | 14 +++++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/plugins/platform/windows/WindowsPlatformPlugin.cpp b/plugins/platform/windows/WindowsPlatformPlugin.cpp index 17ae57c32..11ee1f534 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.cpp +++ b/plugins/platform/windows/WindowsPlatformPlugin.cpp @@ -26,13 +26,7 @@ #include "WindowsPlatformConfigurationPage.h" WindowsPlatformPlugin::WindowsPlatformPlugin( QObject* parent ) : - QObject( parent ), - m_windowsCoreFunctions(), - m_windowsFilesystemFunctions(), - m_windowsInputDeviceFunctions(), - m_windowsNetworkFunctions(), - m_windowsServiceFunctions(), - m_windowsUserFunctions() + QObject( parent ) { } diff --git a/plugins/platform/windows/WindowsPlatformPlugin.h b/plugins/platform/windows/WindowsPlatformPlugin.h index 2e6238fc3..8893e67b3 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.h +++ b/plugins/platform/windows/WindowsPlatformPlugin.h @@ -117,12 +117,12 @@ class WindowsPlatformPlugin : public QObject, PlatformPluginInterface, PluginInt ConfigurationPage* createConfigurationPage() override; private: - WindowsCoreFunctions m_windowsCoreFunctions; - WindowsFilesystemFunctions m_windowsFilesystemFunctions; - WindowsInputDeviceFunctions m_windowsInputDeviceFunctions; - WindowsNetworkFunctions m_windowsNetworkFunctions; - WindowsServiceFunctions m_windowsServiceFunctions; - WindowsSessionFunctions m_windowsSessionFunctions; - WindowsUserFunctions m_windowsUserFunctions; + WindowsCoreFunctions m_windowsCoreFunctions{}; + WindowsFilesystemFunctions m_windowsFilesystemFunctions{}; + WindowsInputDeviceFunctions m_windowsInputDeviceFunctions{}; + WindowsNetworkFunctions m_windowsNetworkFunctions{}; + WindowsServiceFunctions m_windowsServiceFunctions{}; + WindowsSessionFunctions m_windowsSessionFunctions{}; + WindowsUserFunctions m_windowsUserFunctions{}; }; From 824bbbc296dc8f73cd78d794b75b7dd70539aa9f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 15:03:47 +0100 Subject: [PATCH 1179/1765] WindowsServiceControl: use default initialization (cherry picked from commit c5801eebc6e645f2ad7ac7bd181c15dca91286c0) --- plugins/platform/windows/WindowsServiceControl.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index b4287cfce..623e0a85d 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -233,10 +233,7 @@ bool WindowsServiceControl::install( const QString& filePath, const QString& dis serviceActions.Delay = ServiceActionDelay; serviceActions.Type = SC_ACTION_RESTART; - SERVICE_FAILURE_ACTIONS serviceFailureActions; - serviceFailureActions.dwResetPeriod = 0; - serviceFailureActions.lpRebootMsg = nullptr; - serviceFailureActions.lpCommand = nullptr; + SERVICE_FAILURE_ACTIONS serviceFailureActions{}; serviceFailureActions.lpsaActions = &serviceActions; serviceFailureActions.cActions = 1; if( ChangeServiceConfig2( m_serviceHandle, SERVICE_CONFIG_FAILURE_ACTIONS, &serviceFailureActions ) == false ) From d9b4aa91f994344168504292728f56e736560791 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 15:01:15 +0100 Subject: [PATCH 1180/1765] WindowsPlatformConfigurationPage: minor cleanups (cherry picked from commit 1ba4d7a43a306aaf1228ee4b0301386e9c4a02ce) --- .../platform/windows/WindowsPlatformConfigurationPage.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp index 69d06cdc5..727051883 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp @@ -31,7 +31,6 @@ WindowsPlatformConfigurationPage::WindowsPlatformConfigurationPage() : - ConfigurationPage(), ui( new Ui::WindowsPlatformConfigurationPage ), m_configuration( &VeyonCore::config() ) { @@ -51,14 +50,14 @@ WindowsPlatformConfigurationPage::~WindowsPlatformConfigurationPage() void WindowsPlatformConfigurationPage::resetWidgets() { - FOREACH_WINDOWS_PLATFORM_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); + FOREACH_WINDOWS_PLATFORM_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY) } void WindowsPlatformConfigurationPage::connectWidgetsToProperties() { - FOREACH_WINDOWS_PLATFORM_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); + FOREACH_WINDOWS_PLATFORM_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY) } From 72d87520621492617d5e8b2ab9b313a0b2bb7524 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Jan 2020 17:12:10 +0100 Subject: [PATCH 1181/1765] Linux: various code modernizations (cherry picked from commit e43038d5a9865193c3120223e7ccba446576b998) --- plugins/platform/linux/LinuxInputDeviceFunctions.h | 1 + plugins/platform/linux/LinuxKeyboardInput.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.h b/plugins/platform/linux/LinuxInputDeviceFunctions.h index bf5bdc2b4..acc374691 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.h +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.h @@ -32,6 +32,7 @@ class LinuxInputDeviceFunctions : public PlatformInputDeviceFunctions { public: LinuxInputDeviceFunctions() = default; + virtual ~LinuxInputDeviceFunctions() = default; void enableInputDevices() override; void disableInputDevices() override; diff --git a/plugins/platform/linux/LinuxKeyboardInput.h b/plugins/platform/linux/LinuxKeyboardInput.h index 605730d0b..a868b42c0 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.h +++ b/plugins/platform/linux/LinuxKeyboardInput.h @@ -26,7 +26,7 @@ #include -// clazy:excludeall=rule-of-three +// clazy:excludeall=copyable-polymorphic class LinuxKeyboardInput { From dbf6439a6ef56e5d21a2d983b5f8cec7e02c2676 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 9 Nov 2021 13:43:57 +0100 Subject: [PATCH 1182/1765] Revert "LinuxKeyboardInput: split pressAndReleaseKey()" This reverts commit 7fa2a7751c0765110b7d39069e48feed88af7aba. --- plugins/platform/linux/LinuxKeyboardInput.cpp | 18 +----------------- plugins/platform/linux/LinuxKeyboardInput.h | 6 +----- 2 files changed, 2 insertions(+), 22 deletions(-) diff --git a/plugins/platform/linux/LinuxKeyboardInput.cpp b/plugins/platform/linux/LinuxKeyboardInput.cpp index 100340902..cb5518ea7 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.cpp +++ b/plugins/platform/linux/LinuxKeyboardInput.cpp @@ -52,30 +52,14 @@ LinuxKeyboardInput::~LinuxKeyboardInput() -void LinuxKeyboardInput::pressKey( KeySym keysym ) +void LinuxKeyboardInput::pressAndReleaseKey( uint32_t keysym ) { fakekey_press_keysym( m_fakeKeyHandle, keysym, 0 ); -} - - - -void LinuxKeyboardInput::releaseKey( KeySym keysym ) -{ - Q_UNUSED(keysym) - fakekey_release( m_fakeKeyHandle ); } -void LinuxKeyboardInput::pressAndReleaseKey( KeySym keysym ) -{ - pressKey( keysym ); - releaseKey( keysym ); -} - - - void LinuxKeyboardInput::pressAndReleaseKey( const QByteArray& utf8Data ) { fakekey_press( m_fakeKeyHandle, reinterpret_cast( utf8Data.constData() ), utf8Data.size(), 0 ); diff --git a/plugins/platform/linux/LinuxKeyboardInput.h b/plugins/platform/linux/LinuxKeyboardInput.h index a868b42c0..69688f64b 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.h +++ b/plugins/platform/linux/LinuxKeyboardInput.h @@ -33,15 +33,11 @@ class LinuxKeyboardInput public: using FakeKey = struct FakeKey; using Display = struct _XDisplay; - using KeySym = uint32_t; LinuxKeyboardInput(); ~LinuxKeyboardInput(); - void pressKey( KeySym keysym ); - void releaseKey( KeySym keysym ); - - void pressAndReleaseKey( KeySym keysym ); + void pressAndReleaseKey( uint32_t keysym ); void pressAndReleaseKey( const QByteArray& utf8Data ); From f2b5bb7986a59fb41266a501d5c33a6fbaced68a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 9 Nov 2021 14:22:14 +0100 Subject: [PATCH 1183/1765] PlatformSessionManager: add warning on session allocation failure --- plugins/platform/common/PlatformSessionManager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index a32615397..8e905456a 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -99,6 +99,8 @@ PlatformSessionManager::SessionId PlatformSessionManager::openSession( const Pla } } + vWarning() << "Failed to allocate session for platform session" << platformSessionId; + return PlatformSessionFunctions::InvalidSessionId; } From 61eb67f49f44932759b47b5aa24c56e7dfc9110c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 9 Nov 2021 14:58:41 +0100 Subject: [PATCH 1184/1765] VncView: add updateGeometry() Call it on every framebuffer size or viewport change. --- core/src/VncView.cpp | 14 ++++++++++++++ core/src/VncView.h | 12 +++++------- core/src/VncViewItem.cpp | 6 ++++++ core/src/VncViewItem.h | 7 ++++--- core/src/VncViewWidget.cpp | 4 +--- core/src/VncViewWidget.h | 2 +- 6 files changed, 31 insertions(+), 14 deletions(-) diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index 9e5cad39b..113ef082b 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -99,6 +99,18 @@ QSize VncView::effectiveFramebufferSize() const +void VncView::setViewport(QRect viewport) +{ + if( m_viewport != viewport ) + { + m_viewport = viewport; + + updateGeometry(); + } +} + + + void VncView::setViewOnly( bool viewOnly ) { if( viewOnly == m_viewOnly ) @@ -263,6 +275,8 @@ void VncView::updateCursorShape( const QPixmap& cursorShape, int xh, int yh ) void VncView::updateFramebufferSize( int w, int h ) { m_framebufferSize = QSize( w, h ); + + updateGeometry(); } diff --git a/core/src/VncView.h b/core/src/VncView.h index a9c36c7b9..ad7dc0fd0 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -81,10 +81,7 @@ class VEYON_CORE_EXPORT VncView return m_viewport; } - void setViewport( QRect viewport ) - { - m_viewport = viewport; - } + void setViewport( QRect viewport ); virtual void setViewOnly( bool viewOnly ); void sendShortcut( VncView::Shortcut shortcut ); @@ -105,10 +102,11 @@ class VEYON_CORE_EXPORT VncView virtual void updateView( int x, int y, int w, int h ) = 0; virtual QSize viewSize() const = 0; virtual void setViewCursor( const QCursor& cursor ) = 0; + virtual void updateGeometry() = 0; - virtual void updateCursorShape( const QPixmap& cursorShape, int xh, int yh ); - virtual void updateFramebufferSize( int w, int h ); - virtual void updateImage( int x, int y, int w, int h ); + void updateCursorShape( const QPixmap& cursorShape, int xh, int yh ); + void updateFramebufferSize( int w, int h ); + void updateImage( int x, int y, int w, int h ); void unpressModifiers(); diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index 652c8dc06..4704da142 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -94,6 +94,12 @@ void VncViewItem::setViewCursor( const QCursor& cursor ) +void VncViewItem::updateGeometry() +{ +} + + + QSize VncViewItem::viewSize() const { return { int(width()), int(height()) }; diff --git a/core/src/VncViewItem.h b/core/src/VncViewItem.h index 5eeb42b7b..d1f504d0c 100644 --- a/core/src/VncViewItem.h +++ b/core/src/VncViewItem.h @@ -38,9 +38,10 @@ class VEYON_CORE_EXPORT VncViewItem : public QQuickItem, public VncView QSGNode* updatePaintNode( QSGNode *oldNode, UpdatePaintNodeData* updatePaintNodeData ) override; protected: - virtual void updateView( int x, int y, int w, int h ) override; - virtual QSize viewSize() const override; - virtual void setViewCursor( const QCursor& cursor ) override; + void updateView( int x, int y, int w, int h ) override; + QSize viewSize() const override; + void setViewCursor( const QCursor& cursor ) override; + void updateGeometry() override; bool event( QEvent* event ) override; diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index cad93133b..9ff5f14d3 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -146,10 +146,8 @@ void VncViewWidget::setViewCursor(const QCursor& cursor) -void VncViewWidget::updateFramebufferSize( int w, int h ) +void VncViewWidget::updateGeometry() { - VncView::updateFramebufferSize( w, h ); - resize( effectiveFramebufferSize() ); Q_EMIT sizeHintChanged(); diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index 799a302ba..462e13da4 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -52,7 +52,7 @@ class VEYON_CORE_EXPORT VncViewWidget : public QWidget, public VncView QSize viewSize() const override; void setViewCursor( const QCursor& cursor ) override; - void updateFramebufferSize( int w, int h ) override; + void updateGeometry() override; bool event( QEvent* handleEvent ) override; bool eventFilter( QObject* obj, QEvent* handleEvent ) override; From 8dcc84349fa43006d1e77cbebfed4b3b05d38007 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 9 Nov 2021 15:04:22 +0100 Subject: [PATCH 1185/1765] CCI, MonitoringMode: add support for querying displays --- core/src/ComputerControlInterface.cpp | 19 +++++++++ core/src/ComputerControlInterface.h | 24 +++++++++++ core/src/MonitoringMode.cpp | 59 ++++++++++++++++++++++++++- core/src/MonitoringMode.h | 6 ++- 4 files changed, 106 insertions(+), 2 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 50735813f..a26390b6c 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -204,6 +204,25 @@ void ComputerControlInterface::setUserInformation( const QString& userLoginName, +void ComputerControlInterface::updateDisplays() +{ + VeyonCore::builtinFeatures().monitoringMode().queryDisplays( { weakPointer() } ); +} + + + +void ComputerControlInterface::setDisplays( const DisplayList& displays ) +{ + if( displays != m_displays ) + { + m_displays = displays; + + Q_EMIT displaysChanged(); + } +} + + + void ComputerControlInterface::setActiveFeatures( const FeatureUidList& activeFeatures ) { if( activeFeatures != m_activeFeatures ) diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 22dc17b97..42d3d089c 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -45,6 +45,19 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab using State = VncConnection::State; + struct DisplayProperties { + int index; + QString name; + QRect geometry; + bool operator==(const DisplayProperties& other) + { + return other.index == index && + other.name == name && + other.geometry == geometry; + } + }; + using DisplayList = QList; + explicit ComputerControlInterface( const Computer& computer, int port = -1, QObject* parent = nullptr ); ~ComputerControlInterface() override; @@ -108,6 +121,15 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void setUserInformation( const QString& userLoginName, const QString& userFullName, int sessionId ); + void updateDisplays(); + + const DisplayList& displays() const + { + return m_displays; + } + + void setDisplays( const DisplayList& displays ); + const FeatureUidList& activeFeatures() const { return m_activeFeatures; @@ -170,6 +192,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QString m_userLoginName; QString m_userFullName; int m_userSessionId{0}; + DisplayList m_displays; FeatureUidList m_activeFeatures; Feature::Uid m_designatedModeFeature; @@ -189,6 +212,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void screenUpdated( QRect rect ); void scaledScreenUpdated(); void userChanged(); + void displaysChanged(); void stateChanged(); void activeFeaturesChanged(); diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 229ee51f0..430c2f376 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -23,6 +23,8 @@ */ #include +#include +#include #include "MonitoringMode.h" #include "PlatformSessionFunctions.h" @@ -43,7 +45,11 @@ MonitoringMode::MonitoringMode( QObject* parent ) : Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Worker | Feature::Flag::Builtin, Feature::Uid( "79a5e74d-50bd-4aab-8012-0e70dc08cc72" ), Feature::Uid(), {}, {}, {} ), - m_features( { m_monitoringModeFeature, m_queryLoggedOnUserInfoFeature } ) + m_queryDisplaysFeature( QStringLiteral("QueryDisplays"), + Feature::Flag::Meta, + Feature::Uid("d5bbc486-7bc5-4c36-a9a8-1566c8b0091a"), + Feature::Uid(), tr("Query properties of attached displays"), {}, {} ), + m_features( { m_monitoringModeFeature, m_queryLoggedOnUserInfoFeature, m_queryDisplaysFeature } ) { } @@ -57,6 +63,14 @@ void MonitoringMode::queryLoggedOnUserInfo( const ComputerControlInterfaceList& +void MonitoringMode::queryDisplays(const ComputerControlInterfaceList& computerControlInterfaces) +{ + sendFeatureMessage( FeatureMessage{m_queryDisplaysFeature.uid(), FeatureMessage::DefaultCommand}, + computerControlInterfaces ); +} + + + bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message ) { @@ -69,6 +83,26 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com return true; } + if( message.featureUid() == m_queryDisplaysFeature.uid() ) + { + const auto displayInfoList = message.argument(Argument::DisplayInfoList).toList(); + + ComputerControlInterface::DisplayList displays; + displays.reserve(displayInfoList.size()); + + for(int i = 0; i < displayInfoList.size(); ++i) + { + const auto displayInfo = displayInfoList.at(i).toMap(); + ComputerControlInterface::DisplayProperties displayProperties; + displayProperties.index = i + 1; + displayProperties.name = displayInfo.value(QStringLiteral("name")).toString(); + displayProperties.geometry = displayInfo.value(QStringLiteral("geometry")).toRect(); + displays.append(displayProperties); + } + + computerControlInterface->setDisplays(displays); + } + return false; } @@ -101,6 +135,29 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, return server.sendFeatureMessageReply( messageContext, reply ); } + if( message.featureUid() == m_queryDisplaysFeature.uid() ) + { + const auto screens = QGuiApplication::screens(); + + QVariantList displayInfoList; + displayInfoList.reserve(screens.size()); + + int index = 1; + for(const auto* screen : screens) + { + QVariantMap displayInfo; + displayInfo[QStringLiteral("index")] = index; + displayInfo[QStringLiteral("name")] = screen->name(); + displayInfo[QStringLiteral("geometry")] = screen->geometry(); + displayInfoList.append(displayInfo); + ++index; + } + + return server.sendFeatureMessageReply( messageContext, + FeatureMessage(m_queryDisplaysFeature.uid()) + .addArgument(Argument::DisplayInfoList, displayInfoList) ); + } + return false; } diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index a1a249a3a..626eea126 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -35,7 +35,8 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac { UserLoginName, UserFullName, - UserSessionId + UserSessionId, + DisplayInfoList, }; Q_ENUM(Argument) @@ -83,6 +84,8 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ); + void queryDisplays( const ComputerControlInterfaceList& computerControlInterfaces ); + bool controlFeature( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ) override { @@ -107,6 +110,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac const Feature m_monitoringModeFeature; const Feature m_queryLoggedOnUserInfoFeature; + const Feature m_queryDisplaysFeature; const FeatureList m_features; QReadWriteLock m_userDataLock; From cead2ef9cb1f1a754db7fde4007e879acdabfc66 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Nov 2021 08:49:57 +0100 Subject: [PATCH 1186/1765] ComputerControlServer: add nullptr check --- server/src/ComputerControlServer.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 1b9e43af1..d920cc365 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -129,10 +129,15 @@ bool ComputerControlServer::sendFeatureMessageReply( const MessageContext& conte { vDebug() << reply.featureUid() << reply.command() << reply.arguments(); - char rfbMessageType = FeatureMessage::RfbMessageType; - context.ioDevice()->write( &rfbMessageType, sizeof(rfbMessageType) ); + if( context.ioDevice() ) + { + char rfbMessageType = FeatureMessage::RfbMessageType; + context.ioDevice()->write( &rfbMessageType, sizeof(rfbMessageType) ); + + return reply.send( context.ioDevice() ); + } - return reply.send( context.ioDevice() ); + return false; } From d250ce8debdbc54be5c64c5e7c030efcaeff4feb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Nov 2021 08:52:12 +0100 Subject: [PATCH 1187/1765] TlsServer: add log messages for incoming connections --- server/src/TlsServer.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/src/TlsServer.cpp b/server/src/TlsServer.cpp index 2e5634c42..b3c12a18a 100644 --- a/server/src/TlsServer.cpp +++ b/server/src/TlsServer.cpp @@ -42,10 +42,12 @@ void TlsServer::incomingConnection( qintptr socketDescriptor ) auto socket = new QTcpSocket; if( socket->setSocketDescriptor(socketDescriptor) ) { + vDebug() << "accepting unencrypted connection for socket" << socketDescriptor; addPendingConnection( socket ); } else { + vCritical() << "failed to set socket descriptor for incoming non-TLS connection"; delete socket; } } @@ -70,10 +72,12 @@ void TlsServer::incomingConnection( qintptr socketDescriptor ) socket->setSslConfiguration( m_tlsConfig ); socket->startServerEncryption(); + vDebug() << "establishing TLS connection for socket" << socketDescriptor; addPendingConnection( socket ); } else { + vCritical() << "failed to set socket descriptor for incoming TLS connection"; delete socket; } } From 5267d8ff48a68e5088b7a9e46c434270b1358cbc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Nov 2021 08:57:08 +0100 Subject: [PATCH 1188/1765] TlsServer: fix check for incomplete TLS configuration --- server/src/TlsServer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/TlsServer.cpp b/server/src/TlsServer.cpp index b3c12a18a..e500d4163 100644 --- a/server/src/TlsServer.cpp +++ b/server/src/TlsServer.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include "TlsServer.h" @@ -37,7 +38,7 @@ TlsServer::TlsServer( const VeyonCore::TlsConfiguration& tlsConfig, QObject* par void TlsServer::incomingConnection( qintptr socketDescriptor ) { - if( m_tlsConfig.isNull() ) + if( m_tlsConfig.localCertificate().isNull() || m_tlsConfig.privateKey().isNull() ) { auto socket = new QTcpSocket; if( socket->setSocketDescriptor(socketDescriptor) ) From de4f742abab3ab8c1e2f87fe9a2abc89b02c4b94 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Nov 2021 09:20:38 +0100 Subject: [PATCH 1189/1765] FeatureMessage: fix constructor semantics Add initializers for member variables, add default constructor and use DefaultCommand as default parameter for the regular constructor. --- core/src/FeatureMessage.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/FeatureMessage.h b/core/src/FeatureMessage.h index d3b174ad6..72bd6e6b9 100644 --- a/core/src/FeatureMessage.h +++ b/core/src/FeatureMessage.h @@ -46,7 +46,9 @@ class VEYON_CORE_EXPORT FeatureMessage InitCommand = -2, }; - explicit FeatureMessage( FeatureUid featureUid = {}, Command command = InvalidCommand ) : + FeatureMessage() = default; + + explicit FeatureMessage( FeatureUid featureUid, Command command = DefaultCommand ) : m_featureUid( featureUid ), m_command( command ), m_arguments() @@ -106,9 +108,9 @@ class VEYON_CORE_EXPORT FeatureMessage bool receive( QIODevice* ioDevice ); private: - FeatureUid m_featureUid; - Command m_command; - Arguments m_arguments; + FeatureUid m_featureUid{}; + Command m_command{InvalidCommand}; + Arguments m_arguments{}; } ; From 4a6523a1ccd9a0c0fffdb29d8fb603f34a34b0ea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Nov 2021 09:30:28 +0100 Subject: [PATCH 1190/1765] Revert "WindowsServiceControl: add startType()" This reverts commit b9156ee5092d5ae4d4b1b20959f994a422f3f995. --- .../windows/WindowsServiceControl.cpp | 47 ------------------- .../platform/windows/WindowsServiceControl.h | 1 - 2 files changed, 48 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 623e0a85d..4eabc6514 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -279,53 +279,6 @@ bool WindowsServiceControl::uninstall() -int WindowsServiceControl::startType() -{ - if( checkService() == false ) - { - return InvalidStartType; - } - - LPQUERY_SERVICE_CONFIG serviceConfig{nullptr}; - DWORD bufferSize = 0; - DWORD bytesNeeded = 0; - - if( QueryServiceConfig( m_serviceHandle, nullptr, 0, &bytesNeeded ) == false ) - { - const auto error = GetLastError(); - if( error == ERROR_INSUFFICIENT_BUFFER ) - { - bufferSize = bytesNeeded; - serviceConfig = LPQUERY_SERVICE_CONFIG(LocalAlloc(LMEM_FIXED, bufferSize)); - } - else - { - vCritical() << "error while querying service configuration" << m_name << error; - return InvalidStartType; - } - } - else - { - return InvalidStartType; - } - - if( QueryServiceConfig( m_serviceHandle, serviceConfig, bufferSize, &bytesNeeded ) == false ) - { - const auto error = GetLastError(); - vCritical() << "error while querying service configuration" << m_name << error; - LocalFree( serviceConfig ); - return InvalidStartType; - } - - const auto startType = serviceConfig->dwStartType; - - LocalFree( serviceConfig ); - - return startType; -} - - - bool WindowsServiceControl::setStartType( int startType ) { if( checkService() == false || startType == InvalidStartType ) diff --git a/plugins/platform/windows/WindowsServiceControl.h b/plugins/platform/windows/WindowsServiceControl.h index 00c199c76..5c3d20f59 100644 --- a/plugins/platform/windows/WindowsServiceControl.h +++ b/plugins/platform/windows/WindowsServiceControl.h @@ -43,7 +43,6 @@ class WindowsServiceControl : public QObject bool stop(); bool install( const QString& filePath, const QString& displayName ); bool uninstall(); - int startType(); bool setStartType( int startType ); private: From de41fca7d9ae6e18ab8b4f9cf592f9850b495e57 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:45:34 +0100 Subject: [PATCH 1191/1765] SasEventListener: use std::array (cherry picked from commit 6943bee1fee409644b6f67e52322bc6b86646692) --- plugins/platform/windows/SasEventListener.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/platform/windows/SasEventListener.cpp b/plugins/platform/windows/SasEventListener.cpp index 11b9480e9..afdfe4b37 100644 --- a/plugins/platform/windows/SasEventListener.cpp +++ b/plugins/platform/windows/SasEventListener.cpp @@ -29,14 +29,14 @@ SasEventListener::SasEventListener() { const wchar_t* sasDll = L"\\sas.dll"; - wchar_t sasPath[MAX_PATH] = { 0 }; // Flawfinder: ignore - if( GetSystemDirectory( sasPath, static_cast( MAX_PATH - wcslen(sasDll) - 1 ) ) == 0 ) // Flawfinder: ignore + std::array sasPath{}; + if( GetSystemDirectory( sasPath.data(), static_cast( MAX_PATH - wcslen(sasDll) - 1 ) ) == 0 ) { vCritical() << "could not determine system directory"; } - wcscat( sasPath, sasDll ); + wcscat( sasPath.data(), sasDll ); - m_sasLibrary = LoadLibrary( sasPath ); // Flawfinder: ignore + m_sasLibrary = LoadLibrary( sasPath.data() ); // Flawfinder: ignore m_sendSas = reinterpret_cast( GetProcAddress( m_sasLibrary, "SendSAS" ) ); if( m_sendSas == nullptr ) @@ -69,11 +69,11 @@ void SasEventListener::stop() void SasEventListener::run() { - HANDLE eventObjects[2] = { m_sasEvent, m_stopEvent }; + std::array eventObjects{ m_sasEvent, m_stopEvent }; while( isInterruptionRequested() == false ) { - const auto event = WaitForMultipleObjects( 2, eventObjects, FALSE, WaitPeriod ); + const auto event = WaitForMultipleObjects( eventObjects.size(), eventObjects.data(), FALSE, WaitPeriod ); switch( event ) { From 0eafd667610988d0c903742180145a7f714f58d9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Jan 2020 14:47:40 +0100 Subject: [PATCH 1192/1765] Windows: XEventLog: minor code modernizations (cherry picked from commit 844632c4b24378e26133221047e77eb7239dfa83) --- plugins/platform/windows/XEventLog.cpp | 13 +++++-------- plugins/platform/windows/XEventLog.h | 6 +++--- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/plugins/platform/windows/XEventLog.cpp b/plugins/platform/windows/XEventLog.cpp index 27a7f73d3..af849dcc8 100644 --- a/plugins/platform/windows/XEventLog.cpp +++ b/plugins/platform/windows/XEventLog.cpp @@ -55,7 +55,7 @@ CXEventLog::CXEventLog(LPCTSTR lpszApp /* = NULL*/, LPCTSTR lpszEventMessageDll /* = NULL*/) { #ifdef _DEBUG - if ((lpszApp == NULL) || (lpszApp[0] == _T('\0'))) + if ((lpszApp == nullptr) || (lpszApp[0] == _T('\0'))) { TRACE(_T("=== No app specified in CXEventLog ctor. ") _T("Be sure to call Init() before calling Write(). ===\n")); @@ -85,10 +85,7 @@ CXEventLog::CXEventLog(LPCTSTR lpszApp /* = NULL*/, CXEventLog::~CXEventLog() { Close(); - if (m_pszAppName) - { - delete [] m_pszAppName; - } + delete [] m_pszAppName; m_pszAppName = nullptr; } @@ -268,7 +265,7 @@ BOOL CXEventLog::Write(WORD wType, LPCTSTR lpszMessage) BOOL CXEventLog::RegisterSource(LPCTSTR lpszApp, LPCTSTR lpszEventMessageDll) { - _ASSERTE((lpszApp != NULL) && (lpszApp[0] != _T('\0'))); + _ASSERTE((lpszApp != nullptr) && (lpszApp[0] != _T('\0'))); if (!lpszApp || lpszApp[0] == _T('\0')) { return FALSE; @@ -277,8 +274,8 @@ BOOL CXEventLog::RegisterSource(LPCTSTR lpszApp, TCHAR szRegPath[] = _T("SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Application\\"); - TCHAR szKey[_MAX_PATH*2]; // Flawfinder: ignore - memset(szKey, 0, _MAX_PATH*2*sizeof(TCHAR)); + TCHAR szKey[MAX_PATH*2]; // Flawfinder: ignore + memset(szKey, 0, MAX_PATH*2*sizeof(TCHAR)); wcsncpy(szKey, szRegPath, MAX_PATH*2-2); // Flawfinder: ignore wcsncat(szKey, lpszApp, MAX_PATH*2-2); // Flawfinder: ignore diff --git a/plugins/platform/windows/XEventLog.h b/plugins/platform/windows/XEventLog.h index 271da492a..4dde4dd39 100644 --- a/plugins/platform/windows/XEventLog.h +++ b/plugins/platform/windows/XEventLog.h @@ -18,7 +18,7 @@ class CXEventLog { // Construction public: - CXEventLog(LPCTSTR lpszApp = NULL, LPCTSTR lpszEventMessageDll = NULL); + CXEventLog(LPCTSTR lpszApp = nullptr, LPCTSTR lpszEventMessageDll = nullptr); ~CXEventLog(); // Attributes @@ -28,11 +28,11 @@ class CXEventLog // Operations public: void Close(); - BOOL Init(LPCTSTR lpszApp, LPCTSTR lpszEventMessageDll = NULL); + BOOL Init(LPCTSTR lpszApp, LPCTSTR lpszEventMessageDll = nullptr); BOOL Write(WORD wType, LPCTSTR lpszMessage); // Implementation -protected: +private: HANDLE m_hEventLog; LPTSTR m_pszAppName; PSID GetUserSid(); From 047610e0e89558d6857817e178de1618d8ac1bbb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Nov 2021 10:50:21 +0100 Subject: [PATCH 1193/1765] VeyonCore: add FeatureManager instance There's no reason to maintain FeatureManager instances in the components individually. Instead we can reduce complexity by having a global instance in VeyonCore. --- configurator/src/MasterConfigurationPage.cpp | 4 ++-- configurator/src/MasterConfigurationPage.h | 4 ---- core/src/FeatureControl.cpp | 2 +- core/src/FeatureWorkerManager.cpp | 5 ++-- core/src/FeatureWorkerManager.h | 3 +-- core/src/VeyonCore.cpp | 5 ++++ core/src/VeyonCore.h | 7 ++++++ core/src/VeyonServerInterface.h | 2 -- master/src/ComputerControlListModel.cpp | 4 ++-- master/src/ComputerMonitoringItem.cpp | 2 +- master/src/ComputerMonitoringView.cpp | 8 +++---- master/src/ComputerMonitoringWidget.cpp | 4 ++-- master/src/DocumentationFigureCreator.cpp | 18 +++++++------- master/src/MainWindow.cpp | 2 +- master/src/VeyonMaster.cpp | 24 +++++++++---------- master/src/VeyonMaster.h | 7 ------ server/src/ComputerControlServer.cpp | 5 ++-- server/src/ComputerControlServer.h | 7 ------ worker/src/FeatureWorkerManagerConnection.cpp | 4 +--- worker/src/FeatureWorkerManagerConnection.h | 2 -- worker/src/VeyonWorker.cpp | 5 ++-- worker/src/VeyonWorker.h | 2 -- 22 files changed, 55 insertions(+), 71 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index 683730fe0..d458788dd 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -138,7 +138,7 @@ void MasterConfigurationPage::populateFeatureComboBox() ui->computerDoubleClickFeature->addItem( QIcon(), tr( "" ), QUuid() ); ui->computerDoubleClickFeature->insertSeparator( ui->computerDoubleClickFeature->count() ); - for( const auto& feature : m_featureManager.features() ) + for( const auto& feature : VeyonCore::featureManager().features() ) { if( feature.testFlag( Feature::Flag::Master ) && feature.testFlag( Feature::Flag::Meta ) == false ) @@ -160,7 +160,7 @@ void MasterConfigurationPage::updateFeatureLists() ui->allFeaturesListWidget->clear(); ui->disabledFeaturesListWidget->clear(); - for( const auto& feature : qAsConst( m_featureManager.features() ) ) + for( const auto& feature : qAsConst( VeyonCore::featureManager().features() ) ) { if( feature.testFlag( Feature::Flag::Master ) == false || feature.testFlag( Feature::Flag::Meta ) || diff --git a/configurator/src/MasterConfigurationPage.h b/configurator/src/MasterConfigurationPage.h index 96d6b1c53..729bd53a3 100644 --- a/configurator/src/MasterConfigurationPage.h +++ b/configurator/src/MasterConfigurationPage.h @@ -25,9 +25,6 @@ #pragma once #include "ConfigurationPage.h" -#include "FeatureManager.h" - -class BuiltinFeatures; namespace Ui { class MasterConfigurationPage; @@ -56,7 +53,6 @@ private Q_SLOTS: Ui::MasterConfigurationPage *ui; - FeatureManager m_featureManager{}; QStringList m_disabledFeatures{}; }; diff --git a/core/src/FeatureControl.cpp b/core/src/FeatureControl.cpp index 8c0d43058..31b891f03 100644 --- a/core/src/FeatureControl.cpp +++ b/core/src/FeatureControl.cpp @@ -80,7 +80,7 @@ bool FeatureControl::handleFeatureMessage( VeyonServerInterface& server, { if( m_featureControlFeature.uid() == message.featureUid() ) { - const auto featureUids = server.featureManager().activeFeatures( server ); + const auto featureUids = VeyonCore::featureManager().activeFeatures( server ); QStringList featureUidStrings; featureUidStrings.reserve( featureUids.size() ); diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index 761fb5ea7..4c21216ab 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -37,10 +37,9 @@ // clazy:excludeall=detaching-member -FeatureWorkerManager::FeatureWorkerManager( VeyonServerInterface& server, FeatureManager& featureManager, QObject* parent ) : +FeatureWorkerManager::FeatureWorkerManager( VeyonServerInterface& server, QObject* parent ) : QObject( parent ), m_server( server ), - m_featureManager( featureManager ), m_tcpServer( this ) { connect( &m_tcpServer, &QTcpServer::newConnection, @@ -278,7 +277,7 @@ void FeatureWorkerManager::processConnection( QTcpSocket* socket ) if( message.command() >= 0 ) { - m_featureManager.handleFeatureMessage( m_server, MessageContext( socket ), message ); + VeyonCore::featureManager().handleFeatureMessage( m_server, MessageContext( socket ), message ); } } else diff --git a/core/src/FeatureWorkerManager.h b/core/src/FeatureWorkerManager.h index 7ff75231d..8236f85ba 100644 --- a/core/src/FeatureWorkerManager.h +++ b/core/src/FeatureWorkerManager.h @@ -44,7 +44,7 @@ class VEYON_CORE_EXPORT FeatureWorkerManager : public QObject { Q_OBJECT public: - FeatureWorkerManager( VeyonServerInterface& server, FeatureManager& featureManager, QObject* parent = nullptr ); + FeatureWorkerManager( VeyonServerInterface& server, QObject* parent = nullptr ); ~FeatureWorkerManager() override; bool startManagedSystemWorker( Feature::Uid featureUid ); @@ -69,7 +69,6 @@ class VEYON_CORE_EXPORT FeatureWorkerManager : public QObject static constexpr auto UnmanagedSessionProcessRetryInterval = 5000; VeyonServerInterface& m_server; - FeatureManager& m_featureManager; QTcpServer m_tcpServer; struct Worker diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index c1bd72289..1f27145c5 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -41,6 +41,7 @@ #include "AuthenticationManager.h" #include "BuiltinFeatures.h" #include "ComputerControlInterface.h" +#include "FeatureManager.h" #include "Filesystem.h" #include "HostAddress.h" #include "Logger.h" @@ -112,6 +113,9 @@ VeyonCore::VeyonCore( QCoreApplication* application, Component component, const VeyonCore::~VeyonCore() { + delete m_featureManager; + m_featureManager = nullptr; + delete m_userGroupsBackendManager; m_userGroupsBackendManager = nullptr; @@ -632,6 +636,7 @@ void VeyonCore::initPlugins() void VeyonCore::initManagers() { m_authenticationManager = new AuthenticationManager( this ); + m_featureManager = new FeatureManager(this); m_userGroupsBackendManager = new UserGroupsBackendManager( this ); m_networkObjectDirectoryManager = new NetworkObjectDirectoryManager( this ); } diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 78b0c4c56..39e4d6853 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -49,6 +49,7 @@ class AuthenticationCredentials; class AuthenticationManager; class BuiltinFeatures; class CryptoCore; +class FeatureManager; class Filesystem; class Logger; class NetworkObjectDirectoryManager; @@ -149,6 +150,11 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject return *( instance()->m_builtinFeatures ); } + static FeatureManager& featureManager() + { + return *( instance()->m_featureManager ); + } + static UserGroupsBackendManager& userGroupsBackendManager() { return *( instance()->m_userGroupsBackendManager ); @@ -216,6 +222,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject PlatformPluginManager* m_platformPluginManager; PlatformPluginInterface* m_platformPlugin; BuiltinFeatures* m_builtinFeatures; + FeatureManager* m_featureManager{nullptr}; UserGroupsBackendManager* m_userGroupsBackendManager; NetworkObjectDirectoryManager* m_networkObjectDirectoryManager; diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index 4cb4e5b1d..c9be3d9a6 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -25,7 +25,6 @@ #pragma once class BuiltinFeatures; -class FeatureManager; class FeatureMessage; class FeatureWorkerManager; class MessageContext; @@ -37,7 +36,6 @@ class VeyonServerInterface public: virtual ~VeyonServerInterface() = default; - virtual FeatureManager& featureManager() = 0; virtual FeatureWorkerManager& featureWorkerManager() = 0; virtual bool sendFeatureMessageReply( const MessageContext& context, const FeatureMessage& reply ) = 0; diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 4ecc75a4a..8d0d1a26d 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -381,7 +381,7 @@ void ComputerControlListModel::startComputerControlInterface( ComputerControlInt connect( controlInterface, &ComputerControlInterface::featureMessageReceived, this, [=]( const FeatureMessage& featureMessage, const ComputerControlInterface::Pointer& computerControlInterface ) { - m_master->featureManager().handleFeatureMessage( computerControlInterface, featureMessage ); + VeyonCore::featureManager().handleFeatureMessage( computerControlInterface, featureMessage ); } ); connect( controlInterface, &ComputerControlInterface::screenSizeChanged, @@ -582,7 +582,7 @@ QString ComputerControlListModel::activeFeatures( const ComputerControlInterface QStringList featureNames; featureNames.reserve( controlInterface->activeFeatures().size() ); - for( const auto& feature : m_master->featureManager().features() ) + for( const auto& feature : VeyonCore::featureManager().features() ) { if( feature.testFlag( Feature::Flag::Master ) && controlInterface->activeFeatures().contains( feature.uid() ) ) diff --git a/master/src/ComputerMonitoringItem.cpp b/master/src/ComputerMonitoringItem.cpp index 916a49d2c..76501c1e8 100644 --- a/master/src/ComputerMonitoringItem.cpp +++ b/master/src/ComputerMonitoringItem.cpp @@ -82,7 +82,7 @@ void ComputerMonitoringItem::alignComputers() void ComputerMonitoringItem::runFeature( QString uid ) { - ComputerMonitoringView::runFeature( master()->featureManager().feature( Feature::Uid( uid ) ) ); + ComputerMonitoringView::runFeature( VeyonCore::featureManager().feature( Feature::Uid( uid ) ) ); } diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index ab170b520..3ce3b0a56 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -212,12 +212,12 @@ void ComputerMonitoringView::runFeature( const Feature& feature ) // stop already active or all other active mode features if( currentFeature.testFlag( Feature::Flag::Mode ) && ( alreadyActive || currentFeature != feature ) ) { - m_master->featureManager().stopFeature( *m_master, currentFeature, computerControlInterfaces ); + VeyonCore::featureManager().stopFeature( *m_master, currentFeature, computerControlInterfaces ); const auto subFeatures = m_master->subFeatures( currentFeature.uid() ); for( const auto& subFeature : subFeatures ) { - m_master->featureManager().stopFeature( *m_master, subFeature, computerControlInterfaces ); + VeyonCore::featureManager().stopFeature( *m_master, subFeature, computerControlInterfaces ); } } } @@ -225,7 +225,7 @@ void ComputerMonitoringView::runFeature( const Feature& feature ) if( alreadyActive == false ) { - m_master->featureManager().startFeature( *m_master, feature, computerControlInterfaces ); + VeyonCore::featureManager().startFeature( *m_master, feature, computerControlInterfaces ); } } @@ -234,7 +234,7 @@ void ComputerMonitoringView::runFeature( const Feature& feature ) bool ComputerMonitoringView::isFeatureOrRelatedFeatureActive( const ComputerControlInterfaceList& computerControlInterfaces, Feature::Uid featureUid ) const { - const auto& relatedFeatures = m_master->featureManager().relatedFeatures( featureUid ); + const auto& relatedFeatures = VeyonCore::featureManager().relatedFeatures( featureUid ); for( const auto& controlInterface : computerControlInterfaces ) { diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 2e295fcda..eefd9a5c9 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -202,7 +202,7 @@ void ComputerMonitoringWidget::populateFeatureMenu( const ComputerControlInterfa continue; } - Plugin::Uid pluginUid = master()->featureManager().pluginUid( feature.uid() ); + Plugin::Uid pluginUid = VeyonCore::featureManager().pluginUid( feature.uid() ); if( previousPluginUid.isNull() == false && pluginUid != previousPluginUid && @@ -259,7 +259,7 @@ void ComputerMonitoringWidget::addSubFeaturesToMenu( const Feature& parentFeatur void ComputerMonitoringWidget::runDoubleClickFeature( const QModelIndex& index ) { - const Feature& feature = master()->featureManager().feature( VeyonCore::config().computerDoubleClickFeature() ); + const Feature& feature = VeyonCore::featureManager().feature( VeyonCore::config().computerDoubleClickFeature() ); if( index.isValid() && feature.isValid() ) { diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index d3660eaa0..55086a33b 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -105,7 +105,7 @@ void DocumentationFigureCreator::createFeatureFigures() for( const auto& feature : features ) { auto btn = toolbar->findChild( feature.name() ); - const auto pluginUid = m_master.featureManager().pluginUid( feature.uid() ); + const auto pluginUid = VeyonCore::featureManager().pluginUid( feature.uid() ); if( previousPluginUid.isNull() ) { @@ -292,7 +292,7 @@ void DocumentationFigureCreator::createPowerDownTimeInputDialogFigure() grabDialog( dialog, {}, QStringLiteral("PowerDownTimeInputDialog.png") ); }); - m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "352de795-7fc4-4850-bc57-525bcb7033f5" ) ) ); + m_master.runFeature( VeyonCore::featureManager().feature( Feature::Uid( "352de795-7fc4-4850-bc57-525bcb7033f5" ) ) ); } @@ -309,7 +309,7 @@ void DocumentationFigureCreator::createUserLoginDialogFigure() grabDialog( dialog, {}, QStringLiteral("UserLoginDialog.png") ); }); - m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "7310707d-3918-460d-a949-65bd152cb958" ) ) ); + m_master.runFeature( VeyonCore::featureManager().feature( Feature::Uid( "7310707d-3918-460d-a949-65bd152cb958" ) ) ); } @@ -324,7 +324,7 @@ void DocumentationFigureCreator::createTextMessageDialogFigure() grabDialog( dialog, {}, QStringLiteral("TextMessageDialog.png") ); }); - m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "e75ae9c8-ac17-4d00-8f0d-019348346208" ) ) ); + m_master.runFeature( VeyonCore::featureManager().feature( Feature::Uid( "e75ae9c8-ac17-4d00-8f0d-019348346208" ) ) ); } @@ -339,7 +339,7 @@ void DocumentationFigureCreator::createOpenWebsiteDialogFigure() grabDialog( dialog, {}, QStringLiteral("OpenWebsiteDialog.png") ); }); - m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "8a11a75d-b3db-48b6-b9cb-f8422ddd5b0c" ) ) ); + m_master.runFeature( VeyonCore::featureManager().feature( Feature::Uid( "8a11a75d-b3db-48b6-b9cb-f8422ddd5b0c" ) ) ); } @@ -370,7 +370,7 @@ void DocumentationFigureCreator::createStartAppDialogFigure() grabDialog( dialog, {}, QStringLiteral("StartAppDialog.png") ); }); - m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "da9ca56a-b2ad-4fff-8f8a-929b2927b442" ) ) ); + m_master.runFeature( VeyonCore::featureManager().feature( Feature::Uid( "da9ca56a-b2ad-4fff-8f8a-929b2927b442" ) ) ); } @@ -401,7 +401,7 @@ void DocumentationFigureCreator::createRemoteAccessHostDialogFigure() grabDialog( dialog, {}, QStringLiteral("RemoteAccessHostDialog.png") ); } ); - m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "a18e545b-1321-4d4e-ac34-adc421c6e9c8" ) ) ); + m_master.runFeature( VeyonCore::featureManager().feature( Feature::Uid( "a18e545b-1321-4d4e-ac34-adc421c6e9c8" ) ) ); } @@ -447,7 +447,7 @@ void DocumentationFigureCreator::createRemoteAccessWindowFigure() } ); } ); - m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "ca00ad68-1709-4abe-85e2-48dff6ccf8a2" ) ) ); + m_master.runFeature( VeyonCore::featureManager().feature( Feature::Uid( "ca00ad68-1709-4abe-85e2-48dff6ccf8a2" ) ) ); m_eventLoop.exec(); } @@ -482,7 +482,7 @@ void DocumentationFigureCreator::createFileTransferDialogFigure() } ); } ); - m_master.runFeature( m_master.featureManager().feature( Feature::Uid( "4a70bd5a-fab2-4a4b-a92a-a1e81d2b75ed" ) ) ); + m_master.runFeature( VeyonCore::featureManager().feature( Feature::Uid( "4a70bd5a-fab2-4a4b-a92a-a1e81d2b75ed" ) ) ); } diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index e177adb8d..70601bdf0 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -332,7 +332,7 @@ void MainWindow::closeEvent( QCloseEvent* event ) { if( m_master.currentMode() != VeyonCore::builtinFeatures().monitoringMode().feature().uid() ) { - const Feature& activeFeature = m_master.featureManager().feature( m_master.currentMode() ); + const Feature& activeFeature = VeyonCore::featureManager().feature( m_master.currentMode() ); QMessageBox::information( this, tr( "Feature active" ), tr( "The feature \"%1\" is still active. Please stop it before closing %2." ). diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index ea79a505a..f9521e2bf 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -47,7 +47,6 @@ VeyonMaster::VeyonMaster( QObject* parent ) : VeyonMasterInterface( parent ), m_userConfig( new UserConfig( Configuration::Store::JsonFile ) ), - m_featureManager( new FeatureManager() ), m_features( featureList() ), m_featureListModel( new FeatureListModel( this ) ), m_computerManager( new ComputerManager( *m_userConfig, this ) ), @@ -70,7 +69,7 @@ VeyonMaster::VeyonMaster( QObject* parent ) : connect( &m_localSessionControlInterface, &ComputerControlInterface::featureMessageReceived, this, [=]( const FeatureMessage& featureMessage, const ComputerControlInterface::Pointer& computerControlInterface ) { - m_featureManager->handleFeatureMessage( computerControlInterface, featureMessage ); + VeyonCore::featureManager().handleFeatureMessage( computerControlInterface, featureMessage ); } ); m_localSessionControlInterface.start(); @@ -91,8 +90,6 @@ VeyonMaster::~VeyonMaster() m_userConfig->flushStore(); delete m_userConfig; - - delete m_featureManager; } @@ -105,7 +102,7 @@ FeatureList VeyonMaster::subFeatures( Feature::Uid parentFeatureUid ) const return {}; } - const auto& relatedFeatures = m_featureManager->relatedFeatures( parentFeatureUid ); + const auto& relatedFeatures = VeyonCore::featureManager().relatedFeatures( parentFeatureUid ); FeatureList subFeatures; subFeatures.reserve( relatedFeatures.size() ); @@ -221,22 +218,22 @@ void VeyonMaster::runFeature( const Feature& feature ) stopAllFeatures( computerControlInterfaces ); if( m_currentMode == feature.uid() || - subFeatures( feature.uid() ).contains( m_featureManager->feature( m_currentMode ) ) ) + subFeatures( feature.uid() ).contains( VeyonCore::featureManager().feature( m_currentMode ) ) ) { const Feature& monitoringModeFeature = VeyonCore::builtinFeatures().monitoringMode().feature(); - m_featureManager->startFeature( *this, monitoringModeFeature, computerControlInterfaces ); + VeyonCore::featureManager().startFeature( *this, monitoringModeFeature, computerControlInterfaces ); m_currentMode = monitoringModeFeature.uid(); } else { - m_featureManager->startFeature( *this, feature, computerControlInterfaces ); + VeyonCore::featureManager().startFeature( *this, feature, computerControlInterfaces ); m_currentMode = feature.uid(); } } else { - m_featureManager->startFeature( *this, feature, computerControlInterfaces ); + VeyonCore::featureManager().startFeature( *this, feature, computerControlInterfaces ); } } @@ -251,9 +248,10 @@ void VeyonMaster::enforceDesignatedMode( const QModelIndex& index ) if( designatedModeFeature != VeyonCore::builtinFeatures().monitoringMode().feature().uid() && controlInterface->activeFeatures().contains( designatedModeFeature ) == false && - controlInterface->activeFeatures().contains( m_featureManager->metaFeatureUid(designatedModeFeature) ) == false ) + controlInterface->activeFeatures().contains( VeyonCore::featureManager().metaFeatureUid(designatedModeFeature) ) == false ) { - featureManager().startFeature( *this, m_featureManager->feature(designatedModeFeature), { controlInterface } ); + VeyonCore::featureManager().startFeature( *this, VeyonCore::featureManager().feature(designatedModeFeature), + { controlInterface } ); } } } @@ -266,7 +264,7 @@ void VeyonMaster::stopAllFeatures( const ComputerControlInterfaceList& computerC for( const auto& feature : features ) { - m_featureManager->stopFeature( *this, feature, computerControlInterfaces ); + VeyonCore::featureManager().stopFeature( *this, feature, computerControlInterfaces ); } } @@ -368,7 +366,7 @@ FeatureList VeyonMaster::featureList() const { for( const auto& pluginUid : pluginUids ) { - for( const auto& feature : m_featureManager->features( pluginUid ) ) + for( const auto& feature : VeyonCore::featureManager().features( pluginUid ) ) { if( feature.testFlag( Feature::Flag::Master ) && feature.testFlag( Feature::Flag::Meta ) == false && diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index cab49366e..144e30849 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -40,7 +40,6 @@ class BuiltinFeatures; class ComputerControlListModel; class ComputerManager; class ComputerMonitoringModel; -class FeatureManager; class MainWindow; class UserConfig; @@ -53,11 +52,6 @@ class VeyonMaster : public VeyonMasterInterface explicit VeyonMaster( QObject* parent = nullptr ); ~VeyonMaster() override; - FeatureManager& featureManager() - { - return *m_featureManager; - } - UserConfig& userConfig() { return *m_userConfig; @@ -151,7 +145,6 @@ public Q_SLOTS: FeatureList featureList() const; UserConfig* m_userConfig; - FeatureManager* m_featureManager; const FeatureList m_features; FeatureListModel* m_featureListModel{nullptr}; ComputerManager* m_computerManager; diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index d920cc365..22fbcc429 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -28,6 +28,7 @@ #include "BuiltinFeatures.h" #include "ComputerControlClient.h" #include "ComputerControlServer.h" +#include "FeatureManager.h" #include "FeatureMessage.h" #include "HostAddress.h" #include "VeyonConfiguration.h" @@ -36,7 +37,7 @@ ComputerControlServer::ComputerControlServer( QObject* parent ) : QObject( parent ), - m_featureWorkerManager( *this, m_featureManager ), + m_featureWorkerManager( *this ), m_serverAuthenticationManager( this ), m_serverAccessControlManager( m_featureWorkerManager, VeyonCore::builtinFeatures().desktopAccessDialog(), this ), m_vncProxyServer( VeyonCore::config().localConnectOnly() || AccessControlProvider().isAccessToLocalComputerDenied() ? @@ -120,7 +121,7 @@ bool ComputerControlServer::handleFeatureMessage( QTcpSocket* socket ) featureMessage.receive( socket ); - return m_featureManager.handleFeatureMessage( *this, MessageContext( socket ), featureMessage ); + return VeyonCore::featureManager().handleFeatureMessage( *this, MessageContext{socket}, featureMessage ); } diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index bea1f583f..5e1370b8b 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -27,7 +27,6 @@ #include #include -#include "FeatureManager.h" #include "FeatureWorkerManager.h" #include "ServerAuthenticationManager.h" #include "ServerAccessControlManager.h" @@ -64,11 +63,6 @@ class ComputerControlServer : public QObject, VncProxyConnectionFactory, VeyonSe bool sendFeatureMessageReply( const MessageContext& context, const FeatureMessage& reply ) override; - FeatureManager& featureManager() override - { - return m_featureManager; - } - FeatureWorkerManager& featureWorkerManager() override { return m_featureWorkerManager; @@ -95,7 +89,6 @@ class ComputerControlServer : public QObject, VncProxyConnectionFactory, VeyonSe QStringList m_failedAuthHosts{}; QStringList m_failedAccessControlHosts{}; - FeatureManager m_featureManager; FeatureWorkerManager m_featureWorkerManager; ServerAuthenticationManager m_serverAuthenticationManager; diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index f1de66eb3..c90f7729e 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -31,12 +31,10 @@ FeatureWorkerManagerConnection::FeatureWorkerManagerConnection( VeyonWorkerInterface& worker, - FeatureManager& featureManager, Feature::Uid featureUid, QObject* parent ) : QObject( parent ), m_worker( worker ), - m_featureManager( featureManager ), m_socket( this ), m_featureUid( featureUid ) { @@ -97,7 +95,7 @@ void FeatureWorkerManagerConnection::receiveMessage() { if( featureMessage.receive( &m_socket ) ) { - m_featureManager.handleFeatureMessage( m_worker, featureMessage ); + VeyonCore::featureManager().handleFeatureMessage( m_worker, featureMessage ); } } } diff --git a/worker/src/FeatureWorkerManagerConnection.h b/worker/src/FeatureWorkerManagerConnection.h index 4755fa8c9..852c0d8d2 100644 --- a/worker/src/FeatureWorkerManagerConnection.h +++ b/worker/src/FeatureWorkerManagerConnection.h @@ -38,7 +38,6 @@ class FeatureWorkerManagerConnection : public QObject Q_OBJECT public: FeatureWorkerManagerConnection( VeyonWorkerInterface& worker, - FeatureManager& featureManager, Feature::Uid featureUid, QObject* parent = nullptr ); @@ -53,7 +52,6 @@ class FeatureWorkerManagerConnection : public QObject void receiveMessage(); VeyonWorkerInterface& m_worker; - FeatureManager& m_featureManager; QTcpSocket m_socket; Feature::Uid m_featureUid; QTimer m_connectTimer{this}; diff --git a/worker/src/VeyonWorker.cpp b/worker/src/VeyonWorker.cpp index 610615f67..d65e32feb 100644 --- a/worker/src/VeyonWorker.cpp +++ b/worker/src/VeyonWorker.cpp @@ -24,6 +24,7 @@ #include +#include "FeatureManager.h" #include "FeatureWorkerManagerConnection.h" #include "VeyonConfiguration.h" #include "VeyonWorker.h" @@ -37,7 +38,7 @@ VeyonWorker::VeyonWorker( QUuid featureUid, QObject* parent ) : { const Feature* workerFeature = nullptr; - for( const auto& feature : m_featureManager.features() ) + for( const auto& feature : VeyonCore::featureManager().features() ) { if( feature.uid() == featureUid ) { @@ -55,7 +56,7 @@ VeyonWorker::VeyonWorker( QUuid featureUid, QObject* parent ) : qFatal( "Specified feature is disabled by configuration!" ); } - m_workerManagerConnection = new FeatureWorkerManagerConnection( *this, m_featureManager, featureUid, this ); + m_workerManagerConnection = new FeatureWorkerManagerConnection( *this, featureUid, this ); vInfo() << "Running worker for feature" << workerFeature->name(); } diff --git a/worker/src/VeyonWorker.h b/worker/src/VeyonWorker.h index 0db84cc9b..220945e52 100644 --- a/worker/src/VeyonWorker.h +++ b/worker/src/VeyonWorker.h @@ -24,7 +24,6 @@ #pragma once -#include "FeatureManager.h" #include "VeyonWorkerInterface.h" class FeatureWorkerManagerConnection; @@ -44,7 +43,6 @@ class VeyonWorker : public QObject, VeyonWorkerInterface private: VeyonCore m_core; - FeatureManager m_featureManager{}; FeatureWorkerManagerConnection* m_workerManagerConnection{nullptr}; } ; From 413424c571532a7dbf8373ea36f1cdeb5eb1c890 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 Nov 2021 10:56:29 +0100 Subject: [PATCH 1194/1765] CCI: forward messages to FeatureManager directly Now that a global FeatureManager instance is available, we can forward feature messages to the FeatureManager directly and save the signalling overhead. --- core/src/ComputerControlInterface.cpp | 5 ++++- core/src/ComputerControlInterface.h | 1 - master/src/ComputerControlListModel.cpp | 5 ----- master/src/VeyonMaster.cpp | 5 ----- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index a26390b6c..32425bed8 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -26,6 +26,7 @@ #include "ComputerControlInterface.h" #include "Computer.h" #include "FeatureControl.h" +#include "FeatureManager.h" #include "MonitoringMode.h" #include "VeyonConfiguration.h" #include "VeyonConnection.h" @@ -395,7 +396,9 @@ void ComputerControlInterface::updateUser() void ComputerControlInterface::handleFeatureMessage( const FeatureMessage& message ) { - Q_EMIT featureMessageReceived( message, weakPointer() ); + lock(); + VeyonCore::featureManager().handleFeatureMessage( weakPointer(), message ); + unlock(); } diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 42d3d089c..ecc5646f0 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -207,7 +207,6 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QStringList m_groups; Q_SIGNALS: - void featureMessageReceived( const FeatureMessage&, ComputerControlInterface::Pointer ); void screenSizeChanged(); void screenUpdated( QRect rect ); void scaledScreenUpdated(); diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 8d0d1a26d..b47fc3083 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -379,11 +379,6 @@ void ComputerControlListModel::startComputerControlInterface( ComputerControlInt { controlInterface->start( computerScreenSize(), ComputerControlInterface::UpdateMode::Monitoring ); - connect( controlInterface, &ComputerControlInterface::featureMessageReceived, this, - [=]( const FeatureMessage& featureMessage, const ComputerControlInterface::Pointer& computerControlInterface ) { - VeyonCore::featureManager().handleFeatureMessage( computerControlInterface, featureMessage ); - } ); - connect( controlInterface, &ComputerControlInterface::screenSizeChanged, this, &ComputerControlListModel::updateComputerScreenSize ); diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index f9521e2bf..e5d387454 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -67,11 +67,6 @@ VeyonMaster::VeyonMaster( QObject* parent ) : this, &VeyonMaster::enforceDesignatedMode ); } - connect( &m_localSessionControlInterface, &ComputerControlInterface::featureMessageReceived, - this, [=]( const FeatureMessage& featureMessage, const ComputerControlInterface::Pointer& computerControlInterface ) { - VeyonCore::featureManager().handleFeatureMessage( computerControlInterface, featureMessage ); - } ); - m_localSessionControlInterface.start(); initUserInterface(); From b1e8d0074ce30eb3e0a0622bbdb9e2153dc34607 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 11 Nov 2021 07:19:26 +0100 Subject: [PATCH 1195/1765] RemoteAccess: add display selection support Closes #620. --- plugins/remoteaccess/RemoteAccessWidget.cpp | 33 ++++++++++++++++++ plugins/remoteaccess/RemoteAccessWidget.h | 4 ++- ...nces-system-windows-effect-desktopgrid.png | Bin 0 -> 2551 bytes plugins/remoteaccess/remoteaccess.qrc | 1 + 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 plugins/remoteaccess/preferences-system-windows-effect-desktopgrid.png diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 1791e485e..8751c6009 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -30,6 +30,7 @@ #include "rfb/keysym.h" #include "RemoteAccessWidget.h" +#include "RemoteAccessFeaturePlugin.h" #include "VncViewWidget.h" #include "VeyonConfiguration.h" #include "VeyonConnection.h" @@ -48,6 +49,7 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent m_parent( parent ), m_showHideTimeLine( ShowHideAnimationDuration, this ), m_viewOnlyButton( showViewOnlyToggleButton ? new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/kmag.png") ), tr( "View only" ), tr( "Remote control" ) ) : nullptr ), + m_selectDisplayButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/preferences-system-windows-effect-desktopgrid.png") ), tr( "Select display" ) ) ), m_sendShortcutButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/preferences-desktop-keyboard.png") ), tr( "Send shortcut" ) ) ), m_screenshotButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/camera-photo.png") ), tr( "Screenshot" ) ) ), m_fullScreenButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/view-fullscreen.png") ), tr( "Fullscreen" ), tr( "Window" ) ) ), @@ -79,6 +81,11 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent auto vncView = parent->vncView(); connect( vncView->connection(), &VncConnection::stateChanged, this, &RemoteAccessWidgetToolBar::updateConnectionState ); + m_selectDisplayButton->hide(); + m_selectDisplayButton->setMenu( new QMenu ); + m_selectDisplayButton->setPopupMode( QToolButton::InstantPopup ); + m_selectDisplayButton->setObjectName( QStringLiteral("displays") ); + auto shortcutMenu = new QMenu(); shortcutMenu->addAction( tr( "Ctrl+Alt+Del" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlAltDel ); } ); shortcutMenu->addAction( tr( "Ctrl+Esc" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlEscape ); } ); @@ -97,6 +104,7 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent layout->setContentsMargins( 1, 1, 1, 1 ); layout->setSpacing( 1 ); layout->addStretch( 0 ); + layout->addWidget( m_selectDisplayButton ); layout->addWidget( m_sendShortcutButton ); if( m_viewOnlyButton ) { @@ -110,6 +118,9 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent setFixedHeight( m_exitButton->height() ); connect( &m_showHideTimeLine, &QTimeLine::valueChanged, this, &RemoteAccessWidgetToolBar::updatePosition ); + + connect( vncView->computerControlInterface().data(), &ComputerControlInterface::displaysChanged, + this, &RemoteAccessWidgetToolBar::updateDisplays ); } @@ -195,6 +206,8 @@ void RemoteAccessWidgetToolBar::updateConnectionState() if( m_parent->vncView()->connection()->state() == VncConnection::State::Connected ) { disappear(); + + m_parent->vncView()->computerControlInterface()->updateDisplays(); } else { @@ -204,6 +217,26 @@ void RemoteAccessWidgetToolBar::updateConnectionState() +void RemoteAccessWidgetToolBar::updateDisplays() +{ + const auto displays = m_parent->vncView()->computerControlInterface()->displays(); + m_selectDisplayButton->setVisible(displays.size() > 1); + if(displays.size() > 1) + { + auto menu = m_selectDisplayButton->menu(); + menu->clear(); + menu->addAction( tr( "All displays" ), this, [=]() { m_parent->vncView()->setViewport({}); } ); + menu->addSeparator(); + for (const auto& display : displays) + { + menu->addAction( tr("Display %1 [%2]").arg(display.index).arg(display.name), + this, [=]() { m_parent->vncView()->setViewport(display.geometry); }); + } + } +} + + + RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& computerControlInterface, bool startViewOnly, bool showViewOnlyToggleButton ) : QWidget( nullptr ), diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index 0f03ed43f..acd93ec9d 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -55,11 +55,13 @@ class RemoteAccessWidgetToolBar : public QWidget private: void updatePosition(); void updateConnectionState(); + void updateDisplays(); - RemoteAccessWidget * m_parent; + RemoteAccessWidget *m_parent; QTimeLine m_showHideTimeLine; ToolButton* m_viewOnlyButton; + ToolButton* m_selectDisplayButton; ToolButton* m_sendShortcutButton; ToolButton* m_screenshotButton; ToolButton* m_fullScreenButton; diff --git a/plugins/remoteaccess/preferences-system-windows-effect-desktopgrid.png b/plugins/remoteaccess/preferences-system-windows-effect-desktopgrid.png new file mode 100644 index 0000000000000000000000000000000000000000..647bb1707d9ae65c0d12ffe7592eedabd97e8b54 GIT binary patch literal 2551 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 literal 0 HcmV?d00001 diff --git a/plugins/remoteaccess/remoteaccess.qrc b/plugins/remoteaccess/remoteaccess.qrc index c80082527..5728bdd73 100644 --- a/plugins/remoteaccess/remoteaccess.qrc +++ b/plugins/remoteaccess/remoteaccess.qrc @@ -1,6 +1,7 @@ view-fullscreen.png + preferences-system-windows-effect-desktopgrid.png application-exit.png krdc.png kmag.png From aa495f068f9c6be75b5ddfe383c28003ba203acc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 11 Nov 2021 07:28:56 +0100 Subject: [PATCH 1196/1765] Add missing includes --- configurator/src/MainWindow.cpp | 1 + worker/src/VeyonWorker.h | 1 + worker/src/main.cpp | 2 ++ 3 files changed, 4 insertions(+) diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index b3b76ecd6..5a8e69444 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include "Configuration/JsonStore.h" #include "Configuration/UiMapping.h" diff --git a/worker/src/VeyonWorker.h b/worker/src/VeyonWorker.h index 220945e52..e00bcf61b 100644 --- a/worker/src/VeyonWorker.h +++ b/worker/src/VeyonWorker.h @@ -24,6 +24,7 @@ #pragma once +#include "VeyonCore.h" #include "VeyonWorkerInterface.h" class FeatureWorkerManagerConnection; diff --git a/worker/src/main.cpp b/worker/src/main.cpp index 12dbece27..8bb1e51ac 100644 --- a/worker/src/main.cpp +++ b/worker/src/main.cpp @@ -23,7 +23,9 @@ */ #include +#include +#include "Feature.h" #include "VeyonWorker.h" From 26f97136ca11d74eafda526e79b5ba645c04ce23 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 15 Nov 2021 12:55:14 +0100 Subject: [PATCH 1197/1765] CI: drop Fedora 33 and add Fedora 35 --- .ci/{linux.fedora.33 => linux.fedora.35}/Dockerfile | 2 +- .ci/{linux.fedora.33 => linux.fedora.35}/script.sh | 2 +- .gitlab-ci.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename .ci/{linux.fedora.33 => linux.fedora.35}/Dockerfile (97%) rename .ci/{linux.fedora.33 => linux.fedora.35}/script.sh (58%) diff --git a/.ci/linux.fedora.33/Dockerfile b/.ci/linux.fedora.35/Dockerfile similarity index 97% rename from .ci/linux.fedora.33/Dockerfile rename to .ci/linux.fedora.35/Dockerfile index 31f122003..dcbcc854f 100644 --- a/.ci/linux.fedora.33/Dockerfile +++ b/.ci/linux.fedora.35/Dockerfile @@ -1,4 +1,4 @@ -FROM fedora:33 +FROM fedora:35 MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.fedora.33/script.sh b/.ci/linux.fedora.35/script.sh similarity index 58% rename from .ci/linux.fedora.33/script.sh rename to .ci/linux.fedora.35/script.sh index df83b4682..ee43eab11 100755 --- a/.ci/linux.fedora.33/script.sh +++ b/.ci/linux.fedora.35/script.sh @@ -3,4 +3,4 @@ set -e $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "fc33" +$1/.ci/common/finalize-rpm.sh $1 $2 "fc35" diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d13897229..e02ebabdc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,8 +14,8 @@ build-linux: - centos.8.3 - debian.buster - debian.bullseye - - fedora.33 - fedora.34 + - fedora.35 - opensuse.15.2 - opensuse.15.3 - ubuntu.bionic From d892f6179e95eca1efe25806e65d816d8310b87d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 15 Nov 2021 12:57:16 +0100 Subject: [PATCH 1198/1765] CI: bump to CentOS 8.4 (21.05) --- .ci/{linux.centos.8.3 => linux.centos.8.4}/Dockerfile | 2 +- .ci/{linux.centos.8.3 => linux.centos.8.4}/script.sh | 2 +- .gitlab-ci.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename .ci/{linux.centos.8.3 => linux.centos.8.4}/Dockerfile (97%) rename .ci/{linux.centos.8.3 => linux.centos.8.4}/script.sh (55%) diff --git a/.ci/linux.centos.8.3/Dockerfile b/.ci/linux.centos.8.4/Dockerfile similarity index 97% rename from .ci/linux.centos.8.3/Dockerfile rename to .ci/linux.centos.8.4/Dockerfile index 6d6f525cd..11d04a04b 100644 --- a/.ci/linux.centos.8.3/Dockerfile +++ b/.ci/linux.centos.8.4/Dockerfile @@ -1,4 +1,4 @@ -FROM centos:8.3.2011 +FROM centos:8.4.2105 MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.centos.8.3/script.sh b/.ci/linux.centos.8.4/script.sh similarity index 55% rename from .ci/linux.centos.8.3/script.sh rename to .ci/linux.centos.8.4/script.sh index 6c6d42088..b785c3cc7 100755 --- a/.ci/linux.centos.8.3/script.sh +++ b/.ci/linux.centos.8.4/script.sh @@ -3,4 +3,4 @@ set -e $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "centos-8.3" +$1/.ci/common/finalize-rpm.sh $1 $2 "centos-8.4" diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e02ebabdc..d5ad5f43d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,7 +11,7 @@ build-linux: matrix: - DISTRO: - centos.7.9 - - centos.8.3 + - centos.8.4 - debian.buster - debian.bullseye - fedora.34 From 7f6dc7acf3207d24df98cabd966a611f70c6f208 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 15 Nov 2021 13:11:19 +0100 Subject: [PATCH 1199/1765] CI: update GitHub Actions --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3969c2109..dba7fda03 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,9 +4,9 @@ jobs: strategy: matrix: dist: - - centos.8.3 + - centos.8.4 - debian.buster - - fedora.34 + - fedora.35 - opensuse.15.2 - ubuntu.focal runs-on: ubuntu-latest From 14cac058076e0578a02355cf3af8d02e21487377 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 15 Nov 2021 13:26:30 +0100 Subject: [PATCH 1200/1765] CI: disable PCH for CentOS 8.4 again There seem to be PCH-related issues with GCC 8.4.1. --- .ci/linux.centos.8.4/script.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.ci/linux.centos.8.4/script.sh b/.ci/linux.centos.8.4/script.sh index b785c3cc7..73ae9e519 100755 --- a/.ci/linux.centos.8.4/script.sh +++ b/.ci/linux.centos.8.4/script.sh @@ -2,5 +2,7 @@ set -e +export CMAKE_FLAGS="-DWITH_PCH=OFF" + $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "centos-8.4" From 3183b9666cfa61ad8f25e40c0b7cd7af7a85db31 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 15 Nov 2021 14:47:13 +0100 Subject: [PATCH 1201/1765] RemoteAccessWidget: check item of selected display --- plugins/remoteaccess/RemoteAccessWidget.cpp | 23 +++++++++++++++++---- plugins/remoteaccess/RemoteAccessWidget.h | 4 ++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 8751c6009..a381f126e 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -21,6 +21,7 @@ * USA. */ +#include #include #include #include @@ -53,7 +54,8 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent m_sendShortcutButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/preferences-desktop-keyboard.png") ), tr( "Send shortcut" ) ) ), m_screenshotButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/camera-photo.png") ), tr( "Screenshot" ) ) ), m_fullScreenButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/view-fullscreen.png") ), tr( "Fullscreen" ), tr( "Window" ) ) ), - m_exitButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/application-exit.png") ), tr( "Exit" ) ) ) + m_exitButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/application-exit.png") ), tr( "Exit" ) ) ), + m_displaySelectActions( new QActionGroup(this) ) { QPalette pal = palette(); pal.setBrush( QPalette::Window, QPixmap( QStringLiteral(":/core/toolbar-background.png") ) ); @@ -225,12 +227,25 @@ void RemoteAccessWidgetToolBar::updateDisplays() { auto menu = m_selectDisplayButton->menu(); menu->clear(); - menu->addAction( tr( "All displays" ), this, [=]() { m_parent->vncView()->setViewport({}); } ); + + const auto showAllDisplays = menu->addAction( tr( "All displays" ), this, [=]() { + m_parent->vncView()->setViewport({}); + }); + + m_displaySelectActions->addAction(showAllDisplays); + showAllDisplays->setCheckable(true); + showAllDisplays->setChecked(true); + menu->addSeparator(); + for (const auto& display : displays) { - menu->addAction( tr("Display %1 [%2]").arg(display.index).arg(display.name), - this, [=]() { m_parent->vncView()->setViewport(display.geometry); }); + const auto action = menu->addAction( tr("Display %1 [%2]").arg(display.index).arg(display.name), + this, [=]() { + m_parent->vncView()->setViewport(display.geometry); + }); + action->setCheckable(true); + m_displaySelectActions->addAction(action); } } } diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index acd93ec9d..57fa78272 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -28,6 +28,8 @@ #include #include +class QActionGroup; + class VncViewWidget; class RemoteAccessWidget; class ToolButton; @@ -67,6 +69,8 @@ class RemoteAccessWidgetToolBar : public QWidget ToolButton* m_fullScreenButton; ToolButton* m_exitButton; + QActionGroup* m_displaySelectActions{nullptr}; + static constexpr int ShowHideAnimationDuration = 300; static constexpr int DisappearDelay = 500; From aba5b55f14e7d493077a20eaca34fc3e1f6f7068 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 15 Nov 2021 14:54:09 +0100 Subject: [PATCH 1202/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 9d8dfcb3d..fc9259e15 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 9d8dfcb3d8f46fd1253271c4a63a04b2bc534486 +Subproject commit fc9259e159af6913c4a9dd624665018c1aeacd89 From 36476892ee3b2095ea88bd9421264cbfafd2f9e5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 15 Nov 2021 14:59:30 +0100 Subject: [PATCH 1203/1765] RemoteAccessWidget: update displays if already connected When starting remote view/control from within Veyon Master, the connection is already established so RemoteAccessWidgetToolBar::updateConnectionState() is never called. --- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index a381f126e..f33eb2061 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -123,6 +123,8 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent connect( vncView->computerControlInterface().data(), &ComputerControlInterface::displaysChanged, this, &RemoteAccessWidgetToolBar::updateDisplays ); + + vncView->computerControlInterface()->updateDisplays(); } From c299acf536e8a525534a6cbbbbf31b5060037d13 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Nov 2021 13:52:07 +0100 Subject: [PATCH 1204/1765] CCI: add locking and connection check in updateDisplays() --- core/src/ComputerControlInterface.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 32425bed8..066230bd1 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -207,7 +207,18 @@ void ComputerControlInterface::setUserInformation( const QString& userLoginName, void ComputerControlInterface::updateDisplays() { - VeyonCore::builtinFeatures().monitoringMode().queryDisplays( { weakPointer() } ); + lock(); + + if( vncConnection() && state() == State::Connected ) + { + VeyonCore::builtinFeatures().monitoringMode().queryDisplays( { weakPointer() } ); + } + else + { + setDisplays( {} ); + } + + unlock(); } From 67c6ad18f2ca36983e243b540de03eb74fa81173 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Nov 2021 13:52:53 +0100 Subject: [PATCH 1205/1765] CCI: update displays on every state change --- core/src/ComputerControlInterface.cpp | 1 + plugins/remoteaccess/RemoteAccessWidget.cpp | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 066230bd1..91f73073f 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -96,6 +96,7 @@ void ComputerControlInterface::start( QSize scaledScreenSize, UpdateMode updateM connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateUser ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateActiveFeatures ); + connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateDisplays ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::stateChanged ); connect( m_connection, &VeyonConnection::featureMessageReceived, this, &ComputerControlInterface::handleFeatureMessage ); diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index f33eb2061..0189b359f 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -123,8 +123,6 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent connect( vncView->computerControlInterface().data(), &ComputerControlInterface::displaysChanged, this, &RemoteAccessWidgetToolBar::updateDisplays ); - - vncView->computerControlInterface()->updateDisplays(); } @@ -210,8 +208,6 @@ void RemoteAccessWidgetToolBar::updateConnectionState() if( m_parent->vncView()->connection()->state() == VncConnection::State::Connected ) { disappear(); - - m_parent->vncView()->computerControlInterface()->updateDisplays(); } else { From 2cfc5cfb6f79be1669a033721f9910d63eafa173 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Nov 2021 13:59:42 +0100 Subject: [PATCH 1206/1765] CCI: update displays periodically --- core/src/ComputerControlInterface.cpp | 7 ++++++- core/src/ComputerControlInterface.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 91f73073f..dad6c189c 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -44,7 +44,8 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in m_connection( nullptr ), m_connectionWatchdogTimer( this ), m_userUpdateTimer( this ), - m_activeFeaturesUpdateTimer( this ) + m_activeFeaturesUpdateTimer( this ), + m_displaysUpdateTimer( this ) { m_connectionWatchdogTimer.setInterval( ConnectionWatchdogTimeout ); m_connectionWatchdogTimer.setSingleShot( true ); @@ -52,6 +53,7 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in connect( &m_userUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateUser ); connect( &m_activeFeaturesUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateActiveFeatures ); + connect( &m_displaysUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateDisplays ); } @@ -122,6 +124,7 @@ void ComputerControlInterface::stop() m_connection = nullptr; } + m_displaysUpdateTimer.stop(); m_activeFeaturesUpdateTimer.stop(); m_userUpdateTimer.stop(); m_connectionWatchdogTimer.stop(); @@ -303,6 +306,7 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) m_userUpdateTimer.stop(); m_activeFeaturesUpdateTimer.start( UpdateIntervalDisabled ); + m_displaysUpdateTimer.stop(); break; case UpdateMode::Basic: @@ -317,6 +321,7 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) m_userUpdateTimer.start( computerMonitoringUpdateInterval ); m_activeFeaturesUpdateTimer.start( computerMonitoringUpdateInterval ); + m_displaysUpdateTimer.start( computerMonitoringUpdateInterval ); break; } diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index ecc5646f0..23345d801 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -203,6 +203,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QTimer m_connectionWatchdogTimer; QTimer m_userUpdateTimer; QTimer m_activeFeaturesUpdateTimer; + QTimer m_displaysUpdateTimer; QStringList m_groups; From f9a4e8aa9ee858c02bdd5c0c0cdb28ebd0b0fcc9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Nov 2021 22:18:29 +0100 Subject: [PATCH 1207/1765] PlatformCoreFunctions: add queryDisplayDeviceName() --- core/src/PlatformCoreFunctions.h | 4 + plugins/platform/linux/LinuxCoreFunctions.cpp | 19 +++++ plugins/platform/linux/LinuxCoreFunctions.h | 2 + .../platform/windows/WindowsCoreFunctions.cpp | 82 +++++++++++++++++++ .../platform/windows/WindowsCoreFunctions.h | 2 + 5 files changed, 109 insertions(+) diff --git a/core/src/PlatformCoreFunctions.h b/core/src/PlatformCoreFunctions.h index 688c3eda2..78ab6380f 100644 --- a/core/src/PlatformCoreFunctions.h +++ b/core/src/PlatformCoreFunctions.h @@ -31,6 +31,8 @@ // clazy:excludeall=copyable-polymorphic +class QScreen; + class PlatformCoreFunctions { public: @@ -63,4 +65,6 @@ class PlatformCoreFunctions virtual QString genericUrlHandler() const = 0; + virtual QString queryDisplayDeviceName(const QScreen& screen) const = 0; + }; diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index cb1a28469..20adab8a1 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -279,6 +280,24 @@ QString LinuxCoreFunctions::genericUrlHandler() const +QString LinuxCoreFunctions::queryDisplayDeviceName(const QScreen& screen) const +{ + QStringList nameParts; +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) + nameParts.append(screen.manufacturer()); + nameParts.append(screen.model()); +#endif + nameParts.removeAll({}); + if(nameParts.isEmpty()) + { + return screen.name(); + } + + return QStringLiteral("%1 [%2]").arg(nameParts.join(QLatin1Char(' ')), screen.name()); +} + + + bool LinuxCoreFunctions::prepareSessionBusAccess() { const auto uid = LinuxUserFunctions::userIdFromName( VeyonCore::platform().userFunctions().currentUser() ); diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index eb83235f1..26f555934 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -64,6 +64,8 @@ class LinuxCoreFunctions : public PlatformCoreFunctions QString genericUrlHandler() const override; + QString queryDisplayDeviceName(const QScreen& screen) const; + using DBusInterfacePointer = QSharedPointer; static bool prepareSessionBusAccess(); diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 62d524eea..f496f8a4d 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -23,6 +23,7 @@ */ #include +#include #include #include @@ -32,6 +33,7 @@ #include "VeyonConfiguration.h" #include "WindowsCoreFunctions.h" #include "WindowsPlatformConfiguration.h" +#include "WindowsPlatformPlugin.h" #include "WtsSessionManager.h" #include "XEventLog.h" @@ -327,6 +329,86 @@ QString WindowsCoreFunctions::genericUrlHandler() const +QString WindowsCoreFunctions::queryDisplayDeviceName(const QScreen& screen) const +{ + if(screen.name().isEmpty()) + { + return {}; + } + + const auto screenDeviceName = toConstWCharArray(screen.name()); + + UINT32 requiredPaths, requiredModes; + GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &requiredPaths, &requiredModes); + std::vector paths(requiredPaths); + std::vector modes(requiredModes); + QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &requiredPaths, paths.data(), &requiredModes, modes.data(), nullptr); + + for(const auto& p : paths) + { + DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName{}; + sourceName.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME; + sourceName.header.size = sizeof(sourceName); + sourceName.header.adapterId = p.sourceInfo.adapterId; + sourceName.header.id = p.sourceInfo.id; + DisplayConfigGetDeviceInfo(&sourceName.header); + + if(wcscmp(screenDeviceName, sourceName.viewGdiDeviceName) == 0) + { + DISPLAYCONFIG_TARGET_DEVICE_NAME name{}; + name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME; + name.header.size = sizeof(name); + name.header.adapterId = p.sourceInfo.adapterId; + name.header.id = p.targetInfo.id; + DisplayConfigGetDeviceInfo(&name.header); + + const auto monitorFriendlyDeviceName = QString::fromWCharArray(name.monitorFriendlyDeviceName); + if(monitorFriendlyDeviceName.isEmpty()) + { + switch(name.outputTechnology) + { + case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI: + return QStringLiteral("HDMI-%1").arg(name.connectorInstance); + case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI: + return QStringLiteral("DVI-%1").arg(name.connectorInstance); + case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED: + return QStringLiteral("eDP-%1").arg(name.connectorInstance); + case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL: + return QStringLiteral("DP-%1").arg(name.connectorInstance); + case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS: + return QStringLiteral("LVDS-%1").arg(name.connectorInstance); + case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST: + return QStringLiteral("Miracast-%1").arg(name.connectorInstance); + case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO: + return QStringLiteral("S-Video-%1").arg(name.connectorInstance); + case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL: + return WindowsPlatformPlugin::tr("Internal display") + + ( name.connectorInstance > 1 ? + QStringLiteral(" %2").arg(name.connectorInstance) : QString{} ); + default: + // use display device string as fallback + break; + } + } + else + { + return monitorFriendlyDeviceName; + } + } + } + + DISPLAY_DEVICE displayDevice{}; + displayDevice.cb = sizeof(displayDevice); + if(EnumDisplayDevices(screenDeviceName, 0, &displayDevice, 0)) + { + return QString::fromWCharArray(displayDevice.DeviceString); + } + + return {}; +} + + + bool WindowsCoreFunctions::enablePrivilege( LPCWSTR privilegeName, bool enable ) { HANDLE token; diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index 0fc73b54d..c609aef29 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -67,6 +67,8 @@ class WindowsCoreFunctions : public PlatformCoreFunctions QString genericUrlHandler() const override; + QString queryDisplayDeviceName(const QScreen& screen) const override; + static bool enablePrivilege( LPCWSTR privilegeName, bool enable ); static QSharedPointer toWCharArray( const QString& qstring ); From dd3f625c4ed70c3389bd316806c45f3a26c11c32 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Nov 2021 22:18:47 +0100 Subject: [PATCH 1208/1765] WindowsPlatformPlugin: create invisible dummy window Create invisible dummy window to make the Qt Windows platform plugin receive WM_DISPLAYCHANGE events and update the screens returned by QGuiApplication::screens() even if the current Veyon component such as the Veyon Server does not create a window. --- plugins/platform/windows/WindowsPlatformPlugin.cpp | 11 +++++++++++ plugins/platform/windows/WindowsPlatformPlugin.h | 3 +++ 2 files changed, 14 insertions(+) diff --git a/plugins/platform/windows/WindowsPlatformPlugin.cpp b/plugins/platform/windows/WindowsPlatformPlugin.cpp index 11ee1f534..1a8755c36 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.cpp +++ b/plugins/platform/windows/WindowsPlatformPlugin.cpp @@ -22,12 +22,23 @@ * */ +#include +#include + #include "WindowsPlatformPlugin.h" #include "WindowsPlatformConfigurationPage.h" WindowsPlatformPlugin::WindowsPlatformPlugin( QObject* parent ) : QObject( parent ) { + if( qobject_cast(QCoreApplication::instance()) ) + { + // create invisible dummy window to make the Qt Windows platform plugin receive + // WM_DISPLAYCHANGE events and update the screens returned by QGuiApplication::screens() + // even if the current Veyon component such as the Veyon Server does not create a window + m_dummyWindow = new QWindow; + m_dummyWindow->create(); + } } diff --git a/plugins/platform/windows/WindowsPlatformPlugin.h b/plugins/platform/windows/WindowsPlatformPlugin.h index 8893e67b3..1ebbb0ed3 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.h +++ b/plugins/platform/windows/WindowsPlatformPlugin.h @@ -35,6 +35,8 @@ #include "WindowsSessionFunctions.h" #include "WindowsUserFunctions.h" +class QWindow; + class WindowsPlatformPlugin : public QObject, PlatformPluginInterface, PluginInterface, ConfigurationPagePluginInterface { Q_OBJECT @@ -124,5 +126,6 @@ class WindowsPlatformPlugin : public QObject, PlatformPluginInterface, PluginInt WindowsServiceFunctions m_windowsServiceFunctions{}; WindowsSessionFunctions m_windowsSessionFunctions{}; WindowsUserFunctions m_windowsUserFunctions{}; + QWindow* m_dummyWindow{nullptr}; }; From 3a8448010d2207fd1f8fea0aa501b5b9d69ecdec Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Nov 2021 22:19:42 +0100 Subject: [PATCH 1209/1765] MonitoringMode: use PlatformCoreFunctions::queryDisplayDeviceName() --- core/src/MonitoringMode.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 430c2f376..d2cfa2218 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -27,6 +27,7 @@ #include #include "MonitoringMode.h" +#include "PlatformCoreFunctions.h" #include "PlatformSessionFunctions.h" #include "PlatformUserFunctions.h" #include "VeyonServerInterface.h" @@ -147,7 +148,8 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, { QVariantMap displayInfo; displayInfo[QStringLiteral("index")] = index; - displayInfo[QStringLiteral("name")] = screen->name(); + displayInfo[QStringLiteral("name")] = VeyonCore::platform().coreFunctions(). + queryDisplayDeviceName(*screen); displayInfo[QStringLiteral("geometry")] = screen->geometry(); displayInfoList.append(displayInfo); ++index; From 832ac44459c55a8889523ea62f9d0349d56fa6c4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Nov 2021 22:25:00 +0100 Subject: [PATCH 1210/1765] Demo: use PlatformCoreFunctions::queryDisplayDeviceName() --- plugins/demo/DemoFeaturePlugin.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 98af776a2..ac3669d40 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -34,6 +34,7 @@ #include "FeatureWorkerManager.h" #include "HostAddress.h" #include "Logger.h" +#include "PlatformCoreFunctions.h" #include "PlatformSessionFunctions.h" #include "VeyonConfiguration.h" #include "VeyonMasterInterface.h" @@ -511,15 +512,13 @@ void DemoFeaturePlugin::updateFeatures() { const auto name = QStringLiteral( "DemoScreen%1" ).arg( index ); - auto displayName = tr( "Screen %1 [%2]" ).arg( index ).arg( screen->name() ); + auto displayName = tr("Display %1").arg(index); -#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) - if( screen->manufacturer().isEmpty() == false && - screen->model().isEmpty() == false ) + const auto displayDeviceName = VeyonCore::platform().coreFunctions().queryDisplayDeviceName(*screen); + if(displayDeviceName.isEmpty() == false) { - displayName += QStringLiteral(" – %1 %2").arg( screen->manufacturer(), screen->model() ); + displayName.append(QStringLiteral(" (%1)").arg(displayDeviceName)); } -#endif auto flags = Feature::Flag::Option | Feature::Flag::Master; if( index == m_screenSelection ) From 53be3b737cb0be5ea016e68e909a4570229f8965 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Nov 2021 22:25:52 +0100 Subject: [PATCH 1211/1765] RemoteAccessWidget: handle dynamic display changes Update viewport and checked items. --- plugins/remoteaccess/RemoteAccessWidget.cpp | 38 +++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 0189b359f..0a0941c59 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -83,11 +83,12 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent auto vncView = parent->vncView(); connect( vncView->connection(), &VncConnection::stateChanged, this, &RemoteAccessWidgetToolBar::updateConnectionState ); - m_selectDisplayButton->hide(); m_selectDisplayButton->setMenu( new QMenu ); m_selectDisplayButton->setPopupMode( QToolButton::InstantPopup ); m_selectDisplayButton->setObjectName( QStringLiteral("displays") ); + updateDisplays(); + auto shortcutMenu = new QMenu(); shortcutMenu->addAction( tr( "Ctrl+Alt+Del" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlAltDel ); } ); shortcutMenu->addAction( tr( "Ctrl+Esc" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlEscape ); } ); @@ -219,32 +220,57 @@ void RemoteAccessWidgetToolBar::updateConnectionState() void RemoteAccessWidgetToolBar::updateDisplays() { + const auto checkedDisplayName = m_displaySelectActions->checkedAction() ? + m_displaySelectActions->checkedAction()->text() : QString{}; + const auto displays = m_parent->vncView()->computerControlInterface()->displays(); m_selectDisplayButton->setVisible(displays.size() > 1); + + const auto menu = m_selectDisplayButton->menu(); + menu->clear(); + if(displays.size() > 1) { - auto menu = m_selectDisplayButton->menu(); - menu->clear(); - const auto showAllDisplays = menu->addAction( tr( "All displays" ), this, [=]() { m_parent->vncView()->setViewport({}); }); m_displaySelectActions->addAction(showAllDisplays); showAllDisplays->setCheckable(true); - showAllDisplays->setChecked(true); + showAllDisplays->setChecked(checkedDisplayName.isEmpty() || + checkedDisplayName == showAllDisplays->text()); menu->addSeparator(); for (const auto& display : displays) { - const auto action = menu->addAction( tr("Display %1 [%2]").arg(display.index).arg(display.name), + const auto action = menu->addAction( + tr("Display %1").arg(display.index) + ( display.name.isEmpty() ? QString{} : + QStringLiteral(" (%1)").arg(display.name) ), this, [=]() { m_parent->vncView()->setViewport(display.geometry); }); action->setCheckable(true); + if(action->text() == checkedDisplayName) + { + action->setChecked(true); + } m_displaySelectActions->addAction(action); } + + if(m_displaySelectActions->checkedAction()) + { + m_displaySelectActions->checkedAction()->trigger(); + } + else + { + showAllDisplays->setChecked(true); + showAllDisplays->trigger(); + } + } + else + { + m_parent->vncView()->setViewport({}); } } From f8497418ebbdac56643a0fa2fa355e6ac278a37f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 17 Nov 2021 13:43:50 +0100 Subject: [PATCH 1212/1765] VeyonCore: add screenName() --- core/src/VeyonCore.cpp | 15 +++++++++++++++ core/src/VeyonCore.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 1f27145c5..fda0ebe15 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -486,6 +486,21 @@ QString VeyonCore::stringify( const QVariantMap& map ) +QString VeyonCore::screenName(const QScreen& screen, int index) +{ + auto screenName = tr("Screen %1").arg(index); + + const auto displayDeviceName = platform().coreFunctions().queryDisplayDeviceName(screen); + if(displayDeviceName.isEmpty() == false) + { + screenName.append(QStringLiteral(" – %1").arg(displayDeviceName)); + } + + return screenName; +} + + + int VeyonCore::exec() { Q_EMIT applicationLoaded(); diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 39e4d6853..b1c8283af 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -42,6 +42,7 @@ #endif class QCoreApplication; +class QScreen; class QSslConfiguration; class QWidget; @@ -189,6 +190,8 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject static QString formattedUuid( QUuid uuid ); static QString stringify( const QVariantMap& map ); + static QString screenName( const QScreen& screen, int index ); + int exec(); private: From 51d1c9d4791be067027a9cb0e24fda210505328e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 17 Nov 2021 13:44:58 +0100 Subject: [PATCH 1213/1765] Demo: use VeyonCore::screenName() --- plugins/demo/DemoFeaturePlugin.cpp | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index ac3669d40..6bf0c79b8 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -34,7 +34,6 @@ #include "FeatureWorkerManager.h" #include "HostAddress.h" #include "Logger.h" -#include "PlatformCoreFunctions.h" #include "PlatformSessionFunctions.h" #include "VeyonConfiguration.h" #include "VeyonMasterInterface.h" @@ -511,14 +510,7 @@ void DemoFeaturePlugin::updateFeatures() for( auto screen : qAsConst(m_screens) ) { const auto name = QStringLiteral( "DemoScreen%1" ).arg( index ); - - auto displayName = tr("Display %1").arg(index); - - const auto displayDeviceName = VeyonCore::platform().coreFunctions().queryDisplayDeviceName(*screen); - if(displayDeviceName.isEmpty() == false) - { - displayName.append(QStringLiteral(" (%1)").arg(displayDeviceName)); - } + const auto screenName = VeyonCore::screenName(*screen, index); auto flags = Feature::Flag::Option | Feature::Flag::Master; if( index == m_screenSelection ) @@ -528,7 +520,7 @@ void DemoFeaturePlugin::updateFeatures() m_screenSelectionFeatures.append( Feature{ name, flags, Feature::Uid::createUuidV5( m_demoFeature.uid(), name ), - m_demoFeature.uid(), displayName, {}, {}, {} } ); + m_demoFeature.uid(), screenName, {}, {}, {} } ); ++index; } } From 469c150aa5e8b986801dbd50c30546f5f022e0ad Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 17 Nov 2021 13:45:50 +0100 Subject: [PATCH 1214/1765] RemoteAccessWidget: use supplied screen name directly --- plugins/remoteaccess/RemoteAccessWidget.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 0a0941c59..632c6b5be 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -244,12 +244,9 @@ void RemoteAccessWidgetToolBar::updateDisplays() for (const auto& display : displays) { - const auto action = menu->addAction( - tr("Display %1").arg(display.index) + ( display.name.isEmpty() ? QString{} : - QStringLiteral(" (%1)").arg(display.name) ), - this, [=]() { - m_parent->vncView()->setViewport(display.geometry); - }); + const auto action = menu->addAction(display.name, this, [=]() { + m_parent->vncView()->setViewport(display.geometry); + }); action->setCheckable(true); if(action->text() == checkedDisplayName) { From 0cd1c8830d395569ab627c80e7bd85df84cb06e6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 17 Nov 2021 13:54:17 +0100 Subject: [PATCH 1215/1765] Uniformly refer to screens as such --- core/src/ComputerControlInterface.cpp | 26 ++++----- core/src/ComputerControlInterface.h | 20 +++---- core/src/MonitoringMode.cpp | 55 +++++++++---------- core/src/MonitoringMode.h | 7 ++- plugins/remoteaccess/RemoteAccessWidget.cpp | 60 ++++++++++----------- plugins/remoteaccess/RemoteAccessWidget.h | 6 +-- 6 files changed, 85 insertions(+), 89 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index dad6c189c..a69d3750f 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -45,7 +45,7 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in m_connectionWatchdogTimer( this ), m_userUpdateTimer( this ), m_activeFeaturesUpdateTimer( this ), - m_displaysUpdateTimer( this ) + m_screensUpdateTimer( this ) { m_connectionWatchdogTimer.setInterval( ConnectionWatchdogTimeout ); m_connectionWatchdogTimer.setSingleShot( true ); @@ -53,7 +53,7 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in connect( &m_userUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateUser ); connect( &m_activeFeaturesUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateActiveFeatures ); - connect( &m_displaysUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateDisplays ); + connect( &m_screensUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateScreens ); } @@ -98,7 +98,7 @@ void ComputerControlInterface::start( QSize scaledScreenSize, UpdateMode updateM connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateUser ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateActiveFeatures ); - connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateDisplays ); + connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateScreens ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::stateChanged ); connect( m_connection, &VeyonConnection::featureMessageReceived, this, &ComputerControlInterface::handleFeatureMessage ); @@ -124,7 +124,7 @@ void ComputerControlInterface::stop() m_connection = nullptr; } - m_displaysUpdateTimer.stop(); + m_screensUpdateTimer.stop(); m_activeFeaturesUpdateTimer.stop(); m_userUpdateTimer.stop(); m_connectionWatchdogTimer.stop(); @@ -209,17 +209,17 @@ void ComputerControlInterface::setUserInformation( const QString& userLoginName, -void ComputerControlInterface::updateDisplays() +void ComputerControlInterface::updateScreens() { lock(); if( vncConnection() && state() == State::Connected ) { - VeyonCore::builtinFeatures().monitoringMode().queryDisplays( { weakPointer() } ); + VeyonCore::builtinFeatures().monitoringMode().queryScreens( { weakPointer() } ); } else { - setDisplays( {} ); + setScreens({}); } unlock(); @@ -227,13 +227,13 @@ void ComputerControlInterface::updateDisplays() -void ComputerControlInterface::setDisplays( const DisplayList& displays ) +void ComputerControlInterface::setScreens(const ScreenList& screens) { - if( displays != m_displays ) + if(screens != m_screens) { - m_displays = displays; + m_screens = screens; - Q_EMIT displaysChanged(); + Q_EMIT screensChanged(); } } @@ -306,7 +306,7 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) m_userUpdateTimer.stop(); m_activeFeaturesUpdateTimer.start( UpdateIntervalDisabled ); - m_displaysUpdateTimer.stop(); + m_screensUpdateTimer.stop(); break; case UpdateMode::Basic: @@ -321,7 +321,7 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) m_userUpdateTimer.start( computerMonitoringUpdateInterval ); m_activeFeaturesUpdateTimer.start( computerMonitoringUpdateInterval ); - m_displaysUpdateTimer.start( computerMonitoringUpdateInterval ); + m_screensUpdateTimer.start( computerMonitoringUpdateInterval ); break; } diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 23345d801..10cb7d3e2 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -45,18 +45,18 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab using State = VncConnection::State; - struct DisplayProperties { + struct ScreenProperties { int index; QString name; QRect geometry; - bool operator==(const DisplayProperties& other) + bool operator==(const ScreenProperties& other) { return other.index == index && other.name == name && other.geometry == geometry; } }; - using DisplayList = QList; + using ScreenList = QList; explicit ComputerControlInterface( const Computer& computer, int port = -1, QObject* parent = nullptr ); ~ComputerControlInterface() override; @@ -121,14 +121,14 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void setUserInformation( const QString& userLoginName, const QString& userFullName, int sessionId ); - void updateDisplays(); + void updateScreens(); - const DisplayList& displays() const + const ScreenList& screens() const { - return m_displays; + return m_screens; } - void setDisplays( const DisplayList& displays ); + void setScreens(const ScreenList& screens); const FeatureUidList& activeFeatures() const { @@ -192,7 +192,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QString m_userLoginName; QString m_userFullName; int m_userSessionId{0}; - DisplayList m_displays; + ScreenList m_screens; FeatureUidList m_activeFeatures; Feature::Uid m_designatedModeFeature; @@ -203,7 +203,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QTimer m_connectionWatchdogTimer; QTimer m_userUpdateTimer; QTimer m_activeFeaturesUpdateTimer; - QTimer m_displaysUpdateTimer; + QTimer m_screensUpdateTimer; QStringList m_groups; @@ -212,7 +212,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void screenUpdated( QRect rect ); void scaledScreenUpdated(); void userChanged(); - void displaysChanged(); + void screensChanged(); void stateChanged(); void activeFeaturesChanged(); diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index d2cfa2218..62f98aa5a 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -27,7 +27,6 @@ #include #include "MonitoringMode.h" -#include "PlatformCoreFunctions.h" #include "PlatformSessionFunctions.h" #include "PlatformUserFunctions.h" #include "VeyonServerInterface.h" @@ -46,11 +45,11 @@ MonitoringMode::MonitoringMode( QObject* parent ) : Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Worker | Feature::Flag::Builtin, Feature::Uid( "79a5e74d-50bd-4aab-8012-0e70dc08cc72" ), Feature::Uid(), {}, {}, {} ), - m_queryDisplaysFeature( QStringLiteral("QueryDisplays"), + m_queryScreensFeature( QStringLiteral("QueryScreens"), Feature::Flag::Meta, Feature::Uid("d5bbc486-7bc5-4c36-a9a8-1566c8b0091a"), - Feature::Uid(), tr("Query properties of attached displays"), {}, {} ), - m_features( { m_monitoringModeFeature, m_queryLoggedOnUserInfoFeature, m_queryDisplaysFeature } ) + Feature::Uid(), tr("Query properties of remotely available screens"), {}, {} ), + m_features( { m_monitoringModeFeature, m_queryLoggedOnUserInfoFeature, m_queryScreensFeature } ) { } @@ -64,9 +63,9 @@ void MonitoringMode::queryLoggedOnUserInfo( const ComputerControlInterfaceList& -void MonitoringMode::queryDisplays(const ComputerControlInterfaceList& computerControlInterfaces) +void MonitoringMode::queryScreens(const ComputerControlInterfaceList& computerControlInterfaces) { - sendFeatureMessage( FeatureMessage{m_queryDisplaysFeature.uid(), FeatureMessage::DefaultCommand}, + sendFeatureMessage( FeatureMessage{m_queryScreensFeature.uid(), FeatureMessage::DefaultCommand}, computerControlInterfaces ); } @@ -84,24 +83,24 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com return true; } - if( message.featureUid() == m_queryDisplaysFeature.uid() ) + if( message.featureUid() == m_queryScreensFeature.uid() ) { - const auto displayInfoList = message.argument(Argument::DisplayInfoList).toList(); + const auto screenInfoList = message.argument(Argument::ScreenInfoList).toList(); - ComputerControlInterface::DisplayList displays; - displays.reserve(displayInfoList.size()); + ComputerControlInterface::ScreenList screens; + screens.reserve(screenInfoList.size()); - for(int i = 0; i < displayInfoList.size(); ++i) + for(int i = 0; i < screenInfoList.size(); ++i) { - const auto displayInfo = displayInfoList.at(i).toMap(); - ComputerControlInterface::DisplayProperties displayProperties; - displayProperties.index = i + 1; - displayProperties.name = displayInfo.value(QStringLiteral("name")).toString(); - displayProperties.geometry = displayInfo.value(QStringLiteral("geometry")).toRect(); - displays.append(displayProperties); + const auto screenInfo = screenInfoList.at(i).toMap(); + ComputerControlInterface::ScreenProperties screenProperties; + screenProperties.index = i + 1; + screenProperties.name = screenInfo.value(QStringLiteral("name")).toString(); + screenProperties.geometry = screenInfo.value(QStringLiteral("geometry")).toRect(); + screens.append(screenProperties); } - computerControlInterface->setDisplays(displays); + computerControlInterface->setScreens(screens); } return false; @@ -136,28 +135,26 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, return server.sendFeatureMessageReply( messageContext, reply ); } - if( message.featureUid() == m_queryDisplaysFeature.uid() ) + if( message.featureUid() == m_queryScreensFeature.uid() ) { const auto screens = QGuiApplication::screens(); - QVariantList displayInfoList; - displayInfoList.reserve(screens.size()); + QVariantList screenInfoList; + screenInfoList.reserve(screens.size()); int index = 1; for(const auto* screen : screens) { - QVariantMap displayInfo; - displayInfo[QStringLiteral("index")] = index; - displayInfo[QStringLiteral("name")] = VeyonCore::platform().coreFunctions(). - queryDisplayDeviceName(*screen); - displayInfo[QStringLiteral("geometry")] = screen->geometry(); - displayInfoList.append(displayInfo); + QVariantMap screenInfo; + screenInfo[QStringLiteral("name")] = VeyonCore::screenName(*screen, index); + screenInfo[QStringLiteral("geometry")] = screen->geometry(); + screenInfoList.append(screenInfo); ++index; } return server.sendFeatureMessageReply( messageContext, - FeatureMessage(m_queryDisplaysFeature.uid()) - .addArgument(Argument::DisplayInfoList, displayInfoList) ); + FeatureMessage(m_queryScreensFeature.uid()) + .addArgument(Argument::ScreenInfoList, screenInfoList) ); } return false; diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 626eea126..7ba5ba411 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -36,7 +36,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac UserLoginName, UserFullName, UserSessionId, - DisplayInfoList, + ScreenInfoList, }; Q_ENUM(Argument) @@ -84,7 +84,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ); - void queryDisplays( const ComputerControlInterfaceList& computerControlInterfaces ); + void queryScreens( const ComputerControlInterfaceList& computerControlInterfaces ); bool controlFeature( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ) override @@ -104,13 +104,12 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac const MessageContext& messageContext, const FeatureMessage& message ) override; - private: void queryUserInformation(); const Feature m_monitoringModeFeature; const Feature m_queryLoggedOnUserInfoFeature; - const Feature m_queryDisplaysFeature; + const Feature m_queryScreensFeature; const FeatureList m_features; QReadWriteLock m_userDataLock; diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 632c6b5be..24ad4807e 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -50,12 +50,12 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent m_parent( parent ), m_showHideTimeLine( ShowHideAnimationDuration, this ), m_viewOnlyButton( showViewOnlyToggleButton ? new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/kmag.png") ), tr( "View only" ), tr( "Remote control" ) ) : nullptr ), - m_selectDisplayButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/preferences-system-windows-effect-desktopgrid.png") ), tr( "Select display" ) ) ), + m_selectScreenButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/preferences-system-windows-effect-desktopgrid.png") ), tr( "Select screen" ) ) ), m_sendShortcutButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/preferences-desktop-keyboard.png") ), tr( "Send shortcut" ) ) ), m_screenshotButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/camera-photo.png") ), tr( "Screenshot" ) ) ), m_fullScreenButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/view-fullscreen.png") ), tr( "Fullscreen" ), tr( "Window" ) ) ), m_exitButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/application-exit.png") ), tr( "Exit" ) ) ), - m_displaySelectActions( new QActionGroup(this) ) + m_screenSelectActions( new QActionGroup(this) ) { QPalette pal = palette(); pal.setBrush( QPalette::Window, QPixmap( QStringLiteral(":/core/toolbar-background.png") ) ); @@ -83,11 +83,11 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent auto vncView = parent->vncView(); connect( vncView->connection(), &VncConnection::stateChanged, this, &RemoteAccessWidgetToolBar::updateConnectionState ); - m_selectDisplayButton->setMenu( new QMenu ); - m_selectDisplayButton->setPopupMode( QToolButton::InstantPopup ); - m_selectDisplayButton->setObjectName( QStringLiteral("displays") ); + m_selectScreenButton->setMenu( new QMenu ); + m_selectScreenButton->setPopupMode( QToolButton::InstantPopup ); + m_selectScreenButton->setObjectName( QStringLiteral("screens") ); - updateDisplays(); + updateScreens(); auto shortcutMenu = new QMenu(); shortcutMenu->addAction( tr( "Ctrl+Alt+Del" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlAltDel ); } ); @@ -107,7 +107,7 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent layout->setContentsMargins( 1, 1, 1, 1 ); layout->setSpacing( 1 ); layout->addStretch( 0 ); - layout->addWidget( m_selectDisplayButton ); + layout->addWidget( m_selectScreenButton ); layout->addWidget( m_sendShortcutButton ); if( m_viewOnlyButton ) { @@ -122,8 +122,8 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent connect( &m_showHideTimeLine, &QTimeLine::valueChanged, this, &RemoteAccessWidgetToolBar::updatePosition ); - connect( vncView->computerControlInterface().data(), &ComputerControlInterface::displaysChanged, - this, &RemoteAccessWidgetToolBar::updateDisplays ); + connect( vncView->computerControlInterface().data(), &ComputerControlInterface::screensChanged, + this, &RemoteAccessWidgetToolBar::updateScreens ); } @@ -218,51 +218,51 @@ void RemoteAccessWidgetToolBar::updateConnectionState() -void RemoteAccessWidgetToolBar::updateDisplays() +void RemoteAccessWidgetToolBar::updateScreens() { - const auto checkedDisplayName = m_displaySelectActions->checkedAction() ? - m_displaySelectActions->checkedAction()->text() : QString{}; + const auto checkedScreenName = m_screenSelectActions->checkedAction() ? + m_screenSelectActions->checkedAction()->text() : QString{}; - const auto displays = m_parent->vncView()->computerControlInterface()->displays(); - m_selectDisplayButton->setVisible(displays.size() > 1); + const auto screens = m_parent->vncView()->computerControlInterface()->screens(); + m_selectScreenButton->setVisible(screens.size() > 1); - const auto menu = m_selectDisplayButton->menu(); + const auto menu = m_selectScreenButton->menu(); menu->clear(); - if(displays.size() > 1) + if(screens.size() > 1) { - const auto showAllDisplays = menu->addAction( tr( "All displays" ), this, [=]() { + const auto showAllScreens = menu->addAction( tr( "All screens" ), this, [=]() { m_parent->vncView()->setViewport({}); }); - m_displaySelectActions->addAction(showAllDisplays); - showAllDisplays->setCheckable(true); - showAllDisplays->setChecked(checkedDisplayName.isEmpty() || - checkedDisplayName == showAllDisplays->text()); + m_screenSelectActions->addAction(showAllScreens); + showAllScreens->setCheckable(true); + showAllScreens->setChecked(checkedScreenName.isEmpty() || + checkedScreenName == showAllScreens->text()); menu->addSeparator(); - for (const auto& display : displays) + for (const auto& screen : screens) { - const auto action = menu->addAction(display.name, this, [=]() { - m_parent->vncView()->setViewport(display.geometry); + const auto action = menu->addAction(screen.name, this, [=]() { + m_parent->vncView()->setViewport(screen.geometry); }); action->setCheckable(true); - if(action->text() == checkedDisplayName) + if(action->text() == checkedScreenName) { action->setChecked(true); } - m_displaySelectActions->addAction(action); + m_screenSelectActions->addAction(action); } - if(m_displaySelectActions->checkedAction()) + if(m_screenSelectActions->checkedAction()) { - m_displaySelectActions->checkedAction()->trigger(); + m_screenSelectActions->checkedAction()->trigger(); } else { - showAllDisplays->setChecked(true); - showAllDisplays->trigger(); + showAllScreens->setChecked(true); + showAllScreens->trigger(); } } else diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index 57fa78272..eef8243e3 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -57,19 +57,19 @@ class RemoteAccessWidgetToolBar : public QWidget private: void updatePosition(); void updateConnectionState(); - void updateDisplays(); + void updateScreens(); RemoteAccessWidget *m_parent; QTimeLine m_showHideTimeLine; ToolButton* m_viewOnlyButton; - ToolButton* m_selectDisplayButton; + ToolButton* m_selectScreenButton; ToolButton* m_sendShortcutButton; ToolButton* m_screenshotButton; ToolButton* m_fullScreenButton; ToolButton* m_exitButton; - QActionGroup* m_displaySelectActions{nullptr}; + QActionGroup* m_screenSelectActions{nullptr}; static constexpr int ShowHideAnimationDuration = 300; static constexpr int DisappearDelay = 500; From 64cb8b6690f2b86befd73ddd278fb929c648a2d7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 17 Nov 2021 13:56:06 +0100 Subject: [PATCH 1216/1765] WindowsCoreFunctions: improve queryDisplayDeviceName() Always append name of physical output to device name if available similar to the implementation in LinuxCoreFunctions. --- .../platform/windows/WindowsCoreFunctions.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index f496f8a4d..2f3637c4a 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -363,8 +363,7 @@ QString WindowsCoreFunctions::queryDisplayDeviceName(const QScreen& screen) cons DisplayConfigGetDeviceInfo(&name.header); const auto monitorFriendlyDeviceName = QString::fromWCharArray(name.monitorFriendlyDeviceName); - if(monitorFriendlyDeviceName.isEmpty()) - { + const auto outputName = [&]() -> QString { switch(name.outputTechnology) { case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI: @@ -386,13 +385,22 @@ QString WindowsCoreFunctions::queryDisplayDeviceName(const QScreen& screen) cons ( name.connectorInstance > 1 ? QStringLiteral(" %2").arg(name.connectorInstance) : QString{} ); default: - // use display device string as fallback break; } + return {}; + }(); + if(monitorFriendlyDeviceName.isEmpty()) + { + if(outputName.isEmpty() == false) + { + return outputName; + } + // use display device string as fallback } else { - return monitorFriendlyDeviceName; + return monitorFriendlyDeviceName + + ( outputName.isEmpty() ? QString {} : QStringLiteral(" [%1]").arg(outputName) ); } } } From 840479f41ed349aa8002638bef0544d0ecb6c86a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 18 Nov 2021 21:39:31 +0100 Subject: [PATCH 1217/1765] Fix condition when to confirm execution for all computers As of f262da6024f956aa85a464e34615cfd3c1f99b97 we can easily determine the total number of visible (filtered) computers and compare it with the number of computers which to execute the feature for. Closes #774. --- plugins/powercontrol/PowerControlFeaturePlugin.cpp | 7 +++---- plugins/usersessioncontrol/UserSessionControlPlugin.cpp | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index e04e56e9f..c6292457e 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -178,11 +178,10 @@ bool PowerControlFeaturePlugin::startFeature( VeyonMasterInterface& master, cons return true; } - const auto selectionCount = master.selectedComputerControlInterfaces().size(); + const auto executeOnAllComputers = + computerControlInterfaces.size() >= master.filteredComputerControlInterfaces().size(); - if( confirmFeatureExecution( feature, - selectionCount == 0 || selectionCount == computerControlInterfaces.size(), - master.mainWindow() ) == false ) + if (confirmFeatureExecution(feature, executeOnAllComputers, master.mainWindow()) == false) { return false; } diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp index b84a0e706..b40670c5e 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp @@ -111,11 +111,10 @@ bool UserSessionControlPlugin::startFeature( VeyonMasterInterface& master, const } else if( feature == m_userLogoffFeature ) { - const auto selectionCount = master.selectedComputerControlInterfaces().size(); + const auto executeOnAllComputers = + computerControlInterfaces.size() >= master.filteredComputerControlInterfaces().size(); - if( confirmFeatureExecution( feature, - selectionCount == 0 || selectionCount == computerControlInterfaces.size(), - master.mainWindow() ) == false ) + if (confirmFeatureExecution(feature, executeOnAllComputers, master.mainWindow()) == false) { return true; } From 095fc0fd02fd5dee400a35a2d0a626009bd14ed4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 12:02:31 +0100 Subject: [PATCH 1218/1765] LinuxSessionFunctions: don't use XDG_SESSION_PATH Since XDG_SESSION_PATH does not contain a login1 DBus session path, we must not use it to retrieve the login1 DBus path of the current session. --- plugins/platform/linux/LinuxServiceCore.cpp | 2 +- plugins/platform/linux/LinuxSessionFunctions.cpp | 2 +- plugins/platform/linux/LinuxSessionFunctions.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index dc0e81b06..9cb430342 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -207,7 +207,7 @@ void LinuxServiceCore::startServer( const QString& sessionPath ) return; } - sessionEnvironment.insert( LinuxSessionFunctions::xdgSessionPathEnvVarName(), sessionPath ); + sessionEnvironment.insert( LinuxSessionFunctions::sessionPathEnvVarName(), sessionPath ); // if pam-systemd is not in use, we have to set the XDG_SESSION_ID environment variable manually if( sessionEnvironment.contains( LinuxSessionFunctions::xdgSessionIdEnvVarName() ) == false ) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index e96b4e70c..4a33c843f 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -287,7 +287,7 @@ QProcessEnvironment LinuxSessionFunctions::getSessionEnvironment( int sessionLea QString LinuxSessionFunctions::currentSessionPath() { - const auto xdgSessionPath = QProcessEnvironment::systemEnvironment().value( xdgSessionPathEnvVarName() ); + const auto xdgSessionPath = QProcessEnvironment::systemEnvironment().value( sessionPathEnvVarName() ); if( xdgSessionPath.isEmpty() ) { return QStringLiteral("/org/freedesktop/login1/session/self"); diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 9eb3d68c8..1b68439e9 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -106,9 +106,9 @@ class LinuxSessionFunctions : public PlatformSessionFunctions return QStringLiteral("XDG_SESSION_ID"); } - static QString xdgSessionPathEnvVarName() + static QString sessionPathEnvVarName() { - return QStringLiteral("XDG_SESSION_PATH"); + return QStringLiteral("VEYON_SESSION_PATH"); } static bool isOpen( const QString& session ); From d11ee30c21da570704bd45195b674258c94d387b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 12:13:58 +0100 Subject: [PATCH 1219/1765] LinuxSessionFunctions: fix DBus path to own session Since busctl get-property org.freedesktop.login1 /org/freedesktop/login1/session/auto org.freedesktop.login1.Session Class works, but busctl get-property org.freedesktop.login1 /org/freedesktop/login1/session/self org.freedesktop.login1.Session Class returns "Unknown object", we should go with "auto" as well. --- plugins/platform/linux/LinuxSessionFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 4a33c843f..c868124ac 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -290,7 +290,7 @@ QString LinuxSessionFunctions::currentSessionPath() const auto xdgSessionPath = QProcessEnvironment::systemEnvironment().value( sessionPathEnvVarName() ); if( xdgSessionPath.isEmpty() ) { - return QStringLiteral("/org/freedesktop/login1/session/self"); + return QStringLiteral("/org/freedesktop/login1/session/auto"); } return xdgSessionPath; From cfc6371ecb40b107e598570aa548e28a64380474 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 12:21:28 +0100 Subject: [PATCH 1220/1765] LinuxSessionFunctions: fall back to XDG_SESSION_CLASS When trying to determine the class of the current session, we can also evaluate XDG_SESSION_CLASS if the session property can't be queried. --- plugins/platform/linux/LinuxSessionFunctions.cpp | 7 ++++++- plugins/platform/linux/LinuxSessionFunctions.h | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index c868124ac..4d112ca86 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -161,7 +161,12 @@ qint64 LinuxSessionFunctions::getSessionUptimeSeconds( const QString& session ) LinuxSessionFunctions::Class LinuxSessionFunctions::getSessionClass( const QString& session ) { - const auto sessionClass = getSessionProperty( session, QStringLiteral("Class") ).toString(); + auto sessionClass = getSessionProperty(session, QStringLiteral("Class")).toString(); + if (sessionClass.isEmpty() && session == currentSessionPath()) + { + sessionClass = QProcessEnvironment::systemEnvironment().value(LinuxSessionFunctions::xdgSessionClassEnvVarName()); + } + if( sessionClass == QLatin1String("user") ) { return Class::User; diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 1b68439e9..c7a060e3d 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -106,6 +106,11 @@ class LinuxSessionFunctions : public PlatformSessionFunctions return QStringLiteral("XDG_SESSION_ID"); } + static QString xdgSessionClassEnvVarName() + { + return QStringLiteral("XDG_SESSION_CLASS"); + } + static QString sessionPathEnvVarName() { return QStringLiteral("VEYON_SESSION_PATH"); From 588a154cee6a9cb47ccc0f054297c9ee6456c773 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:07:01 +0100 Subject: [PATCH 1221/1765] FeatureMessage: log feature name instead of UID --- core/src/FeatureMessage.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/FeatureMessage.cpp b/core/src/FeatureMessage.cpp index cc219dbfa..04d780a84 100644 --- a/core/src/FeatureMessage.cpp +++ b/core/src/FeatureMessage.cpp @@ -22,6 +22,7 @@ * */ +#include "FeatureManager.h" #include "FeatureMessage.h" #include "VariantArrayMessage.h" @@ -83,7 +84,7 @@ bool FeatureMessage::receive( QIODevice* ioDevice ) QDebug operator<<(QDebug stream, const FeatureMessage& message) { stream << QStringLiteral("FeatureMessage(%1,%2,%3)") - .arg(VeyonCore::formattedUuid(message.featureUid())) + .arg(VeyonCore::featureManager().feature(message.featureUid()).name()) .arg(message.command()) .arg(VeyonCore::stringify(message.arguments())).toUtf8().constData(); return stream; From 5a4a1e9cf25dc2d6351897e556d7d795d8f7fec9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:07:50 +0100 Subject: [PATCH 1222/1765] FeatureManager: simplify log messages Since FeatureMessage already logs all relevant information, we do not have to log the feature UID or name again. --- core/src/FeatureManager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 7fdac3ca1..0c8412efa 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -217,7 +217,7 @@ void FeatureManager::updateActiveFeatures( const ComputerControlInterfaceList& c bool FeatureManager::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message ) const { - vDebug() << feature(message.featureUid()).name().toUtf8().constData() << message << computerControlInterface; + vDebug() << message << computerControlInterface; bool handled = false; @@ -238,7 +238,7 @@ bool FeatureManager::handleFeatureMessage( VeyonServerInterface& server, const MessageContext& messageContext, const FeatureMessage& message ) const { - vDebug() << feature(message.featureUid()).name().toUtf8().constData() << message; + vDebug() << "[SERVER]" << message; if( VeyonCore::config().disabledFeatures().contains( message.featureUid().toString() ) ) { @@ -263,7 +263,7 @@ bool FeatureManager::handleFeatureMessage( VeyonServerInterface& server, bool FeatureManager::handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) const { - vDebug() << feature(message.featureUid()).name().toUtf8().constData() << message; + vDebug() << "[WORKER]" << message; bool handled = false; From 2363dad834be6bf6d973fe13634fe61ecd32fc9d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:32:08 +0100 Subject: [PATCH 1223/1765] FeatureWorkerManager: log feature name instead of UID --- core/src/FeatureWorkerManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index 4c21216ab..fa143371a 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -90,7 +90,7 @@ bool FeatureWorkerManager::startManagedSystemWorker( Feature::Uid featureUid ) connect( worker.process, static_cast(&QProcess::finished), worker.process, &QProcess::deleteLater ); - vDebug() << "Starting managed system worker for feature" << featureUid; + vDebug() << "Starting managed system worker for feature" << VeyonCore::featureManager().feature(featureUid).name(); if( qEnvironmentVariableIsSet("VEYON_VALGRIND_WORKERS") ) { worker.process->start( QStringLiteral("valgrind"), From 2aa77329edc9f3747c5c4c1c89fcb48d1ff6a002 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:32:47 +0100 Subject: [PATCH 1224/1765] CCLM: prefer full name of user in tooltip --- master/src/ComputerControlListModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index b47fc3083..81e6ba459 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -561,7 +561,7 @@ QString ComputerControlListModel::loggedOnUserInformation( const ComputerControl auto user = controlInterface->userLoginName(); if( controlInterface->userFullName().isEmpty() == false ) { - user = QStringLiteral( "%1 (%2)" ).arg( user, controlInterface->userFullName() ); + user = QStringLiteral("%1 (%2)").arg(controlInterface->userFullName(), user); } return tr( "Logged on user: %1" ).arg( user ); From 64ecc801698774af948d203281879134b50dea09 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:33:37 +0100 Subject: [PATCH 1225/1765] ComputerZoomWidget: fall back to login name of user for window title --- master/src/ComputerZoomWidget.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 84dcf7c9d..a6f422042 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -69,14 +69,18 @@ ComputerZoomWidget::~ComputerZoomWidget() void ComputerZoomWidget::updateComputerZoomWidgetTitle() { - if ( m_vncView->computerControlInterface()->userFullName().isEmpty() ) + const auto username = m_vncView->computerControlInterface()->userFullName().isEmpty() ? + m_vncView->computerControlInterface()->userLoginName() : + m_vncView->computerControlInterface()->userFullName(); + + if (username.isEmpty()) { setWindowTitle( QStringLiteral( "%1 - %2" ).arg( m_vncView->computerControlInterface()->computer().name(), VeyonCore::applicationName() ) ); } else { - setWindowTitle( QStringLiteral( "%1 - %2 - %3" ).arg( m_vncView->computerControlInterface()->userFullName(), + setWindowTitle( QStringLiteral( "%1 - %2 - %3" ).arg( username, m_vncView->computerControlInterface()->computer().name(), VeyonCore::applicationName() ) ); } From bdb4a3137fc8217269f847c4f64cf20ca86032c5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:34:05 +0100 Subject: [PATCH 1226/1765] RemoteAccessWidget: fall back to login name of user for window title --- plugins/remoteaccess/RemoteAccessWidget.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 24ad4807e..bfeec9a5a 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -418,14 +418,18 @@ void RemoteAccessWidget::takeScreenshot() void RemoteAccessWidget::updateRemoteAccessTitle() { - if ( m_computerControlInterface->userFullName().isEmpty() ) + const auto username = m_computerControlInterface->userFullName().isEmpty() ? + m_computerControlInterface->userLoginName() : m_computerControlInterface->userFullName(); + + if (username.isEmpty() ) { setWindowTitle( tr( "%1 - %2 Remote Access" ).arg( m_computerControlInterface->computer().name(), VeyonCore::applicationName() ) ); - } else + } + else { - setWindowTitle( tr( "%1 - %2 - %3 Remote Access" ).arg( m_computerControlInterface->userFullName(), - m_computerControlInterface->computer().name(), - VeyonCore::applicationName() ) ); + setWindowTitle( tr( "%1 - %2 - %3 Remote Access" ).arg( username, + m_computerControlInterface->computer().name(), + VeyonCore::applicationName() ) ); } } From 217315a545ddff6c198253c104e786cfe7b7ddbf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:35:44 +0100 Subject: [PATCH 1227/1765] FeatureProviderInterface: add sendAsyncFeatureMessages() --- core/src/FeatureProviderInterface.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index 4c3702395..4dac25475 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -151,6 +151,15 @@ class VEYON_CORE_EXPORT FeatureProviderInterface return false; } + /*! + * \brief Send asynchronous messages (e.g. notifications or state updates) to client + */ + virtual void sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) + { + Q_UNUSED(server) + Q_UNUSED(messageContext) + } + /*! * \brief Handles a received feature message inside worker * \param worker a reference to a worker instance implementing the VeyonWorkerInterface From 20b97767f100624a2679d05b5bd495e59217add3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:37:22 +0100 Subject: [PATCH 1228/1765] FeatureManager: add sendAsyncFeatureMessages() --- core/src/FeatureManager.cpp | 12 ++++++++++++ core/src/FeatureManager.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 0c8412efa..d1dec09ef 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -280,6 +280,18 @@ bool FeatureManager::handleFeatureMessage( VeyonWorkerInterface& worker, const F +void FeatureManager::sendAsyncFeatureMessages(VeyonServerInterface& server, + const MessageContext& messageContext) const +{ + + for (const auto& featureInterface : qAsConst(m_featurePluginInterfaces)) + { + featureInterface->sendAsyncFeatureMessages(server, messageContext); + } +} + + + FeatureUidList FeatureManager::activeFeatures( VeyonServerInterface& server ) const { FeatureUidList features; diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index 1c1c9ebb5..3fdb7bcae 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -78,6 +78,8 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject const FeatureMessage& message ) const; bool handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) const; + void sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) const; + FeatureUidList activeFeatures( VeyonServerInterface& server ) const; private: From 09100e448f9879d2cc6d66db148be8b647612b8c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:37:54 +0100 Subject: [PATCH 1229/1765] VeyonServerInterface: inherit from QObject Allow plugins to retrieve the server instance through the children list of the global VeyonCore instance. --- core/src/VeyonServerInterface.h | 11 +++++++++-- server/src/ComputerControlServer.cpp | 2 +- server/src/ComputerControlServer.h | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index c9be3d9a6..da0e4f3d2 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -24,16 +24,23 @@ #pragma once -class BuiltinFeatures; +#include "VeyonCore.h" + class FeatureMessage; class FeatureWorkerManager; class MessageContext; // clazy:excludeall=copyable-polymorphic -class VeyonServerInterface +class VEYON_CORE_EXPORT VeyonServerInterface : public QObject { + Q_OBJECT public: + explicit VeyonServerInterface(QObject* parent) : + QObject(parent) + { + } + virtual ~VeyonServerInterface() = default; virtual FeatureWorkerManager& featureWorkerManager() = 0; diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 22fbcc429..ac2289a8c 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -36,7 +36,7 @@ ComputerControlServer::ComputerControlServer( QObject* parent ) : - QObject( parent ), + VeyonServerInterface(parent), m_featureWorkerManager( *this ), m_serverAuthenticationManager( this ), m_serverAccessControlManager( m_featureWorkerManager, VeyonCore::builtinFeatures().desktopAccessDialog(), this ), diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index 5e1370b8b..350924500 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -35,7 +35,7 @@ #include "VncProxyConnectionFactory.h" #include "VncServer.h" -class ComputerControlServer : public QObject, VncProxyConnectionFactory, VeyonServerInterface +class ComputerControlServer : public VeyonServerInterface, VncProxyConnectionFactory { Q_OBJECT public: From f922556a0b0d4beaffe4bf2c0f7acecb2396e001 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:39:42 +0100 Subject: [PATCH 1230/1765] VncProxyConnection: add serverMessageProcessed() signal --- server/src/VncProxyConnection.cpp | 1 + server/src/VncProxyConnection.h | 1 + 2 files changed, 2 insertions(+) diff --git a/server/src/VncProxyConnection.cpp b/server/src/VncProxyConnection.cpp index f849b0291..41ef8d213 100644 --- a/server/src/VncProxyConnection.cpp +++ b/server/src/VncProxyConnection.cpp @@ -134,6 +134,7 @@ void VncProxyConnection::readFromServer() { while( receiveServerMessage() ) { + Q_EMIT serverMessageProcessed(); } } else diff --git a/server/src/VncProxyConnection.h b/server/src/VncProxyConnection.h index a8f72af1d..97b36c2b9 100644 --- a/server/src/VncProxyConnection.h +++ b/server/src/VncProxyConnection.h @@ -81,5 +81,6 @@ protected Q_SLOTS: Q_SIGNALS: void clientConnectionClosed(); void serverConnectionClosed(); + void serverMessageProcessed(); } ; From bf278737958178f6bccd58b93fc3945b50c4020a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:40:23 +0100 Subject: [PATCH 1231/1765] VncProxyServer: add serverMessageProcessed() signal --- server/src/VncProxyServer.cpp | 3 +++ server/src/VncProxyServer.h | 1 + 2 files changed, 4 insertions(+) diff --git a/server/src/VncProxyServer.cpp b/server/src/VncProxyServer.cpp index 3ffcfb1c7..90488eecf 100644 --- a/server/src/VncProxyServer.cpp +++ b/server/src/VncProxyServer.cpp @@ -101,6 +101,9 @@ void VncProxyServer::acceptConnection() m_vncServerPassword, this ); + connect(connection, &VncProxyConnection::serverMessageProcessed, this, + [=]() { Q_EMIT serverMessageProcessed(connection); }, Qt::DirectConnection ); + connect( connection, &VncProxyConnection::clientConnectionClosed, this, [=]() { closeConnection( connection ); } ); connect( connection, &VncProxyConnection::serverConnectionClosed, this, [=]() { closeConnection( connection ); } ); diff --git a/server/src/VncProxyServer.h b/server/src/VncProxyServer.h index 4dc7aa7a8..3c4eaa0f4 100644 --- a/server/src/VncProxyServer.h +++ b/server/src/VncProxyServer.h @@ -55,6 +55,7 @@ class VncProxyServer : public QObject } Q_SIGNALS: + void serverMessageProcessed(VncProxyConnection* connection); void connectionClosed( VncProxyConnection* connection ); private: From 233c0149110206de235e9aa483b50a101f458afb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:42:10 +0100 Subject: [PATCH 1232/1765] ComputerControlServer: add sendAsyncFeatureMessages() Connect VncProxyServer::serverMessageProcessed() and FeatureManager::sendAsyncFeatureMessages() such that all feature providers are now able to send asynchronous feature messages inside the server. --- server/src/ComputerControlServer.cpp | 11 ++++++++++- server/src/ComputerControlServer.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index ac2289a8c..edfbf0c18 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -57,6 +57,8 @@ ComputerControlServer::ComputerControlServer( QObject* parent ) : connect( &m_serverAccessControlManager, &ServerAccessControlManager::finished, this, &ComputerControlServer::showAccessControlMessage ); + connect(&m_vncProxyServer, &VncProxyServer::serverMessageProcessed, + this, &ComputerControlServer::sendAsyncFeatureMessages, Qt::DirectConnection); connect( &m_vncProxyServer, &VncProxyServer::connectionClosed, this, &ComputerControlServer::updateTrayIconToolTip ); } @@ -128,7 +130,7 @@ bool ComputerControlServer::handleFeatureMessage( QTcpSocket* socket ) bool ComputerControlServer::sendFeatureMessageReply( const MessageContext& context, const FeatureMessage& reply ) { - vDebug() << reply.featureUid() << reply.command() << reply.arguments(); + vDebug() << reply; if( context.ioDevice() ) { @@ -255,6 +257,13 @@ QFutureWatcher* ComputerControlServer::resolveFQDNs( const QStringList& ho +void ComputerControlServer::sendAsyncFeatureMessages(VncProxyConnection* connection) +{ + VeyonCore::featureManager().sendAsyncFeatureMessages(*this, MessageContext{connection->proxyClientSocket()}); +} + + + void ComputerControlServer::updateTrayIconToolTip() { auto toolTip = tr( "%1 Service %2 at %3:%4" ).arg( VeyonCore::applicationName(), VeyonCore::versionString(), diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index 350924500..bd3c1adbb 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -79,6 +79,7 @@ class ComputerControlServer : public VeyonServerInterface, VncProxyConnectionFac void showAccessControlMessage( VncServerClient* client ); QFutureWatcher* resolveFQDNs( const QStringList& hosts ); + void sendAsyncFeatureMessages(VncProxyConnection* connection); void updateTrayIconToolTip(); QMutex m_dataMutex{}; From 2424ecf7d98d39a0e46d42ea2dbab9d9692a43ae Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:45:41 +0100 Subject: [PATCH 1233/1765] MonitoringMode: send user data and screen info updates asynchronously This eliminates the need for polling computer state and session related information. --- core/src/MonitoringMode.cpp | 153 ++++++++++++++++++++++++++---------- core/src/MonitoringMode.h | 22 +++++- 2 files changed, 131 insertions(+), 44 deletions(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 62f98aa5a..23f873084 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "MonitoringMode.h" #include "PlatformSessionFunctions.h" @@ -51,22 +52,28 @@ MonitoringMode::MonitoringMode( QObject* parent ) : Feature::Uid(), tr("Query properties of remotely available screens"), {}, {} ), m_features( { m_monitoringModeFeature, m_queryLoggedOnUserInfoFeature, m_queryScreensFeature } ) { + if(VeyonCore::component() == VeyonCore::Component::Server) + { + updateUserData(); + updateScreenInfoList(); + + connect(qGuiApp, &QGuiApplication::screenAdded, this, &MonitoringMode::updateScreenInfoList); + connect(qGuiApp, &QGuiApplication::screenRemoved, this, &MonitoringMode::updateScreenInfoList); + } } void MonitoringMode::queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ) { - sendFeatureMessage( FeatureMessage{ m_queryLoggedOnUserInfoFeature.uid(), FeatureMessage::DefaultCommand }, - computerControlInterfaces, false ); + sendFeatureMessage(FeatureMessage{m_queryLoggedOnUserInfoFeature.uid()}, computerControlInterfaces); } void MonitoringMode::queryScreens(const ComputerControlInterfaceList& computerControlInterfaces) { - sendFeatureMessage( FeatureMessage{m_queryScreensFeature.uid(), FeatureMessage::DefaultCommand}, - computerControlInterfaces ); + sendFeatureMessage(FeatureMessage{m_queryScreensFeature.uid()}, computerControlInterfaces); } @@ -112,57 +119,83 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, const MessageContext& messageContext, const FeatureMessage& message ) { - if( m_queryLoggedOnUserInfoFeature.uid() == message.featureUid() ) + if (message.featureUid() == m_monitoringModeFeature.uid()) { - FeatureMessage reply( message.featureUid(), message.command() ); + return server.sendFeatureMessageReply(messageContext, message); + } - m_userDataLock.lockForRead(); - if( m_userLoginName.isEmpty() ) - { - queryUserInformation(); - reply.addArgument( Argument::UserLoginName, QString() ); - reply.addArgument( Argument::UserFullName, QString() ); - reply.addArgument( Argument::UserSessionId, -1 ); - } - else - { - reply.addArgument( Argument::UserLoginName, m_userLoginName ); - reply.addArgument( Argument::UserFullName, m_userFullName ); - reply.addArgument( Argument::UserSessionId, m_userSessionId ); - } - m_userDataLock.unlock(); + if (message.featureUid() == m_queryLoggedOnUserInfoFeature.uid()) + { + return sendUserInformation(server, messageContext); + } - return server.sendFeatureMessageReply( messageContext, reply ); + if (message.featureUid() == m_queryScreensFeature.uid()) + { + return sendScreenInfoList(server, messageContext); } - if( message.featureUid() == m_queryScreensFeature.uid() ) + return false; +} + + + +void MonitoringMode::sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) +{ + const auto currentUserInfoVersion = m_userInfoVersion.loadAcquire(); + const auto contextUserInfoVersion = messageContext.ioDevice()->property(userInfoVersionProperty()).toInt(); + + if(contextUserInfoVersion != currentUserInfoVersion) { - const auto screens = QGuiApplication::screens(); + sendUserInformation(server, messageContext); + messageContext.ioDevice()->setProperty(userInfoVersionProperty(), currentUserInfoVersion); + } - QVariantList screenInfoList; - screenInfoList.reserve(screens.size()); + const auto screenInfoVersion = messageContext.ioDevice()->property(screenInfoListVersionProperty()).toInt(); + + if (screenInfoVersion != m_screenInfoListVersion) + { + sendScreenInfoList(server, messageContext); + messageContext.ioDevice()->setProperty(screenInfoListVersionProperty(), m_screenInfoListVersion); + } +} - int index = 1; - for(const auto* screen : screens) - { - QVariantMap screenInfo; - screenInfo[QStringLiteral("name")] = VeyonCore::screenName(*screen, index); - screenInfo[QStringLiteral("geometry")] = screen->geometry(); - screenInfoList.append(screenInfo); - ++index; - } - return server.sendFeatureMessageReply( messageContext, - FeatureMessage(m_queryScreensFeature.uid()) - .addArgument(Argument::ScreenInfoList, screenInfoList) ); + +bool MonitoringMode::sendUserInformation(VeyonServerInterface& server, const MessageContext& messageContext) +{ + FeatureMessage message{m_queryLoggedOnUserInfoFeature.uid()}; + + m_userDataLock.lockForRead(); + if (m_userLoginName.isEmpty()) + { + updateUserData(); + message.addArgument(Argument::UserLoginName, QString{}); + message.addArgument(Argument::UserFullName, QString{}); + message.addArgument(Argument::UserSessionId, -1); } + else + { + message.addArgument(Argument::UserLoginName, m_userLoginName); + message.addArgument(Argument::UserFullName, m_userFullName); + message.addArgument(Argument::UserSessionId, m_userSessionId); + } + m_userDataLock.unlock(); - return false; + return server.sendFeatureMessageReply(messageContext, message); } -void MonitoringMode::queryUserInformation() +bool MonitoringMode::sendScreenInfoList(VeyonServerInterface& server, const MessageContext& messageContext) +{ + return server.sendFeatureMessageReply(messageContext, + FeatureMessage{m_queryScreensFeature.uid()} + .addArgument(Argument::ScreenInfoList, m_screenInfoList)); +} + + + +void MonitoringMode::updateUserData() { // asynchronously query information about logged on user (which might block // due to domain controller queries and timeouts etc.) @@ -173,10 +206,44 @@ void MonitoringMode::queryUserInformation() const auto userFullName = VeyonCore::platform().userFunctions().fullName( userLoginName ); const auto userSessionId = VeyonCore::sessionId(); m_userDataLock.lockForWrite(); - m_userLoginName = userLoginName; - m_userFullName = userFullName; - m_userSessionId = userSessionId; + if(m_userLoginName != userLoginName || + m_userFullName != userFullName || + m_userSessionId != userSessionId ) + { + m_userLoginName = userLoginName; + m_userFullName = userFullName; + m_userSessionId = userSessionId; + ++m_userInfoVersion; + } m_userDataLock.unlock(); } } ); } + + + +void MonitoringMode::updateScreenInfoList() +{ + const auto screens = QGuiApplication::screens(); + + QVariantList screenInfoList; + screenInfoList.reserve(screens.size()); + + int index = 1; + for(const auto* screen : screens) + { + QVariantMap screenInfo; + screenInfo[QStringLiteral("name")] = VeyonCore::screenName(*screen, index); + screenInfo[QStringLiteral("geometry")] = screen->geometry(); + screenInfoList.append(screenInfo); + ++index; + + connect(screen, &QScreen::geometryChanged, this, &MonitoringMode::updateScreenInfoList, Qt::UniqueConnection); + } + + if(screenInfoList != m_screenInfoList) + { + m_screenInfoList = screenInfoList; + ++m_screenInfoListVersion; + } +} diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 7ba5ba411..7d6d77856 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -104,8 +104,24 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac const MessageContext& messageContext, const FeatureMessage& message ) override; + void sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) override; + private: - void queryUserInformation(); + bool sendUserInformation(VeyonServerInterface& server, const MessageContext& messageContext); + bool sendScreenInfoList(VeyonServerInterface& server, const MessageContext& messageContext); + + static const char* userInfoVersionProperty() + { + return "userInfoVersion"; + } + + static const char* screenInfoListVersionProperty() + { + return "screenInfoListVersion"; + } + + void updateUserData(); + void updateScreenInfoList(); const Feature m_monitoringModeFeature; const Feature m_queryLoggedOnUserInfoFeature; @@ -116,5 +132,9 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac QString m_userLoginName; QString m_userFullName; int m_userSessionId{0}; + QAtomicInt m_userInfoVersion{0}; + + QVariantList m_screenInfoList; + int m_screenInfoListVersion{0}; }; From b8cc7f0bd4c1e6a76f612e16675fbd2b69a46f27 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 14:51:23 +0100 Subject: [PATCH 1234/1765] MonitoringMode: add ping mechanism --- core/src/MonitoringMode.cpp | 13 +++++++++++++ core/src/MonitoringMode.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 23f873084..0df6dd6f2 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -64,6 +64,13 @@ MonitoringMode::MonitoringMode( QObject* parent ) : +void MonitoringMode::ping(const ComputerControlInterfaceList& computerControlInterfaces) +{ + sendFeatureMessage(FeatureMessage{m_monitoringModeFeature.uid()}, computerControlInterfaces, true); +} + + + void MonitoringMode::queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ) { sendFeatureMessage(FeatureMessage{m_queryLoggedOnUserInfoFeature.uid()}, computerControlInterfaces); @@ -81,6 +88,12 @@ void MonitoringMode::queryScreens(const ComputerControlInterfaceList& computerCo bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message ) { + if (message.featureUid() == m_monitoringModeFeature.uid()) + { + // successful ping reply implicitly handled through the featureMessageReceived() signal + return true; + } + if( message.featureUid() == m_queryLoggedOnUserInfoFeature.uid() ) { computerControlInterface->setUserInformation( message.argument( Argument::UserLoginName ).toString(), diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 7d6d77856..6549367a0 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -82,6 +82,8 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac return m_features; } + void ping(const ComputerControlInterfaceList& computerControlInterfaces); + void queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ); void queryScreens( const ComputerControlInterfaceList& computerControlInterfaces ); From 4c5da25852a41b38aa8857828e6a0204e456e29e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 15:14:49 +0100 Subject: [PATCH 1235/1765] MonitoringMode: implement sync active feature querying This replaces the previous FeatureControl class and sends the list of active features whenever it changes. --- core/src/BuiltinFeatures.cpp | 4 - core/src/BuiltinFeatures.h | 7 -- core/src/ComputerControlInterface.cpp | 3 +- core/src/FeatureControl.cpp | 100 ----------------------- core/src/FeatureControl.h | 109 -------------------------- core/src/MonitoringMode.cpp | 84 +++++++++++++++++++- core/src/MonitoringMode.h | 20 +++++ 7 files changed, 102 insertions(+), 225 deletions(-) delete mode 100644 core/src/FeatureControl.cpp delete mode 100644 core/src/FeatureControl.h diff --git a/core/src/BuiltinFeatures.cpp b/core/src/BuiltinFeatures.cpp index 3171dfda4..b4ced372c 100644 --- a/core/src/BuiltinFeatures.cpp +++ b/core/src/BuiltinFeatures.cpp @@ -23,7 +23,6 @@ */ #include "BuiltinFeatures.h" -#include "FeatureControl.h" #include "MonitoringMode.h" #include "PluginManager.h" #include "SystemTrayIcon.h" @@ -31,12 +30,10 @@ BuiltinFeatures::BuiltinFeatures() : - m_featureControl( new FeatureControl ), m_systemTrayIcon( new SystemTrayIcon ), m_monitoringMode( new MonitoringMode ), m_desktopAccessDialog( new DesktopAccessDialog ) { - VeyonCore::pluginManager().registerExtraPluginInterface( m_featureControl ); VeyonCore::pluginManager().registerExtraPluginInterface( m_systemTrayIcon ); VeyonCore::pluginManager().registerExtraPluginInterface( m_monitoringMode ); VeyonCore::pluginManager().registerExtraPluginInterface( m_desktopAccessDialog ); @@ -49,5 +46,4 @@ BuiltinFeatures::~BuiltinFeatures() delete m_systemTrayIcon; delete m_monitoringMode; delete m_desktopAccessDialog; - delete m_featureControl; } diff --git a/core/src/BuiltinFeatures.h b/core/src/BuiltinFeatures.h index 99d6d5d06..b1ee966dc 100644 --- a/core/src/BuiltinFeatures.h +++ b/core/src/BuiltinFeatures.h @@ -27,7 +27,6 @@ #include "VeyonCore.h" class DesktopAccessDialog; -class FeatureControl; class MonitoringMode; class SystemTrayIcon; @@ -39,11 +38,6 @@ class VEYON_CORE_EXPORT BuiltinFeatures BuiltinFeatures(); ~BuiltinFeatures(); - FeatureControl& featureControl() - { - return *m_featureControl; - } - SystemTrayIcon& systemTrayIcon() { return *m_systemTrayIcon; @@ -60,7 +54,6 @@ class VEYON_CORE_EXPORT BuiltinFeatures } private: - FeatureControl* m_featureControl; SystemTrayIcon* m_systemTrayIcon; MonitoringMode* m_monitoringMode; DesktopAccessDialog* m_desktopAccessDialog; diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index a69d3750f..3e54e9956 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -25,7 +25,6 @@ #include "BuiltinFeatures.h" #include "ComputerControlInterface.h" #include "Computer.h" -#include "FeatureControl.h" #include "FeatureManager.h" #include "MonitoringMode.h" #include "VeyonConfiguration.h" @@ -257,7 +256,7 @@ void ComputerControlInterface::updateActiveFeatures() if( vncConnection() && state() == State::Connected ) { - VeyonCore::builtinFeatures().featureControl().queryActiveFeatures( { weakPointer() } ); + VeyonCore::builtinFeatures().monitoringMode().queryActiveFeatures({weakPointer()}); } else { diff --git a/core/src/FeatureControl.cpp b/core/src/FeatureControl.cpp deleted file mode 100644 index 31b891f03..000000000 --- a/core/src/FeatureControl.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * FeatureControl.cpp - implementation of FeatureControl class - * - * Copyright (c) 2017-2021 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#include "FeatureControl.h" -#include "FeatureManager.h" -#include "VeyonCore.h" -#include "VeyonServerInterface.h" - - -FeatureControl::FeatureControl( QObject* parent ) : - QObject( parent ), - m_featureControlFeature( Feature( QLatin1String( staticMetaObject.className() ), - Feature::Flag::Service | Feature::Flag::Worker | Feature::Flag::Builtin, - Feature::Uid( "a0a96fba-425d-414a-aaf4-352b76d7c4f3" ), - Feature::Uid(), - tr( "Feature control" ), {}, {}, {}, {} ) ), - m_features( { m_featureControlFeature } ) -{ -} - - - -void FeatureControl::queryActiveFeatures( const ComputerControlInterfaceList& computerControlInterfaces ) -{ - sendFeatureMessage( FeatureMessage{ m_featureControlFeature.uid(), QueryActiveFeatures }, - computerControlInterfaces, false ); -} - - - -bool FeatureControl::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, - const FeatureMessage& message ) -{ - if( message.featureUid() == m_featureControlFeature.uid() ) - { - const auto featureUidStrings = message.argument( Argument::ActiveFeaturesList ).toStringList(); - - FeatureUidList activeFeatures{}; - activeFeatures.reserve( featureUidStrings.size() ); - - for( const auto& featureUidString : featureUidStrings ) - { - activeFeatures.append( Feature::Uid{featureUidString} ); - } - - computerControlInterface->setActiveFeatures( activeFeatures ); - - return true; - } - - return false; -} - - - -bool FeatureControl::handleFeatureMessage( VeyonServerInterface& server, - const MessageContext& messageContext, - const FeatureMessage& message ) -{ - if( m_featureControlFeature.uid() == message.featureUid() ) - { - const auto featureUids = VeyonCore::featureManager().activeFeatures( server ); - - QStringList featureUidStrings; - featureUidStrings.reserve( featureUids.size() ); - - for( const auto& featureUid : featureUids ) - { - featureUidStrings.append( featureUid.toString() ); - } - - FeatureMessage reply( message.featureUid(), message.command() ); - reply.addArgument( Argument::ActiveFeaturesList, featureUidStrings ); - - return server.sendFeatureMessageReply( messageContext, reply ); - } - - return false; -} diff --git a/core/src/FeatureControl.h b/core/src/FeatureControl.h deleted file mode 100644 index 54a71aa86..000000000 --- a/core/src/FeatureControl.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * FeatureControl.h - declaration of FeatureControl class - * - * Copyright (c) 2017-2021 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#pragma once - -#include "FeatureProviderInterface.h" - -class VEYON_CORE_EXPORT FeatureControl : public QObject, public FeatureProviderInterface, public PluginInterface -{ - Q_OBJECT - Q_INTERFACES(FeatureProviderInterface PluginInterface) -public: - enum class Argument - { - ActiveFeaturesList - }; - Q_ENUM(Argument) - - explicit FeatureControl( QObject* parent = nullptr ); - ~FeatureControl() override = default; - - void queryActiveFeatures( const ComputerControlInterfaceList& computerControlInterfaces ); - - Plugin::Uid uid() const override - { - return Plugin::Uid{ QStringLiteral("f5ec79e0-186c-4af0-89a2-7e5687cc32b2") }; - } - - QVersionNumber version() const override - { - return QVersionNumber( 1, 1 ); - } - - QString name() const override - { - return QStringLiteral( "FeatureControl" ); - } - - QString description() const override - { - return tr( "Feature control" ); - } - - QString vendor() const override - { - return QStringLiteral( "Veyon Community" ); - } - - QString copyright() const override - { - return QStringLiteral( "Tobias Junghans" ); - } - - const FeatureList& featureList() const override - { - return m_features; - } - - bool controlFeature( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, - const ComputerControlInterfaceList& computerControlInterfaces ) override - { - Q_UNUSED(featureUid) - Q_UNUSED(operation) - Q_UNUSED(arguments) - Q_UNUSED(computerControlInterfaces) - - return false; - } - - bool handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, - const FeatureMessage& message ) override; - - bool handleFeatureMessage( VeyonServerInterface& server, - const MessageContext& messageContext, - const FeatureMessage& message ) override; - -private: - enum Commands - { - QueryActiveFeatures, - }; - - const Feature m_featureControlFeature; - const FeatureList m_features; - - FeatureUidList m_activeFeatures; - -}; diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 0df6dd6f2..9aaaa2758 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -25,8 +25,8 @@ #include #include #include -#include +#include "FeatureManager.h" #include "MonitoringMode.h" #include "PlatformSessionFunctions.h" #include "PlatformUserFunctions.h" @@ -42,18 +42,25 @@ MonitoringMode::MonitoringMode( QObject* parent ) : tr( "Monitoring" ), tr( "Monitoring" ), tr( "This mode allows you to monitor all computers at one or more locations." ), QStringLiteral( ":/core/presentation-none.png" ) ), + m_queryActiveFeatures( QStringLiteral("QueryActiveFeatures"), + Feature::Flag::Service | Feature::Flag::Builtin, + Feature::Uid{"a0a96fba-425d-414a-aaf4-352b76d7c4f3"}, {}, + tr("Query active features"), {}, {} ), m_queryLoggedOnUserInfoFeature( QStringLiteral("UserSessionInfo"), - Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Worker | Feature::Flag::Builtin, + Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Builtin, Feature::Uid( "79a5e74d-50bd-4aab-8012-0e70dc08cc72" ), Feature::Uid(), {}, {}, {} ), m_queryScreensFeature( QStringLiteral("QueryScreens"), Feature::Flag::Meta, Feature::Uid("d5bbc486-7bc5-4c36-a9a8-1566c8b0091a"), Feature::Uid(), tr("Query properties of remotely available screens"), {}, {} ), - m_features( { m_monitoringModeFeature, m_queryLoggedOnUserInfoFeature, m_queryScreensFeature } ) + m_features( { m_monitoringModeFeature, m_queryActiveFeatures, m_queryLoggedOnUserInfoFeature, m_queryScreensFeature } ) { if(VeyonCore::component() == VeyonCore::Component::Server) { + connect(&m_activeFeaturesUpdateTimer, &QTimer::timeout, this, &MonitoringMode::updateActiveFeatures); + m_activeFeaturesUpdateTimer.start(ActiveFeaturesUpdateInterval); + updateUserData(); updateScreenInfoList(); @@ -71,6 +78,13 @@ void MonitoringMode::ping(const ComputerControlInterfaceList& computerControlInt +void MonitoringMode::queryActiveFeatures(const ComputerControlInterfaceList& computerControlInterfaces) +{ + sendFeatureMessage(FeatureMessage{m_queryActiveFeatures.uid()}, computerControlInterfaces); +} + + + void MonitoringMode::queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ) { sendFeatureMessage(FeatureMessage{m_queryLoggedOnUserInfoFeature.uid()}, computerControlInterfaces); @@ -94,6 +108,23 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com return true; } + if( message.featureUid() == m_queryActiveFeatures.uid() ) + { + const auto featureUidStrings = message.argument(Argument::ActiveFeaturesList).toStringList(); + + FeatureUidList activeFeatures{}; + activeFeatures.reserve(featureUidStrings.size()); + + for(const auto& featureUidString : featureUidStrings) + { + activeFeatures.append(Feature::Uid{featureUidString}); + } + + computerControlInterface->setActiveFeatures(activeFeatures); + + return true; + } + if( message.featureUid() == m_queryLoggedOnUserInfoFeature.uid() ) { computerControlInterface->setUserInformation( message.argument( Argument::UserLoginName ).toString(), @@ -137,6 +168,11 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, return server.sendFeatureMessageReply(messageContext, message); } + if (m_queryActiveFeatures.uid() == message.featureUid()) + { + return sendActiveFeatures(server, messageContext); + } + if (message.featureUid() == m_queryLoggedOnUserInfoFeature.uid()) { return sendUserInformation(server, messageContext); @@ -154,6 +190,14 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, void MonitoringMode::sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) { + const auto activeFeaturesVersion = messageContext.ioDevice()->property(activeFeaturesVersionProperty()).toInt(); + + if (activeFeaturesVersion != m_activeFeaturesVersion) + { + sendActiveFeatures(server, messageContext); + messageContext.ioDevice()->setProperty(activeFeaturesVersionProperty(), m_activeFeaturesVersion); + } + const auto currentUserInfoVersion = m_userInfoVersion.loadAcquire(); const auto contextUserInfoVersion = messageContext.ioDevice()->property(userInfoVersionProperty()).toInt(); @@ -174,6 +218,15 @@ void MonitoringMode::sendAsyncFeatureMessages(VeyonServerInterface& server, cons +bool MonitoringMode::sendActiveFeatures(VeyonServerInterface& server, const MessageContext& messageContext) +{ + return server.sendFeatureMessageReply(messageContext, + FeatureMessage{m_queryActiveFeatures.uid()} + .addArgument(Argument::ActiveFeaturesList, m_activeFeatures)); +} + + + bool MonitoringMode::sendUserInformation(VeyonServerInterface& server, const MessageContext& messageContext) { FeatureMessage message{m_queryLoggedOnUserInfoFeature.uid()}; @@ -208,6 +261,31 @@ bool MonitoringMode::sendScreenInfoList(VeyonServerInterface& server, const Mess +void MonitoringMode::updateActiveFeatures() +{ + const auto server = VeyonCore::instance()->findChild(); + if (server) + { + const auto activeFeaturesUids = VeyonCore::featureManager().activeFeatures(*server); + + QStringList activeFeatures; + activeFeatures.reserve(activeFeaturesUids.size()); + + for (const auto& activeFeatureUid : activeFeaturesUids) + { + activeFeatures.append(activeFeatureUid.toString()); + } + + if (activeFeatures != m_activeFeatures) + { + m_activeFeatures = activeFeatures; + m_activeFeaturesVersion++; + } + } +} + + + void MonitoringMode::updateUserData() { // asynchronously query information about logged on user (which might block diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 6549367a0..79d6194a1 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -24,6 +24,8 @@ #pragma once +#include + #include "FeatureProviderInterface.h" class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterface, PluginInterface @@ -37,6 +39,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac UserFullName, UserSessionId, ScreenInfoList, + ActiveFeaturesList = 0 // for compatibility after migration from FeatureControl }; Q_ENUM(Argument) @@ -84,6 +87,8 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void ping(const ComputerControlInterfaceList& computerControlInterfaces); + void queryActiveFeatures(const ComputerControlInterfaceList& computerControlInterfaces); + void queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ); void queryScreens( const ComputerControlInterfaceList& computerControlInterfaces ); @@ -109,9 +114,15 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) override; private: + bool sendActiveFeatures(VeyonServerInterface& server, const MessageContext& messageContext); bool sendUserInformation(VeyonServerInterface& server, const MessageContext& messageContext); bool sendScreenInfoList(VeyonServerInterface& server, const MessageContext& messageContext); + static const char* activeFeaturesVersionProperty() + { + return "activeFeaturesListVersion"; + } + static const char* userInfoVersionProperty() { return "userInfoVersion"; @@ -122,14 +133,23 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac return "screenInfoListVersion"; } + void updateActiveFeatures(); void updateUserData(); void updateScreenInfoList(); + static constexpr int ActiveFeaturesUpdateInterval = 250; + const Feature m_monitoringModeFeature; + const Feature m_queryActiveFeatures; const Feature m_queryLoggedOnUserInfoFeature; const Feature m_queryScreensFeature; const FeatureList m_features; + + int m_activeFeaturesVersion{0}; + QStringList m_activeFeatures; + QTimer m_activeFeaturesUpdateTimer; + QReadWriteLock m_userDataLock; QString m_userLoginName; QString m_userFullName; From bc2fe699ab803976d692e1f6d4cdf6730e210f9a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 15:18:44 +0100 Subject: [PATCH 1236/1765] CCI: drop computer state and session info polling Now that all computer state and session related information are sent by the server asynchronously, there's no need for polling them actively any longer. This fixes too frequent framebuffer updates by not waking the VNC connection loop unnecessarily. --- core/src/ComputerControlInterface.cpp | 26 +------------------------- core/src/ComputerControlInterface.h | 15 ++++++--------- 2 files changed, 7 insertions(+), 34 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 3e54e9956..e3557372d 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -35,24 +35,11 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, int port, QObject* parent ) : QObject( parent ), m_computer( computer ), - m_port( port ), - m_state( State::Disconnected ), - m_userLoginName(), - m_userFullName(), - m_scaledScreenSize(), - m_connection( nullptr ), - m_connectionWatchdogTimer( this ), - m_userUpdateTimer( this ), - m_activeFeaturesUpdateTimer( this ), - m_screensUpdateTimer( this ) + m_port( port ) { m_connectionWatchdogTimer.setInterval( ConnectionWatchdogTimeout ); m_connectionWatchdogTimer.setSingleShot( true ); connect( &m_connectionWatchdogTimer, &QTimer::timeout, this, &ComputerControlInterface::restartConnection ); - - connect( &m_userUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateUser ); - connect( &m_activeFeaturesUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateActiveFeatures ); - connect( &m_screensUpdateTimer, &QTimer::timeout, this, &ComputerControlInterface::updateScreens ); } @@ -123,9 +110,6 @@ void ComputerControlInterface::stop() m_connection = nullptr; } - m_screensUpdateTimer.stop(); - m_activeFeaturesUpdateTimer.stop(); - m_userUpdateTimer.stop(); m_connectionWatchdogTimer.stop(); m_state = State::Disconnected; @@ -302,10 +286,6 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) { vncConnection()->setFramebufferUpdateInterval( UpdateIntervalDisabled ); } - - m_userUpdateTimer.stop(); - m_activeFeaturesUpdateTimer.start( UpdateIntervalDisabled ); - m_screensUpdateTimer.stop(); break; case UpdateMode::Basic: @@ -317,10 +297,6 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) m_updateMode == UpdateMode::Monitoring ) ? computerMonitoringUpdateInterval : -1 ); } - - m_userUpdateTimer.start( computerMonitoringUpdateInterval ); - m_activeFeaturesUpdateTimer.start( computerMonitoringUpdateInterval ); - m_screensUpdateTimer.start( computerMonitoringUpdateInterval ); break; } diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 10cb7d3e2..9e014a354 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -188,22 +188,19 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab UpdateMode m_updateMode{UpdateMode::Disabled}; - State m_state; - QString m_userLoginName; - QString m_userFullName; + State m_state{State::Disconnected}; + QString m_userLoginName{}; + QString m_userFullName{}; int m_userSessionId{0}; ScreenList m_screens; FeatureUidList m_activeFeatures; Feature::Uid m_designatedModeFeature; - QSize m_scaledScreenSize; + QSize m_scaledScreenSize{}; int m_timestamp{0}; - VeyonConnection* m_connection; - QTimer m_connectionWatchdogTimer; - QTimer m_userUpdateTimer; - QTimer m_activeFeaturesUpdateTimer; - QTimer m_screensUpdateTimer; + VeyonConnection* m_connection{nullptr}; + QTimer m_connectionWatchdogTimer{this}; QStringList m_groups; From ac0312878865a85427d3e5e4c639e46a3be6b77d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 15:22:15 +0100 Subject: [PATCH 1237/1765] CCI: ping when idle to keep watchdog alive When no framebuffer updates are sent by the server, send a simple ping message after 10 s in order to reset the watchdog timer on time (happens through the VeyonConnection::featureMessageReceived() signal when receiving the ping reply). This increases the timeout for dead connections to 20 s. --- core/src/ComputerControlInterface.cpp | 13 +++++++++++++ core/src/ComputerControlInterface.h | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index e3557372d..628f7b952 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -37,6 +37,10 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in m_computer( computer ), m_port( port ) { + m_pingTimer.setInterval(ConnectionWatchdogPingDelay); + m_pingTimer.setSingleShot(true); + connect(&m_pingTimer, &QTimer::timeout, this, &ComputerControlInterface::ping); + m_connectionWatchdogTimer.setInterval( ConnectionWatchdogTimeout ); m_connectionWatchdogTimer.setSingleShot( true ); connect( &m_connectionWatchdogTimer, &QTimer::timeout, this, &ComputerControlInterface::restartConnection ); @@ -110,6 +114,7 @@ void ComputerControlInterface::stop() m_connection = nullptr; } + m_pingTimer.stop(); m_connectionWatchdogTimer.stop(); m_state = State::Disconnected; @@ -315,10 +320,18 @@ ComputerControlInterface::Pointer ComputerControlInterface::weakPointer() +void ComputerControlInterface::ping() +{ + VeyonCore::builtinFeatures().monitoringMode().ping({weakPointer()}); +} + + + void ComputerControlInterface::resetWatchdog() { if( state() == State::Connected ) { + m_pingTimer.start(); m_connectionWatchdogTimer.start(); } } diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 9e014a354..8af462c8c 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -172,6 +172,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab Pointer weakPointer(); private: + void ping(); void resetWatchdog(); void restartConnection(); @@ -180,7 +181,8 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void handleFeatureMessage( const FeatureMessage& message ); - static constexpr int ConnectionWatchdogTimeout = 10000; + static constexpr int ConnectionWatchdogPingDelay = 10000; + static constexpr int ConnectionWatchdogTimeout = ConnectionWatchdogPingDelay*2; static constexpr int UpdateIntervalDisabled = 5000; const Computer m_computer; @@ -200,6 +202,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab int m_timestamp{0}; VeyonConnection* m_connection{nullptr}; + QTimer m_pingTimer{this}; QTimer m_connectionWatchdogTimer{this}; QStringList m_groups; From 41f312b85a6265a962a98b6b6fad80f17d3ad79d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 15:26:38 +0100 Subject: [PATCH 1238/1765] FeatureManager: drop updateActiveFeatures() We no longer poll active features. --- core/src/FeatureManager.cpp | 16 ---------------- core/src/FeatureManager.h | 2 -- 2 files changed, 18 deletions(-) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index d1dec09ef..100ea8145 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -150,8 +150,6 @@ void FeatureManager::controlFeature( Feature::Uid featureUid, { featureInterface->controlFeature( featureUid, operation, arguments, computerControlInterfaces ); } - - updateActiveFeatures( computerControlInterfaces ); } @@ -174,8 +172,6 @@ void FeatureManager::startFeature( VeyonMasterInterface& master, controlInterface->setDesignatedModeFeature( feature.uid() ); } } - - updateActiveFeatures( computerControlInterfaces ); } @@ -198,18 +194,6 @@ void FeatureManager::stopFeature( VeyonMasterInterface& master, controlInterface->setDesignatedModeFeature( Feature::Uid() ); } } - - updateActiveFeatures( computerControlInterfaces ); -} - - - -void FeatureManager::updateActiveFeatures( const ComputerControlInterfaceList& computerControlInterfaces ) const -{ - for( const auto& controlInterface : computerControlInterfaces ) - { - controlInterface->updateActiveFeatures(); - } } diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index 3fdb7bcae..9efeae444 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -69,8 +69,6 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) const; - void updateActiveFeatures( const ComputerControlInterfaceList& computerControlInterfaces ) const; - bool handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message ) const; bool handleFeatureMessage( VeyonServerInterface& server, From e1288834ac1ad3ff6b0c6028605617f023cb44ea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 22 Nov 2021 15:41:23 +0100 Subject: [PATCH 1239/1765] CCI, VncConnection: rename screen to framebuffer Avoid confusion with recently introduced (physical) screen information. --- core/src/ComputerControlInterface.cpp | 24 ++++++++++++------------ core/src/ComputerControlInterface.h | 20 ++++++++++---------- core/src/ComputerListModel.h | 2 +- core/src/Screenshot.cpp | 2 +- core/src/VncConnection.cpp | 22 +++++++++++----------- core/src/VncConnection.h | 8 ++++---- core/src/VncViewItem.cpp | 4 ++-- master/src/ComputerControlListModel.cpp | 24 ++++++++++++------------ master/src/SlideshowModel.cpp | 8 ++++---- master/src/SpotlightModel.cpp | 8 ++++---- 10 files changed, 61 insertions(+), 61 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 628f7b952..f00038a78 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -55,12 +55,12 @@ ComputerControlInterface::~ComputerControlInterface() -void ComputerControlInterface::start( QSize scaledScreenSize, UpdateMode updateMode ) +void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode updateMode ) { // make sure we do not leak stop(); - m_scaledScreenSize = scaledScreenSize; + m_scaledFramebufferSize = scaledFramebufferSize; if( m_computer.hostAddress().isEmpty() == false ) { @@ -73,16 +73,16 @@ void ComputerControlInterface::start( QSize scaledScreenSize, UpdateMode updateM vncConnection->setPort( m_port ); } vncConnection->setQuality( VncConnection::Quality::Thumbnail ); - vncConnection->setScaledSize( m_scaledScreenSize ); + vncConnection->setScaledSize( m_scaledFramebufferSize ); connect( vncConnection, &VncConnection::imageUpdated, this, [this]( int x, int y, int w, int h ) { - Q_EMIT screenUpdated( QRect( x, y, w, h ) ); + Q_EMIT framebufferUpdated( QRect( x, y, w, h ) ); } ); connect( vncConnection, &VncConnection::framebufferUpdateComplete, this, [this]() { resetWatchdog(); ++m_timestamp; - Q_EMIT scaledScreenUpdated(); + Q_EMIT scaledFramebufferUpdated(); } ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); @@ -141,27 +141,27 @@ QSize ComputerControlInterface::screenSize() const -void ComputerControlInterface::setScaledScreenSize( QSize scaledScreenSize ) +void ComputerControlInterface::setScaledFramebufferSize( QSize scaledFramebufferSize ) { - m_scaledScreenSize = scaledScreenSize; + m_scaledFramebufferSize = scaledFramebufferSize; if( vncConnection() ) { - vncConnection()->setScaledSize( m_scaledScreenSize ); + vncConnection()->setScaledSize( m_scaledFramebufferSize ); } ++m_timestamp; - Q_EMIT scaledScreenUpdated(); + Q_EMIT scaledFramebufferUpdated(); } -QImage ComputerControlInterface::scaledScreen() const +QImage ComputerControlInterface::scaledFramebuffer() const { if( vncConnection() && vncConnection()->isConnected() ) { - return vncConnection()->scaledScreen(); + return vncConnection()->scaledFramebuffer(); } return {}; @@ -169,7 +169,7 @@ QImage ComputerControlInterface::scaledScreen() const -QImage ComputerControlInterface::screen() const +QImage ComputerControlInterface::framebuffer() const { if( vncConnection() && vncConnection()->isConnected() ) { diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 8af462c8c..8c71c6451 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -71,7 +71,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_connection ? m_connection->vncConnection() : nullptr; } - void start( QSize scaledScreenSize = {}, UpdateMode updateMode = UpdateMode::Monitoring ); + void start( QSize scaledFramebufferSize = {}, UpdateMode updateMode = UpdateMode::Monitoring ); void stop(); const Computer& computer() const @@ -88,16 +88,16 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QSize screenSize() const; - const QSize& scaledScreenSize() const + const QSize& scaledFramebufferSize() const { - return m_scaledScreenSize; + return m_scaledFramebufferSize; } - void setScaledScreenSize( QSize size ); + void setScaledFramebufferSize( QSize size ); - QImage scaledScreen() const; + QImage scaledFramebuffer() const; - QImage screen() const; + QImage framebuffer() const; int timestamp() const { @@ -198,7 +198,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab FeatureUidList m_activeFeatures; Feature::Uid m_designatedModeFeature; - QSize m_scaledScreenSize{}; + QSize m_scaledFramebufferSize{}; int m_timestamp{0}; VeyonConnection* m_connection{nullptr}; @@ -208,9 +208,9 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QStringList m_groups; Q_SIGNALS: - void screenSizeChanged(); - void screenUpdated( QRect rect ); - void scaledScreenUpdated(); + void framebufferSizeChanged(); + void framebufferUpdated( QRect rect ); + void scaledFramebufferUpdated(); void userChanged(); void screensChanged(); void stateChanged(); diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index a988f50cc..323293fba 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -38,7 +38,7 @@ class VEYON_CORE_EXPORT ComputerListModel : public QAbstractListModel UserLoginNameRole, ImageIdRole, GroupsRole, - ScreenRole, + FramebufferRole, ControlInterfaceRole }; diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index 56bff958c..9e42ec768 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -104,7 +104,7 @@ void Screenshot::take( const ComputerControlInterface::Pointer& computerControlI const auto caption = QStringLiteral( "%1@%2 %3 %4" ).arg( user, host, date, time ); - m_image = computerControlInterface->screen(); + m_image = computerControlInterface->framebuffer(); QPixmap icon( QStringLiteral( ":/core/icon16.png" ) ); diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 70a2ddeb3..03773c010 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -119,7 +119,7 @@ void VncConnection::stop() { setClientData( VncConnectionTag, nullptr ); - m_scaledScreen = {}; + m_scaledFramebuffer = {}; setControlFlag( ControlFlag::TerminateThread, true ); @@ -244,16 +244,16 @@ void VncConnection::setScaledSize( QSize s ) if( m_scaledSize != s ) { m_scaledSize = s; - setControlFlag( ControlFlag::ScaledScreenNeedsUpdate, true ); + setControlFlag( ControlFlag::ScaledFramebufferNeedsUpdate, true ); } } -QImage VncConnection::scaledScreen() +QImage VncConnection::scaledFramebuffer() { - rescaleScreen(); - return m_scaledScreen; + rescaleFramebuffer(); + return m_scaledFramebuffer; } @@ -265,15 +265,15 @@ void VncConnection::setFramebufferUpdateInterval( int interval ) -void VncConnection::rescaleScreen() +void VncConnection::rescaleFramebuffer() { if( hasValidFramebuffer() == false || m_scaledSize.isNull() ) { - m_scaledScreen = {}; + m_scaledFramebuffer = {}; return; } - if( isControlFlagSet( ControlFlag::ScaledScreenNeedsUpdate ) == false ) + if( isControlFlagSet( ControlFlag::ScaledFramebufferNeedsUpdate ) == false ) { return; } @@ -285,9 +285,9 @@ void VncConnection::rescaleScreen() return; } - m_scaledScreen = m_image.scaled( m_scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); + m_scaledFramebuffer = m_image.scaled( m_scaledSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation ); - setControlFlag( ControlFlag::ScaledScreenNeedsUpdate, false ); + setControlFlag( ControlFlag::ScaledFramebufferNeedsUpdate, false ); } @@ -658,7 +658,7 @@ void VncConnection::finishFrameBufferUpdate() m_framebufferUpdateWatchdog.restart(); m_framebufferState = FramebufferState::Valid; - setControlFlag( ControlFlag::ScaledScreenNeedsUpdate, true ); + setControlFlag( ControlFlag::ScaledFramebufferNeedsUpdate, true ); Q_EMIT framebufferUpdateComplete(); } diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 8bb1d10ce..667213f33 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -127,7 +127,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread void setScaledSize( QSize s ); - QImage scaledScreen(); + QImage scaledFramebuffer(); void setFramebufferUpdateInterval( int interval ); @@ -136,7 +136,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread setControlFlag( ControlFlag::SkipHostPing, on ); } - void rescaleScreen(); + void rescaleFramebuffer(); static constexpr int VncConnectionTag = 0x590123; @@ -171,7 +171,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread static constexpr int RfbBytesPerPixel = sizeof(RfbPixel); enum class ControlFlag { - ScaledScreenNeedsUpdate = 0x01, + ScaledFramebufferNeedsUpdate = 0x01, ServerReachable = 0x02, TerminateThread = 0x04, RestartConnection = 0x08, @@ -250,7 +250,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread // framebuffer data and thread synchronization objects QImage m_image{}; - QImage m_scaledScreen{}; + QImage m_scaledFramebuffer{}; QSize m_scaledSize{}; QReadWriteLock m_imgLock{}; diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index 4704da142..660d5556f 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -73,11 +73,11 @@ QSGNode* VncViewItem::updatePaintNode( QSGNode* oldNode, UpdatePaintNodeData* up if( viewport().isValid() ) { - texture->setImage( computerControlInterface()->screen().copy( viewport() ) ); + texture->setImage( computerControlInterface()->framebuffer().copy( viewport() ) ); } else { - texture->setImage( computerControlInterface()->screen() ); + texture->setImage( computerControlInterface()->framebuffer() ); } node->setRect( boundingRect() ); diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 81e6ba459..a9535f241 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -118,8 +118,8 @@ QVariant ComputerControlListModel::data( const QModelIndex& index, int role ) co case GroupsRole: return computerControl->groups(); - case ScreenRole: - return computerControl->screen(); + case FramebufferRole: + return computerControl->framebuffer(); case ControlInterfaceRole: return QVariant::fromValue( computerControl ); @@ -182,7 +182,7 @@ void ComputerControlListModel::updateComputerScreenSize() for( auto& controlInterface : m_computerControlInterfaces ) { - controlInterface->setScaledScreenSize( newSize ); + controlInterface->setScaledFramebufferSize( newSize ); } if( m_computerScreenSize != newSize ) @@ -233,26 +233,26 @@ QImage ComputerControlListModel::computerDecorationRole( const ComputerControlIn { case ComputerControlInterface::State::Connected: { - const auto image = controlInterface->scaledScreen(); + const auto image = controlInterface->scaledFramebuffer(); if( image.isNull() == false ) { return image; } - return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledScreenSize() ); + return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledFramebufferSize() ); } case ComputerControlInterface::State::ServerNotRunning: - return scaleAndAlignIcon( m_iconServerNotRunning, controlInterface->scaledScreenSize() ); + return scaleAndAlignIcon( m_iconServerNotRunning, controlInterface->scaledFramebufferSize() ); case ComputerControlInterface::State::AuthenticationFailed: - return scaleAndAlignIcon( m_iconConnectionProblem, controlInterface->scaledScreenSize() ); + return scaleAndAlignIcon( m_iconConnectionProblem, controlInterface->scaledFramebufferSize() ); default: break; } - return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledScreenSize() ); + return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledFramebufferSize() ); } @@ -342,14 +342,14 @@ QModelIndex ComputerControlListModel::interfaceIndex( ComputerControlInterface* void ComputerControlListModel::updateState( const QModelIndex& index ) { - Q_EMIT dataChanged( index, index, { Qt::DisplayRole, Qt::DecorationRole, Qt::ToolTipRole, ImageIdRole, ScreenRole } ); + Q_EMIT dataChanged( index, index, { Qt::DisplayRole, Qt::DecorationRole, Qt::ToolTipRole, ImageIdRole, FramebufferRole } ); } void ComputerControlListModel::updateScreen( const QModelIndex& index ) { - Q_EMIT dataChanged( index, index, { Qt::DecorationRole, ImageIdRole, ScreenRole } ); + Q_EMIT dataChanged( index, index, { Qt::DecorationRole, ImageIdRole, FramebufferRole } ); } @@ -379,10 +379,10 @@ void ComputerControlListModel::startComputerControlInterface( ComputerControlInt { controlInterface->start( computerScreenSize(), ComputerControlInterface::UpdateMode::Monitoring ); - connect( controlInterface, &ComputerControlInterface::screenSizeChanged, + connect( controlInterface, &ComputerControlInterface::framebufferSizeChanged, this, &ComputerControlListModel::updateComputerScreenSize ); - connect( controlInterface, &ComputerControlInterface::scaledScreenUpdated, + connect( controlInterface, &ComputerControlInterface::scaledFramebufferUpdated, this, [=] () { updateScreen( interfaceIndex( controlInterface ) ); } ); connect( controlInterface, &ComputerControlInterface::activeFeaturesChanged, diff --git a/master/src/SlideshowModel.cpp b/master/src/SlideshowModel.cpp index 063a41e7d..ec497eb20 100644 --- a/master/src/SlideshowModel.cpp +++ b/master/src/SlideshowModel.cpp @@ -81,13 +81,13 @@ QVariant SlideshowModel::data( const QModelIndex& index, int role ) const if( role == Qt::DecorationRole ) { - auto screen = sourceModel()->data( sourceIndex, ComputerListModel::ScreenRole ).value(); - if( screen.isNull() ) + auto framebuffer = sourceModel()->data(sourceIndex, ComputerListModel::FramebufferRole).value(); + if (framebuffer.isNull()) { - screen = sourceModel()->data( sourceIndex, Qt::DecorationRole ).value(); + framebuffer = sourceModel()->data(sourceIndex, Qt::DecorationRole).value(); } - return screen.scaled( m_iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation ); + return framebuffer.scaled(m_iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); } return QSortFilterProxyModel::data( index, role ); diff --git a/master/src/SpotlightModel.cpp b/master/src/SpotlightModel.cpp index 77052000a..0a3630ae6 100644 --- a/master/src/SpotlightModel.cpp +++ b/master/src/SpotlightModel.cpp @@ -90,13 +90,13 @@ QVariant SpotlightModel::data( const QModelIndex& index, int role ) const if( role == Qt::DecorationRole ) { - auto screen = sourceModel()->data( sourceIndex, ComputerListModel::ScreenRole ).value(); - if( screen.isNull() ) + auto framebuffer = sourceModel()->data(sourceIndex, ComputerListModel::FramebufferRole).value(); + if (framebuffer.isNull()) { - screen = sourceModel()->data( sourceIndex, Qt::DecorationRole ).value(); + framebuffer = sourceModel()->data(sourceIndex, Qt::DecorationRole).value(); } - return screen.scaled( m_iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation ); + return framebuffer.scaled(m_iconSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); } return QSortFilterProxyModel::data( index, role ); From 432b4967f4beb0c35d2a22eb5951e3d92909534f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 10:33:34 +0100 Subject: [PATCH 1240/1765] MessageContext: add connection member --- core/src/MessageContext.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/core/src/MessageContext.h b/core/src/MessageContext.h index 5eb16cebe..a786804a0 100644 --- a/core/src/MessageContext.h +++ b/core/src/MessageContext.h @@ -34,9 +34,11 @@ class VEYON_CORE_EXPORT MessageContext { public: using IODevice = QPointer; + using Connection = QPointer; - explicit MessageContext( QIODevice* ioDevice = nullptr ) : - m_ioDevice( ioDevice ) + explicit MessageContext(QIODevice* ioDevice = nullptr, QObject* connection = nullptr) : + m_ioDevice( ioDevice ), + m_connection(connection) { } @@ -47,7 +49,13 @@ class VEYON_CORE_EXPORT MessageContext return m_ioDevice; } + QObject* connection() const + { + return m_connection; + } + private: IODevice m_ioDevice; + Connection m_connection; } ; From 3bd15a4bfacda61e456eff5c5d8c360ad7c7c786 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 10:34:55 +0100 Subject: [PATCH 1241/1765] ComputerControlClient: implement FB update rate control Based on a newly introduced update interval member, filter individual framebuffer update requests to throttle the FB update rate server-side. --- server/src/ComputerControlClient.cpp | 31 ++++++++++++++++++++++++++++ server/src/ComputerControlClient.h | 7 +++++++ 2 files changed, 38 insertions(+) diff --git a/server/src/ComputerControlClient.cpp b/server/src/ComputerControlClient.cpp index 10d4c23e8..fccdb449d 100644 --- a/server/src/ComputerControlClient.cpp +++ b/server/src/ComputerControlClient.cpp @@ -42,6 +42,7 @@ ComputerControlClient::ComputerControlClient( ComputerControlServer* server, server->accessControlManager() ), m_clientProtocol( vncServerSocket(), vncServerPassword ) { + m_framebufferUpdateTimer.start(); } @@ -68,5 +69,35 @@ bool ComputerControlClient::receiveClientMessage() return m_server->handleFeatureMessage( socket ); } + // filter framebuffer update requests when minimum framebuffer update interval is set + if (messageType == rfbFramebufferUpdateRequest && m_minimumFramebufferUpdateInterval > 0) + { + if (socket->bytesAvailable() < sz_rfbFramebufferUpdateRequestMsg) + { + return false; + } + + const auto messageData = socket->read(sz_rfbFramebufferUpdateRequestMsg); + const auto updateRequestMessage = reinterpret_cast(messageData.constData()); + + if (updateRequestMessage->incremental && + m_framebufferUpdateTimer.hasExpired(m_minimumFramebufferUpdateInterval) == false) + { + // discard update request + return true; + } + + // forward request to server + m_framebufferUpdateTimer.restart(); + return vncServerSocket()->write(messageData) == messageData.size(); + } + return VncProxyConnection::receiveClientMessage(); } + + + +void ComputerControlClient::setMinimumFramebufferUpdateInterval(int interval) +{ + m_minimumFramebufferUpdateInterval = interval; +} diff --git a/server/src/ComputerControlClient.h b/server/src/ComputerControlClient.h index 29fef33fe..4b387030e 100644 --- a/server/src/ComputerControlClient.h +++ b/server/src/ComputerControlClient.h @@ -24,6 +24,8 @@ #pragma once +#include + #include "VncClientProtocol.h" #include "VncProxyConnection.h" #include "VncServerClient.h" @@ -51,6 +53,8 @@ class ComputerControlClient : public VncProxyConnection return &m_serverClient; } + void setMinimumFramebufferUpdateInterval(int interval); + protected: VncClientProtocol& clientProtocol() override { @@ -70,4 +74,7 @@ class ComputerControlClient : public VncProxyConnection VeyonServerProtocol m_serverProtocol; VncClientProtocol m_clientProtocol; + int m_minimumFramebufferUpdateInterval{-1}; + QElapsedTimer m_framebufferUpdateTimer; + } ; From d343f2136fba6c0f4bdd1813f9bae6abb496a72c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 10:39:57 +0100 Subject: [PATCH 1242/1765] VeyonServerInterface: add setMinimumFramebufferUpdateInterval() --- core/src/VeyonServerInterface.h | 2 ++ server/src/ComputerControlClient.cpp | 2 +- server/src/ComputerControlServer.cpp | 17 +++++++++++++++-- server/src/ComputerControlServer.h | 6 +++++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index da0e4f3d2..cd56f1e81 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -48,4 +48,6 @@ class VEYON_CORE_EXPORT VeyonServerInterface : public QObject virtual int vncServerBasePort() const = 0; + virtual void setMinimumFramebufferUpdateInterval(const MessageContext& context, int interval) = 0; + }; diff --git a/server/src/ComputerControlClient.cpp b/server/src/ComputerControlClient.cpp index fccdb449d..a9308472c 100644 --- a/server/src/ComputerControlClient.cpp +++ b/server/src/ComputerControlClient.cpp @@ -66,7 +66,7 @@ bool ComputerControlClient::receiveClientMessage() if( messageType == FeatureMessage::RfbMessageType ) { - return m_server->handleFeatureMessage( socket ); + return m_server->handleFeatureMessage(this); } // filter framebuffer update requests when minimum framebuffer update interval is set diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index edfbf0c18..f8adc4f5d 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -104,8 +104,10 @@ VncProxyConnection* ComputerControlServer::createVncProxyConnection( QTcpSocket* -bool ComputerControlServer::handleFeatureMessage( QTcpSocket* socket ) +bool ComputerControlServer::handleFeatureMessage(ComputerControlClient* client) { + auto socket = client->proxyClientSocket(); + char messageType; if( socket->getChar( &messageType ) == false ) { @@ -123,7 +125,7 @@ bool ComputerControlServer::handleFeatureMessage( QTcpSocket* socket ) featureMessage.receive( socket ); - return VeyonCore::featureManager().handleFeatureMessage( *this, MessageContext{socket}, featureMessage ); + return VeyonCore::featureManager().handleFeatureMessage( *this, MessageContext{socket, client}, featureMessage ); } @@ -145,6 +147,17 @@ bool ComputerControlServer::sendFeatureMessageReply( const MessageContext& conte +void ComputerControlServer::setMinimumFramebufferUpdateInterval(const MessageContext& context, int interval) +{ + auto client = qobject_cast(context.connection()); + if (client) + { + client->setMinimumFramebufferUpdateInterval(interval); + } +} + + + void ComputerControlServer::checkForIncompleteAuthentication( VncServerClient* client ) { // connection to client closed during authentication? diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index bd3c1adbb..188a50b60 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -35,6 +35,8 @@ #include "VncProxyConnectionFactory.h" #include "VncServer.h" +class ComputerControlClient; + class ComputerControlServer : public VeyonServerInterface, VncProxyConnectionFactory { Q_OBJECT @@ -59,7 +61,7 @@ class ComputerControlServer : public VeyonServerInterface, VncProxyConnectionFac return m_serverAccessControlManager; } - bool handleFeatureMessage( QTcpSocket* socket ); + bool handleFeatureMessage(ComputerControlClient* client); bool sendFeatureMessageReply( const MessageContext& context, const FeatureMessage& reply ) override; @@ -73,6 +75,8 @@ class ComputerControlServer : public VeyonServerInterface, VncProxyConnectionFac return m_vncServer.serverBasePort(); } + void setMinimumFramebufferUpdateInterval(const MessageContext& context, int interval) override; + private: void checkForIncompleteAuthentication( VncServerClient* client ); void showAuthenticationMessage( VncServerClient* client ); From cf6574fc2fa6717df1a8c7df7cb98e7777ecb6ee Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 10:41:12 +0100 Subject: [PATCH 1243/1765] MonitoringMode: add setMinimumFramebufferUpdateInterval() --- core/src/MonitoringMode.cpp | 32 ++++++++++++++++++++++++++++---- core/src/MonitoringMode.h | 11 ++++++++++- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 9aaaa2758..189904a06 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -73,7 +73,17 @@ MonitoringMode::MonitoringMode( QObject* parent ) : void MonitoringMode::ping(const ComputerControlInterfaceList& computerControlInterfaces) { - sendFeatureMessage(FeatureMessage{m_monitoringModeFeature.uid()}, computerControlInterfaces, true); + sendFeatureMessage(FeatureMessage{m_monitoringModeFeature.uid(), Command::Ping}, computerControlInterfaces); +} + + + +void MonitoringMode::setMinimumFramebufferUpdateInterval(const ComputerControlInterfaceList& computerControlInterfaces, + int interval) +{ + sendFeatureMessage(FeatureMessage{m_monitoringModeFeature.uid(), Command::SetMinimumFramebufferUpdateInterval} + .addArgument(Argument::MinimumFramebufferUpdateInterval, interval), + computerControlInterfaces); } @@ -104,8 +114,12 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com { if (message.featureUid() == m_monitoringModeFeature.uid()) { - // successful ping reply implicitly handled through the featureMessageReceived() signal - return true; + if (message.command() == Command::Ping) + { + // successful ping reply implicitly handled through the featureMessageReceived() signal + return true; + } + } if( message.featureUid() == m_queryActiveFeatures.uid() ) @@ -165,7 +179,17 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, { if (message.featureUid() == m_monitoringModeFeature.uid()) { - return server.sendFeatureMessageReply(messageContext, message); + if (message.command() == Command::Ping) + { + return server.sendFeatureMessageReply(messageContext, message); + } + + if (message.command() == Command::SetMinimumFramebufferUpdateInterval) + { + server.setMinimumFramebufferUpdateInterval(messageContext, + message.argument(Argument::MinimumFramebufferUpdateInterval).toInt()); + return true; + } } if (m_queryActiveFeatures.uid() == message.featureUid()) diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 79d6194a1..5b0312d08 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -39,6 +39,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac UserFullName, UserSessionId, ScreenInfoList, + MinimumFramebufferUpdateInterval, ActiveFeaturesList = 0 // for compatibility after migration from FeatureControl }; Q_ENUM(Argument) @@ -87,6 +88,9 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void ping(const ComputerControlInterfaceList& computerControlInterfaces); + void setMinimumFramebufferUpdateInterval(const ComputerControlInterfaceList& computerControlInterfaces, + int interval); + void queryActiveFeatures(const ComputerControlInterfaceList& computerControlInterfaces); void queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ); @@ -137,6 +141,12 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void updateUserData(); void updateScreenInfoList(); + enum Command + { + Ping, + SetMinimumFramebufferUpdateInterval + }; + static constexpr int ActiveFeaturesUpdateInterval = 250; const Feature m_monitoringModeFeature; @@ -145,7 +155,6 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac const Feature m_queryScreensFeature; const FeatureList m_features; - int m_activeFeaturesVersion{0}; QStringList m_activeFeatures; QTimer m_activeFeaturesUpdateTimer; From eab15321c6dd3ccc7e8d16613a44837f0bfba145 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 10:42:09 +0100 Subject: [PATCH 1244/1765] ComputerControlInterface: refactor setUpdateMode() Use the newly introduced private setMinimumFramebufferUpdateInterval() method to set the framebuffer update interval both client- and server- side. --- core/src/ComputerControlInterface.cpp | 58 ++++++++++++++++----------- core/src/ComputerControlInterface.h | 1 + 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index f00038a78..4e5360aba 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -85,6 +85,7 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up Q_EMIT scaledFramebufferUpdated(); } ); + connect(vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::setMinimumFramebufferUpdateInterval); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateUser ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateActiveFeatures ); @@ -278,36 +279,16 @@ bool ComputerControlInterface::isMessageQueueEmpty() } + void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) { m_updateMode = updateMode; - const auto computerMonitoringUpdateInterval = VeyonCore::config().computerMonitoringUpdateInterval(); - - switch( m_updateMode ) - { - case UpdateMode::Disabled: - if( vncConnection() ) - { - vncConnection()->setFramebufferUpdateInterval( UpdateIntervalDisabled ); - } - break; - - case UpdateMode::Basic: - case UpdateMode::Monitoring: - case UpdateMode::Live: - if( vncConnection() ) - { - vncConnection()->setFramebufferUpdateInterval( ( m_updateMode == UpdateMode::Basic || - m_updateMode == UpdateMode::Monitoring ) ? - computerMonitoringUpdateInterval : -1 ); - } - break; - } + setMinimumFramebufferUpdateInterval(); - if( m_updateMode == UpdateMode::Basic ) + if (vncConnection()) { - vncConnection()->setSkipHostPing( true ); + vncConnection()->setSkipHostPing(m_updateMode == UpdateMode::Basic); } } @@ -327,6 +308,35 @@ void ComputerControlInterface::ping() +void ComputerControlInterface::setMinimumFramebufferUpdateInterval() +{ + auto updateInterval = -1; + + switch (m_updateMode) + { + case UpdateMode::Disabled: + updateInterval = UpdateIntervalDisabled; + break; + + case UpdateMode::Basic: + case UpdateMode::Monitoring: + updateInterval = VeyonCore::config().computerMonitoringUpdateInterval(); + break; + + case UpdateMode::Live: + break; + } + + if (vncConnection()) + { + vncConnection()->setFramebufferUpdateInterval(updateInterval); + } + + VeyonCore::builtinFeatures().monitoringMode().setMinimumFramebufferUpdateInterval({weakPointer()}, updateInterval); +} + + + void ComputerControlInterface::resetWatchdog() { if( state() == State::Connected ) diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 8c71c6451..40c637fb2 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -173,6 +173,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab private: void ping(); + void setMinimumFramebufferUpdateInterval(); void resetWatchdog(); void restartConnection(); From 3ee5375f06b736684656e223c21c3d795e186579 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 10:57:00 +0100 Subject: [PATCH 1245/1765] VncConnection: add support for server-side FB update rate control With Veyon 4.7 and newer the server automatically discards incoming update requests if too frequent so we can simplify the main loop. Therefore only sleep manually if the server does not support this newxi feature. This considerably reduces latencies when receiving asynchronous messages such as active features, user or screen info upates. --- core/src/VncConnection.cpp | 34 +++++++++++++++++----------------- core/src/VncConnection.h | 3 ++- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 03773c010..017c2d9d7 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -499,7 +499,8 @@ void VncConnection::handleConnection() { loopTimer.start(); - const int i = WaitForMessage( m_client, m_messageWaitTimeout ); + const int i = WaitForMessage(m_client, m_framebufferUpdateInterval > 0 ? + m_messageWaitTimeout * 100 : m_messageWaitTimeout); if( isControlFlagSet( ControlFlag::TerminateThread ) || i < 0 ) { break; @@ -518,25 +519,24 @@ void VncConnection::handleConnection() break; } } - - sendEvents(); - - const auto remainingUpdateInterval = m_framebufferUpdateInterval - loopTimer.elapsed(); - - if( m_framebufferState == FramebufferState::Initialized || - m_framebufferUpdateWatchdog.elapsed() >= qMax( 2*m_framebufferUpdateInterval, m_framebufferUpdateWatchdogTimeout ) ) + else if (m_framebufferUpdateWatchdog.elapsed() >= + qMax(2*m_framebufferUpdateInterval, m_framebufferUpdateWatchdogTimeout)) + { + SendFramebufferUpdateRequest(m_client, 0, 0, m_client->width, m_client->height, false); + m_framebufferUpdateWatchdog.restart(); + } + else if (m_framebufferUpdateInterval > 0 && m_framebufferUpdateWatchdog.elapsed() > m_framebufferUpdateInterval) { - SendFramebufferUpdateRequest( m_client, 0, 0, m_client->width, m_client->height, false ); + SendIncrementalFramebufferUpdateRequest(m_client); + m_framebufferUpdateWatchdog.restart(); + } - const auto remainingFastUpdateInterval = m_fastFramebufferUpdateInterval - loopTimer.elapsed(); + const auto remainingUpdateInterval = m_framebufferUpdateInterval - loopTimer.elapsed(); - sleeperMutex.lock(); - m_updateIntervalSleeper.wait( &sleeperMutex, remainingFastUpdateInterval ); - sleeperMutex.unlock(); - } - else if( m_framebufferState == FramebufferState::Valid && - remainingUpdateInterval > 0 && - isControlFlagSet( ControlFlag::TerminateThread ) == false ) + // compat with Veyon Server < 4.7 + if (remainingUpdateInterval > 0 && + isControlFlagSet(ControlFlag::RequiresManualUpdateRateControl) && + isControlFlagSet(ControlFlag::TerminateThread) == false) { sleeperMutex.lock(); m_updateIntervalSleeper.wait( &sleeperMutex, remainingUpdateInterval ); diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 667213f33..d5bd8482a 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -176,7 +176,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread TerminateThread = 0x04, RestartConnection = 0x08, DeleteAfterFinished = 0x10, - SkipHostPing = 0x20 + SkipHostPing = 0x20, + RequiresManualUpdateRateControl = 0x40 }; ~VncConnection() override; From 84a314c183bf92f873de83a1f93d3531b9f88f84 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 11:39:31 +0100 Subject: [PATCH 1246/1765] VeyonCore: complete ApplicationVersion enum --- core/src/VeyonCore.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index b1c8283af..81318c619 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -70,12 +70,15 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject using TlsConfiguration = QSslConfiguration; enum class ApplicationVersion { + Unknown = -1, Version_4_0, Version_4_1, Version_4_2, Version_4_3, Version_4_4, Version_4_5, + Version_4_6, + Version_4_7, Version_5_0, }; Q_ENUM(ApplicationVersion) From 0ad63908676407297203beb1a1b0c9f36b4ff6bf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 11:40:13 +0100 Subject: [PATCH 1247/1765] VeyonConfiguration: add version upgrade for 4.7 --- core/src/VeyonConfiguration.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index 5eb470e9e..40a3aa0e2 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -68,4 +68,8 @@ void VeyonConfiguration::upgrade() setApplicationVersion( VeyonCore::ApplicationVersion::Version_4_5 ); } + else if (applicationVersion() < VeyonCore::ApplicationVersion::Version_4_7) + { + setApplicationVersion(VeyonCore::ApplicationVersion::Version_4_7); + } } From cc8b5791da95115355339d2c6e39f4d80b38c5f0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 11:40:59 +0100 Subject: [PATCH 1248/1765] MonitoringMode: add queryApplicationVersion() --- core/src/MonitoringMode.cpp | 32 +++++++++++++++++++++++++++++--- core/src/MonitoringMode.h | 4 ++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 189904a06..9d7522f72 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -30,6 +30,7 @@ #include "MonitoringMode.h" #include "PlatformSessionFunctions.h" #include "PlatformUserFunctions.h" +#include "VeyonConfiguration.h" #include "VeyonServerInterface.h" @@ -42,6 +43,10 @@ MonitoringMode::MonitoringMode( QObject* parent ) : tr( "Monitoring" ), tr( "Monitoring" ), tr( "This mode allows you to monitor all computers at one or more locations." ), QStringLiteral( ":/core/presentation-none.png" ) ), + m_queryApplicationVersionFeature( QStringLiteral("QueryApplicationVersion"), + Feature::Flag::Service | Feature::Flag::Builtin, + Feature::Uid{"58f5d5d5-9929-48f4-a995-f221c150ae26"}, {}, + tr("Query application version of the server"), {}, {} ), m_queryActiveFeatures( QStringLiteral("QueryActiveFeatures"), Feature::Flag::Service | Feature::Flag::Builtin, Feature::Uid{"a0a96fba-425d-414a-aaf4-352b76d7c4f3"}, {}, @@ -54,7 +59,8 @@ MonitoringMode::MonitoringMode( QObject* parent ) : Feature::Flag::Meta, Feature::Uid("d5bbc486-7bc5-4c36-a9a8-1566c8b0091a"), Feature::Uid(), tr("Query properties of remotely available screens"), {}, {} ), - m_features( { m_monitoringModeFeature, m_queryActiveFeatures, m_queryLoggedOnUserInfoFeature, m_queryScreensFeature } ) + m_features({ m_monitoringModeFeature, m_queryApplicationVersionFeature, m_queryActiveFeatures, + m_queryLoggedOnUserInfoFeature, m_queryScreensFeature }) { if(VeyonCore::component() == VeyonCore::Component::Server) { @@ -88,6 +94,13 @@ void MonitoringMode::setMinimumFramebufferUpdateInterval(const ComputerControlIn +void MonitoringMode::queryApplicationVersion(const ComputerControlInterfaceList& computerControlInterfaces) +{ + sendFeatureMessage(FeatureMessage{m_queryApplicationVersionFeature.uid()}, computerControlInterfaces); +} + + + void MonitoringMode::queryActiveFeatures(const ComputerControlInterfaceList& computerControlInterfaces) { sendFeatureMessage(FeatureMessage{m_queryActiveFeatures.uid()}, computerControlInterfaces); @@ -119,7 +132,13 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com // successful ping reply implicitly handled through the featureMessageReceived() signal return true; } + } + if (message.featureUid() == m_queryApplicationVersionFeature.uid()) + { + computerControlInterface->setServerVersion(message.argument(Argument::ApplicationVersion) + .value()); + return true; } if( message.featureUid() == m_queryActiveFeatures.uid() ) @@ -174,8 +193,8 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, - const MessageContext& messageContext, - const FeatureMessage& message ) + const MessageContext& messageContext, + const FeatureMessage& message ) { if (message.featureUid() == m_monitoringModeFeature.uid()) { @@ -192,6 +211,13 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, } } + if (message.featureUid() == m_queryApplicationVersionFeature.uid()) + { + server.sendFeatureMessageReply(messageContext, + FeatureMessage{m_queryApplicationVersionFeature.uid()} + .addArgument(Argument::ApplicationVersion, int(VeyonCore::config().applicationVersion()))); + } + if (m_queryActiveFeatures.uid() == message.featureUid()) { return sendActiveFeatures(server, messageContext); diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 5b0312d08..fb31a17e9 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -40,6 +40,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac UserSessionId, ScreenInfoList, MinimumFramebufferUpdateInterval, + ApplicationVersion, ActiveFeaturesList = 0 // for compatibility after migration from FeatureControl }; Q_ENUM(Argument) @@ -91,6 +92,8 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void setMinimumFramebufferUpdateInterval(const ComputerControlInterfaceList& computerControlInterfaces, int interval); + void queryApplicationVersion(const ComputerControlInterfaceList& computerControlInterfaces); + void queryActiveFeatures(const ComputerControlInterfaceList& computerControlInterfaces); void queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ); @@ -150,6 +153,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac static constexpr int ActiveFeaturesUpdateInterval = 250; const Feature m_monitoringModeFeature; + const Feature m_queryApplicationVersionFeature; const Feature m_queryActiveFeatures; const Feature m_queryLoggedOnUserInfoFeature; const Feature m_queryScreensFeature; From 78603168f8335699b636317a7609d61c74f6d90c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 11:41:49 +0100 Subject: [PATCH 1249/1765] VncConnection: add setRequiresManualUpdateRateControl() --- core/src/VncConnection.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index d5bd8482a..210431023 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -136,6 +136,11 @@ class VEYON_CORE_EXPORT VncConnection : public QThread setControlFlag( ControlFlag::SkipHostPing, on ); } + void setRequiresManualUpdateRateControl(bool on) + { + setControlFlag(ControlFlag::RequiresManualUpdateRateControl, on); + } + void rescaleFramebuffer(); static constexpr int VncConnectionTag = 0x590123; From b4caa99394fec18241c684ed7a14918388408dae Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 11:42:06 +0100 Subject: [PATCH 1250/1765] CCI: query server version and set FB update rate control flag If the server does not respond (i.e. older than 4.7), manually set the server version after a timeout. --- core/src/ComputerControlInterface.cpp | 36 +++++++++++++++++++++++++++ core/src/ComputerControlInterface.h | 12 +++++++++ 2 files changed, 48 insertions(+) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 4e5360aba..2f8a114b9 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -44,6 +44,12 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in m_connectionWatchdogTimer.setInterval( ConnectionWatchdogTimeout ); m_connectionWatchdogTimer.setSingleShot( true ); connect( &m_connectionWatchdogTimer, &QTimer::timeout, this, &ComputerControlInterface::restartConnection ); + + m_serverVersionQueryTimer.setInterval(ServerVersionQueryTimeout); + m_serverVersionQueryTimer.setSingleShot(true); + connect( &m_serverVersionQueryTimer, &QTimer::timeout, this, [this]() { + setServerVersion(VeyonCore::ApplicationVersion::Unknown); + }); } @@ -86,6 +92,7 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up } ); connect(vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::setMinimumFramebufferUpdateInterval); + connect(vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateServerVersion); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateUser ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateActiveFeatures ); @@ -182,6 +189,20 @@ QImage ComputerControlInterface::framebuffer() const +void ComputerControlInterface::setServerVersion(VeyonCore::ApplicationVersion version) +{ + m_serverVersionQueryTimer.stop(); + + m_serverVersion = version; + + if (vncConnection()) + { + vncConnection()->setRequiresManualUpdateRateControl(m_serverVersion < VeyonCore::ApplicationVersion::Version_4_7); + } +} + + + void ComputerControlInterface::setUserInformation( const QString& userLoginName, const QString& userFullName, int sessionId ) { if( userLoginName != m_userLoginName || @@ -388,6 +409,21 @@ void ComputerControlInterface::updateState() +void ComputerControlInterface::updateServerVersion() +{ + lock(); + + if (vncConnection()) + { + VeyonCore::builtinFeatures().monitoringMode().queryApplicationVersion({weakPointer()}); + m_serverVersionQueryTimer.start(); + } + + unlock(); +} + + + void ComputerControlInterface::updateUser() { lock(); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 40c637fb2..bdef8e6dc 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -104,6 +104,13 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_timestamp; } + VeyonCore::ApplicationVersion serverVersion() const + { + return m_serverVersion; + } + + void setServerVersion(VeyonCore::ApplicationVersion version); + const QString& userLoginName() const { return m_userLoginName; @@ -178,12 +185,14 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void restartConnection(); void updateState(); + void updateServerVersion(); void updateUser(); void handleFeatureMessage( const FeatureMessage& message ); static constexpr int ConnectionWatchdogPingDelay = 10000; static constexpr int ConnectionWatchdogTimeout = ConnectionWatchdogPingDelay*2; + static constexpr int ServerVersionQueryTimeout = 5000; static constexpr int UpdateIntervalDisabled = 5000; const Computer m_computer; @@ -206,6 +215,9 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QTimer m_pingTimer{this}; QTimer m_connectionWatchdogTimer{this}; + VeyonCore::ApplicationVersion m_serverVersion{VeyonCore::ApplicationVersion::Unknown}; + QTimer m_serverVersionQueryTimer{this}; + QStringList m_groups; Q_SIGNALS: From fd6dabfec1673ce6af2dd2d4a693376a13d20811 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 11:46:04 +0100 Subject: [PATCH 1251/1765] VeyonMaster: fix update mode of local session control interface There's no need to receive framebuffer updates. --- master/src/VeyonMaster.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index e5d387454..d9f024e8d 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -67,7 +67,7 @@ VeyonMaster::VeyonMaster( QObject* parent ) : this, &VeyonMaster::enforceDesignatedMode ); } - m_localSessionControlInterface.start(); + m_localSessionControlInterface.start({}, ComputerControlInterface::UpdateMode::Disabled); initUserInterface(); } From f01e2e240a7225befd07c7760037ed27da23d3e6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 12:02:49 +0100 Subject: [PATCH 1252/1765] VncConnection: trigger FB update on update interval change Also wake the thread in case it runs with client-side update rate control. --- core/src/VncConnection.cpp | 12 ++++++++++++ core/src/VncConnection.h | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 017c2d9d7..2df62cb9a 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -261,6 +261,13 @@ QImage VncConnection::scaledFramebuffer() void VncConnection::setFramebufferUpdateInterval( int interval ) { m_framebufferUpdateInterval = interval; + + if (m_framebufferUpdateInterval <= 0) + { + setControlFlag(ControlFlag::TriggerFramebufferUpdate, true); + } + + m_updateIntervalSleeper.wakeAll(); } @@ -530,6 +537,11 @@ void VncConnection::handleConnection() SendIncrementalFramebufferUpdateRequest(m_client); m_framebufferUpdateWatchdog.restart(); } + else if (isControlFlagSet(ControlFlag::TriggerFramebufferUpdate)) + { + setControlFlag(ControlFlag::TriggerFramebufferUpdate, false); + SendIncrementalFramebufferUpdateRequest(m_client); + } const auto remainingUpdateInterval = m_framebufferUpdateInterval - loopTimer.elapsed(); diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 210431023..b75a8f9ac 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -182,7 +182,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread RestartConnection = 0x08, DeleteAfterFinished = 0x10, SkipHostPing = 0x20, - RequiresManualUpdateRateControl = 0x40 + RequiresManualUpdateRateControl = 0x40, + TriggerFramebufferUpdate = 0x80 }; ~VncConnection() override; From 31c4da8d48e7532387b6390715b0b60d8a308e45 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 12:07:37 +0100 Subject: [PATCH 1253/1765] VncConnection: always wake thread when enqueing events --- core/src/ComputerControlInterface.cpp | 4 ++-- core/src/ComputerControlInterface.h | 2 +- core/src/FeatureProviderInterface.h | 8 +++----- core/src/VeyonConnection.cpp | 4 ++-- core/src/VeyonConnection.h | 2 +- core/src/VncConnection.cpp | 15 ++++++--------- core/src/VncConnection.h | 2 +- 7 files changed, 16 insertions(+), 21 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 2f8a114b9..8e662e3b9 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -279,11 +279,11 @@ void ComputerControlInterface::updateActiveFeatures() -void ComputerControlInterface::sendFeatureMessage( const FeatureMessage& featureMessage, bool wake ) +void ComputerControlInterface::sendFeatureMessage(const FeatureMessage& featureMessage) { if( m_connection && m_connection->isConnected() ) { - m_connection->sendFeatureMessage( featureMessage, wake ); + m_connection->sendFeatureMessage(featureMessage); } } diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index bdef8e6dc..2aee84380 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -167,7 +167,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void updateActiveFeatures(); - void sendFeatureMessage( const FeatureMessage& featureMessage, bool wake ); + void sendFeatureMessage(const FeatureMessage& featureMessage); bool isMessageQueueEmpty(); void setUpdateMode( UpdateMode updateMode ); diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index 4dac25475..a08019807 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -182,13 +182,11 @@ class VEYON_CORE_EXPORT FeatureProviderInterface } protected: - void sendFeatureMessage( const FeatureMessage& message, - const ComputerControlInterfaceList& computerControlInterfaces, - bool wake = true ) + void sendFeatureMessage(const FeatureMessage& message, const ComputerControlInterfaceList& computerControlInterfaces) { - for( const auto& controlInterface : computerControlInterfaces ) + for (const auto& controlInterface : computerControlInterfaces) { - controlInterface->sendFeatureMessage( message, wake ); + controlInterface->sendFeatureMessage(message); } } diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index d89fe00c5..428148693 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -87,11 +87,11 @@ void VeyonConnection::stopAndDeleteLater() -void VeyonConnection::sendFeatureMessage( const FeatureMessage& featureMessage, bool wake ) +void VeyonConnection::sendFeatureMessage(const FeatureMessage& featureMessage) { if( m_vncConnection ) { - m_vncConnection->enqueueEvent( new VncFeatureMessageEvent( featureMessage ), wake ); + m_vncConnection->enqueueEvent(new VncFeatureMessageEvent(featureMessage)); } } diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index 3fdd76749..d727ccc6f 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -64,7 +64,7 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject return m_userHomeDir; } - void sendFeatureMessage( const FeatureMessage& featureMessage, bool wake ); + void sendFeatureMessage(const FeatureMessage& featureMessage); bool handleServerMessage( rfbClient* client, uint8_t msg ); diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 2df62cb9a..b5da0a0e5 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -197,7 +197,7 @@ void VncConnection::setUseRemoteCursor( bool enabled ) { m_client->appData.useRemoteCursor = enabled ? TRUE : FALSE; - enqueueEvent( new VncUpdateFormatAndEncodingsEvent, true ); + enqueueEvent(new VncUpdateFormatAndEncodingsEvent); } } @@ -210,7 +210,7 @@ void VncConnection::setServerReachable() -void VncConnection::enqueueEvent( VncEvent* event, bool wake ) +void VncConnection::enqueueEvent(VncEvent* event) { if( state() != State::Connected ) { @@ -221,10 +221,7 @@ void VncConnection::enqueueEvent( VncEvent* event, bool wake ) m_eventQueue.enqueue( event ); m_eventQueueMutex.unlock(); - if( wake ) - { - m_updateIntervalSleeper.wakeAll(); - } + m_updateIntervalSleeper.wakeAll(); } @@ -343,21 +340,21 @@ qint64 VncConnection::libvncClientDispatcher( char* buffer, const qint64 bytes, void VncConnection::mouseEvent( int x, int y, uint buttonMask ) { - enqueueEvent( new VncPointerEvent( x, y, buttonMask ), true ); + enqueueEvent(new VncPointerEvent(x, y, buttonMask)); } void VncConnection::keyEvent( unsigned int key, bool pressed ) { - enqueueEvent( new VncKeyEvent( key, pressed ), true ); + enqueueEvent(new VncKeyEvent(key, pressed)); } void VncConnection::clientCut( const QString& text ) { - enqueueEvent( new VncClientCutEvent( text ), true ); + enqueueEvent(new VncClientCutEvent(text )); } diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index b75a8f9ac..aeb1176da 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -116,7 +116,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread void setServerReachable(); - void enqueueEvent( VncEvent* event, bool wake ); + void enqueueEvent(VncEvent* event); bool isEventQueueEmpty(); /** \brief Returns whether framebuffer data is valid, i.e. at least one full FB update received */ From 66faeed77f18b1dd75577c0529a046676a7bb0b4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 12:11:22 +0100 Subject: [PATCH 1254/1765] CCI: make updateScreens()/updateActiveFeatures() private --- core/src/ComputerControlInterface.cpp | 72 +++++++++++++-------------- core/src/ComputerControlInterface.h | 7 +-- 2 files changed, 38 insertions(+), 41 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 8e662e3b9..e5f0eecd7 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -219,24 +219,6 @@ void ComputerControlInterface::setUserInformation( const QString& userLoginName, -void ComputerControlInterface::updateScreens() -{ - lock(); - - if( vncConnection() && state() == State::Connected ) - { - VeyonCore::builtinFeatures().monitoringMode().queryScreens( { weakPointer() } ); - } - else - { - setScreens({}); - } - - unlock(); -} - - - void ComputerControlInterface::setScreens(const ScreenList& screens) { if(screens != m_screens) @@ -261,24 +243,6 @@ void ComputerControlInterface::setActiveFeatures( const FeatureUidList& activeFe -void ComputerControlInterface::updateActiveFeatures() -{ - lock(); - - if( vncConnection() && state() == State::Connected ) - { - VeyonCore::builtinFeatures().monitoringMode().queryActiveFeatures({weakPointer()}); - } - else - { - setActiveFeatures( {} ); - } - - unlock(); -} - - - void ComputerControlInterface::sendFeatureMessage(const FeatureMessage& featureMessage) { if( m_connection && m_connection->isConnected() ) @@ -424,6 +388,24 @@ void ComputerControlInterface::updateServerVersion() +void ComputerControlInterface::updateActiveFeatures() +{ + lock(); + + if (vncConnection() && state() == State::Connected) + { + VeyonCore::builtinFeatures().monitoringMode().queryActiveFeatures({weakPointer()}); + } + else + { + setActiveFeatures({}); + } + + unlock(); +} + + + void ComputerControlInterface::updateUser() { lock(); @@ -445,6 +427,24 @@ void ComputerControlInterface::updateUser() +void ComputerControlInterface::updateScreens() +{ + lock(); + + if (vncConnection() && state() == State::Connected) + { + VeyonCore::builtinFeatures().monitoringMode().queryScreens({weakPointer()}); + } + else + { + setScreens({}); + } + + unlock(); +} + + + void ComputerControlInterface::handleFeatureMessage( const FeatureMessage& message ) { lock(); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 2aee84380..06b5d360a 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -128,8 +128,6 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void setUserInformation( const QString& userLoginName, const QString& userFullName, int sessionId ); - void updateScreens(); - const ScreenList& screens() const { return m_screens; @@ -164,9 +162,6 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab m_groups = groups; } - - void updateActiveFeatures(); - void sendFeatureMessage(const FeatureMessage& featureMessage); bool isMessageQueueEmpty(); @@ -186,7 +181,9 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void updateState(); void updateServerVersion(); + void updateActiveFeatures(); void updateUser(); + void updateScreens(); void handleFeatureMessage( const FeatureMessage& message ); From cba93e884e6801b40a3755854d18475949f5f8a9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 13:23:35 +0100 Subject: [PATCH 1255/1765] FeatureManager: log host addresses first --- core/src/FeatureManager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 100ea8145..7dd4b1cdd 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -158,7 +158,7 @@ void FeatureManager::startFeature( VeyonMasterInterface& master, const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) const { - vDebug() << feature.name() << computerControlInterfaces; + vDebug() << computerControlInterfaces << feature.name(); for( auto featureInterface : qAsConst( m_featurePluginInterfaces ) ) { @@ -180,7 +180,7 @@ void FeatureManager::stopFeature( VeyonMasterInterface& master, const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) const { - vDebug() << feature.name() << computerControlInterfaces; + vDebug() << computerControlInterfaces << feature.name(); for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) { @@ -201,7 +201,7 @@ void FeatureManager::stopFeature( VeyonMasterInterface& master, bool FeatureManager::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message ) const { - vDebug() << message << computerControlInterface; + vDebug() << computerControlInterface << message; bool handled = false; From 1fca829c023d20f5ba8dfbb44d6727490d3a435c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 13:24:01 +0100 Subject: [PATCH 1256/1765] VeyonConnection: log host address in handleServerMessage() --- core/src/VeyonConnection.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 428148693..5e4d32be5 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -110,7 +110,8 @@ bool VeyonConnection::handleServerMessage( rfbClient* client, uint8_t msg ) return false; } - vDebug() << featureMessage; + vDebug() << qUtf8Printable(QStringLiteral("%1:%2").arg(QString::fromUtf8(client->serverHost)).arg(client->serverPort)) + << featureMessage; Q_EMIT featureMessageReceived( featureMessage ); From 4bc4edfa3270abbffb09e64e3dc1986d69c769d0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 13:25:24 +0100 Subject: [PATCH 1257/1765] VncFeatureMessageEvent: log host address in fire() --- core/src/VncFeatureMessageEvent.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/VncFeatureMessageEvent.cpp b/core/src/VncFeatureMessageEvent.cpp index 8e7513637..733f7ed2e 100644 --- a/core/src/VncFeatureMessageEvent.cpp +++ b/core/src/VncFeatureMessageEvent.cpp @@ -22,13 +22,15 @@ * */ +#include "rfb/rfbclient.h" + #include "SocketDevice.h" #include "VncConnection.h" #include "VncFeatureMessageEvent.h" VncFeatureMessageEvent::VncFeatureMessageEvent( const FeatureMessage& featureMessage ) : - m_featureMessage( featureMessage ) + m_featureMessage( featureMessage ) { } @@ -36,7 +38,8 @@ VncFeatureMessageEvent::VncFeatureMessageEvent( const FeatureMessage& featureMes void VncFeatureMessageEvent::fire( rfbClient* client ) { - vDebug() << m_featureMessage; + vDebug() << qUtf8Printable(QStringLiteral("%1:%2").arg(QString::fromUtf8(client->serverHost)).arg(client->serverPort)) + << m_featureMessage; SocketDevice socketDevice( VncConnection::libvncClientDispatcher, client ); const char messageType = FeatureMessage::RfbMessageType; From 79426e92546fdce54145235f9e1adf515c540fd8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 13:25:46 +0100 Subject: [PATCH 1258/1765] VeyonMaster: check designated mode feature for validity --- master/src/VeyonMaster.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index d9f024e8d..8763022d9 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -241,7 +241,8 @@ void VeyonMaster::enforceDesignatedMode( const QModelIndex& index ) { const auto designatedModeFeature = controlInterface->designatedModeFeature(); - if( designatedModeFeature != VeyonCore::builtinFeatures().monitoringMode().feature().uid() && + if( designatedModeFeature.isNull() == false && + designatedModeFeature != VeyonCore::builtinFeatures().monitoringMode().feature().uid() && controlInterface->activeFeatures().contains( designatedModeFeature ) == false && controlInterface->activeFeatures().contains( VeyonCore::featureManager().metaFeatureUid(designatedModeFeature) ) == false ) { From dbeb274aa59d641a59525167bc3ef45e117ecd21 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 13:30:22 +0100 Subject: [PATCH 1259/1765] ComputerControlServer: return success if message was received For the raw protocol processing it doesn't matter if a certain feature message was handled or not. --- server/src/ComputerControlServer.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index f8adc4f5d..221f4d0f8 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -123,9 +123,14 @@ bool ComputerControlServer::handleFeatureMessage(ComputerControlClient* client) return false; } - featureMessage.receive( socket ); + if (featureMessage.receive(socket) == false) + { + return false; + } - return VeyonCore::featureManager().handleFeatureMessage( *this, MessageContext{socket, client}, featureMessage ); + VeyonCore::featureManager().handleFeatureMessage( *this, MessageContext{socket, client}, featureMessage ); + + return true; } From a2377884cbdac0f75c883959a4f8bc29656d754b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 13:31:19 +0100 Subject: [PATCH 1260/1765] FeatureManager: drop return values from handle methods --- core/src/FeatureManager.cpp | 41 +++++++++---------------------------- core/src/FeatureManager.h | 12 +++++------ 2 files changed, 16 insertions(+), 37 deletions(-) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 7dd4b1cdd..f988d8cc9 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -198,68 +198,47 @@ void FeatureManager::stopFeature( VeyonMasterInterface& master, -bool FeatureManager::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, - const FeatureMessage& message ) const +void FeatureManager::handleFeatureMessage(ComputerControlInterface::Pointer computerControlInterface, + const FeatureMessage& message) const { vDebug() << computerControlInterface << message; - bool handled = false; - for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) { - if( featureInterface->handleFeatureMessage( computerControlInterface, message ) ) - { - handled = true; - } + featureInterface->handleFeatureMessage(computerControlInterface, message); } - - return handled; } -bool FeatureManager::handleFeatureMessage( VeyonServerInterface& server, - const MessageContext& messageContext, - const FeatureMessage& message ) const +void FeatureManager::handleFeatureMessage(VeyonServerInterface& server, + const MessageContext& messageContext, + const FeatureMessage& message) const { vDebug() << "[SERVER]" << message; if( VeyonCore::config().disabledFeatures().contains( message.featureUid().toString() ) ) { vWarning() << "ignoring message as feature" << message.featureUid() << "is disabled by configuration!"; - return false; + return; } - bool handled = false; - for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) { - if( featureInterface->handleFeatureMessage( server, messageContext, message ) ) - { - handled = true; - } + featureInterface->handleFeatureMessage(server, messageContext, message); } - - return handled; } -bool FeatureManager::handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) const +void FeatureManager::handleFeatureMessage(VeyonWorkerInterface& worker, const FeatureMessage& message) const { vDebug() << "[WORKER]" << message; - bool handled = false; - for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) { - if( featureInterface->handleFeatureMessage( worker, message ) ) - { - handled = true; - } + featureInterface->handleFeatureMessage(worker, message); } - - return handled; } diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index 9efeae444..26d634e1f 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -69,12 +69,12 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) const; - bool handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, - const FeatureMessage& message ) const; - bool handleFeatureMessage( VeyonServerInterface& server, - const MessageContext& messageContext, - const FeatureMessage& message ) const; - bool handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) const; + void handleFeatureMessage(ComputerControlInterface::Pointer computerControlInterface, + const FeatureMessage& message) const; + void handleFeatureMessage(VeyonServerInterface& server, + const MessageContext& messageContext, + const FeatureMessage& message) const; + void handleFeatureMessage(VeyonWorkerInterface& worker, const FeatureMessage& message) const; void sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) const; From d7df7278bfb0f61b03518690e59b707ea5ee88b8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 14:18:27 +0100 Subject: [PATCH 1261/1765] CCI: improve compat with Veyon < 4.7 If Veyon Server < 4.7 is running, switch back to polling and don't query screens and omit pings. For the sake of simplicity, when in update mode UpdateMode::Disabled, the polling rate is not adjusted so polling continues with the configured update interval. --- core/src/ComputerControlInterface.cpp | 34 +++++++++++++++++++++++---- core/src/ComputerControlInterface.h | 2 ++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index e5f0eecd7..ac12dffab 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -50,6 +50,11 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in connect( &m_serverVersionQueryTimer, &QTimer::timeout, this, [this]() { setServerVersion(VeyonCore::ApplicationVersion::Unknown); }); + + connect(&m_compatPollingTimer, &QTimer::timeout, this, [this]() { + updateUser(); + updateActiveFeatures(); + }); } @@ -195,9 +200,21 @@ void ComputerControlInterface::setServerVersion(VeyonCore::ApplicationVersion ve m_serverVersion = version; - if (vncConnection()) + if (m_serverVersion >= VeyonCore::ApplicationVersion::Version_4_7) { - vncConnection()->setRequiresManualUpdateRateControl(m_serverVersion < VeyonCore::ApplicationVersion::Version_4_7); + m_compatPollingTimer.stop(); + + updateScreens(); + setMinimumFramebufferUpdateInterval(); + } + else + { + if (vncConnection()) + { + vncConnection()->setRequiresManualUpdateRateControl(true); + } + + m_compatPollingTimer.start(VeyonCore::config().computerMonitoringUpdateInterval()); } } @@ -288,7 +305,10 @@ ComputerControlInterface::Pointer ComputerControlInterface::weakPointer() void ComputerControlInterface::ping() { - VeyonCore::builtinFeatures().monitoringMode().ping({weakPointer()}); + if (m_serverVersion >= VeyonCore::ApplicationVersion::Version_4_7) + { + VeyonCore::builtinFeatures().monitoringMode().ping({weakPointer()}); + } } @@ -317,7 +337,10 @@ void ComputerControlInterface::setMinimumFramebufferUpdateInterval() vncConnection()->setFramebufferUpdateInterval(updateInterval); } - VeyonCore::builtinFeatures().monitoringMode().setMinimumFramebufferUpdateInterval({weakPointer()}, updateInterval); + if (m_serverVersion >= VeyonCore::ApplicationVersion::Version_4_7) + { + VeyonCore::builtinFeatures().monitoringMode().setMinimumFramebufferUpdateInterval({weakPointer()}, updateInterval); + } } @@ -431,7 +454,8 @@ void ComputerControlInterface::updateScreens() { lock(); - if (vncConnection() && state() == State::Connected) + if (vncConnection() && state() == State::Connected && + m_serverVersion >= VeyonCore::ApplicationVersion::Version_4_7) { VeyonCore::builtinFeatures().monitoringMode().queryScreens({weakPointer()}); } diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 06b5d360a..d79314f57 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -215,6 +215,8 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab VeyonCore::ApplicationVersion m_serverVersion{VeyonCore::ApplicationVersion::Unknown}; QTimer m_serverVersionQueryTimer{this}; + QTimer m_compatPollingTimer{this}; + QStringList m_groups; Q_SIGNALS: From 39a4251187b7968ea06d59a40e8d3b7e72e64c61 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Nov 2021 14:39:04 +0100 Subject: [PATCH 1262/1765] Demo: only revert update mode if disabled --- plugins/demo/DemoFeaturePlugin.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 6bf0c79b8..27195605d 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -643,7 +643,8 @@ bool DemoFeaturePlugin::controlDemoClient( Feature::Uid featureUid, Operation op { m_demoServerClients.removeAll( computerControlInterface ); - if( enableUpdates ) + if (enableUpdates && + computerControlInterface->updateMode() == ComputerControlInterface::UpdateMode::Disabled) { computerControlInterface->setUpdateMode( ComputerControlInterface::UpdateMode::Monitoring ); } From f7843d07aa4fcf8c600b3bb9213f0ebd519d0538 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 2 Dec 2021 14:08:01 +0100 Subject: [PATCH 1263/1765] CoreFunctions: fix build for mingw-w64 < 8 --- plugins/platform/windows/WindowsCoreFunctions.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 2f3637c4a..928f8486d 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -38,7 +38,6 @@ #include "XEventLog.h" - static bool configureSoftwareSAS( bool enabled ) { HKEY hkLocal; @@ -376,7 +375,14 @@ QString WindowsCoreFunctions::queryDisplayDeviceName(const QScreen& screen) cons return QStringLiteral("DP-%1").arg(name.connectorInstance); case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS: return QStringLiteral("LVDS-%1").arg(name.connectorInstance); +#if __MINGW64_VERSION_MAJOR < 8 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wswitch" + case 15: +#pragma GCC diagnostic pop +#else case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST: +#endif return QStringLiteral("Miracast-%1").arg(name.connectorInstance); case DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO: return QStringLiteral("S-Video-%1").arg(name.connectorInstance); From b39b416e071ab41ded79e68066d2dab85d524bdc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 3 Dec 2021 13:36:01 +0100 Subject: [PATCH 1264/1765] CMake: prepare support for unit tests Plugins can be tested easily by adding a call to test_veyon_plugin() as well as an appropriate test source code file. --- CMakeLists.txt | 15 +++++++-------- cmake/modules/BuildVeyonPlugin.cmake | 13 ++++++++++++- core/CMakeLists.txt | 7 ++++++- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dc53733a..5316d94b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -184,7 +184,7 @@ option(WITH_LTO "Build with link-time optimization" ON) option(WITH_PCH "Reduce compile time by using precompiled headers (requires CMake >= 3.16)" ON) option(WITH_UNITY_BUILD "Reduce compile time by using cmake unity builds (requires CMake >= 3.16)" ON) option(WITH_SANITIZERS "Build with thread and UB sanitizers" OFF) -option(WITH_MODEL_TESTERS "Build with model testers (turn on for debugging only)" OFF) +option(WITH_TESTS "Build tests and integrate runtime test extensions" OFF) option(WITH_CORE_ONLY "Build core library only" OFF) option(WITH_ADDONS "Build add-ons" OFF) @@ -214,18 +214,17 @@ set(VEYON_COMPILE_OPTIONS "-Wall;-Werror") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong ${CFLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong -fno-exceptions ${CXXFLAGS}") -set(CMAKE_C_VISIBILITY_PRESET hidden) -set(CMAKE_CXX_VISIBILITY_PRESET hidden) -set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) - -if(WITH_MODEL_TESTERS) +if(WITH_TESTS) + enable_testing(TRUE) if(WITH_QT6) find_package(Qt6 COMPONENTS Test REQUIRED) - set(VEYON_DEBUG_LIBRARIES Qt6::Test) else() find_package(Qt5Test REQUIRED) - set(VEYON_DEBUG_LIBRARIES Qt5::Test) endif() +else() + set(CMAKE_C_VISIBILITY_PRESET hidden) + set(CMAKE_CXX_VISIBILITY_PRESET hidden) + set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) endif() add_definitions( diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index 8696a5d55..7e56d527c 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -6,7 +6,11 @@ include(SetDefaultTargetProperties) macro(build_veyon_plugin PLUGIN_NAME) - add_library(${PLUGIN_NAME} MODULE ${ARGN}) + set(LIBRARY_TYPE "MODULE") + if(WITH_TESTS) + set(LIBRARY_TYPE "SHARED") + endif() + add_library(${PLUGIN_NAME} ${LIBRARY_TYPE} ${ARGN}) target_include_directories(${PLUGIN_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(${PLUGIN_NAME} veyon-core) @@ -21,3 +25,10 @@ macro(build_veyon_plugin PLUGIN_NAME) endif() endmacro() +macro(test_veyon_plugin PLUGIN_NAME TEST_NAME) + if(WITH_TESTS) + add_executable(${TEST_NAME} ${TEST_NAME}.cpp) + add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME}) + target_link_libraries(${TEST_NAME} ${PLUGIN_NAME}) + endif() +endmacro() diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 3a1c388a1..3fec6c6e8 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -77,6 +77,9 @@ if(WITH_QT6) Qt6::Network Qt6::Widgets Qt6::QuickControls2) + if(WITH_TESTS) + target_link_libraries(veyon-core Qt6::Test) + endif() else() target_link_libraries(veyon-core Qt5::Concurrent @@ -84,11 +87,13 @@ else() Qt5::Network Qt5::Widgets Qt5::QuickControls2) + if(WITH_TESTS) + target_link_libraries(veyon-core Qt5::Test) + endif() endif() target_link_libraries(veyon-core OpenSSL::SSL - ${VEYON_DEBUG_LIBRARIES} ${QCA_LIBRARY}) if(LibVNCClient_FOUND) From 46164414eb9436d4065b8349213d7efd44edb670 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 3 Dec 2021 13:38:37 +0100 Subject: [PATCH 1265/1765] PluginManager: hardcode path to platform plugin This allows running tests from within the build directory. --- core/src/PluginManager.cpp | 5 +++++ core/src/veyonconfig.h.in | 2 ++ 2 files changed, 7 insertions(+) diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index f1957928e..eee12e174 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -22,6 +22,8 @@ * */ +#include + #include #include #include @@ -154,6 +156,9 @@ void PluginManager::initPluginSearchPath() QDir::addSearchPath( QStringLiteral( "plugins" ), pluginSearchPath ); QCoreApplication::addLibraryPath( pluginSearchPath ); } +#if defined(VEYON_WITH_TESTS) + QDir::addSearchPath(QStringLiteral("plugins"), QStringLiteral(CMAKE_BINARY_DIR "/plugins/platform/linux")); +#endif } diff --git a/core/src/veyonconfig.h.in b/core/src/veyonconfig.h.in index 64ac4a69a..b8dd9f583 100644 --- a/core/src/veyonconfig.h.in +++ b/core/src/veyonconfig.h.in @@ -7,3 +7,5 @@ #define VEYON_TRANSLATIONS_DIR "@VEYON_TRANSLATIONS_DIR@" #define VEYON_EXECUTABLE_SUFFIX "@CMAKE_EXECUTABLE_SUFFIX@" #define VEYON_SHARED_LIBRARY_SUFFIX "@CMAKE_SHARED_LIBRARY_SUFFIX@" +#define CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@" +#define VEYON_WITH_TESTS "@WITH_TESTS@" From ccd0908edc8b0aa0ffee1ce8fccfa30479a512ea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 3 Dec 2021 17:32:16 +0100 Subject: [PATCH 1266/1765] CI: CentOS 8.4: extend CMAKE_FLAGS only --- .ci/linux.centos.8.4/script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/linux.centos.8.4/script.sh b/.ci/linux.centos.8.4/script.sh index 73ae9e519..6b226308c 100755 --- a/.ci/linux.centos.8.4/script.sh +++ b/.ci/linux.centos.8.4/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="-DWITH_PCH=OFF" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_PCH=OFF" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 "centos-8.4" From 6e6569370610ea2c6f68e7754bb69cf40563024a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Dec 2021 14:42:09 +0100 Subject: [PATCH 1267/1765] RemoteAccess: open remote access windows for all selected computers Simplify the way the remote access feature is activated in Veyon Master. If one or multiple computers are selected, open remote access windows for each of them. If no computer is selected, a custom host address can be entered. Closes #770. --- .../RemoteAccessFeaturePlugin.cpp | 69 ++++++++++--------- .../remoteaccess/RemoteAccessFeaturePlugin.h | 2 + 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 81689e2c3..80c95b3a0 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -110,19 +110,31 @@ bool RemoteAccessFeaturePlugin::controlFeature( Feature::Uid featureUid, Operati bool RemoteAccessFeaturePlugin::startFeature( VeyonMasterInterface& master, const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) { + Q_UNUSED(computerControlInterfaces) + if( hasFeature( feature.uid() ) == false ) { return false; } - // determine which computer to access and ask if neccessary - ComputerControlInterface::Pointer remoteAccessComputer; + const auto viewOnly = feature.uid() == m_remoteViewFeature.uid() || + remoteControlEnabled() == false; + + const auto selectedComputerControlInterfaces = master.selectedComputerControlInterfaces(); - if( computerControlInterfaces.count() != 1 ) + if (selectedComputerControlInterfaces.count() > 0) { - QString hostName = QInputDialog::getText( master.mainWindow(), - tr( "Remote access" ), - tr( "Please enter the hostname or IP address of the computer to access:" ) ); + for (const auto& computerControlInterface : selectedComputerControlInterfaces) + { + createRemoteAccessWindow(computerControlInterface, viewOnly, &master); + } + } + else + { + const auto hostName = QInputDialog::getText( master.mainWindow(), + tr( "Remote access" ), + tr( "No computer has been selected so you can enter a hostname " + "or IP address of a computer for manual access:" ) ); if( hostName.isEmpty() ) { return false; @@ -131,32 +143,8 @@ bool RemoteAccessFeaturePlugin::startFeature( VeyonMasterInterface& master, cons Computer customComputer; customComputer.setHostAddress( hostName ); customComputer.setName( hostName ); - remoteAccessComputer = ComputerControlInterface::Pointer::create( customComputer ); - } - else - { - remoteAccessComputer = computerControlInterfaces.first(); - } - - if( remoteAccessComputer.isNull() ) - { - return false; - } - - auto viewOnly = feature.uid() == m_remoteViewFeature.uid(); - if( remoteControlEnabled() == false ) - { - viewOnly = true; - } - if( master.appContainer() ) - { - new RemoteAccessPage( remoteAccessComputer, viewOnly, master.appContainer() ); - } - else - { - new RemoteAccessWidget( remoteAccessComputer, viewOnly, - remoteViewEnabled() && remoteControlEnabled() ); + createRemoteAccessWindow(ComputerControlInterface::Pointer::create(customComputer), viewOnly, &master); } return true; @@ -270,10 +258,25 @@ bool RemoteAccessFeaturePlugin::remoteAccess( const QString& hostAddress, bool v viewOnly = true; } - new RemoteAccessWidget( ComputerControlInterface::Pointer::create( remoteComputer ), viewOnly, - remoteViewEnabled() && remoteControlEnabled() ); + createRemoteAccessWindow(ComputerControlInterface::Pointer::create(remoteComputer), viewOnly, nullptr); qApp->exec(); return true; } + + + +void RemoteAccessFeaturePlugin::createRemoteAccessWindow(const ComputerControlInterface::Pointer& computerControlInterface, + bool viewOnly, VeyonMasterInterface* master) +{ + if (master && master->appContainer()) + { + new RemoteAccessPage(computerControlInterface, viewOnly, master->appContainer()); + } + else + { + new RemoteAccessWidget(computerControlInterface, viewOnly, remoteViewEnabled() && remoteControlEnabled()); + } + +} diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index 8840a98c7..e6ad9a417 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -106,6 +106,8 @@ private Q_SLOTS: bool remoteControlEnabled() const; bool initAuthentication(); bool remoteAccess( const QString& hostAddress, bool viewOnly ); + void createRemoteAccessWindow(const ComputerControlInterface::Pointer& computerControlInterface, bool viewOnly, + VeyonMasterInterface* master); const Feature m_remoteViewFeature; const Feature m_remoteControlFeature; From c5d634e7250827f58336dd59fd7b900d946b4367 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Dec 2021 15:11:21 +0100 Subject: [PATCH 1268/1765] RemoteAccessFeaturePlugin: call qApp->exec() outside remoteAccess() Since calling qApp->exec() is only required for the CLI methods, it should be called in the corresponding CLI handlers to keep remoteAccess() generic. --- .../remoteaccess/RemoteAccessFeaturePlugin.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 80c95b3a0..052c572b7 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -178,7 +178,13 @@ CommandLinePluginInterface::RunResult RemoteAccessFeaturePlugin::handle_view( co return InvalidCommand; } - return remoteAccess( arguments.first(), true ) ? Successful : Failed; + if (remoteAccess(arguments.first(), true)) + { + qApp->exec(); + return Successful; + } + + return Failed; } @@ -195,7 +201,13 @@ CommandLinePluginInterface::RunResult RemoteAccessFeaturePlugin::handle_control( return InvalidCommand; } - return remoteAccess( arguments.first(), false ) ? Successful : Failed; + if (remoteAccess(arguments.first(), false)) + { + qApp->exec(); + return Successful; + } + + return Failed; } @@ -260,8 +272,6 @@ bool RemoteAccessFeaturePlugin::remoteAccess( const QString& hostAddress, bool v createRemoteAccessWindow(ComputerControlInterface::Pointer::create(remoteComputer), viewOnly, nullptr); - qApp->exec(); - return true; } From 8f70a4cf59766b5f9699325dc44f2a902e729fb0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 9 Dec 2021 15:13:16 +0100 Subject: [PATCH 1269/1765] RemoteAccess: open RA window remotely if requested via controlFeature() The previous implementation of controlFeature() did not make any sense. So in order to make its behavior match with that of other plugins when called through "veyon-cli feature start", send FeatureMessages in controlFeature() and handle them server-side and to spawn a worker providing the actual remote access window. --- .../RemoteAccessFeaturePlugin.cpp | 81 +++++++++++-------- .../remoteaccess/RemoteAccessFeaturePlugin.h | 6 ++ 2 files changed, 55 insertions(+), 32 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 052c572b7..b5581f988 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -26,12 +26,13 @@ #include #include "AuthenticationManager.h" -#include "QmlCore.h" +#include "FeatureWorkerManager.h" #include "RemoteAccessFeaturePlugin.h" #include "RemoteAccessPage.h" #include "RemoteAccessWidget.h" #include "VeyonConfiguration.h" #include "VeyonMasterInterface.h" +#include "VeyonServerInterface.h" RemoteAccessFeaturePlugin::RemoteAccessFeaturePlugin( QObject* parent ) : @@ -68,41 +69,19 @@ const FeatureList &RemoteAccessFeaturePlugin::featureList() const -bool RemoteAccessFeaturePlugin::controlFeature( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, - const ComputerControlInterfaceList& computerControlInterfaces ) +bool RemoteAccessFeaturePlugin::controlFeature(Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, + const ComputerControlInterfaceList& computerControlInterfaces) { - if( hasFeature( featureUid ) == false || - operation != Operation::Start ) + if (hasFeature(featureUid) || + operation != Operation::Start) { - return false; - } - - auto viewOnly = featureUid == m_remoteViewFeature.uid(); - if( remoteControlEnabled() == false ) - { - viewOnly = true; - } - - Computer computer; - computer.setHostAddress( arguments.value( argToString(Argument::HostName) ).toString() ); - computer.setName( computer.hostAddress() ); - - if( computer.hostAddress().isEmpty() ) - { - if( computerControlInterfaces.isEmpty() == false ) - { - computer = computerControlInterfaces.first()->computer(); - } - else - { - return false; - } + sendFeatureMessage(FeatureMessage{featureUid} + .addArgument(Argument::HostName, arguments.value(argToString(Argument::HostName))), + computerControlInterfaces); + return true; } - new RemoteAccessWidget( ComputerControlInterface::Pointer::create( computer ), viewOnly, - remoteViewEnabled() && remoteControlEnabled() ); - - return true; + return false; } @@ -151,6 +130,44 @@ bool RemoteAccessFeaturePlugin::startFeature( VeyonMasterInterface& master, cons } +bool RemoteAccessFeaturePlugin::handleFeatureMessage(VeyonServerInterface &server, + const MessageContext &messageContext, + const FeatureMessage &message) +{ + Q_UNUSED(messageContext) + + if (message.featureUid() == m_remoteViewFeature.uid() || + message.featureUid() == m_remoteControlFeature.uid()) + { + // forward message to worker + server.featureWorkerManager().sendMessageToUnmanagedSessionWorker(message); + return true; + } + + return false; +} + + + +bool RemoteAccessFeaturePlugin::handleFeatureMessage(VeyonWorkerInterface &worker, const FeatureMessage &message) +{ + Q_UNUSED(worker) + + if (message.featureUid() == m_remoteViewFeature.uid() || + message.featureUid() == m_remoteControlFeature.uid()) + { + const auto viewOnly = message.featureUid() == m_remoteViewFeature.uid() || + remoteControlEnabled() == false; + + remoteAccess(message.argument(Argument::HostName).toString(), viewOnly); + + return true; + } + + return false; +} + + QStringList RemoteAccessFeaturePlugin::commands() const { diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index e6ad9a417..c0c47fec5 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -82,6 +82,12 @@ class RemoteAccessFeaturePlugin : public QObject, CommandLinePluginInterface, Fe bool startFeature( VeyonMasterInterface& master, const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) override; + bool handleFeatureMessage(VeyonServerInterface& server, + const MessageContext& messageContext, + const FeatureMessage& message) override; + + bool handleFeatureMessage(VeyonWorkerInterface& worker, const FeatureMessage& message) override; + QString commandLineModuleName() const override { return QStringLiteral( "remoteaccess" ); From 44697816241a062fcdf721dd697caf2d817873d7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 13 Dec 2021 10:22:38 +0100 Subject: [PATCH 1270/1765] MasterConfigurationPage: fix user config directory browsing --- configurator/src/MasterConfigurationPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index d458788dd..d1c992943 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -121,7 +121,7 @@ void MasterConfigurationPage::disableFeature() void MasterConfigurationPage::openUserConfigurationDirectory() { - FileSystemBrowser( FileSystemBrowser::ExistingFile ).exec( ui->userConfigurationDirectory ); + FileSystemBrowser(FileSystemBrowser::ExistingDirectory).exec(ui->userConfigurationDirectory); } From 9089351a4629bdff3b59fd74f84254a4b1a6d3ad Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 13 Dec 2021 14:27:34 +0100 Subject: [PATCH 1271/1765] Core: provide media playback icons centrally --- configurator/resources/configurator.qrc | 2 -- configurator/resources/media-playback-start.png | Bin 297 -> 0 bytes configurator/resources/media-playback-stop.png | Bin 198 -> 0 bytes configurator/src/ServiceConfigurationPage.ui | 10 +++++----- core/resources/core.qrc | 4 ++++ .../resources/media-playback-pause.png | Bin .../resources/media-playback-start.png | Bin core/resources/media-playback-stop.png | Bin 0 -> 194 bytes core/resources/media-record.png | Bin 0 -> 1429 bytes master/resources/master.qrc | 2 -- master/src/SlideshowPanel.ui | 7 +++---- 11 files changed, 12 insertions(+), 13 deletions(-) delete mode 100644 configurator/resources/media-playback-start.png delete mode 100644 configurator/resources/media-playback-stop.png rename {master => core}/resources/media-playback-pause.png (100%) rename {master => core}/resources/media-playback-start.png (100%) create mode 100644 core/resources/media-playback-stop.png create mode 100644 core/resources/media-record.png diff --git a/configurator/resources/configurator.qrc b/configurator/resources/configurator.qrc index 6ad147df7..0aeb83023 100644 --- a/configurator/resources/configurator.qrc +++ b/configurator/resources/configurator.qrc @@ -2,8 +2,6 @@ veyon-configurator.png help-about.png - media-playback-start.png - media-playback-stop.png network-vpn.png configure-shortcuts.png application-x-ms-dos-executable.png diff --git a/configurator/resources/media-playback-start.png b/configurator/resources/media-playback-start.png deleted file mode 100644 index 1a5aa9e3b0fb4dd92695f1489225ad73416c552f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=3*z$5DpHG+YkL80J)q69+AZi z4Cb*Q%qZF524pZumbgZg1m~xflqVLYGL)B>>t*I;7bhncr0V4trO$q6BL!3>9pDq< z3Z&iK-2DCh{rvoVQ329 zg+}HJ;f!U|dqY?oTST^K3ItpT^zm?XS5RaFVdQ&MBb@0H(-W-2eap diff --git a/configurator/resources/media-playback-stop.png b/configurator/resources/media-playback-stop.png deleted file mode 100644 index 5d0113ad1ab5ba77e36d2b56eb854680720e030d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRF&8^|hH!9j+(yEr+qAXP8FD1G)j8!4b7wg8_H zS0L@{>pNloYD*xCu_VYZn8D%MjWi%f)zif>L}Oxd!UC}${A@oYStart service - - :/configurator/media-playback-start.png:/configurator/media-playback-start.png + + :/core/media-playback-start.png:/core/media-playback-start.png @@ -98,8 +98,8 @@ Stop service - - :/configurator/media-playback-stop.png:/configurator/media-playback-stop.png + + :/core/media-playback-stop.png:/core/media-playback-stop.png @@ -360,7 +360,7 @@ Typically this is required to support terminal servers. vncServerPlugin - + diff --git a/core/resources/core.qrc b/core/resources/core.qrc index 3cc66939d..d8cf5f885 100644 --- a/core/resources/core.qrc +++ b/core/resources/core.qrc @@ -24,5 +24,9 @@ go-down.png go-previous.png go-next.png + media-playback-pause.png + media-playback-start.png + media-playback-stop.png + media-record.png diff --git a/master/resources/media-playback-pause.png b/core/resources/media-playback-pause.png similarity index 100% rename from master/resources/media-playback-pause.png rename to core/resources/media-playback-pause.png diff --git a/master/resources/media-playback-start.png b/core/resources/media-playback-start.png similarity index 100% rename from master/resources/media-playback-start.png rename to core/resources/media-playback-start.png diff --git a/core/resources/media-playback-stop.png b/core/resources/media-playback-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd9908b2300fb5d4aa2ddb60918953f31c22ad6 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?O3?zSk_}l@cn2Vh}LpV4%Za?&Y0OWEOctjR6 zFqFxFFyrz=6|aDTk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+>Buu?6^q zxB_WqHBC8&C_5mFu_VYZn8D%MjWi%f(bL5-#KSu|L4q~ofxVD~C;~2+c0j{{iGeMs Vdat1Wzav1!44$rjF6*2UngGkwGRgn| literal 0 HcmV?d00001 diff --git a/core/resources/media-record.png b/core/resources/media-record.png new file mode 100644 index 0000000000000000000000000000000000000000..b026c6266b0a0560c26fd74a0dd4ae7bfec01b2d GIT binary patch literal 1429 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&F&8^|hH!9j+{W-*8`gfeJ)`fsgx+@uc<3E<)jjmObKp&f z$lIQwciaN+xcLL6u6qRBa0|Wd6m-We^oDEjP3NGSPNBD*L+?0++;9!L;TCw)HRP5{ z@NL(S+b+R(fZClxZn_5FatXTS9CF(YC?0g%CFG_vP$UGX2Bh6NPFMi4Dv1tGUUQXp}NMz8{)Q6Tj|5vU;u)1WG$ zZUZZW=!KXJB|+{483^LS3`bD_H5ue(FhaNuCIS&BKpyp4&F=vm}t{0y+ocVk%SYW!uuYv>0vU}ux z90Jy)u5xHS6jID%l(g3S%BHI8O_kU7%3s-LmvC^yEB`M~vu%B>Y~Ni{e}A@8;_|$7 zhMltw4oiKN=rE6CV_qdDaid1nY4yD%j-OU7S2i3D_!r}@A?w=qq(r$TZ~DTWu^ex_ zCbIp>c5yJ>ZSp8zmTBdwOB2?5u>{OoWXPTR;k_hp71RB^3X>Dr?f%a{nP`=Z{oAuF zQU9U$UiZUytbQcaE-gGQ_Judd!G6op>lzQ*S!1_rE|Q+*6{hhhnx`sCV+m)~GR+jG zs5iD;nkow(+a2X`IL_WRvytt0L((_x1=rjhbpxaqFE}3H9eg2OIr_{-d z%oc3&3d~%wMB|lm$i1K|Dj{wfSrS@%MXoYWjq37pT6$=)!gd+2Os-!%TMfCYShkvR zWwp(!buj!bdf~&oq z^??VfWNxu(Ea3n3C_dv(kc{1xT_$JNHtVm?xWWCS*vx(Lrt}BF-R{kMW`B6A$y>$p z-z(T8Z66O~NZ!Q>@#2CWU-^1(>}+X}>M}X7v+cmHn6_v4oH%4zfzhEjrR_dX>UKdz z)q2C0`JOFhiPIW&Lk=>$ZanR<=cCb#i_?-BZiYz|XWd!qe{XiNf#yz!_Li68%& zX8pb=-d?%!nrc?$&TL0F&&yBbM8B!c@=`biQm$H<#t#XmX=(6nmF_MTuzzk zpI*&t58nLJ=U(BbnP1*KIXo}LQVEhYnSSyIWFN74$S>dv%zX@=u6{1-oD!Mapplication-menu.png computer-slideshow.png spotlight.png - media-playback-start.png - media-playback-pause.png update-realtime-enabled.png update-realtime-disabled.png diff --git a/master/src/SlideshowPanel.ui b/master/src/SlideshowPanel.ui index 8b6a8bd48..eab8e1320 100644 --- a/master/src/SlideshowPanel.ui +++ b/master/src/SlideshowPanel.ui @@ -59,9 +59,9 @@ Start/pause - - :/master/media-playback-start.png - :/master/media-playback-pause.png:/master/media-playback-start.png + + :/core/media-playback-start.png + :/core/media-playback-pause.png:/core/media-playback-start.png @@ -158,7 +158,6 @@ -
    From acc7e7f2a0d072be88342a3b319c06504ffacd3d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 13 Dec 2021 16:11:35 +0100 Subject: [PATCH 1272/1765] RemoteAccessFeaturePlugin: fix feature control --- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index b5581f988..88d72769f 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -72,8 +72,8 @@ const FeatureList &RemoteAccessFeaturePlugin::featureList() const bool RemoteAccessFeaturePlugin::controlFeature(Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces) { - if (hasFeature(featureUid) || - operation != Operation::Start) + if (hasFeature(featureUid) && + operation == Operation::Start) { sendFeatureMessage(FeatureMessage{featureUid} .addArgument(Argument::HostName, arguments.value(argToString(Argument::HostName))), From 2741b789692fb2d88ae07170349c65c20f4aedc9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 Dec 2021 09:31:25 +0100 Subject: [PATCH 1273/1765] Core: Configuration: drop export decl for TypedProperty Since the template class is fully defined, only specializations have to be exported. This avoids linkage problems when instantiating specializations for custom types in components linking against the core library. --- core/src/Configuration/Property.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/Configuration/Property.h b/core/src/Configuration/Property.h index 60f63a72a..2d49130e7 100644 --- a/core/src/Configuration/Property.h +++ b/core/src/Configuration/Property.h @@ -128,7 +128,8 @@ class VEYON_CORE_EXPORT Property : public QObject template -class VEYON_CORE_EXPORT TypedProperty : public Property { +class TypedProperty : public Property +{ public: using Type = typename CheapestType::Type; From 3ffa83f359856f56443c93814f3acae9c0f198e4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 16:32:12 +0100 Subject: [PATCH 1274/1765] CMake: use keyword signature for target_link_libraries() --- cmake/modules/BuildVeyonApplication.cmake | 2 +- cmake/modules/BuildVeyonPlugin.cmake | 4 ++-- core/CMakeLists.txt | 22 +++++++++---------- master/CMakeLists.txt | 2 +- plugins/ldap/CMakeLists.txt | 2 +- plugins/ldap/common/CMakeLists.txt | 2 +- plugins/ldap/kldap/CMakeLists.txt | 6 ++--- plugins/platform/linux/CMakeLists.txt | 10 ++++----- .../platform/linux/auth-helper/CMakeLists.txt | 6 ++--- plugins/platform/windows/CMakeLists.txt | 2 +- plugins/vncserver/headless/CMakeLists.txt | 2 +- .../vncserver/ultravnc-builtin/CMakeLists.txt | 2 +- .../ultravnc-builtin/vnchooks/CMakeLists.txt | 2 +- .../vncserver/x11vnc-builtin/CMakeLists.txt | 17 +++++++++----- 14 files changed, 43 insertions(+), 38 deletions(-) diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index 785cd27f1..61369a166 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -11,7 +11,7 @@ macro(build_veyon_application APPLICATION_NAME) install(TARGETS ${APPLICATION_NAME} RUNTIME DESTINATION bin) endif() target_include_directories(${APPLICATION_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) - target_link_libraries(${APPLICATION_NAME} veyon-core) + target_link_libraries(${APPLICATION_NAME} PRIVATE veyon-core) target_compile_options(${APPLICATION_NAME} PRIVATE ${VEYON_COMPILE_OPTIONS}) set_property(TARGET ${APPLICATION_NAME} PROPERTY POSITION_INDEPENDENT_CODE TRUE) set_default_target_properties(${APPLICATION_NAME}) diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index 7e56d527c..41c7da881 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -13,7 +13,7 @@ macro(build_veyon_plugin PLUGIN_NAME) add_library(${PLUGIN_NAME} ${LIBRARY_TYPE} ${ARGN}) target_include_directories(${PLUGIN_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) - target_link_libraries(${PLUGIN_NAME} veyon-core) + target_link_libraries(${PLUGIN_NAME} PRIVATE veyon-core) target_compile_options(${PLUGIN_NAME} PRIVATE ${VEYON_COMPILE_OPTIONS}) set_default_target_properties(${PLUGIN_NAME}) @@ -29,6 +29,6 @@ macro(test_veyon_plugin PLUGIN_NAME TEST_NAME) if(WITH_TESTS) add_executable(${TEST_NAME} ${TEST_NAME}.cpp) add_test(NAME ${TEST_NAME} COMMAND ${TEST_NAME}) - target_link_libraries(${TEST_NAME} ${PLUGIN_NAME}) + target_link_libraries(${TEST_NAME} PRIVATE veyon-core ${PLUGIN_NAME}) endif() endmacro() diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 3fec6c6e8..88b9af466 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -71,33 +71,33 @@ target_include_directories(veyon-core PUBLIC ) if(WITH_QT6) - target_link_libraries(veyon-core + target_link_libraries(veyon-core PUBLIC Qt6::Concurrent Qt6::Gui Qt6::Network Qt6::Widgets Qt6::QuickControls2) if(WITH_TESTS) - target_link_libraries(veyon-core Qt6::Test) + target_link_libraries(veyon-core PUBLIC Qt6::Test) endif() else() - target_link_libraries(veyon-core + target_link_libraries(veyon-core PUBLIC Qt5::Concurrent Qt5::Gui Qt5::Network Qt5::Widgets Qt5::QuickControls2) if(WITH_TESTS) - target_link_libraries(veyon-core Qt5::Test) + target_link_libraries(veyon-core PUBLIC Qt5::Test) endif() endif() -target_link_libraries(veyon-core +target_link_libraries(veyon-core PUBLIC OpenSSL::SSL ${QCA_LIBRARY}) if(LibVNCClient_FOUND) - target_link_libraries(veyon-core LibVNC::LibVNCClient) + target_link_libraries(veyon-core PRIVATE LibVNC::LibVNCClient) else() target_include_directories(veyon-core PRIVATE ${ZLIB_INCLUDE_DIR} @@ -108,7 +108,7 @@ else() ${libvncserver_DIR}/common/ ${libvncserver_DIR} ) - target_link_libraries(veyon-core + target_link_libraries(veyon-core PRIVATE Threads::Threads PNG::PNG ${ZLIB_LIBRARIES} @@ -119,7 +119,7 @@ endif() if(VEYON_BUILD_WIN32) # add Windows Socket library required by libvncclient - target_link_libraries(veyon-core -lws2_32) + target_link_libraries(veyon-core PRIVATE -lws2_32) set_target_properties(veyon-core PROPERTIES PREFIX "") if(NOT WITH_CORE_ONLY) install(TARGETS veyon-core RUNTIME DESTINATION ${VEYON_LIB_DIR}) @@ -131,7 +131,7 @@ else() endif() if(VEYON_BUILD_ANDROID) - target_link_libraries(veyon-core Qt5::AndroidExtras) + target_link_libraries(veyon-core PRIVATE Qt5::AndroidExtras) endif() if(VEYON_BUILD_WIN32) @@ -153,9 +153,9 @@ if(WITH_PCH) target_compile_options(veyon-pch PRIVATE ${VEYON_COMPILE_OPTIONS}) set_default_target_properties(veyon-pch) if(WITH_QT6) - target_link_libraries(veyon-pch Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Widgets) + target_link_libraries(veyon-pch PUBLIC Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Widgets) else() - target_link_libraries(veyon-pch Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) + target_link_libraries(veyon-pch PUBLIC Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) endif() target_precompile_headers(veyon-pch PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") if(VEYON_BUILD_WIN32) diff --git a/master/CMakeLists.txt b/master/CMakeLists.txt index 04c1b46d1..0a91e1207 100644 --- a/master/CMakeLists.txt +++ b/master/CMakeLists.txt @@ -13,7 +13,7 @@ set(master_RESOURCES ${master_RESOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/qml/qml.qrc build_veyon_application(veyon-master ${master_SOURCES} ${master_RESOURCES}) -target_link_libraries(veyon-master KF5::ItemModels) +target_link_libraries(veyon-master PRIVATE KF5::ItemModels) add_windows_resource(veyon-master) make_graphical_app(veyon-master) diff --git a/plugins/ldap/CMakeLists.txt b/plugins/ldap/CMakeLists.txt index 1a43ce91b..8982ee7e2 100644 --- a/plugins/ldap/CMakeLists.txt +++ b/plugins/ldap/CMakeLists.txt @@ -17,4 +17,4 @@ build_veyon_plugin(ldap AuthLdapDialog.ui ) -target_link_libraries(ldap ldap-common) +target_link_libraries(ldap PRIVATE ldap-common) diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index 178077cd8..4240d477b 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -27,7 +27,7 @@ add_library(ldap-common SHARED ${ldap_common_SOURCES}) target_compile_options(ldap-common PRIVATE ${VEYON_COMPILE_OPTIONS}) target_include_directories(ldap-common PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(ldap-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(ldap-common kldap-light veyon-core) +target_link_libraries(ldap-common PRIVATE kldap-light veyon-core) set_default_target_properties(ldap-common) if(WITH_PCH) target_precompile_headers(ldap-common REUSE_FROM veyon-pch) diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index 28a5e0a6b..5baee62ee 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -41,11 +41,11 @@ set(kldap_SOURCES add_library(kldap-light SHARED ${kldap_SOURCES}) target_compile_options(kldap-light PRIVATE ${VEYON_COMPILE_OPTIONS}) if(WITH_QT6) - target_link_libraries(kldap-light Qt6::Core) + target_link_libraries(kldap-light PRIVATE Qt6::Core) else() - target_link_libraries(kldap-light Qt5::Core) + target_link_libraries(kldap-light PRIVATE Qt5::Core) endif() -target_link_libraries(kldap-light ${Ldap_LIBRARIES} ${Sasl2_LIBRARIES}) +target_link_libraries(kldap-light PUBLIC ${Ldap_LIBRARIES} ${Sasl2_LIBRARIES}) target_include_directories(kldap-light PRIVATE ${Ldap_INCLUDE_DIRS}) target_include_directories(kldap-light PUBLIC ${kldap_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) set_default_target_properties(kldap-light) diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index e007ca2e2..dd2ec626a 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -65,20 +65,20 @@ target_include_directories(linux-platform PRIVATE if(WITH_QT6) find_package(Qt6 COMPONENTS DBus REQUIRED) - target_link_libraries(linux-platform Qt6::DBus) + target_link_libraries(linux-platform PRIVATE Qt6::DBus) else() find_package(Qt5DBus REQUIRED) - target_link_libraries(linux-platform Qt5::DBus) + target_link_libraries(linux-platform PRIVATE Qt5::DBus) endif() -target_link_libraries(linux-platform +target_link_libraries(linux-platform PRIVATE ${X11_LIBRARIES} ${procps_LDFLAGS}) if(fakekey_FOUND) target_include_directories(linux-platform PRIVATE ${fakekey_INCLUDE_DIRS}) - target_link_libraries(linux-platform ${fakekey_LDFLAGS}) + target_link_libraries(linux-platform PRIVATE ${fakekey_LDFLAGS}) else() target_include_directories(linux-platform PRIVATE ${libfakekey_DIR}) - target_link_libraries(linux-platform ${X11_XTest_LIB}) + target_link_libraries(linux-platform PRIVATE ${X11_XTest_LIB}) endif() diff --git a/plugins/platform/linux/auth-helper/CMakeLists.txt b/plugins/platform/linux/auth-helper/CMakeLists.txt index 02733387d..cbb5a7734 100644 --- a/plugins/platform/linux/auth-helper/CMakeLists.txt +++ b/plugins/platform/linux/auth-helper/CMakeLists.txt @@ -11,10 +11,10 @@ set_default_target_properties(veyon-auth-helper) target_compile_options(veyon-auth-helper PRIVATE ${VEYON_COMPILE_OPTIONS}) target_include_directories(veyon-auth-helper PRIVATE ${PAM_INCLUDE_DIR}) if(WITH_QT6) - target_link_libraries(veyon-auth-helper Qt6::Core) + target_link_libraries(veyon-auth-helper PRIVATE Qt6::Core) else() - target_link_libraries(veyon-auth-helper Qt5::Core) + target_link_libraries(veyon-auth-helper PRIVATE Qt5::Core) endif() -target_link_libraries(veyon-auth-helper ${PAM_LIBRARY}) +target_link_libraries(veyon-auth-helper PRIVATE ${PAM_LIBRARY}) install(TARGETS veyon-auth-helper RUNTIME DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE SETUID GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index 44547420a..07ff45060 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -56,7 +56,7 @@ target_include_directories(windows-platform PRIVATE ${ultravnc_DIR} ${Qt5Gui_PRIVATE_INCLUDE_DIRS} ) -target_link_libraries(windows-platform -lwtsapi32 -lnetapi32 -luserenv -linterception -liphlpapi) +target_link_libraries(windows-platform PRIVATE -lwtsapi32 -lnetapi32 -luserenv -linterception -liphlpapi) target_compile_definitions(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) target_compile_options(windows-platform PRIVATE "-Wno-unknown-pragmas") set_source_files_properties(WindowsNetworkFunctions.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_PRECOMPILE_HEADERS TRUE) diff --git a/plugins/vncserver/headless/CMakeLists.txt b/plugins/vncserver/headless/CMakeLists.txt index c98aefc65..405c89dd5 100644 --- a/plugins/vncserver/headless/CMakeLists.txt +++ b/plugins/vncserver/headless/CMakeLists.txt @@ -10,7 +10,7 @@ if(LibVNCServer_FOUND) HeadlessVncConfiguration.h ) - target_link_libraries(headless-vnc-server LibVNC::LibVNCServer) + target_link_libraries(headless-vnc-server PRIVATE LibVNC::LibVNCServer) target_compile_options(headless-vnc-server PRIVATE -Wno-parentheses) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index c99f449c8..f9cc7fe4c 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -86,7 +86,7 @@ build_veyon_plugin(builtin-ultravnc-server UltraVncConfiguration.h ) -target_link_libraries(builtin-ultravnc-server -luserenv -lole32 -lversion -lgdi32 -limm32 -lwinmm ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${LZO_LIBRARIES}) +target_link_libraries(builtin-ultravnc-server PRIVATE -luserenv -lole32 -lversion -lgdi32 -limm32 -lwinmm ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${LZO_LIBRARIES}) target_include_directories(builtin-ultravnc-server PRIVATE ${ultravnc_DIR} ${ultravnc_DIR}/winvnc diff --git a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt index fef65989e..ed123fd24 100644 --- a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt @@ -17,5 +17,5 @@ set_default_target_properties(vnchooks) set_target_properties(vnchooks PROPERTIES PREFIX "") set_target_properties(vnchooks PROPERTIES COMPILE_FLAGS "-Wno-write-strings -Wno-unused-variable -Wno-unknown-pragmas -Wno-int-to-pointer-cast") set_target_properties(vnchooks PROPERTIES LINK_FLAGS -Wl,-export-all-symbols) -target_link_libraries(vnchooks -ladvapi32) +target_link_libraries(vnchooks PRIVATE -ladvapi32) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index f8a57cf10..02d31b08b 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -217,7 +217,12 @@ else() target_include_directories(builtin-x11vnc-server PRIVATE ${x11vnc_DIR}/src) - target_link_libraries(builtin-x11vnc-server + target_link_libraries(builtin-x11vnc-server PRIVATE + Threads::Threads + PNG::PNG + ${ZLIB_LIBRARIES} + ${JPEG_LIBRARIES} + ${LZO_LIBRARIES} ${X11_LIBRARIES} ${X11_XTest_LIB} ${X11_Xfixes_LIB} @@ -227,25 +232,25 @@ else() ) if(LibVNCServer_FOUND) - target_link_libraries(builtin-x11vnc-server LibVNC::LibVNCServer) + target_link_libraries(builtin-x11vnc-server PRIVATE LibVNC::LibVNCServer) else() target_include_directories(builtin-x11vnc-server PRIVATE ${libvncserver_DIR}/libvncserver ${libvncserver_DIR}/common) endif() if(X11_XShm_FOUND) - target_link_libraries(builtin-x11vnc-server ${X11_XShm_LIB}) + target_link_libraries(builtin-x11vnc-server PRIVATE ${X11_XShm_LIB}) endif() if(X11_Xcomposite_FOUND) - target_link_libraries(builtin-x11vnc-server ${X11_Xcomposite_LIB}) + target_link_libraries(builtin-x11vnc-server PRIVATE ${X11_Xcomposite_LIB}) endif() if(X11_Xcursor_FOUND) - target_link_libraries(builtin-x11vnc-server ${X11_Xcursor_LIB}) + target_link_libraries(builtin-x11vnc-server PRIVATE ${X11_Xcursor_LIB}) endif() if(X11_Xinput_FOUND) - target_link_libraries(builtin-x11vnc-server ${X11_Xinput_LIB}) + target_link_libraries(builtin-x11vnc-server PRIVATE ${X11_Xinput_LIB}) endif() endif() From 4a6d98ac16c7f08013bd0a720d55476d7aaeb092 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 16:39:05 +0100 Subject: [PATCH 1275/1765] CMake: get rid of VEYON_COMPILE_OPTIONS Use set_default_target_properties() instead. --- CMakeLists.txt | 1 - cmake/modules/BuildVeyonApplication.cmake | 1 - cmake/modules/BuildVeyonPlugin.cmake | 1 - cmake/modules/SetDefaultTargetProperties.cmake | 1 + core/CMakeLists.txt | 3 +-- plugins/ldap/common/CMakeLists.txt | 1 - plugins/ldap/kldap/CMakeLists.txt | 1 - plugins/platform/linux/auth-helper/CMakeLists.txt | 1 - plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt | 1 - 9 files changed, 2 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5316d94b9..41742fca2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -210,7 +210,6 @@ if(WITH_SANITIZERS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fsanitize=undefined") endif() -set(VEYON_COMPILE_OPTIONS "-Wall;-Werror") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong ${CFLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong -fno-exceptions ${CXXFLAGS}") diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index 61369a166..5a3908bc8 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -12,7 +12,6 @@ macro(build_veyon_application APPLICATION_NAME) endif() target_include_directories(${APPLICATION_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) target_link_libraries(${APPLICATION_NAME} PRIVATE veyon-core) - target_compile_options(${APPLICATION_NAME} PRIVATE ${VEYON_COMPILE_OPTIONS}) set_property(TARGET ${APPLICATION_NAME} PROPERTY POSITION_INDEPENDENT_CODE TRUE) set_default_target_properties(${APPLICATION_NAME}) if(WITH_PCH) diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index 41c7da881..be4a3a8bc 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -14,7 +14,6 @@ macro(build_veyon_plugin PLUGIN_NAME) target_include_directories(${PLUGIN_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(${PLUGIN_NAME} PRIVATE veyon-core) - target_compile_options(${PLUGIN_NAME} PRIVATE ${VEYON_COMPILE_OPTIONS}) set_default_target_properties(${PLUGIN_NAME}) set_target_properties(${PLUGIN_NAME} PROPERTIES PREFIX "") diff --git a/cmake/modules/SetDefaultTargetProperties.cmake b/cmake/modules/SetDefaultTargetProperties.cmake index 4ef5cf592..a59938bdb 100644 --- a/cmake/modules/SetDefaultTargetProperties.cmake +++ b/cmake/modules/SetDefaultTargetProperties.cmake @@ -2,6 +2,7 @@ macro(set_default_target_properties TARGET_NAME) set_property(TARGET ${TARGET_NAME} PROPERTY NO_SYSTEM_FROM_IMPORTED ON) set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD 17) set_property(TARGET ${TARGET_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) + target_compile_options(${TARGET_NAME} PRIVATE "-Wall;-Werror") if(WITH_LTO) if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.13.0") target_compile_options(${TARGET_NAME} PRIVATE ${GCC_LTO_FLAGS}) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 88b9af466..bdd6bb15a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -61,7 +61,7 @@ target_compile_definitions(veyon-core PRIVATE XK_KOREAN) set_default_target_properties(veyon-core) -target_compile_options(veyon-core PRIVATE ${VEYON_COMPILE_OPTIONS} -Wno-parentheses) +target_compile_options(veyon-core PRIVATE -Wno-parentheses) target_include_directories(veyon-core PUBLIC ${CMAKE_CURRENT_BINARY_DIR} @@ -150,7 +150,6 @@ if(WITH_PCH) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_AUTOGEN TRUE) target_sources(veyon-pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx) endif() - target_compile_options(veyon-pch PRIVATE ${VEYON_COMPILE_OPTIONS}) set_default_target_properties(veyon-pch) if(WITH_QT6) target_link_libraries(veyon-pch PUBLIC Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Widgets) diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index 4240d477b..1255944a9 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -24,7 +24,6 @@ set(ldap_common_SOURCES ) add_library(ldap-common SHARED ${ldap_common_SOURCES}) -target_compile_options(ldap-common PRIVATE ${VEYON_COMPILE_OPTIONS}) target_include_directories(ldap-common PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(ldap-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(ldap-common PRIVATE kldap-light veyon-core) diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index 5baee62ee..8d8960411 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -39,7 +39,6 @@ set(kldap_SOURCES ) add_library(kldap-light SHARED ${kldap_SOURCES}) -target_compile_options(kldap-light PRIVATE ${VEYON_COMPILE_OPTIONS}) if(WITH_QT6) target_link_libraries(kldap-light PRIVATE Qt6::Core) else() diff --git a/plugins/platform/linux/auth-helper/CMakeLists.txt b/plugins/platform/linux/auth-helper/CMakeLists.txt index cbb5a7734..e22bcae7c 100644 --- a/plugins/platform/linux/auth-helper/CMakeLists.txt +++ b/plugins/platform/linux/auth-helper/CMakeLists.txt @@ -8,7 +8,6 @@ add_executable(veyon-auth-helper ${CMAKE_CURRENT_SOURCE_DIR}/VeyonAuthHelper.cpp set_default_target_properties(veyon-auth-helper) -target_compile_options(veyon-auth-helper PRIVATE ${VEYON_COMPILE_OPTIONS}) target_include_directories(veyon-auth-helper PRIVATE ${PAM_INCLUDE_DIR}) if(WITH_QT6) target_link_libraries(veyon-auth-helper PRIVATE Qt6::Core) diff --git a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt index ed123fd24..348d469bd 100644 --- a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt @@ -12,7 +12,6 @@ set(vnchooks_SOURCES add_library(vnchooks MODULE ${vnchooks_SOURCES} ${VH_WINRC}) set_source_files_properties(${vnchooks_SOURCES} PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) -target_compile_options(vnchooks PRIVATE ${VEYON_COMPILE_OPTIONS}) set_default_target_properties(vnchooks) set_target_properties(vnchooks PROPERTIES PREFIX "") set_target_properties(vnchooks PROPERTIES COMPILE_FLAGS "-Wno-write-strings -Wno-unused-variable -Wno-unknown-pragmas -Wno-int-to-pointer-cast") From 114ddb43d75dfb9cd89a068492cc1d5005dc3b46 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 17:26:26 +0100 Subject: [PATCH 1276/1765] CMake: add options for individual sanitizers Don't pass -Wl,-no-undefined to linker when address sanitizer is enabled since this will cause undefined symbols which actually are resolved at runtime. --- CMakeLists.txt | 25 ++++++++++--------- cmake/modules/BuildVeyonPlugin.cmake | 1 - .../modules/SetDefaultTargetProperties.cmake | 15 +++++++++++ plugins/ldap/common/CMakeLists.txt | 1 - plugins/ldap/kldap/CMakeLists.txt | 1 - 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 41742fca2..c74c81d8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,17 @@ cmake_minimum_required(VERSION 3.1.0) project(veyon) +option(WITH_CORE_ONLY "Build core library only" OFF) +option(WITH_ADDONS "Build add-ons" OFF) +option(WITH_TESTS "Build tests and integrate runtime test extensions" OFF) +option(WITH_LTO "Build with link-time optimization" ON) +option(WITH_PCH "Reduce compile time by using precompiled headers (requires CMake >= 3.16)" ON) +option(WITH_UNITY_BUILD "Reduce compile time by using cmake unity builds (requires CMake >= 3.16)" ON) +option(WITH_ADDRESS_SANITIZER "Build with address sanitizer" OFF) +option(WITH_THREAD_SANITIZER "Build with thread sanitizer" OFF) +option(WITH_UB_SANITIZER "Build with undefined behavior sanitizer" OFF) +option(WITH_FUZZERS "Build LLVM fuzzer tests (implies WITH_TESTS=ON)" OFF) + set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH}) if(CMAKE_BUILD_TYPE STREQUAL "Debug") set(VEYON_DEBUG TRUE) @@ -180,14 +191,6 @@ if(VEYON_BUILD_LINUX) include(XdgInstall) endif() -option(WITH_LTO "Build with link-time optimization" ON) -option(WITH_PCH "Reduce compile time by using precompiled headers (requires CMake >= 3.16)" ON) -option(WITH_UNITY_BUILD "Reduce compile time by using cmake unity builds (requires CMake >= 3.16)" ON) -option(WITH_SANITIZERS "Build with thread and UB sanitizers" OFF) -option(WITH_TESTS "Build tests and integrate runtime test extensions" OFF) -option(WITH_CORE_ONLY "Build core library only" OFF) -option(WITH_ADDONS "Build add-ons" OFF) - if(${CMAKE_VERSION} VERSION_LESS "3.16.0") set(WITH_PCH OFF) set(WITH_UNITY_BUILD OFF) @@ -205,9 +208,8 @@ if(WITH_LTO) set(GCC_LTO_FLAGS "-flto=${CPU_COUNT} -fno-fat-lto-objects") endif() -if(WITH_SANITIZERS) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fsanitize=undefined") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fsanitize=undefined") +if(WITH_FUZZERS) + set(WITH_TESTS ON) endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong ${CFLAGS}") @@ -322,5 +324,4 @@ message("\n" "* Link-time optimization : ${WITH_LTO}\n" "* Use precompiled headers : ${WITH_PCH}\n" "* Use unity build : ${WITH_UNITY_BUILD}\n" - "* Build with sanitizers : ${WITH_SANITIZERS}\n" ) diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index be4a3a8bc..24df122f1 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -17,7 +17,6 @@ macro(build_veyon_plugin PLUGIN_NAME) set_default_target_properties(${PLUGIN_NAME}) set_target_properties(${PLUGIN_NAME} PROPERTIES PREFIX "") - set_target_properties(${PLUGIN_NAME} PROPERTIES LINK_FLAGS "-Wl,-no-undefined") install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION ${VEYON_INSTALL_PLUGIN_DIR}) if(WITH_PCH) target_precompile_headers(${PLUGIN_NAME} REUSE_FROM veyon-pch) diff --git a/cmake/modules/SetDefaultTargetProperties.cmake b/cmake/modules/SetDefaultTargetProperties.cmake index a59938bdb..ec9fd3bba 100644 --- a/cmake/modules/SetDefaultTargetProperties.cmake +++ b/cmake/modules/SetDefaultTargetProperties.cmake @@ -11,4 +11,19 @@ macro(set_default_target_properties TARGET_NAME) set_target_properties(${TARGET_NAME} PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) endif() endif() + if(WITH_ADDRESS_SANITIZER) + target_link_options(${TARGET_NAME} PRIVATE "-static-libsan") + target_compile_options(${TARGET_NAME} PRIVATE "-fsanitize=address") + target_link_options(${TARGET_NAME} PRIVATE "-fsanitize=address") + else() + set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-Wl,-no-undefined") + endif() + if(WITH_THREAD_SANITIZER) + target_compile_options(${TARGET_NAME} PRIVATE "-fsanitize=thread") + target_link_options(${TARGET_NAME} PRIVATE "-fsanitize=thread") + endif() + if(WITH_UB_SANITIZER) + target_compile_options(${TARGET_NAME} PRIVATE "-fsanitize=undefined") + target_link_options(${TARGET_NAME} PRIVATE "-fsanitize=undefined") + endif() endmacro() diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index 1255944a9..61a1965b2 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -31,7 +31,6 @@ set_default_target_properties(ldap-common) if(WITH_PCH) target_precompile_headers(ldap-common REUSE_FROM veyon-pch) endif() -set_target_properties(ldap-common PROPERTIES LINK_FLAGS "-Wl,-no-undefined") if(NOT WITH_CORE_ONLY) install(TARGETS ldap-common DESTINATION ${VEYON_LIB_DIR}) endif() diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index 8d8960411..72b5a5124 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -48,7 +48,6 @@ target_link_libraries(kldap-light PUBLIC ${Ldap_LIBRARIES} ${Sasl2_LIBRARIES}) target_include_directories(kldap-light PRIVATE ${Ldap_INCLUDE_DIRS}) target_include_directories(kldap-light PUBLIC ${kldap_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) set_default_target_properties(kldap-light) -set_target_properties(kldap-light PROPERTIES LINK_FLAGS "-Wl,-no-undefined") if(NOT WITH_CORE_ONLY) install(TARGETS kldap-light DESTINATION ${VEYON_LIB_DIR}) endif() From 7f9c2c6445f9b7d669b50cbb0fa500d4e041249c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 17:28:09 +0100 Subject: [PATCH 1277/1765] CMake: add option for disabling translations There's no need for generating translation files for simple CI jobs so we can drop that dependency and reduce the build times. --- CMakeLists.txt | 8 +++++++- cmake/modules/CreateTranslations.cmake | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c74c81d8e..d95cb0310 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(veyon) option(WITH_CORE_ONLY "Build core library only" OFF) option(WITH_ADDONS "Build add-ons" OFF) +option(WITH_TRANSLATIONS "Build translation files" ON) option(WITH_TESTS "Build tests and integrate runtime test extensions" OFF) option(WITH_LTO "Build with link-time optimization" ON) option(WITH_PCH "Reduce compile time by using precompiled headers (requires CMake >= 3.16)" ON) @@ -161,10 +162,12 @@ if(WITH_QT6) Gui Widgets Network - LinguistTools Quick QuickControls2 REQUIRED) + if(WITH_TRANSLATIONS) + find_package(Qt6 COMPONENTS LinguistTools REQUIRED) + endif() if(VEYON_BUILD_ANDROID) find_package(Qt6 COMPONENTS AndroidExtras REQUIRED) endif() @@ -177,6 +180,9 @@ else() find_package(Qt5LinguistTools REQUIRED) find_package(Qt5Quick REQUIRED) find_package(Qt5QuickControls2 REQUIRED) + if(WITH_TRANSLATIONS) + find_package(Qt5LinguistTools REQUIRED) + endif() if(VEYON_BUILD_ANDROID) find_package(Qt5AndroidExtras REQUIRED) endif() diff --git a/cmake/modules/CreateTranslations.cmake b/cmake/modules/CreateTranslations.cmake index 4a9c916c6..023a32c55 100644 --- a/cmake/modules/CreateTranslations.cmake +++ b/cmake/modules/CreateTranslations.cmake @@ -5,6 +5,11 @@ function(create_translations name ts_files source_files) + if(NOT WITH_TRANSLATIONS) + add_custom_target("${name}-translations") + return() + endif() + if(WITH_QT6) set(LUPDATE Qt6::lupdate) set(LRELEASE Qt6::lrelease) From 086fe2f726ec3d9037a8ab322319d7762328eef0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 17:29:28 +0100 Subject: [PATCH 1278/1765] CMake: fix build with Clang --- core/CMakeLists.txt | 4 +++- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index bdd6bb15a..8fc947588 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -52,7 +52,9 @@ else() ${libvncserver_DIR}/common/crypto_openssl.c ${libvncserver_DIR}/common/turbojpeg.c) - set_source_files_properties(${libvncclient_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-function -Wno-unused-variable -fvisibility=default") + set_source_files_properties(${libvncclient_SOURCES} PROPERTIES + COMPILE_FLAGS "-Wno-unused-function -Wno-unused-variable -fvisibility=default" + SKIP_PRECOMPILE_HEADERS TRUE) endif() add_library(veyon-core SHARED ${veyoncore_SOURCES} ${core_RESOURCES} ${libvncclient_SOURCES}) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 02d31b08b..7df6a1aab 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -190,8 +190,14 @@ if(NOT VEYON_X11VNC_EXTERNAL) ${x11vnc_DIR}/src/uinput.c ) - set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-misleading-indentation -Wno-deprecated-declarations -Wno-address -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros -Wno-stringop-truncation -Wno-stringop-overflow -Wno-format-overflow") + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(COMPILER_WARN_DISABLE_FLAGS "-Wno-unused-but-set-variable -Wno-address -Wno-discarded-qualifiers -Wno-strict-aliasing -Wno-restrict -Wno-multistatement-macros -Wno-stringop-truncation -Wno-stringop-overflow -Wno-format-overflow") + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(COMPILER_WARN_DISABLE_FLAGS "-Wno-sometimes-uninitialized -Wno-pointer-bool-conversion -Wno-tautological-pointer-compare -Wno-tautological-constant-out-of-range-compare -Wno-incompatible-pointer-types-discards-qualifiers") + endif() + set_source_files_properties(${x11vnc_SOURCES} ${libvncserver_SOURCES} PROPERTIES + COMPILE_FLAGS "${COMPILER_WARN_DISABLE_FLAGS} -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-function -Wno-unused-variable -Wno-misleading-indentation") endif() set(WITH_PCH OFF) From ee2a1f9c1eefd72a6d750a719707e38f8664f5b0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 17:30:05 +0100 Subject: [PATCH 1279/1765] CMake: use regular kldap source tree for Qt 6 builds --- plugins/ldap/kldap/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index 72b5a5124..fcc9d9cf3 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -17,7 +17,7 @@ CHECK_SYMBOL_EXISTS(ldap_extended_operation_s ldap.h HAVE_LDAP_EXTENDED_OPERATIO check_include_files(ldap.h HAVE_LDAP_H) set(LDAP_FOUND TRUE) -if(Qt5Core_VERSION VERSION_LESS 5.14.0) +if(NOT WITH_QT6 AND Qt5Core_VERSION VERSION_LESS 5.14.0) set(kldap_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/kldap-qt-compat/src/core) else() set(kldap_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/kldap/src/core) From 639abdbd71cd2569c702f355f33478a291b09e0f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 17:31:07 +0100 Subject: [PATCH 1280/1765] Fix Clang and Qt 6 build issues --- core/src/ComputerControlInterface.h | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.h | 2 +- plugins/ldap/common/LdapBrowseModel.cpp | 4 ++++ plugins/platform/linux/LinuxCoreFunctions.h | 2 +- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- plugins/screenshot/ScreenshotListModel.h | 2 +- 6 files changed, 9 insertions(+), 5 deletions(-) diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index d79314f57..3fa122c83 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -49,7 +49,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab int index; QString name; QRect geometry; - bool operator==(const ScreenProperties& other) + bool operator==(const ScreenProperties& other) const { return other.index == index && other.name == name && diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index 43ba2bd89..232bbea42 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -79,7 +79,7 @@ class DesktopServicesFeaturePlugin : public QObject, PluginInterface, return QStringLiteral("Tobias Junghans"); } - void upgrade( const QVersionNumber& oldVersion ); + void upgrade( const QVersionNumber& oldVersion ) override; const FeatureList& featureList() const override { diff --git a/plugins/ldap/common/LdapBrowseModel.cpp b/plugins/ldap/common/LdapBrowseModel.cpp index 622a68689..7958b9018 100644 --- a/plugins/ldap/common/LdapBrowseModel.cpp +++ b/plugins/ldap/common/LdapBrowseModel.cpp @@ -59,8 +59,12 @@ class LdapBrowseModelNode { qDeleteAll(m_childItems); } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + Q_DISABLE_COPY_MOVE(LdapBrowseModelNode) +#else Q_DISABLE_COPY(LdapBrowseModelNode) Q_DISABLE_MOVE(LdapBrowseModelNode) +#endif Type type() const { diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index 26f555934..c39ce5612 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -64,7 +64,7 @@ class LinuxCoreFunctions : public PlatformCoreFunctions QString genericUrlHandler() const override; - QString queryDisplayDeviceName(const QScreen& screen) const; + QString queryDisplayDeviceName(const QScreen& screen) const override; using DBusInterfacePointer = QSharedPointer; diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index c7a060e3d..2dd5a178f 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -35,7 +35,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions { Q_GADGET public: - using LoginDBusSession = struct { + using LoginDBusSession = struct LoginDBusSession { QString id; quint32 uid{0}; QString name; diff --git a/plugins/screenshot/ScreenshotListModel.h b/plugins/screenshot/ScreenshotListModel.h index 17688051c..04a71066e 100644 --- a/plugins/screenshot/ScreenshotListModel.h +++ b/plugins/screenshot/ScreenshotListModel.h @@ -34,7 +34,7 @@ class ScreenshotListModel : public QStringListModel public: explicit ScreenshotListModel( QObject *parent = nullptr ); - QHash roleNames() const; + QHash roleNames() const override; QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const override; From f9d4546e1d169c7817f7dcfd426b40361b44b320 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 17:31:53 +0100 Subject: [PATCH 1281/1765] Vnc{Client,Server}Protocol: operate on QIODevice This simplifies testing by supplying a QBuffer instance instead. --- core/src/VncClientProtocol.cpp | 2 +- core/src/VncClientProtocol.h | 6 +++--- core/src/VncServerProtocol.cpp | 8 ++++++-- core/src/VncServerProtocol.h | 8 ++++---- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 1ab5002da..6084ec5df 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -71,7 +71,7 @@ vncEncryptBytes(unsigned char *bytes, const char *passwd, size_t passwd_length) -VncClientProtocol::VncClientProtocol( QTcpSocket* socket, const Password& vncPassword ) : +VncClientProtocol::VncClientProtocol( QIODevice* socket, const Password& vncPassword ) : m_socket( socket ), m_vncPassword( vncPassword ) { diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index 0b2e0f70d..2557c1568 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -31,7 +31,7 @@ #include "CryptoCore.h" class QBuffer; -class QTcpSocket; +class QIODevice; class VEYON_CORE_EXPORT VncClientProtocol { @@ -50,7 +50,7 @@ class VEYON_CORE_EXPORT VncClientProtocol StateCount } ; - VncClientProtocol( QTcpSocket* socket, const Password& vncPassword ); + VncClientProtocol( QIODevice* socket, const Password& vncPassword ); State state() const { @@ -126,7 +126,7 @@ class VEYON_CORE_EXPORT VncClientProtocol static constexpr auto MaximumMessageSize = 4096*4096*4; - QTcpSocket* m_socket{nullptr}; + QIODevice* m_socket{nullptr}; State m_state{State::Disconnected}; Password m_vncPassword{}; diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index cccfc6ed1..6d95e5286 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -35,13 +35,17 @@ -VncServerProtocol::VncServerProtocol( QTcpSocket* socket, +VncServerProtocol::VncServerProtocol( QIODevice* socket, VncServerClient* client ) : m_socket( socket ), m_client( client ), m_serverInitMessage() { - m_client->setHostAddress( m_socket->peerAddress().toString() ); + auto qtcpSocket = qobject_cast(socket); + if (qtcpSocket) + { + m_client->setHostAddress(qtcpSocket->peerAddress().toString()); + } m_client->setAccessControlState( VncServerClient::AccessControlState::Init ); } diff --git a/core/src/VncServerProtocol.h b/core/src/VncServerProtocol.h index 40e77027b..3810431ea 100644 --- a/core/src/VncServerProtocol.h +++ b/core/src/VncServerProtocol.h @@ -27,7 +27,7 @@ #include "VeyonCore.h" #include "Plugin.h" -class QTcpSocket; +class QIODevice; class VariantArrayMessage; class VncServerClient; @@ -53,7 +53,7 @@ class VEYON_CORE_EXPORT VncServerProtocol StateCount } ; - VncServerProtocol( QTcpSocket* socket, + VncServerProtocol( QIODevice* socket, VncServerClient* client ); virtual ~VncServerProtocol() = default; @@ -72,7 +72,7 @@ class VEYON_CORE_EXPORT VncServerProtocol virtual void processAuthenticationMessage( VariantArrayMessage& message ) = 0; virtual void performAccessControl() = 0; - QTcpSocket* socket() + QIODevice* socket() { return m_socket; } @@ -98,7 +98,7 @@ class VEYON_CORE_EXPORT VncServerProtocol bool processFramebufferInit(); private: - QTcpSocket* m_socket; + QIODevice* m_socket; VncServerClient* m_client; QByteArray m_serverInitMessage; From 9932f65949570e5bcb32740f36f4d66f4d7b3bab Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 17:33:19 +0100 Subject: [PATCH 1282/1765] VncClientProtocol: add protected setState() member Allows easy class testing in different protocol states. --- core/src/VncClientProtocol.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index 2557c1568..ab7f02514 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -97,6 +97,12 @@ class VEYON_CORE_EXPORT VncClientProtocol return m_lastUpdatedRect; } +protected: + void setState(State state) + { + m_state = state; + } + private: bool readProtocol(); bool receiveSecurityTypes(); From e34368d299a330aae904fd935c17608c5934969a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 17:34:12 +0100 Subject: [PATCH 1283/1765] VncClientProtocol: limit size of messages received from server This prevents potential memory allocation failures. --- core/src/VncClientProtocol.cpp | 8 ++++---- core/src/VncClientProtocol.h | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 6084ec5df..ae312a8ac 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -630,7 +630,7 @@ bool VncClientProtocol::handleRectEncodingRRE( QBuffer& buffer, uint bytesPerPix const auto rectDataSize = qFromBigEndian( hdr.nSubrects ) * ( bytesPerPixel + sz_rfbRectangle ); const auto totalDataSize = static_cast( bytesPerPixel + rectDataSize ); - return buffer.read( totalDataSize ).size() == totalDataSize; + return totalDataSize < MaxMessageSize && buffer.read( totalDataSize ).size() == totalDataSize; } @@ -647,7 +647,7 @@ bool VncClientProtocol::handleRectEncodingCoRRE( QBuffer& buffer, uint bytesPerP const auto rectDataSize = qFromBigEndian( hdr.nSubrects ) * ( bytesPerPixel + 4 ); const auto totalDataSize = static_cast( bytesPerPixel + rectDataSize ); - return buffer.read( totalDataSize ).size() == totalDataSize; + return totalDataSize < MaxMessageSize && buffer.read( totalDataSize ).size() == totalDataSize; } @@ -754,7 +754,7 @@ bool VncClientProtocol::handleRectEncodingZlib( QBuffer& buffer ) const auto n = qFromBigEndian( hdr.nBytes ); - return buffer.read( n ).size() == static_cast( n ); + return n < MaxMessageSize && uint32_t(buffer.read(n).size()) == n; } @@ -770,7 +770,7 @@ bool VncClientProtocol::handleRectEncodingZRLE(QBuffer &buffer) const auto n = qFromBigEndian( hdr.length ); - return buffer.read( n ).size() == static_cast( n ); + return n < MaxMessageSize && uint32_t(buffer.read(n).size()) == n; } diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index ab7f02514..3cbd12d73 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -104,6 +104,8 @@ class VEYON_CORE_EXPORT VncClientProtocol } private: + static constexpr auto MaxMessageSize = 64*1024*1024; + bool readProtocol(); bool receiveSecurityTypes(); bool receiveSecurityChallenge(); From 50b26d7dea3da0d71456b3f5105893dd98accd33 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 20:04:33 +0100 Subject: [PATCH 1284/1765] Add initial libfuzzer test set --- CMakeLists.txt | 1 + cmake/modules/BuildVeyonFuzzer.cmake | 14 ++++ tests/CMakeLists.txt | 3 + tests/libfuzzer/CMakeLists.txt | 1 + tests/libfuzzer/core/CMakeLists.txt | 4 + .../core/variantarraymessage/CMakeLists.txt | 3 + .../core/variantarraymessage/main.cpp | 15 ++++ .../core/variantstream/CMakeLists.txt | 3 + tests/libfuzzer/core/variantstream/main.cpp | 23 ++++++ .../core/vncclientprotocol/CMakeLists.txt | 3 + .../libfuzzer/core/vncclientprotocol/main.cpp | 52 +++++++++++++ .../core/vncserverprotocol/CMakeLists.txt | 3 + .../libfuzzer/core/vncserverprotocol/main.cpp | 75 +++++++++++++++++++ 13 files changed, 200 insertions(+) create mode 100644 cmake/modules/BuildVeyonFuzzer.cmake create mode 100644 tests/CMakeLists.txt create mode 100644 tests/libfuzzer/CMakeLists.txt create mode 100644 tests/libfuzzer/core/CMakeLists.txt create mode 100644 tests/libfuzzer/core/variantarraymessage/CMakeLists.txt create mode 100644 tests/libfuzzer/core/variantarraymessage/main.cpp create mode 100644 tests/libfuzzer/core/variantstream/CMakeLists.txt create mode 100644 tests/libfuzzer/core/variantstream/main.cpp create mode 100644 tests/libfuzzer/core/vncclientprotocol/CMakeLists.txt create mode 100644 tests/libfuzzer/core/vncclientprotocol/main.cpp create mode 100644 tests/libfuzzer/core/vncserverprotocol/CMakeLists.txt create mode 100644 tests/libfuzzer/core/vncserverprotocol/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d95cb0310..17390d92f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -293,6 +293,7 @@ if(NOT WITH_CORE_ONLY) add_subdirectory(cli) add_subdirectory(worker) add_subdirectory(plugins) + add_subdirectory(tests) add_subdirectory(translations) endif() if(WITH_ADDONS) diff --git a/cmake/modules/BuildVeyonFuzzer.cmake b/cmake/modules/BuildVeyonFuzzer.cmake new file mode 100644 index 000000000..3fdc029f4 --- /dev/null +++ b/cmake/modules/BuildVeyonFuzzer.cmake @@ -0,0 +1,14 @@ +# BuildVeyonFuzzer.cmake - Copyright (c) 2021 Tobias Junghans +# +# description: build fuzzer test for Veyon component +# usage: build_veyon_fuzzer( ) + +macro(build_veyon_fuzzer FUZZER_NAME) + add_executable(${FUZZER_NAME} ${ARGN}) + set_default_target_properties(${FUZZER_NAME}) + target_compile_options(${FUZZER_NAME} PRIVATE "-g;-fsanitize=fuzzer") + target_link_options(${FUZZER_NAME} PRIVATE "-g;-fsanitize=fuzzer") + target_link_libraries(${FUZZER_NAME} veyon-core) + add_test(NAME ${FUZZER_NAME} COMMAND ${FUZZER_NAME} -max_total_time=60) +endmacro() + diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 000000000..2337f4398 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,3 @@ +if(WITH_FUZZERS) + add_subdirectory(libfuzzer) +endif() diff --git a/tests/libfuzzer/CMakeLists.txt b/tests/libfuzzer/CMakeLists.txt new file mode 100644 index 000000000..ad6d4787c --- /dev/null +++ b/tests/libfuzzer/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(core) diff --git a/tests/libfuzzer/core/CMakeLists.txt b/tests/libfuzzer/core/CMakeLists.txt new file mode 100644 index 000000000..ff3eac443 --- /dev/null +++ b/tests/libfuzzer/core/CMakeLists.txt @@ -0,0 +1,4 @@ +add_subdirectory(variantarraymessage) +add_subdirectory(variantstream) +add_subdirectory(vncclientprotocol) +add_subdirectory(vncserverprotocol) diff --git a/tests/libfuzzer/core/variantarraymessage/CMakeLists.txt b/tests/libfuzzer/core/variantarraymessage/CMakeLists.txt new file mode 100644 index 000000000..8c7eceae6 --- /dev/null +++ b/tests/libfuzzer/core/variantarraymessage/CMakeLists.txt @@ -0,0 +1,3 @@ +include(BuildVeyonFuzzer) + +build_veyon_fuzzer(variantarraymessage main.cpp) diff --git a/tests/libfuzzer/core/variantarraymessage/main.cpp b/tests/libfuzzer/core/variantarraymessage/main.cpp new file mode 100644 index 000000000..71ade2238 --- /dev/null +++ b/tests/libfuzzer/core/variantarraymessage/main.cpp @@ -0,0 +1,15 @@ +#include + +#include "VariantArrayMessage.h" + +extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) +{ + QBuffer buffer; + buffer.open(QIODevice::ReadWrite); + buffer.write(QByteArray(data, size)); + buffer.seek(0); + + VariantArrayMessage(&buffer).receive(); + + return 0; +} diff --git a/tests/libfuzzer/core/variantstream/CMakeLists.txt b/tests/libfuzzer/core/variantstream/CMakeLists.txt new file mode 100644 index 000000000..2e6b1984c --- /dev/null +++ b/tests/libfuzzer/core/variantstream/CMakeLists.txt @@ -0,0 +1,3 @@ +include(BuildVeyonFuzzer) + +build_veyon_fuzzer(variantstream main.cpp) diff --git a/tests/libfuzzer/core/variantstream/main.cpp b/tests/libfuzzer/core/variantstream/main.cpp new file mode 100644 index 000000000..e14b513e1 --- /dev/null +++ b/tests/libfuzzer/core/variantstream/main.cpp @@ -0,0 +1,23 @@ +#include +#include + +#include "VariantStream.h" + +extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) +{ + // QVariant requires GUI support to create types such as QPixmap + new QGuiApplication(*argc, *argv); + return 0; +} + +extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) +{ + QBuffer buffer; + buffer.open(QIODevice::ReadWrite); + buffer.write(QByteArray(data, size)); + buffer.seek(0); + + VariantStream{&buffer}.read(); + + return 0; +} diff --git a/tests/libfuzzer/core/vncclientprotocol/CMakeLists.txt b/tests/libfuzzer/core/vncclientprotocol/CMakeLists.txt new file mode 100644 index 000000000..19e7f4f5d --- /dev/null +++ b/tests/libfuzzer/core/vncclientprotocol/CMakeLists.txt @@ -0,0 +1,3 @@ +include(BuildVeyonFuzzer) + +build_veyon_fuzzer(vncclientprotocol main.cpp) diff --git a/tests/libfuzzer/core/vncclientprotocol/main.cpp b/tests/libfuzzer/core/vncclientprotocol/main.cpp new file mode 100644 index 000000000..12e698f89 --- /dev/null +++ b/tests/libfuzzer/core/vncclientprotocol/main.cpp @@ -0,0 +1,52 @@ +#include + +#include "VncClientProtocol.h" + +class VncClientProtocolTest : public VncClientProtocol +{ +public: + VncClientProtocolTest(QIODevice* socket) : + VncClientProtocol(socket, {}) + { + } + + void init(char state) + { + setState(State(state)); + } + +}; + + + +extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) +{ + if (size < 3) + { + return 0; + } + + QBuffer buffer; + buffer.open(QIODevice::ReadWrite); + + VncClientProtocolTest protocol(&buffer); + + const auto mode = data[0]; + const auto state = data[1]; + + protocol.init(state); + + buffer.write(QByteArray(data+2, size-2)); + buffer.seek(0); + + if(mode) + { + protocol.read(); + } + else + { + protocol.receiveMessage(); + } + + return 0; +} diff --git a/tests/libfuzzer/core/vncserverprotocol/CMakeLists.txt b/tests/libfuzzer/core/vncserverprotocol/CMakeLists.txt new file mode 100644 index 000000000..95d922f3b --- /dev/null +++ b/tests/libfuzzer/core/vncserverprotocol/CMakeLists.txt @@ -0,0 +1,3 @@ +include(BuildVeyonFuzzer) + +build_veyon_fuzzer(vncserverprotocol main.cpp) diff --git a/tests/libfuzzer/core/vncserverprotocol/main.cpp b/tests/libfuzzer/core/vncserverprotocol/main.cpp new file mode 100644 index 000000000..b5f3f2e15 --- /dev/null +++ b/tests/libfuzzer/core/vncserverprotocol/main.cpp @@ -0,0 +1,75 @@ +#include +#include + +#include "VncServerClient.h" +#include "VncServerProtocol.h" + +class VncServerProtocolTest : public VncServerProtocol +{ +public: + VncServerProtocolTest(Plugin::Uid authMethod, QIODevice* socket, VncServerClient* client) : + VncServerProtocol(socket, client), + m_authMethod(authMethod) + { + } + + AuthMethodUids supportedAuthMethodUids() const override + { + return {m_authMethod}; + } + + void processAuthenticationMessage(VariantArrayMessage& message) override + { + Q_UNUSED(message) + } + + void performAccessControl() override + { + } + +private: + const Plugin::Uid m_authMethod; + +}; + + + +extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) +{ + // QVariant requires GUI support to create types such as QPixmap + new QGuiApplication(*argc, *argv); + return 0; +} + + + +extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) +{ + if (size < 5) + { + return 0; + } + + QBuffer buffer; + buffer.open(QIODevice::ReadWrite); + + const VncServerProtocol::AuthMethodUids authMethodUids{ + Plugin::Uid{QByteArrayLiteral("63611f7c-b457-42c7-832e-67d0f9281085")}, + Plugin::Uid{QByteArrayLiteral("73430b14-ef69-4c75-a145-ba635d1cc676")}, + Plugin::Uid{QByteArrayLiteral("0c69b301-81b4-42d6-8fae-128cdd113314")} + }; + + VncServerClient client; + VncServerProtocolTest protocol(authMethodUids.value(data[0]), &buffer, &client); + + client.setProtocolState(VncServerProtocol::State(data[1])); + client.setAuthState(VncServerClient::AuthState(data[2])); + client.setAccessControlState(VncServerClient::AccessControlState(data[3])); + + buffer.write(QByteArray(data+4, size-4)); + buffer.seek(0); + + protocol.read(); + + return 0; +} From 9dd1db2f5eda93d12f82631ae25f2904d9080c60 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 21 Dec 2021 12:12:03 +0100 Subject: [PATCH 1285/1765] PluginManager: maintain plugin search paths internally The previous implementation effectively only loaded the plugins from the search path added first. Also add more plugin directories to the search path list when building with tests so that all binaries work normally without installation or symlinking. --- core/src/PluginManager.cpp | 19 ++++++++++++++++--- core/src/PluginManager.h | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index eee12e174..c76b9a59f 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -153,11 +153,19 @@ void PluginManager::initPluginSearchPath() { vDebug() << "Adding plugin search path" << pluginSearchPath; } - QDir::addSearchPath( QStringLiteral( "plugins" ), pluginSearchPath ); + m_pluginSearchPaths.append(pluginSearchPath); QCoreApplication::addLibraryPath( pluginSearchPath ); } #if defined(VEYON_WITH_TESTS) - QDir::addSearchPath(QStringLiteral("plugins"), QStringLiteral(CMAKE_BINARY_DIR "/plugins/platform/linux")); + for (const auto& baseDir : {QStringLiteral(CMAKE_BINARY_DIR "/plugins/platform"), + QStringLiteral(CMAKE_BINARY_DIR "/plugins/vncserver"), + QStringLiteral(CMAKE_BINARY_DIR "/plugins/")}) + { + for (auto pluginDir : QDir(baseDir).entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot)) + { + m_pluginSearchPaths.append(pluginDir.absoluteFilePath()); + } + } #endif } @@ -165,7 +173,12 @@ void PluginManager::initPluginSearchPath() void PluginManager::loadPlugins( const QString& nameFilter ) { - const auto plugins = QDir( QStringLiteral( "plugins:" ) ).entryInfoList( { nameFilter } ); + QFileInfoList plugins; + for (const auto& pluginSearchPath : m_pluginSearchPaths) + { + plugins.append(QDir(pluginSearchPath).entryInfoList({nameFilter})); + } + for( const auto& fileInfo : plugins ) { const auto fileName = fileInfo.fileName(); diff --git a/core/src/PluginManager.h b/core/src/PluginManager.h index 9f52e3de2..1f41d1f6d 100644 --- a/core/src/PluginManager.h +++ b/core/src/PluginManager.h @@ -77,6 +77,7 @@ class VEYON_CORE_EXPORT PluginManager : public QObject void initPluginSearchPath(); void loadPlugins( const QString& nameFilter ); + QStringList m_pluginSearchPaths; PluginInterfaceList m_pluginInterfaces{}; QObjectList m_pluginObjects{}; QList m_pluginLoaders{}; From fd049003a5a43cffe53300f7a1a17fcc5ec98200 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 21 Dec 2021 12:19:10 +0100 Subject: [PATCH 1286/1765] tests: don't create deep copies of input data --- tests/libfuzzer/core/variantarraymessage/main.cpp | 2 +- tests/libfuzzer/core/variantstream/main.cpp | 2 +- tests/libfuzzer/core/vncclientprotocol/main.cpp | 2 +- tests/libfuzzer/core/vncserverprotocol/main.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/libfuzzer/core/variantarraymessage/main.cpp b/tests/libfuzzer/core/variantarraymessage/main.cpp index 71ade2238..7542b8048 100644 --- a/tests/libfuzzer/core/variantarraymessage/main.cpp +++ b/tests/libfuzzer/core/variantarraymessage/main.cpp @@ -6,7 +6,7 @@ extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) { QBuffer buffer; buffer.open(QIODevice::ReadWrite); - buffer.write(QByteArray(data, size)); + buffer.write(QByteArray::fromRawData(data, size)); buffer.seek(0); VariantArrayMessage(&buffer).receive(); diff --git a/tests/libfuzzer/core/variantstream/main.cpp b/tests/libfuzzer/core/variantstream/main.cpp index e14b513e1..d20bb8532 100644 --- a/tests/libfuzzer/core/variantstream/main.cpp +++ b/tests/libfuzzer/core/variantstream/main.cpp @@ -14,7 +14,7 @@ extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) { QBuffer buffer; buffer.open(QIODevice::ReadWrite); - buffer.write(QByteArray(data, size)); + buffer.write(QByteArray::fromRawData(data, size)); buffer.seek(0); VariantStream{&buffer}.read(); diff --git a/tests/libfuzzer/core/vncclientprotocol/main.cpp b/tests/libfuzzer/core/vncclientprotocol/main.cpp index 12e698f89..8237e8971 100644 --- a/tests/libfuzzer/core/vncclientprotocol/main.cpp +++ b/tests/libfuzzer/core/vncclientprotocol/main.cpp @@ -36,7 +36,7 @@ extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) protocol.init(state); - buffer.write(QByteArray(data+2, size-2)); + buffer.write(QByteArray::fromRawData(data+2, size-2)); buffer.seek(0); if(mode) diff --git a/tests/libfuzzer/core/vncserverprotocol/main.cpp b/tests/libfuzzer/core/vncserverprotocol/main.cpp index b5f3f2e15..150ad0825 100644 --- a/tests/libfuzzer/core/vncserverprotocol/main.cpp +++ b/tests/libfuzzer/core/vncserverprotocol/main.cpp @@ -66,7 +66,7 @@ extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) client.setAuthState(VncServerClient::AuthState(data[2])); client.setAccessControlState(VncServerClient::AccessControlState(data[3])); - buffer.write(QByteArray(data+4, size-4)); + buffer.write(QByteArray::fromRawData(data+4, size-4)); buffer.seek(0); protocol.read(); From 6b2d08bb74d1a329baaf79595cb645bd1ff8b046 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 21 Dec 2021 14:16:34 +0100 Subject: [PATCH 1287/1765] VariantStream: check input stream for integrity Since it's easy to craft messages such that QVariant and related QDataStream operators try to create huge objects or containers, we have to restrict both the supported types as well as object and container sizes. This fixes the most obvious issues found by the variantstream fuzzer. --- core/src/VariantArrayMessage.cpp | 6 +- core/src/VariantStream.cpp | 200 +++++++++++++++++++++++++++++++ core/src/VariantStream.h | 16 +++ 3 files changed, 219 insertions(+), 3 deletions(-) diff --git a/core/src/VariantArrayMessage.cpp b/core/src/VariantArrayMessage.cpp index bdf1031d9..aba2730f3 100644 --- a/core/src/VariantArrayMessage.cpp +++ b/core/src/VariantArrayMessage.cpp @@ -72,21 +72,21 @@ bool VariantArrayMessage::receive() if( m_ioDevice->read( reinterpret_cast( &messageSize ), sizeof(messageSize) ) != sizeof(messageSize) ) // Flawfinder: ignore { - vWarning() << "could not read message size!"; + vDebug() << "could not read message size!"; return false; } messageSize = qFromBigEndian(messageSize); if( messageSize > MaxMessageSize ) { - vCritical() << "invalid message size" << messageSize; + vDebug() << "invalid message size" << messageSize; return false; } const auto data = m_ioDevice->read( messageSize ); // Flawfinder: ignore if( data.size() != static_cast( messageSize ) ) { - vWarning() << "could not read message data!"; + vDebug() << "could not read message data!"; return false; } diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index 4436b63f0..f8f1dc435 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -35,6 +35,16 @@ VariantStream::VariantStream( QIODevice* ioDevice ) : QVariant VariantStream::read() // Flawfinder: ignore { QVariant v; + + m_dataStream.startTransaction(); + const auto isValid = checkVariant(0); + m_dataStream.rollbackTransaction(); + + if (isValid == false) + { + return {}; + } + m_dataStream >> v; if( v.isValid() == false || v.isNull() ) @@ -51,3 +61,193 @@ void VariantStream::write( const QVariant& v ) { m_dataStream << v; } + + + +bool VariantStream::checkBool() +{ + bool b; + m_dataStream >> b; + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + +bool VariantStream::checkByteArray() +{ + const auto pos = m_dataStream.device()->pos(); + + quint32 len; + m_dataStream >> len; + + m_dataStream.device()->seek(pos); + + if (len > MaxByteArraySize) + { + vDebug() << "byte array too big"; + return false; + } + + QByteArray s; + m_dataStream >> s; + + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + +bool VariantStream::checkInt() +{ + int i; + m_dataStream >> i; + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + +bool VariantStream::checkRect() +{ + qint32 i; + m_dataStream >> i >> i >> i >> i; + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + +bool VariantStream::checkString() +{ + const auto pos = m_dataStream.device()->pos(); + + quint32 len; + m_dataStream >> len; + + m_dataStream.device()->seek(pos); + + if (len > MaxStringSize) + { + vDebug() << "string too long"; + return false; + } + + QString s; + m_dataStream >> s; + + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + +bool VariantStream::checkStringList() +{ + quint32 n; + m_dataStream >> n; + + if (n > MaxContainerSize) + { + vDebug() << "QStringList has too many elements"; + return false; + } + + for (quint32 i = 0; i < n; ++i) + { + if (checkString() == false) + { + return false; + } + } + + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + +bool VariantStream::checkUuid() +{ + QUuid uuid; + m_dataStream >> uuid; + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + +bool VariantStream::checkVariant(int depth) +{ + if (depth > MaxCheckRecursionDepth) + { + vDebug() << "max recursion depth reached"; + return false; + } + + quint32 typeId = 0; + m_dataStream >> typeId; + + quint8 isNull = false; + m_dataStream >> isNull; + + switch(typeId) + { + case QMetaType::Bool: return checkBool(); + case QMetaType::QByteArray: return checkByteArray(); + case QMetaType::Int: return checkInt(); + case QMetaType::QRect: return checkRect(); + case QMetaType::QString: return checkString(); + case QMetaType::QStringList: return checkStringList(); + case QMetaType::QUuid: return checkUuid(); + case QMetaType::QVariantList: return checkVariantList(depth); + case QMetaType::QVariantMap: return checkVariantMap(depth); + default: + vDebug() << "invalid type" << typeId; + return false; + } + + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + +bool VariantStream::checkVariantList(int depth) +{ + quint32 n; + m_dataStream >> n; + + if (n > MaxContainerSize) + { + vDebug() << "QVariantList has too many elements"; + return false; + } + + for (quint32 i = 0; i < n; ++i) + { + if (checkVariant(depth+1) == false) + { + return false; + } + } + + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + +bool VariantStream::checkVariantMap(int depth) +{ + quint32 n; + m_dataStream >> n; + + if (n > MaxContainerSize) + { + vDebug() << "QVariantMap has too many elements"; + return false; + } + + for (quint32 i = 0; i < n; ++i) + { + if (checkString() == false || + checkVariant(depth+1) == false) + { + return false; + } + } + + return m_dataStream.status() == QDataStream::Status::Ok; +} diff --git a/core/src/VariantStream.h b/core/src/VariantStream.h index e851230f1..a01117c50 100644 --- a/core/src/VariantStream.h +++ b/core/src/VariantStream.h @@ -31,6 +31,11 @@ class VEYON_CORE_EXPORT VariantStream { public: + static constexpr auto MaxByteArraySize = 1024*1024; + static constexpr auto MaxStringSize = 16*1024; + static constexpr auto MaxContainerSize = 1024; + static constexpr auto MaxCheckRecursionDepth = 3; + explicit VariantStream( QIODevice* ioDevice ); QVariant read(); // Flawfinder: ignore @@ -38,6 +43,17 @@ class VEYON_CORE_EXPORT VariantStream void write( const QVariant& v ); private: + bool checkBool(); + bool checkByteArray(); + bool checkInt(); + bool checkRect(); + bool checkString(); + bool checkStringList(); + bool checkUuid(); + bool checkVariant(int depth); + bool checkVariantList(int depth); + bool checkVariantMap(int depth); + QDataStream m_dataStream; } ; From 9f82840f4995927d3674c0454d0511f5081fcc74 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 21 Dec 2021 14:22:18 +0100 Subject: [PATCH 1288/1765] tests: use common init routine It creates application and VeyonCore instances. --- tests/libfuzzer/common/init.cpp | 8 ++++++++ .../libfuzzer/core/variantarraymessage/CMakeLists.txt | 2 +- tests/libfuzzer/core/variantstream/CMakeLists.txt | 2 +- tests/libfuzzer/core/variantstream/main.cpp | 8 -------- tests/libfuzzer/core/vncclientprotocol/CMakeLists.txt | 2 +- tests/libfuzzer/core/vncclientprotocol/main.cpp | 1 - tests/libfuzzer/core/vncserverprotocol/CMakeLists.txt | 2 +- tests/libfuzzer/core/vncserverprotocol/main.cpp | 11 ----------- 8 files changed, 12 insertions(+), 24 deletions(-) create mode 100644 tests/libfuzzer/common/init.cpp diff --git a/tests/libfuzzer/common/init.cpp b/tests/libfuzzer/common/init.cpp new file mode 100644 index 000000000..606106414 --- /dev/null +++ b/tests/libfuzzer/common/init.cpp @@ -0,0 +1,8 @@ +#include + +extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) +{ + auto app = new QCoreApplication(*argc, *argv); + new VeyonCore(app, VeyonCore::Component::CLI, QStringLiteral("Fuzzer")); + return 0; +} diff --git a/tests/libfuzzer/core/variantarraymessage/CMakeLists.txt b/tests/libfuzzer/core/variantarraymessage/CMakeLists.txt index 8c7eceae6..ddc131013 100644 --- a/tests/libfuzzer/core/variantarraymessage/CMakeLists.txt +++ b/tests/libfuzzer/core/variantarraymessage/CMakeLists.txt @@ -1,3 +1,3 @@ include(BuildVeyonFuzzer) -build_veyon_fuzzer(variantarraymessage main.cpp) +build_veyon_fuzzer(variantarraymessage main.cpp ../../common/init.cpp) diff --git a/tests/libfuzzer/core/variantstream/CMakeLists.txt b/tests/libfuzzer/core/variantstream/CMakeLists.txt index 2e6b1984c..17eefb871 100644 --- a/tests/libfuzzer/core/variantstream/CMakeLists.txt +++ b/tests/libfuzzer/core/variantstream/CMakeLists.txt @@ -1,3 +1,3 @@ include(BuildVeyonFuzzer) -build_veyon_fuzzer(variantstream main.cpp) +build_veyon_fuzzer(variantstream main.cpp ../../common/init.cpp) diff --git a/tests/libfuzzer/core/variantstream/main.cpp b/tests/libfuzzer/core/variantstream/main.cpp index d20bb8532..4111efd90 100644 --- a/tests/libfuzzer/core/variantstream/main.cpp +++ b/tests/libfuzzer/core/variantstream/main.cpp @@ -1,15 +1,7 @@ #include -#include #include "VariantStream.h" -extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) -{ - // QVariant requires GUI support to create types such as QPixmap - new QGuiApplication(*argc, *argv); - return 0; -} - extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) { QBuffer buffer; diff --git a/tests/libfuzzer/core/vncclientprotocol/CMakeLists.txt b/tests/libfuzzer/core/vncclientprotocol/CMakeLists.txt index 19e7f4f5d..5b1c5a7cf 100644 --- a/tests/libfuzzer/core/vncclientprotocol/CMakeLists.txt +++ b/tests/libfuzzer/core/vncclientprotocol/CMakeLists.txt @@ -1,3 +1,3 @@ include(BuildVeyonFuzzer) -build_veyon_fuzzer(vncclientprotocol main.cpp) +build_veyon_fuzzer(vncclientprotocol main.cpp ../../common/init.cpp) diff --git a/tests/libfuzzer/core/vncclientprotocol/main.cpp b/tests/libfuzzer/core/vncclientprotocol/main.cpp index 8237e8971..b72182462 100644 --- a/tests/libfuzzer/core/vncclientprotocol/main.cpp +++ b/tests/libfuzzer/core/vncclientprotocol/main.cpp @@ -18,7 +18,6 @@ class VncClientProtocolTest : public VncClientProtocol }; - extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) { if (size < 3) diff --git a/tests/libfuzzer/core/vncserverprotocol/CMakeLists.txt b/tests/libfuzzer/core/vncserverprotocol/CMakeLists.txt index 95d922f3b..e98bc93db 100644 --- a/tests/libfuzzer/core/vncserverprotocol/CMakeLists.txt +++ b/tests/libfuzzer/core/vncserverprotocol/CMakeLists.txt @@ -1,3 +1,3 @@ include(BuildVeyonFuzzer) -build_veyon_fuzzer(vncserverprotocol main.cpp) +build_veyon_fuzzer(vncserverprotocol main.cpp ../../common/init.cpp) diff --git a/tests/libfuzzer/core/vncserverprotocol/main.cpp b/tests/libfuzzer/core/vncserverprotocol/main.cpp index 150ad0825..9e1d1c47a 100644 --- a/tests/libfuzzer/core/vncserverprotocol/main.cpp +++ b/tests/libfuzzer/core/vncserverprotocol/main.cpp @@ -1,5 +1,4 @@ #include -#include #include "VncServerClient.h" #include "VncServerProtocol.h" @@ -33,16 +32,6 @@ class VncServerProtocolTest : public VncServerProtocol }; - -extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) -{ - // QVariant requires GUI support to create types such as QPixmap - new QGuiApplication(*argc, *argv); - return 0; -} - - - extern "C" int LLVMFuzzerTestOneInput(const char *data, size_t size) { if (size < 5) From 856a8ffc8098a23c95440dc9be53128816b8dc81 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Dec 2021 09:58:58 +0100 Subject: [PATCH 1289/1765] BuiltinX11VncServer: fix library linking --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 7df6a1aab..29a207e26 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -4,6 +4,7 @@ if(NOT VEYON_X11VNC_EXTERNAL) get_property(HAVE_LIBVNCCLIENT GLOBAL PROPERTY HAVE_LIBVNCCLIENT) if(HAVE_LIBVNCCLIENT) + find_package(LibVNCClient) find_package(LibVNCServer 0.9.8) else() message(WARNING "No suitable LibVNCClient library found therefore performing internal build of LibVNCServer as well to avoid binary compatibility issues") @@ -224,11 +225,6 @@ else() target_include_directories(builtin-x11vnc-server PRIVATE ${x11vnc_DIR}/src) target_link_libraries(builtin-x11vnc-server PRIVATE - Threads::Threads - PNG::PNG - ${ZLIB_LIBRARIES} - ${JPEG_LIBRARIES} - ${LZO_LIBRARIES} ${X11_LIBRARIES} ${X11_XTest_LIB} ${X11_Xfixes_LIB} @@ -238,8 +234,17 @@ else() ) if(LibVNCServer_FOUND) - target_link_libraries(builtin-x11vnc-server PRIVATE LibVNC::LibVNCServer) + target_link_libraries(builtin-x11vnc-server PRIVATE + LibVNC::LibVNCClient + LibVNC::LibVNCServer) else() + target_link_libraries(builtin-x11vnc-server PRIVATE + Threads::Threads + PNG::PNG + ${ZLIB_LIBRARIES} + ${JPEG_LIBRARIES} + ${LZO_LIBRARIES} + ) target_include_directories(builtin-x11vnc-server PRIVATE ${libvncserver_DIR}/libvncserver ${libvncserver_DIR}/common) endif() From 61b3df5bf49644338cdc8a18fb7eb8a6191ba25f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 4 Jan 2022 16:09:43 +0100 Subject: [PATCH 1290/1765] AccessControlProvider: add debug message Log resolved user groups and configured authorized groups to ease debugging. --- core/src/AccessControlProvider.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 7b5ba4580..e4ae51b63 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -170,6 +170,8 @@ bool AccessControlProvider::processAuthorizedGroups( const QString& accessingUse const auto groupsOfAccessingUser = m_userGroupsBackend->groupsOfUser( accessingUser, m_queryDomainGroups ); const auto authorizedUserGroups = VeyonCore::config().authorizedUserGroups(); + vDebug() << groupsOfAccessingUser << authorizedUserGroups; + #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) const auto groupsOfAccessingUserSet = QSet{ groupsOfAccessingUser.begin(), groupsOfAccessingUser.end() }; const auto authorizedUserGroupSet = QSet{ authorizedUserGroups.begin(), authorizedUserGroups.end() }; From 7d6e3787e61d5c9a051b712a2efe35b8a05d545c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jan 2022 20:14:30 +0100 Subject: [PATCH 1291/1765] Core: convert strings to Plugin::Uid explicitly --- core/src/AuthenticationManager.cpp | 4 ++-- core/src/NetworkObjectDirectoryManager.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/AuthenticationManager.cpp b/core/src/AuthenticationManager.cpp index 5006094a6..214905120 100644 --- a/core/src/AuthenticationManager.cpp +++ b/core/src/AuthenticationManager.cpp @@ -29,8 +29,8 @@ AuthenticationManager::AuthenticationManager( QObject* parent ) : QObject( parent ), m_legacyAuthTypes( { - { LegacyAuthType::Logon, QStringLiteral("63611f7c-b457-42c7-832e-67d0f9281085") }, - { LegacyAuthType::KeyFile, QStringLiteral("0c69b301-81b4-42d6-8fae-128cdd113314") } + { LegacyAuthType::Logon, Plugin::Uid{QStringLiteral("63611f7c-b457-42c7-832e-67d0f9281085")} }, + { LegacyAuthType::KeyFile, Plugin::Uid{QStringLiteral("0c69b301-81b4-42d6-8fae-128cdd113314")} } } ) { for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) diff --git a/core/src/NetworkObjectDirectoryManager.cpp b/core/src/NetworkObjectDirectoryManager.cpp index 942d5e919..4318a4f73 100644 --- a/core/src/NetworkObjectDirectoryManager.cpp +++ b/core/src/NetworkObjectDirectoryManager.cpp @@ -53,14 +53,14 @@ NetworkObjectDirectory* NetworkObjectDirectoryManager::configuredDirectory() const auto enabledDirectories = VeyonCore::config().enabledNetworkObjectDirectoryPlugins(); if( enabledDirectories.count() == 1 ) { - m_configuredDirectory = createDirectory( enabledDirectories.constFirst(), this ); + m_configuredDirectory = createDirectory( Plugin::Uid{enabledDirectories.constFirst()}, this ); } else if( enabledDirectories.count() > 1 ) { const auto nestedDirectory = new NestedNetworkObjectDirectory( this ); for( const auto& directoryUid : enabledDirectories ) { - nestedDirectory->addSubDirectory( createDirectory( directoryUid, this ) ); + nestedDirectory->addSubDirectory( createDirectory( Plugin::Uid{directoryUid}, this ) ); } m_configuredDirectory = nestedDirectory; } From c148d5de210b458bf1b0b6af821a8acf63eb834a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jan 2022 20:15:27 +0100 Subject: [PATCH 1292/1765] LogoffEventFilter: adopt Qt 6 API --- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp index 6103aec99..e81b737da 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp @@ -52,7 +52,7 @@ LogoffEventFilter::LogoffEventFilter() : -bool LogoffEventFilter::nativeEventFilter( const QByteArray& eventType, void* message, long* result ) +bool LogoffEventFilter::nativeEventFilter(const QByteArray& eventType, void* message, qintptr* result) { Q_UNUSED(eventType) Q_UNUSED(result) diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h index 131ddeece..48437b572 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h @@ -34,7 +34,7 @@ class LogoffEventFilter : public QAbstractNativeEventFilter public: LogoffEventFilter(); - bool nativeEventFilter( const QByteArray& eventType, void* message, long* result) override; + bool nativeEventFilter(const QByteArray& eventType, void* message, qintptr* result) override; private: HANDLE m_shutdownEventHandle; From dd555350491069dcf34641370932c5c500a5615a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jan 2022 20:19:33 +0100 Subject: [PATCH 1293/1765] CMake: add VEYON_BUILD_WINDOWS Use VEYON_BUILD_WIN32/WIN64 for specific arch builds only. --- CMakeLists.txt | 15 +++++++++------ cli/CMakeLists.txt | 2 +- cmake/modules/WindowsBuildHelpers.cmake | 4 ++-- core/CMakeLists.txt | 9 +-------- plugins/platform/CMakeLists.txt | 2 +- plugins/vncserver/CMakeLists.txt | 2 +- 6 files changed, 15 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 17390d92f..981b65b59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,7 +108,14 @@ endif() # set up basic platform variables if(WIN32) - set(VEYON_BUILD_WIN32 1) + set(VEYON_BUILD_WINDOWS 1) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(VEYON_BUILD_WIN64 1) + set(VEYON_WINDOWS_ARCH "win64") + else() + set(VEYON_BUILD_WIN32 1) + set(VEYON_WINDOWS_ARCH "win32") + endif() add_definitions(-DUNICODE -D_UNICODE) endif() if(APPLE) @@ -121,10 +128,6 @@ if(ANDROID) set(VEYON_BUILD_ANDROID 1) endif() -if(WIN64) - set(VEYON_BUILD_WIN64 TRUE) -endif() - # set up library and plugin path variables if(VEYON_BUILD_ANDROID) set(CMAKE_INSTALL_PREFIX "/") @@ -204,7 +207,7 @@ elseif(WITH_UNITY_BUILD) set(CMAKE_UNITY_BUILD ON) endif() -if(VEYON_BUILD_WIN32 OR VEYON_BUILD_WIN64) +if(VEYON_BUILD_WINDOWS) set(WITH_LTO OFF) endif() diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 8f2bb8b2b..1c7254a65 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -22,7 +22,7 @@ target_compile_options(veyon-cli PRIVATE -Wno-date-time) add_windows_resource(veyon-cli ${CMAKE_CURRENT_BINARY_DIR}/veyon-cli.rc) make_console_app(veyon-cli) -if(VEYON_BUILD_WIN32) +if(VEYON_BUILD_WINDOWS) build_veyon_application(veyon-wcli ${cli_SOURCES}) add_windows_resource(veyon-wcli ${CMAKE_CURRENT_BINARY_DIR}/veyon-wcli.rc) diff --git a/cmake/modules/WindowsBuildHelpers.cmake b/cmake/modules/WindowsBuildHelpers.cmake index c29123b8d..352344617 100644 --- a/cmake/modules/WindowsBuildHelpers.cmake +++ b/cmake/modules/WindowsBuildHelpers.cmake @@ -13,13 +13,13 @@ macro(add_windows_resource TARGET) endmacro() macro(make_graphical_app TARGET) - if(VEYON_BUILD_WIN32) + if(VEYON_BUILD_WINDOWS) set_target_properties(${TARGET} PROPERTIES LINK_FLAGS -mwindows) endif() endmacro() macro(make_console_app TARGET) - if(VEYON_BUILD_WIN32) + if(VEYON_BUILD_WINDOWS) set_target_properties(${TARGET} PROPERTIES LINK_FLAGS -mconsole) endif() endmacro() diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 8fc947588..ca464afe7 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -119,7 +119,7 @@ else() ) endif() -if(VEYON_BUILD_WIN32) +if(VEYON_BUILD_WINDOWS) # add Windows Socket library required by libvncclient target_link_libraries(veyon-core PRIVATE -lws2_32) set_target_properties(veyon-core PROPERTIES PREFIX "") @@ -136,10 +136,6 @@ if(VEYON_BUILD_ANDROID) target_link_libraries(veyon-core PRIVATE Qt5::AndroidExtras) endif() -if(VEYON_BUILD_WIN32) - target_compile_definitions(veyon-core PUBLIC _WIN32_WINNT=0x0602) -endif() - if(WITH_PCH) target_precompile_headers(veyon-core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") @@ -159,7 +155,4 @@ if(WITH_PCH) target_link_libraries(veyon-pch PUBLIC Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) endif() target_precompile_headers(veyon-pch PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") - if(VEYON_BUILD_WIN32) - target_compile_definitions(veyon-pch PUBLIC _WIN32_WINNT=0x0602) - endif() endif() diff --git a/plugins/platform/CMakeLists.txt b/plugins/platform/CMakeLists.txt index 31642a3b6..b4458a780 100644 --- a/plugins/platform/CMakeLists.txt +++ b/plugins/platform/CMakeLists.txt @@ -1,4 +1,4 @@ -if(VEYON_BUILD_WIN32) +if(VEYON_BUILD_WINDOWS) add_subdirectory(windows) endif() diff --git a/plugins/vncserver/CMakeLists.txt b/plugins/vncserver/CMakeLists.txt index b685119c1..239b7cee2 100644 --- a/plugins/vncserver/CMakeLists.txt +++ b/plugins/vncserver/CMakeLists.txt @@ -1,4 +1,4 @@ -if(VEYON_BUILD_WIN32) +if(VEYON_BUILD_WINDOWS) add_subdirectory(ultravnc-builtin) endif() From 60c3a83514a1eaef9b5281dede3e1f776ecdb1ea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jan 2022 20:20:44 +0100 Subject: [PATCH 1294/1765] CMake: add Windows RES files to target sources Recent versions of CMake handle compiling Windows resource files properly so there's no need to add custom commands any longer. --- cmake/modules/WindowsBuildHelpers.cmake | 13 +++---------- .../ultravnc-builtin/vnchooks/CMakeLists.txt | 10 ++-------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/cmake/modules/WindowsBuildHelpers.cmake b/cmake/modules/WindowsBuildHelpers.cmake index 352344617..641e8f0ca 100644 --- a/cmake/modules/WindowsBuildHelpers.cmake +++ b/cmake/modules/WindowsBuildHelpers.cmake @@ -1,14 +1,7 @@ macro(add_windows_resource TARGET) - if(VEYON_BUILD_WIN32) - set(WINRC "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.rc") - set(RCOBJ "${CMAKE_CURRENT_BINARY_DIR}/winrc-${TARGET}.obj") - add_custom_command(OUTPUT ${RCOBJ} - COMMAND ${WINDRES} - -I${CMAKE_CURRENT_SOURCE_DIR} - -o${RCOBJ} - -i${WINRC} - DEPENDS ${WINRC}) - target_sources(${TARGET} PUBLIC ${RCOBJ}) + if(VEYON_BUILD_WINDOWS) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.rc PROPERTIES INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}) + target_sources(${TARGET} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.rc) endif() endmacro() diff --git a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt index 348d469bd..5d08707f0 100644 --- a/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/vnchooks/CMakeLists.txt @@ -1,16 +1,10 @@ -set(VH_WINRC "${CMAKE_CURRENT_BINARY_DIR}/vnchooksrc.obj") -add_custom_command(OUTPUT ${VH_WINRC} - COMMAND ${WINDRES} - -I${CMAKE_CURRENT_SOURCE_DIR} - -o${VH_WINRC} - -i${ultravnc_DIR}/winvnc/vnchooks/vnchooks.rc) - set(vnchooks_SOURCES ${ultravnc_DIR}/winvnc/vnchooks/VNCHooks.cpp ${ultravnc_DIR}/winvnc/vnchooks/SharedData.cpp + ${ultravnc_DIR}/winvnc/vnchooks/vnchooks.rc ) -add_library(vnchooks MODULE ${vnchooks_SOURCES} ${VH_WINRC}) +add_library(vnchooks MODULE ${vnchooks_SOURCES}) set_source_files_properties(${vnchooks_SOURCES} PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) set_default_target_properties(vnchooks) set_target_properties(vnchooks PROPERTIES PREFIX "") From dd5da9cf3d5609615d6c3dbeee96df4667f7df1c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jan 2022 20:22:24 +0100 Subject: [PATCH 1295/1765] CMake: FindQCA: add support for Qt 6 version --- cmake/modules/FindQCA.cmake | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cmake/modules/FindQCA.cmake b/cmake/modules/FindQCA.cmake index 1cd968122..a16cf2955 100644 --- a/cmake/modules/FindQCA.cmake +++ b/cmake/modules/FindQCA.cmake @@ -21,13 +21,13 @@ if(QCA_INCLUDE_DIR AND QCA_LIBRARY) else() if(WITH_QT6) - set(QCA_LIBRARY_NAMES qca-qt6 qca2-qt6) + set(QCA_SUFFIX "qt6") else() - set(QCA_LIBRARY_NAMES qca-qt5 qca2-qt5) + set(QCA_SUFFIX "qt5") endif() find_library(QCA_LIBRARY - NAMES ${QCA_LIBRARY_NAMES} + NAMES qca-${QCA_SUFFIX} qca2-${QCA_SUFFIX} PATHS ${LIB_DIR} $ENV{LIB} @@ -48,7 +48,11 @@ else() "$ENV{LIB_DIR}/include" $ENV{INCLUDE} /usr/local/include - PATH_SUFFIXES QtCrypto qt5/QtCrypto Qca-qt5/QtCrypto qt/Qca-qt5/QtCrypto qt5/Qca-qt5/QtCrypto + PATH_SUFFIXES QtCrypto + ${QCA_SUFFIX}/QtCrypto + Qca-${QCA_SUFFIX}/QtCrypto + qt/Qca-${QCA_SUFFIX}/QtCrypto + qt5/Qca-${QCA_SUFFIX}/QtCrypto ) if(QCA_LIBRARY AND QCA_INCLUDE_DIR) From 08d5e169369a0f27a4463eba6a5d34a44d1961ff Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jan 2022 20:25:40 +0100 Subject: [PATCH 1296/1765] CMake: use Qt 6 for Windows builds --- 3rdparty/ultravnc | 2 +- cmake/modules/WindowsInstaller.cmake | 28 +++++++++++++------ nsis/veyon.nsi.in | 2 +- plugins/platform/windows/CMakeLists.txt | 2 ++ .../vncserver/ultravnc-builtin/CMakeLists.txt | 2 ++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index fc9259e15..5975642e4 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit fc9259e159af6913c4a9dd624665018c1aeacd89 +Subproject commit 5975642e4075008b706fb516c967b2b25cd8f466 diff --git a/cmake/modules/WindowsInstaller.cmake b/cmake/modules/WindowsInstaller.cmake index a255061d6..f8e8ad6a1 100644 --- a/cmake/modules/WindowsInstaller.cmake +++ b/cmake/modules/WindowsInstaller.cmake @@ -1,4 +1,4 @@ -set(WINDOWS_INSTALL_FILES "veyon-${MINGW_PLATFORM}-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}") +set(WINDOWS_INSTALL_FILES "veyon-${VEYON_WINDOWS_ARCH}-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}") set(DLLDIR "${MINGW_PREFIX}/bin") set(DLLDIR_LIB "${MINGW_PREFIX}/lib") @@ -30,7 +30,7 @@ add_custom_target(windows-binaries COMMAND cp ${DLLDIR}/libjpeg-62.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libpng16-16.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libcrypto-1_1*.dll ${DLLDIR}/libssl-1_1*.dll ${WINDOWS_INSTALL_FILES} - COMMAND cp ${DLLDIR}/libqca-qt5.dll ${WINDOWS_INSTALL_FILES} + COMMAND cp ${DLLDIR}/libqca-qt6.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libsasl2-3.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libldap.dll ${DLLDIR}/liblber.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/interception.dll ${WINDOWS_INSTALL_FILES} @@ -42,15 +42,27 @@ add_custom_target(windows-binaries COMMAND cp ${DLLDIR_GCC}/libssp-0.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR_GCC}/${DLL_GCC} ${WINDOWS_INSTALL_FILES} COMMAND mkdir -p ${WINDOWS_INSTALL_FILES}/crypto - COMMAND cp ${DLLDIR_LIB}/qca-qt5/crypto/libqca-ossl.dll ${WINDOWS_INSTALL_FILES}/crypto - COMMAND cp ${DLLDIR}/Qt5Core.dll ${DLLDIR}/Qt5Gui.dll ${DLLDIR}/Qt5Widgets.dll ${DLLDIR}/Qt5Network.dll ${DLLDIR}/Qt5Concurrent.dll ${DLLDIR}/Qt5Qml.dll ${DLLDIR}/Qt5Quick.dll ${DLLDIR}/Qt5QuickControls2.dll ${DLLDIR}/Qt5QuickTemplates2.dll ${WINDOWS_INSTALL_FILES} + COMMAND cp ${DLLDIR_LIB}/qca-qt6/crypto/libqca-ossl.dll ${WINDOWS_INSTALL_FILES}/crypto + COMMAND cp ${DLLDIR}/Qt6Core.dll + ${DLLDIR}/Qt6Core5Compat.dll + ${DLLDIR}/Qt6Gui.dll + ${DLLDIR}/Qt6Widgets.dll + ${DLLDIR}/Qt6Network.dll + ${DLLDIR}/Qt6Concurrent.dll + ${DLLDIR}/Qt6OpenGL.dll + ${DLLDIR}/Qt6Qml.dll + ${DLLDIR}/Qt6QmlModels.dll + ${DLLDIR}/Qt6Quick.dll + ${DLLDIR}/Qt6QuickControls2.dll + ${DLLDIR}/Qt6QuickTemplates2.dll + ${WINDOWS_INSTALL_FILES} COMMAND mkdir -p ${WINDOWS_INSTALL_FILES}/imageformats - COMMAND cp ${DLLDIR_LIB}/qt5/plugins/imageformats/qjpeg.dll ${WINDOWS_INSTALL_FILES}/imageformats + COMMAND cp ${MINGW_PREFIX}/plugins/imageformats/qjpeg.dll ${WINDOWS_INSTALL_FILES}/imageformats COMMAND mkdir -p ${WINDOWS_INSTALL_FILES}/platforms - COMMAND cp ${DLLDIR_LIB}/qt5/plugins/platforms/qwindows.dll ${WINDOWS_INSTALL_FILES}/platforms + COMMAND cp ${MINGW_PREFIX}/plugins/platforms/qwindows.dll ${WINDOWS_INSTALL_FILES}/platforms COMMAND mkdir -p ${WINDOWS_INSTALL_FILES}/styles - COMMAND cp ${DLLDIR_LIB}/qt5/plugins/styles/*.dll ${WINDOWS_INSTALL_FILES}/styles - COMMAND ${STRIP} ${WINDOWS_INSTALL_FILES}/*.dll ${WINDOWS_INSTALL_FILES}/*.exe ${WINDOWS_INSTALL_FILES}/plugins/*.dll ${WINDOWS_INSTALL_FILES}/platforms/*.dll ${WINDOWS_INSTALL_FILES}/styles/*.dll ${WINDOWS_INSTALL_FILES}/crypto/*.dll + COMMAND cp ${MINGW_PREFIX}/plugins/styles/*.dll ${WINDOWS_INSTALL_FILES}/styles + COMMAND ${MINGW_TOOL_PREFIX}strip ${WINDOWS_INSTALL_FILES}/*.dll ${WINDOWS_INSTALL_FILES}/*.exe ${WINDOWS_INSTALL_FILES}/plugins/*.dll ${WINDOWS_INSTALL_FILES}/platforms/*.dll ${WINDOWS_INSTALL_FILES}/styles/*.dll ${WINDOWS_INSTALL_FILES}/crypto/*.dll COMMAND cp ${CMAKE_SOURCE_DIR}/COPYING ${WINDOWS_INSTALL_FILES} COMMAND cp ${CMAKE_SOURCE_DIR}/COPYING ${WINDOWS_INSTALL_FILES}/LICENSE.TXT COMMAND cp ${CMAKE_SOURCE_DIR}/README.md ${WINDOWS_INSTALL_FILES}/README.TXT diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index da6465769..933eeba1a 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -5,7 +5,7 @@ !define COPYRIGHT "2004-2021 Veyon Solutions / Tobias Junghans" !define DESCRIPTION "Veyon Installer" !define LICENSE_TXT "COPYING" -!define INSTALLER_NAME "veyon-${VERSION}-@MINGW_PLATFORM@-setup.exe" +!define INSTALLER_NAME "veyon-${VERSION}-@VEYON_WINDOWS_ARCH@-setup.exe" !define MAIN_APP_EXE "veyon-master.exe" !define INSTALL_TYPE "SetShellVarContext all" !define REG_ROOT "HKLM" diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index 07ff45060..fb954f29d 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -56,7 +56,9 @@ target_include_directories(windows-platform PRIVATE ${ultravnc_DIR} ${Qt5Gui_PRIVATE_INCLUDE_DIRS} ) + target_link_libraries(windows-platform PRIVATE -lwtsapi32 -lnetapi32 -luserenv -linterception -liphlpapi) +target_link_libraries(windows-platform PRIVATE Qt6::GuiPrivate) target_compile_definitions(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) target_compile_options(windows-platform PRIVATE "-Wno-unknown-pragmas") set_source_files_properties(WindowsNetworkFunctions.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_PRECOMPILE_HEADERS TRUE) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index f9cc7fe4c..d8436f7e2 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -100,6 +100,8 @@ if(VEYON_BUILD_WIN64) target_compile_definitions(builtin-ultravnc-server PRIVATE _X64) endif() +qt6_disable_unicode_defines(builtin-ultravnc-server) + set(ULTRAVNC_COMPILER_FLAGS "-Wno-comments -Wno-attributes -Wno-write-strings -Wno-parentheses -Wno-misleading-indentation -Wno-unused-result -Wno-unused-label -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-format-zero-length -Wno-sign-compare -Wno-int-to-pointer-cast -fexceptions") set_source_files_properties(${ultravnc_C_SOURCES} PROPERTIES COMPILE_FLAGS "${ULTRAVNC_COMPILER_FLAGS}") From 1b55b7beeae8395b1ee0262980f14ea6c2cf0d72 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jan 2022 20:35:54 +0100 Subject: [PATCH 1297/1765] VariantStream: add missing include --- core/src/VariantStream.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index f8f1dc435..549855f9b 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -22,6 +22,8 @@ * */ +#include + #include "VariantStream.h" VariantStream::VariantStream( QIODevice* ioDevice ) : From c082e037a9f7f38a2df223984cc2b22c196dcd9c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jan 2022 20:51:09 +0100 Subject: [PATCH 1298/1765] VeyonServerProtocol: add missing decl/include --- server/src/VeyonServerProtocol.cpp | 2 ++ server/src/VeyonServerProtocol.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/server/src/VeyonServerProtocol.cpp b/server/src/VeyonServerProtocol.cpp index 626d6a493..f0a6c01ae 100644 --- a/server/src/VeyonServerProtocol.cpp +++ b/server/src/VeyonServerProtocol.cpp @@ -22,6 +22,8 @@ * */ +#include + #include "AuthenticationManager.h" #include "ServerAuthenticationManager.h" #include "ServerAccessControlManager.h" diff --git a/server/src/VeyonServerProtocol.h b/server/src/VeyonServerProtocol.h index de77a0ff0..14bee227e 100644 --- a/server/src/VeyonServerProtocol.h +++ b/server/src/VeyonServerProtocol.h @@ -26,6 +26,8 @@ #include "VncServerProtocol.h" +class QTcpSocket; + class ServerAuthenticationManager; class ServerAccessControlManager; From b63b84e1c40c941facb45d9f0297c00606c93e26 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jan 2022 20:51:29 +0100 Subject: [PATCH 1299/1765] CI: Windows: switch to Qt 6 --- .ci/windows/build.sh | 2 +- .gitlab-ci.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh index 34574ba79..0b3d75233 100755 --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -11,7 +11,7 @@ rm -rf $BUILDDIR mkdir $BUILDDIR cd $BUILDDIR -cmake $BASEDIR -DCMAKE_TOOLCHAIN_FILE=$BASEDIR/cmake/modules/Win${1}Toolchain.cmake -DCMAKE_MODULE_PATH=$BASEDIR/cmake/modules/ -G Ninja $CMAKE_FLAGS +/usr/$1-w64-mingw32/bin/qt-cmake $BASEDIR -G Ninja -DWITH_QT6=ON $CMAKE_FLAGS if [ -z "$2" ] ; then ninja windows-binaries diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d5ad5f43d..53e3cb33c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,10 +28,10 @@ build-windows: stage: build image: $CI_REGISTRY/veyon/ci-mingw-w64:5.0 script: - - .ci/windows/build.sh $BITS + - .ci/windows/build.sh $ARCH parallel: matrix: - - BITS: [32, 64] + - ARCH: [i686, x86_64] artifacts: paths: [ veyon-win* ] expire_in: 1 day From 7313b1cf7755e216c7e24cfab3380c9859b97ff7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 11:40:25 +0100 Subject: [PATCH 1300/1765] CMake: drop redundant find_package() for Qt5LinguistTools --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 981b65b59..b90f558fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,7 +180,6 @@ else() find_package(Qt5Gui REQUIRED) find_package(Qt5Widgets REQUIRED) find_package(Qt5Network REQUIRED) - find_package(Qt5LinguistTools REQUIRED) find_package(Qt5Quick REQUIRED) find_package(Qt5QuickControls2 REQUIRED) if(WITH_TRANSLATIONS) From bddb9467c0c1a081e06241efd40ca43502decb9b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 14:16:02 +0100 Subject: [PATCH 1301/1765] CMake: link ws2_32 to Windows platform plugin --- plugins/platform/windows/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index fb954f29d..37cee5baf 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -57,7 +57,7 @@ target_include_directories(windows-platform PRIVATE ${Qt5Gui_PRIVATE_INCLUDE_DIRS} ) -target_link_libraries(windows-platform PRIVATE -lwtsapi32 -lnetapi32 -luserenv -linterception -liphlpapi) +target_link_libraries(windows-platform PRIVATE -lws2_32 -lwtsapi32 -lnetapi32 -luserenv -linterception -liphlpapi) target_link_libraries(windows-platform PRIVATE Qt6::GuiPrivate) target_compile_definitions(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) target_compile_options(windows-platform PRIVATE "-Wno-unknown-pragmas") From 679847f3e30460acfdb568267712ec6f52aa81dc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 14:16:51 +0100 Subject: [PATCH 1302/1765] CMake: link ws2_32 to ultravnc-builtin plugin --- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index d8436f7e2..a35a3d74a 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -86,7 +86,7 @@ build_veyon_plugin(builtin-ultravnc-server UltraVncConfiguration.h ) -target_link_libraries(builtin-ultravnc-server PRIVATE -luserenv -lole32 -lversion -lgdi32 -limm32 -lwinmm ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${LZO_LIBRARIES}) +target_link_libraries(builtin-ultravnc-server PRIVATE -lws2_32 -luserenv -lole32 -lversion -lgdi32 -limm32 -lwinmm ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${LZO_LIBRARIES}) target_include_directories(builtin-ultravnc-server PRIVATE ${ultravnc_DIR} ${ultravnc_DIR}/winvnc From 00db260497d297fe93e4bbd4630e09b00265a0ef Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 14:20:17 +0100 Subject: [PATCH 1303/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 5975642e4..ef44e79b8 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 5975642e4075008b706fb516c967b2b25cd8f466 +Subproject commit ef44e79b801fad4d32f1072153298b576dacc23f From 12777bbd11fa735a5532c054524c3664a1e8d574 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 14:30:51 +0100 Subject: [PATCH 1304/1765] DemoServerProtocol: add missing include --- plugins/demo/DemoServerProtocol.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/demo/DemoServerProtocol.cpp b/plugins/demo/DemoServerProtocol.cpp index 03d8020fd..e6f77e986 100644 --- a/plugins/demo/DemoServerProtocol.cpp +++ b/plugins/demo/DemoServerProtocol.cpp @@ -22,6 +22,8 @@ * */ +#include + #include "DemoAuthentication.h" #include "DemoServerProtocol.h" #include "VariantArrayMessage.h" From 549d5bb44f9a45d080f6cacc24103e56fa3400ed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 19:43:29 +0100 Subject: [PATCH 1305/1765] VariantStream: fix check for null strings/bytearrays --- core/src/VariantStream.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index 549855f9b..881489084 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -82,7 +82,11 @@ bool VariantStream::checkByteArray() quint32 len; m_dataStream >> len; - m_dataStream.device()->seek(pos); + // null array? + if (len == 0xffffffff) + { + return true; + } if (len > MaxByteArraySize) { @@ -90,6 +94,8 @@ bool VariantStream::checkByteArray() return false; } + m_dataStream.device()->seek(pos); + QByteArray s; m_dataStream >> s; @@ -123,7 +129,11 @@ bool VariantStream::checkString() quint32 len; m_dataStream >> len; - m_dataStream.device()->seek(pos); + // null string? + if (len == 0xffffffff) + { + return true; + } if (len > MaxStringSize) { @@ -131,6 +141,8 @@ bool VariantStream::checkString() return false; } + m_dataStream.device()->seek(pos); + QString s; m_dataStream >> s; From 1a0154dae20959e4c17ee1ed5747c1c5247052c2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 19:44:05 +0100 Subject: [PATCH 1306/1765] VariantStream: increase limits for strings and bytearrays When transferring clipboard data, larger strings or bytearrays may have to be transferred. --- core/src/VariantStream.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/VariantStream.h b/core/src/VariantStream.h index a01117c50..62cfbd78b 100644 --- a/core/src/VariantStream.h +++ b/core/src/VariantStream.h @@ -31,8 +31,8 @@ class VEYON_CORE_EXPORT VariantStream { public: - static constexpr auto MaxByteArraySize = 1024*1024; - static constexpr auto MaxStringSize = 16*1024; + static constexpr auto MaxByteArraySize = 16*1024*1024; + static constexpr auto MaxStringSize = 64*1024; static constexpr auto MaxContainerSize = 1024; static constexpr auto MaxCheckRecursionDepth = 3; From 8873ec9ebd80331762630618f62ff0e4af18b69a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 19:56:08 +0100 Subject: [PATCH 1307/1765] RemoteAccessPage: add computerControlInterface() --- plugins/remoteaccess/RemoteAccessPage.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/remoteaccess/RemoteAccessPage.h b/plugins/remoteaccess/RemoteAccessPage.h index 791a31e88..c2f9997b9 100644 --- a/plugins/remoteaccess/RemoteAccessPage.h +++ b/plugins/remoteaccess/RemoteAccessPage.h @@ -42,6 +42,11 @@ class RemoteAccessPage : public QObject QQuickItem* parent ); ~RemoteAccessPage() override; + ComputerControlInterface::Pointer computerControlInterface() const + { + return m_computerControlInterface; + } + QString computerName() const { return m_computerControlInterface->computer().name(); From a6e5df97224a55d270f16b8e024fdf1f25f5a9d3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 19:56:19 +0100 Subject: [PATCH 1308/1765] RemoteAccessWidget: add computerControlInterface() --- plugins/remoteaccess/RemoteAccessWidget.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index eef8243e3..e32d8b706 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -88,6 +88,11 @@ class RemoteAccessWidget : public QWidget bool startViewOnly, bool showViewOnlyToggleButton ); ~RemoteAccessWidget() override; + ComputerControlInterface::Pointer computerControlInterface() const + { + return m_computerControlInterface; + } + VncViewWidget* vncView() const { return m_vncView; From 2c14268e245d0acdea530ce07f7c75f1bf11ca44 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Jan 2022 20:06:08 +0100 Subject: [PATCH 1309/1765] RemoteAccess: add initial clipboard I/O support Exchanging clipboard data works for text while for images everything is prepared but still a few platform-specific issues, especially on Windows, need to be figured out. Closes #358 and closes #478. --- .../RemoteAccessFeaturePlugin.cpp | 144 +++++++++++++++++- .../remoteaccess/RemoteAccessFeaturePlugin.h | 31 +++- 2 files changed, 171 insertions(+), 4 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 88d72769f..e79da9d59 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -23,6 +23,8 @@ */ #include +#include +#include #include #include "AuthenticationManager.h" @@ -51,13 +53,23 @@ RemoteAccessFeaturePlugin::RemoteAccessFeaturePlugin( QObject* parent ) : tr( "Remote control" ), {}, tr( "Open a remote control window for a computer." ), QStringLiteral(":/remoteaccess/krdc.png") ), - m_features( { m_remoteViewFeature, m_remoteControlFeature } ), + m_clipboardExchangeFeature(QStringLiteral("ClipboardExchange"), + Feature::Flag::Meta, + Feature::Uid("8fa73e19-3d66-4d59-9783-c2a1bb07e20e"), + Feature::Uid(), + tr("Exchange clipboard contents"), {}, {}), + m_features({m_remoteViewFeature, m_remoteControlFeature, m_clipboardExchangeFeature}), m_commands( { { QStringLiteral("view"), m_remoteViewFeature.displayName() }, { QStringLiteral("control"), m_remoteControlFeature.displayName() }, { QStringLiteral("help"), tr( "Show help about command" ) }, } ) { + if (VeyonCore::component() == VeyonCore::Component::Server) + { + connect (QGuiApplication::clipboard(), &QClipboard::dataChanged, + this, &RemoteAccessFeaturePlugin::updateClipboardData); + } } @@ -130,6 +142,23 @@ bool RemoteAccessFeaturePlugin::startFeature( VeyonMasterInterface& master, cons } + +bool RemoteAccessFeaturePlugin::handleFeatureMessage(ComputerControlInterface::Pointer computerControlInterface, + const FeatureMessage& message) +{ + Q_UNUSED(computerControlInterface) + + if (message.featureUid() == m_clipboardExchangeFeature.uid()) + { + loadClipboardData(message); + return true; + } + + return false; +} + + + bool RemoteAccessFeaturePlugin::handleFeatureMessage(VeyonServerInterface &server, const MessageContext &messageContext, const FeatureMessage &message) @@ -143,6 +172,11 @@ bool RemoteAccessFeaturePlugin::handleFeatureMessage(VeyonServerInterface &serve server.featureWorkerManager().sendMessageToUnmanagedSessionWorker(message); return true; } + else if (message.featureUid() == m_clipboardExchangeFeature.uid()) + { + loadClipboardData(message); + return true; + } return false; } @@ -169,6 +203,26 @@ bool RemoteAccessFeaturePlugin::handleFeatureMessage(VeyonWorkerInterface &worke +void RemoteAccessFeaturePlugin::sendAsyncFeatureMessages(VeyonServerInterface& server, + const MessageContext& messageContext) +{ + const auto clipboardDataVersion = messageContext.ioDevice()->property(clipboardDataVersionProperty()).toInt(); + + if (clipboardDataVersion != m_clipboardDataVersion) + { + FeatureMessage message{m_clipboardExchangeFeature.uid()}; + + m_clipboardDataMutex.lock(); + storeClipboardData(&message, m_clipboardText, m_clipboardImage); + m_clipboardDataMutex.unlock(); + + server.sendFeatureMessageReply(messageContext, message); + messageContext.ioDevice()->setProperty(clipboardDataVersionProperty(), m_clipboardDataVersion); + } +} + + + QStringList RemoteAccessFeaturePlugin::commands() const { return m_commands.keys(); @@ -299,11 +353,95 @@ void RemoteAccessFeaturePlugin::createRemoteAccessWindow(const ComputerControlIn { if (master && master->appContainer()) { - new RemoteAccessPage(computerControlInterface, viewOnly, master->appContainer()); + auto page = new RemoteAccessPage(computerControlInterface, viewOnly, master->appContainer()); + // forward clipboard changes as long as the page exists + connect(QGuiApplication::clipboard(), &QClipboard::dataChanged, page, [=]() + { + sendClipboardData(page->computerControlInterface()); + }); } else { - new RemoteAccessWidget(computerControlInterface, viewOnly, remoteViewEnabled() && remoteControlEnabled()); + auto widget = new RemoteAccessWidget(computerControlInterface, viewOnly, + remoteViewEnabled() && remoteControlEnabled()); + + // forward clipboard changes as long as the widget exists + connect(QGuiApplication::clipboard(), &QClipboard::dataChanged, widget, [=]() + { + sendClipboardData(widget->computerControlInterface()); + }); + } +} + + + +void RemoteAccessFeaturePlugin::storeClipboardData(FeatureMessage *message, const QString& text, const QImage& image) +{ + QBuffer buffer; + buffer.open(QIODevice::WriteOnly); + image.save(&buffer, clipboardImageFormat()); + buffer.close(); + + message->addArgument(Argument::ClipboardText, text); + message->addArgument(Argument::ClipboardImage, buffer.data()); +} + + + +void RemoteAccessFeaturePlugin::loadClipboardData(const FeatureMessage &message) +{ + const auto clipboard = QGuiApplication::clipboard(); + + const auto text = message.argument(Argument::ClipboardText).toString(); + if (text.isEmpty() == false && clipboard->text() != text) + { + clipboard->setText(text); + } + + // TODO: better support for image I/O on Windows via QWindowsMime + + const auto image = QImage::fromData(message.argument(Argument::ClipboardImage).toByteArray(), + clipboardImageFormat()); + if (image.isNull() == false && clipboard->image() != image) + { + clipboard->setImage(image); + } +} + + + +void RemoteAccessFeaturePlugin::sendClipboardData(ComputerControlInterface::Pointer computerControlInterface) +{ + FeatureMessage message{m_clipboardExchangeFeature.uid()}; + + const auto clipboard = QGuiApplication::clipboard(); + + // TODO: better support for image I/O on Windows via QWindowsMime + storeClipboardData(&message, clipboard->text(), clipboard->image()); + + computerControlInterface->sendFeatureMessage(message); +} + + + +void RemoteAccessFeaturePlugin::updateClipboardData() +{ + m_clipboardDataMutex.lock(); + + const auto clipboard = QGuiApplication::clipboard(); + + if (m_clipboardText != clipboard->text()) + { + m_clipboardText = clipboard->text(); + ++m_clipboardDataVersion; + } + + // TODO: better support for image I/O on Windows via QWindowsMime + if (m_clipboardImage != clipboard->image()) + { + m_clipboardImage = clipboard->image(); + ++m_clipboardDataVersion; } + m_clipboardDataMutex.unlock(); } diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index c0c47fec5..cbd34d420 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -37,7 +37,9 @@ class RemoteAccessFeaturePlugin : public QObject, CommandLinePluginInterface, Fe public: enum class Argument { - HostName + HostName, + ClipboardText, + ClipboardImage }; Q_ENUM(Argument) @@ -82,12 +84,17 @@ class RemoteAccessFeaturePlugin : public QObject, CommandLinePluginInterface, Fe bool startFeature( VeyonMasterInterface& master, const Feature& feature, const ComputerControlInterfaceList& computerControlInterfaces ) override; + bool handleFeatureMessage(ComputerControlInterface::Pointer computerControlInterface, + const FeatureMessage& message) override; + bool handleFeatureMessage(VeyonServerInterface& server, const MessageContext& messageContext, const FeatureMessage& message) override; bool handleFeatureMessage(VeyonWorkerInterface& worker, const FeatureMessage& message) override; + void sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) override; + QString commandLineModuleName() const override { return QStringLiteral( "remoteaccess" ); @@ -108,6 +115,16 @@ private Q_SLOTS: CommandLinePluginInterface::RunResult handle_help( const QStringList& arguments ); private: + static const char* clipboardDataVersionProperty() + { + return "clipboardDataVersion"; + } + + static const char* clipboardImageFormat() + { + return "PNG"; + } + bool remoteViewEnabled() const; bool remoteControlEnabled() const; bool initAuthentication(); @@ -115,10 +132,22 @@ private Q_SLOTS: void createRemoteAccessWindow(const ComputerControlInterface::Pointer& computerControlInterface, bool viewOnly, VeyonMasterInterface* master); + void storeClipboardData(FeatureMessage* message, const QString& text, const QImage& image); + void loadClipboardData(const FeatureMessage& message); + void sendClipboardData(ComputerControlInterface::Pointer computerControlInterface); + + void updateClipboardData(); + const Feature m_remoteViewFeature; const Feature m_remoteControlFeature; + const Feature m_clipboardExchangeFeature; const FeatureList m_features; QMap m_commands; + QMutex m_clipboardDataMutex; + int m_clipboardDataVersion{0}; + QString m_clipboardText; + QImage m_clipboardImage; + }; From e6f749fdaa5b4d11ce17fc81d3d83dfa4f5d935c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Jan 2022 14:04:25 +0100 Subject: [PATCH 1310/1765] Update copyright --- README.md | 2 +- cli/src/ConfigCommands.cpp | 2 +- cli/src/ConfigCommands.h | 2 +- cli/src/FeatureCommands.cpp | 2 +- cli/src/FeatureCommands.h | 2 +- cli/src/PluginCommands.cpp | 2 +- cli/src/PluginCommands.h | 2 +- cli/src/ServiceControlCommands.cpp | 2 +- cli/src/ServiceControlCommands.h | 2 +- cli/src/ShellCommands.cpp | 2 +- cli/src/ShellCommands.h | 2 +- cli/src/main.cpp | 2 +- cli/veyon-cli.rc.in | 2 +- cli/veyon-wcli.rc.in | 2 +- cmake/modules/BuildVeyonApplication.cmake | 2 +- cmake/modules/BuildVeyonFuzzer.cmake | 2 +- cmake/modules/BuildVeyonPlugin.cmake | 2 +- cmake/modules/CreateTranslations.cmake | 2 +- cmake/modules/FindLibVNCClient.cmake | 2 +- cmake/modules/FindLibVNCServer.cmake | 2 +- cmake/modules/FindQtTranslations.cmake | 2 +- configurator/src/AccessControlPage.cpp | 2 +- configurator/src/AccessControlPage.h | 2 +- configurator/src/AccessControlRuleEditDialog.cpp | 2 +- configurator/src/AccessControlRuleEditDialog.h | 2 +- configurator/src/AccessControlRuleListModel.cpp | 2 +- configurator/src/AccessControlRuleListModel.h | 2 +- configurator/src/AccessControlRulesTestDialog.cpp | 2 +- configurator/src/AccessControlRulesTestDialog.h | 2 +- configurator/src/AuthenticationPage.cpp | 2 +- configurator/src/AuthenticationPage.h | 2 +- configurator/src/AuthenticationPageTab.cpp | 2 +- configurator/src/AuthenticationPageTab.h | 2 +- configurator/src/GeneralConfigurationPage.cpp | 2 +- configurator/src/GeneralConfigurationPage.h | 2 +- configurator/src/MainWindow.cpp | 2 +- configurator/src/MainWindow.h | 2 +- configurator/src/MasterConfigurationPage.cpp | 2 +- configurator/src/MasterConfigurationPage.h | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPage.cpp | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPage.h | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPageTab.h | 2 +- configurator/src/ServiceConfigurationPage.cpp | 2 +- configurator/src/ServiceConfigurationPage.h | 2 +- configurator/src/main.cpp | 2 +- configurator/veyon-configurator.rc.in | 2 +- core/src/AboutDialog.cpp | 2 +- core/src/AboutDialog.h | 2 +- core/src/AboutDialog.ui | 2 +- core/src/AccessControlProvider.cpp | 2 +- core/src/AccessControlProvider.h | 2 +- core/src/AccessControlRule.cpp | 2 +- core/src/AccessControlRule.h | 2 +- core/src/AuthenticationCredentials.h | 2 +- core/src/AuthenticationManager.cpp | 2 +- core/src/AuthenticationManager.h | 2 +- core/src/AuthenticationPluginInterface.cpp | 2 +- core/src/AuthenticationPluginInterface.h | 2 +- core/src/BuiltinFeatures.cpp | 2 +- core/src/BuiltinFeatures.h | 2 +- core/src/CommandLineIO.cpp | 2 +- core/src/CommandLineIO.h | 2 +- core/src/CommandLinePluginInterface.h | 2 +- core/src/Computer.cpp | 2 +- core/src/Computer.h | 2 +- core/src/ComputerControlInterface.cpp | 2 +- core/src/ComputerControlInterface.h | 2 +- core/src/ComputerListModel.cpp | 2 +- core/src/ComputerListModel.h | 2 +- core/src/Configuration/JsonStore.cpp | 2 +- core/src/Configuration/JsonStore.h | 2 +- core/src/Configuration/LocalStore.cpp | 2 +- core/src/Configuration/LocalStore.h | 2 +- core/src/Configuration/Object.cpp | 2 +- core/src/Configuration/Object.h | 2 +- core/src/Configuration/Password.cpp | 2 +- core/src/Configuration/Password.h | 2 +- core/src/Configuration/Property.cpp | 2 +- core/src/Configuration/Property.h | 2 +- core/src/Configuration/Proxy.cpp | 2 +- core/src/Configuration/Proxy.h | 2 +- core/src/Configuration/Store.h | 2 +- core/src/Configuration/UiMapping.cpp | 2 +- core/src/Configuration/UiMapping.h | 2 +- core/src/ConfigurationManager.cpp | 2 +- core/src/ConfigurationManager.h | 2 +- core/src/ConfigurationPage.cpp | 2 +- core/src/ConfigurationPage.h | 2 +- core/src/ConfigurationPagePluginInterface.h | 2 +- core/src/CryptoCore.cpp | 2 +- core/src/CryptoCore.h | 2 +- core/src/DesktopAccessDialog.cpp | 2 +- core/src/DesktopAccessDialog.h | 2 +- core/src/EnumHelper.h | 2 +- core/src/Feature.h | 2 +- core/src/FeatureManager.cpp | 2 +- core/src/FeatureManager.h | 2 +- core/src/FeatureMessage.cpp | 2 +- core/src/FeatureMessage.h | 2 +- core/src/FeatureProviderInterface.h | 2 +- core/src/FeatureWorkerManager.cpp | 2 +- core/src/FeatureWorkerManager.h | 2 +- core/src/FileSystemBrowser.cpp | 2 +- core/src/FileSystemBrowser.h | 2 +- core/src/Filesystem.cpp | 2 +- core/src/Filesystem.h | 2 +- core/src/HashList.h | 2 +- core/src/HostAddress.cpp | 2 +- core/src/HostAddress.h | 2 +- core/src/KeyboardShortcutTrapper.h | 2 +- core/src/LockWidget.cpp | 2 +- core/src/LockWidget.h | 2 +- core/src/Lockable.h | 2 +- core/src/LockingPointer.h | 2 +- core/src/Logger.cpp | 2 +- core/src/Logger.h | 2 +- core/src/MessageContext.h | 2 +- core/src/MonitoringMode.cpp | 2 +- core/src/MonitoringMode.h | 2 +- core/src/NestedNetworkObjectDirectory.cpp | 2 +- core/src/NestedNetworkObjectDirectory.h | 2 +- core/src/NetworkObject.cpp | 2 +- core/src/NetworkObject.h | 2 +- core/src/NetworkObjectDirectory.cpp | 2 +- core/src/NetworkObjectDirectory.h | 2 +- core/src/NetworkObjectDirectoryManager.cpp | 2 +- core/src/NetworkObjectDirectoryManager.h | 2 +- core/src/NetworkObjectDirectoryPluginInterface.h | 2 +- core/src/NetworkObjectModel.h | 2 +- core/src/ObjectManager.h | 2 +- core/src/PlatformCoreFunctions.h | 2 +- core/src/PlatformFilesystemFunctions.h | 2 +- core/src/PlatformInputDeviceFunctions.h | 2 +- core/src/PlatformNetworkFunctions.h | 2 +- core/src/PlatformPluginInterface.h | 2 +- core/src/PlatformPluginManager.cpp | 2 +- core/src/PlatformPluginManager.h | 2 +- core/src/PlatformServiceFunctions.h | 2 +- core/src/PlatformSessionFunctions.h | 2 +- core/src/PlatformUserFunctions.h | 2 +- core/src/Plugin.h | 2 +- core/src/PluginInterface.h | 2 +- core/src/PluginManager.cpp | 2 +- core/src/PluginManager.h | 2 +- core/src/ProcessHelper.cpp | 2 +- core/src/ProcessHelper.h | 2 +- core/src/QmlCore.cpp | 2 +- core/src/QmlCore.h | 2 +- core/src/QtCompat.h | 2 +- core/src/RfbClientCallback.h | 2 +- core/src/Screenshot.cpp | 2 +- core/src/Screenshot.h | 2 +- core/src/ServiceControl.cpp | 2 +- core/src/ServiceControl.h | 2 +- core/src/SocketDevice.h | 2 +- core/src/SystemTrayIcon.cpp | 2 +- core/src/SystemTrayIcon.h | 2 +- core/src/ToolButton.cpp | 2 +- core/src/ToolButton.h | 2 +- core/src/TranslationLoader.cpp | 2 +- core/src/TranslationLoader.h | 2 +- core/src/UserGroupsBackendInterface.h | 2 +- core/src/UserGroupsBackendManager.cpp | 2 +- core/src/UserGroupsBackendManager.h | 2 +- core/src/VariantArrayMessage.cpp | 2 +- core/src/VariantArrayMessage.h | 2 +- core/src/VariantStream.cpp | 2 +- core/src/VariantStream.h | 2 +- core/src/VeyonConfiguration.cpp | 2 +- core/src/VeyonConfiguration.h | 2 +- core/src/VeyonConfigurationProperties.h | 2 +- core/src/VeyonConnection.cpp | 2 +- core/src/VeyonConnection.h | 2 +- core/src/VeyonCore.cpp | 2 +- core/src/VeyonCore.h | 2 +- core/src/VeyonMasterInterface.h | 2 +- core/src/VeyonServerInterface.h | 2 +- core/src/VeyonServiceControl.cpp | 2 +- core/src/VeyonServiceControl.h | 2 +- core/src/VeyonWorkerInterface.h | 2 +- core/src/VncClientProtocol.cpp | 2 +- core/src/VncClientProtocol.h | 2 +- core/src/VncConnection.cpp | 2 +- core/src/VncConnection.h | 2 +- core/src/VncConnectionConfiguration.h | 2 +- core/src/VncEvents.cpp | 2 +- core/src/VncEvents.h | 2 +- core/src/VncFeatureMessageEvent.cpp | 2 +- core/src/VncFeatureMessageEvent.h | 2 +- core/src/VncServerClient.h | 2 +- core/src/VncServerPluginInterface.h | 2 +- core/src/VncServerProtocol.cpp | 2 +- core/src/VncServerProtocol.h | 2 +- core/src/VncView.cpp | 2 +- core/src/VncView.h | 2 +- core/src/VncViewItem.cpp | 2 +- core/src/VncViewItem.h | 2 +- core/src/VncViewWidget.cpp | 2 +- core/src/VncViewWidget.h | 2 +- master/src/CheckableItemProxyModel.cpp | 2 +- master/src/CheckableItemProxyModel.h | 2 +- master/src/ComputerControlListModel.cpp | 2 +- master/src/ComputerControlListModel.h | 2 +- master/src/ComputerImageProvider.cpp | 2 +- master/src/ComputerImageProvider.h | 2 +- master/src/ComputerManager.cpp | 2 +- master/src/ComputerManager.h | 2 +- master/src/ComputerMonitoringItem.cpp | 2 +- master/src/ComputerMonitoringItem.h | 2 +- master/src/ComputerMonitoringModel.cpp | 2 +- master/src/ComputerMonitoringModel.h | 2 +- master/src/ComputerMonitoringView.cpp | 2 +- master/src/ComputerMonitoringView.h | 2 +- master/src/ComputerMonitoringWidget.cpp | 2 +- master/src/ComputerMonitoringWidget.h | 2 +- master/src/ComputerSelectModel.cpp | 2 +- master/src/ComputerSelectModel.h | 2 +- master/src/ComputerSelectPanel.cpp | 2 +- master/src/ComputerSelectPanel.h | 2 +- master/src/ComputerZoomWidget.cpp | 2 +- master/src/ComputerZoomWidget.h | 2 +- master/src/DocumentationFigureCreator.cpp | 2 +- master/src/DocumentationFigureCreator.h | 2 +- master/src/FeatureListModel.cpp | 2 +- master/src/FeatureListModel.h | 2 +- master/src/FlexibleListView.cpp | 2 +- master/src/FlexibleListView.h | 2 +- master/src/LocationDialog.cpp | 2 +- master/src/LocationDialog.h | 2 +- master/src/MainToolBar.cpp | 2 +- master/src/MainToolBar.h | 2 +- master/src/MainWindow.cpp | 2 +- master/src/MainWindow.h | 2 +- master/src/NetworkObjectFilterProxyModel.cpp | 2 +- master/src/NetworkObjectFilterProxyModel.h | 2 +- master/src/NetworkObjectOverlayDataModel.cpp | 2 +- master/src/NetworkObjectOverlayDataModel.h | 2 +- master/src/NetworkObjectTreeModel.cpp | 2 +- master/src/NetworkObjectTreeModel.h | 2 +- master/src/RecursiveFilterProxyModel.cpp | 2 +- master/src/RecursiveFilterProxyModel.h | 2 +- master/src/ScreenshotManagementPanel.cpp | 2 +- master/src/ScreenshotManagementPanel.h | 2 +- master/src/SlideshowModel.cpp | 2 +- master/src/SlideshowModel.h | 2 +- master/src/SlideshowPanel.cpp | 2 +- master/src/SlideshowPanel.h | 2 +- master/src/SpotlightModel.cpp | 2 +- master/src/SpotlightModel.h | 2 +- master/src/SpotlightPanel.cpp | 2 +- master/src/SpotlightPanel.h | 2 +- master/src/UserConfig.cpp | 2 +- master/src/UserConfig.h | 2 +- master/src/VeyonMaster.cpp | 2 +- master/src/VeyonMaster.h | 2 +- master/src/main.cpp | 2 +- master/veyon-master.rc.in | 2 +- nsis/veyon.nsi.in | 2 +- plugins/authkeys/AuthKeysConfiguration.h | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.cpp | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.h | 2 +- plugins/authkeys/AuthKeysManager.cpp | 2 +- plugins/authkeys/AuthKeysManager.h | 2 +- plugins/authkeys/AuthKeysPlugin.cpp | 2 +- plugins/authkeys/AuthKeysPlugin.h | 2 +- plugins/authkeys/AuthKeysTableModel.cpp | 2 +- plugins/authkeys/AuthKeysTableModel.h | 2 +- plugins/authlogon/AuthLogonDialog.cpp | 2 +- plugins/authlogon/AuthLogonDialog.h | 2 +- plugins/authlogon/AuthLogonPlugin.cpp | 2 +- plugins/authlogon/AuthLogonPlugin.h | 2 +- plugins/authsimple/AuthSimpleConfiguration.h | 2 +- plugins/authsimple/AuthSimpleDialog.cpp | 2 +- plugins/authsimple/AuthSimpleDialog.h | 2 +- plugins/authsimple/AuthSimplePlugin.cpp | 2 +- plugins/authsimple/AuthSimplePlugin.h | 2 +- plugins/builtindirectory/BuiltinDirectory.cpp | 2 +- plugins/builtindirectory/BuiltinDirectory.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfiguration.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.h | 2 +- plugins/demo/DemoAuthentication.cpp | 2 +- plugins/demo/DemoAuthentication.h | 2 +- plugins/demo/DemoClient.cpp | 2 +- plugins/demo/DemoClient.h | 2 +- plugins/demo/DemoConfiguration.h | 2 +- plugins/demo/DemoConfigurationPage.cpp | 2 +- plugins/demo/DemoConfigurationPage.h | 2 +- plugins/demo/DemoFeaturePlugin.cpp | 2 +- plugins/demo/DemoFeaturePlugin.h | 2 +- plugins/demo/DemoServer.cpp | 2 +- plugins/demo/DemoServer.h | 2 +- plugins/demo/DemoServerConnection.cpp | 2 +- plugins/demo/DemoServerConnection.h | 2 +- plugins/demo/DemoServerProtocol.cpp | 2 +- plugins/demo/DemoServerProtocol.h | 2 +- plugins/desktopservices/DesktopServiceObject.cpp | 2 +- plugins/desktopservices/DesktopServiceObject.h | 2 +- plugins/desktopservices/DesktopServicesConfiguration.h | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.cpp | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.h | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.cpp | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.h | 2 +- plugins/desktopservices/OpenWebsiteDialog.cpp | 2 +- plugins/desktopservices/OpenWebsiteDialog.h | 2 +- plugins/desktopservices/StartAppDialog.cpp | 2 +- plugins/desktopservices/StartAppDialog.h | 2 +- plugins/filetransfer/FileReadThread.cpp | 2 +- plugins/filetransfer/FileReadThread.h | 2 +- plugins/filetransfer/FileTransferConfiguration.h | 2 +- plugins/filetransfer/FileTransferConfigurationPage.cpp | 2 +- plugins/filetransfer/FileTransferConfigurationPage.h | 2 +- plugins/filetransfer/FileTransferController.cpp | 2 +- plugins/filetransfer/FileTransferController.h | 2 +- plugins/filetransfer/FileTransferDialog.cpp | 2 +- plugins/filetransfer/FileTransferDialog.h | 2 +- plugins/filetransfer/FileTransferListModel.cpp | 2 +- plugins/filetransfer/FileTransferListModel.h | 2 +- plugins/filetransfer/FileTransferPlugin.cpp | 2 +- plugins/filetransfer/FileTransferPlugin.h | 2 +- plugins/filetransfer/FileTransferUserConfiguration.h | 2 +- plugins/ldap/AuthLdapConfiguration.h | 2 +- plugins/ldap/AuthLdapConfigurationWidget.cpp | 2 +- plugins/ldap/AuthLdapConfigurationWidget.h | 2 +- plugins/ldap/AuthLdapCore.cpp | 2 +- plugins/ldap/AuthLdapCore.h | 2 +- plugins/ldap/AuthLdapDialog.cpp | 2 +- plugins/ldap/AuthLdapDialog.h | 2 +- plugins/ldap/LdapPlugin.cpp | 2 +- plugins/ldap/LdapPlugin.h | 2 +- plugins/ldap/common/LdapBrowseDialog.cpp | 2 +- plugins/ldap/common/LdapBrowseDialog.h | 2 +- plugins/ldap/common/LdapBrowseModel.cpp | 2 +- plugins/ldap/common/LdapBrowseModel.h | 2 +- plugins/ldap/common/LdapClient.cpp | 2 +- plugins/ldap/common/LdapClient.h | 2 +- plugins/ldap/common/LdapCommon.h | 2 +- plugins/ldap/common/LdapConfiguration.cpp | 2 +- plugins/ldap/common/LdapConfiguration.h | 2 +- plugins/ldap/common/LdapConfigurationPage.cpp | 2 +- plugins/ldap/common/LdapConfigurationPage.h | 2 +- plugins/ldap/common/LdapConfigurationTest.cpp | 2 +- plugins/ldap/common/LdapConfigurationTest.h | 2 +- plugins/ldap/common/LdapDirectory.cpp | 2 +- plugins/ldap/common/LdapDirectory.h | 2 +- plugins/ldap/common/LdapNetworkObjectDirectory.cpp | 2 +- plugins/ldap/common/LdapNetworkObjectDirectory.h | 2 +- .../ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp | 2 +- .../ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h | 2 +- plugins/ldap/kldap/KLdapIntegration.cpp | 2 +- plugins/ldap/kldap/kldap_export.h | 2 +- plugins/ldap/kldap/klocalizedstring.h | 2 +- plugins/ldap/kldap/ldap_debug.h | 2 +- plugins/platform/common/LogonHelper.cpp | 2 +- plugins/platform/common/LogonHelper.h | 2 +- plugins/platform/common/PersistentLogonCredentials.cpp | 2 +- plugins/platform/common/PersistentLogonCredentials.h | 2 +- plugins/platform/common/PlatformSessionManager.cpp | 2 +- plugins/platform/common/PlatformSessionManager.h | 2 +- plugins/platform/common/ServiceDataManager.cpp | 2 +- plugins/platform/common/ServiceDataManager.h | 2 +- plugins/platform/linux/LinuxCoreFunctions.cpp | 2 +- plugins/platform/linux/LinuxCoreFunctions.h | 2 +- plugins/platform/linux/LinuxDesktopIntegration.h | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.cpp | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.h | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.cpp | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.h | 2 +- plugins/platform/linux/LinuxKeyboardInput.cpp | 2 +- plugins/platform/linux/LinuxKeyboardInput.h | 2 +- plugins/platform/linux/LinuxKeyboardShortcutTrapper.h | 2 +- plugins/platform/linux/LinuxNetworkFunctions.cpp | 2 +- plugins/platform/linux/LinuxNetworkFunctions.h | 2 +- plugins/platform/linux/LinuxPlatformConfiguration.h | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.cpp | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.h | 2 +- plugins/platform/linux/LinuxPlatformPlugin.cpp | 2 +- plugins/platform/linux/LinuxPlatformPlugin.h | 2 +- plugins/platform/linux/LinuxServerProcess.cpp | 2 +- plugins/platform/linux/LinuxServerProcess.h | 2 +- plugins/platform/linux/LinuxServiceCore.cpp | 2 +- plugins/platform/linux/LinuxServiceCore.h | 2 +- plugins/platform/linux/LinuxServiceFunctions.cpp | 2 +- plugins/platform/linux/LinuxServiceFunctions.h | 2 +- plugins/platform/linux/LinuxSessionFunctions.cpp | 2 +- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- plugins/platform/linux/LinuxUserFunctions.cpp | 2 +- plugins/platform/linux/LinuxUserFunctions.h | 2 +- plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp | 2 +- plugins/platform/windows/DesktopInputController.cpp | 2 +- plugins/platform/windows/DesktopInputController.h | 2 +- plugins/platform/windows/SasEventListener.cpp | 2 +- plugins/platform/windows/SasEventListener.h | 2 +- plugins/platform/windows/WindowsCoreFunctions.cpp | 2 +- plugins/platform/windows/WindowsCoreFunctions.h | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.cpp | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.h | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.cpp | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.h | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.h | 2 +- plugins/platform/windows/WindowsNetworkFunctions.cpp | 2 +- plugins/platform/windows/WindowsNetworkFunctions.h | 2 +- plugins/platform/windows/WindowsPlatformConfiguration.h | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.cpp | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.h | 2 +- plugins/platform/windows/WindowsPlatformPlugin.cpp | 2 +- plugins/platform/windows/WindowsPlatformPlugin.h | 2 +- plugins/platform/windows/WindowsServiceControl.cpp | 2 +- plugins/platform/windows/WindowsServiceControl.h | 2 +- plugins/platform/windows/WindowsServiceCore.cpp | 2 +- plugins/platform/windows/WindowsServiceCore.h | 2 +- plugins/platform/windows/WindowsServiceFunctions.cpp | 2 +- plugins/platform/windows/WindowsServiceFunctions.h | 2 +- plugins/platform/windows/WindowsSessionFunctions.cpp | 2 +- plugins/platform/windows/WindowsSessionFunctions.h | 2 +- plugins/platform/windows/WindowsUserFunctions.cpp | 2 +- plugins/platform/windows/WindowsUserFunctions.h | 2 +- plugins/platform/windows/WtsSessionManager.cpp | 2 +- plugins/platform/windows/WtsSessionManager.h | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.cpp | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.h | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.cpp | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.h | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.h | 2 +- plugins/remoteaccess/RemoteAccessPage.cpp | 2 +- plugins/remoteaccess/RemoteAccessPage.h | 2 +- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- plugins/remoteaccess/RemoteAccessWidget.h | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.cpp | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.cpp | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotListModel.cpp | 2 +- plugins/screenshot/ScreenshotListModel.h | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.cpp | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.h | 2 +- plugins/testing/TestingCommandLinePlugin.cpp | 2 +- plugins/testing/TestingCommandLinePlugin.h | 2 +- plugins/textmessage/TextMessageDialog.cpp | 2 +- plugins/textmessage/TextMessageDialog.h | 2 +- plugins/textmessage/TextMessageFeaturePlugin.cpp | 2 +- plugins/textmessage/TextMessageFeaturePlugin.h | 2 +- plugins/usersessioncontrol/UserLoginDialog.cpp | 2 +- plugins/usersessioncontrol/UserLoginDialog.h | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.cpp | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.h | 2 +- plugins/vncserver/external/ExternalVncServer.cpp | 2 +- plugins/vncserver/external/ExternalVncServer.h | 2 +- plugins/vncserver/external/ExternalVncServerConfiguration.h | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.cpp | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.h | 2 +- plugins/vncserver/headless/HeadlessVncConfiguration.h | 2 +- plugins/vncserver/headless/HeadlessVncServer.cpp | 2 +- plugins/vncserver/headless/HeadlessVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h | 2 +- plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h | 2 +- plugins/vncserver/ultravnc-builtin/vncntlm.cpp | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h | 2 +- project.yml | 2 +- server/src/ComputerControlClient.cpp | 2 +- server/src/ComputerControlClient.h | 2 +- server/src/ComputerControlServer.cpp | 2 +- server/src/ComputerControlServer.h | 2 +- server/src/ServerAccessControlManager.cpp | 2 +- server/src/ServerAccessControlManager.h | 2 +- server/src/ServerAuthenticationManager.cpp | 2 +- server/src/ServerAuthenticationManager.h | 2 +- server/src/TlsServer.cpp | 2 +- server/src/TlsServer.h | 2 +- server/src/VeyonServerProtocol.cpp | 2 +- server/src/VeyonServerProtocol.h | 2 +- server/src/VncProxyConnection.cpp | 2 +- server/src/VncProxyConnection.h | 2 +- server/src/VncProxyConnectionFactory.h | 2 +- server/src/VncProxyServer.cpp | 2 +- server/src/VncProxyServer.h | 2 +- server/src/VncServer.cpp | 2 +- server/src/VncServer.h | 2 +- server/src/main.cpp | 2 +- server/veyon-server.rc.in | 2 +- service/src/main.cpp | 2 +- service/veyon-service.rc.in | 2 +- worker/src/FeatureWorkerManagerConnection.cpp | 2 +- worker/src/FeatureWorkerManagerConnection.h | 2 +- worker/src/VeyonWorker.cpp | 2 +- worker/src/VeyonWorker.h | 2 +- worker/src/main.cpp | 2 +- worker/veyon-worker.rc.in | 2 +- 502 files changed, 502 insertions(+), 502 deletions(-) diff --git a/README.md b/README.md index db130269c..c6e3267e3 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The following features are available in Veyon: ## License -Copyright (c) 2004-2021 Tobias Junghans / Veyon Solutions. +Copyright (c) 2004-2022 Tobias Junghans / Veyon Solutions. See the file COPYING for the GNU GENERAL PUBLIC LICENSE. diff --git a/cli/src/ConfigCommands.cpp b/cli/src/ConfigCommands.cpp index f687e664c..1ade55f73 100644 --- a/cli/src/ConfigCommands.cpp +++ b/cli/src/ConfigCommands.cpp @@ -1,7 +1,7 @@ /* * ConfigCommands.cpp - implementation of ConfigCommands class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ConfigCommands.h b/cli/src/ConfigCommands.h index 410d58cb4..395f8de5c 100644 --- a/cli/src/ConfigCommands.h +++ b/cli/src/ConfigCommands.h @@ -1,7 +1,7 @@ /* * ConfigCommands.h - declaration of ConfigCommands class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index 853b37b1b..81e57c740 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -1,7 +1,7 @@ /* * FeatureCommands.cpp - implementation of FeatureCommands class * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/FeatureCommands.h b/cli/src/FeatureCommands.h index e72c1b4f3..4e399ac5d 100644 --- a/cli/src/FeatureCommands.h +++ b/cli/src/FeatureCommands.h @@ -1,7 +1,7 @@ /* * FeatureCommands.h - declaration of FeatureCommands class * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginCommands.cpp b/cli/src/PluginCommands.cpp index b3d2e4963..951787886 100644 --- a/cli/src/PluginCommands.cpp +++ b/cli/src/PluginCommands.cpp @@ -1,7 +1,7 @@ /* * PluginsCommands.cpp - implementation of PluginsCommands class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginCommands.h b/cli/src/PluginCommands.h index 71ce5ed33..fe74307cc 100644 --- a/cli/src/PluginCommands.h +++ b/cli/src/PluginCommands.h @@ -1,7 +1,7 @@ /* * PluginsCommands.h - declaration of PluginsCommands class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ServiceControlCommands.cpp b/cli/src/ServiceControlCommands.cpp index 6cdc32564..9e57d6640 100644 --- a/cli/src/ServiceControlCommands.cpp +++ b/cli/src/ServiceControlCommands.cpp @@ -1,7 +1,7 @@ /* * ServiceControlCommands.cpp - implementation of ServiceControlCommands class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ServiceControlCommands.h b/cli/src/ServiceControlCommands.h index ff5f03319..002465f14 100644 --- a/cli/src/ServiceControlCommands.h +++ b/cli/src/ServiceControlCommands.h @@ -1,7 +1,7 @@ /* * ServiceControlCommands.h - declaration of ServiceControlCommands class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ShellCommands.cpp b/cli/src/ShellCommands.cpp index ca02170d5..83889fbef 100644 --- a/cli/src/ShellCommands.cpp +++ b/cli/src/ShellCommands.cpp @@ -1,7 +1,7 @@ /* * ShellCommands.cpp - implementation of ShellCommands class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ShellCommands.h b/cli/src/ShellCommands.h index 3f091a1f2..d3095cdbd 100644 --- a/cli/src/ShellCommands.h +++ b/cli/src/ShellCommands.h @@ -1,7 +1,7 @@ /* * ShellCommands.h - declaration of ShellCommands class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/main.cpp b/cli/src/main.cpp index 80adea022..1fb143dd7 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon CLI * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/veyon-cli.rc.in b/cli/veyon-cli.rc.in index b8bc9bc06..b76f34d1d 100644 --- a/cli/veyon-cli.rc.in +++ b/cli/veyon-cli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-cli.exe\0" END END diff --git a/cli/veyon-wcli.rc.in b/cli/veyon-wcli.rc.in index c3e45a3b8..522a3074e 100644 --- a/cli/veyon-wcli.rc.in +++ b/cli/veyon-wcli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (non-console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-wcli.exe\0" END END diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index 5a3908bc8..ba9b23653 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -1,4 +1,4 @@ -# BuildVeyonApplication.cmake - Copyright (c) 2019-2021 Tobias Junghans +# BuildVeyonApplication.cmake - Copyright (c) 2019-2022 Tobias Junghans # # description: build Veyon application # usage: build_veyon_application( ) diff --git a/cmake/modules/BuildVeyonFuzzer.cmake b/cmake/modules/BuildVeyonFuzzer.cmake index 3fdc029f4..efd4418bf 100644 --- a/cmake/modules/BuildVeyonFuzzer.cmake +++ b/cmake/modules/BuildVeyonFuzzer.cmake @@ -1,4 +1,4 @@ -# BuildVeyonFuzzer.cmake - Copyright (c) 2021 Tobias Junghans +# BuildVeyonFuzzer.cmake - Copyright (c) 2021-2022 Tobias Junghans # # description: build fuzzer test for Veyon component # usage: build_veyon_fuzzer( ) diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index 24df122f1..79ca00b69 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -1,4 +1,4 @@ -# BuildVeyonPlugin.cmake - Copyright (c) 2017-2021 Tobias Junghans +# BuildVeyonPlugin.cmake - Copyright (c) 2017-2022 Tobias Junghans # # description: build Veyon plugin # usage: build_veyon_plugin( ) diff --git a/cmake/modules/CreateTranslations.cmake b/cmake/modules/CreateTranslations.cmake index 023a32c55..e8f4ab52a 100644 --- a/cmake/modules/CreateTranslations.cmake +++ b/cmake/modules/CreateTranslations.cmake @@ -1,4 +1,4 @@ -# CreateTranslations.cmake - Copyright (c) 2020-2021 Tobias Junghans +# CreateTranslations.cmake - Copyright (c) 2020-2022 Tobias Junghans # # description: create Qt translation files # usage: create_translations( ) diff --git a/cmake/modules/FindLibVNCClient.cmake b/cmake/modules/FindLibVNCClient.cmake index 195d8ad7d..6f7b44182 100644 --- a/cmake/modules/FindLibVNCClient.cmake +++ b/cmake/modules/FindLibVNCClient.cmake @@ -23,7 +23,7 @@ # The LibVNCClient library #============================================================================= -# SPDX-FileCopyrightText: 2020-2021 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2022 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/cmake/modules/FindLibVNCServer.cmake b/cmake/modules/FindLibVNCServer.cmake index dfe21df37..07932097a 100644 --- a/cmake/modules/FindLibVNCServer.cmake +++ b/cmake/modules/FindLibVNCServer.cmake @@ -23,7 +23,7 @@ # The LibVNCServer library #============================================================================= -# SPDX-FileCopyrightText: 2020-2021 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2022 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/cmake/modules/FindQtTranslations.cmake b/cmake/modules/FindQtTranslations.cmake index 00c8055c7..7f39c1bc0 100644 --- a/cmake/modules/FindQtTranslations.cmake +++ b/cmake/modules/FindQtTranslations.cmake @@ -1,4 +1,4 @@ -# FindQtTranslations.cmake - Copyright (c) 2020-2021 Tobias Junghans +# FindQtTranslations.cmake - Copyright (c) 2020-2022 Tobias Junghans # # description: find translation files of Qt and prepare them for Windows build # usage: find_qt_translations() diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index eaae19447..9d0d558e2 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -1,7 +1,7 @@ /* * AccessControlPage.cpp - implementation of the access control page * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlPage.h b/configurator/src/AccessControlPage.h index dd8bd165a..024ff7d52 100644 --- a/configurator/src/AccessControlPage.h +++ b/configurator/src/AccessControlPage.h @@ -1,7 +1,7 @@ /* * AccessControlPage.h - header for the AccessControlPage class * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index a8d8b853b..4928bc3ee 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.cpp - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.h b/configurator/src/AccessControlRuleEditDialog.h index 7450538a7..4d08b812f 100644 --- a/configurator/src/AccessControlRuleEditDialog.h +++ b/configurator/src/AccessControlRuleEditDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.h - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.cpp b/configurator/src/AccessControlRuleListModel.cpp index 6bd950e86..05ab6b193 100644 --- a/configurator/src/AccessControlRuleListModel.cpp +++ b/configurator/src/AccessControlRuleListModel.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.cpp - data model for access control rules * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.h b/configurator/src/AccessControlRuleListModel.h index 3e02d23d7..24dfa5cc9 100644 --- a/configurator/src/AccessControlRuleListModel.h +++ b/configurator/src/AccessControlRuleListModel.h @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.h - data model for access control rules * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index 37bc14263..6bf3dfe08 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.cpp - dialog for testing access control rules * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.h b/configurator/src/AccessControlRulesTestDialog.h index 6ea418727..6c70b693b 100644 --- a/configurator/src/AccessControlRulesTestDialog.h +++ b/configurator/src/AccessControlRulesTestDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.h - dialog for testing access control rules * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.cpp b/configurator/src/AuthenticationPage.cpp index e9b3e62bf..80ec9dc38 100644 --- a/configurator/src/AuthenticationPage.cpp +++ b/configurator/src/AuthenticationPage.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPage.cpp - implementation of the AuthenticationPage class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.h b/configurator/src/AuthenticationPage.h index 69e2d2a75..c5e1ca182 100644 --- a/configurator/src/AuthenticationPage.h +++ b/configurator/src/AuthenticationPage.h @@ -1,7 +1,7 @@ /* * AuthenticationPage.h - header for the AuthenticationPage class * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.cpp b/configurator/src/AuthenticationPageTab.cpp index eb3042521..4d48bce16 100644 --- a/configurator/src/AuthenticationPageTab.cpp +++ b/configurator/src/AuthenticationPageTab.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.cpp - implementation of the AuthenticationPageTab class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.h b/configurator/src/AuthenticationPageTab.h index eb64509b9..ed4eba70d 100644 --- a/configurator/src/AuthenticationPageTab.h +++ b/configurator/src/AuthenticationPageTab.h @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.h - header for the AuthenticationPageTab class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index e632f342e..afff384d0 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.cpp - configuration page with general settings * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.h b/configurator/src/GeneralConfigurationPage.h index e2a6fba1b..836fdb5e7 100644 --- a/configurator/src/GeneralConfigurationPage.h +++ b/configurator/src/GeneralConfigurationPage.h @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.h - configuration page with general settings * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index 5a8e69444..5bcf2b181 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.h b/configurator/src/MainWindow.h index 0ba2db256..491833f9c 100644 --- a/configurator/src/MainWindow.h +++ b/configurator/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of the Veyon Configurator * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index d1c992943..99f395e94 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.cpp - page for configuring master application * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.h b/configurator/src/MasterConfigurationPage.h index 729bd53a3..ee7ad5f30 100644 --- a/configurator/src/MasterConfigurationPage.h +++ b/configurator/src/MasterConfigurationPage.h @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.h - header for the MasterConfigurationPage class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp index ed4aded8c..2ae076cd5 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPage.cpp - implementation of the NetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.h b/configurator/src/NetworkObjectDirectoryConfigurationPage.h index 5c09f8f9b..30a476bb4 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.h +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPage.h - header for the NetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp index be0bd6be1..ea6c9993b 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPageTab.cpp - implementation of the NetworkObjectDirectoryConfigurationPageTab class * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h index e3e706ceb..d06e00076 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPageTab.h - header for the NetworkObjectDirectoryConfigurationPageTab class * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index 5d01269fe..d8d83321c 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.h b/configurator/src/ServiceConfigurationPage.h index 578d12a45..e907b73be 100644 --- a/configurator/src/ServiceConfigurationPage.h +++ b/configurator/src/ServiceConfigurationPage.h @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.h - header for the ServiceConfigurationPage class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/main.cpp b/configurator/src/main.cpp index e90d40954..d67d9c4ff 100644 --- a/configurator/src/main.cpp +++ b/configurator/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Configurator * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/veyon-configurator.rc.in b/configurator/veyon-configurator.rc.in index ae6df6c6a..5bcb4039b 100644 --- a/configurator/veyon-configurator.rc.in +++ b/configurator/veyon-configurator.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Configurator\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-configurator.exe\0" END END diff --git a/core/src/AboutDialog.cpp b/core/src/AboutDialog.cpp index fe3f8ae3b..58492814e 100644 --- a/core/src/AboutDialog.cpp +++ b/core/src/AboutDialog.cpp @@ -1,7 +1,7 @@ /* * AboutDialog.cpp - implementation of AboutDialog * - * Copyright (c) 2011-2021 Tobias Junghans + * Copyright (c) 2011-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.h b/core/src/AboutDialog.h index 192556196..e8386054c 100644 --- a/core/src/AboutDialog.h +++ b/core/src/AboutDialog.h @@ -1,7 +1,7 @@ /* * AboutDialog.h - declaration of AboutDialog class * - * Copyright (c) 2011-2021 Tobias Junghans + * Copyright (c) 2011-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.ui b/core/src/AboutDialog.ui index 9209d8048..9884a21d2 100644 --- a/core/src/AboutDialog.ui +++ b/core/src/AboutDialog.ui @@ -149,7 +149,7 @@ - Copyright © 2004-2021 Tobias Junghans / Veyon Solutions + Copyright © 2004-2022 Tobias Junghans / Veyon Solutions diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index e4ae51b63..aae68a758 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -1,7 +1,7 @@ /* * AccessControlProvider.cpp - implementation of the AccessControlProvider class * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index 9c0e4f3d8..e3b437a06 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -1,7 +1,7 @@ /* * AccessControlProvider.h - declaration of class AccessControlProvider * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.cpp b/core/src/AccessControlRule.cpp index 9909bd4da..0551cde39 100644 --- a/core/src/AccessControlRule.cpp +++ b/core/src/AccessControlRule.cpp @@ -1,7 +1,7 @@ /* * AccessControlRule.cpp - implementation of the AccessControlRule class * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index ccbf3df91..bf093a235 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -1,7 +1,7 @@ /* * AccessControlRule.h - declaration of class AccessControlRule * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationCredentials.h b/core/src/AuthenticationCredentials.h index 15f025fcb..93d0166e4 100644 --- a/core/src/AuthenticationCredentials.h +++ b/core/src/AuthenticationCredentials.h @@ -1,7 +1,7 @@ /* * AuthenticationCredentials.h - class holding credentials for authentication * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.cpp b/core/src/AuthenticationManager.cpp index 214905120..644b79cc3 100644 --- a/core/src/AuthenticationManager.cpp +++ b/core/src/AuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * AuthenticationManager.cpp - implementation of AuthenticationManager * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.h b/core/src/AuthenticationManager.h index 2e8da274f..dd0f2d515 100644 --- a/core/src/AuthenticationManager.h +++ b/core/src/AuthenticationManager.h @@ -1,7 +1,7 @@ /* * AuthenticationManager.h - header file for AuthenticationManager * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.cpp b/core/src/AuthenticationPluginInterface.cpp index ce59516fc..c6bd25440 100644 --- a/core/src/AuthenticationPluginInterface.cpp +++ b/core/src/AuthenticationPluginInterface.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.cpp - interface class for authentication plugins * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.h b/core/src/AuthenticationPluginInterface.h index c4831ce1a..823f0d2f8 100644 --- a/core/src/AuthenticationPluginInterface.h +++ b/core/src/AuthenticationPluginInterface.h @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.h - interface class for authentication plugins * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.cpp b/core/src/BuiltinFeatures.cpp index b4ced372c..bdce34326 100644 --- a/core/src/BuiltinFeatures.cpp +++ b/core/src/BuiltinFeatures.cpp @@ -1,7 +1,7 @@ /* * BuiltinFeatures.cpp - implementation of BuiltinFeatures class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.h b/core/src/BuiltinFeatures.h index b1ee966dc..d10d23231 100644 --- a/core/src/BuiltinFeatures.h +++ b/core/src/BuiltinFeatures.h @@ -1,7 +1,7 @@ /* * BuiltinFeatures.h - declaration of BuiltinFeatures class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.cpp b/core/src/CommandLineIO.cpp index 409bba2c0..2ea2ad1ea 100644 --- a/core/src/CommandLineIO.cpp +++ b/core/src/CommandLineIO.cpp @@ -1,7 +1,7 @@ /* * CommandLineIO.cpp - text input/output for command line plugins * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.h b/core/src/CommandLineIO.h index 9586940ae..cd314a002 100644 --- a/core/src/CommandLineIO.h +++ b/core/src/CommandLineIO.h @@ -1,7 +1,7 @@ /* * CommandLineIO.h - text input/output for command line plugins * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLinePluginInterface.h b/core/src/CommandLinePluginInterface.h index 7e13ec5f0..1413398df 100644 --- a/core/src/CommandLinePluginInterface.h +++ b/core/src/CommandLinePluginInterface.h @@ -1,7 +1,7 @@ /* * CommandLinePluginInterface.h - interface class for command line plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.cpp b/core/src/Computer.cpp index 9079d1215..9111388d2 100644 --- a/core/src/Computer.cpp +++ b/core/src/Computer.cpp @@ -1,7 +1,7 @@ /* * Computer.cpp - represents a computer and provides control methods and data * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.h b/core/src/Computer.h index bda6dded2..6144dad24 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -1,7 +1,7 @@ /* * Computer.h - represents a computer and provides control methods and data * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index ac12dffab..f6445382e 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -1,7 +1,7 @@ /* * ComputerControlInterface.cpp - interface class for controlling a computer * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 3fa122c83..ad8af677b 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -1,7 +1,7 @@ /* * ComputerControlInterface.h - interface class for controlling a computer * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.cpp b/core/src/ComputerListModel.cpp index 323c1a55b..3ff373165 100644 --- a/core/src/ComputerListModel.cpp +++ b/core/src/ComputerListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerListModel.cpp - data model base class for computer objects * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index 323293fba..bbbf56388 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -1,7 +1,7 @@ /* * ComputerListModel.h - data model base class for computer objects * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.cpp b/core/src/Configuration/JsonStore.cpp index a06778f23..4abba98fa 100644 --- a/core/src/Configuration/JsonStore.cpp +++ b/core/src/Configuration/JsonStore.cpp @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.cpp - implementation of JsonStore * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.h b/core/src/Configuration/JsonStore.h index afb453298..3d152687a 100644 --- a/core/src/Configuration/JsonStore.h +++ b/core/src/Configuration/JsonStore.h @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.h - JsonStore class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index f8b4e44bb..4b3f16fe0 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -1,7 +1,7 @@ /* * ConfigurationLocalStore.cpp - implementation of LocalStore * - * Copyright (c) 2009-2021 Tobias Junghans + * Copyright (c) 2009-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.h b/core/src/Configuration/LocalStore.h index d411e6c9d..d1d67cd7e 100644 --- a/core/src/Configuration/LocalStore.h +++ b/core/src/Configuration/LocalStore.h @@ -1,7 +1,7 @@ /* * Configuration/LocalStore.h - LocalStore class * - * Copyright (c) 2009-2021 Tobias Junghans + * Copyright (c) 2009-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.cpp b/core/src/Configuration/Object.cpp index 61f798704..e684c135b 100644 --- a/core/src/Configuration/Object.cpp +++ b/core/src/Configuration/Object.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2021 Tobias Junghans + * Copyright (c) 2009-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.h b/core/src/Configuration/Object.h index 923288cca..d7b3960fb 100644 --- a/core/src/Configuration/Object.h +++ b/core/src/Configuration/Object.h @@ -1,7 +1,7 @@ /* * Configuration/Object.h - ConfigurationObject class * - * Copyright (c) 2009-2021 Tobias Junghans + * Copyright (c) 2009-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.cpp b/core/src/Configuration/Password.cpp index 599ed34fd..9c90db892 100644 --- a/core/src/Configuration/Password.cpp +++ b/core/src/Configuration/Password.cpp @@ -1,7 +1,7 @@ /* * Password.cpp - implementation of Configuration::Password * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.h b/core/src/Configuration/Password.h index 34a2575df..e571b39ba 100644 --- a/core/src/Configuration/Password.h +++ b/core/src/Configuration/Password.h @@ -1,7 +1,7 @@ /* * Configuration/Password.h - Configuration::Password class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index a5787feca..750095bb3 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2021 Tobias Junghans + * Copyright (c) 2009-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.h b/core/src/Configuration/Property.h index 2d49130e7..58acf80a4 100644 --- a/core/src/Configuration/Property.h +++ b/core/src/Configuration/Property.h @@ -1,7 +1,7 @@ /* * Configuration/Property.h - Configuration::Property class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.cpp b/core/src/Configuration/Proxy.cpp index 5446f9845..de5c88c45 100644 --- a/core/src/Configuration/Proxy.cpp +++ b/core/src/Configuration/Proxy.cpp @@ -1,7 +1,7 @@ /* * Proxy.cpp - implementation of Configuration::Proxy * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.h b/core/src/Configuration/Proxy.h index 8de9431e6..f0e151916 100644 --- a/core/src/Configuration/Proxy.h +++ b/core/src/Configuration/Proxy.h @@ -1,7 +1,7 @@ /* * Configuration/Proxy.h - ConfigurationProxy class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Store.h b/core/src/Configuration/Store.h index cb96dbe4c..6c8353cad 100644 --- a/core/src/Configuration/Store.h +++ b/core/src/Configuration/Store.h @@ -1,7 +1,7 @@ /* * Configuration/Store.h - ConfigurationStore class * - * Copyright (c) 2009-2021 Tobias Junghans + * Copyright (c) 2009-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.cpp b/core/src/Configuration/UiMapping.cpp index 4c3e307ce..36b6e4650 100644 --- a/core/src/Configuration/UiMapping.cpp +++ b/core/src/Configuration/UiMapping.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2021 Tobias Junghans + * Copyright (c) 2009-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.h b/core/src/Configuration/UiMapping.h index 3285e1ab5..b88cf9b23 100644 --- a/core/src/Configuration/UiMapping.h +++ b/core/src/Configuration/UiMapping.h @@ -1,7 +1,7 @@ /* * Configuration/UiMapping.h - helper macros and functions for connecting config with UI * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.cpp b/core/src/ConfigurationManager.cpp index 89a5901d2..5a88c2d65 100644 --- a/core/src/ConfigurationManager.cpp +++ b/core/src/ConfigurationManager.cpp @@ -1,7 +1,7 @@ /* * ConfigurationManager.cpp - class for managing Veyon's configuration * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.h b/core/src/ConfigurationManager.h index c8d817ba6..1625b6d17 100644 --- a/core/src/ConfigurationManager.h +++ b/core/src/ConfigurationManager.h @@ -1,7 +1,7 @@ /* * ConfigurationManager.h - class for managing Veyon's configuration * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.cpp b/core/src/ConfigurationPage.cpp index d5dfba408..1d3186453 100644 --- a/core/src/ConfigurationPage.cpp +++ b/core/src/ConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ConfigurationPage.cpp - implementation of configuration page base class * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.h b/core/src/ConfigurationPage.h index 3e4d95ac0..96cf830e7 100644 --- a/core/src/ConfigurationPage.h +++ b/core/src/ConfigurationPage.h @@ -1,7 +1,7 @@ /* * ConfigurationPage.h - base class for all configuration pages * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPagePluginInterface.h b/core/src/ConfigurationPagePluginInterface.h index 770289850..588417c9b 100644 --- a/core/src/ConfigurationPagePluginInterface.h +++ b/core/src/ConfigurationPagePluginInterface.h @@ -1,7 +1,7 @@ /* * ConfigurationPagePluginInterface.h - interface class for configuration pages * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index 5d4099d49..0095dedd8 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -1,7 +1,7 @@ /* * CryptoCore.cpp - core functions for crypto features * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.h b/core/src/CryptoCore.h index a4b8419e1..da2b1ecf3 100644 --- a/core/src/CryptoCore.h +++ b/core/src/CryptoCore.h @@ -1,7 +1,7 @@ /* * CryptoCore.h - core functions for crypto features * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index 1bdb6d1c3..dede1e87e 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.cpp - implementation of DesktopAccessDialog class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.h b/core/src/DesktopAccessDialog.h index ff5cd548d..f72150a23 100644 --- a/core/src/DesktopAccessDialog.h +++ b/core/src/DesktopAccessDialog.h @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.h - declaration of DesktopAccessDialog class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/EnumHelper.h b/core/src/EnumHelper.h index fa50949a9..5e7dc19d5 100644 --- a/core/src/EnumHelper.h +++ b/core/src/EnumHelper.h @@ -1,7 +1,7 @@ /* * EnumHelper.h - helper functions for enumerations * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Feature.h b/core/src/Feature.h index 91859ea08..e8a848e7a 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -1,7 +1,7 @@ /* * Feature.h - declaration of the Feature class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index f988d8cc9..064899a83 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -1,7 +1,7 @@ /* * FeatureManager.cpp - implementation of the FeatureManager class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index 26d634e1f..a77583b3a 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -1,7 +1,7 @@ /* * FeatureManager.h - header for the FeatureManager class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.cpp b/core/src/FeatureMessage.cpp index 04d780a84..6aa87298d 100644 --- a/core/src/FeatureMessage.cpp +++ b/core/src/FeatureMessage.cpp @@ -1,7 +1,7 @@ /* * FeatureMessage.cpp - implementation of a message encapsulation class for features * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.h b/core/src/FeatureMessage.h index 72bd6e6b9..95c1f265e 100644 --- a/core/src/FeatureMessage.h +++ b/core/src/FeatureMessage.h @@ -1,7 +1,7 @@ /* * FeatureMessage.h - header for a message encapsulation class for features * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index a08019807..18bb36c25 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -1,7 +1,7 @@ /* * FeatureProviderInterface.h - interface class for feature plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index fa143371a..32ad9958c 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.cpp - class for managing feature worker instances * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.h b/core/src/FeatureWorkerManager.h index 8236f85ba..8a787f3d5 100644 --- a/core/src/FeatureWorkerManager.h +++ b/core/src/FeatureWorkerManager.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.h - class for managing feature worker instances * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.cpp b/core/src/FileSystemBrowser.cpp index c6cdda1a0..101aea0d9 100644 --- a/core/src/FileSystemBrowser.cpp +++ b/core/src/FileSystemBrowser.cpp @@ -1,7 +1,7 @@ /* * FileSystemBrowser.cpp - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.h b/core/src/FileSystemBrowser.h index be4625890..1174cbd00 100644 --- a/core/src/FileSystemBrowser.h +++ b/core/src/FileSystemBrowser.h @@ -1,7 +1,7 @@ /* * FileSystemBrowser.h - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index 66769f261..fbe1b6df1 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -1,7 +1,7 @@ /* * Filesystem.cpp - filesystem related query and manipulation functions * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.h b/core/src/Filesystem.h index df54fe2df..26e191789 100644 --- a/core/src/Filesystem.h +++ b/core/src/Filesystem.h @@ -1,7 +1,7 @@ /* * Filesystem.h - filesystem related query and manipulation functions * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HashList.h b/core/src/HashList.h index f8af96f22..a7f78e0b9 100644 --- a/core/src/HashList.h +++ b/core/src/HashList.h @@ -1,7 +1,7 @@ /* * HashList.h - extended QHash acting like a list * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index 79d4d85f5..4bb8ff073 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -1,7 +1,7 @@ /* * HostAddress.cpp - implementation of HostAddress class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.h b/core/src/HostAddress.h index c782977db..0ee5fbfa1 100644 --- a/core/src/HostAddress.h +++ b/core/src/HostAddress.h @@ -1,7 +1,7 @@ /* * HostAddress.h - header for HostAddress class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/KeyboardShortcutTrapper.h b/core/src/KeyboardShortcutTrapper.h index f4d972272..0ae7d4e8e 100644 --- a/core/src/KeyboardShortcutTrapper.h +++ b/core/src/KeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * KeyboardShortcutTrapper.h - class for trapping system-wide keyboard shortcuts * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index ca5020e98..8818ab98c 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -1,7 +1,7 @@ /* * LockWidget.cpp - widget for locking a client * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.h b/core/src/LockWidget.h index 2b88b74b2..3c8a5e941 100644 --- a/core/src/LockWidget.h +++ b/core/src/LockWidget.h @@ -1,7 +1,7 @@ /* * LockWidget.h - widget for locking a client * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Lockable.h b/core/src/Lockable.h index b2156d83f..e91340f1e 100644 --- a/core/src/Lockable.h +++ b/core/src/Lockable.h @@ -1,7 +1,7 @@ /* * Lockable.h - header file for Lockable * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockingPointer.h b/core/src/LockingPointer.h index 8def73c2d..68e655cc1 100644 --- a/core/src/LockingPointer.h +++ b/core/src/LockingPointer.h @@ -1,7 +1,7 @@ /* * LockingPointer.h - smart pointer for lockables * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.cpp b/core/src/Logger.cpp index 162504286..62c3d0702 100644 --- a/core/src/Logger.cpp +++ b/core/src/Logger.cpp @@ -1,7 +1,7 @@ /* * Logger.cpp - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.h b/core/src/Logger.h index a7ca82f1a..f55048b83 100644 --- a/core/src/Logger.h +++ b/core/src/Logger.h @@ -1,7 +1,7 @@ /* * Logger.h - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MessageContext.h b/core/src/MessageContext.h index a786804a0..35f181c25 100644 --- a/core/src/MessageContext.h +++ b/core/src/MessageContext.h @@ -1,7 +1,7 @@ /* * MessageContext.h - header for transporting context for message I/O * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 9d7522f72..69facea10 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -1,7 +1,7 @@ /* * MonitoringMode.cpp - implementation of MonitoringMode class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index fb31a17e9..0fe5acb02 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -1,7 +1,7 @@ /* * MonitoringMode.h - header for the MonitoringMode class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NestedNetworkObjectDirectory.cpp b/core/src/NestedNetworkObjectDirectory.cpp index fcf518844..3fb4a1e33 100644 --- a/core/src/NestedNetworkObjectDirectory.cpp +++ b/core/src/NestedNetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * NestedNetworkObjectDirectory.cpp - implementation of NestedNetworkObjectDirectory * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NestedNetworkObjectDirectory.h b/core/src/NestedNetworkObjectDirectory.h index 73bf9f0b5..a3e7ea395 100644 --- a/core/src/NestedNetworkObjectDirectory.h +++ b/core/src/NestedNetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * NestedNetworkObjectDirectory.cpp - header file for NestedNetworkObjectDirectory * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.cpp b/core/src/NetworkObject.cpp index 33b159e6c..59fff8c8f 100644 --- a/core/src/NetworkObject.cpp +++ b/core/src/NetworkObject.cpp @@ -1,7 +1,7 @@ /* * NetworkObject.cpp - data class representing a network object * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index d66bbe3e4..f6a14ad0b 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -1,7 +1,7 @@ /* * NetworkObject.h - data class representing a network object * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index c4fb10c61..187c31c4d 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.cpp - base class for network object directory implementations * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 7bfeb28c9..f8a33bb5b 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.h - base class for network object directory implementations * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.cpp b/core/src/NetworkObjectDirectoryManager.cpp index 4318a4f73..b1f1f917f 100644 --- a/core/src/NetworkObjectDirectoryManager.cpp +++ b/core/src/NetworkObjectDirectoryManager.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.cpp - implementation of NetworkObjectDirectoryManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.h b/core/src/NetworkObjectDirectoryManager.h index dc0ed7800..6d010bf14 100644 --- a/core/src/NetworkObjectDirectoryManager.h +++ b/core/src/NetworkObjectDirectoryManager.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.h - header file for NetworkObjectDirectoryManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryPluginInterface.h b/core/src/NetworkObjectDirectoryPluginInterface.h index 021d70114..556727402 100644 --- a/core/src/NetworkObjectDirectoryPluginInterface.h +++ b/core/src/NetworkObjectDirectoryPluginInterface.h @@ -2,7 +2,7 @@ * NetworkObjectDirectoryPluginInterface.h - plugin interface for network * object directory implementations * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectModel.h b/core/src/NetworkObjectModel.h index 4f93b8855..97d4295fa 100644 --- a/core/src/NetworkObjectModel.h +++ b/core/src/NetworkObjectModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectModel.h - base class for data models providing grouped network objects * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ObjectManager.h b/core/src/ObjectManager.h index 56339d6ea..97c824462 100644 --- a/core/src/ObjectManager.h +++ b/core/src/ObjectManager.h @@ -1,7 +1,7 @@ /* * ObjectManager.h - header file for ObjectManager * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformCoreFunctions.h b/core/src/PlatformCoreFunctions.h index 78ab6380f..5c47430bc 100644 --- a/core/src/PlatformCoreFunctions.h +++ b/core/src/PlatformCoreFunctions.h @@ -1,7 +1,7 @@ /* * PlatformCoreFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformFilesystemFunctions.h b/core/src/PlatformFilesystemFunctions.h index f58fff84b..5bada5816 100644 --- a/core/src/PlatformFilesystemFunctions.h +++ b/core/src/PlatformFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * PlatformFilesystemFunctions.h - interface class for platform filesystem * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformInputDeviceFunctions.h b/core/src/PlatformInputDeviceFunctions.h index 628c31d75..e21bc815b 100644 --- a/core/src/PlatformInputDeviceFunctions.h +++ b/core/src/PlatformInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformInputDeviceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformNetworkFunctions.h b/core/src/PlatformNetworkFunctions.h index b3c43c294..b1973966a 100644 --- a/core/src/PlatformNetworkFunctions.h +++ b/core/src/PlatformNetworkFunctions.h @@ -1,7 +1,7 @@ /* * PlatformNetworkFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginInterface.h b/core/src/PlatformPluginInterface.h index a646f0581..288d32651 100644 --- a/core/src/PlatformPluginInterface.h +++ b/core/src/PlatformPluginInterface.h @@ -1,7 +1,7 @@ /* * PlatformPluginInterface.h - interface class for platform plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.cpp b/core/src/PlatformPluginManager.cpp index b120c13a7..d068ace1b 100644 --- a/core/src/PlatformPluginManager.cpp +++ b/core/src/PlatformPluginManager.cpp @@ -1,7 +1,7 @@ /* * PlatformPluginManager.cpp - implementation of PlatformPluginManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.h b/core/src/PlatformPluginManager.h index 7c8b0abea..866d0368c 100644 --- a/core/src/PlatformPluginManager.h +++ b/core/src/PlatformPluginManager.h @@ -1,7 +1,7 @@ /* * PlatformPluginManager.h - header file for PlatformPluginManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformServiceFunctions.h b/core/src/PlatformServiceFunctions.h index ee20158e4..e43e9781a 100644 --- a/core/src/PlatformServiceFunctions.h +++ b/core/src/PlatformServiceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformServiceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 497493e70..b67828f56 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -1,7 +1,7 @@ /* * PlatformSessionsFunctions.h - interface class for platform session functions * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformUserFunctions.h b/core/src/PlatformUserFunctions.h index f04f6d330..9e7be4540 100644 --- a/core/src/PlatformUserFunctions.h +++ b/core/src/PlatformUserFunctions.h @@ -1,7 +1,7 @@ /* * PlatformUserFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Plugin.h b/core/src/Plugin.h index 2aa130399..fb42e5698 100644 --- a/core/src/Plugin.h +++ b/core/src/Plugin.h @@ -1,7 +1,7 @@ /* * Plugin.h - generic abstraction of a plugin * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginInterface.h b/core/src/PluginInterface.h index 1fcaac6f1..ac109418c 100644 --- a/core/src/PluginInterface.h +++ b/core/src/PluginInterface.h @@ -1,7 +1,7 @@ /* * PluginInterface.h - interface class for plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index c76b9a59f..13083a873 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -1,7 +1,7 @@ /* * PluginManager.cpp - implementation of the PluginManager class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.h b/core/src/PluginManager.h index 1f41d1f6d..a2f166e77 100644 --- a/core/src/PluginManager.h +++ b/core/src/PluginManager.h @@ -1,7 +1,7 @@ /* * PluginManager.h - header for the PluginManager class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.cpp b/core/src/ProcessHelper.cpp index d281a8cac..e9331cc0c 100644 --- a/core/src/ProcessHelper.cpp +++ b/core/src/ProcessHelper.cpp @@ -1,7 +1,7 @@ /* * ProcessHelper.cpp - implementation of ProcessHelper * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.h b/core/src/ProcessHelper.h index 24dd3b760..b303d5e19 100644 --- a/core/src/ProcessHelper.h +++ b/core/src/ProcessHelper.h @@ -1,7 +1,7 @@ /* * ProcessHelper.h - header file for ProcessHelper * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.cpp b/core/src/QmlCore.cpp index 8271e55e2..1fda72569 100644 --- a/core/src/QmlCore.cpp +++ b/core/src/QmlCore.cpp @@ -1,7 +1,7 @@ /* * QmlCore.cpp - QML-related core functions * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.h b/core/src/QmlCore.h index 79ec3dd82..ab00d114a 100644 --- a/core/src/QmlCore.h +++ b/core/src/QmlCore.h @@ -1,7 +1,7 @@ /* * QmlCore.h - QML-related core functions * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QtCompat.h b/core/src/QtCompat.h index eb1b90e2c..67ef4912e 100644 --- a/core/src/QtCompat.h +++ b/core/src/QtCompat.h @@ -1,7 +1,7 @@ /* * QtCompat.h - functions and templates for compatibility with older Qt versions * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/RfbClientCallback.h b/core/src/RfbClientCallback.h index 27ce8d559..b468bc537 100644 --- a/core/src/RfbClientCallback.h +++ b/core/src/RfbClientCallback.h @@ -1,7 +1,7 @@ /* * RfbClientCallback.h - wrapper for using member functions as libvncclient callbacks * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index 9e42ec768..0dac81afa 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -1,7 +1,7 @@ /* * Screenshot.cpp - class representing a screenshot * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.h b/core/src/Screenshot.h index e8299af1b..fea15866b 100644 --- a/core/src/Screenshot.h +++ b/core/src/Screenshot.h @@ -1,7 +1,7 @@ /* * Screenshot.h - class representing a screenshot * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.cpp b/core/src/ServiceControl.cpp index 00aeb83c4..4845d1c72 100644 --- a/core/src/ServiceControl.cpp +++ b/core/src/ServiceControl.cpp @@ -1,7 +1,7 @@ /* * ServiceControl.cpp - class for controlling veyon service * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.h b/core/src/ServiceControl.h index ec5de6110..beafa2244 100644 --- a/core/src/ServiceControl.h +++ b/core/src/ServiceControl.h @@ -1,7 +1,7 @@ /* * ServiceControl.h - header for the ServiceControl class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SocketDevice.h b/core/src/SocketDevice.h index ac2e39f16..da6a91e45 100644 --- a/core/src/SocketDevice.h +++ b/core/src/SocketDevice.h @@ -1,7 +1,7 @@ /* * SocketDevice.h - SocketDevice abstraction * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index eefb97f88..62c35a477 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -1,7 +1,7 @@ /* * SystemTrayIcon.cpp - implementation of SystemTrayIcon class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.h b/core/src/SystemTrayIcon.h index c323c965e..8f64f2f47 100644 --- a/core/src/SystemTrayIcon.h +++ b/core/src/SystemTrayIcon.h @@ -1,7 +1,7 @@ /* * SystemTrayIcon.h - declaration of SystemTrayIcon class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.cpp b/core/src/ToolButton.cpp index cfb7ac763..63ad80c4e 100644 --- a/core/src/ToolButton.cpp +++ b/core/src/ToolButton.cpp @@ -1,7 +1,7 @@ /* * ToolButton.cpp - implementation of Veyon-tool-button * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.h b/core/src/ToolButton.h index 9ef10b703..c769e6ea0 100644 --- a/core/src/ToolButton.h +++ b/core/src/ToolButton.h @@ -1,7 +1,7 @@ /* * ToolButton.h - declaration of class ToolButton * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.cpp b/core/src/TranslationLoader.cpp index 3e34357bb..1a509f9f3 100644 --- a/core/src/TranslationLoader.cpp +++ b/core/src/TranslationLoader.cpp @@ -1,7 +1,7 @@ /* * TranslationLoader.cpp - implementation of TranslationLoader class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.h b/core/src/TranslationLoader.h index dfc68e74d..d10d711e0 100644 --- a/core/src/TranslationLoader.h +++ b/core/src/TranslationLoader.h @@ -1,7 +1,7 @@ /* * TranslationLoader.h - declaration of TranslationLoader class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendInterface.h b/core/src/UserGroupsBackendInterface.h index 57e0e064e..f424a5f51 100644 --- a/core/src/UserGroupsBackendInterface.h +++ b/core/src/UserGroupsBackendInterface.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendInterface.h - interface for a UserGroupsBackend * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.cpp b/core/src/UserGroupsBackendManager.cpp index 07caabd73..1a602b20b 100644 --- a/core/src/UserGroupsBackendManager.cpp +++ b/core/src/UserGroupsBackendManager.cpp @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.cpp - implementation of UserGroupsBackendManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.h b/core/src/UserGroupsBackendManager.h index 0e4c78b32..3fd725564 100644 --- a/core/src/UserGroupsBackendManager.h +++ b/core/src/UserGroupsBackendManager.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.h - header file for UserGroupsBackendManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.cpp b/core/src/VariantArrayMessage.cpp index aba2730f3..269934ae0 100644 --- a/core/src/VariantArrayMessage.cpp +++ b/core/src/VariantArrayMessage.cpp @@ -1,7 +1,7 @@ /* * VariantArrayMessage.cpp - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.h b/core/src/VariantArrayMessage.h index b38e56b2d..c9a19ea25 100644 --- a/core/src/VariantArrayMessage.h +++ b/core/src/VariantArrayMessage.h @@ -1,7 +1,7 @@ /* * VariantArrayMessage.h - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index 881489084..21b161719 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -1,7 +1,7 @@ /* * VariantStream.cpp - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.h b/core/src/VariantStream.h index 62cfbd78b..f0dbfd0d2 100644 --- a/core/src/VariantStream.h +++ b/core/src/VariantStream.h @@ -1,7 +1,7 @@ /* * VariantStream.h - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index 40a3aa0e2..7666baa10 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -2,7 +2,7 @@ * VeyonConfiguration.cpp - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.h b/core/src/VeyonConfiguration.h index eaf7a58b3..8ecee7d85 100644 --- a/core/src/VeyonConfiguration.h +++ b/core/src/VeyonConfiguration.h @@ -2,7 +2,7 @@ * VeyonConfiguration.h - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index cc499aeae..d9cb2d82a 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -2,7 +2,7 @@ * VeyonConfigurationProperties.h - definition of every configuration property * stored in global veyon configuration * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 5e4d32be5..4b8e72b89 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -1,7 +1,7 @@ /* * VeyonConnection.cpp - implementation of VeyonConnection * - * Copyright (c) 2008-2021 Tobias Junghans + * Copyright (c) 2008-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index d727ccc6f..0ec7f5b78 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -1,7 +1,7 @@ /* * VeyonConnection.h - declaration of class VeyonConnection * - * Copyright (c) 2008-2021 Tobias Junghans + * Copyright (c) 2008-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index fda0ebe15..21e0fab32 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -1,7 +1,7 @@ /* * VeyonCore.cpp - implementation of Veyon Core * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 81318c619..94342830e 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -1,7 +1,7 @@ /* * VeyonCore.h - declaration of VeyonCore class + basic headers * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonMasterInterface.h b/core/src/VeyonMasterInterface.h index d9caa6fb9..f95d657f0 100644 --- a/core/src/VeyonMasterInterface.h +++ b/core/src/VeyonMasterInterface.h @@ -1,7 +1,7 @@ /* * VeyonMasterInterface.h - interface class for VeyonMaster * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index cd56f1e81..9eff9e678 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -1,7 +1,7 @@ /* * VeyonServerInterface.h - interface class for VeyonServer * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.cpp b/core/src/VeyonServiceControl.cpp index b36212de0..0ba99f6fa 100644 --- a/core/src/VeyonServiceControl.cpp +++ b/core/src/VeyonServiceControl.cpp @@ -1,7 +1,7 @@ /* * VeyonServiceControl.cpp - class for controlling Veyon service * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.h b/core/src/VeyonServiceControl.h index 63c605d17..21733c970 100644 --- a/core/src/VeyonServiceControl.h +++ b/core/src/VeyonServiceControl.h @@ -1,7 +1,7 @@ /* * VeyonServiceControl.h - class for controlling the Veyon service * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonWorkerInterface.h b/core/src/VeyonWorkerInterface.h index 08c2327db..91c09d7ef 100644 --- a/core/src/VeyonWorkerInterface.h +++ b/core/src/VeyonWorkerInterface.h @@ -1,7 +1,7 @@ /* * VeyonWorkerInterface.h - interface class for VeyonWorker * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index ae312a8ac..7d27d76df 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -1,7 +1,7 @@ /* * VncClientProtocol.cpp - implementation of the VncClientProtocol class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index 3cbd12d73..bcd743a44 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -1,7 +1,7 @@ /* * VncClientProtocol.h - header file for the VncClientProtocol class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index b5da0a0e5..f21843f88 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -1,7 +1,7 @@ /* * VncConnection.cpp - implementation of VncConnection class * - * Copyright (c) 2008-2021 Tobias Junghans + * Copyright (c) 2008-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index aeb1176da..cdb6c5817 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -1,7 +1,7 @@ /* * VncConnection.h - declaration of VncConnection class * - * Copyright (c) 2008-2021 Tobias Junghans + * Copyright (c) 2008-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnectionConfiguration.h b/core/src/VncConnectionConfiguration.h index c63bb9326..2aeeb7083 100644 --- a/core/src/VncConnectionConfiguration.h +++ b/core/src/VncConnectionConfiguration.h @@ -1,7 +1,7 @@ /* * VncConnectionConfiguration.h - declaration of VncConnectionConfiguration * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.cpp b/core/src/VncEvents.cpp index e7d2d12fa..2fc137192 100644 --- a/core/src/VncEvents.cpp +++ b/core/src/VncEvents.cpp @@ -1,7 +1,7 @@ /* * VncEvents.cpp - implementation of VNC event classes * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.h b/core/src/VncEvents.h index 13eceacb1..6e48114e4 100644 --- a/core/src/VncEvents.h +++ b/core/src/VncEvents.h @@ -1,7 +1,7 @@ /* * VncEvent.h - declaration of VncEvent and subclasses * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.cpp b/core/src/VncFeatureMessageEvent.cpp index 733f7ed2e..037c5baaf 100644 --- a/core/src/VncFeatureMessageEvent.cpp +++ b/core/src/VncFeatureMessageEvent.cpp @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.cpp - implementation of FeatureMessageEvent * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.h b/core/src/VncFeatureMessageEvent.h index dae2485ff..f4d39aa65 100644 --- a/core/src/VncFeatureMessageEvent.h +++ b/core/src/VncFeatureMessageEvent.h @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.h - declaration of class FeatureMessageEvent * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerClient.h b/core/src/VncServerClient.h index 020e65320..87924e079 100644 --- a/core/src/VncServerClient.h +++ b/core/src/VncServerClient.h @@ -1,7 +1,7 @@ /* * VncServerClient.h - header file for the VncServerClient class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerPluginInterface.h b/core/src/VncServerPluginInterface.h index 57478da34..d54dd7d7d 100644 --- a/core/src/VncServerPluginInterface.h +++ b/core/src/VncServerPluginInterface.h @@ -1,7 +1,7 @@ /* * VncServerPluginInterface.h - abstract interface class for VNC server plugins * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index 6d95e5286..655df196a 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VncServerProtocol.cpp - implementation of the VncServerProtocol class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.h b/core/src/VncServerProtocol.h index 3810431ea..0cc572255 100644 --- a/core/src/VncServerProtocol.h +++ b/core/src/VncServerProtocol.h @@ -1,7 +1,7 @@ /* * VncServerProtocol.h - header file for the VncServerProtocol class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index 113ef082b..60cc9a08f 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -1,7 +1,7 @@ /* * VncView.cpp - abstract base for all VNC views * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.h b/core/src/VncView.h index ad7dc0fd0..29594f297 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -1,7 +1,7 @@ /* * VncView.h - abstract base for all VNC views * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index 660d5556f..ced6a9805 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -1,7 +1,7 @@ /* * VncViewItem.cpp - QtQuick VNC view item * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.h b/core/src/VncViewItem.h index d1f504d0c..992548320 100644 --- a/core/src/VncViewItem.h +++ b/core/src/VncViewItem.h @@ -1,7 +1,7 @@ /* * VncViewItem.h - QtQuick VNC view item * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index 9ff5f14d3..a91390220 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -1,7 +1,7 @@ /* * VncViewWidget.cpp - VNC viewer widget * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index 462e13da4..d1e5f9ece 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -1,7 +1,7 @@ /* * VncViewWidget.h - VNC viewer widget * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.cpp b/master/src/CheckableItemProxyModel.cpp index 4a7968f5b..f1e1411d4 100644 --- a/master/src/CheckableItemProxyModel.cpp +++ b/master/src/CheckableItemProxyModel.cpp @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.cpp - proxy model for overlaying checked property * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.h b/master/src/CheckableItemProxyModel.h index 4ba6cc4fa..730903c37 100644 --- a/master/src/CheckableItemProxyModel.h +++ b/master/src/CheckableItemProxyModel.h @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.h - proxy model for overlaying checked property * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index a9535f241..1a0d2eb04 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerControlListModel.cpp - data model for computer control objects * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 3b5dc9545..fca2c2bfe 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -1,7 +1,7 @@ /* * ComputerControlListModel.h - data model for computer control objects * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerImageProvider.cpp b/master/src/ComputerImageProvider.cpp index e15cf42aa..72a98450c 100644 --- a/master/src/ComputerImageProvider.cpp +++ b/master/src/ComputerImageProvider.cpp @@ -1,7 +1,7 @@ /* * ComputerImageProvider.cpp - data model for computer control objects * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerImageProvider.h b/master/src/ComputerImageProvider.h index b037f3d14..4ca02d5eb 100644 --- a/master/src/ComputerImageProvider.h +++ b/master/src/ComputerImageProvider.h @@ -1,7 +1,7 @@ /* * ComputerImageProvider.h - image provider for computers * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 1264825db..00cb882ef 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -1,7 +1,7 @@ /* * ComputerManager.cpp - maintains and provides a computer object list * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index e688808f7..91e778b7a 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -1,7 +1,7 @@ /* * ComputerManager.h - maintains and provides a computer object list * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.cpp b/master/src/ComputerMonitoringItem.cpp index 76501c1e8..9faa0ab5e 100644 --- a/master/src/ComputerMonitoringItem.cpp +++ b/master/src/ComputerMonitoringItem.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.h b/master/src/ComputerMonitoringItem.h index 37d06be2c..1646c1d04 100644 --- a/master/src/ComputerMonitoringItem.h +++ b/master/src/ComputerMonitoringItem.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.cpp b/master/src/ComputerMonitoringModel.cpp index f249b48f5..db06c8b6b 100644 --- a/master/src/ComputerMonitoringModel.cpp +++ b/master/src/ComputerMonitoringModel.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringModel.cpp - implementation of ComputerMonitoringModel * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.h b/master/src/ComputerMonitoringModel.h index 5a2af9fd3..12e9444e3 100644 --- a/master/src/ComputerMonitoringModel.h +++ b/master/src/ComputerMonitoringModel.h @@ -1,7 +1,7 @@ /* * ComputerSortFilterProxyModel.h - header file for ComputerSortFilterProxyModel * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 3ce3b0a56..b67f06eda 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.h b/master/src/ComputerMonitoringView.h index fafca5baf..e8f1fd137 100644 --- a/master/src/ComputerMonitoringView.h +++ b/master/src/ComputerMonitoringView.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index eefd9a5c9..79a0a4d7d 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.h b/master/src/ComputerMonitoringWidget.h index 11501d299..9221383c7 100644 --- a/master/src/ComputerMonitoringWidget.h +++ b/master/src/ComputerMonitoringWidget.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.cpp b/master/src/ComputerSelectModel.cpp index 64f2ea058..a051476c3 100644 --- a/master/src/ComputerSelectModel.cpp +++ b/master/src/ComputerSelectModel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectModel.cpp - data model for computer selection * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.h b/master/src/ComputerSelectModel.h index df4490bfe..1e7705ecd 100644 --- a/master/src/ComputerSelectModel.h +++ b/master/src/ComputerSelectModel.h @@ -1,7 +1,7 @@ /* * ComputerSelectListModel.h - data model for computer selection * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.cpp b/master/src/ComputerSelectPanel.cpp index 6f8c47599..74f045fe3 100644 --- a/master/src/ComputerSelectPanel.cpp +++ b/master/src/ComputerSelectPanel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.cpp - provides a view for a network object tree * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.h b/master/src/ComputerSelectPanel.h index 56c9d0e68..465dd373f 100644 --- a/master/src/ComputerSelectPanel.h +++ b/master/src/ComputerSelectPanel.h @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.h - provides a view for a network object tree * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index a6f422042..64e2447c7 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.cpp - fullscreen preview widget * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index 15339d58d..7797d0de2 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.h - fullscreen preview widget * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index 55086a33b..af49984db 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.cpp - helper for creating documentation figures * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index 22be9afde..18410c4e8 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.h - helper for creating documentation figures * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.cpp b/master/src/FeatureListModel.cpp index 4be73aa90..129f0409b 100644 --- a/master/src/FeatureListModel.cpp +++ b/master/src/FeatureListModel.cpp @@ -1,7 +1,7 @@ /* * FeatureListModel.cpp - data model for features * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.h b/master/src/FeatureListModel.h index 2cd0130e4..d4eb234be 100644 --- a/master/src/FeatureListModel.h +++ b/master/src/FeatureListModel.h @@ -1,7 +1,7 @@ /* * FeatureListListModel.h - data model for features * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.cpp b/master/src/FlexibleListView.cpp index 1a3481811..a8b4816c0 100644 --- a/master/src/FlexibleListView.cpp +++ b/master/src/FlexibleListView.cpp @@ -1,7 +1,7 @@ /* * FlexibleListView.cpp - list view with flexible icon positions * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.h b/master/src/FlexibleListView.h index bdd11c199..425396ff3 100644 --- a/master/src/FlexibleListView.h +++ b/master/src/FlexibleListView.h @@ -1,7 +1,7 @@ /* * FlexibleListView.h - list view with flexible icon positions * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.cpp b/master/src/LocationDialog.cpp index 092c15dbb..c49074611 100644 --- a/master/src/LocationDialog.cpp +++ b/master/src/LocationDialog.cpp @@ -1,7 +1,7 @@ /* * LocationDialog.cpp - header file for LocationDialog * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.h b/master/src/LocationDialog.h index e4d202203..8c40ca9a6 100644 --- a/master/src/LocationDialog.h +++ b/master/src/LocationDialog.h @@ -1,7 +1,7 @@ /* * LocationDialog.h - header file for LocationDialog * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.cpp b/master/src/MainToolBar.cpp index 3504053fb..d369d39b2 100644 --- a/master/src/MainToolBar.cpp +++ b/master/src/MainToolBar.cpp @@ -1,7 +1,7 @@ /* * MainToolBar.cpp - MainToolBar for MainWindow * - * Copyright (c) 2007-2021 Tobias Junghans + * Copyright (c) 2007-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.h b/master/src/MainToolBar.h index 8a69af202..ec0e0623d 100644 --- a/master/src/MainToolBar.h +++ b/master/src/MainToolBar.h @@ -1,7 +1,7 @@ /* * MainToolBar.h - MainToolBar for MainWindow * - * Copyright (c) 2007-2021 Tobias Junghans + * Copyright (c) 2007-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 70601bdf0..9ffcb338d 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2004-2021 Tobias Junghans + * Copyright (c) 2004-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.h b/master/src/MainWindow.h index 1466a745e..84ebb517b 100644 --- a/master/src/MainWindow.h +++ b/master/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of Veyon Master Application * - * Copyright (c) 2004-2021 Tobias Junghans + * Copyright (c) 2004-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 1ce8830a2..6c672d773 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.cpp - implementation of NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.h b/master/src/NetworkObjectFilterProxyModel.h index 058c47d6e..c5d9be4da 100644 --- a/master/src/NetworkObjectFilterProxyModel.h +++ b/master/src/NetworkObjectFilterProxyModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.h - header file for NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.cpp b/master/src/NetworkObjectOverlayDataModel.cpp index 8d23260f9..8c42d7974 100644 --- a/master/src/NetworkObjectOverlayDataModel.cpp +++ b/master/src/NetworkObjectOverlayDataModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.cpp - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.h b/master/src/NetworkObjectOverlayDataModel.h index 713647dd9..c58e8bf4b 100644 --- a/master/src/NetworkObjectOverlayDataModel.h +++ b/master/src/NetworkObjectOverlayDataModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.h - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.cpp b/master/src/NetworkObjectTreeModel.cpp index 115d7c894..83d8d12cf 100644 --- a/master/src/NetworkObjectTreeModel.cpp +++ b/master/src/NetworkObjectTreeModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.cpp - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.h b/master/src/NetworkObjectTreeModel.h index 344d0ccb9..ada361caa 100644 --- a/master/src/NetworkObjectTreeModel.h +++ b/master/src/NetworkObjectTreeModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.h - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/RecursiveFilterProxyModel.cpp b/master/src/RecursiveFilterProxyModel.cpp index a8c8cab27..91863b74d 100644 --- a/master/src/RecursiveFilterProxyModel.cpp +++ b/master/src/RecursiveFilterProxyModel.cpp @@ -1,7 +1,7 @@ /* * RecursiveFilterProxyModel.cpp - proxy model for recursive filtering * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/RecursiveFilterProxyModel.h b/master/src/RecursiveFilterProxyModel.h index 6cbd66ab5..97107a72d 100644 --- a/master/src/RecursiveFilterProxyModel.h +++ b/master/src/RecursiveFilterProxyModel.h @@ -1,7 +1,7 @@ /* * RecursiveFilterProxyModel.h - proxy model for recursive filtering * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.cpp b/master/src/ScreenshotManagementPanel.cpp index 4b578d76d..5ab7a1a4a 100644 --- a/master/src/ScreenshotManagementPanel.cpp +++ b/master/src/ScreenshotManagementPanel.cpp @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.cpp - implementation of screenshot management view * - * Copyright (c) 2004-2021 Tobias Junghans + * Copyright (c) 2004-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.h b/master/src/ScreenshotManagementPanel.h index fee82108e..60c25fbee 100644 --- a/master/src/ScreenshotManagementPanel.h +++ b/master/src/ScreenshotManagementPanel.h @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.h - declaration of screenshot management view * - * Copyright (c) 2004-2021 Tobias Junghans + * Copyright (c) 2004-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.cpp b/master/src/SlideshowModel.cpp index ec497eb20..f1213a04e 100644 --- a/master/src/SlideshowModel.cpp +++ b/master/src/SlideshowModel.cpp @@ -1,7 +1,7 @@ /* * SlideshowModel.cpp - implementation of SlideshowModel * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.h b/master/src/SlideshowModel.h index d37fb2931..915113420 100644 --- a/master/src/SlideshowModel.h +++ b/master/src/SlideshowModel.h @@ -1,7 +1,7 @@ /* * SlideshowModel.h - header file for SlideshowModel * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index d7967373a..15fb2a65e 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -1,7 +1,7 @@ /* * SlideshowPanel.cpp - implementation of SlideshowPanel * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.h b/master/src/SlideshowPanel.h index 66c2bc897..1a1530635 100644 --- a/master/src/SlideshowPanel.h +++ b/master/src/SlideshowPanel.h @@ -1,7 +1,7 @@ /* * SlideshowPanel.h - declaration of SlideshowPanel * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.cpp b/master/src/SpotlightModel.cpp index 0a3630ae6..edddc0b30 100644 --- a/master/src/SpotlightModel.cpp +++ b/master/src/SpotlightModel.cpp @@ -1,7 +1,7 @@ /* * SpotlightModel.cpp - implementation of SpotlightModel * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.h b/master/src/SpotlightModel.h index c56a4008a..edc014128 100644 --- a/master/src/SpotlightModel.h +++ b/master/src/SpotlightModel.h @@ -1,7 +1,7 @@ /* * SpotlightModel.h - header file for SpotlightModel * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index f38be730c..e256fa67b 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -1,7 +1,7 @@ /* * SpotlightPanel.cpp - implementation of SpotlightPanel * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index e0ddeb2ae..d394449fd 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -1,7 +1,7 @@ /* * SpotlightPanel.h - declaration of SpotlightPanel * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index 4406edf55..97b4cacc0 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -2,7 +2,7 @@ * UserConfig.cpp - Configuration object storing personal settings * for the Veyon Master Application * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index 2f357bda2..eb13194d4 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -1,7 +1,7 @@ /* * UserConfig.h - UserConfig class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 8763022d9..e7fec7eae 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -1,7 +1,7 @@ /* * VeyonMaster.cpp - management of application-global instances * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 144e30849..9e6ec1c82 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -1,7 +1,7 @@ /* * VeyonMaster.h - global instances * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/main.cpp b/master/src/main.cpp index fa1f59dc1..8ff3e7bfd 100644 --- a/master/src/main.cpp +++ b/master/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - startup routine for Veyon Master Application * - * Copyright (c) 2004-2021 Tobias Junghans + * Copyright (c) 2004-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/veyon-master.rc.in b/master/veyon-master.rc.in index ebd5b603e..81bc19ae5 100644 --- a/master/veyon-master.rc.in +++ b/master/veyon-master.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Master\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-master.exe\0" END END diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index 933eeba1a..687ab73ee 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -2,7 +2,7 @@ !define COMP_NAME "Veyon Solutions" !define WEB_SITE "https://veyon.io" !define VERSION "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@.@VERSION_BUILD@" -!define COPYRIGHT "2004-2021 Veyon Solutions / Tobias Junghans" +!define COPYRIGHT "2004-2022 Veyon Solutions / Tobias Junghans" !define DESCRIPTION "Veyon Installer" !define LICENSE_TXT "COPYING" !define INSTALLER_NAME "veyon-${VERSION}-@VEYON_WINDOWS_ARCH@-setup.exe" diff --git a/plugins/authkeys/AuthKeysConfiguration.h b/plugins/authkeys/AuthKeysConfiguration.h index 4a2dec95b..0e8551492 100644 --- a/plugins/authkeys/AuthKeysConfiguration.h +++ b/plugins/authkeys/AuthKeysConfiguration.h @@ -1,7 +1,7 @@ /* * AuthKeysConfiguration.h - configuration values for AuthKeys plugin * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.cpp b/plugins/authkeys/AuthKeysConfigurationWidget.cpp index 08544d137..a1d0b6a5c 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.cpp +++ b/plugins/authkeys/AuthKeysConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.cpp - implementation of the authentication configuration page * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.h b/plugins/authkeys/AuthKeysConfigurationWidget.h index 8a3963a6f..e20b4a8f2 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.h +++ b/plugins/authkeys/AuthKeysConfigurationWidget.h @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.h - header for the AuthKeysConfigurationDialog class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index a7b5f2661..ef1a91db5 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -1,7 +1,7 @@ /* * AuthKeysManager.cpp - implementation of AuthKeysManager class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.h b/plugins/authkeys/AuthKeysManager.h index 0f6ffe35a..f366be4e1 100644 --- a/plugins/authkeys/AuthKeysManager.h +++ b/plugins/authkeys/AuthKeysManager.h @@ -1,7 +1,7 @@ /* * AuthKeysManager.h - declaration of AuthKeysManager class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index fb24f6057..adf9c075b 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.cpp - implementation of AuthKeysPlugin class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index f057c87bf..04d96eec2 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.h - declaration of AuthKeysPlugin class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.cpp b/plugins/authkeys/AuthKeysTableModel.cpp index d9253728d..a247d81ef 100644 --- a/plugins/authkeys/AuthKeysTableModel.cpp +++ b/plugins/authkeys/AuthKeysTableModel.cpp @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.cpp - implementation of AuthKeysTableModel class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.h b/plugins/authkeys/AuthKeysTableModel.h index 1c6bbe0f7..ed89dee31 100644 --- a/plugins/authkeys/AuthKeysTableModel.h +++ b/plugins/authkeys/AuthKeysTableModel.h @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.h - declaration of AuthKeysTableModel class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.cpp b/plugins/authlogon/AuthLogonDialog.cpp index b71078165..20d656283 100644 --- a/plugins/authlogon/AuthLogonDialog.cpp +++ b/plugins/authlogon/AuthLogonDialog.cpp @@ -1,7 +1,7 @@ /* * AuthLogonDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.h b/plugins/authlogon/AuthLogonDialog.h index 4d0ae37a9..00fa19cb6 100644 --- a/plugins/authlogon/AuthLogonDialog.h +++ b/plugins/authlogon/AuthLogonDialog.h @@ -1,7 +1,7 @@ /* * AuthLogonDialog.h - declaration of password dialog * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index 98476d3cc..2fb30bdad 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.cpp - implementation of AuthLogonPlugin class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h index 300ab7bf2..645778dcd 100644 --- a/plugins/authlogon/AuthLogonPlugin.h +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.h - declaration of AuthLogonPlugin class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleConfiguration.h b/plugins/authsimple/AuthSimpleConfiguration.h index 5da222ab3..cf63ce99c 100644 --- a/plugins/authsimple/AuthSimpleConfiguration.h +++ b/plugins/authsimple/AuthSimpleConfiguration.h @@ -1,7 +1,7 @@ /* * AuthSimpleConfiguration.h - configuration values for AuthSimple plugin * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.cpp b/plugins/authsimple/AuthSimpleDialog.cpp index b26438cde..239150bdd 100644 --- a/plugins/authsimple/AuthSimpleDialog.cpp +++ b/plugins/authsimple/AuthSimpleDialog.cpp @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.h b/plugins/authsimple/AuthSimpleDialog.h index e67e1a821..befe63bfe 100644 --- a/plugins/authsimple/AuthSimpleDialog.h +++ b/plugins/authsimple/AuthSimpleDialog.h @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.h - declaration of password dialog * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp index 63d5d357b..a33d8f766 100644 --- a/plugins/authsimple/AuthSimplePlugin.cpp +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.cpp - implementation of AuthSimplePlugin class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.h b/plugins/authsimple/AuthSimplePlugin.h index c4288d209..d908dd160 100644 --- a/plugins/authsimple/AuthSimplePlugin.h +++ b/plugins/authsimple/AuthSimplePlugin.h @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.h - declaration of AuthSimplePlugin class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.cpp b/plugins/builtindirectory/BuiltinDirectory.cpp index 2954c70b0..2bb192f42 100644 --- a/plugins/builtindirectory/BuiltinDirectory.cpp +++ b/plugins/builtindirectory/BuiltinDirectory.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectory.cpp - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.h b/plugins/builtindirectory/BuiltinDirectory.h index 5731792aa..55839f383 100644 --- a/plugins/builtindirectory/BuiltinDirectory.h +++ b/plugins/builtindirectory/BuiltinDirectory.h @@ -1,7 +1,7 @@ /* * BuiltinDirectory.h - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h index 29bff2e81..efc71a1a8 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfiguration.h - configuration values for BuiltinDirectory plugin * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp index f2a1d894c..e55a633aa 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.cpp - implementation of BuiltinDirectoryConfigurationPage * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h index 1259f5a6c..a28d3f583 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.h - header for the BuiltinDirectoryConfigurationPage class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 97624c4de..a2155b236 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.cpp - implementation of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.h b/plugins/builtindirectory/BuiltinDirectoryPlugin.h index ca506fa86..36a45fa61 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.h +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.h - declaration of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.cpp b/plugins/demo/DemoAuthentication.cpp index 02a1f9c76..10a468f4f 100644 --- a/plugins/demo/DemoAuthentication.cpp +++ b/plugins/demo/DemoAuthentication.cpp @@ -1,7 +1,7 @@ /* * DemoAuthentication.cpp - implementation of DemoAuthentication class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index 5b22c8d56..183ffdafb 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -1,7 +1,7 @@ /* * DemoAuthentication.h - declaration of DemoAuthentication class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index 80939bba4..5c46a9a1f 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -1,7 +1,7 @@ /* * DemoClient.cpp - client widget for demo mode * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.h b/plugins/demo/DemoClient.h index e5df96214..f84689402 100644 --- a/plugins/demo/DemoClient.h +++ b/plugins/demo/DemoClient.h @@ -1,7 +1,7 @@ /* * DemoClient.h - client for demo server * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfiguration.h b/plugins/demo/DemoConfiguration.h index 2dfd986f0..9f3f72479 100644 --- a/plugins/demo/DemoConfiguration.h +++ b/plugins/demo/DemoConfiguration.h @@ -1,7 +1,7 @@ /* * DemoConfiguration.h - configuration values for Demo plugin * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.cpp b/plugins/demo/DemoConfigurationPage.cpp index d5a838e69..94b3bfc8b 100644 --- a/plugins/demo/DemoConfigurationPage.cpp +++ b/plugins/demo/DemoConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.cpp - implementation of DemoConfigurationPage * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.h b/plugins/demo/DemoConfigurationPage.h index 0c2369198..4f277fecc 100644 --- a/plugins/demo/DemoConfigurationPage.h +++ b/plugins/demo/DemoConfigurationPage.h @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.h - header for the DemoConfigurationPage class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 27195605d..b0858537d 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.cpp - implementation of DemoFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 01bbae105..de7204d76 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.h - declaration of DemoFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 0159fecda..0c275d52d 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index aa6ee83c4..945372e9f 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -2,7 +2,7 @@ * DemoServer.h - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index a322b2203..bf41de7a7 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.h b/plugins/demo/DemoServerConnection.h index 6a5ea0854..97bc4712c 100644 --- a/plugins/demo/DemoServerConnection.h +++ b/plugins/demo/DemoServerConnection.h @@ -1,7 +1,7 @@ /* * DemoServerConnection.h - header file for DemoServerConnection class * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.cpp b/plugins/demo/DemoServerProtocol.cpp index e6f77e986..e72be717b 100644 --- a/plugins/demo/DemoServerProtocol.cpp +++ b/plugins/demo/DemoServerProtocol.cpp @@ -1,7 +1,7 @@ /* * DemoServerProtocol.cpp - implementation of DemoServerProtocol class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.h b/plugins/demo/DemoServerProtocol.h index c269e68cf..7ca6279d0 100644 --- a/plugins/demo/DemoServerProtocol.h +++ b/plugins/demo/DemoServerProtocol.h @@ -1,7 +1,7 @@ /* * DemoServerProtocol.h - header file for DemoServerProtocol class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.cpp b/plugins/desktopservices/DesktopServiceObject.cpp index 3ae7d7be0..18c9cdf9d 100644 --- a/plugins/desktopservices/DesktopServiceObject.cpp +++ b/plugins/desktopservices/DesktopServiceObject.cpp @@ -1,7 +1,7 @@ /* * DesktopServiceObject.cpp - data class representing a desktop service object * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.h b/plugins/desktopservices/DesktopServiceObject.h index bc30cc11d..5c93dc7d6 100644 --- a/plugins/desktopservices/DesktopServiceObject.h +++ b/plugins/desktopservices/DesktopServiceObject.h @@ -1,7 +1,7 @@ /* * DesktopServiceObject.h - data class representing a desktop service object * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfiguration.h b/plugins/desktopservices/DesktopServicesConfiguration.h index cb35045d8..5bd7f82a5 100644 --- a/plugins/desktopservices/DesktopServicesConfiguration.h +++ b/plugins/desktopservices/DesktopServicesConfiguration.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfiguration.h - configuration values for DesktopServices * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp index 47ea4a5ba..b6eb0aa23 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.cpp - implementation of the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.h b/plugins/desktopservices/DesktopServicesConfigurationPage.h index 396e2744f..1253cf92b 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.h +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.h - header for the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index 1ea4f5c70..9db8656e5 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.cpp - implementation of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index 232bbea42..5b98f3204 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.h - declaration of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.cpp b/plugins/desktopservices/OpenWebsiteDialog.cpp index f9834123b..e796e3d28 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.cpp +++ b/plugins/desktopservices/OpenWebsiteDialog.cpp @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.cpp - implementation of OpenWebsiteDialog * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.h b/plugins/desktopservices/OpenWebsiteDialog.h index 37068a44f..2091d708d 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.h +++ b/plugins/desktopservices/OpenWebsiteDialog.h @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.h - declaration of class OpenWebsiteDialog * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/desktopservices/StartAppDialog.cpp b/plugins/desktopservices/StartAppDialog.cpp index f98472eba..ea3a9c37e 100644 --- a/plugins/desktopservices/StartAppDialog.cpp +++ b/plugins/desktopservices/StartAppDialog.cpp @@ -1,7 +1,7 @@ /* * StartAppDialog.cpp - implementation of StartAppDialog * - * Copyright (c) 2004-2021 Tobias Junghans + * Copyright (c) 2004-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/StartAppDialog.h b/plugins/desktopservices/StartAppDialog.h index a4c69b566..848a9e497 100644 --- a/plugins/desktopservices/StartAppDialog.h +++ b/plugins/desktopservices/StartAppDialog.h @@ -1,7 +1,7 @@ /* * StartAppDialog.h - declaration of class StartAppDialog * - * Copyright (c) 2004-2021 Tobias Junghans + * Copyright (c) 2004-2022 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileReadThread.cpp b/plugins/filetransfer/FileReadThread.cpp index f621e9f78..62a506ece 100644 --- a/plugins/filetransfer/FileReadThread.cpp +++ b/plugins/filetransfer/FileReadThread.cpp @@ -1,7 +1,7 @@ /* * FileReadThread.cpp - implementation of FileReadThread class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileReadThread.h b/plugins/filetransfer/FileReadThread.h index b4736ebf9..3503359d4 100644 --- a/plugins/filetransfer/FileReadThread.h +++ b/plugins/filetransfer/FileReadThread.h @@ -1,7 +1,7 @@ /* * FileReadThread.h - declaration of FileReadThread class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfiguration.h b/plugins/filetransfer/FileTransferConfiguration.h index d1365d4a5..26fba6ccb 100644 --- a/plugins/filetransfer/FileTransferConfiguration.h +++ b/plugins/filetransfer/FileTransferConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferConfiguration.h - configuration values for FileTransfer plugin * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.cpp b/plugins/filetransfer/FileTransferConfigurationPage.cpp index acc7a0c70..9232f972f 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.cpp +++ b/plugins/filetransfer/FileTransferConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.cpp - implementation of FileTransferConfigurationPage * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.h b/plugins/filetransfer/FileTransferConfigurationPage.h index 1d7e487e5..e4925fe5f 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.h +++ b/plugins/filetransfer/FileTransferConfigurationPage.h @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.h - header for the FileTransferConfigurationPage class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.cpp b/plugins/filetransfer/FileTransferController.cpp index 3c01e3180..0bcd8e808 100644 --- a/plugins/filetransfer/FileTransferController.cpp +++ b/plugins/filetransfer/FileTransferController.cpp @@ -1,7 +1,7 @@ /* * FileTransferController.cpp - implementation of FileTransferController class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.h b/plugins/filetransfer/FileTransferController.h index b9b950b3b..91e8faf1d 100644 --- a/plugins/filetransfer/FileTransferController.h +++ b/plugins/filetransfer/FileTransferController.h @@ -1,7 +1,7 @@ /* * FileTransferController.h - declaration of FileTransferController class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.cpp b/plugins/filetransfer/FileTransferDialog.cpp index 99e61cc3e..787c8c30e 100644 --- a/plugins/filetransfer/FileTransferDialog.cpp +++ b/plugins/filetransfer/FileTransferDialog.cpp @@ -1,7 +1,7 @@ /* * FileTransferDialog.cpp - implementation of FileTransferDialog * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.h b/plugins/filetransfer/FileTransferDialog.h index 4874f099c..74b78d5e2 100644 --- a/plugins/filetransfer/FileTransferDialog.h +++ b/plugins/filetransfer/FileTransferDialog.h @@ -1,7 +1,7 @@ /* * FileTransferDialog.h - declaration of class FileTransferDialog * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileTransferListModel.cpp b/plugins/filetransfer/FileTransferListModel.cpp index b7ceecff3..e518fb42b 100644 --- a/plugins/filetransfer/FileTransferListModel.cpp +++ b/plugins/filetransfer/FileTransferListModel.cpp @@ -1,7 +1,7 @@ /* * FileTransferListModel.cpp - implementation of FileTransferListModel class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferListModel.h b/plugins/filetransfer/FileTransferListModel.h index 381f4958d..45be2251f 100644 --- a/plugins/filetransfer/FileTransferListModel.h +++ b/plugins/filetransfer/FileTransferListModel.h @@ -1,7 +1,7 @@ /* * FileTransferListModel.h - declaration of FileTransferListModel class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.cpp b/plugins/filetransfer/FileTransferPlugin.cpp index 0b2d528a0..541465354 100644 --- a/plugins/filetransfer/FileTransferPlugin.cpp +++ b/plugins/filetransfer/FileTransferPlugin.cpp @@ -1,7 +1,7 @@ /* * FileTransferPlugin.cpp - implementation of FileTransferPlugin class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.h b/plugins/filetransfer/FileTransferPlugin.h index f8a806806..3c0faad33 100644 --- a/plugins/filetransfer/FileTransferPlugin.h +++ b/plugins/filetransfer/FileTransferPlugin.h @@ -1,7 +1,7 @@ /* * FileTransferPlugin.h - declaration of FileTransferPlugin class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferUserConfiguration.h b/plugins/filetransfer/FileTransferUserConfiguration.h index eb153ae68..307ca6b80 100644 --- a/plugins/filetransfer/FileTransferUserConfiguration.h +++ b/plugins/filetransfer/FileTransferUserConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferUserConfiguration.h - user config values for file transfer * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapConfiguration.h b/plugins/ldap/AuthLdapConfiguration.h index b61530441..9084a3ca3 100644 --- a/plugins/ldap/AuthLdapConfiguration.h +++ b/plugins/ldap/AuthLdapConfiguration.h @@ -1,7 +1,7 @@ /* * LdapConfiguration.h - LDAP-auth-specific configuration values * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapConfigurationWidget.cpp b/plugins/ldap/AuthLdapConfigurationWidget.cpp index 9c71e4798..97cb360c3 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.cpp +++ b/plugins/ldap/AuthLdapConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * AuthLdapConfigurationWidget.cpp - implementation of the authentication configuration page * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapConfigurationWidget.h b/plugins/ldap/AuthLdapConfigurationWidget.h index bbcaa43c9..f84c93697 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.h +++ b/plugins/ldap/AuthLdapConfigurationWidget.h @@ -1,7 +1,7 @@ /* * AuthLdapConfigurationWidget.h - header for the AuthLdapConfigurationWidget class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapCore.cpp b/plugins/ldap/AuthLdapCore.cpp index 562976975..970cb88a5 100644 --- a/plugins/ldap/AuthLdapCore.cpp +++ b/plugins/ldap/AuthLdapCore.cpp @@ -1,7 +1,7 @@ /* * AuthLdapCore.cpp - implementation of AuthLdapCore class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapCore.h b/plugins/ldap/AuthLdapCore.h index 06266feb1..2520e2ec4 100644 --- a/plugins/ldap/AuthLdapCore.h +++ b/plugins/ldap/AuthLdapCore.h @@ -1,7 +1,7 @@ /* * AuthLdapCore.h - declaration of AuthLdapCore class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapDialog.cpp b/plugins/ldap/AuthLdapDialog.cpp index cf5659111..dadcfb716 100644 --- a/plugins/ldap/AuthLdapDialog.cpp +++ b/plugins/ldap/AuthLdapDialog.cpp @@ -1,7 +1,7 @@ /* * AuthLdapDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapDialog.h b/plugins/ldap/AuthLdapDialog.h index ff786940f..242c47667 100644 --- a/plugins/ldap/AuthLdapDialog.h +++ b/plugins/ldap/AuthLdapDialog.h @@ -1,7 +1,7 @@ /* * AuthLdapDialog.h - declaration of password dialog * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/LdapPlugin.cpp b/plugins/ldap/LdapPlugin.cpp index 0962f93da..99e5246c4 100644 --- a/plugins/ldap/LdapPlugin.cpp +++ b/plugins/ldap/LdapPlugin.cpp @@ -1,7 +1,7 @@ /* * LdapPlugin.cpp - implementation of LdapPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/LdapPlugin.h b/plugins/ldap/LdapPlugin.h index 928ec8912..6f11f9e33 100644 --- a/plugins/ldap/LdapPlugin.h +++ b/plugins/ldap/LdapPlugin.h @@ -1,7 +1,7 @@ /* * LdapPlugin.h - declaration of LdapPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapBrowseDialog.cpp b/plugins/ldap/common/LdapBrowseDialog.cpp index 741d2ce03..22e8e4aea 100644 --- a/plugins/ldap/common/LdapBrowseDialog.cpp +++ b/plugins/ldap/common/LdapBrowseDialog.cpp @@ -1,7 +1,7 @@ /* * LdapBrowseDialog.cpp - dialog for browsing LDAP directories * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapBrowseDialog.h b/plugins/ldap/common/LdapBrowseDialog.h index dec49f218..0d3c329ad 100644 --- a/plugins/ldap/common/LdapBrowseDialog.h +++ b/plugins/ldap/common/LdapBrowseDialog.h @@ -1,7 +1,7 @@ /* * LdapBrowseDialog.h - dialog for browsing LDAP directories * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapBrowseModel.cpp b/plugins/ldap/common/LdapBrowseModel.cpp index 7958b9018..99e76a94a 100644 --- a/plugins/ldap/common/LdapBrowseModel.cpp +++ b/plugins/ldap/common/LdapBrowseModel.cpp @@ -1,7 +1,7 @@ /* * LdapModel.cpp - item model for browsing LDAP directories * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapBrowseModel.h b/plugins/ldap/common/LdapBrowseModel.h index 01125c060..7e6edc9c4 100644 --- a/plugins/ldap/common/LdapBrowseModel.h +++ b/plugins/ldap/common/LdapBrowseModel.h @@ -1,7 +1,7 @@ /* * LdapModel.h - item model for browsing LDAP directories * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapClient.cpp b/plugins/ldap/common/LdapClient.cpp index 64f2d54ca..5471f2c09 100644 --- a/plugins/ldap/common/LdapClient.cpp +++ b/plugins/ldap/common/LdapClient.cpp @@ -1,7 +1,7 @@ /* * LdapClient.cpp - class representing the LDAP directory and providing access to directory entries * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index 0289b12c7..9476da0b6 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -1,7 +1,7 @@ /* * LdapClient.h - class implementing an LDAP client * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapCommon.h b/plugins/ldap/common/LdapCommon.h index 1087380f4..910013af2 100644 --- a/plugins/ldap/common/LdapCommon.h +++ b/plugins/ldap/common/LdapCommon.h @@ -1,7 +1,7 @@ /* * LdapCommon.h - common definitions for the LDAP library * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfiguration.cpp b/plugins/ldap/common/LdapConfiguration.cpp index cebe68e0a..85cdabd52 100644 --- a/plugins/ldap/common/LdapConfiguration.cpp +++ b/plugins/ldap/common/LdapConfiguration.cpp @@ -1,7 +1,7 @@ /* * LdapConfiguration.cpp - LDAP-specific configuration values * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index 3d32013df..d3381f143 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -1,7 +1,7 @@ /* * LdapConfiguration.h - LDAP-specific configuration values * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfigurationPage.cpp b/plugins/ldap/common/LdapConfigurationPage.cpp index 931517308..f9c758a19 100644 --- a/plugins/ldap/common/LdapConfigurationPage.cpp +++ b/plugins/ldap/common/LdapConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * LdapConfigurationPage.cpp - implementation of the LdapConfigurationPage class * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfigurationPage.h b/plugins/ldap/common/LdapConfigurationPage.h index 602a3d5df..51ead4934 100644 --- a/plugins/ldap/common/LdapConfigurationPage.h +++ b/plugins/ldap/common/LdapConfigurationPage.h @@ -1,7 +1,7 @@ /* * LdapConfigurationPage.h - header for the LdapConfigurationPage class * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfigurationTest.cpp b/plugins/ldap/common/LdapConfigurationTest.cpp index f84167310..cbbae90e7 100644 --- a/plugins/ldap/common/LdapConfigurationTest.cpp +++ b/plugins/ldap/common/LdapConfigurationTest.cpp @@ -1,7 +1,7 @@ /* * LdapConfigurationTest.cpp - implementation of the LdapConfigurationTest class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapConfigurationTest.h b/plugins/ldap/common/LdapConfigurationTest.h index cd86cf75d..cfab5d0d1 100644 --- a/plugins/ldap/common/LdapConfigurationTest.h +++ b/plugins/ldap/common/LdapConfigurationTest.h @@ -1,7 +1,7 @@ /* * LdapConfigurationTest.h - header for the LdapConfigurationTest class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index 746aa206b..322d2fe91 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -1,7 +1,7 @@ /* * LdapDirectory.cpp - class representing the LDAP directory and providing access to directory entries * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapDirectory.h b/plugins/ldap/common/LdapDirectory.h index 887a1934a..4c23deffa 100644 --- a/plugins/ldap/common/LdapDirectory.h +++ b/plugins/ldap/common/LdapDirectory.h @@ -1,7 +1,7 @@ /* * LdapDirectory.h - class representing the LDAP directory and providing access to directory entries * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index c32cf6ad0..3600564e9 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * LdapNetworkObjectDirectory.cpp - provides a NetworkObjectDirectory for LDAP * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.h b/plugins/ldap/common/LdapNetworkObjectDirectory.h index 3c966ac72..52f69695c 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * LdapNetworkObjectDirectory.h - provides a NetworkObjectDirectory for LDAP * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp index 777462e8c..812598c45 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * LdapNetworkObjectDirectoryConfigurationPage.cpp - implementation of the LdapNetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h index 32be5673d..1827d0b50 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * LdapNetworkObjectDirectoryConfigurationPage.h - header for the LdapNetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/kldap/KLdapIntegration.cpp b/plugins/ldap/kldap/KLdapIntegration.cpp index 35402e0c4..36438621f 100644 --- a/plugins/ldap/kldap/KLdapIntegration.cpp +++ b/plugins/ldap/kldap/KLdapIntegration.cpp @@ -1,7 +1,7 @@ /* * KLdapIntegration.cpp - definition of logging category for kldap * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/kldap/kldap_export.h b/plugins/ldap/kldap/kldap_export.h index 91de1d538..7b63cb9a8 100644 --- a/plugins/ldap/kldap/kldap_export.h +++ b/plugins/ldap/kldap/kldap_export.h @@ -1,7 +1,7 @@ /* * kldap_export.h - definition of symbol visibility macros for kldap * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/kldap/klocalizedstring.h b/plugins/ldap/kldap/klocalizedstring.h index c232ff051..1e8c3e167 100644 --- a/plugins/ldap/kldap/klocalizedstring.h +++ b/plugins/ldap/kldap/klocalizedstring.h @@ -1,7 +1,7 @@ /* * klocalizedstring.h - dummy replacements for i18n() functions of KDE * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/kldap/ldap_debug.h b/plugins/ldap/kldap/ldap_debug.h index 118b7f16f..41bd563b3 100644 --- a/plugins/ldap/kldap/ldap_debug.h +++ b/plugins/ldap/kldap/ldap_debug.h @@ -1,7 +1,7 @@ /* * ldap_debug.h - declaration of logging category for kldap * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/LogonHelper.cpp b/plugins/platform/common/LogonHelper.cpp index 8fecb2707..9a274ce75 100644 --- a/plugins/platform/common/LogonHelper.cpp +++ b/plugins/platform/common/LogonHelper.cpp @@ -1,7 +1,7 @@ /* * LogonHelper.cpp - implementation of LogonHelper class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/LogonHelper.h b/plugins/platform/common/LogonHelper.h index c0c0aa851..8ac7a5d53 100644 --- a/plugins/platform/common/LogonHelper.h +++ b/plugins/platform/common/LogonHelper.h @@ -1,7 +1,7 @@ /* * LogonHelper.h - declaration of LogonHelper class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.cpp b/plugins/platform/common/PersistentLogonCredentials.cpp index f4a1eff1d..478821de8 100644 --- a/plugins/platform/common/PersistentLogonCredentials.cpp +++ b/plugins/platform/common/PersistentLogonCredentials.cpp @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.cpp - implementation of PersistentLogonCredentials class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.h b/plugins/platform/common/PersistentLogonCredentials.h index 4161f7960..cda9dcb7c 100644 --- a/plugins/platform/common/PersistentLogonCredentials.h +++ b/plugins/platform/common/PersistentLogonCredentials.h @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.h - declaration of PersistentLogonCredentials class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index 8e905456a..781d26aa8 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -1,7 +1,7 @@ /* * PlatformSessionManager.cpp - implementation of PlatformSessionManager class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.h b/plugins/platform/common/PlatformSessionManager.h index 13fd0d6cc..b51302e43 100644 --- a/plugins/platform/common/PlatformSessionManager.h +++ b/plugins/platform/common/PlatformSessionManager.h @@ -1,7 +1,7 @@ /* * PlatformSessionManager.h - declaration of PlatformSessionManager class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.cpp b/plugins/platform/common/ServiceDataManager.cpp index 5473dd51b..874d7a272 100644 --- a/plugins/platform/common/ServiceDataManager.cpp +++ b/plugins/platform/common/ServiceDataManager.cpp @@ -1,7 +1,7 @@ /* * ServiceDataManager.cpp - implementation of ServiceDataManager class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.h b/plugins/platform/common/ServiceDataManager.h index 0d78fac41..1ca303ad0 100644 --- a/plugins/platform/common/ServiceDataManager.h +++ b/plugins/platform/common/ServiceDataManager.h @@ -1,7 +1,7 @@ /* * ServiceDataManager.h - header file for ServiceDataManager class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 20adab8a1..a39c131e3 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.cpp - implementation of LinuxCoreFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index c39ce5612..72d0abfcd 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.h - declaration of LinuxCoreFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxDesktopIntegration.h b/plugins/platform/linux/LinuxDesktopIntegration.h index 24608bd0d..8b5231ef0 100644 --- a/plugins/platform/linux/LinuxDesktopIntegration.h +++ b/plugins/platform/linux/LinuxDesktopIntegration.h @@ -1,7 +1,7 @@ /* * LinuxDesktopIntegration.h - declaration of LinuxDesktopIntegration class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.cpp b/plugins/platform/linux/LinuxFilesystemFunctions.cpp index d84058667..0fa6bea12 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.cpp +++ b/plugins/platform/linux/LinuxFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.cpp - implementation of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.h b/plugins/platform/linux/LinuxFilesystemFunctions.h index e46225f4f..1964d37ba 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.h +++ b/plugins/platform/linux/LinuxFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.h - declaration of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp index dca935e4d..45c512d97 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.cpp - implementation of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.h b/plugins/platform/linux/LinuxInputDeviceFunctions.h index acc374691..79d694c42 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.h +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.h - declaration of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.cpp b/plugins/platform/linux/LinuxKeyboardInput.cpp index cb5518ea7..7a63baf88 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.cpp +++ b/plugins/platform/linux/LinuxKeyboardInput.cpp @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.cpp - implementation of LinuxKeyboardInput class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.h b/plugins/platform/linux/LinuxKeyboardInput.h index 69688f64b..cee707678 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.h +++ b/plugins/platform/linux/LinuxKeyboardInput.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.h - declaration of LinuxKeyboardInput class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h index e8743f790..93b2f56c0 100644 --- a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h +++ b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardShortcutTrapper.h - dummy KeyboardShortcutTrapper implementation * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.cpp b/plugins/platform/linux/LinuxNetworkFunctions.cpp index 50bad23ea..1e9ca5f1b 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.cpp +++ b/plugins/platform/linux/LinuxNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.cpp - implementation of LinuxNetworkFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.h b/plugins/platform/linux/LinuxNetworkFunctions.h index fa88688e1..56b597b1b 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.h +++ b/plugins/platform/linux/LinuxNetworkFunctions.h @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.h - declaration of LinuxNetworkFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfiguration.h b/plugins/platform/linux/LinuxPlatformConfiguration.h index a13612ce6..4e18576af 100644 --- a/plugins/platform/linux/LinuxPlatformConfiguration.h +++ b/plugins/platform/linux/LinuxPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfiguration.h - configuration values for LinuxPlatform plugin * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp index a8e68a10e..c2902c0f9 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.h b/plugins/platform/linux/LinuxPlatformConfigurationPage.h index d1b3031d5..779013079 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.h +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.h - header for the LinuxPlatformConfigurationPage class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.cpp b/plugins/platform/linux/LinuxPlatformPlugin.cpp index 514f38de0..f28ac24e7 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.cpp +++ b/plugins/platform/linux/LinuxPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.cpp - implementation of LinuxPlatformPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.h b/plugins/platform/linux/LinuxPlatformPlugin.h index 58e93f0fe..04c59af24 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.h +++ b/plugins/platform/linux/LinuxPlatformPlugin.h @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.h - declaration of LinuxPlatformPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index 89112aee5..a7506e762 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServerProcess class * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServerProcess.h b/plugins/platform/linux/LinuxServerProcess.h index dbe840752..c17d2bd88 100644 --- a/plugins/platform/linux/LinuxServerProcess.h +++ b/plugins/platform/linux/LinuxServerProcess.h @@ -1,7 +1,7 @@ /* * LinuxServerProcess.h - declaration of LinuxServerProcess class * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 9cb430342..6474fe2b1 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index da6aca7aa..66c5bee04 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -1,7 +1,7 @@ /* * LinuxServiceCore.h - declaration of LinuxServiceCore class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.cpp b/plugins/platform/linux/LinuxServiceFunctions.cpp index c6a06a9b9..f2512aa9b 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.cpp +++ b/plugins/platform/linux/LinuxServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.h b/plugins/platform/linux/LinuxServiceFunctions.h index ad3855101..595384975 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.h +++ b/plugins/platform/linux/LinuxServiceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.h - declaration of LinuxServiceFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 4d112ca86..18972b853 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.cpp - implementation of LinuxSessionFunctions class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 2dd5a178f..be9a4c1ae 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.h - declaration of LinuxSessionFunctions class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 3521b06e2..b6cd07220 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.cpp - implementation of LinuxUserFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index 2c53dcc66..1d8bb61b4 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.h - declaration of LinuxUserFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp index 05a839670..809bea21d 100644 --- a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp +++ b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp @@ -1,7 +1,7 @@ /* * VeyonAuthHelper.cpp - main file for Veyon Authentication Helper * - * Copyright (c) 2010-2021 Tobias Junghans + * Copyright (c) 2010-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.cpp b/plugins/platform/windows/DesktopInputController.cpp index 3844bf8b5..73dc21188 100644 --- a/plugins/platform/windows/DesktopInputController.cpp +++ b/plugins/platform/windows/DesktopInputController.cpp @@ -1,7 +1,7 @@ /* * DesktopInputController.cpp - implementation of DesktopInputController class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.h b/plugins/platform/windows/DesktopInputController.h index 466196f84..3752f7add 100644 --- a/plugins/platform/windows/DesktopInputController.h +++ b/plugins/platform/windows/DesktopInputController.h @@ -1,7 +1,7 @@ /* * DesktopInputController.h - declaration of DesktopInputController class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.cpp b/plugins/platform/windows/SasEventListener.cpp index afdfe4b37..b22eb175f 100644 --- a/plugins/platform/windows/SasEventListener.cpp +++ b/plugins/platform/windows/SasEventListener.cpp @@ -1,7 +1,7 @@ /* * SasEventListener.cpp - implementation of SasEventListener class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.h b/plugins/platform/windows/SasEventListener.h index 63e6ac419..b331c30ea 100644 --- a/plugins/platform/windows/SasEventListener.h +++ b/plugins/platform/windows/SasEventListener.h @@ -1,7 +1,7 @@ /* * SasEventListener.h - header file for SasEventListener class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 928f8486d..7340e1b1b 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.cpp - implementation of WindowsCoreFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index c609aef29..5cd533146 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.h - declaration of WindowsCoreFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.cpp b/plugins/platform/windows/WindowsFilesystemFunctions.cpp index 1d1d6c27d..583753f8c 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.cpp +++ b/plugins/platform/windows/WindowsFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.cpp - implementation of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.h b/plugins/platform/windows/WindowsFilesystemFunctions.h index dad4ca12d..0edc0fe87 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.h +++ b/plugins/platform/windows/WindowsFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.h - declaration of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp index a3e7cb4e1..c1ca26cec 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.cpp - implementation of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.h b/plugins/platform/windows/WindowsInputDeviceFunctions.h index 7e98b1b47..482fb145c 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.h +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.h - declaration of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp index 0eaf98994..efd953d86 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h index 8c3d75ea5..e4883ea38 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.cpp b/plugins/platform/windows/WindowsNetworkFunctions.cpp index 4fc343879..61b71ac5e 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.cpp +++ b/plugins/platform/windows/WindowsNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.cpp - implementation of WindowsNetworkFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.h b/plugins/platform/windows/WindowsNetworkFunctions.h index 9136ffb8a..92347ee57 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.h +++ b/plugins/platform/windows/WindowsNetworkFunctions.h @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.h - declaration of WindowsNetworkFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfiguration.h b/plugins/platform/windows/WindowsPlatformConfiguration.h index 4d1671e3a..acf112803 100644 --- a/plugins/platform/windows/WindowsPlatformConfiguration.h +++ b/plugins/platform/windows/WindowsPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfiguration.h - configuration values for WindowsPlatform plugin * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp index 727051883..12c9145b5 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.h b/plugins/platform/windows/WindowsPlatformConfigurationPage.h index 3d6c80b88..31e8ca03c 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.h +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.h - header for the WindowsPlatformConfigurationPage class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.cpp b/plugins/platform/windows/WindowsPlatformPlugin.cpp index 1a8755c36..4e2fbc662 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.cpp +++ b/plugins/platform/windows/WindowsPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.cpp - implementation of WindowsPlatformPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.h b/plugins/platform/windows/WindowsPlatformPlugin.h index 1ebbb0ed3..36cd35586 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.h +++ b/plugins/platform/windows/WindowsPlatformPlugin.h @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.h - declaration of WindowsPlatformPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 4eabc6514..6e766ad0e 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceControl.h - class for managing a Windows service * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.h b/plugins/platform/windows/WindowsServiceControl.h index 5c3d20f59..8161730ba 100644 --- a/plugins/platform/windows/WindowsServiceControl.h +++ b/plugins/platform/windows/WindowsServiceControl.h @@ -1,7 +1,7 @@ /* * WindowsService.h - class for managing a Windows service * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index 3bab5e3be..4f7129ce8 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceCore.cpp - implementation of WindowsServiceCore class * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.h b/plugins/platform/windows/WindowsServiceCore.h index 4bef7b8ec..1773432fa 100644 --- a/plugins/platform/windows/WindowsServiceCore.h +++ b/plugins/platform/windows/WindowsServiceCore.h @@ -1,7 +1,7 @@ /* * WindowsServiceCore.h - header file for WindowsServiceCore class * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.cpp b/plugins/platform/windows/WindowsServiceFunctions.cpp index 4a278468a..d5e732d81 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.cpp +++ b/plugins/platform/windows/WindowsServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.cpp - implementation of WindowsServiceFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.h b/plugins/platform/windows/WindowsServiceFunctions.h index 057195df9..c0642d3fb 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.h +++ b/plugins/platform/windows/WindowsServiceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.h - declaration of WindowsServiceFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index c9700d935..490a24b21 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.cpp - implementation of WindowsSessionFunctions class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index 5dce3144a..2b9e7df62 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.h - declaration of WindowsSessionFunctions class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 6e9fcf15f..b866e986c 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.cpp - implementation of WindowsUserFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index b543da699..1dc693ecc 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.h - declaration of WindowsUserFunctions class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 9d1190b42..96b31fc15 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -1,7 +1,7 @@ /* * WtsSessionManager.cpp - implementation of WtsSessionManager class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index 648f17d98..c974823b1 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -1,7 +1,7 @@ /* * WtsSessionManager.h - header file for WtsSessionManager class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index c6292457e..9f166c3b5 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.cpp - implementation of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.h b/plugins/powercontrol/PowerControlFeaturePlugin.h index f41524c66..7ffcaffd5 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.h +++ b/plugins/powercontrol/PowerControlFeaturePlugin.h @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.h - declaration of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.cpp b/plugins/powercontrol/PowerDownTimeInputDialog.cpp index 512f3f1c6..bb0c6f2cb 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.cpp +++ b/plugins/powercontrol/PowerDownTimeInputDialog.cpp @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - implementation of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.h b/plugins/powercontrol/PowerDownTimeInputDialog.h index 941034fc0..e37f1ddcf 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.h +++ b/plugins/powercontrol/PowerDownTimeInputDialog.h @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - declaration of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index e79da9d59..a62617baa 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.cpp - implementation of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index cbd34d420..bac58f92a 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.h - declaration of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.cpp b/plugins/remoteaccess/RemoteAccessPage.cpp index 493995923..21e997646 100644 --- a/plugins/remoteaccess/RemoteAccessPage.cpp +++ b/plugins/remoteaccess/RemoteAccessPage.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.h b/plugins/remoteaccess/RemoteAccessPage.h index c2f9997b9..c28be5853 100644 --- a/plugins/remoteaccess/RemoteAccessPage.h +++ b/plugins/remoteaccess/RemoteAccessPage.h @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index bfeec9a5a..df1f9f14a 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.cpp - widget containing a VNC-view and controls for it * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index e32d8b706..c0d1e53b4 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.h - widget containing a VNC view and controls for it * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.cpp b/plugins/screenlock/ScreenLockFeaturePlugin.cpp index d2d9c6cbb..e7b1cbaae 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.cpp +++ b/plugins/screenlock/ScreenLockFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.cpp - implementation of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.h b/plugins/screenlock/ScreenLockFeaturePlugin.h index e61b78dd7..17248aba0 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.h +++ b/plugins/screenlock/ScreenLockFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.h - declaration of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.cpp b/plugins/screenshot/ScreenshotFeaturePlugin.cpp index ea357c9dd..6ccfa2514 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.cpp +++ b/plugins/screenshot/ScreenshotFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.cpp - implementation of ScreenshotFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.h b/plugins/screenshot/ScreenshotFeaturePlugin.h index c0bf0a71d..8e927ac21 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.h +++ b/plugins/screenshot/ScreenshotFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.h - declaration of ScreenshotFeature class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotListModel.cpp b/plugins/screenshot/ScreenshotListModel.cpp index cfdc21863..9d28e7446 100644 --- a/plugins/screenshot/ScreenshotListModel.cpp +++ b/plugins/screenshot/ScreenshotListModel.cpp @@ -1,7 +1,7 @@ /* * ScreenshotListModel.cpp - implementation of ScreenshotListModel * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotListModel.h b/plugins/screenshot/ScreenshotListModel.h index 04a71066e..4c118c8a2 100644 --- a/plugins/screenshot/ScreenshotListModel.h +++ b/plugins/screenshot/ScreenshotListModel.h @@ -1,7 +1,7 @@ /* * ScreenshotListModel.h - declaration of ScreenshotListModel * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp index dba93c0c8..937504ab4 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.cpp - implementation of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.h b/plugins/systemusergroups/SystemUserGroupsPlugin.h index 949955459..5395bfdf4 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.h +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.h @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.h - declaration of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.cpp b/plugins/testing/TestingCommandLinePlugin.cpp index 554dbfa95..9c2c759ef 100644 --- a/plugins/testing/TestingCommandLinePlugin.cpp +++ b/plugins/testing/TestingCommandLinePlugin.cpp @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.cpp - implementation of TestingCommandLinePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.h b/plugins/testing/TestingCommandLinePlugin.h index 8e47371e5..753807638 100644 --- a/plugins/testing/TestingCommandLinePlugin.h +++ b/plugins/testing/TestingCommandLinePlugin.h @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.h - declaration of TestingCommandLinePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.cpp b/plugins/textmessage/TextMessageDialog.cpp index 9bd700fd0..e0ac19a32 100644 --- a/plugins/textmessage/TextMessageDialog.cpp +++ b/plugins/textmessage/TextMessageDialog.cpp @@ -1,7 +1,7 @@ /* * TextMessageDialog.cpp - implementation of text message dialog class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.h b/plugins/textmessage/TextMessageDialog.h index 2eec97a00..0299ac792 100644 --- a/plugins/textmessage/TextMessageDialog.h +++ b/plugins/textmessage/TextMessageDialog.h @@ -1,7 +1,7 @@ /* * TextMessageDialog.h - declaration of text message dialog class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.cpp b/plugins/textmessage/TextMessageFeaturePlugin.cpp index 706275e06..0f8315d76 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.cpp +++ b/plugins/textmessage/TextMessageFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.cpp - implementation of TextMessageFeaturePlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.h b/plugins/textmessage/TextMessageFeaturePlugin.h index 1dbd0f721..bf97a41a1 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.h +++ b/plugins/textmessage/TextMessageFeaturePlugin.h @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.h - declaration of TextMessageFeature class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.cpp b/plugins/usersessioncontrol/UserLoginDialog.cpp index eca9984d6..aec8142d9 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.cpp +++ b/plugins/usersessioncontrol/UserLoginDialog.cpp @@ -1,7 +1,7 @@ /* * UserLoginDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.h b/plugins/usersessioncontrol/UserLoginDialog.h index 8ebb98fd5..eba6920a5 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.h +++ b/plugins/usersessioncontrol/UserLoginDialog.h @@ -1,7 +1,7 @@ /* * UserLoginDialog.h - dialog for querying logon credentials * - * Copyright (c) 2019-2021 Tobias Junghans + * Copyright (c) 2019-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp index b40670c5e..1eba45e44 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.cpp - implementation of UserSessionControlPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.h b/plugins/usersessioncontrol/UserSessionControlPlugin.h index 324ab4d73..d598a63b3 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.h +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.h @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.h - declaration of UserSessionControlPlugin class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.cpp b/plugins/vncserver/external/ExternalVncServer.cpp index 4de805e0a..36cce8ea2 100644 --- a/plugins/vncserver/external/ExternalVncServer.cpp +++ b/plugins/vncserver/external/ExternalVncServer.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServer.cpp - implementation of ExternalVncServer class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.h b/plugins/vncserver/external/ExternalVncServer.h index 39dcbaa52..f3888ee74 100644 --- a/plugins/vncserver/external/ExternalVncServer.h +++ b/plugins/vncserver/external/ExternalVncServer.h @@ -1,7 +1,7 @@ /* * ExternalVncServer.h - declaration of ExternalVncServer class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfiguration.h b/plugins/vncserver/external/ExternalVncServerConfiguration.h index 898d30a0b..08454b66a 100644 --- a/plugins/vncserver/external/ExternalVncServerConfiguration.h +++ b/plugins/vncserver/external/ExternalVncServerConfiguration.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfiguration.h - configuration values for external VNC server * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp index 1b2672c82..062391224 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - implementation of the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h index d218ec513..d6894ccb6 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - header for the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncConfiguration.h b/plugins/vncserver/headless/HeadlessVncConfiguration.h index e8e175c2b..e8117b77f 100644 --- a/plugins/vncserver/headless/HeadlessVncConfiguration.h +++ b/plugins/vncserver/headless/HeadlessVncConfiguration.h @@ -1,7 +1,7 @@ /* * HeadlessVncConfiguration.h - headless VNC server specific configuration values * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp index 061b964c2..20c44a300 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.cpp +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -1,7 +1,7 @@ /* * HeadlessVncServer.cpp - implementation of HeadlessVncServer class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.h b/plugins/vncserver/headless/HeadlessVncServer.h index b00c3b3e7..f24799973 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.h +++ b/plugins/vncserver/headless/HeadlessVncServer.h @@ -1,7 +1,7 @@ /* * HeadlessVncServer.h - declaration of HeadlessVncServer class * - * Copyright (c) 2020-2021 Tobias Junghans + * Copyright (c) 2020-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp index 122b96aa5..76cf69949 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.cpp - implementation of BuiltinUltraVncServer class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h index fc3d2ced7..209157589 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.h - declaration of BuiltinUltraVncServer class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp index e81b737da..fc26d3816 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp @@ -1,7 +1,7 @@ /* * LogoffEventFilter.cpp - implementation of LogoffEventFilter class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h index 48437b572..b223c90bc 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h @@ -1,7 +1,7 @@ /* * LogoffEventFilter.h - declaration of LogoffEventFilter class * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h index 5fcec5e1c..a1a9f15d9 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h @@ -1,7 +1,7 @@ /* * UltraVncConfiguration.h - UltraVNC-specific configuration values * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp index ab826d2c5..c3235583a 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - implementation of the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h index e71a2bed0..573169bee 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - header for the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/vncntlm.cpp b/plugins/vncserver/ultravnc-builtin/vncntlm.cpp index 77b9add26..bb35a88c2 100644 --- a/plugins/vncserver/ultravnc-builtin/vncntlm.cpp +++ b/plugins/vncserver/ultravnc-builtin/vncntlm.cpp @@ -1,7 +1,7 @@ /* * vncntlm.cpp - dummy implementation of vncntlm module * - * Copyright (c) 2016-2021 Tobias Junghans + * Copyright (c) 2016-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index 4ffed40f1..e867c16b4 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.cpp - implementation of BuiltinX11VncServer class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h index 228fdab2c..7153a2703 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.h - declaration of BuiltinX11VncServer class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h index 6dd27e6ac..62f29fcba 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h @@ -1,7 +1,7 @@ /* * X11VncConfiguration.h - x11vnc-specific configuration values * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp index 40321d1eb..3c06864d1 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - implementation of the X11VncConfigurationWidget class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h index 3aac28126..5c4436416 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - header for the X11VncConfigurationWidget class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/project.yml b/project.yml index d2ddb0326..96786f6dd 100644 --- a/project.yml +++ b/project.yml @@ -1,7 +1,7 @@ project: name: Veyon version: 4.99.0 - copyright: 2004-2021 + copyright: 2004-2022 author: Tobias Junghans contact: Tobias Junghans contributors: diff --git a/server/src/ComputerControlClient.cpp b/server/src/ComputerControlClient.cpp index a9308472c..8405d3321 100644 --- a/server/src/ComputerControlClient.cpp +++ b/server/src/ComputerControlClient.cpp @@ -1,7 +1,7 @@ /* * ComputerControlClient.cpp - implementation of the ComputerControlClient class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlClient.h b/server/src/ComputerControlClient.h index 4b387030e..4eaf7571d 100644 --- a/server/src/ComputerControlClient.h +++ b/server/src/ComputerControlClient.h @@ -1,7 +1,7 @@ /* * ComputerControlClient.h - header file for the ComputerControlClient class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 221f4d0f8..94a1a28cf 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -1,7 +1,7 @@ /* * ComputerControlServer.cpp - implementation of ComputerControlServer * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index 188a50b60..3c6c006e7 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -1,7 +1,7 @@ /* * ComputerControlServer.h - header file for ComputerControlServer * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index 59ab0bbe2..f4b517b08 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.cpp - implementation of ServerAccessControlManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.h b/server/src/ServerAccessControlManager.h index 4b11ac788..9cf8cd096 100644 --- a/server/src/ServerAccessControlManager.h +++ b/server/src/ServerAccessControlManager.h @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.h - header file for ServerAccessControlManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.cpp b/server/src/ServerAuthenticationManager.cpp index 1f3f90866..5725a22c7 100644 --- a/server/src/ServerAuthenticationManager.cpp +++ b/server/src/ServerAuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.cpp - implementation of ServerAuthenticationManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.h b/server/src/ServerAuthenticationManager.h index 6614a0b1b..91a4f6c5a 100644 --- a/server/src/ServerAuthenticationManager.h +++ b/server/src/ServerAuthenticationManager.h @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.h - header file for ServerAuthenticationManager * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/TlsServer.cpp b/server/src/TlsServer.cpp index e500d4163..1efe0dddb 100644 --- a/server/src/TlsServer.cpp +++ b/server/src/TlsServer.cpp @@ -1,7 +1,7 @@ /* * TlsServer.cpp - header file for TlsServer * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/TlsServer.h b/server/src/TlsServer.h index db12d6f4d..e03af4762 100644 --- a/server/src/TlsServer.h +++ b/server/src/TlsServer.h @@ -1,7 +1,7 @@ /* * TlsServer.h - header file for TlsServer * - * Copyright (c) 2021 Tobias Junghans + * Copyright (c) 2021-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.cpp b/server/src/VeyonServerProtocol.cpp index f0a6c01ae..92c84b071 100644 --- a/server/src/VeyonServerProtocol.cpp +++ b/server/src/VeyonServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.cpp - implementation of the VeyonServerProtocol class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.h b/server/src/VeyonServerProtocol.h index 14bee227e..46d767381 100644 --- a/server/src/VeyonServerProtocol.h +++ b/server/src/VeyonServerProtocol.h @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.h - header file for the VeyonServerProtocol class * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.cpp b/server/src/VncProxyConnection.cpp index 41ef8d213..068a2c6c8 100644 --- a/server/src/VncProxyConnection.cpp +++ b/server/src/VncProxyConnection.cpp @@ -1,7 +1,7 @@ /* * VncProxyConnection.cpp - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.h b/server/src/VncProxyConnection.h index 97b36c2b9..da7b1462c 100644 --- a/server/src/VncProxyConnection.h +++ b/server/src/VncProxyConnection.h @@ -1,7 +1,7 @@ /* * VncProxyConnection.h - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnectionFactory.h b/server/src/VncProxyConnectionFactory.h index efcfc3420..9edb5db53 100644 --- a/server/src/VncProxyConnectionFactory.h +++ b/server/src/VncProxyConnectionFactory.h @@ -1,7 +1,7 @@ /* * VncProxyConnectionFactory.h - abstract factory class for VncProxyConnectionFactory objects * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.cpp b/server/src/VncProxyServer.cpp index 90488eecf..109c7a910 100644 --- a/server/src/VncProxyServer.cpp +++ b/server/src/VncProxyServer.cpp @@ -1,7 +1,7 @@ /* * VncProxyServer.cpp - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.h b/server/src/VncProxyServer.h index 3c4eaa0f4..f5d8fbc70 100644 --- a/server/src/VncProxyServer.h +++ b/server/src/VncProxyServer.h @@ -1,7 +1,7 @@ /* * VncProxyServer.h - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.cpp b/server/src/VncServer.cpp index ae78e0f78..1941c26b0 100644 --- a/server/src/VncServer.cpp +++ b/server/src/VncServer.cpp @@ -2,7 +2,7 @@ * VncServer.cpp - implementation of VncServer, a VNC-server- * abstraction for platform independent VNC-server-usage * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.h b/server/src/VncServer.h index 78e2d3cd3..42fcba751 100644 --- a/server/src/VncServer.h +++ b/server/src/VncServer.h @@ -2,7 +2,7 @@ * VncServer.h - class VncServer, a VNC server abstraction for * platform-independent VNC server usage * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/main.cpp b/server/src/main.cpp index 78860c670..83bbe6732 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Server * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/veyon-server.rc.in b/server/veyon-server.rc.in index b362f4ab8..24d3da4d7 100644 --- a/server/veyon-server.rc.in +++ b/server/veyon-server.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Server\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-server.exe\0" END END diff --git a/service/src/main.cpp b/service/src/main.cpp index d4a55cbbd..4b0e6ffa7 100644 --- a/service/src/main.cpp +++ b/service/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Service * - * Copyright (c) 2006-2021 Tobias Junghans + * Copyright (c) 2006-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/service/veyon-service.rc.in b/service/veyon-service.rc.in index 3feb0e3e5..a35dd891b 100644 --- a/service/veyon-service.rc.in +++ b/service/veyon-service.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Service\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-service.exe\0" END END diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index c90f7729e..a68517d6d 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.cpp - class which handles communication between service and feature * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/FeatureWorkerManagerConnection.h b/worker/src/FeatureWorkerManagerConnection.h index 852c0d8d2..ce003f7c5 100644 --- a/worker/src/FeatureWorkerManagerConnection.h +++ b/worker/src/FeatureWorkerManagerConnection.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.h - class which handles communication between worker manager and worker * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.cpp b/worker/src/VeyonWorker.cpp index d65e32feb..b5aea2125 100644 --- a/worker/src/VeyonWorker.cpp +++ b/worker/src/VeyonWorker.cpp @@ -1,7 +1,7 @@ /* * VeyonWorker.cpp - basic implementation of Veyon Worker * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.h b/worker/src/VeyonWorker.h index e00bcf61b..854543fa1 100644 --- a/worker/src/VeyonWorker.h +++ b/worker/src/VeyonWorker.h @@ -1,7 +1,7 @@ /* * VeyonWorker.h - basic implementation of Veyon Worker * - * Copyright (c) 2018-2021 Tobias Junghans + * Copyright (c) 2018-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/main.cpp b/worker/src/main.cpp index 8bb1e51ac..79df78b45 100644 --- a/worker/src/main.cpp +++ b/worker/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Feature Worker * - * Copyright (c) 2017-2021 Tobias Junghans + * Copyright (c) 2017-2022 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/veyon-worker.rc.in b/worker/veyon-worker.rc.in index 53c32db1f..da00ab58a 100644 --- a/worker/veyon-worker.rc.in +++ b/worker/veyon-worker.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2021 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-worker.exe\0" END END From e1dd333251abc19200258260f9a0716fa655a857 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Jan 2022 14:16:26 +0100 Subject: [PATCH 1311/1765] AccessControlPage: abort test on empty input --- configurator/src/AccessControlPage.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index 9d0d558e2..7e92008d7 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -252,8 +252,13 @@ void AccessControlPage::moveAccessControlRuleUp() void AccessControlPage::testUserGroupsAccessControl() { - QString username = QInputDialog::getText( this, tr( "Enter username" ), - tr( "Please enter a user login name whose access permissions to test:" ) ); + const auto username = QInputDialog::getText( this, tr( "Enter username" ), + tr( "Please enter a user login name whose access permissions to test:" ) ); + + if (username.isEmpty()) + { + return; + } if( AccessControlProvider().processAuthorizedGroups( username ) ) { From b8f833264293d9bee1bfebbc88b0a7fc91aa1ab2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Jan 2022 15:22:47 +0100 Subject: [PATCH 1312/1765] LdapConfiguration: add queryTimeout property --- plugins/ldap/common/LdapClient.h | 2 + plugins/ldap/common/LdapConfiguration.h | 1 + plugins/ldap/common/LdapConfigurationPage.cpp | 2 + plugins/ldap/common/LdapConfigurationPage.ui | 65 ++++++++++++------- 4 files changed, 48 insertions(+), 22 deletions(-) diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index 9476da0b6..8e8ee302e 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -126,6 +126,8 @@ class LDAP_COMMON_EXPORT LdapClient : public QObject return QStringLiteral("cn"); } + static constexpr int DefaultQueryTimeout = 3000; + private: static constexpr int LdapQueryTimeout = 3000; static constexpr int LdapConnectionTimeout = 60*1000; diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index d3381f143..83b88f7eb 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -40,6 +40,7 @@ OP( LdapConfiguration, m_configuration, QString, bindDn, setBindDn, "BindDN", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, Configuration::Password, bindPassword, setBindPassword, "BindPassword", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, bool, queryNamingContext, setQueryNamingContext, "QueryNamingContext", "LDAP", false, Configuration::Property::Flag::Standard ) \ + OP( LdapConfiguration, m_configuration, int, queryTimeout, setQueryTimeout, "QueryTimeout", "LDAP", LdapClient::DefaultQueryTimeout, Configuration::Property::Flag::Advanced ) \ OP( LdapConfiguration, m_configuration, QString, baseDn, setBaseDn, "BaseDN", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, namingContextAttribute, setNamingContextAttribute, "NamingContextAttribute", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, userTree, setUserTree, "UserTree", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ diff --git a/plugins/ldap/common/LdapConfigurationPage.cpp b/plugins/ldap/common/LdapConfigurationPage.cpp index f9c758a19..f643963c7 100644 --- a/plugins/ldap/common/LdapConfigurationPage.cpp +++ b/plugins/ldap/common/LdapConfigurationPage.cpp @@ -42,6 +42,8 @@ LdapConfigurationPage::LdapConfigurationPage( LdapConfiguration& configuration, { ui->setupUi(this); + Configuration::UiMapping::setFlags(ui->queryTimeoutLabel, Configuration::Property::Flag::Advanced); + #define CONNECT_BUTTON_SLOT(name) connect( ui->name, &QPushButton::clicked, this, &LdapConfigurationPage::name ); connect( ui->browseBaseDn, &QPushButton::clicked, this, &LdapConfigurationPage::browseBaseDn ); diff --git a/plugins/ldap/common/LdapConfigurationPage.ui b/plugins/ldap/common/LdapConfigurationPage.ui index 351628346..a2b88c35e 100644 --- a/plugins/ldap/common/LdapConfigurationPage.ui +++ b/plugins/ldap/common/LdapConfigurationPage.ui @@ -94,33 +94,30 @@ - - + + - Bind DN + Query timeout - - - - 65536 - - - 389 + + + + + + + false - - + + - Bind password + Bind DN - - - @@ -131,6 +128,19 @@ + + + + ms + + + 500 + + + 60000 + + + @@ -138,10 +148,20 @@ - - - - false + + + + 65536 + + + 389 + + + + + + + Bind password @@ -1046,6 +1066,7 @@ testBind bindDn bindPassword + queryTimeout connectionSecurity tlsVerifyMode tlsCACertificateFile @@ -1392,9 +1413,9 @@ - - + + From 24bee70caa910fca1302b18caf6d889c9ddf7a7c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Jan 2022 15:24:50 +0100 Subject: [PATCH 1313/1765] LdapClient: use configured query timeout --- plugins/ldap/common/LdapClient.cpp | 11 ++++++----- plugins/ldap/common/LdapClient.h | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/plugins/ldap/common/LdapClient.cpp b/plugins/ldap/common/LdapClient.cpp index 5471f2c09..047183f9f 100644 --- a/plugins/ldap/common/LdapClient.cpp +++ b/plugins/ldap/common/LdapClient.cpp @@ -51,7 +51,8 @@ LdapClient::LdapClient( const LdapConfiguration& configuration, const QUrl& url, m_configuration( configuration ), m_server( new KLDAP::LdapServer ), m_connection( new KLDAP::LdapConnection ), - m_operation( new KLDAP::LdapOperation ) + m_operation( new KLDAP::LdapOperation ), + m_queryTimeout(m_configuration.queryTimeout()) { connectAndBind( url ); } @@ -130,7 +131,7 @@ LdapClient::Objects LdapClient::queryObjects( const QString& dn, const QStringLi auto isFirstResult = true; - while( ( result = m_operation->waitForResult( id, LdapQueryTimeout ) ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) + while( ( result = m_operation->waitForResult( id, m_queryTimeout ) ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) { if( isFirstResult ) { @@ -221,7 +222,7 @@ QStringList LdapClient::queryAttributeValues( const QString& dn, const QString& bool isFirstResult = true; QString realAttributeName = attribute.toLower(); - while( ( result = m_operation->waitForResult( id, LdapQueryTimeout ) ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) + while( ( result = m_operation->waitForResult( id, m_queryTimeout ) ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) { if( isFirstResult ) { @@ -293,7 +294,7 @@ QStringList LdapClient::queryDistinguishedNames( const QString& dn, const QStrin if( id != -1 ) { - while( ( result = m_operation->waitForResult( id, LdapQueryTimeout ) ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) + while( ( result = m_operation->waitForResult( id, m_queryTimeout ) ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) { distinguishedNames += m_operation->object().dn().toString(); } @@ -344,7 +345,7 @@ QStringList LdapClient::queryObjectAttributes( const QString& dn ) return {}; } - if( m_operation->waitForResult( id, LdapQueryTimeout ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) + if( m_operation->waitForResult( id, m_queryTimeout ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) { const auto keys = m_operation->object().attributes().keys(); vDebug() << "results" << keys; diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index 8e8ee302e..3447b851f 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -129,7 +129,6 @@ class LDAP_COMMON_EXPORT LdapClient : public QObject static constexpr int DefaultQueryTimeout = 3000; private: - static constexpr int LdapQueryTimeout = 3000; static constexpr int LdapConnectionTimeout = 60*1000; static constexpr auto LdapLibraryDebugAny = -1; @@ -157,4 +156,6 @@ class LDAP_COMMON_EXPORT LdapClient : public QObject QString m_baseDn; QString m_namingContextAttribute; + const int m_queryTimeout{DefaultQueryTimeout}; + }; From 8931b67ede5aeb6a84603c93946384f65a96ea3e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Jan 2022 15:25:29 +0100 Subject: [PATCH 1314/1765] LdapClient: drop unused constant --- plugins/ldap/common/LdapClient.h | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index 3447b851f..773a85674 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -129,7 +129,6 @@ class LDAP_COMMON_EXPORT LdapClient : public QObject static constexpr int DefaultQueryTimeout = 3000; private: - static constexpr int LdapConnectionTimeout = 60*1000; static constexpr auto LdapLibraryDebugAny = -1; bool reconnect(); From 0fb04ecd06592d322203514a4a7af18d603242af Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 Jan 2022 20:36:09 +0100 Subject: [PATCH 1315/1765] SystemTrayIcon: add overlay icon support This allows setting an overlay icon e.g. for indicating certain special states or active features. --- core/src/SystemTrayIcon.cpp | 46 +++++++++++++++++++++++++++++++++---- core/src/SystemTrayIcon.h | 14 +++++++++-- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index 62c35a477..1208ea951 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -23,6 +23,8 @@ */ #include +#include +#include #include #include "SystemTrayIcon.h" @@ -70,6 +72,16 @@ void SystemTrayIcon::showMessage( const QString& messageTitle, +void SystemTrayIcon::setOverlay(const ComputerControlInterfaceList& computerControlInterfaces, + const QString &iconUrl) +{ + sendFeatureMessage(FeatureMessage{m_systemTrayIconFeature.uid(), SetOverlayIcon} + .addArgument(Argument::OverlayIconUrl, iconUrl), + computerControlInterfaces); +} + + + bool SystemTrayIcon::handleFeatureMessage( VeyonServerInterface& server, const MessageContext& messageContext, const FeatureMessage& message ) @@ -101,12 +113,8 @@ bool SystemTrayIcon::handleFeatureMessage( VeyonWorkerInterface& worker, const F { m_systemTrayIcon = new QSystemTrayIcon( this ); - QIcon icon( QStringLiteral( ":/core/icon16.png" ) ); - icon.addFile( QStringLiteral( ":/core/icon22.png" ) ); - icon.addFile( QStringLiteral( ":/core/icon32.png" ) ); - icon.addFile( QStringLiteral( ":/core/icon64.png" ) ); + updateIcon(); - m_systemTrayIcon->setIcon( icon ); m_systemTrayIcon->show(); } @@ -133,9 +141,37 @@ bool SystemTrayIcon::handleFeatureMessage( VeyonWorkerInterface& worker, const F } return true; + case SetOverlayIcon: + updateIcon(message.argument(Argument::OverlayIconUrl).toString()); + return true; + default: break; } return false; } + + + +void SystemTrayIcon::updateIcon(const QString& overlayIconUrl) +{ + if (m_systemTrayIcon) + { + QImage overlayIcon(overlayIconUrl); + QIcon icon; + + for(auto size : {16, 22, 32, 64}) + { + QPixmap pixmap(QStringLiteral(":/core/icon%1.png").arg(size)); + if (overlayIcon.isNull() == false) + { + QPainter painter(&pixmap); + painter.drawImage(0, 0, overlayIcon.scaled(pixmap.size())); + } + icon.addPixmap(pixmap); + } + + m_systemTrayIcon->setIcon(icon); + } +} diff --git a/core/src/SystemTrayIcon.h b/core/src/SystemTrayIcon.h index 8f64f2f47..043061215 100644 --- a/core/src/SystemTrayIcon.h +++ b/core/src/SystemTrayIcon.h @@ -38,7 +38,8 @@ class VEYON_CORE_EXPORT SystemTrayIcon : public QObject, public FeatureProviderI { ToolTipText, MessageTitle, - MessageText + MessageText, + OverlayIconUrl }; Q_ENUM(Argument) @@ -52,6 +53,12 @@ class VEYON_CORE_EXPORT SystemTrayIcon : public QObject, public FeatureProviderI const QString& messageText, FeatureWorkerManager& featureWorkerManager ); + void setOverlay(const ComputerControlInterfaceList& computerControlInterfaces, const QString& iconUrl); + void clearOverlay(const ComputerControlInterfaceList& computerControlInterfaces) + { + setOverlay(computerControlInterfaces, {}); + } + Plugin::Uid uid() const override { return Plugin::Uid { QStringLiteral("3cb1adb1-6b4d-4934-a641-db767df83eea") }; @@ -105,10 +112,13 @@ class VEYON_CORE_EXPORT SystemTrayIcon : public QObject, public FeatureProviderI bool handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) override; private: + void updateIcon(const QString& overlayIconUrl = {}); + enum Commands { SetToolTipCommand, - ShowMessageCommand + ShowMessageCommand, + SetOverlayIcon }; const Feature m_systemTrayIconFeature; From e59a0f80c5b90b10e895b40a58023f26f828a027 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 Jan 2022 20:36:56 +0100 Subject: [PATCH 1316/1765] SystemTrayIcon: add showMessage() overload for CCIL This allows feature plugins to show messages on remote computers. --- core/src/SystemTrayIcon.cpp | 11 +++++++++++ core/src/SystemTrayIcon.h | 3 +++ 2 files changed, 14 insertions(+) diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index 1208ea951..770bc38c4 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -72,6 +72,17 @@ void SystemTrayIcon::showMessage( const QString& messageTitle, +void SystemTrayIcon::showMessage(const ComputerControlInterfaceList &computerControlInterfaces, + const QString& messageTitle, const QString& messageText) +{ + sendFeatureMessage(FeatureMessage{m_systemTrayIconFeature.uid(), ShowMessageCommand} + .addArgument(Argument::MessageTitle, messageTitle) + .addArgument(Argument::MessageText, messageText), + computerControlInterfaces); +} + + + void SystemTrayIcon::setOverlay(const ComputerControlInterfaceList& computerControlInterfaces, const QString &iconUrl) { diff --git a/core/src/SystemTrayIcon.h b/core/src/SystemTrayIcon.h index 043061215..1feb9c5b0 100644 --- a/core/src/SystemTrayIcon.h +++ b/core/src/SystemTrayIcon.h @@ -53,6 +53,9 @@ class VEYON_CORE_EXPORT SystemTrayIcon : public QObject, public FeatureProviderI const QString& messageText, FeatureWorkerManager& featureWorkerManager ); + void showMessage(const ComputerControlInterfaceList& computerControlInterfaces, + const QString& messageTitle, const QString& messageText); + void setOverlay(const ComputerControlInterfaceList& computerControlInterfaces, const QString& iconUrl); void clearOverlay(const ComputerControlInterfaceList& computerControlInterfaces) { From 8836d44a858287549501107a3dd18811158e4715 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 24 Jan 2022 10:00:06 +0100 Subject: [PATCH 1317/1765] CMake: CPackDefinitions: fix deb description with CMake < 3.16 Older versions of CMake rely on a properly formatted Debian package description (i.e. summary in first line and indented description) so use the summary only for old Debian-based distributions. Closes #785. --- cmake/CPackDefinitions.cmake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmake/CPackDefinitions.cmake b/cmake/CPackDefinitions.cmake index fa1004f9e..769f0e422 100644 --- a/cmake/CPackDefinitions.cmake +++ b/cmake/CPackDefinitions.cmake @@ -29,7 +29,8 @@ set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_SOURCE_DIR}/build/;${CMAKE_SOURCE_DIR}/.g set(CPACK_STRIP_FILES TRUE) # DEB package -set(CPACK_DEBIAN_PACKAGE_DESCRIPTION +if(${CMAKE_VERSION} VERSION_GREATER "3.15.0") + set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "Veyon is a free and open source software for monitoring and controlling computers across multiple platforms. Veyon supports you in teaching in digital learning environments, performing virtual trainings or giving remote support. @@ -46,6 +47,8 @@ The following features are available in Veyon: * Programs & websites: launch programs and open website URLs remotely * Teaching material: distribute and open documents, images and videos easily * Administration: power on/off and reboot computers remotely") +endif() + set(CPACK_DEBIAN_PACKAGE_SECTION "Education") set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqca-qt5-2-plugins, qml-module-qtquick2, qml-module-qtquick-dialogs, qml-module-qtquick-layouts, qml-module-qtqml-models2, qml-module-qtquick-controls2, qml-module-qtquick-window2") set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) From 9a77106de2edf6a03b4296d1bb1582b7205dc8a9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 24 Jan 2022 10:39:45 +0100 Subject: [PATCH 1318/1765] Master: update splash for 2022 --- master/resources/splash.png | Bin 5466 -> 5500 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/master/resources/splash.png b/master/resources/splash.png index 03b957ef3ae2df31612a7ecf65b2161c48377277..860f22f455f8366914b5774669c0f29e64b04b6b 100644 GIT binary patch literal 5500 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 VzVc`)`Sh|BprfUCvs4oq@;^>D_n`m) literal 5466 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 Date: Mon, 24 Jan 2022 14:17:23 +0100 Subject: [PATCH 1319/1765] CI: install FFmpeg development packages --- .ci/linux.centos.7.9/Dockerfile | 2 ++ .ci/linux.centos.8.4/Dockerfile | 4 +++- .ci/linux.debian.bullseye/Dockerfile | 1 + .ci/linux.debian.buster/Dockerfile | 1 + .ci/linux.fedora.34/Dockerfile | 2 ++ .ci/linux.fedora.35/Dockerfile | 2 ++ .ci/linux.opensuse.15.2/Dockerfile | 1 + .ci/linux.opensuse.15.3/Dockerfile | 1 + .ci/linux.ubuntu.bionic/Dockerfile | 1 + .ci/linux.ubuntu.focal/Dockerfile | 1 + 10 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.ci/linux.centos.7.9/Dockerfile b/.ci/linux.centos.7.9/Dockerfile index 9ec3f4ce4..9d5644c38 100644 --- a/.ci/linux.centos.7.9/Dockerfile +++ b/.ci/linux.centos.7.9/Dockerfile @@ -3,6 +3,7 @@ MAINTAINER Tobias Junghans RUN \ yum --enablerepo=extras install -y epel-release && \ + yum install -y https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm && \ yum install -y centos-release-scl && \ yum install -y git devtoolset-7 ninja-build cmake3 rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebkit-devel \ @@ -16,6 +17,7 @@ RUN \ procps-devel \ lzo-devel \ qca-qt5-devel qca-qt5-ossl \ + ffmpeg-devel \ cyrus-sasl-devel \ openldap-devel && \ ln -s /usr/bin/cmake3 /usr/bin/cmake diff --git a/.ci/linux.centos.8.4/Dockerfile b/.ci/linux.centos.8.4/Dockerfile index 11d04a04b..463992a22 100644 --- a/.ci/linux.centos.8.4/Dockerfile +++ b/.ci/linux.centos.8.4/Dockerfile @@ -3,8 +3,9 @@ MAINTAINER Tobias Junghans RUN \ yum --enablerepo=extras install -y epel-release dnf-plugins-core && \ + yum install -y https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm && \ yum config-manager --set-enabled powertools && \ - dnf install -y https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm && \ + dnf install -y https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-2.el8.noarch.rpm && \ yum install -y git gcc-c++ make ninja-build cmake rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ kf5-kitemmodels-devel \ @@ -18,5 +19,6 @@ RUN \ procps-ng-devel \ lzo-devel \ qca-qt5-devel qca-qt5-ossl \ + ffmpeg-devel \ cyrus-sasl-devel \ openldap-devel diff --git a/.ci/linux.debian.bullseye/Dockerfile b/.ci/linux.debian.bullseye/Dockerfile index 61a70bfab..bba1e9d33 100644 --- a/.ci/linux.debian.bullseye/Dockerfile +++ b/.ci/linux.debian.bullseye/Dockerfile @@ -18,6 +18,7 @@ RUN \ libldap2-dev \ libsasl2-dev \ libqca-qt5-2-dev libqca-qt5-2-plugins \ + libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.debian.buster/Dockerfile b/.ci/linux.debian.buster/Dockerfile index 21a8ca93f..7ce6eb648 100644 --- a/.ci/linux.debian.buster/Dockerfile +++ b/.ci/linux.debian.buster/Dockerfile @@ -21,6 +21,7 @@ RUN \ libpng-dev \ liblzo2-dev \ libqca-qt5-2-dev libqca-qt5-2-plugins \ + libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.fedora.34/Dockerfile b/.ci/linux.fedora.34/Dockerfile index 1f0cc8090..f71cb9781 100644 --- a/.ci/linux.fedora.34/Dockerfile +++ b/.ci/linux.fedora.34/Dockerfile @@ -2,6 +2,7 @@ FROM fedora:34 MAINTAINER Tobias Junghans RUN \ + dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-34.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ @@ -14,5 +15,6 @@ RUN \ pam-devel \ procps-devel \ qca-qt5-devel qca-qt5-ossl \ + ffmpeg-devel \ cyrus-sasl-devel \ openldap-devel diff --git a/.ci/linux.fedora.35/Dockerfile b/.ci/linux.fedora.35/Dockerfile index dcbcc854f..71688e891 100644 --- a/.ci/linux.fedora.35/Dockerfile +++ b/.ci/linux.fedora.35/Dockerfile @@ -2,6 +2,7 @@ FROM fedora:35 MAINTAINER Tobias Junghans RUN \ + dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-35.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ @@ -14,5 +15,6 @@ RUN \ pam-devel \ procps-devel \ qca-qt5-devel qca-qt5-ossl \ + ffmpeg-devel \ cyrus-sasl-devel \ openldap-devel diff --git a/.ci/linux.opensuse.15.2/Dockerfile b/.ci/linux.opensuse.15.2/Dockerfile index 864425dc6..2a3de179f 100644 --- a/.ci/linux.opensuse.15.2/Dockerfile +++ b/.ci/linux.opensuse.15.2/Dockerfile @@ -14,6 +14,7 @@ RUN \ procps-devel \ pam-devel lzo-devel \ libqca-qt5-devel libqca-qt5-plugins \ + libavcodec-devel libavformat-devel libavutil-devel libswscale-devel \ cyrus-sasl-devel \ openldap2-devel diff --git a/.ci/linux.opensuse.15.3/Dockerfile b/.ci/linux.opensuse.15.3/Dockerfile index 2b8d06651..7cbefaa7f 100644 --- a/.ci/linux.opensuse.15.3/Dockerfile +++ b/.ci/linux.opensuse.15.3/Dockerfile @@ -14,6 +14,7 @@ RUN \ procps-devel \ pam-devel lzo-devel \ libqca-qt5-devel libqca-qt5-plugins \ + libavcodec-devel libavformat-devel libavutil-devel libswscale-devel \ cyrus-sasl-devel \ openldap2-devel diff --git a/.ci/linux.ubuntu.bionic/Dockerfile b/.ci/linux.ubuntu.bionic/Dockerfile index 4a1ca76e8..fe5334acb 100644 --- a/.ci/linux.ubuntu.bionic/Dockerfile +++ b/.ci/linux.ubuntu.bionic/Dockerfile @@ -19,6 +19,7 @@ RUN \ libpng-dev \ liblzo2-dev \ libqca-qt5-2-dev libqca-qt5-2-plugins \ + libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.ubuntu.focal/Dockerfile b/.ci/linux.ubuntu.focal/Dockerfile index ca4f40f35..1261657fe 100644 --- a/.ci/linux.ubuntu.focal/Dockerfile +++ b/.ci/linux.ubuntu.focal/Dockerfile @@ -20,6 +20,7 @@ RUN \ libpng-dev \ liblzo2-dev \ libqca-qt5-2-dev libqca-qt5-2-plugins \ + libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* From 8019972af51f6365375f795b6b7fa4e1d0c7ef51 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 25 Jan 2022 13:45:53 +0100 Subject: [PATCH 1320/1765] AuthKeys: use file name only to determine key name If the file is not located in the working directory of the application, it contains a path which we do not want to include in the key name. --- plugins/authkeys/AuthKeysManager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index ef1a91db5..7c530399a 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -470,7 +470,8 @@ QString AuthKeysManager::exportedKeyFileName( const QString& name, const QString QString AuthKeysManager::keyNameFromExportedKeyFile( const QString& keyFile ) { - const auto keyNameMatch = QRegularExpression( QStringLiteral("^(.*)_(.*)_key.pem$") ).match( keyFile ); + const auto keyNameMatch = QRegularExpression( QStringLiteral("^(.*)_(.*)_key.pem$") ) + .match(QFileInfo(keyFile).fileName()); if( keyNameMatch.hasMatch() ) { From 07d0ef2fc0d34218418b611dc8136a1ebfefc549 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Dec 2021 09:08:46 +0100 Subject: [PATCH 1321/1765] 3rdparty: qthttpserver: switch and update submodule Switch to our own repository for the qthttpserver submodule which allows us to incorporate additional updates (here: http-parser 2.9.4+). (cherry picked from commit d11c8b4a71914679748ac2d3ff9523932fe2e630) --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 51ec629c1..e3bf84dc0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -16,7 +16,7 @@ branch = master [submodule "3rdparty/qthttpserver"] path = 3rdparty/qthttpserver - url = https://code.qt.io/qt-labs/qthttpserver.git + url = https://github.com/veyon/qthttpserver.git [submodule "3rdparty/kldap-qt-compat"] path = 3rdparty/kldap-qt-compat url = https://invent.kde.org/pim/kldap.git From b1a1f291f7fb389e9aee5e68dddf0d93a7834e81 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 16 Feb 2022 13:48:36 +0100 Subject: [PATCH 1322/1765] VncViewWidget: limit size hint to available size If the framebuffer to display is larger than the available size (i.e. screen size excluding taskbar, system menus and window frame), parts of the VncViewWidget or its parent widgets are not usable without moving the window. Therefore limit the size hint accordingly. Closes #336. --- core/src/VncViewWidget.cpp | 42 +++++++++++++-------- plugins/remoteaccess/RemoteAccessWidget.cpp | 7 ++-- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index a91390220..cea31fc73 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -25,13 +25,8 @@ #include #include #include -#include - -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) #include -#else -#include -#endif +#include #include "VeyonConnection.h" #include "VncConnection.h" @@ -68,14 +63,6 @@ VncViewWidget::VncViewWidget( const ComputerControlInterface::Pointer& computerC show(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - const auto screenGeometry = screen()->availableGeometry(); -#else - const auto screenGeometry = QApplication::desktop()->availableGeometry( this ); -#endif - - resize( screenGeometry.size() - QSize( 10, 30 ) ); - setFocusPolicy( Qt::WheelFocus ); setFocus(); @@ -99,7 +86,32 @@ VncViewWidget::~VncViewWidget() QSize VncViewWidget::sizeHint() const { - return effectiveFramebufferSize(); + QSize availableSize{QGuiApplication::primaryScreen()->availableVirtualSize()}; +#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) + const auto* windowScreen = windowHandle() ? windowHandle()->screen() : nullptr; +#else + const auto* windowScreen = screen(); +#endif + if (windowScreen) + { + availableSize = windowScreen->availableVirtualSize(); + } + + availableSize -= window()->frameSize() - window()->size(); + + const auto size = effectiveFramebufferSize(); + if (size.isEmpty()) + { + return availableSize; + } + + if (size.width() > availableSize.width() || + size.height() > availableSize.height()) + { + return size.scaled(availableSize, Qt::KeepAspectRatio); + } + + return size; } diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index df1f9f14a..54be7bea1 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -306,6 +306,8 @@ RemoteAccessWidget::RemoteAccessWidget( const ComputerControlInterface::Pointer& showNormal(); + updateSize(); + setViewOnly( startViewOnly ); } @@ -367,7 +369,7 @@ void RemoteAccessWidget::leaveEvent( QEvent* event ) void RemoteAccessWidget::resizeEvent( QResizeEvent* event ) { - m_vncView->resize( size() ); + m_vncView->setFixedSize(size()); m_toolBar->setFixedSize( width(), m_toolBar->height() ); QWidget::resizeEvent( event ); @@ -377,8 +379,7 @@ void RemoteAccessWidget::resizeEvent( QResizeEvent* event ) void RemoteAccessWidget::updateSize() { - if( !( windowState() & Qt::WindowFullScreen ) && - m_vncView->sizeHint().isEmpty() == false ) + if (!(windowState() & Qt::WindowFullScreen)) { resize( m_vncView->sizeHint() ); } From 4242c89385c75df4db17fbade3261bc5932756aa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 16 Feb 2022 14:28:25 +0100 Subject: [PATCH 1323/1765] Demo: use VncViewWidget::sizeHint() Since VncViewWidget::sizeHint() already returns the optimal size for the top level widget, there's no need to resize m_toplevel based on an own logic. --- plugins/demo/DemoClient.cpp | 41 ++++++++++++++++--------------------- plugins/demo/DemoClient.h | 3 +++ 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index 5c46a9a1f..77c5578d0 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -23,13 +23,7 @@ */ #include -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) -#include -#else -#include -#endif #include -#include #include "DemoClient.h" #include "VeyonConfiguration.h" @@ -54,29 +48,15 @@ DemoClient::DemoClient( const QString& host, int port, bool fullscreen, QRect vi m_toplevel->setWindowTitle( tr( "%1 Demo" ).arg( VeyonCore::applicationName() ) ); m_toplevel->setWindowIcon( QPixmap( QStringLiteral(":/core/icon64.png") ) ); m_toplevel->setAttribute( Qt::WA_DeleteOnClose, false ); + m_toplevel->installEventFilter(this); if( fullscreen == false ) { m_toplevel->setWindowFlags( Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint ); - -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - const auto screenGeometry = m_toplevel->screen()->availableGeometry(); -#else - const auto screenGeometry = QApplication::desktop()->availableGeometry( m_toplevel ); -#endif - - m_toplevel->resize( screenGeometry.size() - QSize( 10, 30 ) ); } m_vncView = new VncViewWidget( m_computerControlInterface, viewport, m_toplevel ); - auto toplevelLayout = new QVBoxLayout; - toplevelLayout->setContentsMargins( 0, 0, 0, 0 ); - toplevelLayout->setSpacing( 0 ); - toplevelLayout->addWidget( m_vncView ); - - m_toplevel->setLayout( toplevelLayout ); - connect( m_toplevel, &QObject::destroyed, this, &DemoClient::viewDestroyed ); connect( m_vncView, &VncViewWidget::sizeHintChanged, this, &DemoClient::resizeToplevelWidget ); @@ -90,6 +70,8 @@ DemoClient::DemoClient( const QString& host, int port, bool fullscreen, QRect vi m_toplevel->show(); } + resizeToplevelWidget(); + VeyonCore::platform().coreFunctions().raiseWindow( m_toplevel, fullscreen ); VeyonCore::platform().coreFunctions().disableScreenSaver(); @@ -106,6 +88,19 @@ DemoClient::~DemoClient() +bool DemoClient::eventFilter(QObject* watched, QEvent* event) +{ + if (watched == m_toplevel && event->type() == QEvent::Resize) + { + m_vncView->setFixedSize(m_toplevel->size()); + return true; + } + + return QObject::eventFilter(watched, event); +} + + + void DemoClient::viewDestroyed( QObject* obj ) { // prevent double deletion of toplevel widget @@ -123,10 +118,10 @@ void DemoClient::resizeToplevelWidget() { if( m_toplevel->windowState() & Qt::WindowFullScreen ) { - m_vncView->resize( m_toplevel->size() ); + m_vncView->setFixedSize(m_toplevel->size()); } else { - m_toplevel->resize( m_vncView->sizeHint() ); + m_toplevel->resize(m_vncView->sizeHint()); } } diff --git a/plugins/demo/DemoClient.h b/plugins/demo/DemoClient.h index f84689402..f7dc534c9 100644 --- a/plugins/demo/DemoClient.h +++ b/plugins/demo/DemoClient.h @@ -37,6 +37,9 @@ class DemoClient : public QObject DemoClient( const QString& host, int port, bool fullscreen, QRect viewport, QObject* parent = nullptr ); ~DemoClient() override; +protected: + bool eventFilter(QObject* watched, QEvent* event) override; + private: void viewDestroyed( QObject* obj ); void resizeToplevelWidget(); From cc1062b96bc3dd8ff1fea9fdd26d651d7d804942 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 16 Feb 2022 14:32:31 +0100 Subject: [PATCH 1324/1765] LockWidget: use size of virtual desktop --- core/src/LockWidget.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index 8818ab98c..62c9983b1 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -26,9 +26,6 @@ #include "PlatformInputDeviceFunctions.h" #include -#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) -#include -#endif #include #include #include @@ -60,11 +57,11 @@ LockWidget::LockWidget( Mode mode, const QPixmap& background, QWidget* parent ) setWindowTitle( {} ); show(); move( 0, 0 ); -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - setFixedSize( screen()->size() ); -#else - setFixedSize( qApp->desktop()->size() ); + setFixedSize( +#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) + windowHandle()-> #endif + screen()->virtualSize()); VeyonCore::platform().coreFunctions().raiseWindow( this, true ); showFullScreen(); setFocusPolicy( Qt::StrongFocus ); From c6698f46cd5764b1e80485a17ce045c1ca0995cf Mon Sep 17 00:00:00 2001 From: Michael Wehr Date: Thu, 13 Jan 2022 18:03:35 +0100 Subject: [PATCH 1325/1765] fix press and hold and maximized state of ComputerZoomWidget on windows os MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ComputerZoomWidget window was not working correctly on windows OS’s. The reason was, that when a new window gets created on windows systems one or more (but in my tests not more than three) mouse move events are for unknown reasons generated, even while the mouse is perfectly still. As mouseMoveEvents are one of the conditions that are checked and result in ending the feature execution, the window closed itself, before the user could get the chance to look at it. To solve this problem a counter variable was introduced, which allows up to three mouse move events to happen, before it is deemed a valid user decision to end the feature. As a second improvement this commit stops the mousePressAndHold timer when starting the feature, as keeping it running could trigger unforeseen problems. The third improvement fixes the size and positioning of the ComputerZoomWidget window to the screen size of the controller. This is achieved by maximizing the window. Using this method the rescaling of the vnc connection is triggered and will make target device screens completely visible even if the resolution of controller pc is smaller or the target devices have multiple screens. (cherry picked from commit 1a9c5b9512769e750afdbc000f3dc16bb07fd3fe) --- master/src/ComputerMonitoringWidget.cpp | 25 ++++++++++++------ master/src/ComputerMonitoringWidget.h | 6 ++++- master/src/ComputerZoomWidget.cpp | 35 ++++++++++++++++++++++++- master/src/ComputerZoomWidget.h | 6 +++++ 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 79a0a4d7d..a84f6effa 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -272,6 +272,7 @@ void ComputerMonitoringWidget::runDoubleClickFeature( const QModelIndex& index ) void ComputerMonitoringWidget::runMousePressAndHoldFeature( ) { + m_mousePressAndHold.stop(); const auto selectedInterfaces = selectedComputerControlInterfaces(); if( !m_ignoreMousePressAndHoldEvent && selectedInterfaces.count() > 0 && @@ -280,9 +281,9 @@ void ComputerMonitoringWidget::runMousePressAndHoldFeature( ) selectedInterfaces.first()->hasValidFramebuffer() ) { m_ignoreMousePressAndHoldEvent = true; + m_ignoreNumberOfMouseEvents = IgnoredNumberOfMouseEventsWhileHold; delete m_computerZoomWidget; - m_computerZoomWidget = new ComputerZoomWidget( selectedInterfaces.first() ); - QApplication::setOverrideCursor(Qt::BlankCursor); + m_computerZoomWidget = new ComputerZoomWidget( selectedInterfaces.first() ); } } @@ -290,9 +291,11 @@ void ComputerMonitoringWidget::runMousePressAndHoldFeature( ) void ComputerMonitoringWidget::stopMousePressAndHoldFeature( ) { + m_ignoreMousePressAndHoldEvent = false; + m_ignoreNumberOfMouseEvents = 0; + m_computerZoomWidget->close(); delete m_computerZoomWidget; m_computerZoomWidget = nullptr; - QApplication::restoreOverrideCursor(); } @@ -320,7 +323,6 @@ void ComputerMonitoringWidget::mouseReleaseEvent( QMouseEvent* event ) { stopMousePressAndHoldFeature(); } - m_ignoreMousePressAndHoldEvent = false; QListView::mouseReleaseEvent( event ); } @@ -329,12 +331,19 @@ void ComputerMonitoringWidget::mouseReleaseEvent( QMouseEvent* event ) void ComputerMonitoringWidget::mouseMoveEvent( QMouseEvent* event ) { m_mousePressAndHold.stop(); - if ( m_ignoreMousePressAndHoldEvent ) + if ( m_ignoreNumberOfMouseEvents <= 0 ) { - stopMousePressAndHoldFeature(); + if ( m_ignoreMousePressAndHoldEvent ) + { + stopMousePressAndHoldFeature(); + } + + QListView::mouseMoveEvent( event ); + } else + { + m_ignoreNumberOfMouseEvents--; + event->accept(); } - m_ignoreMousePressAndHoldEvent = false; - QListView::mouseMoveEvent( event ); } diff --git a/master/src/ComputerMonitoringWidget.h b/master/src/ComputerMonitoringWidget.h index 9221383c7..76028de33 100644 --- a/master/src/ComputerMonitoringWidget.h +++ b/master/src/ComputerMonitoringWidget.h @@ -73,7 +73,8 @@ class ComputerMonitoringWidget : public FlexibleListView, public ComputerMonitor void mousePressEvent( QMouseEvent* event ) override; void mouseReleaseEvent( QMouseEvent* event ) override; - void mouseMoveEvent( QMouseEvent * event ) override; + void mouseMoveEvent( QMouseEvent* event ) override; + void resizeEvent( QResizeEvent* event ) override; void showEvent( QShowEvent* event ) override; void wheelEvent( QWheelEvent* event ) override; @@ -82,6 +83,9 @@ class ComputerMonitoringWidget : public FlexibleListView, public ComputerMonitor bool m_ignoreMousePressAndHoldEvent{false}; bool m_ignoreWheelEvent{false}; bool m_ignoreResizeEvent{false}; + int m_ignoreNumberOfMouseEvents = 0; + + static constexpr auto IgnoredNumberOfMouseEventsWhileHold = 3; ComputerZoomWidget* m_computerZoomWidget{nullptr}; diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 64e2447c7..8e64cc0ad 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include "ComputerZoomWidget.h" @@ -35,6 +36,8 @@ ComputerZoomWidget::ComputerZoomWidget( const ComputerControlInterface::Pointer& QWidget(), m_vncView( new VncViewWidget( computerControlInterface, {}, this ) ) { + QApplication::setOverrideCursor(Qt::BlankCursor); + const auto openOnMasterScreen = VeyonCore::config().showFeatureWindowsOnSameScreen(); const auto master = VeyonCore::instance()->findChild(); const auto masterWindow = master->mainWindow(); @@ -53,9 +56,12 @@ ComputerZoomWidget::ComputerZoomWidget( const ComputerControlInterface::Pointer& setAttribute( Qt::WA_DeleteOnClose, true ); m_vncView->move( 0, 0 ); + connect( m_vncView, &VncViewWidget::sizeHintChanged, this, &ComputerZoomWidget::updateSize ); - showMaximized(); + setWindowState(Qt::WindowMaximized); VeyonCore::platform().coreFunctions().raiseWindow( this, false ); + + show(); } @@ -85,3 +91,30 @@ void ComputerZoomWidget::updateComputerZoomWidgetTitle() VeyonCore::applicationName() ) ); } } + + + +void ComputerZoomWidget::resizeEvent( QResizeEvent* event ) +{ + m_vncView->resize( size() ); + + QWidget::resizeEvent( event ); +} + + + +void ComputerZoomWidget::updateSize() +{ + if( !( windowState() & Qt::WindowFullScreen ) && + m_vncView->sizeHint().isEmpty() == false ) + { + resize( m_vncView->sizeHint() ); + } +} + + + +void ComputerZoomWidget::closeEvent( QCloseEvent* event ) +{ + QApplication::restoreOverrideCursor(); +} diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index 7797d0de2..015bc8ba0 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -38,9 +38,15 @@ class ComputerZoomWidget : public QWidget ComputerZoomWidget( const ComputerControlInterface::Pointer& computerControlInterface ); ~ComputerZoomWidget() override; +protected: + void resizeEvent( QResizeEvent* event ) override; + private: + void updateSize(); void updateComputerZoomWidgetTitle(); + void closeEvent( QCloseEvent* event ) override; + VncViewWidget* m_vncView; } ; From 8800d84635a2f28d1937733e9afd6d175a8e07a0 Mon Sep 17 00:00:00 2001 From: Michael Wehr Date: Tue, 14 Dec 2021 12:46:06 +0100 Subject: [PATCH 1326/1765] RemoteAccessWidget: allow screen switching by tab/backtab (viewOnly) (cherry picked from commit e0d3605fa0f79f247dba2679c64a4f445e96c8b3) --- plugins/remoteaccess/RemoteAccessWidget.cpp | 69 +++++++++++++++++++++ plugins/remoteaccess/RemoteAccessWidget.h | 6 ++ 2 files changed, 75 insertions(+) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 54be7bea1..445fd50a4 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -124,6 +124,9 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent connect( vncView->computerControlInterface().data(), &ComputerControlInterface::screensChanged, this, &RemoteAccessWidgetToolBar::updateScreens ); + + connect( m_parent, &RemoteAccessWidget::screenChangedInRemoteAccessWidget, + this, &RemoteAccessWidgetToolBar::updateScreenSelectActions ); } @@ -162,6 +165,26 @@ void RemoteAccessWidgetToolBar::updateControls( bool viewOnly ) +void RemoteAccessWidgetToolBar::updateScreenSelectActions( int newScreen ) +{ + const auto screens = m_parent->vncView()->computerControlInterface()->screens(); + const auto m_screenSelectActions = m_selectScreenButton->menu()->actions(); + for (const auto& screenSelectAction : m_screenSelectActions) + { + if ( newScreen == -1 ) + { + screenSelectAction->setChecked(true); + break; + } + if ( screenSelectAction->text() == screens[newScreen].name ) + { + screenSelectAction->setChecked(true); + } + } +} + + + void RemoteAccessWidgetToolBar::leaveEvent( QEvent *event ) { disappear(); @@ -335,6 +358,52 @@ bool RemoteAccessWidget::eventFilter( QObject* object, QEvent* event ) m_toolBar->disappear(); } + if( event->type() == QEvent::KeyPress && m_vncView->viewOnly() ) + { + const auto screens = m_vncView->computerControlInterface()->screens(); + const auto key = static_cast( event )->key(); + if ( screens.size() > 1 && ( key == Qt::Key_Tab || key == Qt::Key_Backtab ) ) + { + if( key == Qt::Key_Tab ) + { + if ( m_currentScreen < screens.size() - 1 ) + { + m_currentScreen++; + } else + { + m_currentScreen = -1; + } + } + + if( key == Qt::Key_Backtab ) + { + if ( m_currentScreen == -1 ) + { + m_currentScreen = screens.size()-1; + } else if ( m_currentScreen > 0 ) + { + m_currentScreen--; + } else + { + m_currentScreen = -1; + } + } + + if ( m_currentScreen == -1) + { + m_vncView->setViewport( {} ); + } + else + { + m_vncView->setViewport(screens[m_currentScreen].geometry); + } + Q_EMIT screenChangedInRemoteAccessWidget(m_currentScreen); + return true; + } + + return false; + } + return QWidget::eventFilter( object, event ); } diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index c0d1e53b4..8173b4ff3 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -47,6 +47,7 @@ class RemoteAccessWidgetToolBar : public QWidget void appear(); void disappear(); void updateControls( bool viewOnly ); + void updateScreenSelectActions( int newScreen ); protected: @@ -122,4 +123,9 @@ class RemoteAccessWidget : public QWidget static constexpr int AppearDelay = 500; + int m_currentScreen{-1}; + +Q_SIGNALS: + void screenChangedInRemoteAccessWidget( int newScreen ); + } ; From 045c6ddcc9b6b1bd85fcc76c26d98b9521617221 Mon Sep 17 00:00:00 2001 From: Michael Wehr Date: Sat, 11 Dec 2021 14:55:38 +0100 Subject: [PATCH 1327/1765] ComputerZoomWidget: allow screen switching by pressing tab or backtab (cherry picked from commit 047044d0ce0b2af44967361fe4fcd0fc6ee8ee2a) --- master/src/ComputerMonitoringWidget.cpp | 11 ++++- master/src/ComputerMonitoringWidget.h | 2 + master/src/ComputerZoomWidget.cpp | 59 +++++++++++++++++++++++++ master/src/ComputerZoomWidget.h | 8 +++- 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index a84f6effa..3dedcf777 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -270,6 +270,13 @@ void ComputerMonitoringWidget::runDoubleClickFeature( const QModelIndex& index ) +void ComputerMonitoringWidget::resetIgnoreNumberOfMouseEvents( ) +{ + m_ignoreNumberOfMouseEvents = IgnoredNumberOfMouseEventsWhileHold; +} + + + void ComputerMonitoringWidget::runMousePressAndHoldFeature( ) { m_mousePressAndHold.stop(); @@ -281,9 +288,10 @@ void ComputerMonitoringWidget::runMousePressAndHoldFeature( ) selectedInterfaces.first()->hasValidFramebuffer() ) { m_ignoreMousePressAndHoldEvent = true; - m_ignoreNumberOfMouseEvents = IgnoredNumberOfMouseEventsWhileHold; + resetIgnoreNumberOfMouseEvents(); delete m_computerZoomWidget; m_computerZoomWidget = new ComputerZoomWidget( selectedInterfaces.first() ); + connect( m_computerZoomWidget, &ComputerZoomWidget::keypressInComputerZoomWidget, this, &ComputerMonitoringWidget::resetIgnoreNumberOfMouseEvents ); } } @@ -291,6 +299,7 @@ void ComputerMonitoringWidget::runMousePressAndHoldFeature( ) void ComputerMonitoringWidget::stopMousePressAndHoldFeature( ) { + disconnect( m_computerZoomWidget, &ComputerZoomWidget::keypressInComputerZoomWidget, this, &ComputerMonitoringWidget::resetIgnoreNumberOfMouseEvents ); m_ignoreMousePressAndHoldEvent = false; m_ignoreNumberOfMouseEvents = 0; m_computerZoomWidget->close(); diff --git a/master/src/ComputerMonitoringWidget.h b/master/src/ComputerMonitoringWidget.h index 76028de33..c2ae464cb 100644 --- a/master/src/ComputerMonitoringWidget.h +++ b/master/src/ComputerMonitoringWidget.h @@ -53,6 +53,8 @@ class ComputerMonitoringWidget : public FlexibleListView, public ComputerMonitor m_ignoreWheelEvent = enabled; } + void resetIgnoreNumberOfMouseEvents( ); + QTimer m_mousePressAndHold; private: diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 8e64cc0ad..1922c5434 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "ComputerZoomWidget.h" #include "VeyonConfiguration.h" @@ -56,6 +57,7 @@ ComputerZoomWidget::ComputerZoomWidget( const ComputerControlInterface::Pointer& setAttribute( Qt::WA_DeleteOnClose, true ); m_vncView->move( 0, 0 ); + m_vncView->installEventFilter( this ); connect( m_vncView, &VncViewWidget::sizeHintChanged, this, &ComputerZoomWidget::updateSize ); setWindowState(Qt::WindowMaximized); @@ -73,6 +75,62 @@ ComputerZoomWidget::~ComputerZoomWidget() +bool ComputerZoomWidget::eventFilter( QObject* object, QEvent* event ) +{ + if( event->type() == QEvent::KeyPress ) + { + Q_EMIT keypressInComputerZoomWidget( ); + + const auto screens = m_vncView->computerControlInterface()->screens(); + const auto key = static_cast( event )->key(); + if ( screens.size() > 1 && ( key == Qt::Key_Tab || key == Qt::Key_Backtab ) ) + { + if( key == Qt::Key_Tab ) + { + if ( m_currentScreen < screens.size() - 1 ) + { + m_currentScreen++; + } else + { + m_currentScreen = -1; + } + } + + if( key == Qt::Key_Backtab ) + { + if ( m_currentScreen == -1 ) + { + m_currentScreen = screens.size()-1; + } else if ( m_currentScreen > 0 ) + { + m_currentScreen--; + } else + { + m_currentScreen = -1; + } + } + + showNormal(); + if ( m_currentScreen == -1) + { + m_vncView->setViewport( {} ); + } + else + { + m_vncView->setViewport(screens[m_currentScreen].geometry); + } + setWindowState(Qt::WindowMaximized); + return true; + } + + return false; + } + + return QObject::eventFilter(object, event); +} + + + void ComputerZoomWidget::updateComputerZoomWidgetTitle() { const auto username = m_vncView->computerControlInterface()->userFullName().isEmpty() ? @@ -116,5 +174,6 @@ void ComputerZoomWidget::updateSize() void ComputerZoomWidget::closeEvent( QCloseEvent* event ) { + m_vncView->setViewport({}); QApplication::restoreOverrideCursor(); } diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index 015bc8ba0..fe10148c1 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -39,14 +39,20 @@ class ComputerZoomWidget : public QWidget ~ComputerZoomWidget() override; protected: + bool eventFilter( QObject* object, QEvent* event ) override; + void resizeEvent( QResizeEvent* event ) override; + void closeEvent( QCloseEvent* event ) override; private: void updateSize(); void updateComputerZoomWidgetTitle(); - void closeEvent( QCloseEvent* event ) override; + int m_currentScreen{-1}; VncViewWidget* m_vncView; +Q_SIGNALS: + void keypressInComputerZoomWidget( ); + } ; From a7987da083911b06a4fe075db4bc78f9622f7a50 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 25 Feb 2022 10:53:14 +0100 Subject: [PATCH 1328/1765] RemoteAccessPage: add vncView() --- plugins/remoteaccess/RemoteAccessPage.cpp | 7 +++++++ plugins/remoteaccess/RemoteAccessPage.h | 3 +++ 2 files changed, 10 insertions(+) diff --git a/plugins/remoteaccess/RemoteAccessPage.cpp b/plugins/remoteaccess/RemoteAccessPage.cpp index 21e997646..947c49998 100644 --- a/plugins/remoteaccess/RemoteAccessPage.cpp +++ b/plugins/remoteaccess/RemoteAccessPage.cpp @@ -55,6 +55,13 @@ QQuickItem* RemoteAccessPage::view() const } + +VncView* RemoteAccessPage::vncView() const +{ + return m_view; +} + + /* void RemoteAccessPage::takeScreenshot() { diff --git a/plugins/remoteaccess/RemoteAccessPage.h b/plugins/remoteaccess/RemoteAccessPage.h index c28be5853..445f9a72a 100644 --- a/plugins/remoteaccess/RemoteAccessPage.h +++ b/plugins/remoteaccess/RemoteAccessPage.h @@ -27,6 +27,7 @@ #include "ComputerControlInterface.h" +class VncView; class VncViewItem; // clazy:excludeall=ctor-missing-parent-argument @@ -54,6 +55,8 @@ class RemoteAccessPage : public QObject QQuickItem* view() const; + VncView* vncView() const; + private: ComputerControlInterface::Pointer m_computerControlInterface; VncViewItem* m_view; From 49da4d4625329e75bfdd702e80cd29e9a642371b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 25 Feb 2022 10:56:45 +0100 Subject: [PATCH 1329/1765] RemoteAccessWidget: make vncView() return VncView pointer --- plugins/remoteaccess/RemoteAccessWidget.cpp | 23 ++++++++++++++------- plugins/remoteaccess/RemoteAccessWidget.h | 6 ++---- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 445fd50a4..cf37187d5 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -90,14 +90,14 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent updateScreens(); auto shortcutMenu = new QMenu(); - shortcutMenu->addAction( tr( "Ctrl+Alt+Del" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlAltDel ); } ); - shortcutMenu->addAction( tr( "Ctrl+Esc" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlEscape ); } ); - shortcutMenu->addAction( tr( "Alt+Tab" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutAltTab ); } ); - shortcutMenu->addAction( tr( "Alt+F4" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutAltF4 ); } ); - shortcutMenu->addAction( tr( "Win+Tab" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutWinTab ); } ); - shortcutMenu->addAction( tr( "Win" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutWin ); } ); - shortcutMenu->addAction( tr( "Menu" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutMenu ); } ); - shortcutMenu->addAction( tr( "Alt+Ctrl+F1" ), vncView, [=]() { vncView->sendShortcut( VncView::ShortcutAltCtrlF1 ); } ); + shortcutMenu->addAction( tr( "Ctrl+Alt+Del" ), this, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlAltDel ); } ); + shortcutMenu->addAction( tr( "Ctrl+Esc" ), this, [=]() { vncView->sendShortcut( VncView::ShortcutCtrlEscape ); } ); + shortcutMenu->addAction( tr( "Alt+Tab" ), this, [=]() { vncView->sendShortcut( VncView::ShortcutAltTab ); } ); + shortcutMenu->addAction( tr( "Alt+F4" ), this, [=]() { vncView->sendShortcut( VncView::ShortcutAltF4 ); } ); + shortcutMenu->addAction( tr( "Win+Tab" ), this, [=]() { vncView->sendShortcut( VncView::ShortcutWinTab ); } ); + shortcutMenu->addAction( tr( "Win" ), this, [=]() { vncView->sendShortcut( VncView::ShortcutWin ); } ); + shortcutMenu->addAction( tr( "Menu" ), this, [=]() { vncView->sendShortcut( VncView::ShortcutMenu ); } ); + shortcutMenu->addAction( tr( "Alt+Ctrl+F1" ), this, [=]() { vncView->sendShortcut( VncView::ShortcutAltCtrlF1 ); } ); m_sendShortcutButton->setMenu( shortcutMenu ); m_sendShortcutButton->setPopupMode( QToolButton::InstantPopup ); @@ -343,6 +343,13 @@ RemoteAccessWidget::~RemoteAccessWidget() +VncView* RemoteAccessWidget::vncView() const +{ + return m_vncView; +} + + + bool RemoteAccessWidget::eventFilter( QObject* object, QEvent* event ) { if( event->type() == QEvent::KeyRelease && diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index 8173b4ff3..4f6fb18a9 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -30,6 +30,7 @@ class QActionGroup; +class VncView; class VncViewWidget; class RemoteAccessWidget; class ToolButton; @@ -94,10 +95,7 @@ class RemoteAccessWidget : public QWidget return m_computerControlInterface; } - VncViewWidget* vncView() const - { - return m_vncView; - } + VncView* vncView() const; void toggleFullScreen( bool ); void setViewOnly( bool viewOnly ); From 1ac9d546277be682e90989fadf4d2b2afb4daeea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 25 Feb 2022 10:58:11 +0100 Subject: [PATCH 1330/1765] RemoteAccess: track view instances --- .../RemoteAccessFeaturePlugin.cpp | 26 +++++++++++++++++++ .../remoteaccess/RemoteAccessFeaturePlugin.h | 3 +++ 2 files changed, 29 insertions(+) diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index a62617baa..65467cb07 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -35,6 +35,7 @@ #include "VeyonConfiguration.h" #include "VeyonMasterInterface.h" #include "VeyonServerInterface.h" +#include "VncView.h" RemoteAccessFeaturePlugin::RemoteAccessFeaturePlugin( QObject* parent ) : @@ -351,6 +352,9 @@ bool RemoteAccessFeaturePlugin::remoteAccess( const QString& hostAddress, bool v void RemoteAccessFeaturePlugin::createRemoteAccessWindow(const ComputerControlInterface::Pointer& computerControlInterface, bool viewOnly, VeyonMasterInterface* master) { + VncView* vncView{nullptr}; + QObject* remoteAccessView{nullptr}; + if (master && master->appContainer()) { auto page = new RemoteAccessPage(computerControlInterface, viewOnly, master->appContainer()); @@ -359,6 +363,9 @@ void RemoteAccessFeaturePlugin::createRemoteAccessWindow(const ComputerControlIn { sendClipboardData(page->computerControlInterface()); }); + + remoteAccessView = page; + vncView = page->vncView(); } else { @@ -370,7 +377,26 @@ void RemoteAccessFeaturePlugin::createRemoteAccessWindow(const ComputerControlIn { sendClipboardData(widget->computerControlInterface()); }); + + remoteAccessView = widget; + vncView = widget->vncView(); } + + connect(remoteAccessView, &QObject::destroyed, this, [this](QObject* view) { + for (auto it = m_vncViews.begin(); it != m_vncViews.end();) + { + if (it->first == nullptr || it->first == view) + { + it = m_vncViews.erase(it); + } + else + { + it++; + } + } + }); + + m_vncViews.append(qMakePair(remoteAccessView, vncView)); } diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index bac58f92a..4bbd67335 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -28,6 +28,7 @@ #include "FeatureProviderInterface.h" #include "CommandLinePluginInterface.h" +class VncView; class RemoteAccessFeaturePlugin : public QObject, CommandLinePluginInterface, FeatureProviderInterface, PluginInterface { @@ -150,4 +151,6 @@ private Q_SLOTS: QString m_clipboardText; QImage m_clipboardImage; + QList, VncView *> > m_vncViews{}; + }; From 2fa92cd92e158af74a10c9f39be72b83a07eea84 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 25 Feb 2022 10:59:04 +0100 Subject: [PATCH 1331/1765] RemoteAccess: only update clipboard if attached to VncView Closes #801. --- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 65467cb07..97e66f7c5 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -151,7 +151,14 @@ bool RemoteAccessFeaturePlugin::handleFeatureMessage(ComputerControlInterface::P if (message.featureUid() == m_clipboardExchangeFeature.uid()) { - loadClipboardData(message); + for (auto it = m_vncViews.constBegin(), end = m_vncViews.constEnd(); it != end; ++it) + { + if (it->first && it->second->computerControlInterface() == computerControlInterface) + { + loadClipboardData(message); + } + } + return true; } From e65dd854a4d9c991bec7dda0f48f769e28c06d09 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Sat, 26 Feb 2022 13:46:33 +0100 Subject: [PATCH 1332/1765] PowerControl: shutdown after expiry of the countdown Always perform the shutdown no matter when and how the countdown dialog has been closed. --- plugins/powercontrol/PowerControlFeaturePlugin.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 9f166c3b5..5970e0de8 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -419,7 +419,7 @@ static void updateDialog( QProgressDialog* dialog, int newValue ) if( remainingSeconds <= 0 ) { - VeyonCore::platform().coreFunctions().powerDown( false ); + dialog->accept(); } } @@ -452,4 +452,6 @@ void PowerControlFeaturePlugin::displayShutdownTimeout( int shutdownTimeout ) } ); dialog.exec(); + + VeyonCore::platform().coreFunctions().powerDown(false); } From ca966cbdfba0516fbb8d9aeb7f7793ece23ad297 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Sat, 26 Feb 2022 13:53:27 +0100 Subject: [PATCH 1333/1765] PowerControl: filter close events for countdown dialog Prevent users from canceling a pending shutdown operation by closing the dialog via Alt+F4. Closes #804. --- .../powercontrol/PowerControlFeaturePlugin.cpp | 16 ++++++++++++++++ plugins/powercontrol/PowerControlFeaturePlugin.h | 3 +++ 2 files changed, 19 insertions(+) diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 5970e0de8..25cdd6643 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -294,6 +295,20 @@ CommandLinePluginInterface::RunResult PowerControlFeaturePlugin::handle_on( cons +bool PowerControlFeaturePlugin::eventFilter(QObject* watched, QEvent* event) +{ + if (event->type() == QEvent::Close && + qobject_cast(watched)) + { + event->ignore(); + return true; + } + + return QObject::eventFilter(watched, event); +} + + + bool PowerControlFeaturePlugin::confirmFeatureExecution( const Feature& feature, bool all, QWidget* parent ) { if( VeyonCore::config().confirmUnsafeActions() == false ) @@ -432,6 +447,7 @@ void PowerControlFeaturePlugin::displayShutdownTimeout( int shutdownTimeout ) dialog.setMaximum( shutdownTimeout ); dialog.setCancelButton( nullptr ); dialog.setWindowFlags( Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint ); + dialog.installEventFilter(this); auto progressBar = dialog.findChild(); if( progressBar ) diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.h b/plugins/powercontrol/PowerControlFeaturePlugin.h index 7ffcaffd5..ecd8ec0b6 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.h +++ b/plugins/powercontrol/PowerControlFeaturePlugin.h @@ -109,6 +109,9 @@ public Q_SLOTS: CommandLinePluginInterface::RunResult handle_help( const QStringList& arguments ); CommandLinePluginInterface::RunResult handle_on( const QStringList& arguments ); +protected: + bool eventFilter(QObject* watched, QEvent* event) override; + private: bool confirmFeatureExecution( const Feature& feature, bool all, QWidget* parent ); static bool broadcastWOLPacket( QString macAddress ); From 1795c085a8793798392eda832fa4e35ef1f239b6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Sun, 27 Feb 2022 14:38:13 +0100 Subject: [PATCH 1334/1765] CI: replace openSUSE 15.2 with Tumbleweed build Also build with Qt 6 already. --- .ci/linux.opensuse.15.2/script.sh | 6 ------ .../Dockerfile | 7 +++---- .ci/linux.opensuse.tumbleweed/script.sh | 8 ++++++++ .github/workflows/build.yml | 2 +- .gitlab-ci.yml | 2 +- cmake/CPackDefinitions.cmake | 6 +++++- cmake/modules/FindQCA.cmake | 1 + 7 files changed, 19 insertions(+), 13 deletions(-) delete mode 100755 .ci/linux.opensuse.15.2/script.sh rename .ci/{linux.opensuse.15.2 => linux.opensuse.tumbleweed}/Dockerfile (67%) create mode 100755 .ci/linux.opensuse.tumbleweed/script.sh diff --git a/.ci/linux.opensuse.15.2/script.sh b/.ci/linux.opensuse.15.2/script.sh deleted file mode 100755 index 873f77801..000000000 --- a/.ci/linux.opensuse.15.2/script.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash - -set -e - -$1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "opensuse-15.2" diff --git a/.ci/linux.opensuse.15.2/Dockerfile b/.ci/linux.opensuse.tumbleweed/Dockerfile similarity index 67% rename from .ci/linux.opensuse.15.2/Dockerfile rename to .ci/linux.opensuse.tumbleweed/Dockerfile index 2a3de179f..3f905df67 100644 --- a/.ci/linux.opensuse.15.2/Dockerfile +++ b/.ci/linux.opensuse.tumbleweed/Dockerfile @@ -1,10 +1,9 @@ -FROM opensuse/leap:15.2 +FROM opensuse/tumbleweed:latest MAINTAINER Tobias Junghans RUN \ zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ - libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel libqt5-qtwebengine-devel \ - kitemmodels-devel \ + qt6-widgets-devel qt6-widgets-private-devel qt6-concurrent-devel qt6-linguist-devel qt6-tools-devel qt6-quickcontrols2-devel qt6-webenginewidgets-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg8-devel \ @@ -13,7 +12,7 @@ RUN \ libopenssl-devel \ procps-devel \ pam-devel lzo-devel \ - libqca-qt5-devel libqca-qt5-plugins \ + qca-qt6-devel qca-qt6-plugins \ libavcodec-devel libavformat-devel libavutil-devel libswscale-devel \ cyrus-sasl-devel \ openldap2-devel diff --git a/.ci/linux.opensuse.tumbleweed/script.sh b/.ci/linux.opensuse.tumbleweed/script.sh new file mode 100755 index 000000000..41c12d760 --- /dev/null +++ b/.ci/linux.opensuse.tumbleweed/script.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON" + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-rpm.sh $1 $2 "opensuse-tumbleweed" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dba7fda03..bad3b0ba9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,7 +7,7 @@ jobs: - centos.8.4 - debian.buster - fedora.35 - - opensuse.15.2 + - opensuse.tumbleweed - ubuntu.focal runs-on: ubuntu-latest container: veyon/ci.linux.${{matrix.dist}} diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 53e3cb33c..1b48b94f3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,8 +16,8 @@ build-linux: - debian.bullseye - fedora.34 - fedora.35 - - opensuse.15.2 - opensuse.15.3 + - opensuse.tumbleweed - ubuntu.bionic - ubuntu.focal artifacts: diff --git a/cmake/CPackDefinitions.cmake b/cmake/CPackDefinitions.cmake index 769f0e422..c332a944b 100644 --- a/cmake/CPackDefinitions.cmake +++ b/cmake/CPackDefinitions.cmake @@ -77,7 +77,11 @@ if(EXISTS /etc/os-release) endif() if(OS_OPENSUSE) - set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "libqca-qt5-plugins, libqt5-qtquickcontrols2") + if(WITH_QT6) + set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "qca-qt6-plugins, libQt6QuickControls2-6") + else() + set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "libqca-qt5-plugins, libqt5-qtquickcontrols2") + endif() else() set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "qca-qt5-ossl, qt5-qtquickcontrols2") endif() diff --git a/cmake/modules/FindQCA.cmake b/cmake/modules/FindQCA.cmake index a16cf2955..6979c3765 100644 --- a/cmake/modules/FindQCA.cmake +++ b/cmake/modules/FindQCA.cmake @@ -53,6 +53,7 @@ else() Qca-${QCA_SUFFIX}/QtCrypto qt/Qca-${QCA_SUFFIX}/QtCrypto qt5/Qca-${QCA_SUFFIX}/QtCrypto + qt6/Qca-${QCA_SUFFIX}/QtCrypto ) if(QCA_LIBRARY AND QCA_INCLUDE_DIR) From ae41d792f1c2bd0519ada404ded72f9496dfb1da Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 28 Feb 2022 12:04:10 +0100 Subject: [PATCH 1335/1765] ComputerSelectModel: use QSortFilterProxyModel directly --- master/src/ComputerSelectModel.cpp | 8 ++++- master/src/ComputerSelectModel.h | 4 +-- master/src/RecursiveFilterProxyModel.cpp | 41 --------------------- master/src/RecursiveFilterProxyModel.h | 46 ------------------------ 4 files changed, 9 insertions(+), 90 deletions(-) delete mode 100644 master/src/RecursiveFilterProxyModel.cpp delete mode 100644 master/src/RecursiveFilterProxyModel.h diff --git a/master/src/ComputerSelectModel.cpp b/master/src/ComputerSelectModel.cpp index a051476c3..13603095b 100644 --- a/master/src/ComputerSelectModel.cpp +++ b/master/src/ComputerSelectModel.cpp @@ -23,13 +23,14 @@ */ #include "ComputerSelectModel.h" +#include "VeyonCore.h" #if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) #include #endif ComputerSelectModel::ComputerSelectModel( QAbstractItemModel* sourceModel, QObject* parent ) : - RecursiveFilterProxyModel( parent ) + QSortFilterProxyModel(parent) { #if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) new QAbstractItemModelTester( this, QAbstractItemModelTester::FailureReportingMode::Warning, this ); @@ -39,6 +40,11 @@ ComputerSelectModel::ComputerSelectModel( QAbstractItemModel* sourceModel, QObje setFilterCaseSensitivity( Qt::CaseInsensitive ); setFilterKeyColumn( -1 ); // filter all columns instead of first one only sort( 0 ); +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + setRecursiveFilteringEnabled(true); +#else + vWarning() << "Built with Qt < 5.10 – filtering computers/users will not work properly"; +#endif } diff --git a/master/src/ComputerSelectModel.h b/master/src/ComputerSelectModel.h index 1e7705ecd..543fc19bb 100644 --- a/master/src/ComputerSelectModel.h +++ b/master/src/ComputerSelectModel.h @@ -24,9 +24,9 @@ #pragma once -#include "RecursiveFilterProxyModel.h" +#include -class ComputerSelectModel : public RecursiveFilterProxyModel +class ComputerSelectModel : public QSortFilterProxyModel { Q_OBJECT public: diff --git a/master/src/RecursiveFilterProxyModel.cpp b/master/src/RecursiveFilterProxyModel.cpp deleted file mode 100644 index 91863b74d..000000000 --- a/master/src/RecursiveFilterProxyModel.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * RecursiveFilterProxyModel.cpp - proxy model for recursive filtering - * - * Copyright (c) 2017-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#include "RecursiveFilterProxyModel.h" - -#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) - -#if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) -#include -#endif - -RecursiveFilterProxyModel::RecursiveFilterProxyModel( QObject* parent ) : - KRecursiveFilterProxyModel( parent ) -{ -#if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) - new QAbstractItemModelTester( this, QAbstractItemModelTester::FailureReportingMode::Warning, this ); -#endif -} - -#endif diff --git a/master/src/RecursiveFilterProxyModel.h b/master/src/RecursiveFilterProxyModel.h deleted file mode 100644 index 97107a72d..000000000 --- a/master/src/RecursiveFilterProxyModel.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * RecursiveFilterProxyModel.h - proxy model for recursive filtering - * - * Copyright (c) 2017-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#pragma once - -#include - -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - -#include - -using RecursiveFilterProxyModel = QSortFilterProxyModel; - -#else - -#include "krecursivefilterproxymodel.h" - -class RecursiveFilterProxyModel : public KRecursiveFilterProxyModel -{ -public: - explicit RecursiveFilterProxyModel( QObject* parent ); - void setRecursiveFilteringEnabled( bool ) { } -}; - -#endif From fef366e09514d82dc0859962fbe1a53e04ebec48 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 28 Feb 2022 12:04:35 +0100 Subject: [PATCH 1336/1765] Bundle KExtraColumnsProxyModel implementation Simplify Qt 6 migration by not depending on KF5::ItemModels. --- .ci/linux.centos.7.9/Dockerfile | 1 - .ci/linux.centos.8.4/Dockerfile | 1 - .ci/linux.debian.bullseye/Dockerfile | 1 - .ci/linux.debian.buster/Dockerfile | 1 - .ci/linux.fedora.34/Dockerfile | 1 - .ci/linux.fedora.35/Dockerfile | 1 - .ci/linux.opensuse.15.3/Dockerfile | 1 - .ci/linux.ubuntu.bionic/Dockerfile | 1 - .ci/linux.ubuntu.focal/Dockerfile | 1 - cmake/modules/WindowsInstaller.cmake | 1 - master/CMakeLists.txt | 4 - master/src/KExtraColumnsProxyModel.cpp | 340 +++++++++++++++++++++ master/src/KExtraColumnsProxyModel.h | 142 +++++++++ master/src/NetworkObjectOverlayDataModel.h | 2 +- 14 files changed, 483 insertions(+), 15 deletions(-) create mode 100644 master/src/KExtraColumnsProxyModel.cpp create mode 100644 master/src/KExtraColumnsProxyModel.h diff --git a/.ci/linux.centos.7.9/Dockerfile b/.ci/linux.centos.7.9/Dockerfile index 9d5644c38..7ae0ca8e3 100644 --- a/.ci/linux.centos.7.9/Dockerfile +++ b/.ci/linux.centos.7.9/Dockerfile @@ -7,7 +7,6 @@ RUN \ yum install -y centos-release-scl && \ yum install -y git devtoolset-7 ninja-build cmake3 rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebkit-devel \ - kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libjpeg-turbo-devel \ zlib-devel \ diff --git a/.ci/linux.centos.8.4/Dockerfile b/.ci/linux.centos.8.4/Dockerfile index 463992a22..6777d015d 100644 --- a/.ci/linux.centos.8.4/Dockerfile +++ b/.ci/linux.centos.8.4/Dockerfile @@ -8,7 +8,6 @@ RUN \ dnf install -y https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-2.el8.noarch.rpm && \ yum install -y git gcc-c++ make ninja-build cmake rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ - kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel \ diff --git a/.ci/linux.debian.bullseye/Dockerfile b/.ci/linux.debian.bullseye/Dockerfile index bba1e9d33..64b24793d 100644 --- a/.ci/linux.debian.bullseye/Dockerfile +++ b/.ci/linux.debian.bullseye/Dockerfile @@ -7,7 +7,6 @@ RUN \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ - libkf5itemmodels-dev \ xorg-dev \ libfakekey-dev \ libpng-dev libjpeg-dev zlib1g-dev liblzo2-dev \ diff --git a/.ci/linux.debian.buster/Dockerfile b/.ci/linux.debian.buster/Dockerfile index 7ce6eb648..2171ee761 100644 --- a/.ci/linux.debian.buster/Dockerfile +++ b/.ci/linux.debian.buster/Dockerfile @@ -8,7 +8,6 @@ RUN \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake/buster-backports rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ - libkf5itemmodels-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/.ci/linux.fedora.34/Dockerfile b/.ci/linux.fedora.34/Dockerfile index f71cb9781..3da191a69 100644 --- a/.ci/linux.fedora.34/Dockerfile +++ b/.ci/linux.fedora.34/Dockerfile @@ -6,7 +6,6 @@ RUN \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ - kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ diff --git a/.ci/linux.fedora.35/Dockerfile b/.ci/linux.fedora.35/Dockerfile index 71688e891..ff62bed09 100644 --- a/.ci/linux.fedora.35/Dockerfile +++ b/.ci/linux.fedora.35/Dockerfile @@ -6,7 +6,6 @@ RUN \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ - kf5-kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ diff --git a/.ci/linux.opensuse.15.3/Dockerfile b/.ci/linux.opensuse.15.3/Dockerfile index 7cbefaa7f..4cad0592c 100644 --- a/.ci/linux.opensuse.15.3/Dockerfile +++ b/.ci/linux.opensuse.15.3/Dockerfile @@ -4,7 +4,6 @@ MAINTAINER Tobias Junghans RUN \ zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel libqt5-qtwebengine-devel \ - kitemmodels-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg8-devel \ diff --git a/.ci/linux.ubuntu.bionic/Dockerfile b/.ci/linux.ubuntu.bionic/Dockerfile index fe5334acb..98b23ff01 100644 --- a/.ci/linux.ubuntu.bionic/Dockerfile +++ b/.ci/linux.ubuntu.bionic/Dockerfile @@ -6,7 +6,6 @@ RUN \ apt-get install --no-install-recommends -y \ git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ - libkf5itemmodels-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/.ci/linux.ubuntu.focal/Dockerfile b/.ci/linux.ubuntu.focal/Dockerfile index 1261657fe..c90c1df4b 100644 --- a/.ci/linux.ubuntu.focal/Dockerfile +++ b/.ci/linux.ubuntu.focal/Dockerfile @@ -7,7 +7,6 @@ RUN \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ - libkf5itemmodels-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/cmake/modules/WindowsInstaller.cmake b/cmake/modules/WindowsInstaller.cmake index f8e8ad6a1..387f92e6f 100644 --- a/cmake/modules/WindowsInstaller.cmake +++ b/cmake/modules/WindowsInstaller.cmake @@ -26,7 +26,6 @@ add_custom_target(windows-binaries COMMAND mv ${WINDOWS_INSTALL_FILES}/plugins/vnchooks.dll ${WINDOWS_INSTALL_FILES} COMMAND mkdir -p ${WINDOWS_INSTALL_FILES}/translations COMMAND cp translations/*qm ${WINDOWS_INSTALL_FILES}/translations/ - COMMAND cp ${DLLDIR}/libKF5ItemModels.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libjpeg-62.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libpng16-16.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libcrypto-1_1*.dll ${DLLDIR}/libssl-1_1*.dll ${WINDOWS_INSTALL_FILES} diff --git a/master/CMakeLists.txt b/master/CMakeLists.txt index 0a91e1207..125a4df55 100644 --- a/master/CMakeLists.txt +++ b/master/CMakeLists.txt @@ -1,8 +1,6 @@ include(BuildVeyonApplication) include(WindowsBuildHelpers) -find_package(KF5ItemModels REQUIRED) - file(GLOB master_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.*) set(master_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/resources/master.qrc) @@ -13,8 +11,6 @@ set(master_RESOURCES ${master_RESOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/qml/qml.qrc build_veyon_application(veyon-master ${master_SOURCES} ${master_RESOURCES}) -target_link_libraries(veyon-master PRIVATE KF5::ItemModels) - add_windows_resource(veyon-master) make_graphical_app(veyon-master) diff --git a/master/src/KExtraColumnsProxyModel.cpp b/master/src/KExtraColumnsProxyModel.cpp new file mode 100644 index 000000000..cb2a58e2d --- /dev/null +++ b/master/src/KExtraColumnsProxyModel.cpp @@ -0,0 +1,340 @@ +/* + SPDX-FileCopyrightText: 2015 Klarälvdalens Datakonsult AB, a KDAB Group company + SPDX-FileContributor: David Faure + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#include "KExtraColumnsProxyModel.h" + +#include + +class KExtraColumnsProxyModelPrivate +{ + Q_DECLARE_PUBLIC(KExtraColumnsProxyModel) + KExtraColumnsProxyModel *const q_ptr; + +public: + KExtraColumnsProxyModelPrivate(KExtraColumnsProxyModel *model) + : q_ptr(model) + { + } + + void _ec_sourceLayoutAboutToBeChanged(const QList &sourceParents, QAbstractItemModel::LayoutChangeHint hint); + void _ec_sourceLayoutChanged(const QList &sourceParents, QAbstractItemModel::LayoutChangeHint hint); + + // Configuration (doesn't change once source model is plugged in) + QVector m_extraHeaders; + + // for layoutAboutToBeChanged/layoutChanged + QVector layoutChangePersistentIndexes; + QVector layoutChangeProxyColumns; + QModelIndexList proxyIndexes; +}; + +KExtraColumnsProxyModel::KExtraColumnsProxyModel(QObject *parent) + : QIdentityProxyModel(parent) + , d_ptr(new KExtraColumnsProxyModelPrivate(this)) +{ +} + +KExtraColumnsProxyModel::~KExtraColumnsProxyModel() +{ +} + +void KExtraColumnsProxyModel::appendColumn(const QString &header) +{ + Q_D(KExtraColumnsProxyModel); + d->m_extraHeaders.append(header); +} + +void KExtraColumnsProxyModel::removeExtraColumn(int idx) +{ + Q_D(KExtraColumnsProxyModel); + d->m_extraHeaders.remove(idx); +} + +bool KExtraColumnsProxyModel::setExtraColumnData(const QModelIndex &parent, int row, int extraColumn, const QVariant &data, int role) +{ + Q_UNUSED(parent); + Q_UNUSED(row); + Q_UNUSED(extraColumn); + Q_UNUSED(data); + Q_UNUSED(role); + return false; +} + +void KExtraColumnsProxyModel::extraColumnDataChanged(const QModelIndex &parent, int row, int extraColumn, const QVector &roles) +{ + const QModelIndex idx = index(row, proxyColumnForExtraColumn(extraColumn), parent); + Q_EMIT dataChanged(idx, idx, roles); +} + +void KExtraColumnsProxyModel::setSourceModel(QAbstractItemModel *model) +{ + if (sourceModel()) { + disconnect(sourceModel(), + SIGNAL(layoutAboutToBeChanged(QList, QAbstractItemModel::LayoutChangeHint)), + this, + SLOT(_ec_sourceLayoutAboutToBeChanged(QList, QAbstractItemModel::LayoutChangeHint))); + disconnect(sourceModel(), + SIGNAL(layoutChanged(QList, QAbstractItemModel::LayoutChangeHint)), + this, + SLOT(_ec_sourceLayoutChanged(QList, QAbstractItemModel::LayoutChangeHint))); + } + + QIdentityProxyModel::setSourceModel(model); + + if (model) { + // The handling of persistent model indexes assumes mapToSource can be called for any index + // This breaks for the extra column, so we'll have to do it ourselves + disconnect(model, + SIGNAL(layoutAboutToBeChanged(QList, QAbstractItemModel::LayoutChangeHint)), + this, + SLOT(_q_sourceLayoutAboutToBeChanged(QList, QAbstractItemModel::LayoutChangeHint))); + disconnect(model, + SIGNAL(layoutChanged(QList, QAbstractItemModel::LayoutChangeHint)), + this, + SLOT(_q_sourceLayoutChanged(QList, QAbstractItemModel::LayoutChangeHint))); + connect(model, + SIGNAL(layoutAboutToBeChanged(QList, QAbstractItemModel::LayoutChangeHint)), + this, + SLOT(_ec_sourceLayoutAboutToBeChanged(QList, QAbstractItemModel::LayoutChangeHint))); + connect(model, + SIGNAL(layoutChanged(QList, QAbstractItemModel::LayoutChangeHint)), + this, + SLOT(_ec_sourceLayoutChanged(QList, QAbstractItemModel::LayoutChangeHint))); + } +} + +QModelIndex KExtraColumnsProxyModel::mapToSource(const QModelIndex &proxyIndex) const +{ + if (!proxyIndex.isValid()) { // happens in e.g. rowCount(mapToSource(parent)) + return QModelIndex(); + } + const int column = proxyIndex.column(); + if (column >= sourceModel()->columnCount()) { + return QModelIndex(); + } + return QIdentityProxyModel::mapToSource(proxyIndex); +} + +QModelIndex KExtraColumnsProxyModel::buddy(const QModelIndex &proxyIndex) const +{ + const int column = proxyIndex.column(); + if (column >= sourceModel()->columnCount()) { + return proxyIndex; + } + return QIdentityProxyModel::buddy(proxyIndex); +} + +QModelIndex KExtraColumnsProxyModel::sibling(int row, int column, const QModelIndex &idx) const +{ + if (row == idx.row() && column == idx.column()) { + return idx; + } + return index(row, column, parent(idx)); +} + +QItemSelection KExtraColumnsProxyModel::mapSelectionToSource(const QItemSelection &selection) const +{ + QItemSelection sourceSelection; + + if (!sourceModel()) { + return sourceSelection; + } + + // mapToSource will give invalid index for our additional columns, so truncate the selection + // to the columns known by the source model + const int sourceColumnCount = sourceModel()->columnCount(); + QItemSelection::const_iterator it = selection.constBegin(); + const QItemSelection::const_iterator end = selection.constEnd(); + for (; it != end; ++it) { + Q_ASSERT(it->model() == this); + QModelIndex topLeft = it->topLeft(); + Q_ASSERT(topLeft.isValid()); + Q_ASSERT(topLeft.model() == this); + topLeft = topLeft.sibling(topLeft.row(), 0); + QModelIndex bottomRight = it->bottomRight(); + Q_ASSERT(bottomRight.isValid()); + Q_ASSERT(bottomRight.model() == this); + if (bottomRight.column() >= sourceColumnCount) { + bottomRight = bottomRight.sibling(bottomRight.row(), sourceColumnCount - 1); + } + // This can lead to duplicate source indexes, so use merge(). + const QItemSelectionRange range(mapToSource(topLeft), mapToSource(bottomRight)); + QItemSelection newSelection; + newSelection << range; + sourceSelection.merge(newSelection, QItemSelectionModel::Select); + } + + return sourceSelection; +} + +int KExtraColumnsProxyModel::columnCount(const QModelIndex &parent) const +{ + Q_D(const KExtraColumnsProxyModel); + return QIdentityProxyModel::columnCount(parent) + d->m_extraHeaders.count(); +} + +QVariant KExtraColumnsProxyModel::data(const QModelIndex &index, int role) const +{ + Q_D(const KExtraColumnsProxyModel); + const int extraCol = extraColumnForProxyColumn(index.column()); + if (extraCol >= 0 && !d->m_extraHeaders.isEmpty()) { + return extraColumnData(index.parent(), index.row(), extraCol, role); + } + return sourceModel()->data(mapToSource(index), role); +} + +bool KExtraColumnsProxyModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + Q_D(const KExtraColumnsProxyModel); + const int extraCol = extraColumnForProxyColumn(index.column()); + if (extraCol >= 0 && !d->m_extraHeaders.isEmpty()) { + return setExtraColumnData(index.parent(), index.row(), extraCol, value, role); + } + return sourceModel()->setData(mapToSource(index), value, role); +} + +Qt::ItemFlags KExtraColumnsProxyModel::flags(const QModelIndex &index) const +{ + const int extraCol = extraColumnForProxyColumn(index.column()); + if (extraCol >= 0) { + // extra columns are readonly + return Qt::ItemIsSelectable | Qt::ItemIsEnabled; + } + return sourceModel() != nullptr ? sourceModel()->flags(mapToSource(index)) : Qt::NoItemFlags; +} + +bool KExtraColumnsProxyModel::hasChildren(const QModelIndex &index) const +{ + if (index.column() > 0) { + return false; + } + return QIdentityProxyModel::hasChildren(index); +} + +QVariant KExtraColumnsProxyModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + Q_D(const KExtraColumnsProxyModel); + if (orientation == Qt::Horizontal) { + const int extraCol = extraColumnForProxyColumn(section); + if (extraCol >= 0) { + // Only text is supported, in headers for extra columns + if (role == Qt::DisplayRole) { + return d->m_extraHeaders.at(extraCol); + } + return QVariant(); + } + } + return QIdentityProxyModel::headerData(section, orientation, role); +} + +QModelIndex KExtraColumnsProxyModel::index(int row, int column, const QModelIndex &parent) const +{ + const int extraCol = extraColumnForProxyColumn(column); + if (extraCol >= 0) { + // We store the internal pointer of the index for column 0 in the proxy index for extra columns. + // This will be useful in the parent method. + return createIndex(row, column, QIdentityProxyModel::index(row, 0, parent).internalPointer()); + } + return QIdentityProxyModel::index(row, column, parent); +} + +QModelIndex KExtraColumnsProxyModel::parent(const QModelIndex &child) const +{ + const int extraCol = extraColumnForProxyColumn(child.column()); + if (extraCol >= 0) { + // Create an index for column 0 and use that to get the parent. + const QModelIndex proxySibling = createIndex(child.row(), 0, child.internalPointer()); + return QIdentityProxyModel::parent(proxySibling); + } + return QIdentityProxyModel::parent(child); +} + +int KExtraColumnsProxyModel::extraColumnForProxyColumn(int proxyColumn) const +{ + if (sourceModel() != nullptr) { + const int sourceColumnCount = sourceModel()->columnCount(); + if (proxyColumn >= sourceColumnCount) { + return proxyColumn - sourceColumnCount; + } + } + return -1; +} + +int KExtraColumnsProxyModel::proxyColumnForExtraColumn(int extraColumn) const +{ + return sourceModel()->columnCount() + extraColumn; +} + +void KExtraColumnsProxyModelPrivate::_ec_sourceLayoutAboutToBeChanged(const QList &sourceParents, + QAbstractItemModel::LayoutChangeHint hint) +{ + Q_Q(KExtraColumnsProxyModel); + + QList parents; + parents.reserve(sourceParents.size()); + for (const QPersistentModelIndex &parent : sourceParents) { + if (!parent.isValid()) { + parents << QPersistentModelIndex(); + continue; + } + const QModelIndex mappedParent = q->mapFromSource(parent); + Q_ASSERT(mappedParent.isValid()); + parents << mappedParent; + } + + Q_EMIT q->layoutAboutToBeChanged(parents, hint); + + const QModelIndexList persistentIndexList = q->persistentIndexList(); + layoutChangePersistentIndexes.reserve(persistentIndexList.size()); + layoutChangeProxyColumns.reserve(persistentIndexList.size()); + + for (QModelIndex proxyPersistentIndex : persistentIndexList) { + proxyIndexes << proxyPersistentIndex; + Q_ASSERT(proxyPersistentIndex.isValid()); + const int column = proxyPersistentIndex.column(); + layoutChangeProxyColumns << column; + if (column >= q->sourceModel()->columnCount()) { + proxyPersistentIndex = proxyPersistentIndex.sibling(proxyPersistentIndex.row(), 0); + } + const QPersistentModelIndex srcPersistentIndex = q->mapToSource(proxyPersistentIndex); + Q_ASSERT(srcPersistentIndex.isValid()); + layoutChangePersistentIndexes << srcPersistentIndex; + } +} + +void KExtraColumnsProxyModelPrivate::_ec_sourceLayoutChanged(const QList &sourceParents, QAbstractItemModel::LayoutChangeHint hint) +{ + Q_Q(KExtraColumnsProxyModel); + for (int i = 0; i < proxyIndexes.size(); ++i) { + const QModelIndex proxyIdx = proxyIndexes.at(i); + QModelIndex newProxyIdx = q->mapFromSource(layoutChangePersistentIndexes.at(i)); + if (proxyIdx.column() >= q->sourceModel()->columnCount()) { + newProxyIdx = newProxyIdx.sibling(newProxyIdx.row(), layoutChangeProxyColumns.at(i)); + } + q->changePersistentIndex(proxyIdx, newProxyIdx); + } + + layoutChangePersistentIndexes.clear(); + layoutChangeProxyColumns.clear(); + proxyIndexes.clear(); + + QList parents; + parents.reserve(sourceParents.size()); + for (const QPersistentModelIndex &parent : sourceParents) { + if (!parent.isValid()) { + parents << QPersistentModelIndex(); + continue; + } + const QModelIndex mappedParent = q->mapFromSource(parent); + Q_ASSERT(mappedParent.isValid()); + parents << mappedParent; + } + + Q_EMIT q->layoutChanged(parents, hint); +} + +#include "moc_KExtraColumnsProxyModel.cpp" diff --git a/master/src/KExtraColumnsProxyModel.h b/master/src/KExtraColumnsProxyModel.h new file mode 100644 index 000000000..813269cec --- /dev/null +++ b/master/src/KExtraColumnsProxyModel.h @@ -0,0 +1,142 @@ +/* + SPDX-FileCopyrightText: 2015 Klarälvdalens Datakonsult AB, a KDAB Group company + SPDX-FileContributor: David Faure + + SPDX-License-Identifier: LGPL-2.0-or-later +*/ + +#ifndef KEXTRACOLUMNSPROXYMODEL_H +#define KEXTRACOLUMNSPROXYMODEL_H + +#include +#include + +class KExtraColumnsProxyModelPrivate; + +/** + * @class KExtraColumnsProxyModel KExtraColumnsProxyModel.h KExtraColumnsProxyModel + * + * This proxy appends extra columns (after all existing columns). + * + * The proxy supports source models that have a tree structure. + * It also supports editing, and propagating changes from the source model. + * Row insertion/removal, column insertion/removal in the source model are supported. + * + * Not supported: adding/removing extra columns at runtime; having a different number of columns in subtrees; + * drag-n-drop support in the extra columns; moving columns. + * + * Derive from KExtraColumnsProxyModel, call appendColumn (typically in the constructor) for each extra column, + * and reimplement extraColumnData() to allow KExtraColumnsProxyModel to retrieve the data to show in the extra columns. + * + * If you want your new column(s) to be somewhere else than at the right of the existing columns, you can + * use a KRearrangeColumnsProxyModel on top. + * + * Author: David Faure, KDAB + * @since 5.13 + */ +class KExtraColumnsProxyModel : public QIdentityProxyModel +{ + Q_OBJECT +public: + /** + * Base class constructor. + * Remember to call setSourceModel afterwards, and appendColumn. + */ + explicit KExtraColumnsProxyModel(QObject *parent = nullptr); + /** + * Destructor. + */ + ~KExtraColumnsProxyModel() override; + + // API + + /** + * Appends an extra column. + * @param header an optional text for the horizontal header + * This does not emit any signals - do it in the initial setup phase + */ + void appendColumn(const QString &header = QString()); + + /** + * Removes an extra column. + * @param idx index of the extra column (starting from 0). + * This does not emit any signals - do it in the initial setup phase + * @since 5.24 + */ + void removeExtraColumn(int idx); + + /** + * This method is called by data() for extra columns. + * Reimplement this method to return the data for the extra columns. + * + * @param parent the parent model index in the proxy model (only useful in tree models) + * @param row the row number for which the proxy model is querying for data (child of @p parent, if set) + * @param extraColumn the number of the extra column, starting at 0 (this doesn't require knowing how many columns the source model has) + * @param role the role being queried + * @return the data at @p row and @p extraColumn + */ + virtual QVariant extraColumnData(const QModelIndex &parent, int row, int extraColumn, int role = Qt::DisplayRole) const = 0; + + // KF6 TODO: add extraColumnFlags() virtual method + + /** + * This method is called by setData() for extra columns. + * Reimplement this method to set the data for the extra columns, if editing is supported. + * Remember to call extraColumnDataChanged() after changing the data storage. + * The default implementation returns false. + */ + virtual bool setExtraColumnData(const QModelIndex &parent, int row, int extraColumn, const QVariant &data, int role = Qt::EditRole); + + /** + * This method can be called by your derived class when the data in an extra column has changed. + * The use case is data that changes "by itself", unrelated to setData. + */ + void extraColumnDataChanged(const QModelIndex &parent, int row, int extraColumn, const QVector &roles); + + /** + * Returns the extra column number (0, 1, ...) for a given column number of the proxymodel. + * This basically means subtracting the amount of columns in the source model. + */ + int extraColumnForProxyColumn(int proxyColumn) const; + /** + * Returns the proxy column number for a given extra column number (starting at 0). + * This basically means adding the amount of columns in the source model. + */ + int proxyColumnForExtraColumn(int extraColumn) const; + + // Implementation + /// @reimp + void setSourceModel(QAbstractItemModel *model) override; + /// @reimp + QModelIndex mapToSource(const QModelIndex &proxyIndex) const override; + /// @reimp + QItemSelection mapSelectionToSource(const QItemSelection &selection) const override; + /// @reimp + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + /// @reimp + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + /// @reimp + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; + /// @reimp + QModelIndex sibling(int row, int column, const QModelIndex &idx) const override; + /// @reimp + QModelIndex buddy(const QModelIndex &index) const override; + /// @reimp + Qt::ItemFlags flags(const QModelIndex &index) const override; + /// @reimp + bool hasChildren(const QModelIndex &index) const override; + /// @reimp + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + /// @reimp + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; + /// @reimp + QModelIndex parent(const QModelIndex &child) const override; + +private: + Q_DECLARE_PRIVATE(KExtraColumnsProxyModel) + Q_PRIVATE_SLOT(d_func(), void _ec_sourceLayoutAboutToBeChanged(const QList &, QAbstractItemModel::LayoutChangeHint)) + Q_PRIVATE_SLOT(d_func(), void _ec_sourceLayoutChanged(const QList &, QAbstractItemModel::LayoutChangeHint)) + const QScopedPointer d_ptr; +}; + +#endif diff --git a/master/src/NetworkObjectOverlayDataModel.h b/master/src/NetworkObjectOverlayDataModel.h index c58e8bf4b..1f57ec11c 100644 --- a/master/src/NetworkObjectOverlayDataModel.h +++ b/master/src/NetworkObjectOverlayDataModel.h @@ -24,7 +24,7 @@ #pragma once -#include "kextracolumnsproxymodel.h" +#include "KExtraColumnsProxyModel.h" #include "NetworkObject.h" class NetworkObjectOverlayDataModel : public KExtraColumnsProxyModel From e9923a2d5c5131113c6d5943f7e4c74b6da2a39d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 28 Feb 2022 12:04:40 +0100 Subject: [PATCH 1337/1765] CMake: create separate PCH dummies for applications/libraries This fixes problems with mixed -fPIC and -fPIE settings for the PCH dummy targets and the target being linked to. --- CMakeLists.txt | 8 +++++++- cmake/modules/BuildVeyonApplication.cmake | 2 +- cmake/modules/BuildVeyonPlugin.cmake | 2 +- cmake/modules/PchHelpers.cmake | 19 +++++++++++++++++++ core/CMakeLists.txt | 22 ++++++---------------- plugins/ldap/common/CMakeLists.txt | 2 +- 6 files changed, 35 insertions(+), 20 deletions(-) create mode 100644 cmake/modules/PchHelpers.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index b90f558fd..8184f30a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,8 +41,13 @@ if(COMMAND CMAKE_POLICY) if(${CMAKE_VERSION} VERSION_GREATER "3.12.0") cmake_policy(SET CMP0075 NEW) endif() - if(${CMAKE_VERSION} VERSION_GREATER "3.14.0") + if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14.0") cmake_policy(SET CMP0083 NEW) + include(CheckPIESupported) + check_pie_supported(LANGUAGES CXX) + if(CMAKE_CXX_LINK_PIE_SUPPORTED) + set(CMAKE_COMPILE_FLAG_PIE "-fPIE") + endif() endif() endif() @@ -54,6 +59,7 @@ include(CheckSymbolExists) include(CheckTypeSize) include(GNUInstallDirs) include(ConfigureFiles) +include(PchHelpers) include(SetDefaultTargetProperties) find_package(Git) diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index ba9b23653..0623022b5 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -15,7 +15,7 @@ macro(build_veyon_application APPLICATION_NAME) set_property(TARGET ${APPLICATION_NAME} PROPERTY POSITION_INDEPENDENT_CODE TRUE) set_default_target_properties(${APPLICATION_NAME}) if(WITH_PCH) - target_precompile_headers(${APPLICATION_NAME} REUSE_FROM veyon-pch) + target_precompile_headers(${APPLICATION_NAME} REUSE_FROM veyon-application-pch) endif() endmacro() diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index 79ca00b69..3496200a4 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -19,7 +19,7 @@ macro(build_veyon_plugin PLUGIN_NAME) set_target_properties(${PLUGIN_NAME} PROPERTIES PREFIX "") install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION ${VEYON_INSTALL_PLUGIN_DIR}) if(WITH_PCH) - target_precompile_headers(${PLUGIN_NAME} REUSE_FROM veyon-pch) + target_precompile_headers(${PLUGIN_NAME} REUSE_FROM veyon-library-pch) endif() endmacro() diff --git a/cmake/modules/PchHelpers.cmake b/cmake/modules/PchHelpers.cmake new file mode 100644 index 000000000..fe5739630 --- /dev/null +++ b/cmake/modules/PchHelpers.cmake @@ -0,0 +1,19 @@ + +macro(add_pch_target TARGET_NAME HEADER) + add_library(${TARGET_NAME} STATIC ${HEADER}) + + if(${CMAKE_VERSION} VERSION_GREATER "3.17.5") + file(GENERATE + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}/empty_pch.cxx + CONTENT "/*empty file*/") + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}/empty_pch.cxx PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_AUTOGEN TRUE) + target_sources(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}/empty_pch.cxx) + endif() + set_default_target_properties(${TARGET_NAME}) + if(WITH_QT6) + target_link_libraries(${TARGET_NAME} PUBLIC Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Widgets) + else() + target_link_libraries(${TARGET_NAME} PUBLIC Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) + endif() + target_precompile_headers(${TARGET_NAME} PUBLIC ${HEADER}) +endmacro() diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index ca464afe7..d40142d47 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -137,22 +137,12 @@ if(VEYON_BUILD_ANDROID) endif() if(WITH_PCH) - target_precompile_headers(veyon-core PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") + set(PCH ${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h) + target_precompile_headers(veyon-core PRIVATE ${PCH}) - add_library(veyon-pch STATIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") + add_pch_target(veyon-application-pch ${PCH}) + set_target_properties(veyon-application-pch PROPERTIES COMPILE_FLAGS "${CMAKE_COMPILE_FLAG_PIE}") - if(${CMAKE_VERSION} VERSION_GREATER "3.17.5") - file(GENERATE - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx - CONTENT "/*empty file*/") - set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_AUTOGEN TRUE) - target_sources(veyon-pch PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/empty_pch.cxx) - endif() - set_default_target_properties(veyon-pch) - if(WITH_QT6) - target_link_libraries(veyon-pch PUBLIC Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Widgets) - else() - target_link_libraries(veyon-pch PUBLIC Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) - endif() - target_precompile_headers(veyon-pch PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src/PrecompiledHeader.h") + add_pch_target(veyon-library-pch ${PCH}) + set_target_properties(veyon-library-pch PROPERTIES POSITION_INDEPENDENT_CODE TRUE) endif() diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index 61a1965b2..b75be3d53 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -29,7 +29,7 @@ target_include_directories(ldap-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(ldap-common PRIVATE kldap-light veyon-core) set_default_target_properties(ldap-common) if(WITH_PCH) - target_precompile_headers(ldap-common REUSE_FROM veyon-pch) + target_precompile_headers(ldap-common REUSE_FROM veyon-library-pch) endif() if(NOT WITH_CORE_ONLY) install(TARGETS ldap-common DESTINATION ${VEYON_LIB_DIR}) From 89dd72171a65cea4c87776cd8b92c70218497c2a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 28 Feb 2022 12:04:42 +0100 Subject: [PATCH 1338/1765] CI: drop CentOS 8.4 builds CentOS 8 is EOL. --- .ci/linux.centos.8.4/Dockerfile | 23 ----------------------- .ci/linux.centos.8.4/script.sh | 8 -------- .github/workflows/build.yml | 1 - .gitlab-ci.yml | 1 - 4 files changed, 33 deletions(-) delete mode 100644 .ci/linux.centos.8.4/Dockerfile delete mode 100755 .ci/linux.centos.8.4/script.sh diff --git a/.ci/linux.centos.8.4/Dockerfile b/.ci/linux.centos.8.4/Dockerfile deleted file mode 100644 index 6777d015d..000000000 --- a/.ci/linux.centos.8.4/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM centos:8.4.2105 -MAINTAINER Tobias Junghans - -RUN \ - yum --enablerepo=extras install -y epel-release dnf-plugins-core && \ - yum install -y https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm && \ - yum config-manager --set-enabled powertools && \ - dnf install -y https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-2.el8.noarch.rpm && \ - yum install -y git gcc-c++ make ninja-build cmake rpm-build fakeroot \ - qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ - libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ - libfakekey-devel \ - libjpeg-turbo-devel \ - zlib-devel \ - libpng-devel \ - openssl-devel \ - pam-devel \ - procps-ng-devel \ - lzo-devel \ - qca-qt5-devel qca-qt5-ossl \ - ffmpeg-devel \ - cyrus-sasl-devel \ - openldap-devel diff --git a/.ci/linux.centos.8.4/script.sh b/.ci/linux.centos.8.4/script.sh deleted file mode 100755 index 6b226308c..000000000 --- a/.ci/linux.centos.8.4/script.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_PCH=OFF" - -$1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "centos-8.4" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bad3b0ba9..3427dc98b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,6 @@ jobs: strategy: matrix: dist: - - centos.8.4 - debian.buster - fedora.35 - opensuse.tumbleweed diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1b48b94f3..e2ace671e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,7 +11,6 @@ build-linux: matrix: - DISTRO: - centos.7.9 - - centos.8.4 - debian.buster - debian.bullseye - fedora.34 From 941324bea1a8d25c89b1c1052ad13229e2fd1bfc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 28 Feb 2022 13:22:06 +0100 Subject: [PATCH 1339/1765] CMake: require 3.10 or newer --- CMakeLists.txt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8184f30a7..6677c591b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ -cmake_minimum_required(VERSION 3.1.0) +cmake_minimum_required(VERSION 3.10.0) +message("Using CMake ${CMAKE_VERSION}") project(veyon) @@ -31,14 +32,11 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS 1) if(COMMAND CMAKE_POLICY) cmake_policy(SET CMP0009 NEW) - cmake_policy(SET CMP0020 NEW) cmake_policy(SET CMP0022 NEW) cmake_policy(SET CMP0058 NEW) cmake_policy(SET CMP0063 NEW) - if(${CMAKE_VERSION} VERSION_GREATER "3.8.0") - cmake_policy(SET CMP0069 NEW) - endif() - if(${CMAKE_VERSION} VERSION_GREATER "3.12.0") + cmake_policy(SET CMP0069 NEW) + if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0") cmake_policy(SET CMP0075 NEW) endif() if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14.0") From 65be60c2761aaeeeb16835a038faaa7270368cb0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 08:26:56 +0100 Subject: [PATCH 1340/1765] Create SECURITY.md --- SECURITY.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..93e6bc121 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,14 @@ +# Security Policy + +## Supported Versions + +Usually, only the latest stable release series is provided with security updates. In addition, customers with maintenance contracts are provided with updates for the respective releases in use. + +| Version | Supported | +| ------- | ------------------ | +| 4.7.x | :white_check_mark: | +| < 4.7.x | :x: | + +## Reporting a Vulnerability + +If you have found a security-related bug in Veyon, please contact us via email at security@veyon.io to disclose the details about your findings. As soon as we learn about potential security vulnerabilities, we will work together to analyze and fix them as soon as possible. From 536342fa621b7e7d8f3672876f98d6115d1619f9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 08:30:17 +0100 Subject: [PATCH 1341/1765] Update SECURITY.md --- SECURITY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 93e6bc121..520337358 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,8 +6,8 @@ Usually, only the latest stable release series is provided with security updates | Version | Supported | | ------- | ------------------ | -| 4.7.x | :white_check_mark: | -| < 4.7.x | :x: | +| 4.7.x | ✔️ | +| < 4.7.x | ❌ | ## Reporting a Vulnerability From 1debefdbf3648ea49745d20dc823e5e36d73c165 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 09:40:43 +0100 Subject: [PATCH 1342/1765] 3rdparty: libvncserver: update submodule --- 3rdparty/libvncserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index a30177fd4..b36c293b8 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit a30177fd40a636a3940bfbb762d7ee0f935ed27d +Subproject commit b36c293b8da3247f59b01d7fde8f05ca04297229 From 88fd0304fd04ebc9d5a64fa8b854662856d0cd1b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 09:40:51 +0100 Subject: [PATCH 1343/1765] 3rdparty: x11vnc: update submodule --- 3rdparty/x11vnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/x11vnc b/3rdparty/x11vnc index c5fff1332..c173a632b 160000 --- a/3rdparty/x11vnc +++ b/3rdparty/x11vnc @@ -1 +1 @@ -Subproject commit c5fff1332391d957aa27aed564723ff981c1c7b8 +Subproject commit c173a632b8aa216a1f016d78af87a84edddae093 From 47675d04585d128f0d219b1597d6cd16eb6b6cc9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 09:41:21 +0100 Subject: [PATCH 1344/1765] BuiltinX11VncServer: fix potential multiplication overflow --- plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c b/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c index a7a6ad3e7..6dbcd78a1 100644 --- a/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c +++ b/plugins/vncserver/x11vnc-builtin/x11vnc-veyon.c @@ -44,7 +44,7 @@ static XImage* createXShmTestImage( Display* display, XShmSegmentInfo* shm ) return NULL; } - shm->shmid = shmget(IPC_PRIVATE, xim->bytes_per_line * xim->height, IPC_CREAT | 0600); + shm->shmid = shmget(IPC_PRIVATE, (size_t)xim->bytes_per_line * xim->height, IPC_CREAT | 0600); if( shm->shmid == -1 ) { From fd8dfd27eaf6817ee9bceb795bd5d80c383d17ff Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 09:43:21 +0100 Subject: [PATCH 1345/1765] VncClientProtocol: fix potential multiplication overflows --- core/src/VncClientProtocol.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 7d27d76df..92c559531 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -562,12 +562,12 @@ bool VncClientProtocol::handleRect( QBuffer& buffer, rfbFramebufferUpdateRectHea case rfbEncodingXCursor: return width * height == 0 || ( buffer.read( sz_rfbXCursorColors ).size() == sz_rfbXCursorColors && - buffer.read( 2 * bytesPerRow * height ).size() == static_cast( 2 * bytesPerRow * height ) ); + buffer.read( size_t(2) * bytesPerRow * height ).size() == static_cast( 2 * bytesPerRow * height ) ); case rfbEncodingRichCursor: return width * height == 0 || - ( buffer.read( width * height * bytesPerPixel ).size() == static_cast( width * height * bytesPerPixel ) && - buffer.read( bytesPerRow * height ).size() == static_cast( bytesPerRow * height ) ); + ( buffer.read( size_t(width) * height * bytesPerPixel ).size() == static_cast( width * height * bytesPerPixel ) && + buffer.read( size_t(bytesPerRow) * height ).size() == static_cast( bytesPerRow * height ) ); case rfbEncodingSupportedMessages: return buffer.read( sz_rfbSupportedMessages ).size() == sz_rfbSupportedMessages; @@ -578,7 +578,7 @@ bool VncClientProtocol::handleRect( QBuffer& buffer, rfbFramebufferUpdateRectHea return buffer.read( width ).size() == static_cast( width ); case rfbEncodingRaw: - return buffer.read( width * height * bytesPerPixel ).size() == static_cast( width * height * bytesPerPixel ); + return buffer.read( size_t(width) * height * bytesPerPixel ).size() == static_cast( width * height * bytesPerPixel ); case rfbEncodingCopyRect: return buffer.read( sz_rfbCopyRect ).size() == sz_rfbCopyRect; From 8310034daeeab95632ec0037b5b9e34668b7bc6d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 09:50:33 +0100 Subject: [PATCH 1346/1765] CI: disable translation file processing for non-release builds --- .ci/common/linux-build.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.ci/common/linux-build.sh b/.ci/common/linux-build.sh index 31da81b49..a8b308a5b 100755 --- a/.ci/common/linux-build.sh +++ b/.ci/common/linux-build.sh @@ -8,15 +8,17 @@ BUILD=$2 mkdir -p $BUILD cd $BUILD -if [ ! -z "$CI_COMMIT_TAG" -o ! -z "$TRAVIS_TAG" ] ; then +if [ ! -z "$CI_COMMIT_TAG" ] ; then BUILD_TYPE="RelWithDebInfo" LTO="ON" + TRANSLATIONS="ON" else BUILD_TYPE="Debug" LTO="OFF" + TRANSLATIONS="OFF" fi -cmake -G Ninja -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=/usr -DWITH_LTO=$LTO $CMAKE_FLAGS $SRC +cmake -G Ninja -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=/usr -DWITH_LTO=$LTO -DWITH_TRANSLATIONS=$TRANSLATIONS $CMAKE_FLAGS $SRC if [ -z "$3" ] ; then ninja From 30a07fdf5bca2728a990e9808c892c8279ac3c8f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 09:53:23 +0100 Subject: [PATCH 1347/1765] CI: build.yml: set workflow name --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3427dc98b..40113433f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,3 +1,4 @@ +name: "CI Builds" on: [push] jobs: build-linux: From 14191002eccbaacca96c2aa5a25a33dc92f96af3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 10:41:38 +0100 Subject: [PATCH 1348/1765] CI: add codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 60 +++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 000000000..160512c01 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,60 @@ +name: "CodeQL" + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'cpp' ] + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + submodules: true + + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + + - name: Install dependencies + run: > + sudo apt-get install --no-install-recommends -y + cmake + ninja-build + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev + xorg-dev + libfakekey-dev + libjpeg-dev + zlib1g-dev + libssl-dev + libpam0g-dev + libprocps-dev + libldap2-dev libsasl2-dev + libpng-dev + liblzo2-dev + libqca-qt5-2-dev libqca-qt5-2-plugins + + - name: Build + run: | + mkdir -p $GITHUB_WORKSPACE/build + cd $GITHUB_WORKSPACE/build + cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_LTO=OFF -DWITH_TRANSLATIONS=OFF .. + ninja + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 From 2043dd04a2296e38bb8c54a500a2155aa84c574f Mon Sep 17 00:00:00 2001 From: ysf Date: Wed, 2 Mar 2022 21:05:34 +0100 Subject: [PATCH 1349/1765] VeyonAuthHelper: add account validity check Up to now disabled or expired accounts inadvertently have been treated as properly authenticated. --- plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp index 809bea21d..ca5f9cc1e 100644 --- a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp +++ b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp @@ -92,6 +92,14 @@ int main() { printf( "pam_authenticate: %s\n", pam_strerror( pamh, err ) ); } + else + { + err = pam_acct_mgmt( pamh, PAM_SILENT ); + if( err != PAM_SUCCESS ) + { + printf( "pam_acct_mgmt: %s\n", pam_strerror( pamh, err ) ); + } + } } else { From 5b64db11960941f7effa6456dea30288b83d4d21 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Mar 2022 15:39:22 +0100 Subject: [PATCH 1350/1765] FeatureMessage: use enum item name as key for argument map A static_assert in QMetaEnum (used by EnumHelper) ensures that only values from enums registered at the Qt's meta system are passed. --- core/src/FeatureMessage.h | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/core/src/FeatureMessage.h b/core/src/FeatureMessage.h index 95c1f265e..609ab72fc 100644 --- a/core/src/FeatureMessage.h +++ b/core/src/FeatureMessage.h @@ -26,6 +26,7 @@ #include +#include "EnumHelper.h" #include "Feature.h" class QIODevice; @@ -88,17 +89,21 @@ class VEYON_CORE_EXPORT FeatureMessage return m_arguments; } - template - FeatureMessage& addArgument( T index, const QVariant& value ) + template + FeatureMessage& addArgument(T index, const QVariant& value) { - m_arguments[QString::number( static_cast( index ) )] = value; + const auto indexString = EnumHelper::toString(index); + if (indexString.isEmpty() == false) + { + m_arguments[indexString] = value; + } return *this; } - template - QVariant argument( T index ) const + template + QVariant argument(T index) const { - return m_arguments[QString::number( static_cast( index ) )]; + return m_arguments[EnumHelper::toString(index)]; } bool send( QIODevice* ioDevice ) const; From f46eb24f09f6d204e96cc144dd7c09fe857623a0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Mar 2022 13:16:04 +0100 Subject: [PATCH 1351/1765] 3rdparty: libvncserver: update submodule --- 3rdparty/libvncserver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index b36c293b8..dcd031d0c 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit b36c293b8da3247f59b01d7fde8f05ca04297229 +Subproject commit dcd031d0cd694695a55080c3bc2c42bc4c3ad7ac From 654386f8eba6a18c42ef14b94a6fd5140a76c004 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Mar 2022 13:35:48 +0100 Subject: [PATCH 1352/1765] VeyonConfiguration: default ComputerDoubleClickFeature to remote view --- core/src/VeyonConfigurationProperties.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index d9cb2d82a..615869982 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -122,7 +122,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, hideOwnSession, setHideOwnSession, "HideOwnSession", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, hideEmptyLocations, setHideEmptyLocations, "HideEmptyLocations", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, hideComputerFilter, setHideComputerFilter, "HideComputerFilter", "Master", false, Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), QUuid, computerDoubleClickFeature, setComputerDoubleClickFeature, "ComputerDoubleClickFeature", "Master", QUuid(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), QUuid, computerDoubleClickFeature, setComputerDoubleClickFeature, "ComputerDoubleClickFeature", "Master", QUuid(QStringLiteral("a18e545b-1321-4d4e-ac34-adc421c6e9c8")), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, enforceSelectedModeForClients, setEnforceSelectedModeForClients, "EnforceSelectedModeForClients", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, autoOpenComputerSelectPanel, setAutoOpenComputerSelectPanel, "AutoOpenComputerSelectPanel", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, confirmUnsafeActions, setConfirmUnsafeActions, "ConfirmUnsafeActions", "Master", false, Configuration::Property::Flag::Standard ) \ From 51889b8817d35df0717f7600ede5e0a479242c89 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 16 Mar 2022 13:38:44 +0100 Subject: [PATCH 1353/1765] 3rdparty: x11vnc: update submodule --- 3rdparty/x11vnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/x11vnc b/3rdparty/x11vnc index c173a632b..c4e06d956 160000 --- a/3rdparty/x11vnc +++ b/3rdparty/x11vnc @@ -1 +1 @@ -Subproject commit c173a632b8aa216a1f016d78af87a84edddae093 +Subproject commit c4e06d9568f6699faf505acc79ee219b3ed04072 From d588427c1bf1298ca16081062b77ef88312c37f0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 16 Mar 2022 13:38:53 +0100 Subject: [PATCH 1354/1765] 3rdparty: kldap: update submodule --- 3rdparty/kldap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/kldap b/3rdparty/kldap index 0736944c1..23abaa68c 160000 --- a/3rdparty/kldap +++ b/3rdparty/kldap @@ -1 +1 @@ -Subproject commit 0736944c1c01a86e702bf0ed258c10923388652c +Subproject commit 23abaa68c3c43770e86998af38b3c8b2ffde4667 From f01a1129f7340fd5a62d54ee514c72000c82c2ed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 16 Mar 2022 16:28:20 +0100 Subject: [PATCH 1355/1765] 3rdparty: ultravnc: update submodule (1.3.8.1) --- 3rdparty/ultravnc | 2 +- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index ef44e79b8..b8e2a6760 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit ef44e79b801fad4d32f1072153298b576dacc23f +Subproject commit b8e2a6760d3b1ff1f85f695550b6efe391a6ce6f diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index a35a3d74a..bd802ddcf 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -55,6 +55,7 @@ set(ultravnc_CXX_SOURCES ${ultravnc_DIR}/winvnc/winvnc/ScreenCapture.cpp ${ultravnc_DIR}/winvnc/winvnc/DeskdupEngine.cpp ${ultravnc_DIR}/winvnc/winvnc/vsocket.cpp + ${ultravnc_DIR}/winvnc/winvnc/LayeredWindows.cpp ${ultravnc_DIR}/winvnc/omnithread/nt.cpp ${ultravnc_DIR}/common/Clipboard.cpp ${ultravnc_DIR}/common/win32_helpers.cpp From 833764e8c3d6c9f1efeb09cdcfa89eda2f53b5f1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 17 Mar 2022 08:56:50 +0100 Subject: [PATCH 1356/1765] CMake: improve QCA detection and simplify Qt5/6 integration --- CMakeLists.txt | 5 +- cmake/modules/CreateTranslations.cmake | 12 +- cmake/modules/FindQCA.cmake | 108 ------------------ cmake/modules/PchHelpers.cmake | 6 +- core/CMakeLists.txt | 41 +++---- plugins/ldap/common/CMakeLists.txt | 2 +- plugins/ldap/kldap/CMakeLists.txt | 6 +- plugins/platform/linux/CMakeLists.txt | 4 +- .../platform/linux/auth-helper/CMakeLists.txt | 7 +- plugins/platform/windows/CMakeLists.txt | 3 +- 10 files changed, 30 insertions(+), 164 deletions(-) delete mode 100644 cmake/modules/FindQCA.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 6677c591b..d40c82c94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,8 +163,10 @@ endif() # find required Qt modules option(WITH_QT6 "Build for Qt 6" OFF) if(WITH_QT6) + set(QT_MAJOR_VERSION 6) find_package(Qt6 COMPONENTS Core + Core5Compat Concurrent Gui Widgets @@ -179,6 +181,7 @@ if(WITH_QT6) find_package(Qt6 COMPONENTS AndroidExtras REQUIRED) endif() else() + set(QT_MAJOR_VERSION 5) find_package(Qt5Core REQUIRED) find_package(Qt5Concurrent REQUIRED) find_package(Qt5Gui REQUIRED) @@ -195,7 +198,7 @@ else() endif() # find required libraries -find_package(QCA REQUIRED) +find_package(Qca-qt${QT_MAJOR_VERSION} REQUIRED) find_package(OpenSSL REQUIRED) # find Linux-specific packages diff --git a/cmake/modules/CreateTranslations.cmake b/cmake/modules/CreateTranslations.cmake index e8f4ab52a..68b25100f 100644 --- a/cmake/modules/CreateTranslations.cmake +++ b/cmake/modules/CreateTranslations.cmake @@ -10,14 +10,6 @@ function(create_translations name ts_files source_files) return() endif() - if(WITH_QT6) - set(LUPDATE Qt6::lupdate) - set(LRELEASE Qt6::lrelease) - else() - set(LUPDATE ${Qt5_LUPDATE_EXECUTABLE}) - set(LRELEASE ${Qt5_LRELEASE_EXECUTABLE}) - endif() - set(qm_targets "") foreach(ts_file ${ts_files}) string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" ts_filename "${ts_file}") @@ -26,12 +18,12 @@ function(create_translations name ts_files source_files) set(qm_target "${basename}_qm") set(qm_file "${CMAKE_CURRENT_BINARY_DIR}/${basename}.qm") add_custom_command(OUTPUT ${ts_file} - COMMAND ${LUPDATE} -locations none -no-obsolete ${source_files} -ts ${ts_file} + COMMAND Qt${QT_MAJOR_VERSION}::lupdate -locations none -no-obsolete ${source_files} -ts ${ts_file} DEPENDS ${source_files}) add_custom_target(${ts_target} DEPENDS ${ts_file}) # add command and target for generating/updating QM file if TS file is newer or no QM file exists yet add_custom_command(OUTPUT ${qm_file} - COMMAND ${LRELEASE} ${ts_file} -qm ${qm_file} + COMMAND Qt${QT_MAJOR_VERSION}::lrelease ${ts_file} -qm ${qm_file} DEPENDS ${ts_file}) add_custom_target(${qm_target} DEPENDS ${qm_file}) diff --git a/cmake/modules/FindQCA.cmake b/cmake/modules/FindQCA.cmake deleted file mode 100644 index 6979c3765..000000000 --- a/cmake/modules/FindQCA.cmake +++ /dev/null @@ -1,108 +0,0 @@ -# Find QCA (Qt Cryptography Architecture 2+) -# ~~~~~~~~~~~~~~~~ -# When run this will define -# -# QCA_FOUND - system has QCA -# QCA_LIBRARY - the QCA library or framework -# QCA_INCLUDE_DIR - the QCA include directory -# QCA_VERSION_STR - e.g. "2.0.3" -# -# Copyright (c) 2006, Michael Larouche, -# Copyright (c) 2014, Larry Shaffer, -# -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - - -if(QCA_INCLUDE_DIR AND QCA_LIBRARY) - - set(QCA_FOUND TRUE) - -else() - - if(WITH_QT6) - set(QCA_SUFFIX "qt6") - else() - set(QCA_SUFFIX "qt5") - endif() - - find_library(QCA_LIBRARY - NAMES qca-${QCA_SUFFIX} qca2-${QCA_SUFFIX} - PATHS - ${LIB_DIR} - $ENV{LIB} - "$ENV{LIB_DIR}" - /usr/local/lib - ) - - set(_qca_fw) - if(QCA_LIBRARY MATCHES "/qca.*\\.framework") - string(REGEX REPLACE "^(.*/qca.*\\.framework).*$" "\\1" _qca_fw "${QCA_LIBRARY}") - endif() - - find_path(QCA_INCLUDE_DIR - NAMES QtCrypto - PATHS - "${_qca_fw}/Headers" - ${LIB_DIR}/include - "$ENV{LIB_DIR}/include" - $ENV{INCLUDE} - /usr/local/include - PATH_SUFFIXES QtCrypto - ${QCA_SUFFIX}/QtCrypto - Qca-${QCA_SUFFIX}/QtCrypto - qt/Qca-${QCA_SUFFIX}/QtCrypto - qt5/Qca-${QCA_SUFFIX}/QtCrypto - qt6/Qca-${QCA_SUFFIX}/QtCrypto - ) - - if(QCA_LIBRARY AND QCA_INCLUDE_DIR) - set(QCA_FOUND TRUE) - endif() - -endif() - -if(NOT QCA_FOUND) - - if(QCA_FIND_REQUIRED) - message(FATAL_ERROR "Could not find QCA") - else() - message(STATUS "Could not find QCA") - endif() - -else() - - # Check version is valid (>= 2.0.3) - # find_package(QCA 2.0.3) works with 2.1.0+, which has a QcaConfigVersion.cmake, but 2.0.3 does not - - # qca_version.h header only available with 2.1.0+ - set(_qca_version_h "${QCA_INCLUDE_DIR}/qca_version.h") - if(EXISTS "${_qca_version_h}") - file(STRINGS "${_qca_version_h}" _qca_version_str REGEX "^.*QCA_VERSION_STR +\"[^\"]+\".*$") - string(REGEX REPLACE "^.*QCA_VERSION_STR +\"([^\"]+)\".*$" "\\1" QCA_VERSION_STR "${_qca_version_str}") - else() - # qca_core.h contains hexadecimal version in <= 2.0.3 - set(_qca_core_h "${QCA_INCLUDE_DIR}/qca_core.h") - if(EXISTS "${_qca_core_h}") - file(STRINGS "${_qca_core_h}" _qca_version_str REGEX "^#define +QCA_VERSION +0x[0-9a-fA-F]+.*") - string(REGEX REPLACE "^#define +QCA_VERSION +0x([0-9a-fA-F]+)$" "\\1" _qca_version_int "${_qca_version_str}") - if("${_qca_version_int}" STREQUAL "020003") - set(QCA_VERSION_STR "2.0.3") - endif() - endif() - endif() - - if(NOT QCA_VERSION_STR) - set(QCA_FOUND FALSE) - if(QCA_FIND_REQUIRED) - message(FATAL_ERROR "Could not find QCA >= 2.0.3") - else() - message(STATUS "Could not find QCA >= 2.0.3") - endif() - else() - if(NOT QCA_FIND_QUIETLY) - message(STATUS "Found QCA: ${QCA_LIBRARY} (${QCA_VERSION_STR})") - endif() - endif() - -endif() diff --git a/cmake/modules/PchHelpers.cmake b/cmake/modules/PchHelpers.cmake index fe5739630..c3bbb5c49 100644 --- a/cmake/modules/PchHelpers.cmake +++ b/cmake/modules/PchHelpers.cmake @@ -10,10 +10,6 @@ macro(add_pch_target TARGET_NAME HEADER) target_sources(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}/empty_pch.cxx) endif() set_default_target_properties(${TARGET_NAME}) - if(WITH_QT6) - target_link_libraries(${TARGET_NAME} PUBLIC Qt6::Core Qt6::Concurrent Qt6::Network Qt6::Widgets) - else() - target_link_libraries(${TARGET_NAME} PUBLIC Qt5::Core Qt5::Concurrent Qt5::Network Qt5::Widgets) - endif() + target_link_libraries(${TARGET_NAME} PUBLIC Qt${QT_MAJOR_VERSION}::Core Qt${QT_MAJOR_VERSION}::Concurrent Qt${QT_MAJOR_VERSION}::Network Qt${QT_MAJOR_VERSION}::Widgets) target_precompile_headers(${TARGET_NAME} PUBLIC ${HEADER}) endmacro() diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index d40142d47..b988341fa 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -69,34 +69,27 @@ target_include_directories(veyon-core PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src - ${QCA_INCLUDE_DIR} + ) + +target_link_libraries(veyon-core PUBLIC + Qt${QT_MAJOR_VERSION}::Concurrent + Qt${QT_MAJOR_VERSION}::Gui + Qt${QT_MAJOR_VERSION}::Network + Qt${QT_MAJOR_VERSION}::Widgets + Qt${QT_MAJOR_VERSION}::QuickControls2 + qca-qt${QT_MAJOR_VERSION} ) if(WITH_QT6) - target_link_libraries(veyon-core PUBLIC - Qt6::Concurrent - Qt6::Gui - Qt6::Network - Qt6::Widgets - Qt6::QuickControls2) - if(WITH_TESTS) - target_link_libraries(veyon-core PUBLIC Qt6::Test) - endif() -else() - target_link_libraries(veyon-core PUBLIC - Qt5::Concurrent - Qt5::Gui - Qt5::Network - Qt5::Widgets - Qt5::QuickControls2) - if(WITH_TESTS) - target_link_libraries(veyon-core PUBLIC Qt5::Test) - endif() + # required by qca-qt6 + target_link_libraries(veyon-core PUBLIC Qt6::Core5Compat) endif() -target_link_libraries(veyon-core PUBLIC - OpenSSL::SSL - ${QCA_LIBRARY}) +if(WITH_TESTS) + target_link_libraries(veyon-core PUBLIC Qt${QT_MAJOR_VERSION}::Test) +endif() + +target_link_libraries(veyon-core PUBLIC OpenSSL::SSL) if(LibVNCClient_FOUND) target_link_libraries(veyon-core PRIVATE LibVNC::LibVNCClient) @@ -133,7 +126,7 @@ else() endif() if(VEYON_BUILD_ANDROID) - target_link_libraries(veyon-core PRIVATE Qt5::AndroidExtras) + target_link_libraries(veyon-core PRIVATE Qt${QT_MAJOR_VERSION}::AndroidExtras) endif() if(WITH_PCH) diff --git a/plugins/ldap/common/CMakeLists.txt b/plugins/ldap/common/CMakeLists.txt index b75be3d53..f39fad943 100644 --- a/plugins/ldap/common/CMakeLists.txt +++ b/plugins/ldap/common/CMakeLists.txt @@ -24,7 +24,7 @@ set(ldap_common_SOURCES ) add_library(ldap-common SHARED ${ldap_common_SOURCES}) -target_include_directories(ldap-common PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +target_include_directories(ldap-common PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${Ldap_INCLUDE_DIRS}) target_include_directories(ldap-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(ldap-common PRIVATE kldap-light veyon-core) set_default_target_properties(ldap-common) diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index fcc9d9cf3..0d4fb1b1f 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -39,11 +39,7 @@ set(kldap_SOURCES ) add_library(kldap-light SHARED ${kldap_SOURCES}) -if(WITH_QT6) - target_link_libraries(kldap-light PRIVATE Qt6::Core) -else() - target_link_libraries(kldap-light PRIVATE Qt5::Core) -endif() +target_link_libraries(kldap-light PRIVATE Qt${QT_MAJOR_VERSION}::Core) target_link_libraries(kldap-light PUBLIC ${Ldap_LIBRARIES} ${Sasl2_LIBRARIES}) target_include_directories(kldap-light PRIVATE ${Ldap_INCLUDE_DIRS}) target_include_directories(kldap-light PUBLIC ${kldap_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index dd2ec626a..213dee746 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -65,12 +65,12 @@ target_include_directories(linux-platform PRIVATE if(WITH_QT6) find_package(Qt6 COMPONENTS DBus REQUIRED) - target_link_libraries(linux-platform PRIVATE Qt6::DBus) else() find_package(Qt5DBus REQUIRED) - target_link_libraries(linux-platform PRIVATE Qt5::DBus) endif() +target_link_libraries(linux-platform PRIVATE Qt${QT_MAJOR_VERSION}::DBus) + target_link_libraries(linux-platform PRIVATE ${X11_LIBRARIES} ${procps_LDFLAGS}) diff --git a/plugins/platform/linux/auth-helper/CMakeLists.txt b/plugins/platform/linux/auth-helper/CMakeLists.txt index e22bcae7c..46840492c 100644 --- a/plugins/platform/linux/auth-helper/CMakeLists.txt +++ b/plugins/platform/linux/auth-helper/CMakeLists.txt @@ -9,11 +9,6 @@ add_executable(veyon-auth-helper ${CMAKE_CURRENT_SOURCE_DIR}/VeyonAuthHelper.cpp set_default_target_properties(veyon-auth-helper) target_include_directories(veyon-auth-helper PRIVATE ${PAM_INCLUDE_DIR}) -if(WITH_QT6) - target_link_libraries(veyon-auth-helper PRIVATE Qt6::Core) -else() - target_link_libraries(veyon-auth-helper PRIVATE Qt5::Core) -endif() -target_link_libraries(veyon-auth-helper PRIVATE ${PAM_LIBRARY}) +target_link_libraries(veyon-auth-helper PRIVATE ${PAM_LIBRARY} Qt${QT_MAJOR_VERSION}::Core) install(TARGETS veyon-auth-helper RUNTIME DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE SETUID GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index 37cee5baf..d00117973 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -54,11 +54,10 @@ target_include_directories(windows-platform PRIVATE ${ultravnc_DIR}/addon/ms-logon/authSSP ${ultravnc_DIR}/winvnc/winvnc ${ultravnc_DIR} - ${Qt5Gui_PRIVATE_INCLUDE_DIRS} ) target_link_libraries(windows-platform PRIVATE -lws2_32 -lwtsapi32 -lnetapi32 -luserenv -linterception -liphlpapi) -target_link_libraries(windows-platform PRIVATE Qt6::GuiPrivate) +target_link_libraries(windows-platform PRIVATE Qt${QT_MAJOR_VERSION}::GuiPrivate) target_compile_definitions(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) target_compile_options(windows-platform PRIVATE "-Wno-unknown-pragmas") set_source_files_properties(WindowsNetworkFunctions.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE SKIP_PRECOMPILE_HEADERS TRUE) From bc864914824aa2a9f9e0b36df4fa7c3398bd85ae Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 17 Mar 2022 11:25:06 +0100 Subject: [PATCH 1357/1765] CI: codeql-analysis: update apt cache before install --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 160512c01..4646990bc 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: - name: Install dependencies run: > - sudo apt-get install --no-install-recommends -y + sudo apt-get update && sudo apt-get install --no-install-recommends -y cmake ninja-build qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev From db4daed7d7388127881e136233581ce399f865ed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 22 Mar 2022 10:48:19 +0100 Subject: [PATCH 1358/1765] Core: Filesystem: add support for more path variables This adds support for the %DESKTOP%, %DOCUMENTS%, %DOWNLOADS%, %PICTURES% and %VIDEOS% path variables. --- core/src/Filesystem.cpp | 46 +++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index fbe1b6df1..2b38d932b 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "VeyonConfiguration.h" #include "Filesystem.h" @@ -39,6 +40,11 @@ QString Filesystem::expandPath( QString path ) const replace( QStringLiteral( "$HOSTNAME" ), QHostInfo::localHostName() ). replace( QStringLiteral( "%PROFILE%" ), QDir::homePath() ). replace( QStringLiteral( "$PROFILE" ), QDir::homePath() ). + replace(QStringLiteral("%DESKTOP%"), QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)). + replace(QStringLiteral("%DOCUMENTS%"), QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)). + replace(QStringLiteral("%DOWNLOADS%"), QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)). + replace(QStringLiteral("%PICTURES%"), QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)). + replace(QStringLiteral("%VIDEOS%"), QStandardPaths::writableLocation(QStandardPaths::MoviesLocation)). replace( QStringLiteral( "%APPDATA%" ), VeyonCore::platform().filesystemFunctions().personalAppDataPath() ). replace( QStringLiteral( "$APPDATA" ), VeyonCore::platform().filesystemFunctions().personalAppDataPath() ). replace( QStringLiteral( "%GLOBALAPPDATA%" ), VeyonCore::platform().filesystemFunctions().globalAppDataPath() ). @@ -66,25 +72,33 @@ QString Filesystem::shrinkPath( QString path ) const { path = QDir::toNativeSeparators( path ); - const QString envVar( QStringLiteral( "%%1%" ) ); + const auto tempPath = QDir::toNativeSeparators(QDir::tempPath()); const auto personalAppDataPath = VeyonCore::platform().filesystemFunctions().personalAppDataPath(); const auto globalAppDataPath = VeyonCore::platform().filesystemFunctions().globalAppDataPath(); - - if( path.startsWith( QDir::toNativeSeparators( QDir::tempPath() ) ) ) - { - path.replace( QDir::toNativeSeparators( QDir::tempPath() ), envVar.arg( QStringLiteral( "TEMP" ) ) ); - } - else if( path.startsWith( personalAppDataPath ) ) - { - path.replace( personalAppDataPath, envVar.arg( QStringLiteral( "APPDATA" ) ) ); - } - else if( path.startsWith( globalAppDataPath ) ) - { - path.replace( globalAppDataPath, envVar.arg( QStringLiteral( "GLOBALAPPDATA" ) ) ); - } - else if( path.startsWith( QDir::toNativeSeparators( QDir::homePath() ) ) ) + const auto desktopPath = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); + const auto documentsPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); + const auto downloadsPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); + const auto picturesPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation); + const auto videosPath = QStandardPaths::writableLocation(QStandardPaths::MoviesLocation); + const auto homePath = QDir::toNativeSeparators(QDir::homePath()); + + for (const auto& mapping : { + qMakePair(tempPath, QStringLiteral("TEMP")), + qMakePair(personalAppDataPath, QStringLiteral("APPDATA")), + qMakePair(globalAppDataPath, QStringLiteral("GLOBALAPPDATA")), + qMakePair(desktopPath, QStringLiteral("DESKTOP")), + qMakePair(documentsPath, QStringLiteral("DOCUMENTS")), + qMakePair(downloadsPath, QStringLiteral("DOWNLOADS")), + qMakePair(picturesPath, QStringLiteral("PICTURES")), + qMakePair(videosPath, QStringLiteral("VIDEOS")), + qMakePair(homePath, QStringLiteral("HOME")), + }) { - path.replace( QDir::toNativeSeparators( QDir::homePath() ), envVar.arg( QStringLiteral( "HOME" ) ) ); + if (path.startsWith(mapping.first)) + { + path.replace(mapping.first, QStringLiteral("%%1%").arg(mapping.second)); + break; + } } // remove duplicate directory separators - however skip the first two chars From 818f6727d23e95333f944c86b83ac40611a63e40 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 22 Mar 2022 11:24:05 +0100 Subject: [PATCH 1359/1765] Core: Filesystem: drop legacy path variables Some of them are undocumented and therefore should not be in use at all while the duplicate $VAR syntax is not recommended and is a legacy of iTALC. --- core/src/Filesystem.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index 2b38d932b..c55b051b0 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -35,24 +35,16 @@ QString Filesystem::expandPath( QString path ) const { const auto p = QDir::toNativeSeparators( path.replace( QStringLiteral( "%HOME%" ), QDir::homePath() ). - replace( QStringLiteral( "$HOME" ), QDir::homePath() ). replace( QStringLiteral( "%HOSTNAME%" ), QHostInfo::localHostName() ). - replace( QStringLiteral( "$HOSTNAME" ), QHostInfo::localHostName() ). replace( QStringLiteral( "%PROFILE%" ), QDir::homePath() ). - replace( QStringLiteral( "$PROFILE" ), QDir::homePath() ). replace(QStringLiteral("%DESKTOP%"), QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)). replace(QStringLiteral("%DOCUMENTS%"), QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)). replace(QStringLiteral("%DOWNLOADS%"), QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)). replace(QStringLiteral("%PICTURES%"), QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)). replace(QStringLiteral("%VIDEOS%"), QStandardPaths::writableLocation(QStandardPaths::MoviesLocation)). replace( QStringLiteral( "%APPDATA%" ), VeyonCore::platform().filesystemFunctions().personalAppDataPath() ). - replace( QStringLiteral( "$APPDATA" ), VeyonCore::platform().filesystemFunctions().personalAppDataPath() ). replace( QStringLiteral( "%GLOBALAPPDATA%" ), VeyonCore::platform().filesystemFunctions().globalAppDataPath() ). - replace( QStringLiteral( "$GLOBALAPPDATA" ), VeyonCore::platform().filesystemFunctions().globalAppDataPath() ). - replace( QStringLiteral( "%TMP%" ), QDir::tempPath() ). - replace( QStringLiteral( "$TMP" ), QDir::tempPath() ). - replace( QStringLiteral( "%TEMP%" ), QDir::tempPath() ). - replace( QStringLiteral( "$TEMP" ), QDir::tempPath() ) ); + replace(QStringLiteral("%TEMP%"), QDir::tempPath())); // remove duplicate directory separators - however skip the first two chars // as they might specify an UNC path on Windows From eb1409e901d867093885f67ff9b18b71a7b3e37a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 22 Mar 2022 11:26:32 +0100 Subject: [PATCH 1360/1765] Core: Logger: fix path variable syntax --- core/src/Logger.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/Logger.h b/core/src/Logger.h index f55048b83..dcba7d768 100644 --- a/core/src/Logger.h +++ b/core/src/Logger.h @@ -55,7 +55,7 @@ class VEYON_CORE_EXPORT Logger static constexpr int DefaultFileSizeLimit = 100; static constexpr int DefaultFileRotationCount = 10; static constexpr int MaximumMessageSize = 1000; - static constexpr const char* DefaultLogFileDirectory = "$TEMP"; + static constexpr const char* DefaultLogFileDirectory = "%TEMP%"; explicit Logger( const QString &appName ); ~Logger(); From 5d503a3ba853f8a489a22b9a250c67a2216a685b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Mar 2022 10:30:54 +0200 Subject: [PATCH 1361/1765] LinuxUserFunctions: always use qualified usernames When calling getpwnam() & friends, always pass fully qualified usernames, i.e. including a domain prefix if reported by the system. --- plugins/platform/linux/LinuxUserFunctions.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index b6cd07220..37f855aef 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -46,7 +46,7 @@ QString LinuxUserFunctions::fullName( const QString& username ) { - auto pw_entry = getpwnam( VeyonCore::stripDomain( username ).toUtf8().constData() ); + const auto pw_entry = getpwnam(username.toUtf8().constData()); if( pw_entry ) { @@ -179,8 +179,6 @@ QStringList LinuxUserFunctions::groupsOfUser( const QString& username, bool quer QStringList groupList; - const auto strippedUsername = VeyonCore::stripDomain( username ); - QProcess getentProcess; getentProcess.start( QStringLiteral("getent"), { QStringLiteral("group") } ); getentProcess.waitForFinished(); @@ -190,7 +188,7 @@ QStringList LinuxUserFunctions::groupsOfUser( const QString& username, bool quer { const auto groupComponents = group.split( QLatin1Char(':') ); if( groupComponents.size() == 4 && - groupComponents.last().split( QLatin1Char(',') ).contains( strippedUsername ) ) + groupComponents.last().split( QLatin1Char(',') ).contains(username)) { groupList += groupComponents.first(); // clazy:exclude=reserve-candidates } @@ -415,7 +413,7 @@ bool LinuxUserFunctions::authenticate( const QString& username, const Password& const auto pamService = LinuxPlatformConfiguration( &VeyonCore::config() ).pamServiceName(); QDataStream ds( &p ); - ds << VeyonCore::stripDomain( username ).toUtf8(); + ds << username.toUtf8(); ds << password.toByteArray(); ds << pamService.toUtf8(); From 054aaced43440832c50c56b33a55e2c12c9568a3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Mar 2022 10:32:04 +0200 Subject: [PATCH 1362/1765] LinuxServiceCore: only insert non-empty session IDs into env --- plugins/platform/linux/LinuxServiceCore.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 6474fe2b1..dd2f03e6f 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -212,8 +212,11 @@ void LinuxServiceCore::startServer( const QString& sessionPath ) // if pam-systemd is not in use, we have to set the XDG_SESSION_ID environment variable manually if( sessionEnvironment.contains( LinuxSessionFunctions::xdgSessionIdEnvVarName() ) == false ) { - sessionEnvironment.insert( LinuxSessionFunctions::xdgSessionIdEnvVarName(), - LinuxSessionFunctions::getSessionId( sessionPath ) ); + const auto sessionId = LinuxSessionFunctions::getSessionId(sessionPath); + if (sessionId.isEmpty() == false) + { + sessionEnvironment.insert(LinuxSessionFunctions::xdgSessionIdEnvVarName(), sessionId); + } } const auto sessionId = m_sessionManager.openSession( sessionPath ); From 5420bf462f96b8e944cadc5c06a438df5c548126 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Mar 2022 10:32:41 +0200 Subject: [PATCH 1363/1765] LinuxSessionFunctions: add logErrors param to getSessionProperty() --- plugins/platform/linux/LinuxSessionFunctions.cpp | 9 +++++++-- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 18972b853..7c36218e2 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -103,7 +103,7 @@ QStringList LinuxSessionFunctions::listSessions() -QVariant LinuxSessionFunctions::getSessionProperty( const QString& session, const QString& property ) +QVariant LinuxSessionFunctions::getSessionProperty(const QString& session, const QString& property, bool logErrors) { QDBusInterface loginManager( QStringLiteral("org.freedesktop.login1"), session, @@ -116,7 +116,12 @@ QVariant LinuxSessionFunctions::getSessionProperty( const QString& session, cons if( reply.isValid() == false ) { - vCritical() << "Could not query session property" << property << reply.error().message(); + if (logErrors) + { + vCritical() << "Could not query property" << property + << "of session" << session + << "error:" << reply.error().message(); + } return {}; } diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index be9a4c1ae..66e76e20f 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -87,7 +87,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions static QStringList listSessions(); - static QVariant getSessionProperty( const QString& session, const QString& property ); + static QVariant getSessionProperty(const QString& session, const QString& property, bool logErrors = true); static int getSessionLeaderPid( const QString& session ); static qint64 getSessionUptimeSeconds( const QString& session ); From 3a967687f0fd3b5c9fe013bb72b6d584b2d75565 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Mar 2022 10:33:50 +0200 Subject: [PATCH 1364/1765] LinuxSessionFunctions: add logErrors param to getSessionId() --- plugins/platform/linux/LinuxSessionFunctions.cpp | 4 ++-- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 7c36218e2..8f65a0537 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -220,9 +220,9 @@ LinuxSessionFunctions::Type LinuxSessionFunctions::getSessionType( const QString -QString LinuxSessionFunctions::getSessionId( const QString& session ) +QString LinuxSessionFunctions::getSessionId(const QString& session, bool logErrors) { - return getSessionProperty( session, QStringLiteral("Id") ).toString(); + return getSessionProperty(session, QStringLiteral("Id"), logErrors).toString(); } diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 66e76e20f..effde1910 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -93,7 +93,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions static qint64 getSessionUptimeSeconds( const QString& session ); static Class getSessionClass( const QString& session ); static Type getSessionType( const QString& session ); - static QString getSessionId( const QString& session ); + static QString getSessionId(const QString& session, bool logErrors = true); static State getSessionState( const QString& session ); static LoginDBusSessionSeat getSessionSeat( const QString& session ); From 0bcfa77dd3d8440ca12e413dfe94ebfb20e6cea6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Mar 2022 10:35:05 +0200 Subject: [PATCH 1365/1765] LinuxSessionFunctions: fix currentSessionPath() for systemd < 243 The "auto" magic session ID has been introduced with systemd 243 so lets fall back to "self" if "auto" is not available. As a last resort call org.freedesktop.login1.Manager.GetSession(XDG_SESSION_ID) to retrieve the path of the current session. --- .../platform/linux/LinuxSessionFunctions.cpp | 55 ++++++++++++++++++- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 8f65a0537..037acc4a3 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -298,12 +298,61 @@ QProcessEnvironment LinuxSessionFunctions::getSessionEnvironment( int sessionLea QString LinuxSessionFunctions::currentSessionPath() { const auto xdgSessionPath = QProcessEnvironment::systemEnvironment().value( sessionPathEnvVarName() ); - if( xdgSessionPath.isEmpty() ) + if (xdgSessionPath.isEmpty() == false) { - return QStringLiteral("/org/freedesktop/login1/session/auto"); + return xdgSessionPath; } - return xdgSessionPath; + const auto sessionAuto = QStringLiteral("/org/freedesktop/login1/session/auto"); + const auto sessionSelf = QStringLiteral("/org/freedesktop/login1/session/self"); // systemd < 243 + static QString sessionPathFromXdgSessionId; + + static bool hasSessionAuto = false; + static bool hasSessionSelf = false; + + if (hasSessionAuto) + { + return sessionAuto; + } + + if (hasSessionSelf) + { + return sessionSelf; + } + + if (sessionPathFromXdgSessionId.isEmpty() == false) + { + return sessionPathFromXdgSessionId; + } + + if (getSessionId(sessionAuto, false).isNull() == false) + { + hasSessionAuto = true; + return sessionAuto; + } + + if (getSessionId(sessionSelf, false).isNull() == false) + { + hasSessionSelf = true; + return sessionSelf; + } + + const auto xdgSessionId = QProcessEnvironment::systemEnvironment().value(xdgSessionIdEnvVarName()); + if (xdgSessionId.isEmpty() == false) + { + const QDBusReply reply = LinuxCoreFunctions::systemdLoginManager()->call( + QDBus::Block, QStringLiteral("GetSession"), xdgSessionId); + + if (reply.isValid()) + { + sessionPathFromXdgSessionId = reply.value().path(); + return sessionPathFromXdgSessionId; + } + } + + vWarning() << "could not determine dbus object path of current session – please make sure systemd is " + "up to date and/or the environment variable" << xdgSessionIdEnvVarName() << "is set"; + return {}; } From 09691f6e49338ce5c11115485594a4d0f6f3fb74 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Mar 2022 10:42:44 +0200 Subject: [PATCH 1366/1765] LinuxSessionFunctions: add getSessionUser() --- .../platform/linux/LinuxSessionFunctions.cpp | 21 +++++++++++++++++++ .../platform/linux/LinuxSessionFunctions.h | 1 + 2 files changed, 22 insertions(+) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 037acc4a3..de344cc68 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -227,6 +227,27 @@ QString LinuxSessionFunctions::getSessionId(const QString& session, bool logErro +QString LinuxSessionFunctions::getSessionUser(const QString& session) +{ + quint32 uid{0}; + QString userObjectPath; + + const auto reply = getSessionProperty(session, QStringLiteral("User")); + if (reply.isValid()) + { + const auto replyData = reply.value(); + replyData.beginStructure(); + replyData >> uid >> userObjectPath; + replyData.endStructure(); + + return userObjectPath; + } + + return {}; +} + + + LinuxSessionFunctions::State LinuxSessionFunctions::getSessionState( const QString& session ) { static const QMap stateMap{ diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index effde1910..dfed84b56 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -94,6 +94,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions static Class getSessionClass( const QString& session ); static Type getSessionType( const QString& session ); static QString getSessionId(const QString& session, bool logErrors = true); + static QString getSessionUser( const QString& session ); static State getSessionState( const QString& session ); static LoginDBusSessionSeat getSessionSeat( const QString& session ); From 6d32329bff327172b5330c7961148fcf68c3f80f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Mar 2022 10:43:01 +0200 Subject: [PATCH 1367/1765] LinuxUserFunctions: add getUserProperty() --- plugins/platform/linux/LinuxUserFunctions.cpp | 27 +++++++++++++++++++ plugins/platform/linux/LinuxUserFunctions.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 37f855aef..c18bd4aa4 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -443,3 +443,30 @@ uid_t LinuxUserFunctions::userIdFromName( const QString& username ) return 0; } + + + +QVariant LinuxUserFunctions::getUserProperty(const QString& userPath, const QString& property, bool logErrors) +{ + QDBusInterface loginManager(QStringLiteral("org.freedesktop.login1"), + userPath, + QStringLiteral("org.freedesktop.DBus.Properties"), + QDBusConnection::systemBus()); + + const QDBusReply reply = loginManager.call(QStringLiteral("Get"), + QStringLiteral("org.freedesktop.login1.User"), + property); + + if( reply.isValid() == false ) + { + if (logErrors) + { + vCritical() << "Could not query property" << property + << "of user" << userPath + << "error:" << reply.error().message(); + } + return {}; + } + + return reply.value().variant(); +} diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index 1d8bb61b4..116e49c0a 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -51,6 +51,8 @@ class LinuxUserFunctions : public PlatformUserFunctions static uid_t userIdFromName( const QString& username ); + static QVariant getUserProperty(const QString& userPath, const QString& property, bool logErrors = true); + private: static constexpr auto AuthHelperTimeout = 10000; From aefa64e0fd374f81937f94e99cc1830dd6c268b3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Mar 2022 10:45:55 +0200 Subject: [PATCH 1368/1765] LinuxUserFunctions: retrieve username via systemd-logind Use environment variable and getuid() as fallbacks only. --- plugins/platform/linux/LinuxUserFunctions.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index c18bd4aa4..3710b840f 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -243,6 +243,16 @@ QString LinuxUserFunctions::currentUser() { QString username; + const auto sessionUserPath = LinuxSessionFunctions::getSessionUser(LinuxSessionFunctions::currentSessionPath()); + if (sessionUserPath.isEmpty() == false) + { + username = getUserProperty(sessionUserPath, QStringLiteral("Name")).toString(); + if (username.isEmpty() == false) + { + return username; + } + } + const auto envUser = qgetenv( "USER" ); struct passwd * pw_entry = nullptr; From 1d69fe716520a7cccc53240748d37276f185370a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Mar 2022 11:07:01 +0200 Subject: [PATCH 1369/1765] 3rdparty: x11vnc: update submodule Make catchsegv work properly. --- 3rdparty/x11vnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/x11vnc b/3rdparty/x11vnc index c4e06d956..89df84c94 160000 --- a/3rdparty/x11vnc +++ b/3rdparty/x11vnc @@ -1 +1 @@ -Subproject commit c4e06d9568f6699faf505acc79ee219b3ed04072 +Subproject commit 89df84c94a1d48d623090fca28bfb20bfa5aed81 From 7ef56a8539b93b5e613f99e9543e853c2d00a27a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 6 Apr 2022 11:07:12 +0200 Subject: [PATCH 1370/1765] CI: add support for multiple packages --- .ci/common/finalize-deb.sh | 10 ++++++++-- .ci/common/finalize-rpm.sh | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.ci/common/finalize-deb.sh b/.ci/common/finalize-deb.sh index 784b60d35..4b3a9dadf 100755 --- a/.ci/common/finalize-deb.sh +++ b/.ci/common/finalize-deb.sh @@ -8,10 +8,16 @@ cd $2 rename "s/_amd64/-${3}_amd64/g" *.deb # show content -dpkg -c *.deb +for i in *.deb ; do + echo Contents of $i: + dpkg -c $i +done # show package information and dependencies -dpkg -I *.deb +for i in *.deb ; do + echo Package information for $i: + dpkg -I $i +done # move to Docker volume mv -v *.deb $1 diff --git a/.ci/common/finalize-rpm.sh b/.ci/common/finalize-rpm.sh index 040ebce96..f98ddfa93 100755 --- a/.ci/common/finalize-rpm.sh +++ b/.ci/common/finalize-rpm.sh @@ -8,10 +8,16 @@ cd $2 rename ".x86_64" ".${3}.x86_64" *.rpm # show files -rpm -qlp *.rpm +for i in *.rpm ; do + echo Contents of $i: + rpm -qlp $i +done # show dependencies -rpm -qpR *.rpm +for i in *.rpm ; do + echo Package information for $i: + rpm -qpR $i +done # move to Docker volume mv -v *.rpm $1 From c72534665d17d6cd3a593243151eb3914109a197 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 6 Apr 2022 11:08:13 +0200 Subject: [PATCH 1371/1765] CMake: allow specification of COMPONENT --- cmake/modules/BuildVeyonPlugin.cmake | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index 3496200a4..be2091550 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -17,7 +17,11 @@ macro(build_veyon_plugin PLUGIN_NAME) set_default_target_properties(${PLUGIN_NAME}) set_target_properties(${PLUGIN_NAME} PROPERTIES PREFIX "") - install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION ${VEYON_INSTALL_PLUGIN_DIR}) + if(${PLUGIN_NAME}_COMPONENT) + install(TARGETS ${PLUGIN_NAME} COMPONENT ${${PLUGIN_NAME}_COMPONENT} LIBRARY DESTINATION ${VEYON_INSTALL_PLUGIN_DIR}) + else() + install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION ${VEYON_INSTALL_PLUGIN_DIR}) + endif() if(WITH_PCH) target_precompile_headers(${PLUGIN_NAME} REUSE_FROM veyon-library-pch) endif() From ce958ef9e6d48c55e4d7a86697af30f42d73634c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 6 Apr 2022 11:10:18 +0200 Subject: [PATCH 1372/1765] CMake: set CPack variables early Allows plugins to re-use/override CPack variables e.g. in order to package themselves into subpackages. --- CMakeLists.txt | 6 +++++- cmake/CPackDefinitions.cmake | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d40c82c94..a520084d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -292,6 +292,10 @@ if(VEYON_BUILD_ANDROID) ) endif() + +include(cmake/CPackDefinitions.cmake) + + # make sub-directories add_subdirectory(core) if(NOT WITH_CORE_ONLY) @@ -319,7 +323,7 @@ endif() # # package generation # -include(cmake/CPackDefinitions.cmake) +include(CPack) diff --git a/cmake/CPackDefinitions.cmake b/cmake/CPackDefinitions.cmake index c332a944b..489b20f13 100644 --- a/cmake/CPackDefinitions.cmake +++ b/cmake/CPackDefinitions.cmake @@ -115,4 +115,3 @@ else() set(CPACK_SOURCE_GENERATOR "TGZ") endif() -include(CPack) From b2fa91aecc213f998e7364d9e69de93dc32f3ed6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 6 Apr 2022 12:55:43 +0200 Subject: [PATCH 1373/1765] CI: use default package naming scheme Closes #723. --- .ci/common/finalize-deb.sh | 3 --- .ci/common/finalize-rpm.sh | 3 --- .ci/linux.centos.7.9/script.sh | 4 +++- .ci/linux.debian.bullseye/Dockerfile | 2 +- .ci/linux.debian.bullseye/script.sh | 4 +++- .ci/linux.debian.buster/Dockerfile | 2 +- .ci/linux.debian.buster/script.sh | 4 +++- .ci/linux.fedora.34/script.sh | 4 +++- .ci/linux.fedora.35/script.sh | 4 +++- .ci/linux.opensuse.15.3/script.sh | 4 +++- .ci/linux.opensuse.tumbleweed/script.sh | 4 ++-- .ci/linux.ubuntu.bionic/Dockerfile | 2 +- .ci/linux.ubuntu.bionic/script.sh | 4 +++- .ci/linux.ubuntu.focal/Dockerfile | 2 +- .ci/linux.ubuntu.focal/script.sh | 4 +++- cmake/CPackDefinitions.cmake | 24 +++++------------------- 16 files changed, 35 insertions(+), 39 deletions(-) diff --git a/.ci/common/finalize-deb.sh b/.ci/common/finalize-deb.sh index 4b3a9dadf..107dfb9a4 100755 --- a/.ci/common/finalize-deb.sh +++ b/.ci/common/finalize-deb.sh @@ -4,9 +4,6 @@ set -e cd $2 -# add distribution name to file name -rename "s/_amd64/-${3}_amd64/g" *.deb - # show content for i in *.deb ; do echo Contents of $i: diff --git a/.ci/common/finalize-rpm.sh b/.ci/common/finalize-rpm.sh index f98ddfa93..851a8d003 100755 --- a/.ci/common/finalize-rpm.sh +++ b/.ci/common/finalize-rpm.sh @@ -4,9 +4,6 @@ set -e cd $2 -# add distribution name to file name -rename ".x86_64" ".${3}.x86_64" *.rpm - # show files for i in *.rpm ; do echo Contents of $i: diff --git a/.ci/linux.centos.7.9/script.sh b/.ci/linux.centos.7.9/script.sh index 960478fdb..759e37c78 100755 --- a/.ci/linux.centos.7.9/script.sh +++ b/.ci/linux.centos.7.9/script.sh @@ -4,5 +4,7 @@ source scl_source enable devtoolset-7 set -e +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=centos.7.9" + $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "centos-7.9" +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.debian.bullseye/Dockerfile b/.ci/linux.debian.bullseye/Dockerfile index 64b24793d..afe0d7462 100644 --- a/.ci/linux.debian.bullseye/Dockerfile +++ b/.ci/linux.debian.bullseye/Dockerfile @@ -5,7 +5,7 @@ RUN \ apt-get update && \ apt-get install --no-install-recommends -y \ dpkg-dev \ - ca-certificates git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ + ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ diff --git a/.ci/linux.debian.bullseye/script.sh b/.ci/linux.debian.bullseye/script.sh index fcc9b8c7e..538026d97 100755 --- a/.ci/linux.debian.bullseye/script.sh +++ b/.ci/linux.debian.bullseye/script.sh @@ -2,8 +2,10 @@ set -e +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.bullseye" + $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-deb.sh $1 $2 "debian-bullseye" +$1/.ci/common/finalize-deb.sh $1 $2 if [ -z "$3" ] ; then diff --git a/.ci/linux.debian.buster/Dockerfile b/.ci/linux.debian.buster/Dockerfile index 2171ee761..bdedc6eff 100644 --- a/.ci/linux.debian.buster/Dockerfile +++ b/.ci/linux.debian.buster/Dockerfile @@ -6,7 +6,7 @@ RUN \ apt-get update && \ apt-get install --no-install-recommends -y \ dpkg-dev \ - ca-certificates git binutils gcc g++ ninja-build cmake/buster-backports rename file fakeroot bzip2 \ + ca-certificates git binutils gcc g++ ninja-build cmake/buster-backports file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ diff --git a/.ci/linux.debian.buster/script.sh b/.ci/linux.debian.buster/script.sh index edb441c50..9d7ca36c9 100755 --- a/.ci/linux.debian.buster/script.sh +++ b/.ci/linux.debian.buster/script.sh @@ -2,5 +2,7 @@ set -e +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.buster" + $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-deb.sh $1 $2 "debian-buster" +$1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/linux.fedora.34/script.sh b/.ci/linux.fedora.34/script.sh index 78b4bd35a..e451b029f 100755 --- a/.ci/linux.fedora.34/script.sh +++ b/.ci/linux.fedora.34/script.sh @@ -2,5 +2,7 @@ set -e +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.34" + $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "fc34" +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.fedora.35/script.sh b/.ci/linux.fedora.35/script.sh index ee43eab11..b5801c113 100755 --- a/.ci/linux.fedora.35/script.sh +++ b/.ci/linux.fedora.35/script.sh @@ -2,5 +2,7 @@ set -e +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.35" + $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "fc35" +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.opensuse.15.3/script.sh b/.ci/linux.opensuse.15.3/script.sh index 6c97b69c7..05ab46187 100755 --- a/.ci/linux.opensuse.15.3/script.sh +++ b/.ci/linux.opensuse.15.3/script.sh @@ -2,5 +2,7 @@ set -e +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=opensuse.15.3" + $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "opensuse-15.3" +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.opensuse.tumbleweed/script.sh b/.ci/linux.opensuse.tumbleweed/script.sh index 41c12d760..08e09df6c 100755 --- a/.ci/linux.opensuse.tumbleweed/script.sh +++ b/.ci/linux.opensuse.tumbleweed/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=opensuse.tumbleweed" $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 "opensuse-tumbleweed" +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.ubuntu.bionic/Dockerfile b/.ci/linux.ubuntu.bionic/Dockerfile index 98b23ff01..efdb9a2c7 100644 --- a/.ci/linux.ubuntu.bionic/Dockerfile +++ b/.ci/linux.ubuntu.bionic/Dockerfile @@ -4,7 +4,7 @@ MAINTAINER Tobias Junghans RUN \ apt-get update && \ apt-get install --no-install-recommends -y \ - git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ + git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ diff --git a/.ci/linux.ubuntu.bionic/script.sh b/.ci/linux.ubuntu.bionic/script.sh index 52a055c20..1a6dd707f 100755 --- a/.ci/linux.ubuntu.bionic/script.sh +++ b/.ci/linux.ubuntu.bionic/script.sh @@ -2,5 +2,7 @@ set -e +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.bionic" + $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-deb.sh $1 $2 "ubuntu-bionic" +$1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/linux.ubuntu.focal/Dockerfile b/.ci/linux.ubuntu.focal/Dockerfile index c90c1df4b..f906624fb 100644 --- a/.ci/linux.ubuntu.focal/Dockerfile +++ b/.ci/linux.ubuntu.focal/Dockerfile @@ -5,7 +5,7 @@ RUN \ apt-get update && \ DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ dpkg-dev \ - ca-certificates git binutils gcc g++ ninja-build cmake rename file fakeroot bzip2 \ + ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ diff --git a/.ci/linux.ubuntu.focal/script.sh b/.ci/linux.ubuntu.focal/script.sh index 02e39e6f8..779458595 100755 --- a/.ci/linux.ubuntu.focal/script.sh +++ b/.ci/linux.ubuntu.focal/script.sh @@ -2,5 +2,7 @@ set -e +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.focal" + $1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-deb.sh $1 $2 "ubuntu-focal" +$1/.ci/common/finalize-deb.sh $1 $2 diff --git a/cmake/CPackDefinitions.cmake b/cmake/CPackDefinitions.cmake index 489b20f13..261d39055 100644 --- a/cmake/CPackDefinitions.cmake +++ b/cmake/CPackDefinitions.cmake @@ -1,23 +1,10 @@ -# -# generate packages -# -# Environment -if(NOT CPACK_SYSTEM_NAME) - set(CPACK_SYSTEM_NAME "${CMAKE_SYSTEM_PROCESSOR}") -endif() - - # Basic information if(NOT CPACK_PACKAGE_NAME) set(CPACK_PACKAGE_NAME "veyon") endif() -set(CPACK_PACKAGE_VERSION_MAJOR "${VERSION_MAJOR}") -set(CPACK_PACKAGE_VERSION_MINOR "${VERSION_MINOR}") -set(CPACK_PACKAGE_VERSION_PATCH "${VERSION_PATCH}") -set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") +set(CPACK_PACKAGE_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}") set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") -set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}-${CPACK_SYSTEM_NAME}") set(CPACK_PACKAGE_CONTACT "Tobias Junghans ") set(CPACK_PACKAGE_HOMEPAGE "https://veyon.io") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Cross-platform computer control and classroom management") @@ -102,14 +89,13 @@ elseif( ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # TODO set(CPACK_GENERATOR "PackageMake") else() if(EXISTS /etc/redhat-release OR EXISTS /etc/fedora-release OR OS_OPENSUSE) - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}.${CPACK_SYSTEM_NAME}") + set(CPACK_RPM_FILE_NAME "RPM-DEFAULT") + set(CPACK_RPM_PACKAGE_RELEASE "${CPACK_DIST}") set(CPACK_GENERATOR "RPM") endif() if(EXISTS /etc/debian_version) - if(CPACK_SYSTEM_NAME STREQUAL "x86_64") - set(CPACK_SYSTEM_NAME "amd64") - endif() - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_BUILD}_${CPACK_SYSTEM_NAME}") + set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT") + set(CPACK_DEBIAN_PACKAGE_RELEASE "${CPACK_DIST}") set(CPACK_GENERATOR "DEB") endif() set(CPACK_SOURCE_GENERATOR "TGZ") From 0485cf16c6bb03cf213a106415efd0dcb631d3a0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 7 Apr 2022 14:24:44 +0200 Subject: [PATCH 1374/1765] LinuxSessionFunctions: detect unspecified session type explicitly --- plugins/platform/linux/LinuxSessionFunctions.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index de344cc68..ad51a0847 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -209,10 +209,14 @@ LinuxSessionFunctions::Type LinuxSessionFunctions::getSessionType( const QString { return Type::Wayland; } + else if (type == QLatin1String("unspecified")) + { + return Type::Unspecified; + } if( type.isEmpty() == false ) { - vWarning() << "unspecified session type" << type; + vWarning() << "unknown session type" << type; } return Type::Unspecified; From fdf8fa3dca2d7e8288774e0948eeaa4aaf739d5b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 7 Apr 2022 14:27:21 +0200 Subject: [PATCH 1375/1765] LinuxServiceCore: do not start server for sessions with unspecified type --- plugins/platform/linux/LinuxServiceCore.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index dd2f03e6f..5602344cd 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -157,6 +157,13 @@ void LinuxServiceCore::startServer( const QString& sessionPath ) return; } + // do not start server for sessions with unspecified type + if (sessionType == LinuxSessionFunctions::Type::Unspecified) + { + vDebug() << "Not starting Veyon Server in a session with unspecified type"; + return; + } + const auto sessionState = LinuxSessionFunctions::getSessionState( sessionPath ); if( sessionState == LinuxSessionFunctions::State::Opening ) { From 0bb0d3e459593d4917fe63e6492d06fb8c0bb6fa Mon Sep 17 00:00:00 2001 From: Paulo Ferreira Date: Wed, 20 Apr 2022 09:48:31 -0300 Subject: [PATCH 1376/1765] Add missing package --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c6e3267e3..0df02e01d 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ As root you can run qtdeclarative5-dev qtquickcontrols2-5-dev libfakekey-dev \ xorg-dev libxtst-dev libjpeg-dev zlib1g-dev libssl-dev libpam0g-dev \ libprocps-dev liblzo2-dev libqca-qt5-2-dev libldap2-dev \ - libsasl2-dev + libsasl2-dev ninja-build @@ -103,7 +103,7 @@ As root you can run dnf install gcc-c++ make cmake rpm-build qt5-devel libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel \ libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel libfakekey-devel libjpeg-turbo-devel zlib-devel \ - openssl-devel pam-devel procps-devel lzo-devel qca-devel qca-qt5-devel openldap-devel cyrus-sasl-devel + openssl-devel pam-devel procps-devel lzo-devel qca-devel qca-qt5-devel openldap-devel cyrus-sasl-devel ninja-build ### Configuring and building sources From 5a912fdff7d4f5f9f1136207bf5513a9fd0f43b8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Apr 2022 15:33:06 +0200 Subject: [PATCH 1377/1765] CI: add Ubuntu 22.04 packages Closes #809. --- .ci/linux.ubuntu.jammy/Dockerfile | 25 +++++++++++++++++++++++++ .ci/linux.ubuntu.jammy/script.sh | 8 ++++++++ .gitlab-ci.yml | 1 + 3 files changed, 34 insertions(+) create mode 100644 .ci/linux.ubuntu.jammy/Dockerfile create mode 100755 .ci/linux.ubuntu.jammy/script.sh diff --git a/.ci/linux.ubuntu.jammy/Dockerfile b/.ci/linux.ubuntu.jammy/Dockerfile new file mode 100644 index 000000000..9a7ab519e --- /dev/null +++ b/.ci/linux.ubuntu.jammy/Dockerfile @@ -0,0 +1,25 @@ +FROM ubuntu:jammy +MAINTAINER Tobias Junghans + +RUN \ + apt-get update && \ + DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ + dpkg-dev \ + ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + xorg-dev \ + libfakekey-dev \ + libjpeg-dev \ + zlib1g-dev \ + libssl-dev \ + libpam0g-dev \ + libprocps-dev \ + libldap2-dev \ + libsasl2-dev \ + libpng-dev \ + liblzo2-dev \ + libqca-qt5-2-dev libqca-qt5-2-plugins \ + libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.ubuntu.jammy/script.sh b/.ci/linux.ubuntu.jammy/script.sh new file mode 100755 index 000000000..6850cf366 --- /dev/null +++ b/.ci/linux.ubuntu.jammy/script.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.jammy" + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e2ace671e..7267dd93b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,6 +19,7 @@ build-linux: - opensuse.tumbleweed - ubuntu.bionic - ubuntu.focal + - ubuntu.jammy artifacts: paths: [ "veyon*" ] expire_in: 1 day From c25cefabea58296ab5d82351f6a1ef93fa5db7d2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Apr 2022 08:44:06 +0200 Subject: [PATCH 1378/1765] CMake: fix building libvncclient with OpenSSL 3.0 --- core/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index b988341fa..06c2f5b9f 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -53,7 +53,7 @@ else() ${libvncserver_DIR}/common/turbojpeg.c) set_source_files_properties(${libvncclient_SOURCES} PROPERTIES - COMPILE_FLAGS "-Wno-unused-function -Wno-unused-variable -fvisibility=default" + COMPILE_FLAGS "-Wno-unused-function -Wno-unused-variable -fvisibility=default -Wno-deprecated-declarations" SKIP_PRECOMPILE_HEADERS TRUE) endif() From e593c92970476442c0a5353459c3f3e17f2d7f7d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Apr 2022 08:52:59 +0200 Subject: [PATCH 1379/1765] CI: harmonize Dockerfiles for Ubuntu images Use libvncserver 0.9.13 on Ubuntu 22.04 --- .ci/linux.ubuntu.bionic/Dockerfile | 5 +++-- .ci/linux.ubuntu.jammy/Dockerfile | 5 +---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.ci/linux.ubuntu.bionic/Dockerfile b/.ci/linux.ubuntu.bionic/Dockerfile index efdb9a2c7..c085b9672 100644 --- a/.ci/linux.ubuntu.bionic/Dockerfile +++ b/.ci/linux.ubuntu.bionic/Dockerfile @@ -3,8 +3,9 @@ MAINTAINER Tobias Junghans RUN \ apt-get update && \ - apt-get install --no-install-recommends -y \ - git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ + DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ + dpkg-dev \ + ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ diff --git a/.ci/linux.ubuntu.jammy/Dockerfile b/.ci/linux.ubuntu.jammy/Dockerfile index 9a7ab519e..c514853a3 100644 --- a/.ci/linux.ubuntu.jammy/Dockerfile +++ b/.ci/linux.ubuntu.jammy/Dockerfile @@ -9,15 +9,12 @@ RUN \ qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ xorg-dev \ libfakekey-dev \ - libjpeg-dev \ - zlib1g-dev \ + libvncserver-dev \ libssl-dev \ libpam0g-dev \ libprocps-dev \ libldap2-dev \ libsasl2-dev \ - libpng-dev \ - liblzo2-dev \ libqca-qt5-2-dev libqca-qt5-2-plugins \ libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ && \ From cde9efb7ab8b8cb81ac8d5ee6be16315b0c7468c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Apr 2022 09:38:08 +0200 Subject: [PATCH 1380/1765] CI: drop Fedora 34 and add Fedora 36 --- .ci/{linux.fedora.34 => linux.fedora.36}/Dockerfile | 4 ++-- .ci/{linux.fedora.34 => linux.fedora.36}/script.sh | 2 +- .gitlab-ci.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename .ci/{linux.fedora.34 => linux.fedora.36}/Dockerfile (93%) rename .ci/{linux.fedora.34 => linux.fedora.36}/script.sh (63%) diff --git a/.ci/linux.fedora.34/Dockerfile b/.ci/linux.fedora.36/Dockerfile similarity index 93% rename from .ci/linux.fedora.34/Dockerfile rename to .ci/linux.fedora.36/Dockerfile index 3da191a69..a33c0c0fb 100644 --- a/.ci/linux.fedora.34/Dockerfile +++ b/.ci/linux.fedora.36/Dockerfile @@ -1,8 +1,8 @@ -FROM fedora:34 +FROM fedora:36 MAINTAINER Tobias Junghans RUN \ - dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-34.noarch.rpm && \ + dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-36.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ diff --git a/.ci/linux.fedora.34/script.sh b/.ci/linux.fedora.36/script.sh similarity index 63% rename from .ci/linux.fedora.34/script.sh rename to .ci/linux.fedora.36/script.sh index e451b029f..237db06b7 100755 --- a/.ci/linux.fedora.34/script.sh +++ b/.ci/linux.fedora.36/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.34" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.36" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7267dd93b..7614419e0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,8 +13,8 @@ build-linux: - centos.7.9 - debian.buster - debian.bullseye - - fedora.34 - fedora.35 + - fedora.36 - opensuse.15.3 - opensuse.tumbleweed - ubuntu.bionic From 9b8c2f62e2ba9f69c89dc519bbf9935c0ad32745 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 25 Apr 2022 10:21:34 +0200 Subject: [PATCH 1381/1765] Add missing includes --- core/src/VncView.cpp | 2 ++ plugins/vncserver/headless/HeadlessVncServer.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index 60cc9a08f..c3ce69602 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -25,6 +25,8 @@ #include #include +#include + #include #include #include diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp index 20c44a300..c4133dc86 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.cpp +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -26,6 +26,8 @@ extern "C" { #include "rfb/rfb.h" } +#include + #include "HeadlessVncServer.h" #include "VeyonConfiguration.h" From 5891563ccaf8173a3607c92e6727b55816e2e9f6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 3 Jun 2022 14:27:25 +0200 Subject: [PATCH 1382/1765] VncServerProtocol: cast auth type count to int With Qt 6, count()/size() of containers return size_t so a 64 bit value might get streamed to the VariantArrayMessage while the implicit assumption is that it's a 32 bit value. Make sure to use int independent of the Qt version so protocol compatible is kept. --- core/src/VncServerProtocol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index 655df196a..c424baa1e 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -189,7 +189,7 @@ bool VncServerProtocol::sendAuthenticationMethods() const auto authTypes = supportedAuthMethodUids(); VariantArrayMessage message( m_socket ); - message.write( authTypes.count() ); + message.write(int(authTypes.count())); for( auto authType : authTypes ) { From 623b002b10250963158e6af57faffc6556a9d51c Mon Sep 17 00:00:00 2001 From: Egor Ignatov Date: Fri, 10 Jun 2022 10:28:10 +0300 Subject: [PATCH 1383/1765] linux: runProgramAsUser set gid as well Programs were started with gid 0, which is unsafe and leads to unexpected results, such as the inability to access the user's tmpdir. --- plugins/platform/linux/LinuxCoreFunctions.cpp | 35 ++++++++++++++++--- plugins/platform/linux/LinuxUserFunctions.cpp | 12 +++++++ plugins/platform/linux/LinuxUserFunctions.h | 1 + 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index a39c131e3..ed8f0d6a7 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -32,6 +32,7 @@ #include #include +#include #include #include "LinuxCoreFunctions.h" @@ -232,26 +233,49 @@ bool LinuxCoreFunctions::runProgramAsUser( const QString& program, const QString return false; } + const auto gid = LinuxUserFunctions::userGroupIdFromName( username ); + if( gid <= 0 ) + { + return false; + } + #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) auto process = new QProcess; - process->setChildProcessModifier( [uid]() { + process->setChildProcessModifier( [uid, gid]() { + if( setgroups(0, nullptr) != 0 ) + { + qFatal( "Could not drop all supplementary groups for child process!" ); + } + if( setgid( gid ) != 0 ) + { + qFatal( "Could not set GID for child process!" ); + } if( setuid( uid ) != 0 ) { qFatal( "Could not set UID for child process!" ); - }; + } } ); #else class UserProcess : public QProcess // clazy:exclude=missing-qobject-macro { public: - explicit UserProcess( uid_t uid, QObject* parent = nullptr ) : + explicit UserProcess( uid_t uid, gid_t gid, QObject* parent = nullptr ) : QProcess( parent ), - m_uid( uid ) + m_uid( uid ), + m_gid( gid ) { } void setupChildProcess() override { + if( setgroups( 0, nullptr ) != 0 ) + { + qFatal( "Could not drop all supplementary groups for child process!" ); + } + if( setgid( m_gid ) != 0 ) + { + qFatal( "Could not set GID for child process!" ); + } if( setuid( m_uid ) != 0 ) { qFatal( "Could not set UID for child process!" ); @@ -260,9 +284,10 @@ bool LinuxCoreFunctions::runProgramAsUser( const QString& program, const QString private: const uid_t m_uid; + const uid_t m_gid; }; - auto process = new UserProcess( uid ); + auto process = new UserProcess( uid, gid ); #endif QObject::connect( process, QOverload::of( &QProcess::finished ), &QProcess::deleteLater ); diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 3710b840f..23a15985d 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -454,6 +454,18 @@ uid_t LinuxUserFunctions::userIdFromName( const QString& username ) return 0; } +gid_t LinuxUserFunctions::userGroupIdFromName( const QString& username ) +{ + const auto pw_entry = getpwnam( username.toUtf8().constData() ); + + if( pw_entry ) + { + return pw_entry->pw_gid; + } + + return 0; +} + QVariant LinuxUserFunctions::getUserProperty(const QString& userPath, const QString& property, bool logErrors) diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index 116e49c0a..a0a1cd493 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -50,6 +50,7 @@ class LinuxUserFunctions : public PlatformUserFunctions bool authenticate( const QString& username, const Password& password ) override; static uid_t userIdFromName( const QString& username ); + static gid_t userGroupIdFromName( const QString& username ); static QVariant getUserProperty(const QString& userPath, const QString& property, bool logErrors = true); From ceba5e34d905e4eb91828fe447bf2fc6101ddf5d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Sun, 17 Jul 2022 21:16:24 +0200 Subject: [PATCH 1384/1765] CMake: add WITH_BUILTIN_LIBVNC option --- CMakeLists.txt | 1 + core/CMakeLists.txt | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a520084d4..f88de3c40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,7 @@ option(WITH_ADDRESS_SANITIZER "Build with address sanitizer" OFF) option(WITH_THREAD_SANITIZER "Build with thread sanitizer" OFF) option(WITH_UB_SANITIZER "Build with undefined behavior sanitizer" OFF) option(WITH_FUZZERS "Build LLVM fuzzer tests (implies WITH_TESTS=ON)" OFF) +option(WITH_BUILTIN_LIBVNC "Build with built-in LibVNCServer/Client" OFF) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH}) if(CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 06c2f5b9f..14bb1e6f0 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -13,7 +13,9 @@ set(core_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/builddata.qrc ) -find_package(LibVNCClient 0.9.13) +if(NOT WITH_BUILTIN_LIBVNC) + find_package(LibVNCClient 0.9.13) +endif() if(LibVNCClient_FOUND) include(CheckCSourceCompiles) From 6688482c4988823f6520e22c2f588e26c17f6a78 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Sun, 17 Jul 2022 21:29:25 +0200 Subject: [PATCH 1385/1765] CMake: restrict usage of external libvncserver We must not use external libvncserver library for HeadlessVncServer while using builtin libvncclient for VeyonCore due to binary compatibility issues. --- plugins/vncserver/headless/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/vncserver/headless/CMakeLists.txt b/plugins/vncserver/headless/CMakeLists.txt index 405c89dd5..ea6ed5151 100644 --- a/plugins/vncserver/headless/CMakeLists.txt +++ b/plugins/vncserver/headless/CMakeLists.txt @@ -1,6 +1,9 @@ include(BuildVeyonPlugin) -find_package(LibVNCServer 0.9.8) +get_property(HAVE_LIBVNCCLIENT GLOBAL PROPERTY HAVE_LIBVNCCLIENT) +if(HAVE_LIBVNCCLIENT) + find_package(LibVNCServer 0.9.8) +endif() if(LibVNCServer_FOUND) From 9a50a82a7ae9742181d16875d6323ff4571c396d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 18 Jul 2022 09:39:39 +0200 Subject: [PATCH 1386/1765] VncClientProtocol: handle rfbEncodingExtDesktopSize encoding --- core/src/VncClientProtocol.cpp | 22 ++++++++++++++++++++++ core/src/VncClientProtocol.h | 1 + 2 files changed, 23 insertions(+) diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 92c559531..f2aef28f2 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -601,6 +601,9 @@ bool VncClientProtocol::handleRect( QBuffer& buffer, rfbFramebufferUpdateRectHea case rfbEncodingZYWRLE: return handleRectEncodingZRLE( buffer ); + case rfbEncodingExtDesktopSize: + return handleRectEncodingExtDesktopSize(buffer); + case rfbEncodingPointerPos: case rfbEncodingKeyboardLedState: case rfbEncodingNewFBSize: @@ -775,6 +778,25 @@ bool VncClientProtocol::handleRectEncodingZRLE(QBuffer &buffer) +bool VncClientProtocol::handleRectEncodingExtDesktopSize(QBuffer& buffer) +{ + rfbExtDesktopSizeMsg extDesktopSizeMsg; + if (buffer.peek(reinterpret_cast(&extDesktopSizeMsg), sz_rfbExtDesktopSizeMsg) != sz_rfbExtDesktopSizeMsg) + { + return false; + } + + const auto totalMessageSize = sz_rfbExtDesktopSizeMsg + extDesktopSizeMsg.numberOfScreens * sz_rfbExtDesktopScreen; + if (buffer.bytesAvailable() >= totalMessageSize) + { + return buffer.read(totalMessageSize).size() == totalMessageSize; + } + + return false; +} + + + bool VncClientProtocol::isPseudoEncoding( rfbFramebufferUpdateRectHeader header ) { switch( header.encoding ) diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index bcd743a44..4d4c256e1 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -129,6 +129,7 @@ class VEYON_CORE_EXPORT VncClientProtocol uint bytesPerPixel ); bool handleRectEncodingZlib( QBuffer& buffer ); bool handleRectEncodingZRLE( QBuffer& buffer ); + bool handleRectEncodingExtDesktopSize(QBuffer& buffer); static bool isPseudoEncoding( rfbFramebufferUpdateRectHeader header ); From fbd622abe3683e01479bb9f3306ad937aab66b0e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 18 Jul 2022 09:40:10 +0200 Subject: [PATCH 1387/1765] ComputerManager: only add non-empty location --- master/src/ComputerManager.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 00cb882ef..6a4bf914b 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -185,7 +185,11 @@ void ComputerManager::initLocations() vDebug() << "initializing locations for host address" << address.toString(); } - m_currentLocations.append( findLocationOfComputer( m_localHostNames, m_localHostAddresses, QModelIndex() ) ); + const auto currentLocation = findLocationOfComputer(m_localHostNames, m_localHostAddresses, {}); + if (currentLocation.isEmpty() == false) + { + m_currentLocations.append(currentLocation); + } vDebug() << "found locations" << m_currentLocations; From 8814503e3fdf0ecdfa773c28710f4e81f0cf4b26 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 18 Jul 2022 09:41:02 +0200 Subject: [PATCH 1388/1765] ComputerManager: use const auto for entryIndex/objectType --- master/src/ComputerManager.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 6a4bf914b..6404d66f4 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -326,9 +326,8 @@ QString ComputerManager::findLocationOfComputer( const QStringList& hostNames, c for( int i = 0; i < rows; ++i ) { - QModelIndex entryIndex = model->index( i, 0, parent ); - - const auto objectType = NetworkObject::Type( model->data(entryIndex, NetworkObjectModel::TypeRole).toInt() ); + const auto entryIndex = model->index(i, 0, parent); + const auto objectType = NetworkObject::Type(model->data(entryIndex, NetworkObjectModel::TypeRole).toInt()); if( NetworkObject::isContainer(objectType) ) { @@ -367,9 +366,8 @@ ComputerList ComputerManager::getComputersAtLocation( const QString& locationNam for( int i = 0; i < rows; ++i ) { - QModelIndex entryIndex = model->index( i, 0, parent ); - - const auto objectType = NetworkObject::Type( model->data(entryIndex, NetworkObjectModel::TypeRole).toInt() ); + const auto entryIndex = model->index(i, 0, parent); + const auto objectType = NetworkObject::Type(model->data(entryIndex, NetworkObjectModel::TypeRole).toInt()); if( NetworkObject::isContainer(objectType) ) { From 1a6651062c2c92d82fb7ed3961eed22b3c1a51e9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 18 Jul 2022 09:41:32 +0200 Subject: [PATCH 1389/1765] ComputerManager: fetch objects in findLocationOfComputer() Make sure to load nested locations and their computer objects properly. --- master/src/ComputerManager.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 6404d66f4..a2bd150d8 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -331,6 +331,11 @@ QString ComputerManager::findLocationOfComputer( const QStringList& hostNames, c if( NetworkObject::isContainer(objectType) ) { + if (model->canFetchMore(entryIndex)) + { + model->fetchMore(entryIndex); + } + const auto location = findLocationOfComputer( hostNames, hostAddresses, entryIndex ); if( location.isEmpty() == false ) { From ec5737b8b6355482fe157aab9eceaf44c7b2989a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 18 Jul 2022 09:43:07 +0200 Subject: [PATCH 1390/1765] ComputerManager: add hasSubLocations() --- master/src/ComputerManager.cpp | 21 +++++++++++++++++++++ master/src/ComputerManager.h | 3 ++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index a2bd150d8..b10fa2fda 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -395,6 +395,27 @@ ComputerList ComputerManager::getComputersAtLocation( const QString& locationNam +bool ComputerManager::hasSubLocations(const QModelIndex& index) const +{ + const auto model = computerTreeModel(); + const auto rows = model->rowCount(index); + + for (int i = 0; i < rows; ++i) + { + const auto objectType = NetworkObject::Type(model->data(model->index(i, 0, index), + NetworkObjectModel::TypeRole).toInt()); + + if (objectType == NetworkObject::Type::Location || objectType == NetworkObject::Type::DesktopGroup) + { + return true; + } + } + + return false; +} + + + ComputerList ComputerManager::selectedComputers( const QModelIndex& parent ) { QAbstractItemModel* model = computerTreeModel(); diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index 91e778b7a..050969525 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -45,7 +45,7 @@ class ComputerManager : public QObject return m_networkObjectModel; } - QAbstractItemModel* computerTreeModel() + QAbstractItemModel* computerTreeModel() const { return m_computerTreeModel; } @@ -74,6 +74,7 @@ class ComputerManager : public QObject QString findLocationOfComputer( const QStringList& hostNames, const QList& hostAddresses, const QModelIndex& parent ); ComputerList getComputersAtLocation( const QString& locationName, const QModelIndex& parent = QModelIndex() ); + bool hasSubLocations(const QModelIndex& index) const; QModelIndex findNetworkObject( NetworkObject::Uid networkObjectUid, const QModelIndex& parent = QModelIndex() ); From eb2a9e42a48cf7e708fd996f9410b0092e0deace Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 18 Jul 2022 09:43:39 +0200 Subject: [PATCH 1391/1765] ComputerManager: make getComputersAtLocation() make work with nested locations --- master/src/ComputerManager.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index b10fa2fda..3bdffa0b6 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -364,6 +364,8 @@ ComputerList ComputerManager::getComputersAtLocation( const QString& locationNam { QAbstractItemModel* model = computerTreeModel(); + const bool parentMatches = model->data(parent, NetworkObjectModel::NameRole).toString() == locationName; + int rows = model->rowCount( parent ); ComputerList computers; @@ -376,17 +378,21 @@ ComputerList ComputerManager::getComputersAtLocation( const QString& locationNam if( NetworkObject::isContainer(objectType) ) { - if( model->data( entryIndex, NetworkObjectModel::NameRole ).toString() == locationName ) + if (model->data(entryIndex, NetworkObjectModel::NameRole).toString() == locationName || + hasSubLocations(entryIndex)) { computers += getComputersAtLocation( locationName, entryIndex ); } } else if( objectType == NetworkObject::Type::Host ) { - computers += Computer( model->data( entryIndex, NetworkObjectModel::UidRole ).toUuid(), - model->data( entryIndex, NetworkObjectModel::NameRole ).toString(), - model->data( entryIndex, NetworkObjectModel::HostAddressRole ).toString(), - model->data( entryIndex, NetworkObjectModel::MacAddressRole ).toString() ); + if (parentMatches) + { + computers += Computer(model->data(entryIndex, NetworkObjectModel::UidRole).toUuid(), + model->data(entryIndex, NetworkObjectModel::NameRole).toString(), + model->data(entryIndex, NetworkObjectModel::HostAddressRole).toString(), + model->data(entryIndex, NetworkObjectModel::MacAddressRole).toString()); + } } } From 3cee22820347437eb7cbc9ff796d549984743915 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 18 Jul 2022 09:50:49 +0200 Subject: [PATCH 1392/1765] NetworkObjectFilterProxyModel: make group filtering work with nested locations --- master/src/NetworkObjectFilterProxyModel.cpp | 49 +++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 6c672d773..6535830ee 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -60,28 +60,55 @@ void NetworkObjectFilterProxyModel::setComputerExcludeFilter( const QStringList& bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { - if( sourceParent.isValid() ) + const auto rowIndex = sourceModel()->index(sourceRow, 0, sourceParent); + const auto objectType = NetworkObject::Type(sourceModel()->data(rowIndex, NetworkObjectModel::TypeRole).toInt()); + + if (objectType == NetworkObject::Type::Host) { if( m_computerExcludeList.isEmpty() ) { return true; } - const auto hostAddress = sourceModel()->data( sourceModel()->index( sourceRow, 0, sourceParent ), - NetworkObjectModel::HostAddressRole ).toString(); + const auto hostAddress = sourceModel()->data(rowIndex, NetworkObjectModel::HostAddressRole).toString(); return m_computerExcludeList.contains( hostAddress, Qt::CaseInsensitive ) == false; } - - if( m_excludeEmptyGroups && sourceModel()->rowCount( sourceModel()->index( sourceRow, 0 ) ) == 0 ) + else if(NetworkObject::isContainer(objectType)) { - return false; - } + if (sourceModel()->canFetchMore(rowIndex)) + { + sourceModel()->fetchMore(rowIndex); + } - if( m_groupList.isEmpty() ) - { - return true; + const auto rows = sourceModel()->rowCount(rowIndex); + + if (m_excludeEmptyGroups && rows == 0) + { + return false; + } + + if (m_groupList.isEmpty()) + { + return true; + } + + for (int i = 0; i < rows; ++i) + { + const auto objectType = NetworkObject::Type(sourceModel()->data(sourceModel()->index(i, 0, rowIndex), + NetworkObjectModel::TypeRole).toInt()); + + if (objectType == NetworkObject::Type::Location || objectType == NetworkObject::Type::DesktopGroup) + { + if (filterAcceptsRow(i, rowIndex)) + { + return true; + } + } + } + + return m_groupList.contains(sourceModel()->data(rowIndex).toString()); } - return m_groupList.contains( sourceModel()->data( sourceModel()->index( sourceRow, 0 ) ).toString() ); + return true; } From fa1100badca014ed6ffe5c6c1d6f9749c8706473 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 18 Jul 2022 13:31:11 +0200 Subject: [PATCH 1393/1765] LinuxServiceCore: add workaround for incomplete env vars For some reason, LinuxSessionFunctions::getSessionEnvironment() under certain circumstances only returns an incomplete set of environment variables. This can lead to situations where a running KDE session is indicated via XDG_CURRENT_DESKTOP but KDE_SESSION_VERSION not being set. In that case, xdg-open misdetects the running KDE version and does not work properly. Closes #817. --- plugins/platform/linux/LinuxServiceCore.cpp | 8 ++++++++ plugins/platform/linux/LinuxSessionFunctions.h | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 5602344cd..cab81ca11 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -226,6 +226,14 @@ void LinuxServiceCore::startServer( const QString& sessionPath ) } } + // workaround for #817 where LinuxSessionFunctions::getSessionEnvironment() does not return all + // environment variables when executed via systemd for an established KDE session and xdg-open fails + if (sessionEnvironment.value(LinuxSessionFunctions::xdgCurrentDesktopEnvVarName()) == QLatin1String("KDE") && + sessionEnvironment.contains(LinuxSessionFunctions::kdeSessionVersionEnvVarName()) == false) + { + sessionEnvironment.insert(LinuxSessionFunctions::xdgCurrentDesktopEnvVarName(), QStringLiteral("X-Generic")); + } + const auto sessionId = m_sessionManager.openSession( sessionPath ); vInfo() << "Starting server for new session" << sessionPath diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index dfed84b56..073993464 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -102,6 +102,16 @@ class LinuxSessionFunctions : public PlatformSessionFunctions static QString currentSessionPath(); + static QString kdeSessionVersionEnvVarName() + { + return QStringLiteral("KDE_SESSION_VERSION"); + } + + static QString xdgCurrentDesktopEnvVarName() + { + return QStringLiteral("XDG_CURRENT_DESKTOP"); + } + static QString xdgSessionIdEnvVarName() { return QStringLiteral("XDG_SESSION_ID"); From 5097f35a445841f5a9a6ec93c2c08db5a3ce6838 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 27 Jul 2022 13:07:57 +0200 Subject: [PATCH 1394/1765] CMake: work around binutils/GCC/Qt PIE+LTO issue As discussed at * https://bugzilla.opensuse.org/show_bug.cgi?id=1175278 * https://bugreports.qt.io/browse/QTBUG-86173? there's a problem with certain versions of GCC/binutils when building PIE-enabled applications and with LTO enabled. Work around by adding -fPIC after -fPIE and prevent CMake from managing PIC flags. Closes #810. --- CMakeLists.txt | 6 +++++- cmake/modules/BuildVeyonApplication.cmake | 3 ++- core/CMakeLists.txt | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f88de3c40..e5a4d9ba9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,11 @@ if(COMMAND CMAKE_POLICY) include(CheckPIESupported) check_pie_supported(LANGUAGES CXX) if(CMAKE_CXX_LINK_PIE_SUPPORTED) - set(CMAKE_COMPILE_FLAG_PIE "-fPIE") + set(CMAKE_COMPILE_OPTIONS_PIE "-fPIE") + set(CMAKE_LINK_OPTIONS_PIE "-pie;-fPIE;-fPIC") + else() + set(CMAKE_COMPILE_OPTIONS_PIE "-fPIC") + set(CMAKE_LINK_OPTIONS_PIE "-fPIC") endif() endif() endif() diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index 0623022b5..0611a2a0a 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -11,8 +11,9 @@ macro(build_veyon_application APPLICATION_NAME) install(TARGETS ${APPLICATION_NAME} RUNTIME DESTINATION bin) endif() target_include_directories(${APPLICATION_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src) + set_target_properties(${APPLICATION_NAME} PROPERTIES COMPILE_OPTIONS "${CMAKE_COMPILE_OPTIONS_PIE}") + set_target_properties(${APPLICATION_NAME} PROPERTIES LINK_OPTIONS "${CMAKE_LINK_OPTIONS_PIE}") target_link_libraries(${APPLICATION_NAME} PRIVATE veyon-core) - set_property(TARGET ${APPLICATION_NAME} PROPERTY POSITION_INDEPENDENT_CODE TRUE) set_default_target_properties(${APPLICATION_NAME}) if(WITH_PCH) target_precompile_headers(${APPLICATION_NAME} REUSE_FROM veyon-application-pch) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 14bb1e6f0..644421000 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -136,7 +136,8 @@ if(WITH_PCH) target_precompile_headers(veyon-core PRIVATE ${PCH}) add_pch_target(veyon-application-pch ${PCH}) - set_target_properties(veyon-application-pch PROPERTIES COMPILE_FLAGS "${CMAKE_COMPILE_FLAG_PIE}") + set_target_properties(veyon-application-pch PROPERTIES COMPILE_OPTIONS "${CMAKE_COMPILE_OPTIONS_PIE}") + set_target_properties(veyon-application-pch PROPERTIES LINK_OPTIONS "${CMAKE_LINK_OPTIONS_PIE}") add_pch_target(veyon-library-pch ${PCH}) set_target_properties(veyon-library-pch PROPERTIES POSITION_INDEPENDENT_CODE TRUE) From 3575c5ad299a1831d9669ddd0605103fe6a7f73b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 29 Jul 2022 09:15:16 +0200 Subject: [PATCH 1395/1765] RemoteAccess: fix viewport for negative screen coordinates On Windows, screens can have negative coordinates when configured to be placed in non-default order (i.e. screen 2 is left of screen 1). The viewport calculation has to be fixed accordingly by using the minimum coordinates as zero point. Closes #818. --- plugins/remoteaccess/RemoteAccessWidget.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index cf37187d5..987e106b5 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -265,10 +265,17 @@ void RemoteAccessWidgetToolBar::updateScreens() menu->addSeparator(); + QPoint minimumScreenPosition{}; + for (const auto& screen : screens) + { + minimumScreenPosition.setX(qMin(minimumScreenPosition.x(), screen.geometry.x())); + minimumScreenPosition.setY(qMin(minimumScreenPosition.y(), screen.geometry.y())); + } + for (const auto& screen : screens) { const auto action = menu->addAction(screen.name, this, [=]() { - m_parent->vncView()->setViewport(screen.geometry); + m_parent->vncView()->setViewport(screen.geometry.translated(-minimumScreenPosition)); }); action->setCheckable(true); if(action->text() == checkedScreenName) From eb552df3805f5a1dcfe9ddb15db24ed004cb23cc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 29 Jul 2022 11:38:30 +0200 Subject: [PATCH 1396/1765] LockWidget: move to left-most screen and fix resizing On Windows, screens can have negative coordinates when configured to be placed in non-default order (i.e. screen 2 is left of screen 1). Also improve the function call order to make the screen and geometry adjustments work properly. Closes #807. --- core/src/LockWidget.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index 62c9983b1..7a0d38958 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -36,34 +36,34 @@ LockWidget::LockWidget( Mode mode, const QPixmap& background, QWidget* parent ) m_background( background ), m_mode( mode ) { - if( mode == DesktopVisible ) + auto leftMostScreen = QGuiApplication::primaryScreen(); + int minimumX = 0; + for (auto* screen : QGuiApplication::screens()) { - auto screen = QGuiApplication::primaryScreen(); - if( windowHandle() ) + if (screen->geometry().x() < minimumX) { - screen = windowHandle()->screen(); - } - - if( screen ) - { - m_background = screen->grabWindow( 0 ); + minimumX = screen->geometry().x(); + leftMostScreen = screen; } } + if (mode == DesktopVisible) + { + m_background = leftMostScreen->grabWindow(0); + } VeyonCore::platform().coreFunctions().setSystemUiState( false ); VeyonCore::platform().inputDeviceFunctions().disableInputDevices(); setWindowTitle( {} ); - show(); - move( 0, 0 ); - setFixedSize( -#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) - windowHandle()-> -#endif - screen()->virtualSize()); - VeyonCore::platform().coreFunctions().raiseWindow( this, true ); + + move(leftMostScreen->geometry().topLeft()); showFullScreen(); + windowHandle()->setScreen(leftMostScreen); + setFixedSize(leftMostScreen->virtualSize()); + + VeyonCore::platform().coreFunctions().raiseWindow(this, true); + setFocusPolicy( Qt::StrongFocus ); setFocus(); grabMouse(); From 37958b67127fc114bd18cdce3a604d97617a9e91 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 29 Jul 2022 12:30:45 +0200 Subject: [PATCH 1397/1765] DemoClient: simplify toplevel widget handling As of eb552df3805f5a1dcfe9ddb15db24ed004cb23cc there's no longer a need to move the LockWidget or to call showFullScreen() on it. --- plugins/demo/DemoClient.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index 77c5578d0..8ebf36b66 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -26,7 +26,6 @@ #include #include "DemoClient.h" -#include "VeyonConfiguration.h" #include "LockWidget.h" #include "PlatformCoreFunctions.h" #include "VncViewWidget.h" @@ -43,6 +42,8 @@ DemoClient::DemoClient( const QString& host, int port, bool fullscreen, QRect vi else { m_toplevel = new QWidget(); + m_toplevel->setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint); + m_toplevel->move(0, 0); } m_toplevel->setWindowTitle( tr( "%1 Demo" ).arg( VeyonCore::applicationName() ) ); @@ -50,22 +51,12 @@ DemoClient::DemoClient( const QString& host, int port, bool fullscreen, QRect vi m_toplevel->setAttribute( Qt::WA_DeleteOnClose, false ); m_toplevel->installEventFilter(this); - if( fullscreen == false ) - { - m_toplevel->setWindowFlags( Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint ); - } - m_vncView = new VncViewWidget( m_computerControlInterface, viewport, m_toplevel ); connect( m_toplevel, &QObject::destroyed, this, &DemoClient::viewDestroyed ); connect( m_vncView, &VncViewWidget::sizeHintChanged, this, &DemoClient::resizeToplevelWidget ); - m_toplevel->move( 0, 0 ); - if( fullscreen ) - { - m_toplevel->showFullScreen(); - } - else + if (fullscreen == false) { m_toplevel->show(); } From bb9117ee94ecef58ef1be6b83d0ecd2f12115bbb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 29 Jul 2022 12:37:27 +0200 Subject: [PATCH 1398/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index b8e2a6760..6b734d107 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit b8e2a6760d3b1ff1f85f695550b6efe391a6ce6f +Subproject commit 6b734d107f1e0cc0d7254028a54d9a2eac9d81f6 From 7a55926341c6eb15322062e0a449071936dbfef9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 29 Jul 2022 13:06:08 +0200 Subject: [PATCH 1399/1765] ComputerManager: mark more functions const --- master/src/ComputerManager.cpp | 13 +++++++------ master/src/ComputerManager.h | 15 ++++++++------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 3bdffa0b6..d7c2912bf 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -141,7 +141,7 @@ bool ComputerManager::saveComputerAndUsersList( const QString& fileName ) -void ComputerManager::updateUser( const ComputerControlInterface::Pointer& controlInterface ) +void ComputerManager::updateUser(const ComputerControlInterface::Pointer& controlInterface) const { const auto networkObjectIndex = findNetworkObject( controlInterface->computer().networkObjectUid() ); @@ -318,7 +318,8 @@ void ComputerManager::updateLocationFilterList() -QString ComputerManager::findLocationOfComputer( const QStringList& hostNames, const QList& hostAddresses, const QModelIndex& parent ) +QString ComputerManager::findLocationOfComputer(const QStringList& hostNames, const QList& hostAddresses, + const QModelIndex& parent) const { QAbstractItemModel* model = networkObjectModel(); @@ -360,7 +361,7 @@ QString ComputerManager::findLocationOfComputer( const QStringList& hostNames, c -ComputerList ComputerManager::getComputersAtLocation( const QString& locationName, const QModelIndex& parent ) +ComputerList ComputerManager::getComputersAtLocation(const QString& locationName, const QModelIndex& parent) const { QAbstractItemModel* model = computerTreeModel(); @@ -422,7 +423,7 @@ bool ComputerManager::hasSubLocations(const QModelIndex& index) const -ComputerList ComputerManager::selectedComputers( const QModelIndex& parent ) +ComputerList ComputerManager::selectedComputers(const QModelIndex& parent) const { QAbstractItemModel* model = computerTreeModel(); @@ -460,7 +461,7 @@ ComputerList ComputerManager::selectedComputers( const QModelIndex& parent ) -QModelIndex ComputerManager::findNetworkObject( NetworkObject::Uid networkObjectUid, const QModelIndex& parent ) +QModelIndex ComputerManager::findNetworkObject(NetworkObject::Uid networkObjectUid, const QModelIndex& parent) const { QAbstractItemModel* model = networkObjectModel(); @@ -494,7 +495,7 @@ QModelIndex ComputerManager::findNetworkObject( NetworkObject::Uid networkObject -QModelIndex ComputerManager::mapToUserNameModelIndex( const QModelIndex& networkObjectIndex ) +QModelIndex ComputerManager::mapToUserNameModelIndex(const QModelIndex& networkObjectIndex) const { // map arbitrary index from m_networkObjectModel to username column in m_networkObjectOverlayDataModel const auto parent = m_networkObjectOverlayDataModel->mapFromSource( networkObjectIndex.parent() ); diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index 050969525..1a830f2b4 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -40,7 +40,7 @@ class ComputerManager : public QObject ComputerManager( UserConfig& config, QObject* parent ); ~ComputerManager() override; - QAbstractItemModel* networkObjectModel() + QAbstractItemModel* networkObjectModel() const { return m_networkObjectModel; } @@ -50,14 +50,14 @@ class ComputerManager : public QObject return m_computerTreeModel; } - ComputerList selectedComputers( const QModelIndex& parent ); + ComputerList selectedComputers(const QModelIndex& parent) const; void addLocation( const QString& location ); void removeLocation( const QString& location ); bool saveComputerAndUsersList( const QString& fileName ); - void updateUser( const ComputerControlInterface::Pointer& controlInterface ); + void updateUser(const ComputerControlInterface::Pointer& controlInterface) const; Q_SIGNALS: void computerSelectionReset(); @@ -71,14 +71,15 @@ class ComputerManager : public QObject void initComputerTreeModel(); void updateLocationFilterList(); - QString findLocationOfComputer( const QStringList& hostNames, const QList& hostAddresses, const QModelIndex& parent ); + QString findLocationOfComputer(const QStringList& hostNames, const QList& hostAddresses, + const QModelIndex& parent) const; - ComputerList getComputersAtLocation( const QString& locationName, const QModelIndex& parent = QModelIndex() ); + ComputerList getComputersAtLocation(const QString& locationName, const QModelIndex& parent = {}) const; bool hasSubLocations(const QModelIndex& index) const; - QModelIndex findNetworkObject( NetworkObject::Uid networkObjectUid, const QModelIndex& parent = QModelIndex() ); + QModelIndex findNetworkObject(NetworkObject::Uid networkObjectUid, const QModelIndex& parent = {}) const; - QModelIndex mapToUserNameModelIndex( const QModelIndex& networkObjectIndex ); + QModelIndex mapToUserNameModelIndex(const QModelIndex& networkObjectIndex) const; static constexpr int OverlayDataUsernameColumn = 1; From 2fd86c420ff0626f247a0cc1f1f806d25955cb15 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 29 Jul 2022 13:09:27 +0200 Subject: [PATCH 1400/1765] 3rdparty: x11vnc: update submodule --- 3rdparty/x11vnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/x11vnc b/3rdparty/x11vnc index 89df84c94..4e18eee54 160000 --- a/3rdparty/x11vnc +++ b/3rdparty/x11vnc @@ -1 +1 @@ -Subproject commit 89df84c94a1d48d623090fca28bfb20bfa5aed81 +Subproject commit 4e18eee54766e53d51edf459b04ec587e506d679 From 9665545871e33c00c7390785cb700df66eb3b220 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Aug 2022 10:29:42 +0200 Subject: [PATCH 1401/1765] ComputerControlInterface: check pointers in stream operators --- core/src/ComputerControlInterface.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index f6445382e..1a9c3308d 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -480,7 +480,10 @@ void ComputerControlInterface::handleFeatureMessage( const FeatureMessage& messa QDebug operator<<(QDebug stream, ComputerControlInterface::Pointer computerControlInterface) { - stream << qUtf8Printable(computerControlInterface->computer().hostAddress()); + if (computerControlInterface.isNull() == false) + { + stream << qUtf8Printable(computerControlInterface->computer().hostAddress()); + } return stream; } @@ -492,7 +495,10 @@ QDebug operator<<(QDebug stream, const ComputerControlInterfaceList& computerCon hostAddresses.reserve(computerControlInterfaces.size()); for(const auto& computerControlInterface : computerControlInterfaces) { - hostAddresses.append(computerControlInterface->computer().hostAddress()); + if (computerControlInterface.isNull() == false) + { + hostAddresses.append(computerControlInterface->computer().hostAddress()); + } } stream << QStringLiteral("[%1]").arg(hostAddresses.join(QLatin1Char(','))).toUtf8().constData(); From f0bfa59c29187b151b152199ba5a1203f3df2487 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Aug 2022 10:30:13 +0200 Subject: [PATCH 1402/1765] Logger: cache logToStdErr config property Otherwise an expensive configuration value lookup is performed for each log message. --- core/src/Logger.cpp | 6 ++++-- core/src/Logger.h | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/Logger.cpp b/core/src/Logger.cpp index 62c3d0702..52cf0b6a8 100644 --- a/core/src/Logger.cpp +++ b/core/src/Logger.cpp @@ -47,6 +47,9 @@ Logger::Logger( const QString &appName ) : s_instance = this; s_instanceMutex.unlock(); + m_logToSystem = VeyonCore::config().logToSystem(); + m_logToStdErr = VeyonCore::config().logToStdErr(); + auto configuredLogLevel = VeyonCore::config().logLevel(); if( qEnvironmentVariableIsSet( logLevelEnvironmentVariable() ) ) { @@ -54,7 +57,6 @@ Logger::Logger( const QString &appName ) : } m_logLevel = qBound( LogLevel::Min, configuredLogLevel, LogLevel::Max ); - m_logToSystem = VeyonCore::config().logToSystem(); if( m_logLevel > LogLevel::Nothing ) { @@ -328,7 +330,7 @@ void Logger::outputMessage( const QString& message ) } } - if( VeyonCore::config().logToStdErr() ) + if (m_logToStdErr) { fprintf( stderr, "%s", message.toUtf8().constData() ); fflush( stderr ); diff --git a/core/src/Logger.h b/core/src/Logger.h index dcba7d768..465aa2ea2 100644 --- a/core/src/Logger.h +++ b/core/src/Logger.h @@ -93,6 +93,7 @@ class VEYON_CORE_EXPORT Logger LogLevel m_lastMessageLevel{LogLevel::Nothing}; QString m_lastMessage{}; int m_lastMessageCount{0}; + bool m_logToStdErr{false}; bool m_logToSystem{false}; QString m_appName; From d73c90ca80b996dac1c6ed3f6b3d02b0e26bd482 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Aug 2022 10:31:15 +0200 Subject: [PATCH 1403/1765] Demo: change return type of controlDemoServer() to void --- plugins/demo/DemoFeaturePlugin.cpp | 4 +--- plugins/demo/DemoFeaturePlugin.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index b0858537d..72d4d94f4 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -562,7 +562,7 @@ QRect DemoFeaturePlugin::viewportFromScreenSelection() const -bool DemoFeaturePlugin::controlDemoServer() +void DemoFeaturePlugin::controlDemoServer() { if( m_demoServerControlTimer.isActive() ) { @@ -584,8 +584,6 @@ bool DemoFeaturePlugin::controlDemoServer() sendFeatureMessage( FeatureMessage{ m_demoServerFeature.uid(), StopDemoServer }, m_demoServerControlInterfaces ); } - - return true; } diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index de7204d76..26610ef21 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -129,7 +129,7 @@ class DemoFeaturePlugin : public QObject, FeatureProviderInterface, PluginInterf QRect viewportFromScreenSelection() const; - bool controlDemoServer(); + void controlDemoServer(); bool controlDemoClient( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ); From d884e0b1b3a09ff8fc5b42507f9a3d3d33142565 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Aug 2022 10:32:57 +0200 Subject: [PATCH 1404/1765] Demo: control server with affinity of control timer Otherwise the control timer won't be started or stopped properly when controlFeature() is called e.g. from a WebAPI thread. --- plugins/demo/DemoFeaturePlugin.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 72d4d94f4..5eadc09c8 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -141,24 +141,27 @@ bool DemoFeaturePlugin::controlFeature( Feature::Uid featureUid, { if( featureUid == m_demoServerFeature.uid() ) { - m_demoServerArguments = arguments; - if( operation == Operation::Start ) { - m_demoServerControlTimer.start( DemoServerControlInterval ); - m_demoServerControlInterfaces = computerControlInterfaces; + QMetaObject::invokeMethod(&m_demoServerControlTimer, [this, &arguments, &computerControlInterfaces]() { + m_demoServerArguments = arguments; + m_demoServerControlInterfaces = computerControlInterfaces; + m_demoServerControlTimer.start(DemoServerControlInterval); + controlDemoServer(); + }, Qt::BlockingQueuedConnection); } else if( operation == Operation::Stop ) { - m_demoServerControlTimer.stop(); + QMetaObject::invokeMethod(&m_demoServerControlTimer, [this]() { + m_demoServerControlTimer.stop(); + controlDemoServer(); + }, Qt::BlockingQueuedConnection); } else { return false; } - controlDemoServer(); - return true; } From 76e77dcf974a3742e6eafadd49cd1b7ba46ff777 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Aug 2022 10:34:57 +0200 Subject: [PATCH 1405/1765] Demo: stop server for specified connections Instead of relying on a potentially outdated connection list in m_demoServerControlInterfaces always use the connection list passed to controlFeature(). This way the demo server on a certain computer is always stopped properly regardless of the previous DemoFeaturePlugin state. --- plugins/demo/DemoFeaturePlugin.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 5eadc09c8..971edf963 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -152,9 +152,11 @@ bool DemoFeaturePlugin::controlFeature( Feature::Uid featureUid, } else if( operation == Operation::Stop ) { - QMetaObject::invokeMethod(&m_demoServerControlTimer, [this]() { + QMetaObject::invokeMethod(&m_demoServerControlTimer, [this, &computerControlInterfaces]() { m_demoServerControlTimer.stop(); + m_demoServerControlInterfaces = computerControlInterfaces; controlDemoServer(); + m_demoServerControlInterfaces.clear(); }, Qt::BlockingQueuedConnection); } else From 7b9ddc5718bd08a75e27ad44758be934df7a0ea5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Aug 2022 11:12:21 +0200 Subject: [PATCH 1406/1765] Demo: fix build with Qt < 5.10 Since the WebAPI plugin (which is the only caller of DemoFeaturePlugin::controlFeature() from a thread other than the main thread) requires Qt >= 5.12 anyway, we can safely omit the meta object method call. It's available for functors with Qt >= 5.10 only. --- plugins/demo/DemoFeaturePlugin.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 971edf963..9ff35141a 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -143,21 +143,29 @@ bool DemoFeaturePlugin::controlFeature( Feature::Uid featureUid, { if( operation == Operation::Start ) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) QMetaObject::invokeMethod(&m_demoServerControlTimer, [this, &arguments, &computerControlInterfaces]() { +#endif m_demoServerArguments = arguments; m_demoServerControlInterfaces = computerControlInterfaces; m_demoServerControlTimer.start(DemoServerControlInterval); controlDemoServer(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) }, Qt::BlockingQueuedConnection); +#endif } else if( operation == Operation::Stop ) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) QMetaObject::invokeMethod(&m_demoServerControlTimer, [this, &computerControlInterfaces]() { +#endif m_demoServerControlTimer.stop(); m_demoServerControlInterfaces = computerControlInterfaces; controlDemoServer(); m_demoServerControlInterfaces.clear(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) }, Qt::BlockingQueuedConnection); +#endif } else { From 3eaeed75588b5f6b3c31262ac5430c37cb848eba Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 2 Aug 2022 11:55:29 +0200 Subject: [PATCH 1407/1765] Logger: extend log level parsing Besides numbers corresponding to the LogLevel enum values, it's now also possible to specify "debug", "info", "warn", "err" or "crit" in the VEYON_LOG_LEVEL environment variable. --- core/src/Logger.cpp | 40 +++++++++++++++++++++++++++++++++++++++- core/src/Logger.h | 1 + 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/core/src/Logger.cpp b/core/src/Logger.cpp index 52cf0b6a8..ce7a139d8 100644 --- a/core/src/Logger.cpp +++ b/core/src/Logger.cpp @@ -53,7 +53,13 @@ Logger::Logger( const QString &appName ) : auto configuredLogLevel = VeyonCore::config().logLevel(); if( qEnvironmentVariableIsSet( logLevelEnvironmentVariable() ) ) { - configuredLogLevel = static_cast( qEnvironmentVariableIntValue( logLevelEnvironmentVariable() ) ); + configuredLogLevel = logLevelFromString( +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + qEnvironmentVariable(logLevelEnvironmentVariable()) +#else + QLatin1String(qgetenv(logLevelEnvironmentVariable())) +#endif + ); } m_logLevel = qBound( LogLevel::Min, configuredLogLevel, LogLevel::Max ); @@ -98,6 +104,38 @@ Logger::~Logger() +Logger::LogLevel Logger::logLevelFromString(const QString& logLevelString) +{ + if (logLevelString.startsWith(QLatin1String("debug"))) + { + return LogLevel::Debug; + } + + if (logLevelString.startsWith(QLatin1String("info"))) + { + return LogLevel::Info; + } + + if (logLevelString.startsWith(QLatin1String("warn"))) + { + return LogLevel::Warning; + } + + if (logLevelString.startsWith(QLatin1String("err"))) + { + return LogLevel::Error; + } + + if (logLevelString.startsWith(QLatin1String("crit"))) + { + return LogLevel::Critical; + } + + return LogLevel(logLevelString.toUInt()); +} + + + void Logger::initLogFile() { diff --git a/core/src/Logger.h b/core/src/Logger.h index 465aa2ea2..21f24b1ea 100644 --- a/core/src/Logger.h +++ b/core/src/Logger.h @@ -70,6 +70,7 @@ class VEYON_CORE_EXPORT Logger return m_logLevel; } + static LogLevel logLevelFromString(const QString& logLevelString); private: void initLogFile(); From 1941d03cc2ce5eb56b193cd52d8929b5120f7066 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Aug 2022 11:24:39 +0200 Subject: [PATCH 1408/1765] Fix Clazy warnings --- core/src/LockWidget.cpp | 3 ++- core/src/PluginManager.cpp | 5 +++-- core/src/VeyonCore.cpp | 2 +- master/src/MainWindow.cpp | 4 ++-- master/src/MainWindow.h | 4 ++-- master/src/VeyonMaster.cpp | 4 ++-- plugins/authkeys/AuthKeysManager.cpp | 2 +- plugins/demo/DemoServerConnection.h | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 2 +- 9 files changed, 15 insertions(+), 13 deletions(-) diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index 7a0d38958..017596f4c 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -38,7 +38,8 @@ LockWidget::LockWidget( Mode mode, const QPixmap& background, QWidget* parent ) { auto leftMostScreen = QGuiApplication::primaryScreen(); int minimumX = 0; - for (auto* screen : QGuiApplication::screens()) + const auto screens = QGuiApplication::screens(); + for (auto* screen : screens) { if (screen->geometry().x() < minimumX) { diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index 13083a873..8e42dd5f2 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -161,7 +161,8 @@ void PluginManager::initPluginSearchPath() QStringLiteral(CMAKE_BINARY_DIR "/plugins/vncserver"), QStringLiteral(CMAKE_BINARY_DIR "/plugins/")}) { - for (auto pluginDir : QDir(baseDir).entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot)) + const auto pluginDirs = QDir(baseDir).entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot); + for (const auto& pluginDir : pluginDirs) { m_pluginSearchPaths.append(pluginDir.absoluteFilePath()); } @@ -174,7 +175,7 @@ void PluginManager::initPluginSearchPath() void PluginManager::loadPlugins( const QString& nameFilter ) { QFileInfoList plugins; - for (const auto& pluginSearchPath : m_pluginSearchPaths) + for (const auto& pluginSearchPath : qAsConst(m_pluginSearchPaths)) { plugins.append(QDir(pluginSearchPath).entryInfoList({nameFilter})); } diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 21e0fab32..4f6d738a4 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -106,7 +106,7 @@ VeyonCore::VeyonCore( QCoreApplication* application, Component component, const initSystemInfo(); - Q_EMIT initialized(); + Q_EMIT initialized(); // clazy:exclude=incorrect-emit } diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 9ffcb338d..eead1f7e6 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -115,7 +115,7 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : mainSplitter->setStretchFactor( mainSplitter->indexOf(monitoringSplitter), 1 ); - static const QMap panelButtons{ + static const QHash panelButtons{ { computerSelectPanel, ui->computerSelectPanelButton }, { screenshotManagementPanel, ui->screenshotManagementPanelButton }, { slideshowPanel, ui->slideshowPanelButton }, @@ -244,7 +244,7 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : addFeaturesToToolBar(); reloadSubFeatures(); - m_modeGroup->button( static_cast( qHash( VeyonCore::builtinFeatures().monitoringMode().feature().uid() ) ) )->setChecked( true ); + m_modeGroup->button(int(qHash(VeyonCore::builtinFeatures().monitoringMode().feature().uid())))->setChecked(true); // clazy:exclude=qt6-qhash-signature VeyonCore::enforceBranding( this ); } diff --git a/master/src/MainWindow.h b/master/src/MainWindow.h index 84ebb517b..31109fb25 100644 --- a/master/src/MainWindow.h +++ b/master/src/MainWindow.h @@ -67,9 +67,9 @@ private Q_SLOTS: void showAboutDialog(); private: - static int buttonId( const Feature& feature ) + static int buttonId(const Feature& feature) // clazy:exclude=qt6-qhash-signature { - return static_cast( qHash( feature.uid() ) ); + return int(qHash(feature.uid())); } static constexpr const char* originalSizePropertyName() diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index e7fec7eae..1e788053a 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -123,7 +123,7 @@ FeatureList VeyonMaster::allFeatures() const for( const auto& feature : qAsConst( features() ) ) { - featureList.append( feature ); + featureList.append(feature); // clazy:exclude=reserve-candidates const auto modeSubFeatures = subFeatures( feature.uid() ); for( const auto& subFeature : modeSubFeatures ) { @@ -360,7 +360,7 @@ FeatureList VeyonMaster::featureList() const const auto addFeatures = [&]( const std::function& extraFilter ) { - for( const auto& pluginUid : pluginUids ) + for(const auto& pluginUid : qAsConst(pluginUids)) { for( const auto& feature : VeyonCore::featureManager().features( pluginUid ) ) { diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index 7c530399a..72bff70bf 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -431,7 +431,7 @@ QString AuthKeysManager::accessGroup( const QString& key ) -QString AuthKeysManager::keyPairId( const QString& key ) +QString AuthKeysManager::keyPairId(const QString& key) // clazy:exclude=qt6-qhash-signature { const auto nameAndType = key.split( QLatin1Char('/') ); const auto name = nameAndType.value( 0 ); diff --git a/plugins/demo/DemoServerConnection.h b/plugins/demo/DemoServerConnection.h index 97bc4712c..b75ffeac2 100644 --- a/plugins/demo/DemoServerConnection.h +++ b/plugins/demo/DemoServerConnection.h @@ -45,7 +45,7 @@ class DemoServerConnection : public QThread private: void run() override; - void processClient(); + void processClient(); // clazy:exclude=thread-with-slots void sendFramebufferUpdate(); bool receiveClientMessage(); diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 97e66f7c5..5e2f076e4 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -390,7 +390,7 @@ void RemoteAccessFeaturePlugin::createRemoteAccessWindow(const ComputerControlIn } connect(remoteAccessView, &QObject::destroyed, this, [this](QObject* view) { - for (auto it = m_vncViews.begin(); it != m_vncViews.end();) + for (auto it = m_vncViews.begin(); it != m_vncViews.end();) // clazy:exclude=detaching-member { if (it->first == nullptr || it->first == view) { From 4835ec7664039cad2482e942c098e9296b065bfe Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Aug 2022 11:27:59 +0200 Subject: [PATCH 1409/1765] VeyonConfigurationProperties: add computerStatePollingInterval property --- core/src/VeyonConfigurationProperties.h | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 615869982..fd8006286 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -39,6 +39,7 @@ OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::ApplicationVersion, applicationVersion, setApplicationVersion, "ApplicationVersion", "Core", QVariant::fromValue(VeyonCore::ApplicationVersion::Version_4_0), Configuration::Property::Flag::Hidden ) \ OP( VeyonConfiguration, VeyonCore::config(), QJsonObject, pluginVersions, setPluginVersions, "PluginVersions", "Core", QJsonObject(), Configuration::Property::Flag::Hidden ) \ OP( VeyonConfiguration, VeyonCore::config(), QString, installationID, setInstallationID, "InstallationID", "Core", QString(), Configuration::Property::Flag::Hidden ) \ + OP(VeyonConfiguration, VeyonCore::config(), int, computerStatePollingInterval, setComputerStatePollingInterval, "ComputerStatePollingInterval", "Core", -1, Configuration::Property::Flag::Hidden) \ #define FOREACH_VEYON_VNC_CONNECTION_CONFIG_PROPERTIES(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, useCustomVncConnectionSettings, setUseCustomVncConnectionSettings, "UseCustomSettings", "VncConnection", false, Configuration::Property::Flag::Hidden ) \ From e9006d31ebb7a4f03c9498c52bdb06f490f1cc47 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 16 Aug 2022 11:55:31 +0200 Subject: [PATCH 1410/1765] ComputerControlInterface: poll states if interval is set In case fast updates of active features and/or user information is required, we must not rely on the remote computer sending state updates automatically. State updates are implemented through async feature messages introduced with Veyon 4.7 and due to protocol limitations are sent by the Veyon Server only after receiving any data/updates from the VNC server through the VNC proxy protocol. If there are no changes to the framebuffer and no mouse movements, the VNC server usually does not send any data even if framebuffer updates are requested. This effectively delays any ComputerControlInterface state updates until e.g. the clock update in the system tray causes a framebuffer update, i.e. up to 1 minute. To work around this, manually poll the computer state according to the newly introduced computerStatePollingInterval configuration property. --- core/src/ComputerControlInterface.cpp | 12 ++++++++---- core/src/ComputerControlInterface.h | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 1a9c3308d..18147c55d 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -51,7 +51,7 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in setServerVersion(VeyonCore::ApplicationVersion::Unknown); }); - connect(&m_compatPollingTimer, &QTimer::timeout, this, [this]() { + connect(&m_statePollingTimer, &QTimer::timeout, this, [this]() { updateUser(); updateActiveFeatures(); }); @@ -200,9 +200,12 @@ void ComputerControlInterface::setServerVersion(VeyonCore::ApplicationVersion ve m_serverVersion = version; - if (m_serverVersion >= VeyonCore::ApplicationVersion::Version_4_7) + const auto statePollingInterval = VeyonCore::config().computerStatePollingInterval(); + + if (m_serverVersion >= VeyonCore::ApplicationVersion::Version_4_7 && + statePollingInterval <= 0) { - m_compatPollingTimer.stop(); + m_statePollingTimer.stop(); updateScreens(); setMinimumFramebufferUpdateInterval(); @@ -214,7 +217,8 @@ void ComputerControlInterface::setServerVersion(VeyonCore::ApplicationVersion ve vncConnection()->setRequiresManualUpdateRateControl(true); } - m_compatPollingTimer.start(VeyonCore::config().computerMonitoringUpdateInterval()); + m_statePollingTimer.start(statePollingInterval > 0 ? statePollingInterval : + VeyonCore::config().computerMonitoringUpdateInterval()); } } diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index ad8af677b..58411ae1c 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -215,7 +215,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab VeyonCore::ApplicationVersion m_serverVersion{VeyonCore::ApplicationVersion::Unknown}; QTimer m_serverVersionQueryTimer{this}; - QTimer m_compatPollingTimer{this}; + QTimer m_statePollingTimer{this}; QStringList m_groups; From 47da27b4fba55db44a321bf87642ddf6c49f277c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Aug 2022 09:58:38 +0200 Subject: [PATCH 1411/1765] Demo: assume controlFeature() being called from main thread This reverts d884e0b1b3a09ff8fc5b42507f9a3d3d33142565 and 7b9ddc5718bd08a75e27ad44758be934df7a0ea5 since it causes a deadlock when being called from the main thread. It's up to the caller to call any controlFeature() implementations from the main thread. --- plugins/demo/DemoFeaturePlugin.cpp | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 9ff35141a..8f7f7ce9a 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -143,29 +143,17 @@ bool DemoFeaturePlugin::controlFeature( Feature::Uid featureUid, { if( operation == Operation::Start ) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - QMetaObject::invokeMethod(&m_demoServerControlTimer, [this, &arguments, &computerControlInterfaces]() { -#endif - m_demoServerArguments = arguments; - m_demoServerControlInterfaces = computerControlInterfaces; - m_demoServerControlTimer.start(DemoServerControlInterval); - controlDemoServer(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - }, Qt::BlockingQueuedConnection); -#endif + m_demoServerArguments = arguments; + m_demoServerControlInterfaces = computerControlInterfaces; + m_demoServerControlTimer.start( DemoServerControlInterval ); + controlDemoServer(); } else if( operation == Operation::Stop ) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - QMetaObject::invokeMethod(&m_demoServerControlTimer, [this, &computerControlInterfaces]() { -#endif - m_demoServerControlTimer.stop(); - m_demoServerControlInterfaces = computerControlInterfaces; - controlDemoServer(); - m_demoServerControlInterfaces.clear(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - }, Qt::BlockingQueuedConnection); -#endif + m_demoServerControlTimer.stop(); + m_demoServerControlInterfaces = computerControlInterfaces; + controlDemoServer(); + m_demoServerControlInterfaces.clear(); } else { From 00c72c49acb22085fdf5d4ca1939b050f1ef0bc6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Aug 2022 13:53:22 +0200 Subject: [PATCH 1412/1765] VeyonCore: add debug message --- core/src/VeyonCore.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 4f6d738a4..e0065cb42 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -40,7 +40,6 @@ #include "AuthenticationCredentials.h" #include "AuthenticationManager.h" #include "BuiltinFeatures.h" -#include "ComputerControlInterface.h" #include "FeatureManager.h" #include "Filesystem.h" #include "HostAddress.h" @@ -113,6 +112,8 @@ VeyonCore::VeyonCore( QCoreApplication* application, Component component, const VeyonCore::~VeyonCore() { + vDebug(); + delete m_featureManager; m_featureManager = nullptr; From 0999329d2b5c4b1bef8e6450d5e24a97a6830eb6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Aug 2022 12:07:14 +0200 Subject: [PATCH 1413/1765] VeyonWorker: improve connection management Explicitly delete FeatureWorkerManagerConnection --- worker/src/VeyonWorker.cpp | 17 +++++++++++++++-- worker/src/VeyonWorker.h | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/worker/src/VeyonWorker.cpp b/worker/src/VeyonWorker.cpp index b5aea2125..6f8c6e056 100644 --- a/worker/src/VeyonWorker.cpp +++ b/worker/src/VeyonWorker.cpp @@ -56,14 +56,27 @@ VeyonWorker::VeyonWorker( QUuid featureUid, QObject* parent ) : qFatal( "Specified feature is disabled by configuration!" ); } - m_workerManagerConnection = new FeatureWorkerManagerConnection( *this, featureUid, this ); + m_workerManagerConnection = new FeatureWorkerManagerConnection(*this, featureUid); vInfo() << "Running worker for feature" << workerFeature->name(); } +VeyonWorker::~VeyonWorker() +{ + vDebug(); + + delete m_workerManagerConnection; + m_workerManagerConnection = nullptr; + + vDebug() << "finished"; +} + + + bool VeyonWorker::sendFeatureMessageReply( const FeatureMessage& reply ) { - return m_workerManagerConnection->sendMessage( reply ); + return m_workerManagerConnection && + m_workerManagerConnection->sendMessage( reply ); } diff --git a/worker/src/VeyonWorker.h b/worker/src/VeyonWorker.h index 854543fa1..9dd84fb2f 100644 --- a/worker/src/VeyonWorker.h +++ b/worker/src/VeyonWorker.h @@ -34,6 +34,7 @@ class VeyonWorker : public QObject, VeyonWorkerInterface Q_OBJECT public: explicit VeyonWorker( QUuid featureUid, QObject* parent = nullptr ); + ~VeyonWorker() override; bool sendFeatureMessageReply( const FeatureMessage& reply ) override; From 4ee76eb6dfe31c094368292bf22a726e8fb491ca Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Aug 2022 13:53:01 +0200 Subject: [PATCH 1414/1765] FeatureWorkerManagerConnection: load port from config only once --- worker/src/FeatureWorkerManagerConnection.cpp | 9 ++++----- worker/src/FeatureWorkerManagerConnection.h | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index a68517d6d..c31ae7302 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -35,6 +35,7 @@ FeatureWorkerManagerConnection::FeatureWorkerManagerConnection( VeyonWorkerInter QObject* parent ) : QObject( parent ), m_worker( worker ), + m_port(VeyonCore::config().featureWorkerManagerPort() + VeyonCore::sessionId()), m_socket( this ), m_featureUid( featureUid ) { @@ -65,12 +66,10 @@ void FeatureWorkerManagerConnection::tryConnection() { if( m_socket.state() != QTcpSocket::ConnectedState ) { - const auto port = quint16( VeyonCore::config().featureWorkerManagerPort() + VeyonCore::sessionId() ); + vDebug() << "connecting to FeatureWorkerManager at port" << m_port; - vDebug() << "connecting to FeatureWorkerManager at port" << port; - - m_socket.connectToHost( QHostAddress::LocalHost, port ); - m_connectTimer.start( ConnectTimeout ); + m_socket.connectToHost(QHostAddress::LocalHost, m_port); + m_connectTimer.start(ConnectTimeout); } } diff --git a/worker/src/FeatureWorkerManagerConnection.h b/worker/src/FeatureWorkerManagerConnection.h index ce003f7c5..a4ff598ad 100644 --- a/worker/src/FeatureWorkerManagerConnection.h +++ b/worker/src/FeatureWorkerManagerConnection.h @@ -52,6 +52,7 @@ class FeatureWorkerManagerConnection : public QObject void receiveMessage(); VeyonWorkerInterface& m_worker; + const int m_port; QTcpSocket m_socket; Feature::Uid m_featureUid; QTimer m_connectTimer{this}; From 2a786c55c358a822b674f73b925fecd276fdae43 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Aug 2022 12:08:09 +0200 Subject: [PATCH 1415/1765] FeatureWorkerManagerConnection: terminate via exit() Also add debug message. --- worker/src/FeatureWorkerManagerConnection.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index c31ae7302..ac9630d25 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -44,8 +44,11 @@ FeatureWorkerManagerConnection::FeatureWorkerManagerConnection( VeyonWorkerInter connect( &m_socket, &QTcpSocket::connected, this, &FeatureWorkerManagerConnection::sendInitMessage ); - connect( &m_socket, &QTcpSocket::disconnected, - QCoreApplication::instance(), &QCoreApplication::quit ); + connect(&m_socket, &QTcpSocket::disconnected, this, + [=]() { + vDebug() << "lost connection to FeatureWorkerManager – exiting"; + QCoreApplication::instance()->exit(0); + }, Qt::QueuedConnection); connect( &m_socket, &QTcpSocket::readyRead, this, &FeatureWorkerManagerConnection::receiveMessage ); From 21e8c7db5cd0fb030b4946b00ddf8272f6ed6310 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Aug 2022 13:54:12 +0200 Subject: [PATCH 1416/1765] FeatureWorkerManagerConnection: add debug message --- worker/src/FeatureWorkerManagerConnection.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index ac9630d25..c9355de09 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -60,6 +60,8 @@ FeatureWorkerManagerConnection::FeatureWorkerManagerConnection( VeyonWorkerInter bool FeatureWorkerManagerConnection::sendMessage( const FeatureMessage& message ) { + vDebug() << message; + return message.send( &m_socket ); } From 87793e4820e0a91227be4df32747fcb0f3db677e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Aug 2022 12:01:03 +0200 Subject: [PATCH 1417/1765] WindowsServiceCore: never start servers during service shutdown Check if service has been requested to shutdown while already stopping a server instance. --- plugins/platform/windows/WindowsServiceCore.cpp | 17 +++++++++++------ plugins/platform/windows/WindowsServiceCore.h | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index 4f7129ce8..dc47c0ba6 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -50,8 +50,6 @@ class VeyonServerProcess void start( DWORD wtsSessionId, const ServiceDataManager::Token& token ) { - stop(); - const auto baseProcessId = WtsSessionManager::findWinlogonProcessId( wtsSessionId ); const auto user = WtsSessionManager::querySessionInformation( wtsSessionId, WtsSessionManager::SessionInfo::UserName ); @@ -189,7 +187,8 @@ void WindowsServiceCore::manageServersForAllSessions() const auto activeSessionOnly = m_sessionManager.mode() == PlatformSessionManager::Mode::Active; - while( WaitForSingleObject( m_stopServiceEvent, SessionPollingInterval ) == WAIT_TIMEOUT ) + while (WaitForSingleObject(m_stopServiceEvent, SessionPollingInterval) == WAIT_TIMEOUT && + m_serviceShutdownPending == 0) { auto wtsSessionIds = WtsSessionManager::activeSessions(); @@ -262,7 +261,8 @@ void WindowsServiceCore::manageServerForConsoleSession() QElapsedTimer lastServerStart; - while( WaitForSingleObject( m_stopServiceEvent, SessionPollingInterval ) == WAIT_TIMEOUT ) + while (WaitForSingleObject(m_stopServiceEvent, SessionPollingInterval) == WAIT_TIMEOUT && + m_serviceShutdownPending == 0) { const auto sessionChanged = m_sessionChangeEvent.testAndSetOrdered( 1, 0 ); const auto wtsSessionId = WtsSessionManager::activeConsoleSession(); @@ -285,8 +285,12 @@ void WindowsServiceCore::manageServerForConsoleSession() if( wtsSessionId != WtsSessionManager::InvalidSession || sessionChanged ) { - veyonServerProcess.start( wtsSessionId, m_dataManager.token() ); - lastServerStart.restart(); + veyonServerProcess.stop(); + if (m_serviceShutdownPending == 0) + { + veyonServerProcess.start( wtsSessionId, m_dataManager.token() ); + lastServerStart.restart(); + } } oldWtsSessionId = wtsSessionId; @@ -411,6 +415,7 @@ DWORD WindowsServiceCore::serviceCtrl( DWORD ctrlCode, DWORD eventType, LPVOID e case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: m_status.dwCurrentState = SERVICE_STOP_PENDING; + m_serviceShutdownPending = 1; SetEvent( m_stopServiceEvent ); break; diff --git a/plugins/platform/windows/WindowsServiceCore.h b/plugins/platform/windows/WindowsServiceCore.h index 1773432fa..744e7b87d 100644 --- a/plugins/platform/windows/WindowsServiceCore.h +++ b/plugins/platform/windows/WindowsServiceCore.h @@ -61,6 +61,7 @@ class WindowsServiceCore SERVICE_STATUS_HANDLE m_statusHandle{nullptr}; HANDLE m_stopServiceEvent{nullptr}; HANDLE m_serverShutdownEvent{nullptr}; + QAtomicInt m_serviceShutdownPending{0}; QAtomicInt m_sessionChangeEvent{0}; ServiceDataManager m_dataManager{}; From 444170d3b1d6f97f0bba4aa07ddd9297e27192f3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 14:20:25 +0200 Subject: [PATCH 1418/1765] LinuxUserFunctions: return -1 for unresolved UID/GID --- plugins/platform/linux/LinuxUserFunctions.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 23a15985d..f8f019eb9 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -451,9 +451,11 @@ uid_t LinuxUserFunctions::userIdFromName( const QString& username ) return pw_entry->pw_uid; } - return 0; + return -1; } + + gid_t LinuxUserFunctions::userGroupIdFromName( const QString& username ) { const auto pw_entry = getpwnam( username.toUtf8().constData() ); @@ -463,7 +465,7 @@ gid_t LinuxUserFunctions::userGroupIdFromName( const QString& username ) return pw_entry->pw_gid; } - return 0; + return -1; } From 03d32fbee3999b44c367206989b4a96f7e3de11d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 14:21:53 +0200 Subject: [PATCH 1419/1765] LinuxCoreFunctions: only fail for unresolved UID/GID --- plugins/platform/linux/LinuxCoreFunctions.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index ed8f0d6a7..da971214e 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -228,14 +228,16 @@ bool LinuxCoreFunctions::runProgramAsUser( const QString& program, const QString Q_UNUSED(desktop) const auto uid = LinuxUserFunctions::userIdFromName( username ); - if( uid <= 0 ) + if( uid < 0 ) { + vCritical() << "failed to resolve uid from username" << username; return false; } const auto gid = LinuxUserFunctions::userGroupIdFromName( username ); - if( gid <= 0 ) + if( gid < 0 ) { + vCritical() << "failed to resolve gid from username" << username; return false; } From 9ef7ba520242a20f330efab116abcbfcb11309c6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 14:22:29 +0200 Subject: [PATCH 1420/1765] LinuxCoreFunctions: deduplicate code for Qt 5/6 --- plugins/platform/linux/LinuxCoreFunctions.cpp | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index da971214e..a1903cba3 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -241,9 +241,8 @@ bool LinuxCoreFunctions::runProgramAsUser( const QString& program, const QString return false; } -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - auto process = new QProcess; - process->setChildProcessModifier( [uid, gid]() { + const auto adjustChildProcessPrivileges = [uid, gid]() + { if( setgroups(0, nullptr) != 0 ) { qFatal( "Could not drop all supplementary groups for child process!" ); @@ -256,40 +255,31 @@ bool LinuxCoreFunctions::runProgramAsUser( const QString& program, const QString { qFatal( "Could not set UID for child process!" ); } - } ); + }; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + auto process = new QProcess; + process->setChildProcessModifier(adjustChildProcessPrivileges); #else class UserProcess : public QProcess // clazy:exclude=missing-qobject-macro { public: - explicit UserProcess( uid_t uid, gid_t gid, QObject* parent = nullptr ) : + explicit UserProcess(const std::function& modifier, QObject* parent = nullptr) : QProcess( parent ), - m_uid( uid ), - m_gid( gid ) + m_modifier(modifier) { } void setupChildProcess() override { - if( setgroups( 0, nullptr ) != 0 ) - { - qFatal( "Could not drop all supplementary groups for child process!" ); - } - if( setgid( m_gid ) != 0 ) - { - qFatal( "Could not set GID for child process!" ); - } - if( setuid( m_uid ) != 0 ) - { - qFatal( "Could not set UID for child process!" ); - } + m_modifier(); } private: - const uid_t m_uid; - const uid_t m_gid; + const std::function& m_modifier; }; - auto process = new UserProcess( uid, gid ); + auto process = new UserProcess(adjustChildProcessPrivileges); #endif QObject::connect( process, QOverload::of( &QProcess::finished ), &QProcess::deleteLater ); From d56055a81331144de961aed684821356a598c3fd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 14:23:09 +0200 Subject: [PATCH 1421/1765] LinuxCoreFunctions: only exit if set* fails as root Calling setgroups()/setgid()/setuid() as non-root may fail but don't exit through qFatal() since privileges are lowered already. --- plugins/platform/linux/LinuxCoreFunctions.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index a1903cba3..d75fe50e3 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -243,15 +243,16 @@ bool LinuxCoreFunctions::runProgramAsUser( const QString& program, const QString const auto adjustChildProcessPrivileges = [uid, gid]() { - if( setgroups(0, nullptr) != 0 ) + const auto isRoot = getuid() == 0 || geteuid() == 0; + if (setgroups(0, nullptr) != 0 && isRoot) { qFatal( "Could not drop all supplementary groups for child process!" ); } - if( setgid( gid ) != 0 ) + if (setgid(gid) != 0 && isRoot) { qFatal( "Could not set GID for child process!" ); } - if( setuid( uid ) != 0 ) + if (setuid(uid) != 0 && isRoot) { qFatal( "Could not set UID for child process!" ); } From 2d35a1c764387e9bab3cca837b9a979ae2980191 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 14:24:46 +0200 Subject: [PATCH 1422/1765] FeatureWorkerManager: add log message --- core/src/FeatureWorkerManager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index 32ad9958c..17c983a6f 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -141,6 +141,7 @@ bool FeatureWorkerManager::startUnmanagedSessionWorker( Feature::Uid featureUid VeyonCore::platform().coreFunctions().activeDesktopName() ); if( ret == false ) { + vWarning() << "failed to start worker for feature" << featureUid; return false; } From 698dcb3456070cce228a938ce7e432fdb21bc179 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 14:35:21 +0200 Subject: [PATCH 1423/1765] SystemTrayIcon: only load overlay icon with valid URL --- core/src/SystemTrayIcon.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index 770bc38c4..fae015990 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -169,7 +169,12 @@ void SystemTrayIcon::updateIcon(const QString& overlayIconUrl) { if (m_systemTrayIcon) { - QImage overlayIcon(overlayIconUrl); + QImage overlayIcon; + if (overlayIconUrl.isEmpty() == false) + { + overlayIcon.load(overlayIconUrl); + } + QIcon icon; for(auto size : {16, 22, 32, 64}) From 2699208ca0c043e3f1c0860a3daf1a47347af718 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 14:47:07 +0200 Subject: [PATCH 1424/1765] SystemTrayIcon: use temporary worker only if hidden If the tray icon is hidden, don't run a worker process all the time. Instead launch one temporarily only for displaying message boxes. --- core/src/SystemTrayIcon.cpp | 25 ++++++++++++++++--------- core/src/SystemTrayIcon.h | 5 +++-- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index fae015990..475391e95 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -41,8 +42,7 @@ SystemTrayIcon::SystemTrayIcon( QObject* parent ) : Feature::Uid( "8e997d84-ebb9-430f-8f72-d45d9821963d" ), Feature::Uid(), tr( "System tray icon"), {}, {} ) ), - m_features( { m_systemTrayIconFeature } ), - m_systemTrayIcon( nullptr ) + m_hidden(VeyonCore::config().isTrayIconHidden()) { } @@ -51,10 +51,13 @@ SystemTrayIcon::SystemTrayIcon( QObject* parent ) : void SystemTrayIcon::setToolTip( const QString& toolTipText, FeatureWorkerManager& featureWorkerManager ) { - FeatureMessage featureMessage( m_systemTrayIconFeature.uid(), SetToolTipCommand ); - featureMessage.addArgument( Argument::ToolTipText, toolTipText ); + if (m_hidden == false) + { + FeatureMessage featureMessage(m_systemTrayIconFeature.uid(), SetToolTipCommand); + featureMessage.addArgument(Argument::ToolTipText, toolTipText); - featureWorkerManager.sendMessageToUnmanagedSessionWorker( featureMessage ); + featureWorkerManager.sendMessageToUnmanagedSessionWorker(featureMessage); + } } @@ -86,9 +89,12 @@ void SystemTrayIcon::showMessage(const ComputerControlInterfaceList &computerCon void SystemTrayIcon::setOverlay(const ComputerControlInterfaceList& computerControlInterfaces, const QString &iconUrl) { - sendFeatureMessage(FeatureMessage{m_systemTrayIconFeature.uid(), SetOverlayIcon} - .addArgument(Argument::OverlayIconUrl, iconUrl), - computerControlInterfaces); + if (m_hidden == false) + { + sendFeatureMessage(FeatureMessage{m_systemTrayIconFeature.uid(), SetOverlayIcon} + .addArgument(Argument::OverlayIconUrl, iconUrl), + computerControlInterfaces); + } } @@ -120,7 +126,7 @@ bool SystemTrayIcon::handleFeatureMessage( VeyonWorkerInterface& worker, const F return false; } - if( m_systemTrayIcon == nullptr && VeyonCore::config().isTrayIconHidden() == false ) + if (m_systemTrayIcon == nullptr && m_hidden == false) { m_systemTrayIcon = new QSystemTrayIcon( this ); @@ -149,6 +155,7 @@ bool SystemTrayIcon::handleFeatureMessage( VeyonWorkerInterface& worker, const F QMessageBox::information( nullptr, message.argument( Argument::MessageTitle ).toString(), message.argument( Argument::MessageText ).toString() ); + QCoreApplication::instance()->quit(); } return true; diff --git a/core/src/SystemTrayIcon.h b/core/src/SystemTrayIcon.h index 1feb9c5b0..dd64aafae 100644 --- a/core/src/SystemTrayIcon.h +++ b/core/src/SystemTrayIcon.h @@ -125,8 +125,9 @@ class VEYON_CORE_EXPORT SystemTrayIcon : public QObject, public FeatureProviderI }; const Feature m_systemTrayIconFeature; - const FeatureList m_features; + const FeatureList m_features = {m_systemTrayIconFeature}; - QSystemTrayIcon* m_systemTrayIcon; + QSystemTrayIcon* m_systemTrayIcon = nullptr; + bool m_hidden = false; }; From 65b1617799f475dae81174da31bb7b1665d277ac Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 20:25:39 +0200 Subject: [PATCH 1425/1765] LogoffEventFilter: add nullptr check --- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp index fc26d3816..777498b1e 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp @@ -57,6 +57,11 @@ bool LogoffEventFilter::nativeEventFilter(const QByteArray& eventType, void* mes Q_UNUSED(eventType) Q_UNUSED(result) + if (!message) + { + return false; + } + const auto winMsg = reinterpret_cast( message )->message; if( winMsg == WM_QUERYENDSESSION ) From 112bdff916e2b6733d7b73856e55bb5fc31be713 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 20:26:00 +0200 Subject: [PATCH 1426/1765] LogoffEventFilter: react to WM_ENDSESSION messages We must not shutdown on WM_QUERYENDSESSION messages already but wait until a WM_ENDSESSION message is received. --- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp index 777498b1e..e7758e78d 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp @@ -64,9 +64,9 @@ bool LogoffEventFilter::nativeEventFilter(const QByteArray& eventType, void* mes const auto winMsg = reinterpret_cast( message )->message; - if( winMsg == WM_QUERYENDSESSION ) + if (winMsg == WM_ENDSESSION) { - vInfo() << "Got WM_QUERYENDSESSION - initiating server shutdown"; + vInfo() << "Got WM_ENDSESSION - initiating server shutdown"; // tell UltraVNC server to quit SetEvent( m_shutdownEventHandle ); From 65b83baa7ab26f399d802de04748c3c9008917d1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 20:45:15 +0200 Subject: [PATCH 1427/1765] WindowsServiceCore: only wait for server after terminating it --- plugins/platform/windows/WindowsServiceCore.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index dc47c0ba6..ca4ec18dc 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -77,11 +77,10 @@ class VeyonServerProcess { vWarning() << "Terminating server"; TerminateProcess( m_subProcessHandle, 0 ); + WaitForSingleObject(m_subProcessHandle, ServerWaitTime); } CloseHandle( m_subProcessHandle ); m_subProcessHandle = nullptr; - - Sleep( ServerPostStopWaitTime ); } } @@ -100,7 +99,6 @@ class VeyonServerProcess private: static constexpr auto ServerQueryTime = 100; static constexpr auto ServerWaitTime = 5000; - static constexpr auto ServerPostStopWaitTime = 1000; HANDLE m_subProcessHandle{nullptr}; From bb98c0c0b3cb8dfabe6fc42b9ae4ae7e0de1f8de Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 20:46:43 +0200 Subject: [PATCH 1428/1765] WindowsServiceCore: adjust server timeout/query interval --- plugins/platform/windows/WindowsServiceCore.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index ca4ec18dc..250a49ff9 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -97,8 +97,8 @@ class VeyonServerProcess private: - static constexpr auto ServerQueryTime = 100; - static constexpr auto ServerWaitTime = 5000; + static constexpr auto ServerQueryTime = 10; + static constexpr auto ServerWaitTime = 3000; HANDLE m_subProcessHandle{nullptr}; From 09e5783c8537bcdb34b990d7cd9216ff41e56281 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Aug 2022 21:29:34 +0200 Subject: [PATCH 1429/1765] WindowsServiceCore: wait for session change events This also allows to increase SessionPollingInterval such that we effectively react to service control events only. --- .../platform/windows/WindowsServiceCore.cpp | 43 +++++++++++++------ plugins/platform/windows/WindowsServiceCore.h | 7 +-- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index 250a49ff9..4775dc888 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -185,8 +185,7 @@ void WindowsServiceCore::manageServersForAllSessions() const auto activeSessionOnly = m_sessionManager.mode() == PlatformSessionManager::Mode::Active; - while (WaitForSingleObject(m_stopServiceEvent, SessionPollingInterval) == WAIT_TIMEOUT && - m_serviceShutdownPending == 0) + do { auto wtsSessionIds = WtsSessionManager::activeSessions(); @@ -240,7 +239,11 @@ void WindowsServiceCore::manageServersForAllSessions() serverProcesses[wtsSessionId] = serverProcess; } } - } + + std::array events{m_sessionChangeEvent, m_stopServiceEvent}; + WaitForMultipleObjects(events.size(), events.data(), FALSE, SessionPollingInterval); + + } while (m_serviceStopRequested == 0); vInfo() << "Service shutdown"; @@ -259,10 +262,8 @@ void WindowsServiceCore::manageServerForConsoleSession() QElapsedTimer lastServerStart; - while (WaitForSingleObject(m_stopServiceEvent, SessionPollingInterval) == WAIT_TIMEOUT && - m_serviceShutdownPending == 0) - { - const auto sessionChanged = m_sessionChangeEvent.testAndSetOrdered( 1, 0 ); + do { + const auto sessionChanged = m_sessionChanged.testAndSetOrdered(1, 0); const auto wtsSessionId = WtsSessionManager::activeConsoleSession(); if( oldWtsSessionId != wtsSessionId || sessionChanged ) @@ -284,7 +285,8 @@ void WindowsServiceCore::manageServerForConsoleSession() if( wtsSessionId != WtsSessionManager::InvalidSession || sessionChanged ) { veyonServerProcess.stop(); - if (m_serviceShutdownPending == 0) + if (m_serviceStopRequested == 0 && + wtsSessionId != WtsSessionManager::InvalidSession) { veyonServerProcess.start( wtsSessionId, m_dataManager.token() ); lastServerStart.restart(); @@ -293,13 +295,21 @@ void WindowsServiceCore::manageServerForConsoleSession() oldWtsSessionId = wtsSessionId; } - else if( veyonServerProcess.isRunning() == false ) + else if (veyonServerProcess.isRunning() == false) { - veyonServerProcess.start( wtsSessionId, m_dataManager.token() ); + if (wtsSessionId != WtsSessionManager::InvalidSession) + { + veyonServerProcess.start( wtsSessionId, m_dataManager.token() ); + lastServerStart.restart(); + } + oldWtsSessionId = wtsSessionId; - lastServerStart.restart(); } - } + + std::array events{m_sessionChangeEvent, m_stopServiceEvent}; + WaitForMultipleObjects(events.size(), events.data(), FALSE, SessionPollingInterval); + + } while (m_serviceStopRequested == 0); vInfo() << "Service shutdown"; @@ -349,6 +359,7 @@ void WindowsServiceCore::serviceMain() } m_stopServiceEvent = CreateEvent( nullptr, false, false, nullptr ); + m_sessionChangeEvent = CreateEvent(nullptr, false, false, nullptr); if( reportStatus( SERVICE_RUNNING, NO_ERROR, 0 ) == false ) { @@ -361,6 +372,7 @@ void WindowsServiceCore::serviceMain() m_serviceEntryPoint(); + CloseHandle(m_sessionChangeEvent); CloseHandle( m_stopServiceEvent ); sasEventListener.stop(); @@ -413,7 +425,7 @@ DWORD WindowsServiceCore::serviceCtrl( DWORD ctrlCode, DWORD eventType, LPVOID e case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: m_status.dwCurrentState = SERVICE_STOP_PENDING; - m_serviceShutdownPending = 1; + m_serviceStopRequested = 1; SetEvent( m_stopServiceEvent ); break; @@ -432,9 +444,12 @@ DWORD WindowsServiceCore::serviceCtrl( DWORD ctrlCode, DWORD eventType, LPVOID e { case WTS_SESSION_LOGON: case WTS_SESSION_LOGOFF: + case WTS_CONSOLE_CONNECT: + case WTS_CONSOLE_DISCONNECT: case WTS_REMOTE_CONNECT: case WTS_REMOTE_DISCONNECT: - m_sessionChangeEvent = 1; + m_sessionChanged = 1; + SetEvent(m_sessionChangeEvent); break; } break; diff --git a/plugins/platform/windows/WindowsServiceCore.h b/plugins/platform/windows/WindowsServiceCore.h index 744e7b87d..c4122fc89 100644 --- a/plugins/platform/windows/WindowsServiceCore.h +++ b/plugins/platform/windows/WindowsServiceCore.h @@ -59,15 +59,16 @@ class WindowsServiceCore static WindowsServiceCore* s_instance; SERVICE_STATUS m_status{}; SERVICE_STATUS_HANDLE m_statusHandle{nullptr}; + HANDLE m_sessionChangeEvent{nullptr}; HANDLE m_stopServiceEvent{nullptr}; HANDLE m_serverShutdownEvent{nullptr}; - QAtomicInt m_serviceShutdownPending{0}; - QAtomicInt m_sessionChangeEvent{0}; + QAtomicInt m_serviceStopRequested{0}; + QAtomicInt m_sessionChanged{0}; ServiceDataManager m_dataManager{}; PlatformSessionManager m_sessionManager{}; - static constexpr auto SessionPollingInterval = 100; + static constexpr auto SessionPollingInterval = 5000; static constexpr auto MinimumServerUptimeTime = 10000; static constexpr auto ServiceStartTimeout = 15000; From 7b4258eef5e8dea0ce871d14232091a89cc7b222 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 22 Sep 2022 10:29:22 +0200 Subject: [PATCH 1430/1765] VncClientProtocol: adjust endianess for pixel format members --- core/src/VncClientProtocol.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index f2aef28f2..77e190907 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -391,6 +391,10 @@ bool VncClientProtocol::receiveServerInitMessage() memcpy( &m_pixelFormat, &message.format, sz_rfbPixelFormat ); // Flawfinder: ignore + m_pixelFormat.redMax = qFromBigEndian(m_pixelFormat.redMax); + m_pixelFormat.greenMax = qFromBigEndian(m_pixelFormat.greenMax); + m_pixelFormat.blueMax = qFromBigEndian(m_pixelFormat.blueMax); + if( static_cast( m_socket->peek( nameLength ).size() ) == nameLength ) { m_serverInitMessage = m_socket->read( sz_rfbServerInitMsg + nameLength ); From 0b297d7ccdd87929a6091409a2ce97d4bdee006a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 22 Sep 2022 10:30:22 +0200 Subject: [PATCH 1431/1765] VncClientProtocol: add Tight encoding support VncClientProtocol now is able to handle Tight-encoded rectangles as well, which allows us to use this efficient encoding for the demo feature in the future. --- core/src/VncClientProtocol.cpp | 144 +++++++++++++++++++++++++++++++++ core/src/VncClientProtocol.h | 2 + 2 files changed, 146 insertions(+) diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 77e190907..05c318d76 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -605,6 +605,9 @@ bool VncClientProtocol::handleRect( QBuffer& buffer, rfbFramebufferUpdateRectHea case rfbEncodingZYWRLE: return handleRectEncodingZRLE( buffer ); + case rfbEncodingTight: + return handleRectEncodingTight(buffer, rectHeader); + case rfbEncodingExtDesktopSize: return handleRectEncodingExtDesktopSize(buffer); @@ -782,6 +785,147 @@ bool VncClientProtocol::handleRectEncodingZRLE(QBuffer &buffer) +bool VncClientProtocol::handleRectEncodingTight(QBuffer& buffer, + const rfbFramebufferUpdateRectHeader rectHeader) +{ + static const auto readCompactLength = [](QBuffer& buffer) -> int64_t + { + int64_t len; + uint8_t b; + + if (buffer.read(reinterpret_cast(&b), 1 ) != 1) + { + return -1; + } + + len = int(b) & 0x7f; + + if (b & 0x80) + { + if (buffer.read(reinterpret_cast(&b), 1) != 1) + { + return -1; + } + + len |= (int(b) & 0x7f) << 7; + + if (b & 0x80) + { + if (buffer.read(reinterpret_cast(&b), 1) != 1) + { + return -1; + } + + len |= (int(b) & 0xff) << 14; + } + } + + return len; + }; + + auto bitsPerPixel = m_pixelFormat.bitsPerPixel; + if (bitsPerPixel == 32 && + m_pixelFormat.depth == 24 && + m_pixelFormat.redMax == 255 && + m_pixelFormat.greenMax == 255 && + m_pixelFormat.blueMax == 255) + { + bitsPerPixel = 24; + } + + const auto bytesPerPixel = bitsPerPixel / 8; + + uint8_t compCtl = 255; + if (buffer.read(reinterpret_cast(&compCtl), 1) != 1) + { + return false; + } + + compCtl >>= 4; // ignore compression stream reset bits + + if ((compCtl & rfbTightNoZlib) == rfbTightNoZlib) + { + compCtl &= ~(rfbTightNoZlib); + } + + if (compCtl == rfbTightFill) + { + return buffer.read(bytesPerPixel).size() == bytesPerPixel; + } + + if (compCtl == rfbTightJpeg) + { + const auto dataLength = readCompactLength(buffer); + return buffer.read(dataLength).size() == dataLength; + } + + if (compCtl > rfbTightMaxSubencoding) + { + vWarning() << "bad subencoding value received"; + return false; + } + + if (compCtl & rfbTightExplicitFilter) + { + uint8_t filterId = 0; + if (buffer.read(reinterpret_cast(&filterId), 1) != 1) + { + return false; + } + + switch (filterId) + { + case rfbTightFilterCopy: + break; + case rfbTightFilterPalette: + { + uint8_t numColors; + if (buffer.read(reinterpret_cast(&numColors), 1) != 1) + { + return false; + } + const auto tightRectColors = numColors + 1; + if (tightRectColors < 2) + { + return false; + } + const auto rectBytes = tightRectColors * bytesPerPixel; + if (buffer.read(rectBytes).size() != rectBytes) + { + return false; + } + bitsPerPixel = tightRectColors == 2 ? 1 : 8; + break; + } + case rfbTightFilterGradient: + break; + default: + vWarning() << "invalid filter ID"; + return false; + } + } + + const int MaximumUncompressedSize = 12; + + const int rowSize = (rectHeader.r.w * bitsPerPixel + 7) / 8; + const int uncompressedRectSize = rectHeader.r.h * rowSize; + if (uncompressedRectSize < MaximumUncompressedSize) + { + return buffer.read(uncompressedRectSize).size() == uncompressedRectSize; + } + + const auto compressedLength = readCompactLength(buffer); + if (compressedLength <= 0) + { + vWarning() << "bad compressed length received"; + return false; + } + + return buffer.read(compressedLength).size() == compressedLength; +} + + + bool VncClientProtocol::handleRectEncodingExtDesktopSize(QBuffer& buffer) { rfbExtDesktopSizeMsg extDesktopSizeMsg; diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index 4d4c256e1..0e94141c8 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -129,6 +129,8 @@ class VEYON_CORE_EXPORT VncClientProtocol uint bytesPerPixel ); bool handleRectEncodingZlib( QBuffer& buffer ); bool handleRectEncodingZRLE( QBuffer& buffer ); + bool handleRectEncodingTight(QBuffer& buffer, + const rfbFramebufferUpdateRectHeader rectHeader); bool handleRectEncodingExtDesktopSize(QBuffer& buffer); static bool isPseudoEncoding( rfbFramebufferUpdateRectHeader header ); From f2a163ee306cb0b1c8f552366796b334fcfd6ed2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 22 Sep 2022 14:36:02 +0200 Subject: [PATCH 1432/1765] VncConnection: refactor quality levels Introduce new quality levels and refactor the translation from quality levels to encoding settings. Tight encoding is now used for quality levels other than the highest. --- core/src/ComputerControlInterface.cpp | 1 - core/src/VncConnection.cpp | 57 ++++++++++++++++++--------- core/src/VncConnection.h | 17 ++------ core/src/VncConnectionConfiguration.h | 15 ++++++- core/src/VncViewWidget.cpp | 2 - 5 files changed, 57 insertions(+), 35 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 18147c55d..294e37d3e 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -83,7 +83,6 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up { vncConnection->setPort( m_port ); } - vncConnection->setQuality( VncConnection::Quality::Thumbnail ); vncConnection->setScaledSize( m_scaledFramebufferSize ); connect( vncConnection, &VncConnection::imageUpdated, this, [this]( int x, int y, int w, int h ) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index f21843f88..82e88025d 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -189,6 +189,19 @@ void VncConnection::setPort( int port ) +void VncConnection::setQuality(VncConnectionConfiguration::Quality quality) +{ + m_quality = quality; + + if (m_client) + { + updateEncodingSettingsFromQuality(); + enqueueEvent(new VncUpdateFormatAndEncodingsEvent); + } +} + + + void VncConnection::setUseRemoteCursor( bool enabled ) { m_useRemoteCursor = enabled; @@ -631,27 +644,10 @@ rfbBool VncConnection::initFrameBuffer( rfbClient* client ) client->format.greenMax = 0xff; client->format.blueMax = 0xff; - client->appData.encodingsString = "zrle ultra copyrect hextile zlib corre rre raw"; client->appData.useRemoteCursor = m_useRemoteCursor ? TRUE : FALSE; - client->appData.compressLevel = 0; client->appData.useBGR233 = false; - client->appData.qualityLevel = 9; - client->appData.enableJPEG = false; - switch( m_quality ) - { - case Quality::Screenshot: - // make sure to use lossless raw encoding - client->appData.encodingsString = "raw"; - break; - case Quality::Thumbnail: - client->appData.compressLevel = 9; - client->appData.qualityLevel = 5; - client->appData.enableJPEG = true; - break; - default: - break; - } + updateEncodingSettingsFromQuality(); m_framebufferState = FramebufferState::Initialized; @@ -674,6 +670,31 @@ void VncConnection::finishFrameBufferUpdate() +void VncConnection::updateEncodingSettingsFromQuality() +{ + m_client->appData.encodingsString = m_quality == VncConnectionConfiguration::Quality::Highest ? + "zrle ultra copyrect hextile zlib corre rre raw" : + "tight zywrle zrle ultra"; + + m_client->appData.compressLevel = 9; + + m_client->appData.qualityLevel = [this] { + switch(m_quality) + { + case VncConnectionConfiguration::Quality::Highest: return 9; + case VncConnectionConfiguration::Quality::High: return 7; + case VncConnectionConfiguration::Quality::Medium: return 5; + case VncConnectionConfiguration::Quality::Low: return 3; + case VncConnectionConfiguration::Quality::Lowest: return 0; + } + return 5; + }(); + + m_client->appData.enableJPEG = m_quality != VncConnectionConfiguration::Quality::Highest; +} + + + rfbBool VncConnection::updateCursorPosition( int x, int y ) { Q_EMIT cursorPosChanged( x, y ); diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index cdb6c5817..10772ba88 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -51,14 +51,6 @@ class VEYON_CORE_EXPORT VncConnection : public QThread { Q_OBJECT public: - enum class Quality - { - Thumbnail, - Screenshot, - RemoteControl, - Default - } ; - enum class FramebufferState { Invalid, @@ -107,10 +99,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread return m_host; } - void setQuality( Quality quality ) - { - m_quality = quality ; - } + void setQuality(VncConnectionConfiguration::Quality quality); void setUseRemoteCursor( bool enabled ); @@ -200,6 +189,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread rfbBool initFrameBuffer( rfbClient* client ); void finishFrameBufferUpdate(); + void updateEncodingSettingsFromQuality(); + rfbBool updateCursorPosition( int x, int y ); void updateCursorShape( rfbClient* client, int xh, int yh, int w, int h, int bpp ); void updateClipboard( const char *text, int textlen ); @@ -239,7 +230,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread // connection parameters and data rfbClient* m_client{nullptr}; - Quality m_quality{Quality::Default}; + VncConnectionConfiguration::Quality m_quality{VncConnectionConfiguration::Quality::High}; QString m_host{}; int m_port{-1}; int m_defaultPort{-1}; diff --git a/core/src/VncConnectionConfiguration.h b/core/src/VncConnectionConfiguration.h index 2aeeb7083..1e0ee3ae6 100644 --- a/core/src/VncConnectionConfiguration.h +++ b/core/src/VncConnectionConfiguration.h @@ -24,9 +24,22 @@ #pragma once -class VncConnectionConfiguration +#include "VeyonCore.h" + +class VEYON_CORE_EXPORT VncConnectionConfiguration { + Q_GADGET public: + enum class Quality + { + Highest, + High, + Medium, + Low, + Lowest + }; + Q_ENUM(Quality) + // intervals and timeouts static constexpr int DefaultThreadTerminationTimeout = 30000; static constexpr int DefaultConnectTimeout = 10000; diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index cea31fc73..f1c423f8b 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -45,8 +45,6 @@ VncViewWidget::VncViewWidget( const ComputerControlInterface::Pointer& computerC connect( connection(), &VncConnection::stateChanged, this, &VncViewWidget::updateConnectionState ); connect( &m_busyIndicatorTimer, &QTimer::timeout, this, QOverload<>::of(&QWidget::repaint) ); - connection()->setQuality( VncConnection::Quality::Default ); - // set up mouse border signal timer m_mouseBorderSignalTimer.setSingleShot( true ); m_mouseBorderSignalTimer.setInterval( MouseBorderSignalDelay ); From abf4a4d2ffec330d109c98b1220fe7ffc7997898 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 22 Sep 2022 14:36:26 +0200 Subject: [PATCH 1433/1765] VeyonConfiguration: make image quality configurable --- configurator/src/MasterConfigurationPage.ui | 185 ++++++++++++-------- core/src/VeyonConfigurationProperties.h | 1 + 2 files changed, 112 insertions(+), 74 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index d4f8e6767..6f4bd608c 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -76,88 +76,93 @@ User interface - - + + - Computer and user name + Auto - Only user name + 16:9 - Only computer name + 16:10 + + + + + 3:2 + + + + + 4:3 - - - - ms - - - 250 - - - 10000 - - - 250 - - - 1000 + + + + Thumbnail spacing - - + + - Sort order + Use modern user interface (experimental) - - - - - Auto - - - - - 16:9 - - + + - 16:10 + User and computer name - 3:2 + Only user name - 4:3 + Only computer name - - + + - Background color + Computer thumbnail caption + + + + + + + + + + Text color + + + + + + + Thumbnail aspect ratio - + px @@ -176,70 +181,101 @@ + + + + + Computer and user name + + + + + Only user name + + + + + Only computer name + + + + - - + + - Thumbnail aspect ratio + Thumbnail update interval - - + + - Computer thumbnail caption + Image quality - - - - Thumbnail spacing + + + + ms + + + 250 + + + 10000 + + + 250 + + + 1000 - - + + - Text color + Sort order - - - - - + + - User and computer name + Highest - Only user name + High - Only computer name + Medium + + + + + Low + + + + + Lowest - - - - Thumbnail update interval - - - - - + + - Use modern user interface (experimental) + Background color @@ -502,6 +538,7 @@ screenshotDirectory openUserConfigurationDirectory openScreenshotDirectory + computerMonitoringImageQuality computerMonitoringUpdateInterval computerMonitoringAspectRatio computerMonitoringBackgroundColor diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index fd8006286..b80834eb7 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -107,6 +107,7 @@ #define FOREACH_VEYON_MASTER_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, modernUserInterface, setModernUserInterface, "ModernUserInterface", "Master", false, Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), VncConnectionConfiguration::Quality, computerMonitoringImageQuality, setComputerMonitoringUpdateInterval, "ComputerMonitoringImageQuality", "Master", QVariant::fromValue(VncConnectionConfiguration::Quality::High), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringUpdateInterval, setComputerMonitoringUpdateInterval, "ComputerMonitoringUpdateInterval", "Master", 1000, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringThumbnailSpacing, setComputerMonitoringThumbnailSpacing, "ComputerMonitoringThumbnailSpacing", "Master", 5, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::DisplayRoleContent, computerDisplayRoleContent, setComputerDisplayRoleContent, "ComputerDisplayRoleContent", "Master", QVariant::fromValue(ComputerListModel::DisplayRoleContent::UserAndComputerName), Configuration::Property::Flag::Standard ) \ From 2389a9ea1215562832bcab3148d97cb73fbf41eb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 22 Sep 2022 11:08:18 +0200 Subject: [PATCH 1434/1765] ComputerControlInterface: honor image quality setting --- core/src/ComputerControlInterface.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 294e37d3e..6c3bb883b 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -83,6 +83,7 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up { vncConnection->setPort( m_port ); } + vncConnection->setQuality(VeyonCore::config().computerMonitoringImageQuality()); vncConnection->setScaledSize( m_scaledFramebufferSize ); connect( vncConnection, &VncConnection::imageUpdated, this, [this]( int x, int y, int w, int h ) From 158caa1432bf339aaef3facb3dbff6cf4cf2378f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 22 Sep 2022 14:06:43 +0200 Subject: [PATCH 1435/1765] DemoServer: fix default depth Otherwise tight encoding does not work properly. --- plugins/demo/DemoServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 0c275d52d..6f272b990 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -309,7 +309,7 @@ bool DemoServer::setVncServerPixelFormat() rfbPixelFormat format; format.bitsPerPixel = 32; - format.depth = 32; + format.depth = 24; format.bigEndian = qFromBigEndian( 1 ) == 1 ? true : false; format.trueColour = 1; format.redShift = 16; From 37011a580b66b85f93ecc40530d8917000897374 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 22 Sep 2022 14:08:35 +0200 Subject: [PATCH 1436/1765] Demo: implement bandwidth agnostic quality control Now that tight encoding with variable image quality is supported, we can change the quality dynamically depending on the consumed bandwidth and the configured bandwidth limit. The default limit is 100 MB/s which equals a regular Gigabit network. For networks with lower available bandwidth (e.g. wireless networks), the limit can be adjusted in the Demo server configuration tab in advanced view. Closes #484 and #749. --- plugins/demo/DemoConfiguration.h | 1 + plugins/demo/DemoConfigurationPage.ui | 73 ++++++++++++++++++--------- plugins/demo/DemoServer.cpp | 41 ++++++++++++--- plugins/demo/DemoServer.h | 7 ++- 4 files changed, 91 insertions(+), 31 deletions(-) diff --git a/plugins/demo/DemoConfiguration.h b/plugins/demo/DemoConfiguration.h index 9f3f72479..7bfb91030 100644 --- a/plugins/demo/DemoConfiguration.h +++ b/plugins/demo/DemoConfiguration.h @@ -29,6 +29,7 @@ #define FOREACH_DEMO_CONFIG_PROPERTY(OP) \ OP( DemoConfiguration, m_configuration, bool, slowDownThumbnailUpdates, setSlowDownThumbnailUpdates, "SlowDownThumbnailUpdates", "Demo", true, Configuration::Property::Flag::Advanced ) \ + OP( DemoConfiguration, m_configuration, int, bandwidthLimit, setBandwidthLimit, "BandwidthLimit", "Demo", 100, Configuration::Property::Flag::Advanced ) \ OP( DemoConfiguration, m_configuration, int, framebufferUpdateInterval, setFramebufferUpdateInterval, "FramebufferUpdateInterval", "Demo", 100, Configuration::Property::Flag::Advanced ) \ OP( DemoConfiguration, m_configuration, int, keyFrameInterval, setKeyFrameInterval, "KeyFrameInterval", "Demo", 10, Configuration::Property::Flag::Advanced ) \ OP( DemoConfiguration, m_configuration, int, memoryLimit, setMemoryLimit, "MemoryLimit", "Demo", 128, Configuration::Property::Flag::Advanced ) \ diff --git a/plugins/demo/DemoConfigurationPage.ui b/plugins/demo/DemoConfigurationPage.ui index d97fd46ea..2aa71d49e 100644 --- a/plugins/demo/DemoConfigurationPage.ui +++ b/plugins/demo/DemoConfigurationPage.ui @@ -22,17 +22,26 @@ Tunables - - - - Update interval + + + + s + + + 1 + + + 30 + + + 10 - - + + - Slow down thumbnail updates while demo is running + Update interval @@ -55,22 +64,6 @@ - - - - s - - - 1 - - - 30 - - - 10 - - - @@ -90,6 +83,13 @@ + + + + Slow down thumbnail updates while demo is running + + + @@ -104,6 +104,26 @@ + + + + Bandwidth limit + + + + + + + MB/s + + + 1 + + + 1000 + + + @@ -122,6 +142,13 @@ + + slowDownThumbnailUpdates + framebufferUpdateInterval + keyFrameInterval + memoryLimit + bandwidthLimit + diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 6f272b990..414377202 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -30,7 +30,6 @@ #include "DemoConfiguration.h" #include "DemoServer.h" #include "DemoServerConnection.h" -#include "VeyonConfiguration.h" #include "VncClientProtocol.h" @@ -43,7 +42,8 @@ DemoServer::DemoServer( int vncServerPort, const Password& vncServerPassword, co m_keyFrameInterval( m_configuration.keyFrameInterval() * 1000 ), m_vncServerPort( vncServerPort ), m_vncServerSocket( new QTcpSocket( this ) ), - m_vncClientProtocol( new VncClientProtocol( m_vncServerSocket, vncServerPassword ) ) + m_vncClientProtocol(new VncClientProtocol(m_vncServerSocket, vncServerPassword)), + m_bandwidthLimit(qMax(1, m_configuration.bandwidthLimit()) * 1024) { connect( m_vncServerSocket, &QTcpSocket::readyRead, this, &DemoServer::readFromVncServer ); connect( m_vncServerSocket, &QTcpSocket::disconnected, this, &DemoServer::reconnectToVncServer ); @@ -246,9 +246,32 @@ void DemoServer::enqueueFramebufferUpdateMessage( const QByteArray& message ) if( m_keyFrameTimer.elapsed() > 1 ) { const auto memTotal = queueSize / 1024; + const auto bandwidth = (memTotal * 1000) / m_keyFrameTimer.elapsed(); + const auto clientCount = qMin(1, findChildren().count()); + const auto totalBandwidth = bandwidth * clientCount; + + auto newQuality = m_quality; + if (totalBandwidth > m_bandwidthLimit) + { + newQuality = qMax(int(MinimumQuality), + m_quality - qMax(1, int(totalBandwidth / m_bandwidthLimit))); + } + else if (totalBandwidth < m_bandwidthLimit * 4 / 5) + { + newQuality = qMin(int(MaximumQuality), + m_quality + qMax(1, int(m_bandwidthLimit / totalBandwidth))); + } + + if (newQuality != m_quality) + { + setVncServerEncodings(newQuality); + } + vDebug() << "message count:" << m_framebufferUpdateMessages.size() << "queue size (KB):" << memTotal - << "throughput (KB/s):" << ( memTotal * 1000 ) / m_keyFrameTimer.elapsed(); + << "total bandwidth (KB/s):" << totalBandwidth << "of" << m_bandwidthLimit + << "bandwidth per client (KB/s):" << bandwidth + << "quality" << m_quality; } m_keyFrameTimer.restart(); ++m_keyFrame; @@ -289,7 +312,7 @@ void DemoServer::start() vDebug(); setVncServerPixelFormat(); - setVncServerEncodings(); + setVncServerEncodings(DefaultQuality); m_requestFullFramebufferUpdate = true; @@ -326,11 +349,15 @@ bool DemoServer::setVncServerPixelFormat() -bool DemoServer::setVncServerEncodings() +bool DemoServer::setVncServerEncodings(int quality) { + m_quality = quality; + return m_vncClientProtocol-> setEncodings( { - rfbEncodingUltraZip, + rfbEncodingTight, + rfbEncodingZYWRLE, + rfbEncodingZRLE, rfbEncodingUltra, rfbEncodingCopyRect, rfbEncodingHextile, @@ -338,7 +365,7 @@ bool DemoServer::setVncServerEncodings() rfbEncodingRRE, rfbEncodingRaw, rfbEncodingCompressLevel9, - rfbEncodingQualityLevel7, + rfbEncodingQualityLevel0 + quality, rfbEncodingNewFBSize, rfbEncodingLastRect } ); diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index 945372e9f..ca11532ca 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -89,10 +89,13 @@ class DemoServer : public QTcpServer void start(); bool setVncServerPixelFormat(); - bool setVncServerEncodings(); + bool setVncServerEncodings(int quality); static constexpr auto ConnectionThreadWaitTime = 5000; static constexpr auto TerminateRetryInterval = 1000; + static constexpr auto MinimumQuality = 0; + static constexpr auto DefaultQuality = 6; + static constexpr auto MaximumQuality = 9; const DemoAuthentication& m_authentication; const DemoConfiguration& m_configuration; @@ -112,5 +115,7 @@ class DemoServer : public QTcpServer int m_keyFrame{0}; MessageList m_framebufferUpdateMessages{}; + int m_quality = DefaultQuality; + int m_bandwidthLimit; } ; From 485184773bd041bfd59f50815c21f15fb04f39be Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 13 Oct 2022 12:54:34 +0200 Subject: [PATCH 1437/1765] README.md: add section on how to help with translating Closes #845. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 0df02e01d..85780d999 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,9 @@ If you are interested in Veyon, its programming, artwork, testing or something l Before starting the implementation of a new feature, please always open an issue at https://github.com/veyon/veyon/issues to start a discussion about your intended implementation. There may be different ideas, improvements, hints or maybe an already ongoing work on this feature. +## Join translation team + +Veyon and its documentation are translated at the Transifex platform. Please go to https://www.transifex.com/veyon-solutions/veyon and join the corresponding translation team. Please DO NOT submit pull requests for modified translation files since this would require manual Transifex synchronizations on our side. ## More information From 9e648b18e973f33b547c6e3d19b5d15b43381656 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 21 Nov 2022 11:00:03 +0100 Subject: [PATCH 1438/1765] LinuxCoreFunctions: add support for libproc2 Based on work by Craig Small as of https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1024225 --- plugins/platform/linux/CMakeLists.txt | 13 +++++- plugins/platform/linux/LinuxCoreFunctions.cpp | 43 +++++++++++++++++++ plugins/platform/linux/LinuxCoreFunctions.h | 9 ++++ plugins/platform/linux/LinuxServerProcess.cpp | 15 +++++++ .../platform/linux/LinuxSessionFunctions.cpp | 29 +++++++++++++ 5 files changed, 108 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index 213dee746..64f295bd7 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -2,7 +2,18 @@ add_subdirectory(auth-helper) find_package(X11 REQUIRED) find_package(PkgConfig QUIET) -pkg_check_modules(procps REQUIRED libprocps) +pkg_check_modules(procps libproc2) +if(procps_FOUND) + add_definitions(-DHAVE_LIBPROC2) +else() + pkg_check_modules(procps libprocps) + if(procps_FOUND) + add_definitions(-DHAVE_LIBPROCPS) + else() + message(FATAL_ERROR "libproc2/libprocps not found") + endif() +endif() + pkg_check_modules(fakekey libfakekey) include(BuildVeyonPlugin) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index d75fe50e3..5bef935e8 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -33,7 +33,9 @@ #include #include +#ifdef HAVE_LIBPROCPS #include +#endif #include "LinuxCoreFunctions.h" #include "LinuxDesktopIntegration.h" @@ -437,6 +439,7 @@ void LinuxCoreFunctions::restartDisplayManagers() +#ifdef HAVE_LIBPROCPS void LinuxCoreFunctions::forEachChildProcess( const std::function& visitor, int parentPid, int flags, bool visitParent ) { @@ -466,7 +469,47 @@ void LinuxCoreFunctions::forEachChildProcess( const std::function closeproc( proc ); } +#elif defined(HAVE_LIBPROC2) +void LinuxCoreFunctions::forEachChildProcess(const std::function& visitor, + int parentPid, const std::vector& items, bool visitParent) +{ + QProcessEnvironment sessionEnv; + + pids_info* info = nullptr; + pids_stack* stack; + QList ppids; + + std::vector allItems{PIDS_ID_PID, PIDS_ID_PPID}; + static constexpr auto PidItemIndex = 0; + static constexpr auto PPidItemIndex = 1; + + allItems.insert(allItems.end(), items.cbegin(), items.cend()); + + if (procps_pids_new(&info, allItems.data(), allItems.size()) < 0) + { + return; + } + + while ((stack = procps_pids_get(info, PIDS_FETCH_TASKS_ONLY))) + { + const auto ppid = PIDS_VAL(PPidItemIndex, s_int, stack, info); + if (ppid == parentPid) + { + if (visitParent == false || visitor(stack, info)) + { + ppids.append(PIDS_VAL(PidItemIndex, s_int, stack, info)); + } + } + else if (ppids.contains(ppid) && visitor(stack, info)) + { + ppids.append(PIDS_VAL(PidItemIndex, s_int, stack, info)); + } + } + + procps_pids_unref(&info); +} +#endif bool LinuxCoreFunctions::waitForProcess( qint64 pid, int timeout, int sleepInterval ) diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index 72d0abfcd..ddc827826 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -29,7 +29,11 @@ #include "PlatformCoreFunctions.h" +#ifdef HAVE_LIBPROC2 +#include +#else struct proc_t; +#endif // clazy:excludeall=copyable-polymorphic @@ -80,8 +84,13 @@ class LinuxCoreFunctions : public PlatformCoreFunctions static void restartDisplayManagers(); +#ifdef HAVE_LIBPROC2 + static void forEachChildProcess(const std::function& visitor, + int parentPid, const std::vector& items, bool visitParent); +#else static void forEachChildProcess( const std::function& visitor, int parentPid, int flags, bool visitParent ); +#endif static bool waitForProcess( qint64 pid, int timeout, int sleepInterval ); diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index a7506e762..125fcf54e 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -86,6 +86,7 @@ void LinuxServerProcess::stop() const auto sendSignalRecursively = []( pid_t pid, int sig ) { if( pid > 0 ) { +#ifdef HAVE_LIBPROCPS LinuxCoreFunctions::forEachChildProcess( [=]( proc_t* procInfo ) { if( procInfo->tid > 0 && ::kill( procInfo->tid, sig ) < 0 && errno != ESRCH ) @@ -95,6 +96,20 @@ void LinuxServerProcess::stop() return true; }, pid, 0, true ); +#elif defined(HAVE_LIBPROC2) + LinuxCoreFunctions::forEachChildProcess([=](const pids_stack* stack, const pids_info* info) + { + Q_UNUSED(info) + const pid_t tid = PIDS_VAL(0, s_int, stack, info); + if (tid > 0 && ::kill(tid, sig) < 0 && errno != ESRCH) + { + vCritical() << "kill() failed with" << errno; + } + return true; + }, + pid, + {}, true); +#endif if( ::kill( pid, sig ) < 0 && errno != ESRCH ) { diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index ad51a0847..d9b13de27 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -26,7 +26,9 @@ #include #include +#ifdef HAVE_LIBPROCPS #include +#endif #include "LinuxCoreFunctions.h" #include "LinuxSessionFunctions.h" @@ -294,6 +296,7 @@ QProcessEnvironment LinuxSessionFunctions::getSessionEnvironment( int sessionLea { QProcessEnvironment sessionEnv; +#ifdef HAVE_LIBPROCPS LinuxCoreFunctions::forEachChildProcess( [&sessionEnv]( proc_t* procInfo ) { if( procInfo->environ != nullptr ) @@ -314,6 +317,32 @@ QProcessEnvironment LinuxSessionFunctions::getSessionEnvironment( int sessionLea return false; }, sessionLeaderPid, PROC_FILLENV, true ); +#elif defined(HAVE_LIBPROC2) + LinuxCoreFunctions::forEachChildProcess([&sessionEnv](const pids_stack* stack, const pids_info* info) + { + Q_UNUSED(info) + static constexpr auto EnvironItemIndex = 2; + const auto environ = PIDS_VAL(EnvironItemIndex, strv, stack, info); + + if (environ != nullptr) + { + for (int i = 0; environ[i]; ++i) + { + const auto env = QString::fromUtf8(environ[i]); + const auto separatorPos = env.indexOf(QLatin1Char('=')); + if (separatorPos > 0) + { + sessionEnv.insert(env.left(separatorPos), env.mid(separatorPos+1)); + } + } + + return true; + } + + return false; + }, + sessionLeaderPid, {PIDS_ENVIRON_V}, true); +#endif return sessionEnv; } From b8b98ff5048758a5e51761b207dc1aacb88d6e70 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Jan 2023 16:28:01 +0100 Subject: [PATCH 1439/1765] LDAP: relicense under LGPL 2 Avoid license conflict with KLdap which is published under LGPL-2.0-or-later. --- plugins/ldap/AuthLdapConfiguration.h | 28 +++---------------- plugins/ldap/AuthLdapConfigurationWidget.cpp | 26 ++--------------- plugins/ldap/AuthLdapConfigurationWidget.h | 26 ++--------------- plugins/ldap/AuthLdapCore.cpp | 26 ++--------------- plugins/ldap/AuthLdapCore.h | 26 ++--------------- plugins/ldap/AuthLdapDialog.cpp | 26 ++--------------- plugins/ldap/AuthLdapDialog.h | 26 ++--------------- plugins/ldap/LdapPlugin.cpp | 26 ++--------------- plugins/ldap/LdapPlugin.h | 26 ++--------------- plugins/ldap/common/LdapBrowseDialog.cpp | 26 ++--------------- plugins/ldap/common/LdapBrowseDialog.h | 26 ++--------------- plugins/ldap/common/LdapBrowseModel.cpp | 26 ++--------------- plugins/ldap/common/LdapBrowseModel.h | 26 ++--------------- plugins/ldap/common/LdapClient.cpp | 26 ++--------------- plugins/ldap/common/LdapClient.h | 26 ++--------------- plugins/ldap/common/LdapCommon.h | 26 ++--------------- plugins/ldap/common/LdapConfiguration.cpp | 26 ++--------------- plugins/ldap/common/LdapConfiguration.h | 26 ++--------------- plugins/ldap/common/LdapConfigurationPage.cpp | 26 ++--------------- plugins/ldap/common/LdapConfigurationPage.h | 26 ++--------------- plugins/ldap/common/LdapConfigurationTest.cpp | 28 +++---------------- plugins/ldap/common/LdapConfigurationTest.h | 26 ++--------------- plugins/ldap/common/LdapDirectory.cpp | 26 ++--------------- plugins/ldap/common/LdapDirectory.h | 26 ++--------------- .../common/LdapNetworkObjectDirectory.cpp | 26 ++--------------- .../ldap/common/LdapNetworkObjectDirectory.h | 26 ++--------------- ...etworkObjectDirectoryConfigurationPage.cpp | 26 ++--------------- ...pNetworkObjectDirectoryConfigurationPage.h | 26 ++--------------- plugins/ldap/kldap/KLdapIntegration.cpp | 26 ++--------------- plugins/ldap/kldap/kldap_export.h | 26 ++--------------- plugins/ldap/kldap/klocalizedstring.h | 26 ++--------------- plugins/ldap/kldap/ldap_debug.h | 26 ++--------------- 32 files changed, 98 insertions(+), 738 deletions(-) diff --git a/plugins/ldap/AuthLdapConfiguration.h b/plugins/ldap/AuthLdapConfiguration.h index 9084a3ca3..d2a41d1a4 100644 --- a/plugins/ldap/AuthLdapConfiguration.h +++ b/plugins/ldap/AuthLdapConfiguration.h @@ -1,33 +1,13 @@ -/* - * LdapConfiguration.h - LDAP-auth-specific configuration values - * - * Copyright (c) 2020-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once #include "Configuration/Proxy.h" #define FOREACH_AUTH_LDAP_CONFIG_PROPERTY(OP) \ - OP( AuthLdapConfiguration, m_configuration, QString, usernameBindDnMapping, setUsernameBindMapping, "UsernameBindDnMapping", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ + OP( AuthLdapConfiguration, m_configuration, QString, usernameBindDnMapping, setUsernameBindMapping, "UsernameBindDnMapping", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ // clazy:excludeall=missing-qobject-macro diff --git a/plugins/ldap/AuthLdapConfigurationWidget.cpp b/plugins/ldap/AuthLdapConfigurationWidget.cpp index 97cb360c3..efa8e8f32 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.cpp +++ b/plugins/ldap/AuthLdapConfigurationWidget.cpp @@ -1,26 +1,6 @@ -/* - * AuthLdapConfigurationWidget.cpp - implementation of the authentication configuration page - * - * Copyright (c) 2020-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "AuthLdapConfiguration.h" #include "AuthLdapConfigurationWidget.h" diff --git a/plugins/ldap/AuthLdapConfigurationWidget.h b/plugins/ldap/AuthLdapConfigurationWidget.h index f84c93697..bd58ba606 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.h +++ b/plugins/ldap/AuthLdapConfigurationWidget.h @@ -1,26 +1,6 @@ -/* - * AuthLdapConfigurationWidget.h - header for the AuthLdapConfigurationWidget class - * - * Copyright (c) 2020-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/AuthLdapCore.cpp b/plugins/ldap/AuthLdapCore.cpp index 970cb88a5..776346245 100644 --- a/plugins/ldap/AuthLdapCore.cpp +++ b/plugins/ldap/AuthLdapCore.cpp @@ -1,26 +1,6 @@ -/* - * AuthLdapCore.cpp - implementation of AuthLdapCore class - * - * Copyright (c) 2020-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "AuthLdapCore.h" #include "LdapClient.h" diff --git a/plugins/ldap/AuthLdapCore.h b/plugins/ldap/AuthLdapCore.h index 2520e2ec4..aa639592d 100644 --- a/plugins/ldap/AuthLdapCore.h +++ b/plugins/ldap/AuthLdapCore.h @@ -1,26 +1,6 @@ -/* - * AuthLdapCore.h - declaration of AuthLdapCore class - * - * Copyright (c) 2020-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/AuthLdapDialog.cpp b/plugins/ldap/AuthLdapDialog.cpp index dadcfb716..c6b631603 100644 --- a/plugins/ldap/AuthLdapDialog.cpp +++ b/plugins/ldap/AuthLdapDialog.cpp @@ -1,26 +1,6 @@ -/* - * AuthLdapDialog.cpp - dialog for querying logon credentials - * - * Copyright (c) 2010-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include #include diff --git a/plugins/ldap/AuthLdapDialog.h b/plugins/ldap/AuthLdapDialog.h index 242c47667..5971ac59d 100644 --- a/plugins/ldap/AuthLdapDialog.h +++ b/plugins/ldap/AuthLdapDialog.h @@ -1,26 +1,6 @@ -/* - * AuthLdapDialog.h - declaration of password dialog - * - * Copyright (c) 2010-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/LdapPlugin.cpp b/plugins/ldap/LdapPlugin.cpp index 99e5246c4..9a74f3754 100644 --- a/plugins/ldap/LdapPlugin.cpp +++ b/plugins/ldap/LdapPlugin.cpp @@ -1,26 +1,6 @@ -/* - * LdapPlugin.cpp - implementation of LdapPlugin class - * - * Copyright (c) 2017-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include #include diff --git a/plugins/ldap/LdapPlugin.h b/plugins/ldap/LdapPlugin.h index 6f11f9e33..66c17ba91 100644 --- a/plugins/ldap/LdapPlugin.h +++ b/plugins/ldap/LdapPlugin.h @@ -1,26 +1,6 @@ -/* - * LdapPlugin.h - declaration of LdapPlugin class - * - * Copyright (c) 2017-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapBrowseDialog.cpp b/plugins/ldap/common/LdapBrowseDialog.cpp index 22e8e4aea..0e0e34dc1 100644 --- a/plugins/ldap/common/LdapBrowseDialog.cpp +++ b/plugins/ldap/common/LdapBrowseDialog.cpp @@ -1,26 +1,6 @@ -/* - * LdapBrowseDialog.cpp - dialog for browsing LDAP directories - * - * Copyright (c) 2019-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "LdapBrowseDialog.h" #include "LdapBrowseModel.h" diff --git a/plugins/ldap/common/LdapBrowseDialog.h b/plugins/ldap/common/LdapBrowseDialog.h index 0d3c329ad..4f959f111 100644 --- a/plugins/ldap/common/LdapBrowseDialog.h +++ b/plugins/ldap/common/LdapBrowseDialog.h @@ -1,26 +1,6 @@ -/* - * LdapBrowseDialog.h - dialog for browsing LDAP directories - * - * Copyright (c) 2019-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapBrowseModel.cpp b/plugins/ldap/common/LdapBrowseModel.cpp index 99e76a94a..839a7b28a 100644 --- a/plugins/ldap/common/LdapBrowseModel.cpp +++ b/plugins/ldap/common/LdapBrowseModel.cpp @@ -1,26 +1,6 @@ -/* - * LdapModel.cpp - item model for browsing LDAP directories - * - * Copyright (c) 2019-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include diff --git a/plugins/ldap/common/LdapBrowseModel.h b/plugins/ldap/common/LdapBrowseModel.h index 7e6edc9c4..e7ae38b6d 100644 --- a/plugins/ldap/common/LdapBrowseModel.h +++ b/plugins/ldap/common/LdapBrowseModel.h @@ -1,26 +1,6 @@ -/* - * LdapModel.h - item model for browsing LDAP directories - * - * Copyright (c) 2019-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapClient.cpp b/plugins/ldap/common/LdapClient.cpp index 047183f9f..0c3449bba 100644 --- a/plugins/ldap/common/LdapClient.cpp +++ b/plugins/ldap/common/LdapClient.cpp @@ -1,26 +1,6 @@ -/* - * LdapClient.cpp - class representing the LDAP directory and providing access to directory entries - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "LdapConfiguration.h" #include "LdapClient.h" diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index 773a85674..e2e803119 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -1,26 +1,6 @@ -/* - * LdapClient.h - class implementing an LDAP client - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapCommon.h b/plugins/ldap/common/LdapCommon.h index 910013af2..85f90c75d 100644 --- a/plugins/ldap/common/LdapCommon.h +++ b/plugins/ldap/common/LdapCommon.h @@ -1,26 +1,6 @@ -/* - * LdapCommon.h - common definitions for the LDAP library - * - * Copyright (c) 2019-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapConfiguration.cpp b/plugins/ldap/common/LdapConfiguration.cpp index 85cdabd52..0fdad69ca 100644 --- a/plugins/ldap/common/LdapConfiguration.cpp +++ b/plugins/ldap/common/LdapConfiguration.cpp @@ -1,26 +1,6 @@ -/* - * LdapConfiguration.cpp - LDAP-specific configuration values - * - * Copyright (c) 2019-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "VeyonConfiguration.h" #include "LdapConfiguration.h" diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index 83b88f7eb..5bf2c224d 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -1,26 +1,6 @@ -/* - * LdapConfiguration.h - LDAP-specific configuration values - * - * Copyright (c) 2017-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapConfigurationPage.cpp b/plugins/ldap/common/LdapConfigurationPage.cpp index f643963c7..b509b332d 100644 --- a/plugins/ldap/common/LdapConfigurationPage.cpp +++ b/plugins/ldap/common/LdapConfigurationPage.cpp @@ -1,26 +1,6 @@ -/* - * LdapConfigurationPage.cpp - implementation of the LdapConfigurationPage class - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include #include diff --git a/plugins/ldap/common/LdapConfigurationPage.h b/plugins/ldap/common/LdapConfigurationPage.h index 51ead4934..f774e1460 100644 --- a/plugins/ldap/common/LdapConfigurationPage.h +++ b/plugins/ldap/common/LdapConfigurationPage.h @@ -1,26 +1,6 @@ -/* - * LdapConfigurationPage.h - header for the LdapConfigurationPage class - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapConfigurationTest.cpp b/plugins/ldap/common/LdapConfigurationTest.cpp index cbbae90e7..9e8d72066 100644 --- a/plugins/ldap/common/LdapConfigurationTest.cpp +++ b/plugins/ldap/common/LdapConfigurationTest.cpp @@ -1,26 +1,6 @@ -/* - * LdapConfigurationTest.cpp - implementation of the LdapConfigurationTest class - * - * Copyright (c) 2020-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "LdapConfiguration.h" #include "LdapConfigurationTest.h" @@ -28,7 +8,7 @@ LdapConfigurationTest::LdapConfigurationTest( LdapConfiguration& configuration ) : - m_configuration( configuration ) + m_configuration( configuration ) { } diff --git a/plugins/ldap/common/LdapConfigurationTest.h b/plugins/ldap/common/LdapConfigurationTest.h index cfab5d0d1..6a19b4a84 100644 --- a/plugins/ldap/common/LdapConfigurationTest.h +++ b/plugins/ldap/common/LdapConfigurationTest.h @@ -1,26 +1,6 @@ -/* - * LdapConfigurationTest.h - header for the LdapConfigurationTest class - * - * Copyright (c) 2020-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index 322d2fe91..7067e4d79 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -1,26 +1,6 @@ -/* - * LdapDirectory.cpp - class representing the LDAP directory and providing access to directory entries - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "HostAddress.h" #include "LdapConfiguration.h" diff --git a/plugins/ldap/common/LdapDirectory.h b/plugins/ldap/common/LdapDirectory.h index 4c23deffa..ab3913a6b 100644 --- a/plugins/ldap/common/LdapDirectory.h +++ b/plugins/ldap/common/LdapDirectory.h @@ -1,26 +1,6 @@ -/* - * LdapDirectory.h - class representing the LDAP directory and providing access to directory entries - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index 3600564e9..414edbff5 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -1,26 +1,6 @@ -/* - * LdapNetworkObjectDirectory.cpp - provides a NetworkObjectDirectory for LDAP - * - * Copyright (c) 2017-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "LdapConfiguration.h" #include "LdapDirectory.h" diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.h b/plugins/ldap/common/LdapNetworkObjectDirectory.h index 52f69695c..ea1bc2137 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.h @@ -1,26 +1,6 @@ -/* - * LdapNetworkObjectDirectory.h - provides a NetworkObjectDirectory for LDAP - * - * Copyright (c) 2017-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp index 812598c45..e8cc7765b 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp @@ -1,26 +1,6 @@ -/* - * LdapNetworkObjectDirectoryConfigurationPage.cpp - implementation of the LdapNetworkObjectDirectoryConfigurationPage class - * - * Copyright (c) 2021-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "LdapNetworkObjectDirectoryConfigurationPage.h" diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h index 1827d0b50..eb2a76d23 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h @@ -1,26 +1,6 @@ -/* - * LdapNetworkObjectDirectoryConfigurationPage.h - header for the LdapNetworkObjectDirectoryConfigurationPage class - * - * Copyright (c) 2021-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/kldap/KLdapIntegration.cpp b/plugins/ldap/kldap/KLdapIntegration.cpp index 36438621f..24630a670 100644 --- a/plugins/ldap/kldap/KLdapIntegration.cpp +++ b/plugins/ldap/kldap/KLdapIntegration.cpp @@ -1,26 +1,6 @@ -/* - * KLdapIntegration.cpp - definition of logging category for kldap - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2016-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #include "ldap_debug.h" diff --git a/plugins/ldap/kldap/kldap_export.h b/plugins/ldap/kldap/kldap_export.h index 7b63cb9a8..bf90f9509 100644 --- a/plugins/ldap/kldap/kldap_export.h +++ b/plugins/ldap/kldap/kldap_export.h @@ -1,26 +1,6 @@ -/* - * kldap_export.h - definition of symbol visibility macros for kldap - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/kldap/klocalizedstring.h b/plugins/ldap/kldap/klocalizedstring.h index 1e8c3e167..10798ac50 100644 --- a/plugins/ldap/kldap/klocalizedstring.h +++ b/plugins/ldap/kldap/klocalizedstring.h @@ -1,26 +1,6 @@ -/* - * klocalizedstring.h - dummy replacements for i18n() functions of KDE - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once diff --git a/plugins/ldap/kldap/ldap_debug.h b/plugins/ldap/kldap/ldap_debug.h index 41bd563b3..e8f1077bf 100644 --- a/plugins/ldap/kldap/ldap_debug.h +++ b/plugins/ldap/kldap/ldap_debug.h @@ -1,26 +1,6 @@ -/* - * ldap_debug.h - declaration of logging category for kldap - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later #pragma once From fd107deae377c83e4396fe1f4b611289fe754d40 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 24 Jan 2023 11:29:45 +0100 Subject: [PATCH 1440/1765] Master: update splash for 2023 --- master/resources/splash.png | Bin 5500 -> 5495 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/master/resources/splash.png b/master/resources/splash.png index 860f22f455f8366914b5774669c0f29e64b04b6b..4f85df2b49042d840399f4cfe911722727a82c67 100644 GIT binary patch delta 4991 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 JPDHLkV1kt!XRiPN delta 5018 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 From 72046c951feb148900938e6fd5c9078882045544 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 24 Jan 2023 11:33:28 +0100 Subject: [PATCH 1441/1765] CI: drop Fedora 35 and add Fedora 37 --- .ci/{linux.fedora.35 => linux.fedora.37}/Dockerfile | 4 ++-- .ci/{linux.fedora.35 => linux.fedora.37}/script.sh | 2 +- .gitlab-ci.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename .ci/{linux.fedora.35 => linux.fedora.37}/Dockerfile (93%) rename .ci/{linux.fedora.35 => linux.fedora.37}/script.sh (63%) diff --git a/.ci/linux.fedora.35/Dockerfile b/.ci/linux.fedora.37/Dockerfile similarity index 93% rename from .ci/linux.fedora.35/Dockerfile rename to .ci/linux.fedora.37/Dockerfile index ff62bed09..1f80dbe4f 100644 --- a/.ci/linux.fedora.35/Dockerfile +++ b/.ci/linux.fedora.37/Dockerfile @@ -1,8 +1,8 @@ -FROM fedora:35 +FROM fedora:37 MAINTAINER Tobias Junghans RUN \ - dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-35.noarch.rpm && \ + dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-37.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ diff --git a/.ci/linux.fedora.35/script.sh b/.ci/linux.fedora.37/script.sh similarity index 63% rename from .ci/linux.fedora.35/script.sh rename to .ci/linux.fedora.37/script.sh index b5801c113..514416630 100755 --- a/.ci/linux.fedora.35/script.sh +++ b/.ci/linux.fedora.37/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.35" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.37" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7614419e0..01bdfd62c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,8 +13,8 @@ build-linux: - centos.7.9 - debian.buster - debian.bullseye - - fedora.35 - fedora.36 + - fedora.37 - opensuse.15.3 - opensuse.tumbleweed - ubuntu.bionic From f086cc1a82644253b35a226cb49ab59474365077 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 24 Jan 2023 11:38:05 +0100 Subject: [PATCH 1442/1765] CI: replace openSUSE Leap 15.3 with 15.4 15.3 is EOL as of Dec 31st 2022. --- .ci/{linux.opensuse.15.3 => linux.opensuse.15.4}/Dockerfile | 2 +- .ci/{linux.opensuse.15.3 => linux.opensuse.15.4}/script.sh | 2 +- .gitlab-ci.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename .ci/{linux.opensuse.15.3 => linux.opensuse.15.4}/Dockerfile (96%) rename .ci/{linux.opensuse.15.3 => linux.opensuse.15.4}/script.sh (61%) diff --git a/.ci/linux.opensuse.15.3/Dockerfile b/.ci/linux.opensuse.15.4/Dockerfile similarity index 96% rename from .ci/linux.opensuse.15.3/Dockerfile rename to .ci/linux.opensuse.15.4/Dockerfile index 4cad0592c..3b349906b 100644 --- a/.ci/linux.opensuse.15.3/Dockerfile +++ b/.ci/linux.opensuse.15.4/Dockerfile @@ -1,4 +1,4 @@ -FROM opensuse/leap:15.3 +FROM opensuse/leap:15.4 MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.opensuse.15.3/script.sh b/.ci/linux.opensuse.15.4/script.sh similarity index 61% rename from .ci/linux.opensuse.15.3/script.sh rename to .ci/linux.opensuse.15.4/script.sh index 05ab46187..9cb0e7bf1 100755 --- a/.ci/linux.opensuse.15.3/script.sh +++ b/.ci/linux.opensuse.15.4/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=opensuse.15.3" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=opensuse.15.4" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 01bdfd62c..463122caa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,7 @@ build-linux: - debian.bullseye - fedora.36 - fedora.37 - - opensuse.15.3 + - opensuse.15.4 - opensuse.tumbleweed - ubuntu.bionic - ubuntu.focal From 1edc36afa823f00e0382f1561bd79ab90e269539 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 24 Jan 2023 12:18:09 +0100 Subject: [PATCH 1443/1765] CI: update Github build workflow --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 40113433f..f3fad6a88 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ jobs: matrix: dist: - debian.buster - - fedora.35 + - fedora.36 - opensuse.tumbleweed - ubuntu.focal runs-on: ubuntu-latest From ed6c8ba0efa572270295e217452c4b90730bafe9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Feb 2023 15:36:23 +0100 Subject: [PATCH 1444/1765] 3rdparty: ultravnc: update submodule (1.4.0.7) --- 3rdparty/ultravnc | 2 +- .../BuiltinUltraVncServer.cpp | 7 +- .../vncserver/ultravnc-builtin/CMakeLists.txt | 97 ++++++++++--------- .../vncserver/ultravnc-builtin/ultravnc.cpp | 19 ---- .../vncserver/ultravnc-builtin/vncntlm.cpp | 31 ------ 5 files changed, 58 insertions(+), 98 deletions(-) delete mode 100644 plugins/vncserver/ultravnc-builtin/ultravnc.cpp delete mode 100644 plugins/vncserver/ultravnc-builtin/vncntlm.cpp diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 6b734d107..100dec60d 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 6b734d107f1e0cc0d7254028a54d9a2eac9d81f6 +Subproject commit 100dec60db6f49fe10c951ef422bfabf0efe598a diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp index 76cf69949..4505d3974 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp @@ -30,7 +30,8 @@ #include "UltraVncConfigurationWidget.h" #include "VeyonConfiguration.h" -extern int WinVNCAppMain(); +int WinVNCAppMain(); +void initUltraVncSettingsManager(); static BuiltinUltraVncServer* vncServerInstance = nullptr; @@ -55,7 +56,7 @@ void ultravnc_veyon_load_password( char* out, int size ) -BOOL ultravnc_veyon_load_int( LPCSTR valname, LONG *out ) +BOOL ultravnc_veyon_load_int( LPCSTR valname, int *out ) { if( strcmp( valname, "LoopbackOnly" ) == 0 ) { @@ -204,6 +205,8 @@ bool BuiltinUltraVncServer::runServer( int serverPort, const Password& password m_serverPort = serverPort; m_password = password; + initUltraVncSettingsManager(); + // run UltraVNC server auto hUser32 = LoadLibrary( "user32.dll" ); auto hSHCore = LoadLibrary( "SHCore.dll" ); diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index bd802ddcf..b6e8e5a33 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -9,62 +9,64 @@ find_package(JPEG REQUIRED) find_package(LZO REQUIRED) set(ultravnc_CXX_SOURCES - ${ultravnc_DIR}/winvnc/winvnc/MouseSimulator.cpp + ${ultravnc_DIR}/common/Clipboard.cpp + ${ultravnc_DIR}/common/UltraVncZ.cpp + ${ultravnc_DIR}/common/win32_helpers.cpp + ${ultravnc_DIR}/rdr/ZlibInStream.cxx + ${ultravnc_DIR}/rdr/ZlibOutStream.cxx + ${ultravnc_DIR}/rfb/dh.cpp + ${ultravnc_DIR}/winvnc/omnithread/nt.cpp + ${ultravnc_DIR}/winvnc/winvnc/benchmark.cpp + ${ultravnc_DIR}/winvnc/winvnc/buildtime.cpp + ${ultravnc_DIR}/winvnc/winvnc/CpuUsage.cpp + ${ultravnc_DIR}/winvnc/winvnc/credentials.cpp + ${ultravnc_DIR}/winvnc/winvnc/DeskdupEngine.cpp + ${ultravnc_DIR}/winvnc/winvnc/HelperFunctions.cpp ${ultravnc_DIR}/winvnc/winvnc/HideDesktop.cpp - ${ultravnc_DIR}/winvnc/winvnc/rfbRegion_win32.cpp - ${ultravnc_DIR}/winvnc/winvnc/vistahook.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncdesktopthread.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncdesktopsink.cpp + ${ultravnc_DIR}/winvnc/winvnc/inifile.cpp ${ultravnc_DIR}/winvnc/winvnc/IPC.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncencoderre.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncdesktop.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncserver.cpp + ${ultravnc_DIR}/winvnc/winvnc/LayeredWindows.cpp + ${ultravnc_DIR}/winvnc/winvnc/MouseSimulator.cpp + ${ultravnc_DIR}/winvnc/winvnc/rfbRegion_win32.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbUpdateTracker.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncencodehext.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncproperties.cpp - ${ultravnc_DIR}/winvnc/winvnc/security.cpp - ${ultravnc_DIR}/winvnc/winvnc/buildtime.cpp + ${ultravnc_DIR}/winvnc/winvnc/ScreenCapture.cpp + ${ultravnc_DIR}/winvnc/winvnc/SettingsManager.cpp + ${ultravnc_DIR}/winvnc/winvnc/stdhdrs.cpp ${ultravnc_DIR}/winvnc/winvnc/Timer.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncencoderCursor.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncencoder.cpp - ${ultravnc_DIR}/winvnc/winvnc/vnclog.cpp ${ultravnc_DIR}/winvnc/winvnc/translate.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncencodecorre.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncencodezrle.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncEncodeTight.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncservice.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncMultiMonitor.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncbuffer.cpp + ${ultravnc_DIR}/winvnc/winvnc/uvncUiAccess.cpp ${ultravnc_DIR}/winvnc/winvnc/videodrivercheck.cpp ${ultravnc_DIR}/winvnc/winvnc/videodriver.cpp + ${ultravnc_DIR}/winvnc/winvnc/vistahook.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncbuffer.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncclient.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncdesktop.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncdesktopsink.cpp ${ultravnc_DIR}/winvnc/winvnc/vncDesktopSW.cpp - ${ultravnc_DIR}/winvnc/winvnc/vnckeymap.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncOSVersion.cpp - ${ultravnc_DIR}/winvnc/winvnc/winvnc.cpp - ${ultravnc_DIR}/winvnc/winvnc/stdhdrs.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncEncodeUltra.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncdesktopthread.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncencodecorre.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncencodehext.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncencoder.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncencoderCursor.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncencoderre.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncEncodeTight.cpp ${ultravnc_DIR}/winvnc/winvnc/vncEncodeUltra2.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncsockconnect.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncinsthandler.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncEncodeUltra.cpp ${ultravnc_DIR}/winvnc/winvnc/vncEncodeZlib.cpp ${ultravnc_DIR}/winvnc/winvnc/vncEncodeZlibHex.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncencodezrle.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncinsthandler.cpp + ${ultravnc_DIR}/winvnc/winvnc/vnckeymap.cpp + ${ultravnc_DIR}/winvnc/winvnc/vnclog.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncMultiMonitor.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncOSVersion.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncproperties.cpp ${ultravnc_DIR}/winvnc/winvnc/vncpropertiesPoll.cpp - ${ultravnc_DIR}/winvnc/winvnc/helpers.cpp - ${ultravnc_DIR}/winvnc/winvnc/CpuUsage.cpp - ${ultravnc_DIR}/winvnc/winvnc/uvncUiAccess.cpp - ${ultravnc_DIR}/winvnc/winvnc/ScreenCapture.cpp - ${ultravnc_DIR}/winvnc/winvnc/DeskdupEngine.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncserver.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncsetauth.cpp + ${ultravnc_DIR}/winvnc/winvnc/vncsockconnect.cpp ${ultravnc_DIR}/winvnc/winvnc/vsocket.cpp - ${ultravnc_DIR}/winvnc/winvnc/LayeredWindows.cpp - ${ultravnc_DIR}/winvnc/omnithread/nt.cpp - ${ultravnc_DIR}/common/Clipboard.cpp - ${ultravnc_DIR}/common/win32_helpers.cpp - ${ultravnc_DIR}/common/UltraVncZ.cpp - ${ultravnc_DIR}/rfb/dh.cpp - ${ultravnc_DIR}/rdr/ZlibOutStream.cxx - ${ultravnc_DIR}/rdr/ZlibInStream.cxx - ultravnc.cpp - vncntlm.cpp + ${ultravnc_DIR}/winvnc/winvnc/winvnc.cpp ) set(ultravnc_C_SOURCES @@ -90,12 +92,17 @@ build_veyon_plugin(builtin-ultravnc-server target_link_libraries(builtin-ultravnc-server PRIVATE -lws2_32 -luserenv -lole32 -lversion -lgdi32 -limm32 -lwinmm ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${LZO_LIBRARIES}) target_include_directories(builtin-ultravnc-server PRIVATE ${ultravnc_DIR} + ${ultravnc_DIR}/common ${ultravnc_DIR}/winvnc ${ultravnc_DIR}/winvnc/omnithread ${ultravnc_DIR}/winvnc/winvnc ) -target_compile_definitions(builtin-ultravnc-server PRIVATE ULTRAVNC_VEYON_SUPPORT _INTERNALLIB) +target_compile_definitions(builtin-ultravnc-server PRIVATE + ULTRAVNC_VEYON_SUPPORT + _INTERNALLIB + _USE_DESKTOPDUPLICATION +) if(VEYON_BUILD_WIN64) target_compile_definitions(builtin-ultravnc-server PRIVATE _X64) @@ -103,7 +110,7 @@ endif() qt6_disable_unicode_defines(builtin-ultravnc-server) -set(ULTRAVNC_COMPILER_FLAGS "-Wno-comments -Wno-attributes -Wno-write-strings -Wno-parentheses -Wno-misleading-indentation -Wno-unused-result -Wno-unused-label -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-format-zero-length -Wno-sign-compare -Wno-int-to-pointer-cast -fexceptions") +set(ULTRAVNC_COMPILER_FLAGS "-Wno-comments -Wno-attributes -Wno-write-strings -Wno-parentheses -Wno-misleading-indentation -Wno-unused-result -Wno-unused-label -Wno-unknown-pragmas -Wno-unused-variable -Wno-unused-value -Wno-unused-but-set-variable -Wno-deprecated-declarations -Wno-format-zero-length -Wno-sign-compare -Wno-int-to-pointer-cast -fexceptions") set_source_files_properties(${ultravnc_C_SOURCES} PROPERTIES COMPILE_FLAGS "${ULTRAVNC_COMPILER_FLAGS}") set_source_files_properties(${ultravnc_CXX_SOURCES} PROPERTIES COMPILE_FLAGS "${ULTRAVNC_COMPILER_FLAGS} -Wno-terminate -Wno-conversion-null") diff --git a/plugins/vncserver/ultravnc-builtin/ultravnc.cpp b/plugins/vncserver/ultravnc-builtin/ultravnc.cpp deleted file mode 100644 index 628c5998a..000000000 --- a/plugins/vncserver/ultravnc-builtin/ultravnc.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "stdhdrs.h" - -#define rfbConnFailed 0 -#define rfbInvalidAuth 0 -#define rfbNoAuth 1 -#define rfbVncAuth 2 -#define rfbUltraVNC 17 - -#define rfbVncAuthOK 0 -#define rfbVncAuthFailed 1 - -// adzm 2010-09 - rfbUltraVNC or other auths may send this to restart authentication (perhaps over a now-secure channel) -#define rfbVncAuthContinue 0xFFFFFFFF - -#include "vncclient.cpp" - -extern bool G_USE_PIXEL; - -bool G_USE_PIXEL = false; diff --git a/plugins/vncserver/ultravnc-builtin/vncntlm.cpp b/plugins/vncserver/ultravnc-builtin/vncntlm.cpp deleted file mode 100644 index bb35a88c2..000000000 --- a/plugins/vncserver/ultravnc-builtin/vncntlm.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * vncntlm.cpp - dummy implementation of vncntlm module - * - * Copyright (c) 2016-2022 Tobias Junghans - * - * This file is part of Veyon - https://veyon.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -int CheckUserGroupPasswordUni(char *,char *,const char *) -{ - // never perform logon authentication as we're only using - // simple VNC authentication for internal VNC server - return 0; -} - From c0f811635b3df5243b6e249eba8201d3ceea076e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Feb 2023 15:34:05 +0100 Subject: [PATCH 1445/1765] Core: rely on __MINGW32__ for platform detection in PCH --- core/src/PrecompiledHeader.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/PrecompiledHeader.h b/core/src/PrecompiledHeader.h index fc267ad7b..232142a82 100644 --- a/core/src/PrecompiledHeader.h +++ b/core/src/PrecompiledHeader.h @@ -1,6 +1,6 @@ #pragma once -#ifdef _WIN32_WINNT +#ifdef __MINGW32__ #include #endif From 84f5e5ca480d72a33a0b72af2a584a23e8445237 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Feb 2023 15:38:35 +0100 Subject: [PATCH 1446/1765] Core: add missing header in VeyonCore Since VeyonCore inherits from QObject make sure to include the corresponding header. --- core/src/VeyonCore.h | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 94342830e..cbffafd4b 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -24,6 +24,7 @@ #pragma once +#include #include #include #include From 5c36a39c6982bd01a6f7044c7c6a7caf8cc33a45 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Feb 2023 14:32:43 +0100 Subject: [PATCH 1447/1765] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..18c914718 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From a52ad52f736cf20211cedd5f8b3d61d7335399bb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Feb 2023 13:12:00 +0100 Subject: [PATCH 1448/1765] CMake: require LibVNCClient >= 0.9.14 --- core/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 644421000..e4e5dd61a 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -14,7 +14,7 @@ set(core_RESOURCES ) if(NOT WITH_BUILTIN_LIBVNC) - find_package(LibVNCClient 0.9.13) + find_package(LibVNCClient 0.9.14) endif() if(LibVNCClient_FOUND) From f5d4546acd8880ed2c9f70572386768f698c5433 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Feb 2023 13:12:52 +0100 Subject: [PATCH 1449/1765] Core: Configuration: always use 64 bit registry When installing 32 bit version of Veyon on a 64 bit Windows, make sure to use the same settings. --- core/src/Configuration/LocalStore.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index 4b3f16fe0..9bc44e127 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -187,10 +188,15 @@ void LocalStore::clear() QSettings *LocalStore::createSettingsObject() const { - return new QSettings( scope() == System ? - QSettings::SystemScope : QSettings::UserScope, - QSettings().organizationName(), - QSettings().applicationName() ); + return new QSettings( +#ifdef Q_OS_WIN + QSettings::Registry64Format, +#else + QSettings::NativeFormat, +#endif + scope() == System ? QSettings::SystemScope : QSettings::UserScope, + QCoreApplication::organizationName(), + QCoreApplication::applicationName()); } From 0062a784f8626698107fefbc6aacc32b8ca6fd67 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Feb 2023 13:24:24 +0100 Subject: [PATCH 1450/1765] 3rdparty: libvncserver: update submodule --- 3rdparty/libvncserver | 2 +- cmake/modules/LibVNCServerIntegration.cmake | 4 +- core/CMakeLists.txt | 21 +++---- .../vncserver/x11vnc-builtin/CMakeLists.txt | 55 ++++++++++--------- 4 files changed, 42 insertions(+), 40 deletions(-) diff --git a/3rdparty/libvncserver b/3rdparty/libvncserver index dcd031d0c..72c2e71bc 160000 --- a/3rdparty/libvncserver +++ b/3rdparty/libvncserver @@ -1 +1 @@ -Subproject commit dcd031d0cd694695a55080c3bc2c42bc4c3ad7ac +Subproject commit 72c2e71bc914f0dbbdbd4118a4c65db6c9acc2c9 diff --git a/cmake/modules/LibVNCServerIntegration.cmake b/cmake/modules/LibVNCServerIntegration.cmake index cfbba76a7..cbecc6629 100644 --- a/cmake/modules/LibVNCServerIntegration.cmake +++ b/cmake/modules/LibVNCServerIntegration.cmake @@ -92,5 +92,5 @@ set(LIBVNCSERVER_HAVE_LIBSSL TRUE) set(LIBVNCSERVER_ALLOW24BPP TRUE) set(LIBVNCSERVER_IPv6 TRUE) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/rfb) -configure_file(${CMAKE_SOURCE_DIR}/3rdparty/libvncserver/rfb/rfbconfig.h.cmakein ${CMAKE_CURRENT_BINARY_DIR}/rfb/rfbconfig.h @ONLY) +file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/rfb) +configure_file(${libvncserver_DIR}/include/rfb/rfbconfig.h.cmakein ${CMAKE_CURRENT_BINARY_DIR}/rfb/rfbconfig.h @ONLY) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index e4e5dd61a..20ef46e1c 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -45,14 +45,15 @@ else() message(WARNING "Performing internal build of LibVNCClient which requires additional development packages") include(LibVNCServerIntegration) set(libvncclient_SOURCES - ${libvncserver_DIR}/libvncclient/cursor.c - ${libvncserver_DIR}/libvncclient/listen.c - ${libvncserver_DIR}/libvncclient/rfbproto.c - ${libvncserver_DIR}/libvncclient/sockets.c - ${libvncserver_DIR}/libvncclient/tls_openssl.c - ${libvncserver_DIR}/libvncclient/vncviewer.c - ${libvncserver_DIR}/common/crypto_openssl.c - ${libvncserver_DIR}/common/turbojpeg.c) + ${libvncserver_DIR}/src/libvncclient/cursor.c + ${libvncserver_DIR}/src/libvncclient/listen.c + ${libvncserver_DIR}/src/libvncclient/rfbclient.c + ${libvncserver_DIR}/src/libvncclient/sockets.c + ${libvncserver_DIR}/src/libvncclient/tls_openssl.c + ${libvncserver_DIR}/src/libvncclient/vncviewer.c + ${libvncserver_DIR}/src/common/crypto_openssl.c + ${libvncserver_DIR}/src/common/sockets.c + ${libvncserver_DIR}/src/common/turbojpeg.c) set_source_files_properties(${libvncclient_SOURCES} PROPERTIES COMPILE_FLAGS "-Wno-unused-function -Wno-unused-variable -fvisibility=default -Wno-deprecated-declarations" @@ -102,8 +103,8 @@ else() ${LZO_INCLUDE_DIR} ) target_include_directories(veyon-core PUBLIC - ${libvncserver_DIR}/common/ - ${libvncserver_DIR} + ${libvncserver_DIR}/src/common/ + ${libvncserver_DIR}/include ) target_link_libraries(veyon-core PRIVATE Threads::Threads diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index 29a207e26..bee13d933 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -118,33 +118,34 @@ if(NOT VEYON_X11VNC_EXTERNAL) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY) if(NOT LibVNCServer_FOUND) set(libvncserver_SOURCES - ${libvncserver_DIR}/libvncserver/auth.c - ${libvncserver_DIR}/libvncserver/cargs.c - ${libvncserver_DIR}/libvncserver/corre.c - ${libvncserver_DIR}/libvncserver/cursor.c - ${libvncserver_DIR}/libvncserver/cutpaste.c - ${libvncserver_DIR}/libvncserver/draw.c - ${libvncserver_DIR}/libvncserver/font.c - ${libvncserver_DIR}/libvncserver/hextile.c - ${libvncserver_DIR}/libvncserver/httpd.c - ${libvncserver_DIR}/libvncserver/main.c - ${libvncserver_DIR}/libvncserver/rfbregion.c - ${libvncserver_DIR}/libvncserver/rfbserver.c - ${libvncserver_DIR}/libvncserver/rre.c - ${libvncserver_DIR}/libvncserver/scale.c - ${libvncserver_DIR}/libvncserver/selbox.c - ${libvncserver_DIR}/libvncserver/sockets.c - ${libvncserver_DIR}/libvncserver/stats.c - ${libvncserver_DIR}/libvncserver/translate.c - ${libvncserver_DIR}/libvncserver/ultra.c - ${libvncserver_DIR}/libvncserver/zlib.c - ${libvncserver_DIR}/libvncserver/zrle.c - ${libvncserver_DIR}/libvncserver/zrleoutstream.c - ${libvncserver_DIR}/libvncserver/zrlepalettehelper.c - ${libvncserver_DIR}/libvncserver/tight.c - ${libvncserver_DIR}/common/d3des.c - ${libvncserver_DIR}/common/turbojpeg.c - ${libvncserver_DIR}/common/vncauth.c) + ${libvncserver_DIR}/src/libvncserver/auth.c + ${libvncserver_DIR}/src/libvncserver/cargs.c + ${libvncserver_DIR}/src/libvncserver/corre.c + ${libvncserver_DIR}/src/libvncserver/cursor.c + ${libvncserver_DIR}/src/libvncserver/cutpaste.c + ${libvncserver_DIR}/src/libvncserver/draw.c + ${libvncserver_DIR}/src/libvncserver/font.c + ${libvncserver_DIR}/src/libvncserver/hextile.c + ${libvncserver_DIR}/src/libvncserver/httpd.c + ${libvncserver_DIR}/src/libvncserver/main.c + ${libvncserver_DIR}/src/libvncserver/rfbregion.c + ${libvncserver_DIR}/src/libvncserver/rfbserver.c + ${libvncserver_DIR}/src/libvncserver/rre.c + ${libvncserver_DIR}/src/libvncserver/scale.c + ${libvncserver_DIR}/src/libvncserver/selbox.c + ${libvncserver_DIR}/src/libvncserver/sockets.c + ${libvncserver_DIR}/src/libvncserver/stats.c + ${libvncserver_DIR}/src/libvncserver/translate.c + ${libvncserver_DIR}/src/libvncserver/ultra.c + ${libvncserver_DIR}/src/libvncserver/zlib.c + ${libvncserver_DIR}/src/libvncserver/zrle.c + ${libvncserver_DIR}/src/libvncserver/zrleoutstream.c + ${libvncserver_DIR}/src/libvncserver/zrlepalettehelper.c + ${libvncserver_DIR}/src/libvncserver/tight.c + ${libvncserver_DIR}/src/common/d3des.c + ${libvncserver_DIR}/src/common/sockets.c + ${libvncserver_DIR}/src/common/turbojpeg.c + ${libvncserver_DIR}/src/common/vncauth.c) endif() set(x11vnc_SOURCES x11vnc-veyon.c From 80a20cd565132fe44d3ecce09a57bc4555ec3808 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Feb 2023 13:32:35 +0100 Subject: [PATCH 1451/1765] CMake: MinGWCrossCompile: drop unused variable --- cmake/modules/MinGWCrossCompile.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/modules/MinGWCrossCompile.cmake b/cmake/modules/MinGWCrossCompile.cmake index b9161a9be..9c4f5b9e0 100644 --- a/cmake/modules/MinGWCrossCompile.cmake +++ b/cmake/modules/MinGWCrossCompile.cmake @@ -21,7 +21,6 @@ set(STRIP ${MINGW_TOOL_PREFIX}strip) set(WINDRES ${MINGW_TOOL_PREFIX}windres) set(QT_BINARY_DIR ${MINGW_PREFIX}/bin) -set(QT_QMAKE_EXECUTABLE ${QT_BINARY_DIR}/qmake) # search for programs in the build host directories set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) From 433bfd5d3070672723df093b9bb34672544ea98e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Feb 2023 13:33:24 +0100 Subject: [PATCH 1452/1765] CMake: refactor import of Qt's translations Rely on QT_TRANSLATIONS_DIR pointing to a directory containing the translation files of Qt. This also eliminates the need for the qmake binary which is not necessarily part of Qt 6 builds. --- cmake/modules/FindQtTranslations.cmake | 40 ------------------------ cmake/modules/ImportQtTranslations.cmake | 30 ++++++++++++++++++ translations/CMakeLists.txt | 4 +-- 3 files changed, 32 insertions(+), 42 deletions(-) delete mode 100644 cmake/modules/FindQtTranslations.cmake create mode 100644 cmake/modules/ImportQtTranslations.cmake diff --git a/cmake/modules/FindQtTranslations.cmake b/cmake/modules/FindQtTranslations.cmake deleted file mode 100644 index 7f39c1bc0..000000000 --- a/cmake/modules/FindQtTranslations.cmake +++ /dev/null @@ -1,40 +0,0 @@ -# FindQtTranslations.cmake - Copyright (c) 2020-2022 Tobias Junghans -# -# description: find translation files of Qt and prepare them for Windows build -# usage: find_qt_translations() - - -function(find_qt_translations) - # find Qt's translation files - set(QT_TRANSLATIONS_STAMP ${CMAKE_CURRENT_BINARY_DIR}/qttranslations.stamp) - if(NOT EXISTS "${QT_TRANSLATIONS_STAMP}") - if(WITH_QT6) - get_target_property(QT_QMAKE_EXECUTABLE Qt6::qmake IMPORTED_LOCATION) - else() - get_target_property(QT_QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) - endif() - execute_process(COMMAND "${QT_QMAKE_EXECUTABLE}" -query QT_INSTALL_TRANSLATIONS - OUTPUT_STRIP_TRAILING_WHITESPACE - OUTPUT_VARIABLE QT_INSTALL_TRANSLATIONS) - message(STATUS "Found Qt translations: ${QT_INSTALL_TRANSLATIONS}") - if(WIN32) - file(GLOB QT_TRANSLATIONS "${QT_INSTALL_TRANSLATIONS}/qt_*.qm") - foreach(QT_TRANSLATION ${QT_TRANSLATIONS}) - if(NOT QT_TRANSLATION MATCHES "help") - string(REPLACE "${QT_INSTALL_TRANSLATIONS}/" "" QT_TRANSLATION_FILE_NAME "${QT_TRANSLATION}") - string(REPLACE "qt_" "qtbase_" QTBASE_TRANSLATION_FILE_NAME "${QT_TRANSLATION_FILE_NAME}") - # is there qtbase-specific QM file? - if(EXISTS "${QT_INSTALL_TRANSLATIONS}/${QTBASE_TRANSLATION_FILE_NAME}") - # then use it instead of (deprecated) QM file for all Qt modules - file(COPY "${QT_INSTALL_TRANSLATIONS}/${QTBASE_TRANSLATION_FILE_NAME}" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - message(STATUS "Imported Qt translation file: ${QT_INSTALL_TRANSLATIONS}/${QTBASE_TRANSLATION_FILE_NAME}") - else() - file(COPY ${QT_TRANSLATION} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - message(STATUS "Imported Qt translation file: ${QT_TRANSLATION}") - endif() - endif() - endforeach() - file(WRITE "${QT_TRANSLATIONS_STAMP}" "1") - endif() - endif() -endfunction() diff --git a/cmake/modules/ImportQtTranslations.cmake b/cmake/modules/ImportQtTranslations.cmake new file mode 100644 index 000000000..ff41be9db --- /dev/null +++ b/cmake/modules/ImportQtTranslations.cmake @@ -0,0 +1,30 @@ +# ImportQtTranslations.cmake - Copyright (c) 2020-2023 Tobias Junghans +# +# description: import translation files of Qt into build directory +# usage: import_qt_translations() with QT_TRANSLATIONS_DIR set + + +function(import_qt_translations) + # find Qt's translation files + set(QT_TRANSLATIONS_STAMP ${CMAKE_CURRENT_BINARY_DIR}/qttranslations.stamp) + if(QT_TRANSLATIONS_DIR AND NOT EXISTS "${QT_TRANSLATIONS_STAMP}") + message(STATUS "Processing Qt translation files in ${QT_TRANSLATIONS_DIR}") + file(GLOB QT_TRANSLATIONS "${QT_TRANSLATIONS_DIR}/qt_*.qm") + foreach(QT_TRANSLATION ${QT_TRANSLATIONS}) + if(NOT QT_TRANSLATION MATCHES "help") + string(REPLACE "${QT_TRANSLATIONS_DIR}/" "" QT_TRANSLATION_FILE_NAME "${QT_TRANSLATION}") + string(REPLACE "qt_" "qtbase_" QTBASE_TRANSLATION_FILE_NAME "${QT_TRANSLATION_FILE_NAME}") + # is there qtbase-specific QM file? + if(EXISTS "${QT_TRANSLATIONS_DIR}/${QTBASE_TRANSLATION_FILE_NAME}") + # then use it instead of (deprecated) QM file for all Qt modules + file(COPY "${QT_TRANSLATIONS_DIR}/${QTBASE_TRANSLATION_FILE_NAME}" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + message(STATUS "Imported Qt translation file: ${QT_TRANSLATIONS_DIR}/${QTBASE_TRANSLATION_FILE_NAME}") + else() + file(COPY ${QT_TRANSLATION} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + message(STATUS "Imported Qt translation file: ${QT_TRANSLATION}") + endif() + endif() + endforeach() + file(WRITE "${QT_TRANSLATIONS_STAMP}" "1") + endif() +endfunction() diff --git a/translations/CMakeLists.txt b/translations/CMakeLists.txt index a2b46304e..ec4a94c1d 100644 --- a/translations/CMakeLists.txt +++ b/translations/CMakeLists.txt @@ -1,5 +1,5 @@ include(CreateTranslations) -include(FindQtTranslations) +include(ImportQtTranslations) file(GLOB veyon_translations ${CMAKE_CURRENT_SOURCE_DIR}/*.ts) file(GLOB_RECURSE veyon_sources ${CMAKE_SOURCE_DIR}/*.cpp ${CMAKE_SOURCE_DIR}/*.h ${CMAKE_SOURCE_DIR}/*.ui ${CMAKE_SOURCE_DIR}/*.qml) @@ -7,4 +7,4 @@ string(REGEX REPLACE "${CMAKE_SOURCE_DIR}/3rdparty[^;]+;?" "" veyon_sources "${v string(REGEX REPLACE "${CMAKE_SOURCE_DIR}/addons[^;]+;?" "" veyon_sources "${veyon_sources}") create_translations(veyon "${veyon_translations}" "${veyon_sources}") -find_qt_translations() +import_qt_translations() From 68ffb19c16db07ca8366250b6f53d897ef75fd71 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Feb 2023 13:34:18 +0100 Subject: [PATCH 1453/1765] CI: set QT_TRANSLATIONS_DIR for Windows builds --- .ci/windows/build.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh index 0b3d75233..b130d31f2 100755 --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -11,7 +11,12 @@ rm -rf $BUILDDIR mkdir $BUILDDIR cd $BUILDDIR -/usr/$1-w64-mingw32/bin/qt-cmake $BASEDIR -G Ninja -DWITH_QT6=ON $CMAKE_FLAGS +PREFIX=/usr/$1-w64-mingw32 +$PREFIX/bin/qt-cmake $BASEDIR \ + -G Ninja \ + -DWITH_QT6=ON \ + -DQT_TRANSLATIONS_DIR=$PREFIX/translations \ + $CMAKE_FLAGS if [ -z "$2" ] ; then ninja windows-binaries From d732747f1763ebb80d1dfac5c932a9e7e6e7d39b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Feb 2023 14:14:02 +0100 Subject: [PATCH 1454/1765] CMake: only disable LTO for 32 bit Windows builds 32 bit LTO builds have issues with GUIDs in WindowsNetworkFunctionc.cpp. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e5a4d9ba9..965f52e04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -218,7 +218,7 @@ elseif(WITH_UNITY_BUILD) set(CMAKE_UNITY_BUILD ON) endif() -if(VEYON_BUILD_WINDOWS) +if(VEYON_BUILD_WIN32) set(WITH_LTO OFF) endif() From 82ad14d2392fe58c5167193a4ef0c2a8b2088e6d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Feb 2023 14:18:34 +0100 Subject: [PATCH 1455/1765] CMake: WindowsInstaller: deploy OpenSSL 3 DLLs --- cmake/modules/WindowsInstaller.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/modules/WindowsInstaller.cmake b/cmake/modules/WindowsInstaller.cmake index 387f92e6f..9fcd94203 100644 --- a/cmake/modules/WindowsInstaller.cmake +++ b/cmake/modules/WindowsInstaller.cmake @@ -28,7 +28,7 @@ add_custom_target(windows-binaries COMMAND cp translations/*qm ${WINDOWS_INSTALL_FILES}/translations/ COMMAND cp ${DLLDIR}/libjpeg-62.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libpng16-16.dll ${WINDOWS_INSTALL_FILES} - COMMAND cp ${DLLDIR}/libcrypto-1_1*.dll ${DLLDIR}/libssl-1_1*.dll ${WINDOWS_INSTALL_FILES} + COMMAND cp ${DLLDIR}/libcrypto-3*.dll ${DLLDIR}/libssl-3*.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libqca-qt6.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libsasl2-3.dll ${WINDOWS_INSTALL_FILES} COMMAND cp ${DLLDIR}/libldap.dll ${DLLDIR}/liblber.dll ${WINDOWS_INSTALL_FILES} From 66771a4e5c54c4921d6b02f2f81841258f21cd34 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 23 Feb 2023 12:06:07 +0100 Subject: [PATCH 1456/1765] CI: install qt6-httpserver-devel for openSUSE Tumbleweed --- .ci/linux.opensuse.tumbleweed/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/linux.opensuse.tumbleweed/Dockerfile b/.ci/linux.opensuse.tumbleweed/Dockerfile index 3f905df67..7284aa48f 100644 --- a/.ci/linux.opensuse.tumbleweed/Dockerfile +++ b/.ci/linux.opensuse.tumbleweed/Dockerfile @@ -3,7 +3,7 @@ MAINTAINER Tobias Junghans RUN \ zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ - qt6-widgets-devel qt6-widgets-private-devel qt6-concurrent-devel qt6-linguist-devel qt6-tools-devel qt6-quickcontrols2-devel qt6-webenginewidgets-devel \ + qt6-widgets-devel qt6-widgets-private-devel qt6-concurrent-devel qt6-linguist-devel qt6-tools-devel qt6-quickcontrols2-devel qt6-webenginewidgets-devel qt6-httpserver-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg8-devel \ From 554bd2da1998258be109beedca2b25daf33f24b5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 2 Mar 2023 14:26:05 +0100 Subject: [PATCH 1457/1765] LockWidget: show fullscreen after raising on Linux As already implemented in 6f65b23cfed545d814cf11016e28652835743414 but effectively reverted in eb552df3805f5a1dcfe9ddb15db24ed004cb23cc the a fullscreen window needs to be shown normally first on Linux before raising it. Closes #824. --- core/src/LockWidget.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index 017596f4c..1cf238443 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -58,12 +58,20 @@ LockWidget::LockWidget( Mode mode, const QPixmap& background, QWidget* parent ) setWindowTitle( {} ); +#ifdef Q_OS_LINUX + show(); +#endif move(leftMostScreen->geometry().topLeft()); +#ifndef Q_OS_LINUX showFullScreen(); +#endif windowHandle()->setScreen(leftMostScreen); setFixedSize(leftMostScreen->virtualSize()); VeyonCore::platform().coreFunctions().raiseWindow(this, true); +#ifdef Q_OS_LINUX + showFullScreen(); +#endif setFocusPolicy( Qt::StrongFocus ); setFocus(); From ea6f55e92234a28780a4554a44e6cbf3b2fe197b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 8 Mar 2023 15:30:02 +0100 Subject: [PATCH 1458/1765] VeyonCore: add initUi() Set global style properties. --- core/src/VeyonCore.cpp | 16 ++++++++++++++++ core/src/VeyonCore.h | 1 + 2 files changed, 17 insertions(+) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index e0065cb42..9e3355cb6 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -91,6 +91,8 @@ VeyonCore::VeyonCore( QCoreApplication* application, Component component, const initLocaleAndTranslation(); + initUi(); + initCryptoCore(); initTlsConfiguration(); @@ -611,6 +613,20 @@ void VeyonCore::initLocaleAndTranslation() +void VeyonCore::initUi() +{ + auto app = qobject_cast(QCoreApplication::instance()); + if (app) + { + app->setStyleSheet(QStringLiteral( + "QToolButton:checked {background-color:#88ddff;}" + "QToolTip {color:#ffffff; background-color:#198cb3; padding:5px; border:0px;}" + )); + } +} + + + void VeyonCore::initCryptoCore() { m_cryptoCore = new CryptoCore; diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index cbffafd4b..aae9439e3 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -204,6 +204,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject void initConfiguration(); void initLogging( const QString& appComponentName ); void initLocaleAndTranslation(); + void initUi(); void initCryptoCore(); void initQmlCore(); void initAuthenticationCredentials(); From 29623980cdef501168909e314b733def3e9417a5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 8 Mar 2023 15:32:00 +0100 Subject: [PATCH 1459/1765] Core: ToolButton: refactor to simple QToolButton Use global application style. --- core/src/ToolButton.cpp | 312 +++------------------------------------- core/src/ToolButton.h | 73 +--------- 2 files changed, 18 insertions(+), 367 deletions(-) diff --git a/core/src/ToolButton.cpp b/core/src/ToolButton.cpp index 63ad80c4e..9b29e1e37 100644 --- a/core/src/ToolButton.cpp +++ b/core/src/ToolButton.cpp @@ -22,19 +22,10 @@ * */ -#include #include -#include -#include -#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0) -#include -#endif -#include -#include -#include -#include -#include +#include #include +#include #include "ToolButton.h" @@ -54,9 +45,10 @@ ToolButton::ToolButton( const QIcon& icon, { setShortcut( shortcut ); - setAttribute( Qt::WA_NoSystemBackground, true ); - - updateSize(); + setIcon(icon); + setText(label); + setAutoRaise(true); + setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextUnderIcon); } @@ -67,7 +59,7 @@ void ToolButton::setIconOnlyMode( QWidget* mainWindow, bool enabled ) const auto toolButtons = mainWindow->findChildren(); for( auto toolButton : toolButtons ) { - toolButton->updateSize(); + toolButton->setToolButtonStyle(enabled ? Qt::ToolButtonIconOnly : Qt::ToolButtonTextUnderIcon); } } @@ -81,56 +73,15 @@ void ToolButton::addTo( QToolBar* toolBar ) - #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) void ToolButton::enterEvent( QEnterEvent* event ) #else void ToolButton::enterEvent( QEvent* event ) #endif { - m_mouseOver = true; - if( !s_toolTipsDisabled && !m_label.isEmpty() && !m_descr.isEmpty() ) + if (!s_toolTipsDisabled && !m_descr.isEmpty()) { - auto toolTipPos = mapToGlobal( QPoint( 0, 0 ) ); -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) - const auto screenRect = QGuiApplication::screenAt( toolTipPos )->availableGeometry(); -#else - int screenNumber = QApplication::desktop()->isVirtualDesktop() ? - QApplication::desktop()->screenNumber( toolTipPos ) : - QApplication::desktop()->screenNumber( this ); - const auto screenRect = QApplication::desktop()->screenGeometry( screenNumber ); -#endif - - auto toolTip = new ToolButtonTip( m_icon.pixmap( 128, 128 ), m_label, m_descr, nullptr, this ); - connect( this, &ToolButton::mouseLeftButton, toolTip, &QWidget::close ); - - if( toolTipPos.x() + toolTip->width() > screenRect.x() + screenRect.width() ) - { - toolTipPos.rx() -= 4; - } - if( toolTipPos.y() + toolTip->height() > screenRect.y() + screenRect.height() ) - { - toolTipPos.ry() -= 30 + toolTip->height(); - } - if( toolTipPos.y() < screenRect.y() ) - { - toolTipPos.setY( screenRect.y() ); - } - if( toolTipPos.x() + toolTip->width() > screenRect.x() + screenRect.width() ) - { - toolTipPos.setX( screenRect.x() + screenRect.width() - toolTip->width() ); - } - if( toolTipPos.x() < screenRect.x() ) - { - toolTipPos.setX( screenRect.x() ); - } - if( toolTipPos.y() + toolTip->height() > screenRect.y() + screenRect.height() ) - { - toolTipPos.setY( screenRect.y() + screenRect.height() - toolTip->height() ); - } - - toolTip->move( toolTipPos += QPoint( -4, height() ) ); - toolTip->show(); + QToolTip::showText(mapToGlobal(QPoint(width() / 2, height())), m_descr, this); } QToolButton::enterEvent( event ); @@ -138,10 +89,9 @@ void ToolButton::enterEvent( QEvent* event ) - void ToolButton::leaveEvent( QEvent* event ) { - if( checkForLeaveEvent() ) + if (checkForLeaveEvent()) { QToolButton::leaveEvent( event ); } @@ -149,84 +99,22 @@ void ToolButton::leaveEvent( QEvent* event ) - void ToolButton::mousePressEvent( QMouseEvent* event ) { - Q_EMIT mouseLeftButton(); + QToolTip::hideText(); QToolButton::mousePressEvent( event ); } - -void ToolButton::paintEvent( QPaintEvent* ) +QSize ToolButton::sizeHint() const { - const bool active = isDown() || isChecked(); - - QPainter painter(this); - painter.setRenderHint(QPainter::SmoothPixmapTransform); - painter.setRenderHint(QPainter::Antialiasing); - painter.setPen(Qt::NoPen); - - QLinearGradient outlinebrush(0, 0, 0, height()); - QLinearGradient brush(0, 0, 0, height()); - - brush.setSpread(QLinearGradient::PadSpread); - QColor highlight(255, 255, 255, 70); - QColor shadow(0, 0, 0, 70); - QColor sunken(220, 220, 220, 30); - QColor normal1(255, 255, 245, 60); - QColor normal2(255, 255, 235, 10); - - if( active ) - { - outlinebrush.setColorAt( 0.0, shadow ); - outlinebrush.setColorAt( 1.0, highlight ); - brush.setColorAt( 0.0, sunken ); - painter.setPen(Qt::NoPen); - } - else - { - outlinebrush.setColorAt( 1.0, shadow ); - outlinebrush.setColorAt( 0.0, highlight ); - brush.setColorAt( 0.0, normal1 ); - if( m_mouseOver == false ) - { - brush.setColorAt( 1.0, normal2 ); - } - painter.setPen(QPen(outlinebrush, 1)); - } - - painter.setBrush(brush); - - painter.drawRoundedRect( rect(), roundness(), roundness() ); - - const int delta = active ? 1 : 0; - QPoint pixmapPos( ( width() - m_pixmap.width() ) / 2 + delta, margin() / 2 + delta ); - if( s_iconOnlyMode ) - { - pixmapPos.setY( ( height() - m_pixmap.height() ) / 2 - 1 + delta ); - } - painter.drawPixmap( pixmapPos, m_pixmap ); - - if( s_iconOnlyMode == false ) - { - const auto label = ( isChecked() && m_altLabel.isEmpty() == false ) ? m_altLabel : m_label; - const int labelX = 1 + ( width() - painter.fontMetrics().boundingRect( label ).width() ) / 2; - const int deltaNormal = delta - 1; - const int deltaShadow = deltaNormal + 1; - - painter.setPen( Qt::black ); - painter.drawText( labelX + deltaShadow, height() - margin() / 2 + deltaShadow, label ); - - painter.setPen( Qt::white ); - painter.drawText( labelX + deltaNormal, height() - margin() / 2 + deltaNormal, label ); - } + const auto sh = QToolButton::sizeHint(); + return QSize(std::max(sh.height() * 1.3, sh.width()), sh.height()); } - bool ToolButton::checkForLeaveEvent() { if( QRect( mapToGlobal( QPoint( 0, 0 ) ), size() ). @@ -236,177 +124,9 @@ bool ToolButton::checkForLeaveEvent() } else { - Q_EMIT mouseLeftButton(); - m_mouseOver = false; - + QToolTip::hideText(); return true; } - return false; -} - - - - -void ToolButton::updateSize() -{ - auto f = QApplication::font(); - f.setPointSizeF( qMax( 7.5, f.pointSizeF() * 0.9 ) ); - setFont( f ); - - m_pixelRatio = fontInfo().pixelSize() / fontInfo().pointSizeF(); - - const auto metrics = fontMetrics(); - - m_pixmap = m_icon.pixmap( static_cast( iconSize() ) ); - - if( s_iconOnlyMode ) - { - setFixedSize( margin() + iconSize(), margin() + iconSize() ); - } - else - { - const int textWidth = ( qMax( metrics.boundingRect( m_label ).width(), metrics.boundingRect( m_altLabel ).width() ) / stepSize() + 1 ) * stepSize(); - const int width = qMax( textWidth, iconSize() * 3 / 2 ); - const int height = iconSize() + fontInfo().pixelSize(); - setFixedSize( width + margin(), height + margin() ); - } -} - - - - - - - -ToolButtonTip::ToolButtonTip( const QIcon& icon, const QString &title, - const QString & _description, - QWidget * _parent, QWidget * _tool_btn ) : - QWidget( _parent, Qt::ToolTip ), - m_pixelRatio( fontInfo().pixelSize() / fontInfo().pointSizeF() ), - m_pixmap( icon.pixmap( static_cast( 64 * m_pixelRatio ) ) ), - m_title( title ), - m_description( _description ), - m_toolButton( _tool_btn ) -{ - setAttribute( Qt::WA_DeleteOnClose, true ); - setAttribute( Qt::WA_NoSystemBackground, true ); - - QTimer::singleShot( 0, this, [this]() { resize( sizeHint() ); } ); - - updateMask(); -} - - - -QSize ToolButtonTip::sizeHint() const -{ - auto f = font(); - f.setBold( true ); - - const auto titleWidth = QFontMetrics( f ).boundingRect( m_title ).width(); - const auto descriptionRect = fontMetrics().boundingRect( QRect( 0, 0, 250, 100 ), Qt::TextWordWrap, m_description ); - - return { margin() + m_pixmap.width() + margin() + qMax( titleWidth, descriptionRect.width() ) + margin(), - margin() + qMax( m_pixmap.height(), fontMetrics().height() + margin() + descriptionRect.height() ) + margin() }; -} - - - - -void ToolButtonTip::paintEvent( QPaintEvent* ) -{ - QPainter p( this ); - p.drawImage( 0, 0, m_bg ); -} - - - - -void ToolButtonTip::resizeEvent( QResizeEvent * _re ) -{ - const QColor color_frame = QColor( 48, 48, 48 ); - m_bg = QImage( size(), QImage::Format_ARGB32 ); - m_bg.fill( color_frame.rgba() ); - QPainter p( &m_bg ); - p.setRenderHint( QPainter::Antialiasing ); - QPen pen( color_frame ); - pen.setWidthF( 1.5 ); - p.setPen( pen ); - QLinearGradient grad( 0, 0, 0, height() ); - const QColor color_top = palette().color( QPalette::Active, - QPalette::Window ).lighter( 120 ); - grad.setColorAt( 0, color_top ); - grad.setColorAt( 1, palette().color( QPalette::Active, - QPalette::Window ). - lighter( 80 ) ); - p.setBrush( grad ); - p.drawRoundedRect( 0, 0, width() - 1, height() - 1, ROUNDED / width(), ROUNDED / height() ); - - if( m_toolButton ) - { - QPoint pt = m_toolButton->mapToGlobal( QPoint( 0, 0 ) ); - p.setPen( color_top ); - p.setBrush( color_top ); - p.setRenderHint( QPainter::Antialiasing, false ); - p.drawLine( pt.x() - x(), 0, - pt.x() + m_toolButton->width() - x() - 2, 0 ); - const int dx = pt.x() - x(); - p.setRenderHint( QPainter::Antialiasing, true ); - if( dx < 10 && dx >= 0 ) - { - p.setPen( pen ); - p.drawImage( dx+1, 0, m_bg.copy( 20, 0, 10-dx, 10 ) ); - p.drawImage( dx, 0, m_bg.copy( 0, 10, 1, 10-dx*2 ) ); - } - } - p.setPen( Qt::black ); - - p.drawPixmap( margin(), margin(), m_pixmap ); - QFont f = p.font(); - f.setBold( true ); - p.setFont( f ); - const auto titleX = margin() + m_pixmap.width() + margin(); - const auto titleY = margin() + fontMetrics().height() - 2; - p.drawText( titleX, titleY, m_title ); - - f.setBold( false ); - p.setFont( f ); - p.drawText( QRect( titleX, - titleY + margin(), - width() - margin() - titleX, - height() - margin() - titleY ), - Qt::TextWordWrap, m_description ); - - updateMask(); - QWidget::resizeEvent( _re ); -} - - - - -void ToolButtonTip::updateMask() -{ - // as this widget has not a rectangular shape AND is a top - // level widget (which doesn't allow painting only particular - // regions), we have to set a mask for it - QBitmap b( size() ); - b.clear(); - - QPainter p( &b ); - p.setBrush( Qt::color1 ); - p.setPen( Qt::color1 ); - p.drawRoundedRect( 0, 0, width() - 1, height() - 1, ROUNDED / width(), ROUNDED / height() ); - - if( m_toolButton ) - { - QPoint pt = m_toolButton->mapToGlobal( QPoint( 0, 0 ) ); - const int dx = pt.x()-x(); - if( dx < 10 && dx >= 0 ) - { - p.fillRect( dx, 0, 10, 10, Qt::color1 ); - } - } - - setMask( b ); + return false; } diff --git a/core/src/ToolButton.h b/core/src/ToolButton.h index c769e6ea0..d21ccb63b 100644 --- a/core/src/ToolButton.h +++ b/core/src/ToolButton.h @@ -60,8 +60,7 @@ class VEYON_CORE_EXPORT ToolButton : public QToolButton return s_toolTipsDisabled; } - void addTo( QToolBar * ); - + void addTo(QToolBar* toolBar); protected: #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) @@ -71,86 +70,18 @@ class VEYON_CORE_EXPORT ToolButton : public QToolButton #endif void leaveEvent( QEvent * _e ) override; void mousePressEvent( QMouseEvent * _me ) override; - void paintEvent( QPaintEvent * _pe ) override; - - -Q_SIGNALS: - void mouseLeftButton(); - + QSize sizeHint() const override; private: bool checkForLeaveEvent(); - void updateSize(); - static bool s_toolTipsDisabled; static bool s_iconOnlyMode; - int iconSize() const - { - return static_cast( 32 * m_pixelRatio ); - } - - int margin() const - { - return static_cast( 8 * m_pixelRatio ); - } - - int roundness() const - { - return static_cast( 3 * m_pixelRatio ); - } - - int stepSize() const - { - return static_cast( 8 * m_pixelRatio ); - } - - qreal m_pixelRatio{1}; QIcon m_icon; - QPixmap m_pixmap; - bool m_mouseOver{false}; QString m_label; QString m_altLabel; QString m_descr; } ; - - - -class ToolButtonTip : public QWidget -{ - Q_OBJECT -public: - ToolButtonTip( const QIcon& icon, const QString& title, const QString& description, - QWidget* parent, QWidget* toolButton = nullptr ); - - QSize sizeHint( void ) const override; - - -protected: - void paintEvent( QPaintEvent * _pe ) override; - void resizeEvent( QResizeEvent * _re ) override; - - -private: - void updateMask( void ); - - int margin() const - { - return static_cast( 8 * m_pixelRatio ); - } - - const int ROUNDED = 2000; - - qreal m_pixelRatio{1}; - QPixmap m_pixmap; - QString m_title; - QString m_description; - - QImage m_bg; - - QWidget* m_toolButton; - -} ; From 4aa3a9882be720f87eabf9bbb66b5928938c97f4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 8 Mar 2023 16:50:52 +0100 Subject: [PATCH 1460/1765] Master: refactor icon size management and use native toolbar style This improves High DPI support especially for Qt 6.5. --- core/resources/core.qrc | 1 - core/resources/toolbar-background.png | Bin 223 -> 0 bytes master/src/MainToolBar.cpp | 20 +------ master/src/MainToolBar.h | 1 - master/src/MainWindow.cpp | 6 ++ master/src/MainWindow.ui | 60 -------------------- master/src/ScreenshotManagementPanel.ui | 16 ------ master/src/SlideshowPanel.ui | 18 ------ master/src/SpotlightPanel.ui | 18 ------ plugins/remoteaccess/RemoteAccessWidget.cpp | 8 +-- server/src/main.cpp | 1 - 11 files changed, 11 insertions(+), 138 deletions(-) delete mode 100644 core/resources/toolbar-background.png diff --git a/core/resources/core.qrc b/core/resources/core.qrc index d8cf5f885..756dcb02e 100644 --- a/core/resources/core.qrc +++ b/core/resources/core.qrc @@ -10,7 +10,6 @@ icon16.png icon22.png icon32.png - toolbar-background.png document-open.png document-save.png list-add.png diff --git a/core/resources/toolbar-background.png b/core/resources/toolbar-background.png deleted file mode 100644 index c6c5bf5180a3788464fbefb258d34e648580485a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^HXzK%3?vzhybXaQV{wqX6T`Z5GB1G~wg8_HS2Hs+ zCnu++&mM0CNhf)`yD)UH%6b4foCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#7P|yLqxLiQ zom+uIk|nMYCC>S|xv6<249-QVi6yBi3gww484B*6z5(HleBwYwx}GkMAsXkCSM2*< z`~LTKLqG#ZcvM)cO;lv*O1c^|aNg~V)hXbk)yy=zy2Gq#l>FVdQ I&MBb@0I #include -#include -#include #include "MainToolBar.h" #include "MainWindow.h" @@ -36,9 +35,7 @@ MainToolBar::MainToolBar( QWidget* parent ) : QToolBar( tr( "Configuration" ), parent ), m_mainWindow( dynamic_cast( parent ) ) { - QPalette pal = palette(); - pal.setBrush( QPalette::Window, QPixmap( QStringLiteral(":/core/toolbar-background.png") ) ); - setPalette( pal ); + setIconSize(QSize(48, 48) / qGuiApp->devicePixelRatio()); ToolButton::setToolTipsDisabled( m_mainWindow->masterCore().userConfig().noToolTips() ); ToolButton::setIconOnlyMode( m_mainWindow, m_mainWindow->masterCore().userConfig().toolButtonIconOnlyMode() ); @@ -50,7 +47,7 @@ void MainToolBar::contextMenuEvent( QContextMenuEvent* event ) { QMenu menu( this ); - auto toolTipAction = menu.addAction( tr( "Disable balloon tooltips" ), this, &MainToolBar::toggleToolTips ); + auto toolTipAction = menu.addAction(tr("Disable tooltips"), this, &MainToolBar::toggleToolTips); toolTipAction->setCheckable( true ); toolTipAction->setChecked( m_mainWindow->masterCore().userConfig().noToolTips() ); @@ -63,17 +60,6 @@ void MainToolBar::contextMenuEvent( QContextMenuEvent* event ) -void MainToolBar::paintEvent( QPaintEvent* event ) -{ - QPainter p( this ); - p.setPen( QColor( 48, 48, 48 ) ); - p.fillRect( event->rect(), palette().brush( QPalette::Window ) ); - p.drawLine( 0, 0, width(), 0 ); - p.drawLine( 0, height()-1, width(), height()-1 ); -} - - - void MainToolBar::toggleToolTips() { bool newToolTipState = !m_mainWindow->masterCore().userConfig().noToolTips(); diff --git a/master/src/MainToolBar.h b/master/src/MainToolBar.h index ec0e0623d..1db27fef5 100644 --- a/master/src/MainToolBar.h +++ b/master/src/MainToolBar.h @@ -40,7 +40,6 @@ class MainToolBar : public QToolBar void toggleIconMode(); void contextMenuEvent( QContextMenuEvent* event ) override; - void paintEvent( QPaintEvent* event ) override; MainWindow* m_mainWindow; diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index eead1f7e6..7f7afef7c 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -235,6 +235,12 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : ui->spotlightPanelButton->setChecked (isVisible); } ); + const auto toolButtons = findChildren(); + for(auto* btn : toolButtons) + { + btn->setIconSize(QSize(32, 32) / qGuiApp->devicePixelRatio()); + } + // create the main toolbar ui->toolBar->layout()->setSpacing( 2 ); ui->toolBar->toggleViewAction()->setEnabled( false ); diff --git a/master/src/MainWindow.ui b/master/src/MainWindow.ui index 1c8555c5e..e7418b4b1 100644 --- a/master/src/MainWindow.ui +++ b/master/src/MainWindow.ui @@ -55,12 +55,6 @@ :/master/zoom-fit-best.png:/master/zoom-fit-best.png - - - 32 - 32 - - true @@ -125,12 +119,6 @@ :/core/help-about.png:/core/help-about.png - - - 32 - 32 - - @@ -187,12 +175,6 @@ :/master/align-grid.png:/master/align-grid.png - - - 32 - 32 - - @@ -210,12 +192,6 @@ :/master/exchange-positions-zorder.png:/master/exchange-positions-zorder.png - - - 32 - 32 - - true @@ -246,12 +222,6 @@ :/master/powered-on.png:/master/powered-on.png - - - 32 - 32 - - true @@ -293,12 +263,6 @@ :/master/computers.png:/master/computers.png - - - 32 - 32 - - true @@ -319,12 +283,6 @@ :/master/camera-photo.png:/master/camera-photo.png - - - 32 - 32 - - true @@ -345,12 +303,6 @@ :/master/computer-slideshow.png:/master/computer-slideshow.png - - - 32 - 32 - - true @@ -368,12 +320,6 @@ :/master/spotlight.png:/master/spotlight.png - - - 32 - 32 - - true @@ -400,12 +346,6 @@ :/core/user-group-new.png:/core/user-group-new.png - - - 32 - 32 - - true diff --git a/master/src/ScreenshotManagementPanel.ui b/master/src/ScreenshotManagementPanel.ui index 2784fbcf7..7832c7872 100644 --- a/master/src/ScreenshotManagementPanel.ui +++ b/master/src/ScreenshotManagementPanel.ui @@ -38,7 +38,6 @@ - 75 true @@ -57,7 +56,6 @@ - 75 true @@ -70,7 +68,6 @@ - 75 true @@ -86,7 +83,6 @@ - 75 true @@ -108,12 +104,6 @@ :/core/edit-find.png:/core/edit-find.png - - - 22 - 22 - - @@ -125,12 +115,6 @@ :/core/edit-delete.png:/core/edit-delete.png - - - 22 - 22 - - diff --git a/master/src/SlideshowPanel.ui b/master/src/SlideshowPanel.ui index eab8e1320..4b5ffd1e5 100644 --- a/master/src/SlideshowPanel.ui +++ b/master/src/SlideshowPanel.ui @@ -45,12 +45,6 @@ :/core/go-previous.png:/core/go-previous.png - - - 32 - 32 - - @@ -63,12 +57,6 @@ :/core/media-playback-start.png :/core/media-playback-pause.png:/core/media-playback-start.png - - - 32 - 32 - - true @@ -86,12 +74,6 @@ :/core/go-next.png:/core/go-next.png - - - 32 - 32 - - diff --git a/master/src/SpotlightPanel.ui b/master/src/SpotlightPanel.ui index 09c3fae88..7c3a8b9b7 100644 --- a/master/src/SpotlightPanel.ui +++ b/master/src/SpotlightPanel.ui @@ -140,12 +140,6 @@ The second button removes the selected or last computer. :/core/go-up.png:/core/go-up.png - - - 32 - 32 - - @@ -157,12 +151,6 @@ The second button removes the selected or last computer. :/core/go-down.png:/core/go-down.png - - - 32 - 32 - - @@ -188,12 +176,6 @@ The second button removes the selected or last computer. :/master/update-realtime-disabled.png :/master/update-realtime-enabled.png:/master/update-realtime-disabled.png - - - 32 - 32 - - true diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 987e106b5..bc2a68139 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -57,10 +57,6 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent m_exitButton( new ToolButton( QPixmap( QStringLiteral(":/remoteaccess/application-exit.png") ), tr( "Exit" ) ) ), m_screenSelectActions( new QActionGroup(this) ) { - QPalette pal = palette(); - pal.setBrush( QPalette::Window, QPixmap( QStringLiteral(":/core/toolbar-background.png") ) ); - setPalette( pal ); - setAttribute( Qt::WA_NoSystemBackground, true ); move( 0, 0 ); show(); @@ -118,7 +114,7 @@ RemoteAccessWidgetToolBar::RemoteAccessWidgetToolBar( RemoteAccessWidget* parent layout->addWidget( m_exitButton ); layout->addSpacing( 5 ); - setFixedHeight( m_exitButton->height() ); + setFixedHeight(m_exitButton->minimumSizeHint().height()); connect( &m_showHideTimeLine, &QTimeLine::valueChanged, this, &RemoteAccessWidgetToolBar::updatePosition ); @@ -206,7 +202,7 @@ void RemoteAccessWidgetToolBar::paintEvent( QPaintEvent *paintEv ) f.setBold( true ); p.setFont( f ); - p.setPen( QColor( 192, 192, 192 ) ); + p.setPen(palette().color(QPalette::Text)); p.drawText( height() / 2, height() / 2 + fontMetrics().height() / 2, m_parent->vncView() && m_parent->vncView()->connection() && m_parent->vncView()->connection()->state() == VncConnection::State::Connected ? diff --git a/server/src/main.cpp b/server/src/main.cpp index 83bbe6732..5450db9e1 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -25,7 +25,6 @@ #include #include "ComputerControlServer.h" -#include "VeyonConfiguration.h" int main( int argc, char **argv ) From 42f176944333f8ece86b080431472cb20dcdc69b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Mar 2023 13:52:56 +0100 Subject: [PATCH 1461/1765] VeyonCore: add UiStyle enum --- core/src/VeyonCore.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index aae9439e3..b73ed3a05 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -94,6 +94,12 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject }; Q_ENUM(Component) + enum class UiStyle { + Fusion, + Native + }; + Q_ENUM(UiStyle) + static constexpr char RfbSecurityTypeVeyon = 40; VeyonCore( QCoreApplication* application, Component component, const QString& appComponentName ); From 2ca4cc4f2781f84aeba7843d094ec4cb666075f4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Mar 2023 13:53:14 +0100 Subject: [PATCH 1462/1765] VeyonConfiguration: add uiStyle property --- core/src/VeyonConfigurationProperties.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index b80834eb7..e9b71b731 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -56,7 +56,8 @@ #define FOREACH_VEYON_UI_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QString, applicationName, setApplicationName, "ApplicationName", "UI", QStringLiteral("Veyon"), Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), QString, uiLanguage, setUiLanguage, "Language", "UI", QString(), Configuration::Property::Flag::Standard ) + OP( VeyonConfiguration, VeyonCore::config(), QString, uiLanguage, setUiLanguage, "Language", "UI", QString(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::UiStyle, uiStyle, setUiStyle, "Style", "UI", QVariant::fromValue(VeyonCore::UiStyle::Fusion), Configuration::Property::Flag::Standard ) #define FOREACH_VEYON_SERVICE_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, isTrayIconHidden, setTrayIconHidden, "HideTrayIcon", "Service", false, Configuration::Property::Flag::Advanced ) \ From 0abfae3f99ca2bd9b86be49b9da7f9d74d826851 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Mar 2023 13:53:40 +0100 Subject: [PATCH 1463/1765] VeyonCore: set fusion UI style for application --- core/src/VeyonCore.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 9e3355cb6..b6bad069c 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -33,8 +33,10 @@ #include #include #include +#include #include #include +#include #include #include "AuthenticationCredentials.h" @@ -618,6 +620,11 @@ void VeyonCore::initUi() auto app = qobject_cast(QCoreApplication::instance()); if (app) { + if (m_config->uiStyle() == UiStyle::Fusion) + { + app->setStyle(QStyleFactory::create(QStringLiteral("Fusion"))); + } + app->setStyleSheet(QStringLiteral( "QToolButton:checked {background-color:#88ddff;}" "QToolTip {color:#ffffff; background-color:#198cb3; padding:5px; border:0px;}" From 088c8736d403099cca9b74aba1fa6842101dbdff Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Mar 2023 13:54:13 +0100 Subject: [PATCH 1464/1765] GeneralConfigurationPage: add UI style combobox --- configurator/src/GeneralConfigurationPage.ui | 36 ++++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index 2146da848..00d2d4712 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -15,13 +15,6 @@ User interface - - - - Language: - - - @@ -40,6 +33,13 @@ + + + + Language: + + + @@ -47,6 +47,27 @@ + + + + Style: + + + + + + + + Fusion + + + + + Native + + + + @@ -345,6 +366,7 @@ applicationName uiLanguage + uiStyle logFileDirectory openLogFileDirectory logLevel From fa17a849033aba00c1211539d170a3a8621ab732 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Mar 2023 14:13:13 +0100 Subject: [PATCH 1465/1765] 3rdparty: ultravnc: update submodule (1.4.0.9) --- 3rdparty/ultravnc | 2 +- plugins/platform/windows/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 100dec60d..628a23a45 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 100dec60db6f49fe10c951ef422bfabf0efe598a +Subproject commit 628a23a45874e587cba31c650abb60d5931f4257 diff --git a/plugins/platform/windows/CMakeLists.txt b/plugins/platform/windows/CMakeLists.txt index d00117973..412f2cc59 100644 --- a/plugins/platform/windows/CMakeLists.txt +++ b/plugins/platform/windows/CMakeLists.txt @@ -56,7 +56,7 @@ target_include_directories(windows-platform PRIVATE ${ultravnc_DIR} ) -target_link_libraries(windows-platform PRIVATE -lws2_32 -lwtsapi32 -lnetapi32 -luserenv -linterception -liphlpapi) +target_link_libraries(windows-platform PRIVATE -lws2_32 -lwtsapi32 -lnetapi32 -luserenv -limm32 -linterception -liphlpapi) target_link_libraries(windows-platform PRIVATE Qt${QT_MAJOR_VERSION}::GuiPrivate) target_compile_definitions(windows-platform PRIVATE ULTRAVNC_VEYON_SUPPORT) target_compile_options(windows-platform PRIVATE "-Wno-unknown-pragmas") From 642b0fd9460ab5b92d5d62fd97ce0f51c9e0b595 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 24 Mar 2023 15:23:30 +0100 Subject: [PATCH 1466/1765] Demo: add lower limit for calculated bandwidth Otherwise a division by zero can happen when calculating the new quality. --- plugins/demo/DemoServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 414377202..21c896e4f 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -246,7 +246,7 @@ void DemoServer::enqueueFramebufferUpdateMessage( const QByteArray& message ) if( m_keyFrameTimer.elapsed() > 1 ) { const auto memTotal = queueSize / 1024; - const auto bandwidth = (memTotal * 1000) / m_keyFrameTimer.elapsed(); + const auto bandwidth = qMax(1, (memTotal * 1000) / m_keyFrameTimer.elapsed()); const auto clientCount = qMin(1, findChildren().count()); const auto totalBandwidth = bandwidth * clientCount; From 3d841ed75b27d281b8aa0a758f267b2acee6040c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Mar 2023 12:03:26 +0200 Subject: [PATCH 1467/1765] GeneralConfigurationPage: don't translate Fusion style name --- configurator/src/GeneralConfigurationPage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index 00d2d4712..607249d3c 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -58,7 +58,7 @@ - Fusion + Fusion From 327ff77d1d55f3fc639b0fa5a3429779a58430d8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 Mar 2023 14:07:39 +0200 Subject: [PATCH 1468/1765] VeyonConnection: remove unused member variables and getters --- core/src/VeyonConnection.cpp | 4 +--- core/src/VeyonConnection.h | 13 ------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 4b8e72b89..e4160bfe7 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -50,9 +50,7 @@ rfbBool handleVeyonMessage( rfbClient* client, rfbServerToClientMsg* msg ) -VeyonConnection::VeyonConnection(): - m_user(), - m_userHomeDir() +VeyonConnection::VeyonConnection() { if( __veyonProtocolExt == nullptr ) { diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index 0ec7f5b78..39502dade 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -54,16 +54,6 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject return m_vncConnection && m_vncConnection->isConnected(); } - const QString& user() const - { - return m_user; - } - - const QString& userHomeDir() const - { - return m_userHomeDir; - } - void sendFeatureMessage(const FeatureMessage& featureMessage); bool handleServerMessage( rfbClient* client, uint8_t msg ); @@ -86,7 +76,4 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject VncConnection* m_vncConnection{new VncConnection}; - QString m_user; - QString m_userHomeDir; - } ; From 8b78527fad3d6ccd04efb335c548ef117821ce09 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 10:21:08 +0200 Subject: [PATCH 1469/1765] NetworkObjectOverlayDataModel: add support for multiple columns --- master/src/ComputerManager.cpp | 2 +- master/src/NetworkObjectOverlayDataModel.cpp | 27 ++++++++++++++------ master/src/NetworkObjectOverlayDataModel.h | 4 +-- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index d7c2912bf..bf08f1940 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -45,7 +45,7 @@ ComputerManager::ComputerManager( UserConfig& config, QObject* parent ) : m_config( config ), m_networkObjectDirectory( VeyonCore::networkObjectDirectoryManager().configuredDirectory() ), m_networkObjectModel( new NetworkObjectTreeModel( m_networkObjectDirectory, this ) ), - m_networkObjectOverlayDataModel( new NetworkObjectOverlayDataModel( tr( "User" ), this ) ), + m_networkObjectOverlayDataModel(new NetworkObjectOverlayDataModel({tr("User")}, this)), m_computerTreeModel( new CheckableItemProxyModel( NetworkObjectModel::UidRole, this ) ), m_networkObjectFilterProxyModel( new NetworkObjectFilterProxyModel( this ) ), m_localHostNames( QHostInfo::localHostName().toLower() ), diff --git a/master/src/NetworkObjectOverlayDataModel.cpp b/master/src/NetworkObjectOverlayDataModel.cpp index 8c42d7974..2c133cb8f 100644 --- a/master/src/NetworkObjectOverlayDataModel.cpp +++ b/master/src/NetworkObjectOverlayDataModel.cpp @@ -31,8 +31,7 @@ #endif -NetworkObjectOverlayDataModel::NetworkObjectOverlayDataModel( const QString& overlayDataHeader, - QObject *parent ) : +NetworkObjectOverlayDataModel::NetworkObjectOverlayDataModel(const QStringList& overlayDataHeaders, QObject *parent) : KExtraColumnsProxyModel( parent ), m_overlayDataRole( Qt::DisplayRole ) { @@ -41,14 +40,17 @@ NetworkObjectOverlayDataModel::NetworkObjectOverlayDataModel( const QString& ove setSourceModel( new QStandardItemModel( this ) ); new QAbstractItemModelTester( this, QAbstractItemModelTester::FailureReportingMode::Warning, this ); #endif - appendColumn( overlayDataHeader ); + for (const auto& header : overlayDataHeaders) + { + appendColumn(header); + } } QVariant NetworkObjectOverlayDataModel::extraColumnData(const QModelIndex &parent, int row, int extraColumn, int role) const { - if( extraColumn != 0 || role != m_overlayDataRole ) + if (role != m_overlayDataRole) { return {}; } @@ -57,25 +59,34 @@ QVariant NetworkObjectOverlayDataModel::extraColumnData(const QModelIndex &paren if( networkObjectUid.isNull() == false && m_overlayData.contains( networkObjectUid ) ) { - return m_overlayData[networkObjectUid]; + return m_overlayData[networkObjectUid].value(extraColumn); } return {}; } + bool NetworkObjectOverlayDataModel::setExtraColumnData( const QModelIndex &parent, int row, int extraColumn, const QVariant &data, int role) { - if( extraColumn != 0 || role != m_overlayDataRole ) + if (role != m_overlayDataRole) { return false; } const auto networkObjectUid = KExtraColumnsProxyModel::data( index( row, 0, parent ), NetworkObjectModel::UidRole ).toUuid(); + auto& rowData = m_overlayData[networkObjectUid]; // clazy:exclude=detaching-member - if( m_overlayData[networkObjectUid] != data ) + if (extraColumn >= rowData.count() || + rowData[extraColumn] != data) { - m_overlayData[networkObjectUid] = data; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + rowData.resize(extraColumn+1); +#else + std::fill_n(std::back_inserter(rowData), extraColumn + 1 - rowData.size(), QVariant{}); +#endif + rowData[extraColumn] = data; + m_overlayData[networkObjectUid] = rowData; extraColumnDataChanged( parent, row, extraColumn, { m_overlayDataRole } ); } diff --git a/master/src/NetworkObjectOverlayDataModel.h b/master/src/NetworkObjectOverlayDataModel.h index 1f57ec11c..559bf5f14 100644 --- a/master/src/NetworkObjectOverlayDataModel.h +++ b/master/src/NetworkObjectOverlayDataModel.h @@ -31,7 +31,7 @@ class NetworkObjectOverlayDataModel : public KExtraColumnsProxyModel { Q_OBJECT public: - explicit NetworkObjectOverlayDataModel( const QString& overlayDataHeader, + explicit NetworkObjectOverlayDataModel( const QStringList& overlayDataHeaders, QObject *parent = nullptr ); QVariant extraColumnData( const QModelIndex &parent, int row, int extraColumn, int role ) const override; @@ -41,6 +41,6 @@ class NetworkObjectOverlayDataModel : public KExtraColumnsProxyModel private: int m_overlayDataRole; - QHash m_overlayData; + QHash> m_overlayData; }; From fd559be5c64d4dca79c63a4bafff98c8b64deda8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 10:25:11 +0200 Subject: [PATCH 1470/1765] MonitoringMode: shorten internal name for user info query feature --- core/src/MonitoringMode.cpp | 24 ++++++++++++------------ core/src/MonitoringMode.h | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 69facea10..a9ea72336 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -51,16 +51,16 @@ MonitoringMode::MonitoringMode( QObject* parent ) : Feature::Flag::Service | Feature::Flag::Builtin, Feature::Uid{"a0a96fba-425d-414a-aaf4-352b76d7c4f3"}, {}, tr("Query active features"), {}, {} ), - m_queryLoggedOnUserInfoFeature( QStringLiteral("UserSessionInfo"), - Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Builtin, - Feature::Uid( "79a5e74d-50bd-4aab-8012-0e70dc08cc72" ), - Feature::Uid(), {}, {}, {} ), + m_queryUserInfoFeature(QStringLiteral("UserInfo"), + Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Builtin, + Feature::Uid("79a5e74d-50bd-4aab-8012-0e70dc08cc72"), + Feature::Uid(), {}, {}, {} ), m_queryScreensFeature( QStringLiteral("QueryScreens"), Feature::Flag::Meta, Feature::Uid("d5bbc486-7bc5-4c36-a9a8-1566c8b0091a"), Feature::Uid(), tr("Query properties of remotely available screens"), {}, {} ), m_features({ m_monitoringModeFeature, m_queryApplicationVersionFeature, m_queryActiveFeatures, - m_queryLoggedOnUserInfoFeature, m_queryScreensFeature }) + m_queryUserInfoFeature, m_queryScreensFeature}) { if(VeyonCore::component() == VeyonCore::Component::Server) { @@ -108,9 +108,9 @@ void MonitoringMode::queryActiveFeatures(const ComputerControlInterfaceList& com -void MonitoringMode::queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ) +void MonitoringMode::queryUserInfo(const ComputerControlInterfaceList& computerControlInterfaces) { - sendFeatureMessage(FeatureMessage{m_queryLoggedOnUserInfoFeature.uid()}, computerControlInterfaces); + sendFeatureMessage(FeatureMessage{m_queryUserInfoFeature.uid()}, computerControlInterfaces); } @@ -158,7 +158,7 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com return true; } - if( message.featureUid() == m_queryLoggedOnUserInfoFeature.uid() ) + if( message.featureUid() == m_queryUserInfoFeature.uid() ) { computerControlInterface->setUserInformation( message.argument( Argument::UserLoginName ).toString(), message.argument( Argument::UserFullName ).toString(), @@ -223,7 +223,7 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, return sendActiveFeatures(server, messageContext); } - if (message.featureUid() == m_queryLoggedOnUserInfoFeature.uid()) + if (message.featureUid() == m_queryUserInfoFeature.uid()) { return sendUserInformation(server, messageContext); } @@ -271,15 +271,15 @@ void MonitoringMode::sendAsyncFeatureMessages(VeyonServerInterface& server, cons bool MonitoringMode::sendActiveFeatures(VeyonServerInterface& server, const MessageContext& messageContext) { return server.sendFeatureMessageReply(messageContext, - FeatureMessage{m_queryActiveFeatures.uid()} - .addArgument(Argument::ActiveFeaturesList, m_activeFeatures)); + FeatureMessage{m_queryActiveFeatures.uid()} + .addArgument(Argument::ActiveFeaturesList, m_activeFeatures)); } bool MonitoringMode::sendUserInformation(VeyonServerInterface& server, const MessageContext& messageContext) { - FeatureMessage message{m_queryLoggedOnUserInfoFeature.uid()}; + FeatureMessage message{m_queryUserInfoFeature.uid()}; m_userDataLock.lockForRead(); if (m_userLoginName.isEmpty()) diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 0fe5acb02..d493f135c 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -96,7 +96,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void queryActiveFeatures(const ComputerControlInterfaceList& computerControlInterfaces); - void queryLoggedOnUserInfo( const ComputerControlInterfaceList& computerControlInterfaces ); + void queryUserInfo(const ComputerControlInterfaceList& computerControlInterfaces); void queryScreens( const ComputerControlInterfaceList& computerControlInterfaces ); @@ -155,7 +155,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac const Feature m_monitoringModeFeature; const Feature m_queryApplicationVersionFeature; const Feature m_queryActiveFeatures; - const Feature m_queryLoggedOnUserInfoFeature; + const Feature m_queryUserInfoFeature; const Feature m_queryScreensFeature; const FeatureList m_features; From 227c316e3a06916ee02b4bf00dbfccda8e8f0c92 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 11:54:19 +0200 Subject: [PATCH 1471/1765] PlatformSessionFunctions: add more session info retrieval methods --- core/src/PlatformSessionFunctions.h | 7 ++ .../platform/linux/LinuxSessionFunctions.cpp | 29 ++++++++ .../platform/linux/LinuxSessionFunctions.h | 5 ++ .../windows/WindowsSessionFunctions.cpp | 33 +++++++++ .../windows/WindowsSessionFunctions.h | 5 ++ .../platform/windows/WtsSessionManager.cpp | 73 ++++++++++++++++--- plugins/platform/windows/WtsSessionManager.h | 3 + 7 files changed, 144 insertions(+), 11 deletions(-) diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index b67828f56..b604d0d57 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -32,14 +32,21 @@ class PlatformSessionFunctions { public: using SessionId = int; + using SessionUptime = qint64; static constexpr SessionId DefaultSessionId = 0; static constexpr SessionId InvalidSessionId = -1; + static constexpr SessionUptime InvalidSessionUptime = -1; virtual ~PlatformSessionFunctions() = default; virtual SessionId currentSessionId() = 0; + virtual PlatformSessionFunctions::SessionUptime currentSessionUptime() const = 0; + virtual QString currentSessionClientAddress() const = 0; + virtual QString currentSessionClientName() const = 0; + virtual QString currentSessionHostName() const = 0; + virtual QString currentSessionType() const = 0; virtual bool currentSessionHasUser() const = 0; virtual bool currentSessionIsRemote() const = 0; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index d9b13de27..b9597493f 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #ifdef HAVE_LIBPROCPS @@ -42,6 +43,34 @@ LinuxSessionFunctions::SessionId LinuxSessionFunctions::currentSessionId() +LinuxSessionFunctions::SessionUptime LinuxSessionFunctions::currentSessionUptime() const +{ + return getSessionUptimeSeconds(currentSessionPath()); +} + + + +QString LinuxSessionFunctions::currentSessionClientAddress() const +{ + return getSessionProperty(currentSessionPath(), QStringLiteral("RemoteHost")).toString(); +} + + + +QString LinuxSessionFunctions::currentSessionClientName() const +{ + return currentSessionClientAddress(); +} + + + +QString LinuxSessionFunctions::currentSessionHostName() const +{ + return QHostInfo::localHostName(); +} + + + QString LinuxSessionFunctions::currentSessionType() const { const auto env = QProcessEnvironment::systemEnvironment(); diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 073993464..57f4a1362 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -81,6 +81,11 @@ class LinuxSessionFunctions : public PlatformSessionFunctions SessionId currentSessionId() override; + LinuxSessionFunctions::SessionUptime currentSessionUptime() const override; + QString currentSessionClientAddress() const override; + QString currentSessionClientName() const override; + QString currentSessionHostName() const override; + QString currentSessionType() const override; bool currentSessionHasUser() const override; bool currentSessionIsRemote() const override; diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 490a24b21..0e71a05bc 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -22,6 +22,8 @@ * */ +#include + #include "PlatformSessionManager.h" #include "WindowsSessionFunctions.h" #include "WtsSessionManager.h" @@ -41,6 +43,37 @@ WindowsSessionFunctions::SessionId WindowsSessionFunctions::currentSessionId() +WindowsSessionFunctions::SessionUptime WindowsSessionFunctions::currentSessionUptime() const +{ + return WtsSessionManager::querySessionInformation(WtsSessionManager::currentSession(), + WtsSessionManager::SessionInfo::SessionUptime).toLongLong(); +} + + + +QString WindowsSessionFunctions::currentSessionClientAddress() const +{ + return WtsSessionManager::querySessionInformation(WtsSessionManager::currentSession(), + WtsSessionManager::SessionInfo::ClientAddress); +} + + + +QString WindowsSessionFunctions::currentSessionClientName() const +{ + return WtsSessionManager::querySessionInformation(WtsSessionManager::currentSession(), + WtsSessionManager::SessionInfo::ClientName); +} + + + +QString WindowsSessionFunctions::currentSessionHostName() const +{ + return QHostInfo::localHostName(); +} + + + QString WindowsSessionFunctions::currentSessionType() const { if(WtsSessionManager::currentSession() == WtsSessionManager::activeConsoleSession() ) diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index 2b9e7df62..a9197d367 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -33,6 +33,11 @@ class WindowsSessionFunctions : public PlatformSessionFunctions public: SessionId currentSessionId() override; + WindowsSessionFunctions::SessionUptime currentSessionUptime() const override; + QString currentSessionClientAddress() const override; + QString currentSessionClientName() const override; + QString currentSessionHostName() const override; + QString currentSessionType() const override; bool currentSessionHasUser() const override; bool currentSessionIsRemote() const override; diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 96b31fc15..71b4ac599 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -69,7 +69,7 @@ WtsSessionManager::SessionList WtsSessionManager::activeSessions() const auto session = &sessions[sessionIndex]; if( session->State == WTSActive || QString::fromWCharArray(session->pWinStationName) - .compare( QLatin1String("multiseat"), Qt::CaseInsensitive ) == 0 ) + .compare( QLatin1String("multiseat"), Qt::CaseInsensitive ) == 0 ) { sessionList.append( session->SessionId ); } @@ -82,33 +82,84 @@ WtsSessionManager::SessionList WtsSessionManager::activeSessions() -QString WtsSessionManager::querySessionInformation( SessionId sessionId, SessionInfo sessionInfo ) +QString WtsSessionManager::querySessionInformation(SessionId sessionId, SessionInfo sessionInfo) { - if( sessionId == InvalidSession ) + if (sessionId == InvalidSession) { vCritical() << "called with invalid session ID"; return {}; } - WTS_INFO_CLASS infoClass = WTSInitialProgram; + WTS_INFO_CLASS infoClass{}; - switch( sessionInfo ) + switch (sessionInfo) { case SessionInfo::UserName: infoClass = WTSUserName; break; case SessionInfo::DomainName: infoClass = WTSDomainName; break; + case SessionInfo::SessionUptime: infoClass = WTSSessionInfo; break; + case SessionInfo::ClientAddress: infoClass = WTSClientAddress; break; + case SessionInfo::ClientName: infoClass = WTSClientName; break; default: vCritical() << "invalid session info" << sessionInfo << "requested"; return {}; } QString result; - LPWSTR pBuffer = nullptr; - DWORD dwBufferLen; + LPWSTR queryBuffer = nullptr; + DWORD bufferLen; - if( WTSQuerySessionInformation( WTS_CURRENT_SERVER_HANDLE, sessionId, infoClass, - &pBuffer, &dwBufferLen ) ) + if (WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionId, infoClass, &queryBuffer, &bufferLen)) { - result = QString::fromWCharArray( pBuffer ); + switch (infoClass) + { + case WTSClientAddress: + { + const auto clientAddress = PWTS_CLIENT_ADDRESS(queryBuffer); + switch (clientAddress->AddressFamily) + { + case AF_UNSPEC: + result = QString::fromLatin1(reinterpret_cast(clientAddress->Address)); + break; + case AF_INET: + result = QStringLiteral("%1.%2.%3.%4") + .arg(int(clientAddress->Address[2])) + .arg(int(clientAddress->Address[3])) + .arg(int(clientAddress->Address[4])) + .arg(int(clientAddress->Address[5])); + break; + case AF_INET6: + for (int i = 2; i < 18; i++) + { + if (i != 2 && i % 2 == 0) + { + result.append(QLatin1Char(':')); + } + result.append(QStringLiteral("%1").arg( int(clientAddress->Address[i]), 16, 2, QLatin1Char('0'))); + } + break; + } + break; + } + case WTSSessionInfo: + { + const auto sessionInfoData = PWTSINFO(queryBuffer); + switch (sessionInfo) + { + case SessionInfo::SessionUptime: + result = QString::number((sessionInfoData->CurrentTime.QuadPart - + qMax(sessionInfoData->ConnectTime.QuadPart, sessionInfoData->LogonTime.QuadPart)) + / (1000*1000*10)); + break; + default: + vCritical() << "unhandled session info" << sessionInfo; + break; + } + break; + } + default: + result = QString::fromWCharArray(queryBuffer); + break; + } } else { @@ -116,7 +167,7 @@ QString WtsSessionManager::querySessionInformation( SessionId sessionId, Session vCritical() << lastError; } - WTSFreeMemory( pBuffer ); + WTSFreeMemory(queryBuffer); vDebug() << sessionId << sessionInfo << result; diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index c974823b1..c82e76e03 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -39,6 +39,9 @@ class WtsSessionManager enum class SessionInfo { UserName, DomainName, + SessionUptime, + ClientAddress, + ClientName }; Q_ENUM(SessionInfo) From ddc6a27359dde6404f5aaca77048ccaa5d50be57 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 11:55:56 +0200 Subject: [PATCH 1472/1765] PlatformSessionFunctions: add SessionInfo struct --- core/src/PlatformSessionFunctions.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index b604d0d57..063a0496f 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -34,6 +34,26 @@ class PlatformSessionFunctions using SessionId = int; using SessionUptime = qint64; + struct SessionInfo { + SessionId id = InvalidSessionId; + SessionUptime uptime; + QString clientAddress; + QString clientName; + QString hostName; + bool operator==(const SessionInfo& other) const + { + return other.id == id && + other.uptime == uptime && + other.clientAddress == clientAddress && + other.clientName == clientName && + other.hostName == hostName; + } + bool operator!=(const SessionInfo& other) const + { + return !(other == *this); + } + }; + static constexpr SessionId DefaultSessionId = 0; static constexpr SessionId InvalidSessionId = -1; static constexpr SessionUptime InvalidSessionUptime = -1; From ca8ef3abc25646432a3a88095f0b0c79e457f3fd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 11:58:38 +0200 Subject: [PATCH 1473/1765] VeyonCore: add version enum value for 4.8 --- core/src/VeyonConfiguration.cpp | 4 ++++ core/src/VeyonCore.h | 1 + 2 files changed, 5 insertions(+) diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index 7666baa10..fb780cf43 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -72,4 +72,8 @@ void VeyonConfiguration::upgrade() { setApplicationVersion(VeyonCore::ApplicationVersion::Version_4_7); } + else if (applicationVersion() < VeyonCore::ApplicationVersion::Version_4_8) + { + setApplicationVersion(VeyonCore::ApplicationVersion::Version_4_8); + } } diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index b73ed3a05..8623840ec 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -80,6 +80,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject Version_4_5, Version_4_6, Version_4_7, + Version_4_8, Version_5_0, }; Q_ENUM(ApplicationVersion) From 6c68601906a70f521c52faa6a5e7033b1a55a27e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 12:15:37 +0200 Subject: [PATCH 1474/1765] MasterConfigurationPage: translate all quality levels --- configurator/src/MasterConfigurationPage.ui | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 6f4bd608c..643c2cb71 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -252,22 +252,22 @@ - High + High - Medium + Medium - Low + Low - Lowest + Lowest From 813bc4e94ddc992c255c773d59609c2ccb1d2eee Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 12:16:04 +0200 Subject: [PATCH 1475/1765] VeyonConfigurationProperties: default to medium image quality Also fix name of setter. --- core/src/VeyonConfigurationProperties.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index e9b71b731..a37152711 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -108,7 +108,7 @@ #define FOREACH_VEYON_MASTER_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, modernUserInterface, setModernUserInterface, "ModernUserInterface", "Master", false, Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), VncConnectionConfiguration::Quality, computerMonitoringImageQuality, setComputerMonitoringUpdateInterval, "ComputerMonitoringImageQuality", "Master", QVariant::fromValue(VncConnectionConfiguration::Quality::High), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), VncConnectionConfiguration::Quality, computerMonitoringImageQuality, setComputerMonitoringImageQuality, "ComputerMonitoringImageQuality", "Master", QVariant::fromValue(VncConnectionConfiguration::Quality::Medium), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringUpdateInterval, setComputerMonitoringUpdateInterval, "ComputerMonitoringUpdateInterval", "Master", 1000, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringThumbnailSpacing, setComputerMonitoringThumbnailSpacing, "ComputerMonitoringThumbnailSpacing", "Master", 5, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::DisplayRoleContent, computerDisplayRoleContent, setComputerDisplayRoleContent, "ComputerDisplayRoleContent", "Master", QVariant::fromValue(ComputerListModel::DisplayRoleContent::UserAndComputerName), Configuration::Property::Flag::Standard ) \ From d3a15fac7094ebc69d343e62c10e5c39ed90ed2b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 12:17:13 +0200 Subject: [PATCH 1476/1765] VeyonConfiguration: use highest image quality when migrating from < 4.8 Since Veyon < 4.8 doesn't support tight encoding (which needs to be supported client-side by the VNC connection proxy), we can keep compatibility with 4.7 clients by using the highest image quality (i.e. no tight encoding). --- core/src/VeyonConfiguration.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index fb780cf43..58d06bc08 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -74,6 +74,8 @@ void VeyonConfiguration::upgrade() } else if (applicationVersion() < VeyonCore::ApplicationVersion::Version_4_8) { + setComputerMonitoringImageQuality(VncConnectionConfiguration::Quality::Highest); + setApplicationVersion(VeyonCore::ApplicationVersion::Version_4_8); } } From dc5a3a5a6e0f4bb8f99ebdc7fa285397ad1c5282 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 12:24:39 +0200 Subject: [PATCH 1477/1765] MonitoringMode, CCI: add session info query support This adds support for retrieving additional session-related information such as session uptime, address/name of remote session clients (e.g. RDP clients connected to the session in question) and the name of the host on which the session is running. --- core/src/ComputerControlInterface.cpp | 45 +++++++-- core/src/ComputerControlInterface.h | 13 ++- core/src/MonitoringMode.cpp | 116 +++++++++++++++++++----- core/src/MonitoringMode.h | 23 ++++- master/src/ComputerControlListModel.cpp | 3 +- 5 files changed, 162 insertions(+), 38 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 6c3bb883b..148a1e66a 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -53,6 +53,7 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, in connect(&m_statePollingTimer, &QTimer::timeout, this, [this]() { updateUser(); + updateSessionInfo(); updateActiveFeatures(); }); } @@ -100,6 +101,7 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up connect(vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateServerVersion); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateUser ); + connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateSessionInfo ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateActiveFeatures ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateScreens ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::stateChanged ); @@ -207,6 +209,7 @@ void ComputerControlInterface::setServerVersion(VeyonCore::ApplicationVersion ve { m_statePollingTimer.stop(); + updateSessionInfo(); updateScreens(); setMinimumFramebufferUpdateInterval(); } @@ -224,15 +227,13 @@ void ComputerControlInterface::setServerVersion(VeyonCore::ApplicationVersion ve -void ComputerControlInterface::setUserInformation( const QString& userLoginName, const QString& userFullName, int sessionId ) +void ComputerControlInterface::setUserInformation(const QString& userLoginName, const QString& userFullName) { - if( userLoginName != m_userLoginName || - userFullName != m_userFullName || - sessionId != m_userSessionId ) + if (userLoginName != m_userLoginName || + userFullName != m_userFullName) { m_userLoginName = userLoginName; m_userFullName = userFullName; - m_userSessionId = sessionId; Q_EMIT userChanged(); } @@ -240,6 +241,17 @@ void ComputerControlInterface::setUserInformation( const QString& userLoginName, +void ComputerControlInterface::setSessionInfo(const PlatformSessionFunctions::SessionInfo& sessionInfo) +{ + if (sessionInfo != m_sessionInfo) + { + m_sessionInfo = sessionInfo; + Q_EMIT sessionInfoChanged(); + } +} + + + void ComputerControlInterface::setScreens(const ScreenList& screens) { if(screens != m_screens) @@ -441,12 +453,31 @@ void ComputerControlInterface::updateUser() { if( userLoginName().isEmpty() ) { - VeyonCore::builtinFeatures().monitoringMode().queryLoggedOnUserInfo( { weakPointer() } ); + VeyonCore::builtinFeatures().monitoringMode().queryUserInfo( { weakPointer() } ); } } else { - setUserInformation( {}, {}, -1 ); + setUserInformation({}, {}); + } + + unlock(); +} + + + +void ComputerControlInterface::updateSessionInfo() +{ + lock(); + + if (vncConnection() && state() == State::Connected && + m_serverVersion >= VeyonCore::ApplicationVersion::Version_4_8) + { + VeyonCore::builtinFeatures().monitoringMode().querySessionInfo({weakPointer()}); + } + else + { + setSessionInfo({}); } unlock(); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 58411ae1c..b7608e2b1 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -27,6 +27,7 @@ #include "Computer.h" #include "Feature.h" #include "Lockable.h" +#include "PlatformSessionFunctions.h" #include "VeyonCore.h" #include "VeyonConnection.h" @@ -121,12 +122,14 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_userFullName; } - int userSessionId() const + void setUserInformation(const QString& userLoginName, const QString& userFullName); + + const PlatformSessionFunctions::SessionInfo& sessionInfo() const { - return m_userSessionId; + return m_sessionInfo; } - void setUserInformation( const QString& userLoginName, const QString& userFullName, int sessionId ); + void setSessionInfo(const PlatformSessionFunctions::SessionInfo& sessionInfo); const ScreenList& screens() const { @@ -183,6 +186,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void updateServerVersion(); void updateActiveFeatures(); void updateUser(); + void updateSessionInfo(); void updateScreens(); void handleFeatureMessage( const FeatureMessage& message ); @@ -200,7 +204,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab State m_state{State::Disconnected}; QString m_userLoginName{}; QString m_userFullName{}; - int m_userSessionId{0}; + PlatformSessionFunctions::SessionInfo m_sessionInfo{}; ScreenList m_screens; FeatureUidList m_activeFeatures; Feature::Uid m_designatedModeFeature; @@ -224,6 +228,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void framebufferUpdated( QRect rect ); void scaledFramebufferUpdated(); void userChanged(); + void sessionInfoChanged(); void screensChanged(); void stateChanged(); void activeFeaturesChanged(); diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index a9ea72336..c5b6132db 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -28,7 +28,6 @@ #include "FeatureManager.h" #include "MonitoringMode.h" -#include "PlatformSessionFunctions.h" #include "PlatformUserFunctions.h" #include "VeyonConfiguration.h" #include "VeyonServerInterface.h" @@ -55,19 +54,27 @@ MonitoringMode::MonitoringMode( QObject* parent ) : Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Builtin, Feature::Uid("79a5e74d-50bd-4aab-8012-0e70dc08cc72"), Feature::Uid(), {}, {}, {} ), + m_querySessionInfoFeature(QStringLiteral("SessionInfo"), + Feature::Flag::Session | Feature::Flag::Service | Feature::Flag::Builtin, + Feature::Uid("699ed9dd-f58b-477b-a0af-df8105571b3c"), + Feature::Uid(), {}, {}, {}), m_queryScreensFeature( QStringLiteral("QueryScreens"), Feature::Flag::Meta, Feature::Uid("d5bbc486-7bc5-4c36-a9a8-1566c8b0091a"), Feature::Uid(), tr("Query properties of remotely available screens"), {}, {} ), m_features({ m_monitoringModeFeature, m_queryApplicationVersionFeature, m_queryActiveFeatures, - m_queryUserInfoFeature, m_queryScreensFeature}) + m_queryUserInfoFeature, m_querySessionInfoFeature, m_queryScreensFeature}) { if(VeyonCore::component() == VeyonCore::Component::Server) { connect(&m_activeFeaturesUpdateTimer, &QTimer::timeout, this, &MonitoringMode::updateActiveFeatures); m_activeFeaturesUpdateTimer.start(ActiveFeaturesUpdateInterval); + connect(&m_sessionInfoUpdateTimer, &QTimer::timeout, this, &MonitoringMode::updateSessionInfo); + m_sessionInfoUpdateTimer.start(SessionInfoUpdateInterval); + updateUserData(); + updateSessionInfo(); updateScreenInfoList(); connect(qGuiApp, &QGuiApplication::screenAdded, this, &MonitoringMode::updateScreenInfoList); @@ -88,8 +95,8 @@ void MonitoringMode::setMinimumFramebufferUpdateInterval(const ComputerControlIn int interval) { sendFeatureMessage(FeatureMessage{m_monitoringModeFeature.uid(), Command::SetMinimumFramebufferUpdateInterval} - .addArgument(Argument::MinimumFramebufferUpdateInterval, interval), - computerControlInterfaces); + .addArgument(Argument::MinimumFramebufferUpdateInterval, interval), + computerControlInterfaces); } @@ -115,6 +122,13 @@ void MonitoringMode::queryUserInfo(const ComputerControlInterfaceList& computerC +void MonitoringMode::querySessionInfo(const ComputerControlInterfaceList& computerControlInterfaces) +{ + sendFeatureMessage(FeatureMessage{m_querySessionInfoFeature.uid()}, computerControlInterfaces); +} + + + void MonitoringMode::queryScreens(const ComputerControlInterfaceList& computerControlInterfaces) { sendFeatureMessage(FeatureMessage{m_queryScreensFeature.uid()}, computerControlInterfaces); @@ -123,7 +137,7 @@ void MonitoringMode::queryScreens(const ComputerControlInterfaceList& computerCo bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer computerControlInterface, - const FeatureMessage& message ) + const FeatureMessage& message ) { if (message.featureUid() == m_monitoringModeFeature.uid()) { @@ -137,7 +151,7 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com if (message.featureUid() == m_queryApplicationVersionFeature.uid()) { computerControlInterface->setServerVersion(message.argument(Argument::ApplicationVersion) - .value()); + .value()); return true; } @@ -160,9 +174,21 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com if( message.featureUid() == m_queryUserInfoFeature.uid() ) { - computerControlInterface->setUserInformation( message.argument( Argument::UserLoginName ).toString(), - message.argument( Argument::UserFullName ).toString(), - message.argument( Argument::UserSessionId ).toInt() ); + computerControlInterface->setUserInformation(message.argument( Argument::UserLoginName ).toString(), + message.argument( Argument::UserFullName ).toString()); + + return true; + } + + if (message.featureUid() == m_querySessionInfoFeature.uid()) + { + computerControlInterface->setSessionInfo(PlatformSessionFunctions::SessionInfo{ + message.argument(Argument::SessionId).toInt(), + message.argument(Argument::SessionUptime).toLongLong(), + message.argument(Argument::SessionClientAddress).toString(), + message.argument(Argument::SessionClientName).toString(), + message.argument(Argument::SessionHostName).toString() + }); return true; } @@ -192,9 +218,9 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com -bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, +bool MonitoringMode::handleFeatureMessage(VeyonServerInterface& server, const MessageContext& messageContext, - const FeatureMessage& message ) + const FeatureMessage& message) { if (message.featureUid() == m_monitoringModeFeature.uid()) { @@ -206,7 +232,7 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, if (message.command() == Command::SetMinimumFramebufferUpdateInterval) { server.setMinimumFramebufferUpdateInterval(messageContext, - message.argument(Argument::MinimumFramebufferUpdateInterval).toInt()); + message.argument(Argument::MinimumFramebufferUpdateInterval).toInt()); return true; } } @@ -214,8 +240,8 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, if (message.featureUid() == m_queryApplicationVersionFeature.uid()) { server.sendFeatureMessageReply(messageContext, - FeatureMessage{m_queryApplicationVersionFeature.uid()} - .addArgument(Argument::ApplicationVersion, int(VeyonCore::config().applicationVersion()))); + FeatureMessage{m_queryApplicationVersionFeature.uid()} + .addArgument(Argument::ApplicationVersion, int(VeyonCore::config().applicationVersion()))); } if (m_queryActiveFeatures.uid() == message.featureUid()) @@ -228,6 +254,11 @@ bool MonitoringMode::handleFeatureMessage( VeyonServerInterface& server, return sendUserInformation(server, messageContext); } + if (message.featureUid() == m_querySessionInfoFeature.uid()) + { + return sendSessionInfo(server, messageContext); + } + if (message.featureUid() == m_queryScreensFeature.uid()) { return sendScreenInfoList(server, messageContext); @@ -251,15 +282,23 @@ void MonitoringMode::sendAsyncFeatureMessages(VeyonServerInterface& server, cons const auto currentUserInfoVersion = m_userInfoVersion.loadAcquire(); const auto contextUserInfoVersion = messageContext.ioDevice()->property(userInfoVersionProperty()).toInt(); - if(contextUserInfoVersion != currentUserInfoVersion) + if(contextUserInfoVersion != currentUserInfoVersion) { sendUserInformation(server, messageContext); messageContext.ioDevice()->setProperty(userInfoVersionProperty(), currentUserInfoVersion); } + const auto sessionInfoVersion = messageContext.ioDevice()->property(sessionInfoVersionProperty()).toInt(); + + if (sessionInfoVersion != m_sessionInfoVersion) + { + sendSessionInfo(server, messageContext); + messageContext.ioDevice()->setProperty(sessionInfoVersionProperty(), m_sessionInfoVersion); + } + const auto screenInfoVersion = messageContext.ioDevice()->property(screenInfoListVersionProperty()).toInt(); - if (screenInfoVersion != m_screenInfoListVersion) + if (screenInfoVersion != m_screenInfoListVersion) { sendScreenInfoList(server, messageContext); messageContext.ioDevice()->setProperty(screenInfoListVersionProperty(), m_screenInfoListVersion); @@ -287,13 +326,11 @@ bool MonitoringMode::sendUserInformation(VeyonServerInterface& server, const Mes updateUserData(); message.addArgument(Argument::UserLoginName, QString{}); message.addArgument(Argument::UserFullName, QString{}); - message.addArgument(Argument::UserSessionId, -1); } else { message.addArgument(Argument::UserLoginName, m_userLoginName); message.addArgument(Argument::UserFullName, m_userFullName); - message.addArgument(Argument::UserSessionId, m_userSessionId); } m_userDataLock.unlock(); @@ -302,11 +339,25 @@ bool MonitoringMode::sendUserInformation(VeyonServerInterface& server, const Mes +bool MonitoringMode::sendSessionInfo(VeyonServerInterface& server, const MessageContext& messageContext) +{ + FeatureMessage message{m_querySessionInfoFeature.uid()}; + message.addArgument(Argument::SessionId, m_sessionInfo.id); + message.addArgument(Argument::SessionUptime, m_sessionInfo.uptime); + message.addArgument(Argument::SessionClientAddress, m_sessionInfo.clientAddress); + message.addArgument(Argument::SessionClientName, m_sessionInfo.clientName); + message.addArgument(Argument::SessionHostName, m_sessionInfo.hostName); + + return server.sendFeatureMessageReply(messageContext,message); +} + + + bool MonitoringMode::sendScreenInfoList(VeyonServerInterface& server, const MessageContext& messageContext) { return server.sendFeatureMessageReply(messageContext, - FeatureMessage{m_queryScreensFeature.uid()} - .addArgument(Argument::ScreenInfoList, m_screenInfoList)); + FeatureMessage{m_queryScreensFeature.uid()} + .addArgument(Argument::ScreenInfoList, m_screenInfoList)); } @@ -345,15 +396,12 @@ void MonitoringMode::updateUserData() { const auto userLoginName = VeyonCore::platform().userFunctions().currentUser(); const auto userFullName = VeyonCore::platform().userFunctions().fullName( userLoginName ); - const auto userSessionId = VeyonCore::sessionId(); m_userDataLock.lockForWrite(); if(m_userLoginName != userLoginName || - m_userFullName != userFullName || - m_userSessionId != userSessionId ) + m_userFullName != userFullName) { m_userLoginName = userLoginName; m_userFullName = userFullName; - m_userSessionId = userSessionId; ++m_userInfoVersion; } m_userDataLock.unlock(); @@ -363,6 +411,26 @@ void MonitoringMode::updateUserData() +void MonitoringMode::updateSessionInfo() +{ + const PlatformSessionFunctions::SessionInfo currentSessionInfo{ + VeyonCore::sessionId(), + VeyonCore::platform().sessionFunctions().currentSessionUptime(), + VeyonCore::platform().sessionFunctions().currentSessionClientAddress(), + VeyonCore::platform().sessionFunctions().currentSessionClientName(), + VeyonCore::platform().sessionFunctions().currentSessionHostName() + }; + + if (currentSessionInfo != m_sessionInfo) + { + m_sessionInfo = currentSessionInfo; + ++m_sessionInfoVersion; + } +} + + + + void MonitoringMode::updateScreenInfoList() { const auto screens = QGuiApplication::screens(); diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index d493f135c..5fa4eff0c 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -27,6 +27,7 @@ #include #include "FeatureProviderInterface.h" +#include "PlatformSessionFunctions.h" class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterface, PluginInterface { @@ -37,10 +38,14 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac { UserLoginName, UserFullName, - UserSessionId, + SessionId, ScreenInfoList, MinimumFramebufferUpdateInterval, ApplicationVersion, + SessionUptime, + SessionHostName, + SessionClientAddress, + SessionClientName, ActiveFeaturesList = 0 // for compatibility after migration from FeatureControl }; Q_ENUM(Argument) @@ -98,6 +103,8 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void queryUserInfo(const ComputerControlInterfaceList& computerControlInterfaces); + void querySessionInfo(const ComputerControlInterfaceList& computerControlInterfaces); + void queryScreens( const ComputerControlInterfaceList& computerControlInterfaces ); bool controlFeature( Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, @@ -123,6 +130,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac private: bool sendActiveFeatures(VeyonServerInterface& server, const MessageContext& messageContext); bool sendUserInformation(VeyonServerInterface& server, const MessageContext& messageContext); + bool sendSessionInfo(VeyonServerInterface& server, const MessageContext& messageContext); bool sendScreenInfoList(VeyonServerInterface& server, const MessageContext& messageContext); static const char* activeFeaturesVersionProperty() @@ -135,6 +143,11 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac return "userInfoVersion"; } + static const char* sessionInfoVersionProperty() + { + return "sessionInfoVersion"; + } + static const char* screenInfoListVersionProperty() { return "screenInfoListVersion"; @@ -142,6 +155,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac void updateActiveFeatures(); void updateUserData(); + void updateSessionInfo(); void updateScreenInfoList(); enum Command @@ -151,11 +165,13 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac }; static constexpr int ActiveFeaturesUpdateInterval = 250; + static constexpr int SessionInfoUpdateInterval = 1000; const Feature m_monitoringModeFeature; const Feature m_queryApplicationVersionFeature; const Feature m_queryActiveFeatures; const Feature m_queryUserInfoFeature; + const Feature m_querySessionInfoFeature; const Feature m_queryScreensFeature; const FeatureList m_features; @@ -166,10 +182,13 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac QReadWriteLock m_userDataLock; QString m_userLoginName; QString m_userFullName; - int m_userSessionId{0}; QAtomicInt m_userInfoVersion{0}; QVariantList m_screenInfoList; int m_screenInfoListVersion{0}; + PlatformSessionFunctions::SessionInfo m_sessionInfo{}; + int m_sessionInfoVersion = 0; + QTimer m_sessionInfoUpdateTimer; + }; diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 1a0d2eb04..387a5fde2 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -403,7 +403,8 @@ void ComputerControlListModel::stopComputerControlInterface( const ComputerContr controlInterface->disconnect( &m_master->computerManager() ); - controlInterface->setUserInformation( {}, {}, -1 ); + controlInterface->setUserInformation({}, {}); + m_master->computerManager().updateUser( controlInterface ); } From 69b9f9e01595b5743cb190b6220a2645a15a40b8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 12:27:53 +0200 Subject: [PATCH 1478/1765] ComputerControlListModel: rename to userInformation() --- master/src/ComputerControlListModel.cpp | 4 ++-- master/src/ComputerControlListModel.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 387a5fde2..ac5353583 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -453,7 +453,7 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte const QString host( tr( "Host/IP address: %1" ).arg( controlInterface->computer().hostAddress().isEmpty() ? QStringLiteral("<%1>").arg( tr("invalid") ) : controlInterface->computer().hostAddress() ) ); - const QString user( loggedOnUserInformation( controlInterface ) ); + const QString user( userInformation( controlInterface ) ); const QString features( tr( "Active features: %1" ).arg( activeFeatures( controlInterface ) ) ); if( user.isEmpty() ) @@ -550,7 +550,7 @@ QString ComputerControlListModel::computerStateDescription( const ComputerContro -QString ComputerControlListModel::loggedOnUserInformation( const ComputerControlInterface::Pointer& controlInterface ) +QString ComputerControlListModel::userInformation(const ComputerControlInterface::Pointer& controlInterface) { if( controlInterface->state() == ComputerControlInterface::State::Connected ) { diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index fca2c2bfe..21f9e3b96 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -94,7 +94,7 @@ class ComputerControlListModel : public ComputerListModel QString computerDisplayRole( const ComputerControlInterface::Pointer& controlInterface ) const; QString computerSortRole( const ComputerControlInterface::Pointer& controlInterface ) const; static QString computerStateDescription( const ComputerControlInterface::Pointer& controlInterface ); - static QString loggedOnUserInformation( const ComputerControlInterface::Pointer& controlInterface ); + static QString userInformation(const ComputerControlInterface::Pointer& controlInterface); QString activeFeatures( const ComputerControlInterface::Pointer& controlInterface ) const; VeyonMaster* m_master; From 548795f6112edcfb44965118318f347e90ffa69c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 12:28:47 +0200 Subject: [PATCH 1479/1765] ComputerManager, CCLM: show session uptime in 3rd column Closes #821, #876. --- master/src/ComputerControlListModel.cpp | 19 ++++++++++++++- master/src/ComputerControlListModel.h | 1 + master/src/ComputerManager.cpp | 32 ++++++++++++++++++++++++- master/src/ComputerManager.h | 3 +++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index ac5353583..4e39a6fe7 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -28,9 +28,9 @@ #include "ComputerImageProvider.h" #include "ComputerManager.h" #include "FeatureManager.h" +#include "PlatformSessionFunctions.h" #include "VeyonMaster.h" #include "UserConfig.h" -#include "VeyonConfiguration.h" #if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) #include @@ -375,6 +375,19 @@ void ComputerControlListModel::updateUser( const QModelIndex& index ) +void ComputerControlListModel::updateSessionInfo(const QModelIndex& index) +{ + Q_EMIT dataChanged(index, index, {Qt::ToolTipRole}); + + auto controlInterface = computerControlInterface( index ); + if (controlInterface.isNull() == false) + { + m_master->computerManager().updateSessionInfo(controlInterface); + } +} + + + void ComputerControlListModel::startComputerControlInterface( ComputerControlInterface* controlInterface ) { controlInterface->start( computerScreenSize(), ComputerControlInterface::UpdateMode::Monitoring ); @@ -393,6 +406,9 @@ void ComputerControlListModel::startComputerControlInterface( ComputerControlInt connect( controlInterface, &ComputerControlInterface::userChanged, this, [=]() { updateUser( interfaceIndex( controlInterface ) ); } ); + + connect(controlInterface, &ComputerControlInterface::sessionInfoChanged, + this, [=]() { updateSessionInfo(interfaceIndex(controlInterface)); }); } @@ -404,6 +420,7 @@ void ComputerControlListModel::stopComputerControlInterface( const ComputerContr controlInterface->disconnect( &m_master->computerManager() ); controlInterface->setUserInformation({}, {}); + controlInterface->setSessionInfo({}); m_master->computerManager().updateUser( controlInterface ); } diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 21f9e3b96..936288aeb 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -83,6 +83,7 @@ class ComputerControlListModel : public ComputerListModel void updateScreen( const QModelIndex& index ); void updateActiveFeatures( const QModelIndex& index ); void updateUser( const QModelIndex& index ); + void updateSessionInfo(const QModelIndex& index); void startComputerControlInterface( ComputerControlInterface* controlInterface ); void stopComputerControlInterface( const ComputerControlInterface::Pointer& controlInterface ); diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index bf08f1940..1be85bf4a 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "ComputerManager.h" #include "VeyonConfiguration.h" @@ -45,7 +46,7 @@ ComputerManager::ComputerManager( UserConfig& config, QObject* parent ) : m_config( config ), m_networkObjectDirectory( VeyonCore::networkObjectDirectoryManager().configuredDirectory() ), m_networkObjectModel( new NetworkObjectTreeModel( m_networkObjectDirectory, this ) ), - m_networkObjectOverlayDataModel(new NetworkObjectOverlayDataModel({tr("User")}, this)), + m_networkObjectOverlayDataModel(new NetworkObjectOverlayDataModel({tr("User"), tr("Logged in since")}, this)), m_computerTreeModel( new CheckableItemProxyModel( NetworkObjectModel::UidRole, this ) ), m_networkObjectFilterProxyModel( new NetworkObjectFilterProxyModel( this ) ), m_localHostNames( QHostInfo::localHostName().toLower() ), @@ -160,6 +161,25 @@ void ComputerManager::updateUser(const ComputerControlInterface::Pointer& contro +void ComputerManager::updateSessionInfo(const ComputerControlInterface::Pointer& controlInterface) const +{ + const auto networkObjectIndex = findNetworkObject(controlInterface->computer().networkObjectUid()); + + if (networkObjectIndex.isValid()) + { + const auto uptime24h = controlInterface->sessionInfo().uptime % (60*60*24); + const auto uptimeDays = controlInterface->sessionInfo().uptime / (60*60*24); + const QString uptimeString = (uptimeDays > 0 ? + ((uptimeDays > 1 ? tr("%1 days").arg(uptimeDays) : tr("1 day")) + QStringLiteral(", ")) : + QString()) + + QTime::fromMSecsSinceStartOfDay(uptime24h * 1000).toString(QStringLiteral("hh:mm:ss")); + m_networkObjectOverlayDataModel->setData(mapToSessionUptimeModelIndex(networkObjectIndex), + uptimeString, + Qt::DisplayRole); + } +} + + void ComputerManager::checkChangedData( const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector& roles ) { Q_UNUSED(topLeft) @@ -502,3 +522,13 @@ QModelIndex ComputerManager::mapToUserNameModelIndex(const QModelIndex& networkO return m_networkObjectOverlayDataModel->index( networkObjectIndex.row(), OverlayDataUsernameColumn, parent ); } + + + +QModelIndex ComputerManager::mapToSessionUptimeModelIndex(const QModelIndex& networkObjectIndex) const +{ + // map arbitrary index from m_networkObjectModel to username column in m_networkObjectOverlayDataModel + const auto parent = m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex.parent()); + + return m_networkObjectOverlayDataModel->index(networkObjectIndex.row(), OverlayDataSessionUptimeColumn, parent); +} diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index 1a830f2b4..133b84d1a 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -58,6 +58,7 @@ class ComputerManager : public QObject bool saveComputerAndUsersList( const QString& fileName ); void updateUser(const ComputerControlInterface::Pointer& controlInterface) const; + void updateSessionInfo(const ComputerControlInterface::Pointer& controlInterface) const; Q_SIGNALS: void computerSelectionReset(); @@ -80,8 +81,10 @@ class ComputerManager : public QObject QModelIndex findNetworkObject(NetworkObject::Uid networkObjectUid, const QModelIndex& parent = {}) const; QModelIndex mapToUserNameModelIndex(const QModelIndex& networkObjectIndex) const; + QModelIndex mapToSessionUptimeModelIndex(const QModelIndex& networkObjectIndex) const; static constexpr int OverlayDataUsernameColumn = 1; + static constexpr int OverlayDataSessionUptimeColumn = 2; UserConfig& m_config; From 3bc3bcec1a60d5c44d20320523657a0bad67759e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 31 Mar 2023 12:30:13 +0200 Subject: [PATCH 1480/1765] VariantStream: add support for QMetaType::LongLong --- core/src/VariantStream.cpp | 10 ++++++++++ core/src/VariantStream.h | 1 + 2 files changed, 11 insertions(+) diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index 21b161719..a6a15907b 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -113,6 +113,15 @@ bool VariantStream::checkInt() +bool VariantStream::checkLong() +{ + qlonglong i; + m_dataStream >> i; + return m_dataStream.status() == QDataStream::Status::Ok; +} + + + bool VariantStream::checkRect() { qint32 i; @@ -203,6 +212,7 @@ bool VariantStream::checkVariant(int depth) case QMetaType::Bool: return checkBool(); case QMetaType::QByteArray: return checkByteArray(); case QMetaType::Int: return checkInt(); + case QMetaType::LongLong: return checkLong(); case QMetaType::QRect: return checkRect(); case QMetaType::QString: return checkString(); case QMetaType::QStringList: return checkStringList(); diff --git a/core/src/VariantStream.h b/core/src/VariantStream.h index f0dbfd0d2..1603dea16 100644 --- a/core/src/VariantStream.h +++ b/core/src/VariantStream.h @@ -46,6 +46,7 @@ class VEYON_CORE_EXPORT VariantStream bool checkBool(); bool checkByteArray(); bool checkInt(); + bool checkLong(); bool checkRect(); bool checkString(); bool checkStringList(); From fc257668732e0966f0f973561bcaa97553716922 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Apr 2023 12:01:07 +0200 Subject: [PATCH 1481/1765] CCI: only set quality levels for servers >= 4.8 --- core/src/ComputerControlInterface.cpp | 34 ++++++++++++++++++++++++++- core/src/ComputerControlInterface.h | 1 + 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 148a1e66a..938455764 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -84,7 +84,6 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up { vncConnection->setPort( m_port ); } - vncConnection->setQuality(VeyonCore::config().computerMonitoringImageQuality()); vncConnection->setScaledSize( m_scaledFramebufferSize ); connect( vncConnection, &VncConnection::imageUpdated, this, [this]( int x, int y, int w, int h ) @@ -204,6 +203,8 @@ void ComputerControlInterface::setServerVersion(VeyonCore::ApplicationVersion ve const auto statePollingInterval = VeyonCore::config().computerStatePollingInterval(); + setQuality(); + if (m_serverVersion >= VeyonCore::ApplicationVersion::Version_4_7 && statePollingInterval <= 0) { @@ -303,6 +304,7 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) m_updateMode = updateMode; setMinimumFramebufferUpdateInterval(); + setQuality(); if (vncConnection()) { @@ -361,6 +363,36 @@ void ComputerControlInterface::setMinimumFramebufferUpdateInterval() +void ComputerControlInterface::setQuality() +{ + auto quality = VncConnectionConfiguration::Quality::Highest; + + if (m_serverVersion >= VeyonCore::ApplicationVersion::Version_4_8) + { + switch (m_updateMode) + { + case UpdateMode::Disabled: + quality = VncConnectionConfiguration::Quality::Lowest; + break; + + case UpdateMode::Basic: + case UpdateMode::Monitoring: + quality = VeyonCore::config().computerMonitoringImageQuality(); + break; + + case UpdateMode::Live: + break; + } + } + + if (vncConnection()) + { + vncConnection()->setQuality(quality); + } +} + + + void ComputerControlInterface::resetWatchdog() { if( state() == State::Connected ) diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index b7608e2b1..4fc77b74d 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -179,6 +179,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab private: void ping(); void setMinimumFramebufferUpdateInterval(); + void setQuality(); void resetWatchdog(); void restartConnection(); From 611d18edba978d4377d102e63886490192c58e16 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Apr 2023 12:03:09 +0200 Subject: [PATCH 1482/1765] PlatformSessionFunctions: use int as type for SessionId It's quite unlikely a user session exists for longer than 68 years. --- core/src/MonitoringMode.cpp | 2 +- core/src/PlatformSessionFunctions.h | 2 +- plugins/platform/linux/LinuxSessionFunctions.cpp | 4 ++-- plugins/platform/linux/LinuxSessionFunctions.h | 4 ++-- plugins/platform/windows/WindowsSessionFunctions.cpp | 2 +- plugins/platform/windows/WindowsSessionFunctions.h | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index c5b6132db..50656e442 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -184,7 +184,7 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com { computerControlInterface->setSessionInfo(PlatformSessionFunctions::SessionInfo{ message.argument(Argument::SessionId).toInt(), - message.argument(Argument::SessionUptime).toLongLong(), + message.argument(Argument::SessionUptime).toInt(), message.argument(Argument::SessionClientAddress).toString(), message.argument(Argument::SessionClientName).toString(), message.argument(Argument::SessionHostName).toString() diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 063a0496f..6e97efa2c 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -32,7 +32,7 @@ class PlatformSessionFunctions { public: using SessionId = int; - using SessionUptime = qint64; + using SessionUptime = int; struct SessionInfo { SessionId id = InvalidSessionId; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index b9597493f..4b698c67e 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -175,7 +175,7 @@ int LinuxSessionFunctions::getSessionLeaderPid( const QString& session ) -qint64 LinuxSessionFunctions::getSessionUptimeSeconds( const QString& session ) +LinuxSessionFunctions::SessionUptime LinuxSessionFunctions::getSessionUptimeSeconds( const QString& session ) { const auto sessionUptimeUsec = getSessionProperty( session, QStringLiteral("Timestamp") ); @@ -190,7 +190,7 @@ qint64 LinuxSessionFunctions::getSessionUptimeSeconds( const QString& session ) const auto currentTimestamp = QDateTime::currentSecsSinceEpoch(); #endif - return currentTimestamp - qint64( sessionUptimeUsec.toLongLong() / ( 1000 * 1000 ) ); + return SessionUptime(currentTimestamp - sessionUptimeUsec.toLongLong() / (1000 * 1000)); } diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 57f4a1362..019eb6053 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -81,7 +81,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions SessionId currentSessionId() override; - LinuxSessionFunctions::SessionUptime currentSessionUptime() const override; + SessionUptime currentSessionUptime() const override; QString currentSessionClientAddress() const override; QString currentSessionClientName() const override; QString currentSessionHostName() const override; @@ -95,7 +95,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions static QVariant getSessionProperty(const QString& session, const QString& property, bool logErrors = true); static int getSessionLeaderPid( const QString& session ); - static qint64 getSessionUptimeSeconds( const QString& session ); + static SessionUptime getSessionUptimeSeconds( const QString& session ); static Class getSessionClass( const QString& session ); static Type getSessionType( const QString& session ); static QString getSessionId(const QString& session, bool logErrors = true); diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 0e71a05bc..448a4d582 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -46,7 +46,7 @@ WindowsSessionFunctions::SessionId WindowsSessionFunctions::currentSessionId() WindowsSessionFunctions::SessionUptime WindowsSessionFunctions::currentSessionUptime() const { return WtsSessionManager::querySessionInformation(WtsSessionManager::currentSession(), - WtsSessionManager::SessionInfo::SessionUptime).toLongLong(); + WtsSessionManager::SessionInfo::SessionUptime).toInt(); } diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index a9197d367..e100d2879 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -33,7 +33,7 @@ class WindowsSessionFunctions : public PlatformSessionFunctions public: SessionId currentSessionId() override; - WindowsSessionFunctions::SessionUptime currentSessionUptime() const override; + SessionUptime currentSessionUptime() const override; QString currentSessionClientAddress() const override; QString currentSessionClientName() const override; QString currentSessionHostName() const override; From 1372f1d7aaaacf019a5b92f658892920daa87068 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Apr 2023 12:04:46 +0200 Subject: [PATCH 1483/1765] MonitoringMode: retrieve session information in separate thread This avoids potential stalls in sendAsyncFeatureMessages(). --- core/src/MonitoringMode.cpp | 38 ++++++++++++++++++++++--------------- core/src/MonitoringMode.h | 3 ++- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 50656e442..cc3d91fee 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -288,12 +288,13 @@ void MonitoringMode::sendAsyncFeatureMessages(VeyonServerInterface& server, cons messageContext.ioDevice()->setProperty(userInfoVersionProperty(), currentUserInfoVersion); } + const auto currentSessionInfoVersion = m_sessionInfoVersion.loadAcquire(); const auto sessionInfoVersion = messageContext.ioDevice()->property(sessionInfoVersionProperty()).toInt(); - if (sessionInfoVersion != m_sessionInfoVersion) + if (sessionInfoVersion != currentSessionInfoVersion) { sendSessionInfo(server, messageContext); - messageContext.ioDevice()->setProperty(sessionInfoVersionProperty(), m_sessionInfoVersion); + messageContext.ioDevice()->setProperty(sessionInfoVersionProperty(), currentSessionInfoVersion); } const auto screenInfoVersion = messageContext.ioDevice()->property(screenInfoListVersionProperty()).toInt(); @@ -342,11 +343,14 @@ bool MonitoringMode::sendUserInformation(VeyonServerInterface& server, const Mes bool MonitoringMode::sendSessionInfo(VeyonServerInterface& server, const MessageContext& messageContext) { FeatureMessage message{m_querySessionInfoFeature.uid()}; + + m_sessionInfoLock.lockForRead(); message.addArgument(Argument::SessionId, m_sessionInfo.id); message.addArgument(Argument::SessionUptime, m_sessionInfo.uptime); message.addArgument(Argument::SessionClientAddress, m_sessionInfo.clientAddress); message.addArgument(Argument::SessionClientName, m_sessionInfo.clientName); message.addArgument(Argument::SessionHostName, m_sessionInfo.hostName); + m_sessionInfoLock.unlock(); return server.sendFeatureMessageReply(messageContext,message); } @@ -413,19 +417,23 @@ void MonitoringMode::updateUserData() void MonitoringMode::updateSessionInfo() { - const PlatformSessionFunctions::SessionInfo currentSessionInfo{ - VeyonCore::sessionId(), - VeyonCore::platform().sessionFunctions().currentSessionUptime(), - VeyonCore::platform().sessionFunctions().currentSessionClientAddress(), - VeyonCore::platform().sessionFunctions().currentSessionClientName(), - VeyonCore::platform().sessionFunctions().currentSessionHostName() - }; - - if (currentSessionInfo != m_sessionInfo) - { - m_sessionInfo = currentSessionInfo; - ++m_sessionInfoVersion; - } + (void) QtConcurrent::run([=]() { + const PlatformSessionFunctions::SessionInfo currentSessionInfo{ + VeyonCore::sessionId(), + VeyonCore::platform().sessionFunctions().currentSessionUptime(), + VeyonCore::platform().sessionFunctions().currentSessionClientAddress(), + VeyonCore::platform().sessionFunctions().currentSessionClientName(), + VeyonCore::platform().sessionFunctions().currentSessionHostName() + }; + + m_sessionInfoLock.lockForWrite(); + if (currentSessionInfo != m_sessionInfo) + { + m_sessionInfo = currentSessionInfo; + ++m_sessionInfoVersion; + } + m_sessionInfoLock.unlock(); + }); } diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 5fa4eff0c..3fecc7b72 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -187,8 +187,9 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac QVariantList m_screenInfoList; int m_screenInfoListVersion{0}; + QReadWriteLock m_sessionInfoLock; PlatformSessionFunctions::SessionInfo m_sessionInfo{}; - int m_sessionInfoVersion = 0; + QAtomicInt m_sessionInfoVersion = 0; QTimer m_sessionInfoUpdateTimer; }; From a14af5338a8cae827442115344d4ad1bcb4f4f7f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Apr 2023 12:10:36 +0200 Subject: [PATCH 1484/1765] Revert "VeyonConfiguration: use highest image quality when migrating from < 4.8" This reverts commit d3a15fac7094ebc69d343e62c10e5c39ed90ed2b. The quality levels are managed at the connection level based on the version of the server running remotely. --- core/src/VeyonConfiguration.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index 58d06bc08..fb780cf43 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -74,8 +74,6 @@ void VeyonConfiguration::upgrade() } else if (applicationVersion() < VeyonCore::ApplicationVersion::Version_4_8) { - setComputerMonitoringImageQuality(VncConnectionConfiguration::Quality::Highest); - setApplicationVersion(VeyonCore::ApplicationVersion::Version_4_8); } } From 78e0a461b4145a6cae2b92c3a0629d714012ff27 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Apr 2023 12:11:32 +0200 Subject: [PATCH 1485/1765] VncConnection: default to highest quality Stay compatible with servers < 4.8. --- core/src/VncConnection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 10772ba88..a656312ba 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -230,7 +230,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread // connection parameters and data rfbClient* m_client{nullptr}; - VncConnectionConfiguration::Quality m_quality{VncConnectionConfiguration::Quality::High}; + VncConnectionConfiguration::Quality m_quality = VncConnectionConfiguration::Quality::Highest; QString m_host{}; int m_port{-1}; int m_defaultPort{-1}; From 0a5cb221ea936091e475fa1cee7ff84bfd82d504 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Apr 2023 12:40:30 +0200 Subject: [PATCH 1486/1765] Update copyright --- README.md | 2 +- cli/src/ConfigCommands.cpp | 2 +- cli/src/ConfigCommands.h | 2 +- cli/src/FeatureCommands.cpp | 2 +- cli/src/FeatureCommands.h | 2 +- cli/src/PluginCommands.cpp | 2 +- cli/src/PluginCommands.h | 2 +- cli/src/ServiceControlCommands.cpp | 2 +- cli/src/ServiceControlCommands.h | 2 +- cli/src/ShellCommands.cpp | 2 +- cli/src/ShellCommands.h | 2 +- cli/src/main.cpp | 2 +- cli/veyon-cli.rc.in | 2 +- cli/veyon-wcli.rc.in | 2 +- cmake/modules/BuildVeyonApplication.cmake | 2 +- cmake/modules/BuildVeyonFuzzer.cmake | 2 +- cmake/modules/BuildVeyonPlugin.cmake | 2 +- cmake/modules/CreateTranslations.cmake | 2 +- cmake/modules/FindLibVNCClient.cmake | 2 +- cmake/modules/FindLibVNCServer.cmake | 2 +- configurator/src/AccessControlPage.cpp | 2 +- configurator/src/AccessControlPage.h | 2 +- configurator/src/AccessControlRuleEditDialog.cpp | 2 +- configurator/src/AccessControlRuleEditDialog.h | 2 +- configurator/src/AccessControlRuleListModel.cpp | 2 +- configurator/src/AccessControlRuleListModel.h | 2 +- configurator/src/AccessControlRulesTestDialog.cpp | 2 +- configurator/src/AccessControlRulesTestDialog.h | 2 +- configurator/src/AuthenticationPage.cpp | 2 +- configurator/src/AuthenticationPage.h | 2 +- configurator/src/AuthenticationPageTab.cpp | 2 +- configurator/src/AuthenticationPageTab.h | 2 +- configurator/src/GeneralConfigurationPage.cpp | 2 +- configurator/src/GeneralConfigurationPage.h | 2 +- configurator/src/MainWindow.cpp | 2 +- configurator/src/MainWindow.h | 2 +- configurator/src/MasterConfigurationPage.cpp | 2 +- configurator/src/MasterConfigurationPage.h | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPage.cpp | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPage.h | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPageTab.h | 2 +- configurator/src/ServiceConfigurationPage.cpp | 2 +- configurator/src/ServiceConfigurationPage.h | 2 +- configurator/src/main.cpp | 2 +- configurator/veyon-configurator.rc.in | 2 +- core/src/AboutDialog.cpp | 2 +- core/src/AboutDialog.h | 2 +- core/src/AboutDialog.ui | 2 +- core/src/AccessControlProvider.cpp | 2 +- core/src/AccessControlProvider.h | 2 +- core/src/AccessControlRule.cpp | 2 +- core/src/AccessControlRule.h | 2 +- core/src/AuthenticationCredentials.h | 2 +- core/src/AuthenticationManager.cpp | 2 +- core/src/AuthenticationManager.h | 2 +- core/src/AuthenticationPluginInterface.cpp | 2 +- core/src/AuthenticationPluginInterface.h | 2 +- core/src/BuiltinFeatures.cpp | 2 +- core/src/BuiltinFeatures.h | 2 +- core/src/CommandLineIO.cpp | 2 +- core/src/CommandLineIO.h | 2 +- core/src/CommandLinePluginInterface.h | 2 +- core/src/Computer.cpp | 2 +- core/src/Computer.h | 2 +- core/src/ComputerControlInterface.cpp | 2 +- core/src/ComputerControlInterface.h | 2 +- core/src/ComputerListModel.cpp | 2 +- core/src/ComputerListModel.h | 2 +- core/src/Configuration/JsonStore.cpp | 2 +- core/src/Configuration/JsonStore.h | 2 +- core/src/Configuration/LocalStore.cpp | 2 +- core/src/Configuration/LocalStore.h | 2 +- core/src/Configuration/Object.cpp | 2 +- core/src/Configuration/Object.h | 2 +- core/src/Configuration/Password.cpp | 2 +- core/src/Configuration/Password.h | 2 +- core/src/Configuration/Property.cpp | 2 +- core/src/Configuration/Property.h | 2 +- core/src/Configuration/Proxy.cpp | 2 +- core/src/Configuration/Proxy.h | 2 +- core/src/Configuration/Store.h | 2 +- core/src/Configuration/UiMapping.cpp | 2 +- core/src/Configuration/UiMapping.h | 2 +- core/src/ConfigurationManager.cpp | 2 +- core/src/ConfigurationManager.h | 2 +- core/src/ConfigurationPage.cpp | 2 +- core/src/ConfigurationPage.h | 2 +- core/src/ConfigurationPagePluginInterface.h | 2 +- core/src/CryptoCore.cpp | 2 +- core/src/CryptoCore.h | 2 +- core/src/DesktopAccessDialog.cpp | 2 +- core/src/DesktopAccessDialog.h | 2 +- core/src/EnumHelper.h | 2 +- core/src/Feature.h | 2 +- core/src/FeatureManager.cpp | 2 +- core/src/FeatureManager.h | 2 +- core/src/FeatureMessage.cpp | 2 +- core/src/FeatureMessage.h | 2 +- core/src/FeatureProviderInterface.h | 2 +- core/src/FeatureWorkerManager.cpp | 2 +- core/src/FeatureWorkerManager.h | 2 +- core/src/FileSystemBrowser.cpp | 2 +- core/src/FileSystemBrowser.h | 2 +- core/src/Filesystem.cpp | 2 +- core/src/Filesystem.h | 2 +- core/src/HashList.h | 2 +- core/src/HostAddress.cpp | 2 +- core/src/HostAddress.h | 2 +- core/src/KeyboardShortcutTrapper.h | 2 +- core/src/LockWidget.cpp | 2 +- core/src/LockWidget.h | 2 +- core/src/Lockable.h | 2 +- core/src/LockingPointer.h | 2 +- core/src/Logger.cpp | 2 +- core/src/Logger.h | 2 +- core/src/MessageContext.h | 2 +- core/src/MonitoringMode.cpp | 2 +- core/src/MonitoringMode.h | 2 +- core/src/NestedNetworkObjectDirectory.cpp | 2 +- core/src/NestedNetworkObjectDirectory.h | 2 +- core/src/NetworkObject.cpp | 2 +- core/src/NetworkObject.h | 2 +- core/src/NetworkObjectDirectory.cpp | 2 +- core/src/NetworkObjectDirectory.h | 2 +- core/src/NetworkObjectDirectoryManager.cpp | 2 +- core/src/NetworkObjectDirectoryManager.h | 2 +- core/src/NetworkObjectDirectoryPluginInterface.h | 2 +- core/src/NetworkObjectModel.h | 2 +- core/src/ObjectManager.h | 2 +- core/src/PlatformCoreFunctions.h | 2 +- core/src/PlatformFilesystemFunctions.h | 2 +- core/src/PlatformInputDeviceFunctions.h | 2 +- core/src/PlatformNetworkFunctions.h | 2 +- core/src/PlatformPluginInterface.h | 2 +- core/src/PlatformPluginManager.cpp | 2 +- core/src/PlatformPluginManager.h | 2 +- core/src/PlatformServiceFunctions.h | 2 +- core/src/PlatformSessionFunctions.h | 2 +- core/src/PlatformUserFunctions.h | 2 +- core/src/Plugin.h | 2 +- core/src/PluginInterface.h | 2 +- core/src/PluginManager.cpp | 2 +- core/src/PluginManager.h | 2 +- core/src/ProcessHelper.cpp | 2 +- core/src/ProcessHelper.h | 2 +- core/src/QmlCore.cpp | 2 +- core/src/QmlCore.h | 2 +- core/src/QtCompat.h | 2 +- core/src/RfbClientCallback.h | 2 +- core/src/Screenshot.cpp | 2 +- core/src/Screenshot.h | 2 +- core/src/ServiceControl.cpp | 2 +- core/src/ServiceControl.h | 2 +- core/src/SocketDevice.h | 2 +- core/src/SystemTrayIcon.cpp | 2 +- core/src/SystemTrayIcon.h | 2 +- core/src/ToolButton.cpp | 2 +- core/src/ToolButton.h | 2 +- core/src/TranslationLoader.cpp | 2 +- core/src/TranslationLoader.h | 2 +- core/src/UserGroupsBackendInterface.h | 2 +- core/src/UserGroupsBackendManager.cpp | 2 +- core/src/UserGroupsBackendManager.h | 2 +- core/src/VariantArrayMessage.cpp | 2 +- core/src/VariantArrayMessage.h | 2 +- core/src/VariantStream.cpp | 2 +- core/src/VariantStream.h | 2 +- core/src/VeyonConfiguration.cpp | 2 +- core/src/VeyonConfiguration.h | 2 +- core/src/VeyonConfigurationProperties.h | 2 +- core/src/VeyonConnection.cpp | 2 +- core/src/VeyonConnection.h | 2 +- core/src/VeyonCore.cpp | 2 +- core/src/VeyonCore.h | 2 +- core/src/VeyonMasterInterface.h | 2 +- core/src/VeyonServerInterface.h | 2 +- core/src/VeyonServiceControl.cpp | 2 +- core/src/VeyonServiceControl.h | 2 +- core/src/VeyonWorkerInterface.h | 2 +- core/src/VncClientProtocol.cpp | 2 +- core/src/VncClientProtocol.h | 2 +- core/src/VncConnection.cpp | 2 +- core/src/VncConnection.h | 2 +- core/src/VncConnectionConfiguration.h | 2 +- core/src/VncEvents.cpp | 2 +- core/src/VncEvents.h | 2 +- core/src/VncFeatureMessageEvent.cpp | 2 +- core/src/VncFeatureMessageEvent.h | 2 +- core/src/VncServerClient.h | 2 +- core/src/VncServerPluginInterface.h | 2 +- core/src/VncServerProtocol.cpp | 2 +- core/src/VncServerProtocol.h | 2 +- core/src/VncView.cpp | 2 +- core/src/VncView.h | 2 +- core/src/VncViewItem.cpp | 2 +- core/src/VncViewItem.h | 2 +- core/src/VncViewWidget.cpp | 2 +- core/src/VncViewWidget.h | 2 +- master/src/CheckableItemProxyModel.cpp | 2 +- master/src/CheckableItemProxyModel.h | 2 +- master/src/ComputerControlListModel.cpp | 2 +- master/src/ComputerControlListModel.h | 2 +- master/src/ComputerImageProvider.cpp | 2 +- master/src/ComputerImageProvider.h | 2 +- master/src/ComputerManager.cpp | 2 +- master/src/ComputerManager.h | 2 +- master/src/ComputerMonitoringItem.cpp | 2 +- master/src/ComputerMonitoringItem.h | 2 +- master/src/ComputerMonitoringModel.cpp | 2 +- master/src/ComputerMonitoringModel.h | 2 +- master/src/ComputerMonitoringView.cpp | 2 +- master/src/ComputerMonitoringView.h | 2 +- master/src/ComputerMonitoringWidget.cpp | 2 +- master/src/ComputerMonitoringWidget.h | 2 +- master/src/ComputerSelectModel.cpp | 2 +- master/src/ComputerSelectModel.h | 2 +- master/src/ComputerSelectPanel.cpp | 2 +- master/src/ComputerSelectPanel.h | 2 +- master/src/ComputerZoomWidget.cpp | 2 +- master/src/ComputerZoomWidget.h | 2 +- master/src/DocumentationFigureCreator.cpp | 2 +- master/src/DocumentationFigureCreator.h | 2 +- master/src/FeatureListModel.cpp | 2 +- master/src/FeatureListModel.h | 2 +- master/src/FlexibleListView.cpp | 2 +- master/src/FlexibleListView.h | 2 +- master/src/LocationDialog.cpp | 2 +- master/src/LocationDialog.h | 2 +- master/src/MainToolBar.cpp | 2 +- master/src/MainToolBar.h | 2 +- master/src/MainWindow.cpp | 2 +- master/src/MainWindow.h | 2 +- master/src/NetworkObjectFilterProxyModel.cpp | 2 +- master/src/NetworkObjectFilterProxyModel.h | 2 +- master/src/NetworkObjectOverlayDataModel.cpp | 2 +- master/src/NetworkObjectOverlayDataModel.h | 2 +- master/src/NetworkObjectTreeModel.cpp | 2 +- master/src/NetworkObjectTreeModel.h | 2 +- master/src/ScreenshotManagementPanel.cpp | 2 +- master/src/ScreenshotManagementPanel.h | 2 +- master/src/SlideshowModel.cpp | 2 +- master/src/SlideshowModel.h | 2 +- master/src/SlideshowPanel.cpp | 2 +- master/src/SlideshowPanel.h | 2 +- master/src/SpotlightModel.cpp | 2 +- master/src/SpotlightModel.h | 2 +- master/src/SpotlightPanel.cpp | 2 +- master/src/SpotlightPanel.h | 2 +- master/src/UserConfig.cpp | 2 +- master/src/UserConfig.h | 2 +- master/src/VeyonMaster.cpp | 2 +- master/src/VeyonMaster.h | 2 +- master/src/main.cpp | 2 +- master/veyon-master.rc.in | 2 +- plugins/authkeys/AuthKeysConfiguration.h | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.cpp | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.h | 2 +- plugins/authkeys/AuthKeysManager.cpp | 2 +- plugins/authkeys/AuthKeysManager.h | 2 +- plugins/authkeys/AuthKeysPlugin.cpp | 2 +- plugins/authkeys/AuthKeysPlugin.h | 2 +- plugins/authkeys/AuthKeysTableModel.cpp | 2 +- plugins/authkeys/AuthKeysTableModel.h | 2 +- plugins/authlogon/AuthLogonDialog.cpp | 2 +- plugins/authlogon/AuthLogonDialog.h | 2 +- plugins/authlogon/AuthLogonPlugin.cpp | 2 +- plugins/authlogon/AuthLogonPlugin.h | 2 +- plugins/authsimple/AuthSimpleConfiguration.h | 2 +- plugins/authsimple/AuthSimpleDialog.cpp | 2 +- plugins/authsimple/AuthSimpleDialog.h | 2 +- plugins/authsimple/AuthSimplePlugin.cpp | 2 +- plugins/authsimple/AuthSimplePlugin.h | 2 +- plugins/builtindirectory/BuiltinDirectory.cpp | 2 +- plugins/builtindirectory/BuiltinDirectory.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfiguration.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.h | 2 +- plugins/demo/DemoAuthentication.cpp | 2 +- plugins/demo/DemoAuthentication.h | 2 +- plugins/demo/DemoClient.cpp | 2 +- plugins/demo/DemoClient.h | 2 +- plugins/demo/DemoConfiguration.h | 2 +- plugins/demo/DemoConfigurationPage.cpp | 2 +- plugins/demo/DemoConfigurationPage.h | 2 +- plugins/demo/DemoFeaturePlugin.cpp | 2 +- plugins/demo/DemoFeaturePlugin.h | 2 +- plugins/demo/DemoServer.cpp | 2 +- plugins/demo/DemoServer.h | 2 +- plugins/demo/DemoServerConnection.cpp | 2 +- plugins/demo/DemoServerConnection.h | 2 +- plugins/demo/DemoServerProtocol.cpp | 2 +- plugins/demo/DemoServerProtocol.h | 2 +- plugins/desktopservices/DesktopServiceObject.cpp | 2 +- plugins/desktopservices/DesktopServiceObject.h | 2 +- plugins/desktopservices/DesktopServicesConfiguration.h | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.cpp | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.h | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.cpp | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.h | 2 +- plugins/desktopservices/OpenWebsiteDialog.cpp | 2 +- plugins/desktopservices/OpenWebsiteDialog.h | 2 +- plugins/desktopservices/StartAppDialog.cpp | 2 +- plugins/desktopservices/StartAppDialog.h | 2 +- plugins/filetransfer/FileReadThread.cpp | 2 +- plugins/filetransfer/FileReadThread.h | 2 +- plugins/filetransfer/FileTransferConfiguration.h | 2 +- plugins/filetransfer/FileTransferConfigurationPage.cpp | 2 +- plugins/filetransfer/FileTransferConfigurationPage.h | 2 +- plugins/filetransfer/FileTransferController.cpp | 2 +- plugins/filetransfer/FileTransferController.h | 2 +- plugins/filetransfer/FileTransferDialog.cpp | 2 +- plugins/filetransfer/FileTransferDialog.h | 2 +- plugins/filetransfer/FileTransferListModel.cpp | 2 +- plugins/filetransfer/FileTransferListModel.h | 2 +- plugins/filetransfer/FileTransferPlugin.cpp | 2 +- plugins/filetransfer/FileTransferPlugin.h | 2 +- plugins/filetransfer/FileTransferUserConfiguration.h | 2 +- plugins/platform/common/LogonHelper.cpp | 2 +- plugins/platform/common/LogonHelper.h | 2 +- plugins/platform/common/PersistentLogonCredentials.cpp | 2 +- plugins/platform/common/PersistentLogonCredentials.h | 2 +- plugins/platform/common/PlatformSessionManager.cpp | 2 +- plugins/platform/common/PlatformSessionManager.h | 2 +- plugins/platform/common/ServiceDataManager.cpp | 2 +- plugins/platform/common/ServiceDataManager.h | 2 +- plugins/platform/linux/LinuxCoreFunctions.cpp | 2 +- plugins/platform/linux/LinuxCoreFunctions.h | 2 +- plugins/platform/linux/LinuxDesktopIntegration.h | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.cpp | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.h | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.cpp | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.h | 2 +- plugins/platform/linux/LinuxKeyboardInput.cpp | 2 +- plugins/platform/linux/LinuxKeyboardInput.h | 2 +- plugins/platform/linux/LinuxKeyboardShortcutTrapper.h | 2 +- plugins/platform/linux/LinuxNetworkFunctions.cpp | 2 +- plugins/platform/linux/LinuxNetworkFunctions.h | 2 +- plugins/platform/linux/LinuxPlatformConfiguration.h | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.cpp | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.h | 2 +- plugins/platform/linux/LinuxPlatformPlugin.cpp | 2 +- plugins/platform/linux/LinuxPlatformPlugin.h | 2 +- plugins/platform/linux/LinuxServerProcess.cpp | 2 +- plugins/platform/linux/LinuxServerProcess.h | 2 +- plugins/platform/linux/LinuxServiceCore.cpp | 2 +- plugins/platform/linux/LinuxServiceCore.h | 2 +- plugins/platform/linux/LinuxServiceFunctions.cpp | 2 +- plugins/platform/linux/LinuxServiceFunctions.h | 2 +- plugins/platform/linux/LinuxSessionFunctions.cpp | 2 +- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- plugins/platform/linux/LinuxUserFunctions.cpp | 2 +- plugins/platform/linux/LinuxUserFunctions.h | 2 +- plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp | 2 +- plugins/platform/windows/DesktopInputController.cpp | 2 +- plugins/platform/windows/DesktopInputController.h | 2 +- plugins/platform/windows/SasEventListener.cpp | 2 +- plugins/platform/windows/SasEventListener.h | 2 +- plugins/platform/windows/WindowsCoreFunctions.cpp | 2 +- plugins/platform/windows/WindowsCoreFunctions.h | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.cpp | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.h | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.cpp | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.h | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.h | 2 +- plugins/platform/windows/WindowsNetworkFunctions.cpp | 2 +- plugins/platform/windows/WindowsNetworkFunctions.h | 2 +- plugins/platform/windows/WindowsPlatformConfiguration.h | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.cpp | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.h | 2 +- plugins/platform/windows/WindowsPlatformPlugin.cpp | 2 +- plugins/platform/windows/WindowsPlatformPlugin.h | 2 +- plugins/platform/windows/WindowsServiceControl.cpp | 2 +- plugins/platform/windows/WindowsServiceControl.h | 2 +- plugins/platform/windows/WindowsServiceCore.cpp | 2 +- plugins/platform/windows/WindowsServiceCore.h | 2 +- plugins/platform/windows/WindowsServiceFunctions.cpp | 2 +- plugins/platform/windows/WindowsServiceFunctions.h | 2 +- plugins/platform/windows/WindowsSessionFunctions.cpp | 2 +- plugins/platform/windows/WindowsSessionFunctions.h | 2 +- plugins/platform/windows/WindowsUserFunctions.cpp | 2 +- plugins/platform/windows/WindowsUserFunctions.h | 2 +- plugins/platform/windows/WtsSessionManager.cpp | 2 +- plugins/platform/windows/WtsSessionManager.h | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.cpp | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.h | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.cpp | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.h | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.h | 2 +- plugins/remoteaccess/RemoteAccessPage.cpp | 2 +- plugins/remoteaccess/RemoteAccessPage.h | 2 +- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- plugins/remoteaccess/RemoteAccessWidget.h | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.cpp | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.cpp | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotListModel.cpp | 2 +- plugins/screenshot/ScreenshotListModel.h | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.cpp | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.h | 2 +- plugins/testing/TestingCommandLinePlugin.cpp | 2 +- plugins/testing/TestingCommandLinePlugin.h | 2 +- plugins/textmessage/TextMessageDialog.cpp | 2 +- plugins/textmessage/TextMessageDialog.h | 2 +- plugins/textmessage/TextMessageFeaturePlugin.cpp | 2 +- plugins/textmessage/TextMessageFeaturePlugin.h | 2 +- plugins/usersessioncontrol/UserLoginDialog.cpp | 2 +- plugins/usersessioncontrol/UserLoginDialog.h | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.cpp | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.h | 2 +- plugins/vncserver/external/ExternalVncServer.cpp | 2 +- plugins/vncserver/external/ExternalVncServer.h | 2 +- plugins/vncserver/external/ExternalVncServerConfiguration.h | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.cpp | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.h | 2 +- plugins/vncserver/headless/HeadlessVncConfiguration.h | 2 +- plugins/vncserver/headless/HeadlessVncServer.cpp | 2 +- plugins/vncserver/headless/HeadlessVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h | 2 +- plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h | 2 +- server/src/ComputerControlClient.cpp | 2 +- server/src/ComputerControlClient.h | 2 +- server/src/ComputerControlServer.cpp | 2 +- server/src/ComputerControlServer.h | 2 +- server/src/ServerAccessControlManager.cpp | 2 +- server/src/ServerAccessControlManager.h | 2 +- server/src/ServerAuthenticationManager.cpp | 2 +- server/src/ServerAuthenticationManager.h | 2 +- server/src/TlsServer.cpp | 2 +- server/src/TlsServer.h | 2 +- server/src/VeyonServerProtocol.cpp | 2 +- server/src/VeyonServerProtocol.h | 2 +- server/src/VncProxyConnection.cpp | 2 +- server/src/VncProxyConnection.h | 2 +- server/src/VncProxyConnectionFactory.h | 2 +- server/src/VncProxyServer.cpp | 2 +- server/src/VncProxyServer.h | 2 +- server/src/VncServer.cpp | 2 +- server/src/VncServer.h | 2 +- server/src/main.cpp | 2 +- server/veyon-server.rc.in | 2 +- service/src/main.cpp | 2 +- service/veyon-service.rc.in | 2 +- worker/src/FeatureWorkerManagerConnection.cpp | 2 +- worker/src/FeatureWorkerManagerConnection.h | 2 +- worker/src/VeyonWorker.cpp | 2 +- worker/src/VeyonWorker.h | 2 +- worker/src/main.cpp | 2 +- worker/veyon-worker.rc.in | 2 +- 464 files changed, 464 insertions(+), 464 deletions(-) diff --git a/README.md b/README.md index 85780d999..110ea1600 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The following features are available in Veyon: ## License -Copyright (c) 2004-2022 Tobias Junghans / Veyon Solutions. +Copyright (c) 2004-2023 Tobias Junghans / Veyon Solutions. See the file COPYING for the GNU GENERAL PUBLIC LICENSE. diff --git a/cli/src/ConfigCommands.cpp b/cli/src/ConfigCommands.cpp index 1ade55f73..365cc6813 100644 --- a/cli/src/ConfigCommands.cpp +++ b/cli/src/ConfigCommands.cpp @@ -1,7 +1,7 @@ /* * ConfigCommands.cpp - implementation of ConfigCommands class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ConfigCommands.h b/cli/src/ConfigCommands.h index 395f8de5c..66b2ae782 100644 --- a/cli/src/ConfigCommands.h +++ b/cli/src/ConfigCommands.h @@ -1,7 +1,7 @@ /* * ConfigCommands.h - declaration of ConfigCommands class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index 81e57c740..971bfeac0 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -1,7 +1,7 @@ /* * FeatureCommands.cpp - implementation of FeatureCommands class * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/FeatureCommands.h b/cli/src/FeatureCommands.h index 4e399ac5d..52a8a77f9 100644 --- a/cli/src/FeatureCommands.h +++ b/cli/src/FeatureCommands.h @@ -1,7 +1,7 @@ /* * FeatureCommands.h - declaration of FeatureCommands class * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginCommands.cpp b/cli/src/PluginCommands.cpp index 951787886..0cf8f1c6c 100644 --- a/cli/src/PluginCommands.cpp +++ b/cli/src/PluginCommands.cpp @@ -1,7 +1,7 @@ /* * PluginsCommands.cpp - implementation of PluginsCommands class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginCommands.h b/cli/src/PluginCommands.h index fe74307cc..d83565ce9 100644 --- a/cli/src/PluginCommands.h +++ b/cli/src/PluginCommands.h @@ -1,7 +1,7 @@ /* * PluginsCommands.h - declaration of PluginsCommands class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ServiceControlCommands.cpp b/cli/src/ServiceControlCommands.cpp index 9e57d6640..566462294 100644 --- a/cli/src/ServiceControlCommands.cpp +++ b/cli/src/ServiceControlCommands.cpp @@ -1,7 +1,7 @@ /* * ServiceControlCommands.cpp - implementation of ServiceControlCommands class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ServiceControlCommands.h b/cli/src/ServiceControlCommands.h index 002465f14..acf778e8c 100644 --- a/cli/src/ServiceControlCommands.h +++ b/cli/src/ServiceControlCommands.h @@ -1,7 +1,7 @@ /* * ServiceControlCommands.h - declaration of ServiceControlCommands class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ShellCommands.cpp b/cli/src/ShellCommands.cpp index 83889fbef..1ddd7e33c 100644 --- a/cli/src/ShellCommands.cpp +++ b/cli/src/ShellCommands.cpp @@ -1,7 +1,7 @@ /* * ShellCommands.cpp - implementation of ShellCommands class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ShellCommands.h b/cli/src/ShellCommands.h index d3095cdbd..8e06824d4 100644 --- a/cli/src/ShellCommands.h +++ b/cli/src/ShellCommands.h @@ -1,7 +1,7 @@ /* * ShellCommands.h - declaration of ShellCommands class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/main.cpp b/cli/src/main.cpp index 1fb143dd7..7fc2a69b5 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon CLI * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/veyon-cli.rc.in b/cli/veyon-cli.rc.in index b76f34d1d..c3f3448a5 100644 --- a/cli/veyon-cli.rc.in +++ b/cli/veyon-cli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-cli.exe\0" END END diff --git a/cli/veyon-wcli.rc.in b/cli/veyon-wcli.rc.in index 522a3074e..0fd740042 100644 --- a/cli/veyon-wcli.rc.in +++ b/cli/veyon-wcli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (non-console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-wcli.exe\0" END END diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index 0611a2a0a..e5b1f9161 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -1,4 +1,4 @@ -# BuildVeyonApplication.cmake - Copyright (c) 2019-2022 Tobias Junghans +# BuildVeyonApplication.cmake - Copyright (c) 2019-2023 Tobias Junghans # # description: build Veyon application # usage: build_veyon_application( ) diff --git a/cmake/modules/BuildVeyonFuzzer.cmake b/cmake/modules/BuildVeyonFuzzer.cmake index efd4418bf..6c91ffb5d 100644 --- a/cmake/modules/BuildVeyonFuzzer.cmake +++ b/cmake/modules/BuildVeyonFuzzer.cmake @@ -1,4 +1,4 @@ -# BuildVeyonFuzzer.cmake - Copyright (c) 2021-2022 Tobias Junghans +# BuildVeyonFuzzer.cmake - Copyright (c) 2021-2023 Tobias Junghans # # description: build fuzzer test for Veyon component # usage: build_veyon_fuzzer( ) diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index be2091550..7630255a5 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -1,4 +1,4 @@ -# BuildVeyonPlugin.cmake - Copyright (c) 2017-2022 Tobias Junghans +# BuildVeyonPlugin.cmake - Copyright (c) 2017-2023 Tobias Junghans # # description: build Veyon plugin # usage: build_veyon_plugin( ) diff --git a/cmake/modules/CreateTranslations.cmake b/cmake/modules/CreateTranslations.cmake index 68b25100f..df3e3b33e 100644 --- a/cmake/modules/CreateTranslations.cmake +++ b/cmake/modules/CreateTranslations.cmake @@ -1,4 +1,4 @@ -# CreateTranslations.cmake - Copyright (c) 2020-2022 Tobias Junghans +# CreateTranslations.cmake - Copyright (c) 2020-2023 Tobias Junghans # # description: create Qt translation files # usage: create_translations( ) diff --git a/cmake/modules/FindLibVNCClient.cmake b/cmake/modules/FindLibVNCClient.cmake index 6f7b44182..809031bb5 100644 --- a/cmake/modules/FindLibVNCClient.cmake +++ b/cmake/modules/FindLibVNCClient.cmake @@ -23,7 +23,7 @@ # The LibVNCClient library #============================================================================= -# SPDX-FileCopyrightText: 2020-2022 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2023 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/cmake/modules/FindLibVNCServer.cmake b/cmake/modules/FindLibVNCServer.cmake index 07932097a..687ddcac3 100644 --- a/cmake/modules/FindLibVNCServer.cmake +++ b/cmake/modules/FindLibVNCServer.cmake @@ -23,7 +23,7 @@ # The LibVNCServer library #============================================================================= -# SPDX-FileCopyrightText: 2020-2022 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2023 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index 7e92008d7..0349c3623 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -1,7 +1,7 @@ /* * AccessControlPage.cpp - implementation of the access control page * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlPage.h b/configurator/src/AccessControlPage.h index 024ff7d52..0452f67b9 100644 --- a/configurator/src/AccessControlPage.h +++ b/configurator/src/AccessControlPage.h @@ -1,7 +1,7 @@ /* * AccessControlPage.h - header for the AccessControlPage class * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index 4928bc3ee..4bf8217be 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.cpp - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.h b/configurator/src/AccessControlRuleEditDialog.h index 4d08b812f..cc7aa56bd 100644 --- a/configurator/src/AccessControlRuleEditDialog.h +++ b/configurator/src/AccessControlRuleEditDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.h - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.cpp b/configurator/src/AccessControlRuleListModel.cpp index 05ab6b193..2646dae0d 100644 --- a/configurator/src/AccessControlRuleListModel.cpp +++ b/configurator/src/AccessControlRuleListModel.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.cpp - data model for access control rules * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.h b/configurator/src/AccessControlRuleListModel.h index 24dfa5cc9..e16bec83f 100644 --- a/configurator/src/AccessControlRuleListModel.h +++ b/configurator/src/AccessControlRuleListModel.h @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.h - data model for access control rules * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index 6bf3dfe08..692c12e37 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.cpp - dialog for testing access control rules * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.h b/configurator/src/AccessControlRulesTestDialog.h index 6c70b693b..bf3d85b0d 100644 --- a/configurator/src/AccessControlRulesTestDialog.h +++ b/configurator/src/AccessControlRulesTestDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.h - dialog for testing access control rules * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.cpp b/configurator/src/AuthenticationPage.cpp index 80ec9dc38..22ece0701 100644 --- a/configurator/src/AuthenticationPage.cpp +++ b/configurator/src/AuthenticationPage.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPage.cpp - implementation of the AuthenticationPage class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.h b/configurator/src/AuthenticationPage.h index c5e1ca182..f0352f1fc 100644 --- a/configurator/src/AuthenticationPage.h +++ b/configurator/src/AuthenticationPage.h @@ -1,7 +1,7 @@ /* * AuthenticationPage.h - header for the AuthenticationPage class * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.cpp b/configurator/src/AuthenticationPageTab.cpp index 4d48bce16..074b00fb7 100644 --- a/configurator/src/AuthenticationPageTab.cpp +++ b/configurator/src/AuthenticationPageTab.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.cpp - implementation of the AuthenticationPageTab class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.h b/configurator/src/AuthenticationPageTab.h index ed4eba70d..d942e35d8 100644 --- a/configurator/src/AuthenticationPageTab.h +++ b/configurator/src/AuthenticationPageTab.h @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.h - header for the AuthenticationPageTab class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index afff384d0..097b946e9 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.cpp - configuration page with general settings * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.h b/configurator/src/GeneralConfigurationPage.h index 836fdb5e7..6af46b8ba 100644 --- a/configurator/src/GeneralConfigurationPage.h +++ b/configurator/src/GeneralConfigurationPage.h @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.h - configuration page with general settings * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index 5bcf2b181..13fc5bf86 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.h b/configurator/src/MainWindow.h index 491833f9c..683bd018a 100644 --- a/configurator/src/MainWindow.h +++ b/configurator/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of the Veyon Configurator * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index 99f395e94..6690ae1a5 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.cpp - page for configuring master application * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.h b/configurator/src/MasterConfigurationPage.h index ee7ad5f30..3a258d1a3 100644 --- a/configurator/src/MasterConfigurationPage.h +++ b/configurator/src/MasterConfigurationPage.h @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.h - header for the MasterConfigurationPage class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp index 2ae076cd5..174e5549a 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPage.cpp - implementation of the NetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.h b/configurator/src/NetworkObjectDirectoryConfigurationPage.h index 30a476bb4..3c58078e3 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.h +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPage.h - header for the NetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp index ea6c9993b..051abc3b1 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPageTab.cpp - implementation of the NetworkObjectDirectoryConfigurationPageTab class * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h index d06e00076..0d322a81a 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPageTab.h - header for the NetworkObjectDirectoryConfigurationPageTab class * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index d8d83321c..15a498329 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.h b/configurator/src/ServiceConfigurationPage.h index e907b73be..4a8bb3385 100644 --- a/configurator/src/ServiceConfigurationPage.h +++ b/configurator/src/ServiceConfigurationPage.h @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.h - header for the ServiceConfigurationPage class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/main.cpp b/configurator/src/main.cpp index d67d9c4ff..6717e1030 100644 --- a/configurator/src/main.cpp +++ b/configurator/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Configurator * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/veyon-configurator.rc.in b/configurator/veyon-configurator.rc.in index 5bcb4039b..95196cfa6 100644 --- a/configurator/veyon-configurator.rc.in +++ b/configurator/veyon-configurator.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Configurator\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-configurator.exe\0" END END diff --git a/core/src/AboutDialog.cpp b/core/src/AboutDialog.cpp index 58492814e..db183396e 100644 --- a/core/src/AboutDialog.cpp +++ b/core/src/AboutDialog.cpp @@ -1,7 +1,7 @@ /* * AboutDialog.cpp - implementation of AboutDialog * - * Copyright (c) 2011-2022 Tobias Junghans + * Copyright (c) 2011-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.h b/core/src/AboutDialog.h index e8386054c..93fea3d74 100644 --- a/core/src/AboutDialog.h +++ b/core/src/AboutDialog.h @@ -1,7 +1,7 @@ /* * AboutDialog.h - declaration of AboutDialog class * - * Copyright (c) 2011-2022 Tobias Junghans + * Copyright (c) 2011-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.ui b/core/src/AboutDialog.ui index 9884a21d2..22c72eb53 100644 --- a/core/src/AboutDialog.ui +++ b/core/src/AboutDialog.ui @@ -149,7 +149,7 @@ - Copyright © 2004-2022 Tobias Junghans / Veyon Solutions + Copyright © 2004-2023 Tobias Junghans / Veyon Solutions diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index aae68a758..e47f67500 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -1,7 +1,7 @@ /* * AccessControlProvider.cpp - implementation of the AccessControlProvider class * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index e3b437a06..021bec200 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -1,7 +1,7 @@ /* * AccessControlProvider.h - declaration of class AccessControlProvider * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.cpp b/core/src/AccessControlRule.cpp index 0551cde39..c25561558 100644 --- a/core/src/AccessControlRule.cpp +++ b/core/src/AccessControlRule.cpp @@ -1,7 +1,7 @@ /* * AccessControlRule.cpp - implementation of the AccessControlRule class * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index bf093a235..4b613212a 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -1,7 +1,7 @@ /* * AccessControlRule.h - declaration of class AccessControlRule * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationCredentials.h b/core/src/AuthenticationCredentials.h index 93d0166e4..e27312768 100644 --- a/core/src/AuthenticationCredentials.h +++ b/core/src/AuthenticationCredentials.h @@ -1,7 +1,7 @@ /* * AuthenticationCredentials.h - class holding credentials for authentication * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.cpp b/core/src/AuthenticationManager.cpp index 644b79cc3..f0dd5d7cf 100644 --- a/core/src/AuthenticationManager.cpp +++ b/core/src/AuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * AuthenticationManager.cpp - implementation of AuthenticationManager * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.h b/core/src/AuthenticationManager.h index dd0f2d515..8cb1e7a28 100644 --- a/core/src/AuthenticationManager.h +++ b/core/src/AuthenticationManager.h @@ -1,7 +1,7 @@ /* * AuthenticationManager.h - header file for AuthenticationManager * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.cpp b/core/src/AuthenticationPluginInterface.cpp index c6bd25440..223c26d89 100644 --- a/core/src/AuthenticationPluginInterface.cpp +++ b/core/src/AuthenticationPluginInterface.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.cpp - interface class for authentication plugins * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.h b/core/src/AuthenticationPluginInterface.h index 823f0d2f8..ecd07e3a7 100644 --- a/core/src/AuthenticationPluginInterface.h +++ b/core/src/AuthenticationPluginInterface.h @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.h - interface class for authentication plugins * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.cpp b/core/src/BuiltinFeatures.cpp index bdce34326..02413ceb8 100644 --- a/core/src/BuiltinFeatures.cpp +++ b/core/src/BuiltinFeatures.cpp @@ -1,7 +1,7 @@ /* * BuiltinFeatures.cpp - implementation of BuiltinFeatures class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.h b/core/src/BuiltinFeatures.h index d10d23231..68d30fd71 100644 --- a/core/src/BuiltinFeatures.h +++ b/core/src/BuiltinFeatures.h @@ -1,7 +1,7 @@ /* * BuiltinFeatures.h - declaration of BuiltinFeatures class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.cpp b/core/src/CommandLineIO.cpp index 2ea2ad1ea..e211f1d16 100644 --- a/core/src/CommandLineIO.cpp +++ b/core/src/CommandLineIO.cpp @@ -1,7 +1,7 @@ /* * CommandLineIO.cpp - text input/output for command line plugins * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.h b/core/src/CommandLineIO.h index cd314a002..b3505353a 100644 --- a/core/src/CommandLineIO.h +++ b/core/src/CommandLineIO.h @@ -1,7 +1,7 @@ /* * CommandLineIO.h - text input/output for command line plugins * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLinePluginInterface.h b/core/src/CommandLinePluginInterface.h index 1413398df..cb114202d 100644 --- a/core/src/CommandLinePluginInterface.h +++ b/core/src/CommandLinePluginInterface.h @@ -1,7 +1,7 @@ /* * CommandLinePluginInterface.h - interface class for command line plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.cpp b/core/src/Computer.cpp index 9111388d2..dac1dd5dd 100644 --- a/core/src/Computer.cpp +++ b/core/src/Computer.cpp @@ -1,7 +1,7 @@ /* * Computer.cpp - represents a computer and provides control methods and data * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.h b/core/src/Computer.h index 6144dad24..070474760 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -1,7 +1,7 @@ /* * Computer.h - represents a computer and provides control methods and data * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 938455764..3e9276039 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -1,7 +1,7 @@ /* * ComputerControlInterface.cpp - interface class for controlling a computer * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 4fc77b74d..6a10d790c 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -1,7 +1,7 @@ /* * ComputerControlInterface.h - interface class for controlling a computer * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.cpp b/core/src/ComputerListModel.cpp index 3ff373165..fb2115873 100644 --- a/core/src/ComputerListModel.cpp +++ b/core/src/ComputerListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerListModel.cpp - data model base class for computer objects * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index bbbf56388..2dd506311 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -1,7 +1,7 @@ /* * ComputerListModel.h - data model base class for computer objects * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.cpp b/core/src/Configuration/JsonStore.cpp index 4abba98fa..3bc02fb20 100644 --- a/core/src/Configuration/JsonStore.cpp +++ b/core/src/Configuration/JsonStore.cpp @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.cpp - implementation of JsonStore * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.h b/core/src/Configuration/JsonStore.h index 3d152687a..496d34d27 100644 --- a/core/src/Configuration/JsonStore.h +++ b/core/src/Configuration/JsonStore.h @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.h - JsonStore class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index 9bc44e127..6572f6e1b 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -1,7 +1,7 @@ /* * ConfigurationLocalStore.cpp - implementation of LocalStore * - * Copyright (c) 2009-2022 Tobias Junghans + * Copyright (c) 2009-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.h b/core/src/Configuration/LocalStore.h index d1d67cd7e..3adb9b933 100644 --- a/core/src/Configuration/LocalStore.h +++ b/core/src/Configuration/LocalStore.h @@ -1,7 +1,7 @@ /* * Configuration/LocalStore.h - LocalStore class * - * Copyright (c) 2009-2022 Tobias Junghans + * Copyright (c) 2009-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.cpp b/core/src/Configuration/Object.cpp index e684c135b..645b6eb39 100644 --- a/core/src/Configuration/Object.cpp +++ b/core/src/Configuration/Object.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2022 Tobias Junghans + * Copyright (c) 2009-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.h b/core/src/Configuration/Object.h index d7b3960fb..8bc29689e 100644 --- a/core/src/Configuration/Object.h +++ b/core/src/Configuration/Object.h @@ -1,7 +1,7 @@ /* * Configuration/Object.h - ConfigurationObject class * - * Copyright (c) 2009-2022 Tobias Junghans + * Copyright (c) 2009-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.cpp b/core/src/Configuration/Password.cpp index 9c90db892..980dc5dac 100644 --- a/core/src/Configuration/Password.cpp +++ b/core/src/Configuration/Password.cpp @@ -1,7 +1,7 @@ /* * Password.cpp - implementation of Configuration::Password * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.h b/core/src/Configuration/Password.h index e571b39ba..3bd33d9df 100644 --- a/core/src/Configuration/Password.h +++ b/core/src/Configuration/Password.h @@ -1,7 +1,7 @@ /* * Configuration/Password.h - Configuration::Password class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index 750095bb3..d81de4733 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2022 Tobias Junghans + * Copyright (c) 2009-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.h b/core/src/Configuration/Property.h index 58acf80a4..9623073b4 100644 --- a/core/src/Configuration/Property.h +++ b/core/src/Configuration/Property.h @@ -1,7 +1,7 @@ /* * Configuration/Property.h - Configuration::Property class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.cpp b/core/src/Configuration/Proxy.cpp index de5c88c45..92a7f1048 100644 --- a/core/src/Configuration/Proxy.cpp +++ b/core/src/Configuration/Proxy.cpp @@ -1,7 +1,7 @@ /* * Proxy.cpp - implementation of Configuration::Proxy * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.h b/core/src/Configuration/Proxy.h index f0e151916..2d543e377 100644 --- a/core/src/Configuration/Proxy.h +++ b/core/src/Configuration/Proxy.h @@ -1,7 +1,7 @@ /* * Configuration/Proxy.h - ConfigurationProxy class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Store.h b/core/src/Configuration/Store.h index 6c8353cad..6abcdeec3 100644 --- a/core/src/Configuration/Store.h +++ b/core/src/Configuration/Store.h @@ -1,7 +1,7 @@ /* * Configuration/Store.h - ConfigurationStore class * - * Copyright (c) 2009-2022 Tobias Junghans + * Copyright (c) 2009-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.cpp b/core/src/Configuration/UiMapping.cpp index 36b6e4650..7126865dc 100644 --- a/core/src/Configuration/UiMapping.cpp +++ b/core/src/Configuration/UiMapping.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2022 Tobias Junghans + * Copyright (c) 2009-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.h b/core/src/Configuration/UiMapping.h index b88cf9b23..34ac26027 100644 --- a/core/src/Configuration/UiMapping.h +++ b/core/src/Configuration/UiMapping.h @@ -1,7 +1,7 @@ /* * Configuration/UiMapping.h - helper macros and functions for connecting config with UI * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.cpp b/core/src/ConfigurationManager.cpp index 5a88c2d65..509e09981 100644 --- a/core/src/ConfigurationManager.cpp +++ b/core/src/ConfigurationManager.cpp @@ -1,7 +1,7 @@ /* * ConfigurationManager.cpp - class for managing Veyon's configuration * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.h b/core/src/ConfigurationManager.h index 1625b6d17..ce97d6ecf 100644 --- a/core/src/ConfigurationManager.h +++ b/core/src/ConfigurationManager.h @@ -1,7 +1,7 @@ /* * ConfigurationManager.h - class for managing Veyon's configuration * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.cpp b/core/src/ConfigurationPage.cpp index 1d3186453..7866881fa 100644 --- a/core/src/ConfigurationPage.cpp +++ b/core/src/ConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ConfigurationPage.cpp - implementation of configuration page base class * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.h b/core/src/ConfigurationPage.h index 96cf830e7..44b5e4e61 100644 --- a/core/src/ConfigurationPage.h +++ b/core/src/ConfigurationPage.h @@ -1,7 +1,7 @@ /* * ConfigurationPage.h - base class for all configuration pages * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPagePluginInterface.h b/core/src/ConfigurationPagePluginInterface.h index 588417c9b..641bdd606 100644 --- a/core/src/ConfigurationPagePluginInterface.h +++ b/core/src/ConfigurationPagePluginInterface.h @@ -1,7 +1,7 @@ /* * ConfigurationPagePluginInterface.h - interface class for configuration pages * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index 0095dedd8..89b81d61b 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -1,7 +1,7 @@ /* * CryptoCore.cpp - core functions for crypto features * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.h b/core/src/CryptoCore.h index da2b1ecf3..dc9f8f532 100644 --- a/core/src/CryptoCore.h +++ b/core/src/CryptoCore.h @@ -1,7 +1,7 @@ /* * CryptoCore.h - core functions for crypto features * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index dede1e87e..5ba0c7be6 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.cpp - implementation of DesktopAccessDialog class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.h b/core/src/DesktopAccessDialog.h index f72150a23..fba30fc2c 100644 --- a/core/src/DesktopAccessDialog.h +++ b/core/src/DesktopAccessDialog.h @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.h - declaration of DesktopAccessDialog class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/EnumHelper.h b/core/src/EnumHelper.h index 5e7dc19d5..22237ef16 100644 --- a/core/src/EnumHelper.h +++ b/core/src/EnumHelper.h @@ -1,7 +1,7 @@ /* * EnumHelper.h - helper functions for enumerations * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Feature.h b/core/src/Feature.h index e8a848e7a..b2f918f37 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -1,7 +1,7 @@ /* * Feature.h - declaration of the Feature class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 064899a83..b1975737b 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -1,7 +1,7 @@ /* * FeatureManager.cpp - implementation of the FeatureManager class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index a77583b3a..b0705781d 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -1,7 +1,7 @@ /* * FeatureManager.h - header for the FeatureManager class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.cpp b/core/src/FeatureMessage.cpp index 6aa87298d..e8f5426a7 100644 --- a/core/src/FeatureMessage.cpp +++ b/core/src/FeatureMessage.cpp @@ -1,7 +1,7 @@ /* * FeatureMessage.cpp - implementation of a message encapsulation class for features * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.h b/core/src/FeatureMessage.h index 609ab72fc..9ab4389aa 100644 --- a/core/src/FeatureMessage.h +++ b/core/src/FeatureMessage.h @@ -1,7 +1,7 @@ /* * FeatureMessage.h - header for a message encapsulation class for features * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index 18bb36c25..744e11be9 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -1,7 +1,7 @@ /* * FeatureProviderInterface.h - interface class for feature plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index 17c983a6f..38380820b 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.cpp - class for managing feature worker instances * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.h b/core/src/FeatureWorkerManager.h index 8a787f3d5..a5f6770e0 100644 --- a/core/src/FeatureWorkerManager.h +++ b/core/src/FeatureWorkerManager.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.h - class for managing feature worker instances * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.cpp b/core/src/FileSystemBrowser.cpp index 101aea0d9..8bc2702f6 100644 --- a/core/src/FileSystemBrowser.cpp +++ b/core/src/FileSystemBrowser.cpp @@ -1,7 +1,7 @@ /* * FileSystemBrowser.cpp - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.h b/core/src/FileSystemBrowser.h index 1174cbd00..5545729f7 100644 --- a/core/src/FileSystemBrowser.h +++ b/core/src/FileSystemBrowser.h @@ -1,7 +1,7 @@ /* * FileSystemBrowser.h - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index c55b051b0..d460ddf23 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -1,7 +1,7 @@ /* * Filesystem.cpp - filesystem related query and manipulation functions * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.h b/core/src/Filesystem.h index 26e191789..911c9be26 100644 --- a/core/src/Filesystem.h +++ b/core/src/Filesystem.h @@ -1,7 +1,7 @@ /* * Filesystem.h - filesystem related query and manipulation functions * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HashList.h b/core/src/HashList.h index a7f78e0b9..546732275 100644 --- a/core/src/HashList.h +++ b/core/src/HashList.h @@ -1,7 +1,7 @@ /* * HashList.h - extended QHash acting like a list * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index 4bb8ff073..7f8b419bc 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -1,7 +1,7 @@ /* * HostAddress.cpp - implementation of HostAddress class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.h b/core/src/HostAddress.h index 0ee5fbfa1..f4ce85b01 100644 --- a/core/src/HostAddress.h +++ b/core/src/HostAddress.h @@ -1,7 +1,7 @@ /* * HostAddress.h - header for HostAddress class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/KeyboardShortcutTrapper.h b/core/src/KeyboardShortcutTrapper.h index 0ae7d4e8e..a89f2d915 100644 --- a/core/src/KeyboardShortcutTrapper.h +++ b/core/src/KeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * KeyboardShortcutTrapper.h - class for trapping system-wide keyboard shortcuts * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index 1cf238443..8d3a4809e 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -1,7 +1,7 @@ /* * LockWidget.cpp - widget for locking a client * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.h b/core/src/LockWidget.h index 3c8a5e941..574767944 100644 --- a/core/src/LockWidget.h +++ b/core/src/LockWidget.h @@ -1,7 +1,7 @@ /* * LockWidget.h - widget for locking a client * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Lockable.h b/core/src/Lockable.h index e91340f1e..f7ef9e0a2 100644 --- a/core/src/Lockable.h +++ b/core/src/Lockable.h @@ -1,7 +1,7 @@ /* * Lockable.h - header file for Lockable * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockingPointer.h b/core/src/LockingPointer.h index 68e655cc1..36e2f5459 100644 --- a/core/src/LockingPointer.h +++ b/core/src/LockingPointer.h @@ -1,7 +1,7 @@ /* * LockingPointer.h - smart pointer for lockables * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.cpp b/core/src/Logger.cpp index ce7a139d8..9c4f95846 100644 --- a/core/src/Logger.cpp +++ b/core/src/Logger.cpp @@ -1,7 +1,7 @@ /* * Logger.cpp - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.h b/core/src/Logger.h index 21f24b1ea..148b51172 100644 --- a/core/src/Logger.h +++ b/core/src/Logger.h @@ -1,7 +1,7 @@ /* * Logger.h - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MessageContext.h b/core/src/MessageContext.h index 35f181c25..e785a7063 100644 --- a/core/src/MessageContext.h +++ b/core/src/MessageContext.h @@ -1,7 +1,7 @@ /* * MessageContext.h - header for transporting context for message I/O * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index cc3d91fee..9bf8345f1 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -1,7 +1,7 @@ /* * MonitoringMode.cpp - implementation of MonitoringMode class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 3fecc7b72..b1eadbbf0 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -1,7 +1,7 @@ /* * MonitoringMode.h - header for the MonitoringMode class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NestedNetworkObjectDirectory.cpp b/core/src/NestedNetworkObjectDirectory.cpp index 3fb4a1e33..f8649f843 100644 --- a/core/src/NestedNetworkObjectDirectory.cpp +++ b/core/src/NestedNetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * NestedNetworkObjectDirectory.cpp - implementation of NestedNetworkObjectDirectory * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NestedNetworkObjectDirectory.h b/core/src/NestedNetworkObjectDirectory.h index a3e7ea395..1850e6ecd 100644 --- a/core/src/NestedNetworkObjectDirectory.h +++ b/core/src/NestedNetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * NestedNetworkObjectDirectory.cpp - header file for NestedNetworkObjectDirectory * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.cpp b/core/src/NetworkObject.cpp index 59fff8c8f..eb78aeced 100644 --- a/core/src/NetworkObject.cpp +++ b/core/src/NetworkObject.cpp @@ -1,7 +1,7 @@ /* * NetworkObject.cpp - data class representing a network object * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index f6a14ad0b..8a4a2e5a4 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -1,7 +1,7 @@ /* * NetworkObject.h - data class representing a network object * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index 187c31c4d..06f5f4b09 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.cpp - base class for network object directory implementations * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index f8a33bb5b..cc76c84e5 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.h - base class for network object directory implementations * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.cpp b/core/src/NetworkObjectDirectoryManager.cpp index b1f1f917f..83a9731fd 100644 --- a/core/src/NetworkObjectDirectoryManager.cpp +++ b/core/src/NetworkObjectDirectoryManager.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.cpp - implementation of NetworkObjectDirectoryManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.h b/core/src/NetworkObjectDirectoryManager.h index 6d010bf14..7994dc199 100644 --- a/core/src/NetworkObjectDirectoryManager.h +++ b/core/src/NetworkObjectDirectoryManager.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.h - header file for NetworkObjectDirectoryManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryPluginInterface.h b/core/src/NetworkObjectDirectoryPluginInterface.h index 556727402..108814b6b 100644 --- a/core/src/NetworkObjectDirectoryPluginInterface.h +++ b/core/src/NetworkObjectDirectoryPluginInterface.h @@ -2,7 +2,7 @@ * NetworkObjectDirectoryPluginInterface.h - plugin interface for network * object directory implementations * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectModel.h b/core/src/NetworkObjectModel.h index 97d4295fa..01465eaf4 100644 --- a/core/src/NetworkObjectModel.h +++ b/core/src/NetworkObjectModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectModel.h - base class for data models providing grouped network objects * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ObjectManager.h b/core/src/ObjectManager.h index 97c824462..da8c626cd 100644 --- a/core/src/ObjectManager.h +++ b/core/src/ObjectManager.h @@ -1,7 +1,7 @@ /* * ObjectManager.h - header file for ObjectManager * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformCoreFunctions.h b/core/src/PlatformCoreFunctions.h index 5c47430bc..df80ecf1d 100644 --- a/core/src/PlatformCoreFunctions.h +++ b/core/src/PlatformCoreFunctions.h @@ -1,7 +1,7 @@ /* * PlatformCoreFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformFilesystemFunctions.h b/core/src/PlatformFilesystemFunctions.h index 5bada5816..174a7ce9b 100644 --- a/core/src/PlatformFilesystemFunctions.h +++ b/core/src/PlatformFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * PlatformFilesystemFunctions.h - interface class for platform filesystem * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformInputDeviceFunctions.h b/core/src/PlatformInputDeviceFunctions.h index e21bc815b..74707f38f 100644 --- a/core/src/PlatformInputDeviceFunctions.h +++ b/core/src/PlatformInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformInputDeviceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformNetworkFunctions.h b/core/src/PlatformNetworkFunctions.h index b1973966a..314d237f4 100644 --- a/core/src/PlatformNetworkFunctions.h +++ b/core/src/PlatformNetworkFunctions.h @@ -1,7 +1,7 @@ /* * PlatformNetworkFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginInterface.h b/core/src/PlatformPluginInterface.h index 288d32651..4549f2a82 100644 --- a/core/src/PlatformPluginInterface.h +++ b/core/src/PlatformPluginInterface.h @@ -1,7 +1,7 @@ /* * PlatformPluginInterface.h - interface class for platform plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.cpp b/core/src/PlatformPluginManager.cpp index d068ace1b..5f4395228 100644 --- a/core/src/PlatformPluginManager.cpp +++ b/core/src/PlatformPluginManager.cpp @@ -1,7 +1,7 @@ /* * PlatformPluginManager.cpp - implementation of PlatformPluginManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.h b/core/src/PlatformPluginManager.h index 866d0368c..089396132 100644 --- a/core/src/PlatformPluginManager.h +++ b/core/src/PlatformPluginManager.h @@ -1,7 +1,7 @@ /* * PlatformPluginManager.h - header file for PlatformPluginManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformServiceFunctions.h b/core/src/PlatformServiceFunctions.h index e43e9781a..d1b06dc90 100644 --- a/core/src/PlatformServiceFunctions.h +++ b/core/src/PlatformServiceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformServiceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 6e97efa2c..77278385c 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -1,7 +1,7 @@ /* * PlatformSessionsFunctions.h - interface class for platform session functions * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformUserFunctions.h b/core/src/PlatformUserFunctions.h index 9e7be4540..e99483b06 100644 --- a/core/src/PlatformUserFunctions.h +++ b/core/src/PlatformUserFunctions.h @@ -1,7 +1,7 @@ /* * PlatformUserFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Plugin.h b/core/src/Plugin.h index fb42e5698..1d7ba6cf2 100644 --- a/core/src/Plugin.h +++ b/core/src/Plugin.h @@ -1,7 +1,7 @@ /* * Plugin.h - generic abstraction of a plugin * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginInterface.h b/core/src/PluginInterface.h index ac109418c..aa8826c8b 100644 --- a/core/src/PluginInterface.h +++ b/core/src/PluginInterface.h @@ -1,7 +1,7 @@ /* * PluginInterface.h - interface class for plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index 8e42dd5f2..2f70bae5a 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -1,7 +1,7 @@ /* * PluginManager.cpp - implementation of the PluginManager class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.h b/core/src/PluginManager.h index a2f166e77..78c76d323 100644 --- a/core/src/PluginManager.h +++ b/core/src/PluginManager.h @@ -1,7 +1,7 @@ /* * PluginManager.h - header for the PluginManager class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.cpp b/core/src/ProcessHelper.cpp index e9331cc0c..4a1250f20 100644 --- a/core/src/ProcessHelper.cpp +++ b/core/src/ProcessHelper.cpp @@ -1,7 +1,7 @@ /* * ProcessHelper.cpp - implementation of ProcessHelper * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.h b/core/src/ProcessHelper.h index b303d5e19..75d6b4bc8 100644 --- a/core/src/ProcessHelper.h +++ b/core/src/ProcessHelper.h @@ -1,7 +1,7 @@ /* * ProcessHelper.h - header file for ProcessHelper * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.cpp b/core/src/QmlCore.cpp index 1fda72569..de5a204fc 100644 --- a/core/src/QmlCore.cpp +++ b/core/src/QmlCore.cpp @@ -1,7 +1,7 @@ /* * QmlCore.cpp - QML-related core functions * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.h b/core/src/QmlCore.h index ab00d114a..e69bc0c15 100644 --- a/core/src/QmlCore.h +++ b/core/src/QmlCore.h @@ -1,7 +1,7 @@ /* * QmlCore.h - QML-related core functions * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QtCompat.h b/core/src/QtCompat.h index 67ef4912e..099cc3aee 100644 --- a/core/src/QtCompat.h +++ b/core/src/QtCompat.h @@ -1,7 +1,7 @@ /* * QtCompat.h - functions and templates for compatibility with older Qt versions * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/RfbClientCallback.h b/core/src/RfbClientCallback.h index b468bc537..6e7a4f6a8 100644 --- a/core/src/RfbClientCallback.h +++ b/core/src/RfbClientCallback.h @@ -1,7 +1,7 @@ /* * RfbClientCallback.h - wrapper for using member functions as libvncclient callbacks * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index 0dac81afa..25cffc872 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -1,7 +1,7 @@ /* * Screenshot.cpp - class representing a screenshot * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.h b/core/src/Screenshot.h index fea15866b..f5c7c76fe 100644 --- a/core/src/Screenshot.h +++ b/core/src/Screenshot.h @@ -1,7 +1,7 @@ /* * Screenshot.h - class representing a screenshot * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.cpp b/core/src/ServiceControl.cpp index 4845d1c72..3cebd7d20 100644 --- a/core/src/ServiceControl.cpp +++ b/core/src/ServiceControl.cpp @@ -1,7 +1,7 @@ /* * ServiceControl.cpp - class for controlling veyon service * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.h b/core/src/ServiceControl.h index beafa2244..65b645616 100644 --- a/core/src/ServiceControl.h +++ b/core/src/ServiceControl.h @@ -1,7 +1,7 @@ /* * ServiceControl.h - header for the ServiceControl class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SocketDevice.h b/core/src/SocketDevice.h index da6a91e45..ab647f76f 100644 --- a/core/src/SocketDevice.h +++ b/core/src/SocketDevice.h @@ -1,7 +1,7 @@ /* * SocketDevice.h - SocketDevice abstraction * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index 475391e95..10e485b05 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -1,7 +1,7 @@ /* * SystemTrayIcon.cpp - implementation of SystemTrayIcon class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.h b/core/src/SystemTrayIcon.h index dd64aafae..5d888bab0 100644 --- a/core/src/SystemTrayIcon.h +++ b/core/src/SystemTrayIcon.h @@ -1,7 +1,7 @@ /* * SystemTrayIcon.h - declaration of SystemTrayIcon class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.cpp b/core/src/ToolButton.cpp index 9b29e1e37..3fb880482 100644 --- a/core/src/ToolButton.cpp +++ b/core/src/ToolButton.cpp @@ -1,7 +1,7 @@ /* * ToolButton.cpp - implementation of Veyon-tool-button * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.h b/core/src/ToolButton.h index d21ccb63b..9856a0fcd 100644 --- a/core/src/ToolButton.h +++ b/core/src/ToolButton.h @@ -1,7 +1,7 @@ /* * ToolButton.h - declaration of class ToolButton * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.cpp b/core/src/TranslationLoader.cpp index 1a509f9f3..3a24d6a15 100644 --- a/core/src/TranslationLoader.cpp +++ b/core/src/TranslationLoader.cpp @@ -1,7 +1,7 @@ /* * TranslationLoader.cpp - implementation of TranslationLoader class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.h b/core/src/TranslationLoader.h index d10d711e0..ac1a0a377 100644 --- a/core/src/TranslationLoader.h +++ b/core/src/TranslationLoader.h @@ -1,7 +1,7 @@ /* * TranslationLoader.h - declaration of TranslationLoader class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendInterface.h b/core/src/UserGroupsBackendInterface.h index f424a5f51..d6de8c5a7 100644 --- a/core/src/UserGroupsBackendInterface.h +++ b/core/src/UserGroupsBackendInterface.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendInterface.h - interface for a UserGroupsBackend * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.cpp b/core/src/UserGroupsBackendManager.cpp index 1a602b20b..e04bbdd81 100644 --- a/core/src/UserGroupsBackendManager.cpp +++ b/core/src/UserGroupsBackendManager.cpp @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.cpp - implementation of UserGroupsBackendManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.h b/core/src/UserGroupsBackendManager.h index 3fd725564..52bdeb01f 100644 --- a/core/src/UserGroupsBackendManager.h +++ b/core/src/UserGroupsBackendManager.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.h - header file for UserGroupsBackendManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.cpp b/core/src/VariantArrayMessage.cpp index 269934ae0..5204479cf 100644 --- a/core/src/VariantArrayMessage.cpp +++ b/core/src/VariantArrayMessage.cpp @@ -1,7 +1,7 @@ /* * VariantArrayMessage.cpp - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.h b/core/src/VariantArrayMessage.h index c9a19ea25..302929e20 100644 --- a/core/src/VariantArrayMessage.h +++ b/core/src/VariantArrayMessage.h @@ -1,7 +1,7 @@ /* * VariantArrayMessage.h - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index a6a15907b..062c5cb40 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -1,7 +1,7 @@ /* * VariantStream.cpp - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.h b/core/src/VariantStream.h index 1603dea16..25709b37e 100644 --- a/core/src/VariantStream.h +++ b/core/src/VariantStream.h @@ -1,7 +1,7 @@ /* * VariantStream.h - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index fb780cf43..0d260932c 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -2,7 +2,7 @@ * VeyonConfiguration.cpp - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.h b/core/src/VeyonConfiguration.h index 8ecee7d85..814307961 100644 --- a/core/src/VeyonConfiguration.h +++ b/core/src/VeyonConfiguration.h @@ -2,7 +2,7 @@ * VeyonConfiguration.h - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index a37152711..e417417de 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -2,7 +2,7 @@ * VeyonConfigurationProperties.h - definition of every configuration property * stored in global veyon configuration * - * Copyright (c) 2016-2022 Tobias Junghans + * Copyright (c) 2016-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index e4160bfe7..4b9872331 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -1,7 +1,7 @@ /* * VeyonConnection.cpp - implementation of VeyonConnection * - * Copyright (c) 2008-2022 Tobias Junghans + * Copyright (c) 2008-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index 39502dade..df7ea72be 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -1,7 +1,7 @@ /* * VeyonConnection.h - declaration of class VeyonConnection * - * Copyright (c) 2008-2022 Tobias Junghans + * Copyright (c) 2008-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index b6bad069c..99d8a42ba 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -1,7 +1,7 @@ /* * VeyonCore.cpp - implementation of Veyon Core * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 8623840ec..cbdf29e0e 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -1,7 +1,7 @@ /* * VeyonCore.h - declaration of VeyonCore class + basic headers * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonMasterInterface.h b/core/src/VeyonMasterInterface.h index f95d657f0..49e801bc2 100644 --- a/core/src/VeyonMasterInterface.h +++ b/core/src/VeyonMasterInterface.h @@ -1,7 +1,7 @@ /* * VeyonMasterInterface.h - interface class for VeyonMaster * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index 9eff9e678..bfe2068df 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -1,7 +1,7 @@ /* * VeyonServerInterface.h - interface class for VeyonServer * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.cpp b/core/src/VeyonServiceControl.cpp index 0ba99f6fa..dc989d945 100644 --- a/core/src/VeyonServiceControl.cpp +++ b/core/src/VeyonServiceControl.cpp @@ -1,7 +1,7 @@ /* * VeyonServiceControl.cpp - class for controlling Veyon service * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.h b/core/src/VeyonServiceControl.h index 21733c970..20c227e04 100644 --- a/core/src/VeyonServiceControl.h +++ b/core/src/VeyonServiceControl.h @@ -1,7 +1,7 @@ /* * VeyonServiceControl.h - class for controlling the Veyon service * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonWorkerInterface.h b/core/src/VeyonWorkerInterface.h index 91c09d7ef..eb6756de2 100644 --- a/core/src/VeyonWorkerInterface.h +++ b/core/src/VeyonWorkerInterface.h @@ -1,7 +1,7 @@ /* * VeyonWorkerInterface.h - interface class for VeyonWorker * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 05c318d76..3655db84d 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -1,7 +1,7 @@ /* * VncClientProtocol.cpp - implementation of the VncClientProtocol class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index 0e94141c8..9088b236c 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -1,7 +1,7 @@ /* * VncClientProtocol.h - header file for the VncClientProtocol class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 82e88025d..4265f4b41 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -1,7 +1,7 @@ /* * VncConnection.cpp - implementation of VncConnection class * - * Copyright (c) 2008-2022 Tobias Junghans + * Copyright (c) 2008-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index a656312ba..28b4fc1df 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -1,7 +1,7 @@ /* * VncConnection.h - declaration of VncConnection class * - * Copyright (c) 2008-2022 Tobias Junghans + * Copyright (c) 2008-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnectionConfiguration.h b/core/src/VncConnectionConfiguration.h index 1e0ee3ae6..7a321433a 100644 --- a/core/src/VncConnectionConfiguration.h +++ b/core/src/VncConnectionConfiguration.h @@ -1,7 +1,7 @@ /* * VncConnectionConfiguration.h - declaration of VncConnectionConfiguration * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.cpp b/core/src/VncEvents.cpp index 2fc137192..5b80d48ab 100644 --- a/core/src/VncEvents.cpp +++ b/core/src/VncEvents.cpp @@ -1,7 +1,7 @@ /* * VncEvents.cpp - implementation of VNC event classes * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.h b/core/src/VncEvents.h index 6e48114e4..c699d086a 100644 --- a/core/src/VncEvents.h +++ b/core/src/VncEvents.h @@ -1,7 +1,7 @@ /* * VncEvent.h - declaration of VncEvent and subclasses * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.cpp b/core/src/VncFeatureMessageEvent.cpp index 037c5baaf..50b3da2e0 100644 --- a/core/src/VncFeatureMessageEvent.cpp +++ b/core/src/VncFeatureMessageEvent.cpp @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.cpp - implementation of FeatureMessageEvent * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.h b/core/src/VncFeatureMessageEvent.h index f4d39aa65..11234da72 100644 --- a/core/src/VncFeatureMessageEvent.h +++ b/core/src/VncFeatureMessageEvent.h @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.h - declaration of class FeatureMessageEvent * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerClient.h b/core/src/VncServerClient.h index 87924e079..69d85a002 100644 --- a/core/src/VncServerClient.h +++ b/core/src/VncServerClient.h @@ -1,7 +1,7 @@ /* * VncServerClient.h - header file for the VncServerClient class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerPluginInterface.h b/core/src/VncServerPluginInterface.h index d54dd7d7d..f5f40ff97 100644 --- a/core/src/VncServerPluginInterface.h +++ b/core/src/VncServerPluginInterface.h @@ -1,7 +1,7 @@ /* * VncServerPluginInterface.h - abstract interface class for VNC server plugins * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index c424baa1e..bc471bc2e 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VncServerProtocol.cpp - implementation of the VncServerProtocol class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.h b/core/src/VncServerProtocol.h index 0cc572255..75d412306 100644 --- a/core/src/VncServerProtocol.h +++ b/core/src/VncServerProtocol.h @@ -1,7 +1,7 @@ /* * VncServerProtocol.h - header file for the VncServerProtocol class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index c3ce69602..a5579e93b 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -1,7 +1,7 @@ /* * VncView.cpp - abstract base for all VNC views * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.h b/core/src/VncView.h index 29594f297..a61d8bf2f 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -1,7 +1,7 @@ /* * VncView.h - abstract base for all VNC views * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index ced6a9805..90d628fc2 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -1,7 +1,7 @@ /* * VncViewItem.cpp - QtQuick VNC view item * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.h b/core/src/VncViewItem.h index 992548320..f047b5533 100644 --- a/core/src/VncViewItem.h +++ b/core/src/VncViewItem.h @@ -1,7 +1,7 @@ /* * VncViewItem.h - QtQuick VNC view item * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index f1c423f8b..1f593579b 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -1,7 +1,7 @@ /* * VncViewWidget.cpp - VNC viewer widget * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index d1e5f9ece..c4405f3ba 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -1,7 +1,7 @@ /* * VncViewWidget.h - VNC viewer widget * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.cpp b/master/src/CheckableItemProxyModel.cpp index f1e1411d4..a6aa87f00 100644 --- a/master/src/CheckableItemProxyModel.cpp +++ b/master/src/CheckableItemProxyModel.cpp @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.cpp - proxy model for overlaying checked property * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.h b/master/src/CheckableItemProxyModel.h index 730903c37..f81a9a1e7 100644 --- a/master/src/CheckableItemProxyModel.h +++ b/master/src/CheckableItemProxyModel.h @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.h - proxy model for overlaying checked property * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 4e39a6fe7..61aa83d26 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerControlListModel.cpp - data model for computer control objects * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 936288aeb..ea65f8626 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -1,7 +1,7 @@ /* * ComputerControlListModel.h - data model for computer control objects * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerImageProvider.cpp b/master/src/ComputerImageProvider.cpp index 72a98450c..0af506a59 100644 --- a/master/src/ComputerImageProvider.cpp +++ b/master/src/ComputerImageProvider.cpp @@ -1,7 +1,7 @@ /* * ComputerImageProvider.cpp - data model for computer control objects * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerImageProvider.h b/master/src/ComputerImageProvider.h index 4ca02d5eb..c66c8512e 100644 --- a/master/src/ComputerImageProvider.h +++ b/master/src/ComputerImageProvider.h @@ -1,7 +1,7 @@ /* * ComputerImageProvider.h - image provider for computers * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 1be85bf4a..b71355b1d 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -1,7 +1,7 @@ /* * ComputerManager.cpp - maintains and provides a computer object list * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index 133b84d1a..d7a8c02de 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -1,7 +1,7 @@ /* * ComputerManager.h - maintains and provides a computer object list * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.cpp b/master/src/ComputerMonitoringItem.cpp index 9faa0ab5e..3dfaa3336 100644 --- a/master/src/ComputerMonitoringItem.cpp +++ b/master/src/ComputerMonitoringItem.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.h b/master/src/ComputerMonitoringItem.h index 1646c1d04..97757bc8e 100644 --- a/master/src/ComputerMonitoringItem.h +++ b/master/src/ComputerMonitoringItem.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.cpp b/master/src/ComputerMonitoringModel.cpp index db06c8b6b..3a52a9369 100644 --- a/master/src/ComputerMonitoringModel.cpp +++ b/master/src/ComputerMonitoringModel.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringModel.cpp - implementation of ComputerMonitoringModel * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.h b/master/src/ComputerMonitoringModel.h index 12e9444e3..3a423708e 100644 --- a/master/src/ComputerMonitoringModel.h +++ b/master/src/ComputerMonitoringModel.h @@ -1,7 +1,7 @@ /* * ComputerSortFilterProxyModel.h - header file for ComputerSortFilterProxyModel * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index b67f06eda..2d9c4a37d 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.h b/master/src/ComputerMonitoringView.h index e8f1fd137..ea72e2863 100644 --- a/master/src/ComputerMonitoringView.h +++ b/master/src/ComputerMonitoringView.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 3dedcf777..53fd8c12d 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.h b/master/src/ComputerMonitoringWidget.h index c2ae464cb..080972ffa 100644 --- a/master/src/ComputerMonitoringWidget.h +++ b/master/src/ComputerMonitoringWidget.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.cpp b/master/src/ComputerSelectModel.cpp index 13603095b..6735e9c29 100644 --- a/master/src/ComputerSelectModel.cpp +++ b/master/src/ComputerSelectModel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectModel.cpp - data model for computer selection * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.h b/master/src/ComputerSelectModel.h index 543fc19bb..d7973d2b2 100644 --- a/master/src/ComputerSelectModel.h +++ b/master/src/ComputerSelectModel.h @@ -1,7 +1,7 @@ /* * ComputerSelectListModel.h - data model for computer selection * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.cpp b/master/src/ComputerSelectPanel.cpp index 74f045fe3..0cd6456fa 100644 --- a/master/src/ComputerSelectPanel.cpp +++ b/master/src/ComputerSelectPanel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.cpp - provides a view for a network object tree * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.h b/master/src/ComputerSelectPanel.h index 465dd373f..e3cff5d60 100644 --- a/master/src/ComputerSelectPanel.h +++ b/master/src/ComputerSelectPanel.h @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.h - provides a view for a network object tree * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 1922c5434..99a18be9b 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.cpp - fullscreen preview widget * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index fe10148c1..e057008b8 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.h - fullscreen preview widget * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index af49984db..2c84e39e2 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.cpp - helper for creating documentation figures * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index 18410c4e8..23dbe2450 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.h - helper for creating documentation figures * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.cpp b/master/src/FeatureListModel.cpp index 129f0409b..112690144 100644 --- a/master/src/FeatureListModel.cpp +++ b/master/src/FeatureListModel.cpp @@ -1,7 +1,7 @@ /* * FeatureListModel.cpp - data model for features * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.h b/master/src/FeatureListModel.h index d4eb234be..fc0565719 100644 --- a/master/src/FeatureListModel.h +++ b/master/src/FeatureListModel.h @@ -1,7 +1,7 @@ /* * FeatureListListModel.h - data model for features * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.cpp b/master/src/FlexibleListView.cpp index a8b4816c0..a5b6b72ab 100644 --- a/master/src/FlexibleListView.cpp +++ b/master/src/FlexibleListView.cpp @@ -1,7 +1,7 @@ /* * FlexibleListView.cpp - list view with flexible icon positions * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.h b/master/src/FlexibleListView.h index 425396ff3..ac901e687 100644 --- a/master/src/FlexibleListView.h +++ b/master/src/FlexibleListView.h @@ -1,7 +1,7 @@ /* * FlexibleListView.h - list view with flexible icon positions * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.cpp b/master/src/LocationDialog.cpp index c49074611..44ec05c36 100644 --- a/master/src/LocationDialog.cpp +++ b/master/src/LocationDialog.cpp @@ -1,7 +1,7 @@ /* * LocationDialog.cpp - header file for LocationDialog * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.h b/master/src/LocationDialog.h index 8c40ca9a6..6d1915d13 100644 --- a/master/src/LocationDialog.h +++ b/master/src/LocationDialog.h @@ -1,7 +1,7 @@ /* * LocationDialog.h - header file for LocationDialog * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.cpp b/master/src/MainToolBar.cpp index f3bc7a7e4..6be689b86 100644 --- a/master/src/MainToolBar.cpp +++ b/master/src/MainToolBar.cpp @@ -1,7 +1,7 @@ /* * MainToolBar.cpp - MainToolBar for MainWindow * - * Copyright (c) 2007-2022 Tobias Junghans + * Copyright (c) 2007-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.h b/master/src/MainToolBar.h index 1db27fef5..ae95c6a04 100644 --- a/master/src/MainToolBar.h +++ b/master/src/MainToolBar.h @@ -1,7 +1,7 @@ /* * MainToolBar.h - MainToolBar for MainWindow * - * Copyright (c) 2007-2022 Tobias Junghans + * Copyright (c) 2007-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 7f7afef7c..462e561e9 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2004-2022 Tobias Junghans + * Copyright (c) 2004-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.h b/master/src/MainWindow.h index 31109fb25..2df50c213 100644 --- a/master/src/MainWindow.h +++ b/master/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of Veyon Master Application * - * Copyright (c) 2004-2022 Tobias Junghans + * Copyright (c) 2004-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 6535830ee..b9224dc80 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.cpp - implementation of NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.h b/master/src/NetworkObjectFilterProxyModel.h index c5d9be4da..cf18c7ff9 100644 --- a/master/src/NetworkObjectFilterProxyModel.h +++ b/master/src/NetworkObjectFilterProxyModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.h - header file for NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.cpp b/master/src/NetworkObjectOverlayDataModel.cpp index 2c133cb8f..0bb0d027b 100644 --- a/master/src/NetworkObjectOverlayDataModel.cpp +++ b/master/src/NetworkObjectOverlayDataModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.cpp - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.h b/master/src/NetworkObjectOverlayDataModel.h index 559bf5f14..fa5cd0174 100644 --- a/master/src/NetworkObjectOverlayDataModel.h +++ b/master/src/NetworkObjectOverlayDataModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.h - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.cpp b/master/src/NetworkObjectTreeModel.cpp index 83d8d12cf..160e48991 100644 --- a/master/src/NetworkObjectTreeModel.cpp +++ b/master/src/NetworkObjectTreeModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.cpp - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.h b/master/src/NetworkObjectTreeModel.h index ada361caa..02fa5c18c 100644 --- a/master/src/NetworkObjectTreeModel.h +++ b/master/src/NetworkObjectTreeModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.h - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.cpp b/master/src/ScreenshotManagementPanel.cpp index 5ab7a1a4a..b3ddc2913 100644 --- a/master/src/ScreenshotManagementPanel.cpp +++ b/master/src/ScreenshotManagementPanel.cpp @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.cpp - implementation of screenshot management view * - * Copyright (c) 2004-2022 Tobias Junghans + * Copyright (c) 2004-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.h b/master/src/ScreenshotManagementPanel.h index 60c25fbee..8e0a930cb 100644 --- a/master/src/ScreenshotManagementPanel.h +++ b/master/src/ScreenshotManagementPanel.h @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.h - declaration of screenshot management view * - * Copyright (c) 2004-2022 Tobias Junghans + * Copyright (c) 2004-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.cpp b/master/src/SlideshowModel.cpp index f1213a04e..c30e7e93b 100644 --- a/master/src/SlideshowModel.cpp +++ b/master/src/SlideshowModel.cpp @@ -1,7 +1,7 @@ /* * SlideshowModel.cpp - implementation of SlideshowModel * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.h b/master/src/SlideshowModel.h index 915113420..ff37cac8b 100644 --- a/master/src/SlideshowModel.h +++ b/master/src/SlideshowModel.h @@ -1,7 +1,7 @@ /* * SlideshowModel.h - header file for SlideshowModel * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index 15fb2a65e..7ad418792 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -1,7 +1,7 @@ /* * SlideshowPanel.cpp - implementation of SlideshowPanel * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.h b/master/src/SlideshowPanel.h index 1a1530635..f17d5e77e 100644 --- a/master/src/SlideshowPanel.h +++ b/master/src/SlideshowPanel.h @@ -1,7 +1,7 @@ /* * SlideshowPanel.h - declaration of SlideshowPanel * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.cpp b/master/src/SpotlightModel.cpp index edddc0b30..de87ccd1a 100644 --- a/master/src/SpotlightModel.cpp +++ b/master/src/SpotlightModel.cpp @@ -1,7 +1,7 @@ /* * SpotlightModel.cpp - implementation of SpotlightModel * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.h b/master/src/SpotlightModel.h index edc014128..d4ecdda61 100644 --- a/master/src/SpotlightModel.h +++ b/master/src/SpotlightModel.h @@ -1,7 +1,7 @@ /* * SpotlightModel.h - header file for SpotlightModel * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index e256fa67b..79c25beba 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -1,7 +1,7 @@ /* * SpotlightPanel.cpp - implementation of SpotlightPanel * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index d394449fd..20cf7a734 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -1,7 +1,7 @@ /* * SpotlightPanel.h - declaration of SpotlightPanel * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index 97b4cacc0..6c04385cc 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -2,7 +2,7 @@ * UserConfig.cpp - Configuration object storing personal settings * for the Veyon Master Application * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index eb13194d4..d13fb4ccd 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -1,7 +1,7 @@ /* * UserConfig.h - UserConfig class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 1e788053a..4bda31fc8 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -1,7 +1,7 @@ /* * VeyonMaster.cpp - management of application-global instances * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 9e6ec1c82..14a336e24 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -1,7 +1,7 @@ /* * VeyonMaster.h - global instances * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/main.cpp b/master/src/main.cpp index 8ff3e7bfd..5a55db43b 100644 --- a/master/src/main.cpp +++ b/master/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - startup routine for Veyon Master Application * - * Copyright (c) 2004-2022 Tobias Junghans + * Copyright (c) 2004-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/veyon-master.rc.in b/master/veyon-master.rc.in index 81bc19ae5..54e541416 100644 --- a/master/veyon-master.rc.in +++ b/master/veyon-master.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Master\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-master.exe\0" END END diff --git a/plugins/authkeys/AuthKeysConfiguration.h b/plugins/authkeys/AuthKeysConfiguration.h index 0e8551492..98b0b7117 100644 --- a/plugins/authkeys/AuthKeysConfiguration.h +++ b/plugins/authkeys/AuthKeysConfiguration.h @@ -1,7 +1,7 @@ /* * AuthKeysConfiguration.h - configuration values for AuthKeys plugin * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.cpp b/plugins/authkeys/AuthKeysConfigurationWidget.cpp index a1d0b6a5c..2b928a00e 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.cpp +++ b/plugins/authkeys/AuthKeysConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.cpp - implementation of the authentication configuration page * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.h b/plugins/authkeys/AuthKeysConfigurationWidget.h index e20b4a8f2..369154e82 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.h +++ b/plugins/authkeys/AuthKeysConfigurationWidget.h @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.h - header for the AuthKeysConfigurationDialog class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index 72bff70bf..3953983df 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -1,7 +1,7 @@ /* * AuthKeysManager.cpp - implementation of AuthKeysManager class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.h b/plugins/authkeys/AuthKeysManager.h index f366be4e1..d18dd86d8 100644 --- a/plugins/authkeys/AuthKeysManager.h +++ b/plugins/authkeys/AuthKeysManager.h @@ -1,7 +1,7 @@ /* * AuthKeysManager.h - declaration of AuthKeysManager class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index adf9c075b..42ec94b77 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.cpp - implementation of AuthKeysPlugin class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index 04d96eec2..6e827072a 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.h - declaration of AuthKeysPlugin class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.cpp b/plugins/authkeys/AuthKeysTableModel.cpp index a247d81ef..61d950e8f 100644 --- a/plugins/authkeys/AuthKeysTableModel.cpp +++ b/plugins/authkeys/AuthKeysTableModel.cpp @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.cpp - implementation of AuthKeysTableModel class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.h b/plugins/authkeys/AuthKeysTableModel.h index ed89dee31..3ee28105a 100644 --- a/plugins/authkeys/AuthKeysTableModel.h +++ b/plugins/authkeys/AuthKeysTableModel.h @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.h - declaration of AuthKeysTableModel class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.cpp b/plugins/authlogon/AuthLogonDialog.cpp index 20d656283..32e64ce17 100644 --- a/plugins/authlogon/AuthLogonDialog.cpp +++ b/plugins/authlogon/AuthLogonDialog.cpp @@ -1,7 +1,7 @@ /* * AuthLogonDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.h b/plugins/authlogon/AuthLogonDialog.h index 00fa19cb6..bd960f05e 100644 --- a/plugins/authlogon/AuthLogonDialog.h +++ b/plugins/authlogon/AuthLogonDialog.h @@ -1,7 +1,7 @@ /* * AuthLogonDialog.h - declaration of password dialog * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index 2fb30bdad..a2d23bcc4 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.cpp - implementation of AuthLogonPlugin class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h index 645778dcd..dd1cb2ef5 100644 --- a/plugins/authlogon/AuthLogonPlugin.h +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.h - declaration of AuthLogonPlugin class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleConfiguration.h b/plugins/authsimple/AuthSimpleConfiguration.h index cf63ce99c..609399075 100644 --- a/plugins/authsimple/AuthSimpleConfiguration.h +++ b/plugins/authsimple/AuthSimpleConfiguration.h @@ -1,7 +1,7 @@ /* * AuthSimpleConfiguration.h - configuration values for AuthSimple plugin * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.cpp b/plugins/authsimple/AuthSimpleDialog.cpp index 239150bdd..fccf1e2a2 100644 --- a/plugins/authsimple/AuthSimpleDialog.cpp +++ b/plugins/authsimple/AuthSimpleDialog.cpp @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.h b/plugins/authsimple/AuthSimpleDialog.h index befe63bfe..a1d0fa1a2 100644 --- a/plugins/authsimple/AuthSimpleDialog.h +++ b/plugins/authsimple/AuthSimpleDialog.h @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.h - declaration of password dialog * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp index a33d8f766..b7a33dd4c 100644 --- a/plugins/authsimple/AuthSimplePlugin.cpp +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.cpp - implementation of AuthSimplePlugin class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.h b/plugins/authsimple/AuthSimplePlugin.h index d908dd160..e8b8988de 100644 --- a/plugins/authsimple/AuthSimplePlugin.h +++ b/plugins/authsimple/AuthSimplePlugin.h @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.h - declaration of AuthSimplePlugin class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.cpp b/plugins/builtindirectory/BuiltinDirectory.cpp index 2bb192f42..265d8b666 100644 --- a/plugins/builtindirectory/BuiltinDirectory.cpp +++ b/plugins/builtindirectory/BuiltinDirectory.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectory.cpp - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.h b/plugins/builtindirectory/BuiltinDirectory.h index 55839f383..7164f8e2d 100644 --- a/plugins/builtindirectory/BuiltinDirectory.h +++ b/plugins/builtindirectory/BuiltinDirectory.h @@ -1,7 +1,7 @@ /* * BuiltinDirectory.h - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h index efc71a1a8..a80b79480 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfiguration.h - configuration values for BuiltinDirectory plugin * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp index e55a633aa..79e0f962c 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.cpp - implementation of BuiltinDirectoryConfigurationPage * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h index a28d3f583..17d0e19f0 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.h - header for the BuiltinDirectoryConfigurationPage class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index a2155b236..7983f5b04 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.cpp - implementation of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.h b/plugins/builtindirectory/BuiltinDirectoryPlugin.h index 36a45fa61..99bd40842 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.h +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.h - declaration of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.cpp b/plugins/demo/DemoAuthentication.cpp index 10a468f4f..7cc4a5a84 100644 --- a/plugins/demo/DemoAuthentication.cpp +++ b/plugins/demo/DemoAuthentication.cpp @@ -1,7 +1,7 @@ /* * DemoAuthentication.cpp - implementation of DemoAuthentication class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index 183ffdafb..63d1c0531 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -1,7 +1,7 @@ /* * DemoAuthentication.h - declaration of DemoAuthentication class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index 8ebf36b66..ba1e6fd18 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -1,7 +1,7 @@ /* * DemoClient.cpp - client widget for demo mode * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.h b/plugins/demo/DemoClient.h index f7dc534c9..9cfbdcd5c 100644 --- a/plugins/demo/DemoClient.h +++ b/plugins/demo/DemoClient.h @@ -1,7 +1,7 @@ /* * DemoClient.h - client for demo server * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfiguration.h b/plugins/demo/DemoConfiguration.h index 7bfb91030..6d0debe0d 100644 --- a/plugins/demo/DemoConfiguration.h +++ b/plugins/demo/DemoConfiguration.h @@ -1,7 +1,7 @@ /* * DemoConfiguration.h - configuration values for Demo plugin * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.cpp b/plugins/demo/DemoConfigurationPage.cpp index 94b3bfc8b..d430eedb0 100644 --- a/plugins/demo/DemoConfigurationPage.cpp +++ b/plugins/demo/DemoConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.cpp - implementation of DemoConfigurationPage * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.h b/plugins/demo/DemoConfigurationPage.h index 4f277fecc..e76672dd9 100644 --- a/plugins/demo/DemoConfigurationPage.h +++ b/plugins/demo/DemoConfigurationPage.h @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.h - header for the DemoConfigurationPage class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 8f7f7ce9a..c1d8dbdab 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.cpp - implementation of DemoFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 26610ef21..8eed9c588 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.h - declaration of DemoFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 21c896e4f..f6d6ceb11 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index ca11532ca..b70d2ab63 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -2,7 +2,7 @@ * DemoServer.h - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index bf41de7a7..40f7dd642 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.h b/plugins/demo/DemoServerConnection.h index b75ffeac2..748cedf6f 100644 --- a/plugins/demo/DemoServerConnection.h +++ b/plugins/demo/DemoServerConnection.h @@ -1,7 +1,7 @@ /* * DemoServerConnection.h - header file for DemoServerConnection class * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.cpp b/plugins/demo/DemoServerProtocol.cpp index e72be717b..20cec3880 100644 --- a/plugins/demo/DemoServerProtocol.cpp +++ b/plugins/demo/DemoServerProtocol.cpp @@ -1,7 +1,7 @@ /* * DemoServerProtocol.cpp - implementation of DemoServerProtocol class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.h b/plugins/demo/DemoServerProtocol.h index 7ca6279d0..b264b2487 100644 --- a/plugins/demo/DemoServerProtocol.h +++ b/plugins/demo/DemoServerProtocol.h @@ -1,7 +1,7 @@ /* * DemoServerProtocol.h - header file for DemoServerProtocol class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.cpp b/plugins/desktopservices/DesktopServiceObject.cpp index 18c9cdf9d..f8eadb21f 100644 --- a/plugins/desktopservices/DesktopServiceObject.cpp +++ b/plugins/desktopservices/DesktopServiceObject.cpp @@ -1,7 +1,7 @@ /* * DesktopServiceObject.cpp - data class representing a desktop service object * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.h b/plugins/desktopservices/DesktopServiceObject.h index 5c93dc7d6..945d8665d 100644 --- a/plugins/desktopservices/DesktopServiceObject.h +++ b/plugins/desktopservices/DesktopServiceObject.h @@ -1,7 +1,7 @@ /* * DesktopServiceObject.h - data class representing a desktop service object * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfiguration.h b/plugins/desktopservices/DesktopServicesConfiguration.h index 5bd7f82a5..746e8de40 100644 --- a/plugins/desktopservices/DesktopServicesConfiguration.h +++ b/plugins/desktopservices/DesktopServicesConfiguration.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfiguration.h - configuration values for DesktopServices * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp index b6eb0aa23..d884bd368 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.cpp - implementation of the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.h b/plugins/desktopservices/DesktopServicesConfigurationPage.h index 1253cf92b..933b4b3cb 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.h +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.h - header for the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index 9db8656e5..3a5bc2d28 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.cpp - implementation of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index 5b98f3204..46bc97c7c 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.h - declaration of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.cpp b/plugins/desktopservices/OpenWebsiteDialog.cpp index e796e3d28..5512b36dd 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.cpp +++ b/plugins/desktopservices/OpenWebsiteDialog.cpp @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.cpp - implementation of OpenWebsiteDialog * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.h b/plugins/desktopservices/OpenWebsiteDialog.h index 2091d708d..a0ebfb3a3 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.h +++ b/plugins/desktopservices/OpenWebsiteDialog.h @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.h - declaration of class OpenWebsiteDialog * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/desktopservices/StartAppDialog.cpp b/plugins/desktopservices/StartAppDialog.cpp index ea3a9c37e..6eaf28a77 100644 --- a/plugins/desktopservices/StartAppDialog.cpp +++ b/plugins/desktopservices/StartAppDialog.cpp @@ -1,7 +1,7 @@ /* * StartAppDialog.cpp - implementation of StartAppDialog * - * Copyright (c) 2004-2022 Tobias Junghans + * Copyright (c) 2004-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/StartAppDialog.h b/plugins/desktopservices/StartAppDialog.h index 848a9e497..b355e3b6b 100644 --- a/plugins/desktopservices/StartAppDialog.h +++ b/plugins/desktopservices/StartAppDialog.h @@ -1,7 +1,7 @@ /* * StartAppDialog.h - declaration of class StartAppDialog * - * Copyright (c) 2004-2022 Tobias Junghans + * Copyright (c) 2004-2023 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileReadThread.cpp b/plugins/filetransfer/FileReadThread.cpp index 62a506ece..2f7526cc6 100644 --- a/plugins/filetransfer/FileReadThread.cpp +++ b/plugins/filetransfer/FileReadThread.cpp @@ -1,7 +1,7 @@ /* * FileReadThread.cpp - implementation of FileReadThread class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileReadThread.h b/plugins/filetransfer/FileReadThread.h index 3503359d4..d89eb945b 100644 --- a/plugins/filetransfer/FileReadThread.h +++ b/plugins/filetransfer/FileReadThread.h @@ -1,7 +1,7 @@ /* * FileReadThread.h - declaration of FileReadThread class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfiguration.h b/plugins/filetransfer/FileTransferConfiguration.h index 26fba6ccb..2b7ecd3e4 100644 --- a/plugins/filetransfer/FileTransferConfiguration.h +++ b/plugins/filetransfer/FileTransferConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferConfiguration.h - configuration values for FileTransfer plugin * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.cpp b/plugins/filetransfer/FileTransferConfigurationPage.cpp index 9232f972f..c086a5aa6 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.cpp +++ b/plugins/filetransfer/FileTransferConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.cpp - implementation of FileTransferConfigurationPage * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.h b/plugins/filetransfer/FileTransferConfigurationPage.h index e4925fe5f..707055167 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.h +++ b/plugins/filetransfer/FileTransferConfigurationPage.h @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.h - header for the FileTransferConfigurationPage class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.cpp b/plugins/filetransfer/FileTransferController.cpp index 0bcd8e808..6a6deeaa9 100644 --- a/plugins/filetransfer/FileTransferController.cpp +++ b/plugins/filetransfer/FileTransferController.cpp @@ -1,7 +1,7 @@ /* * FileTransferController.cpp - implementation of FileTransferController class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.h b/plugins/filetransfer/FileTransferController.h index 91e8faf1d..e1e5551c6 100644 --- a/plugins/filetransfer/FileTransferController.h +++ b/plugins/filetransfer/FileTransferController.h @@ -1,7 +1,7 @@ /* * FileTransferController.h - declaration of FileTransferController class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.cpp b/plugins/filetransfer/FileTransferDialog.cpp index 787c8c30e..5aa635196 100644 --- a/plugins/filetransfer/FileTransferDialog.cpp +++ b/plugins/filetransfer/FileTransferDialog.cpp @@ -1,7 +1,7 @@ /* * FileTransferDialog.cpp - implementation of FileTransferDialog * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.h b/plugins/filetransfer/FileTransferDialog.h index 74b78d5e2..91cc2589b 100644 --- a/plugins/filetransfer/FileTransferDialog.h +++ b/plugins/filetransfer/FileTransferDialog.h @@ -1,7 +1,7 @@ /* * FileTransferDialog.h - declaration of class FileTransferDialog * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileTransferListModel.cpp b/plugins/filetransfer/FileTransferListModel.cpp index e518fb42b..dcfd1c2eb 100644 --- a/plugins/filetransfer/FileTransferListModel.cpp +++ b/plugins/filetransfer/FileTransferListModel.cpp @@ -1,7 +1,7 @@ /* * FileTransferListModel.cpp - implementation of FileTransferListModel class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferListModel.h b/plugins/filetransfer/FileTransferListModel.h index 45be2251f..be35387f0 100644 --- a/plugins/filetransfer/FileTransferListModel.h +++ b/plugins/filetransfer/FileTransferListModel.h @@ -1,7 +1,7 @@ /* * FileTransferListModel.h - declaration of FileTransferListModel class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.cpp b/plugins/filetransfer/FileTransferPlugin.cpp index 541465354..d54c85349 100644 --- a/plugins/filetransfer/FileTransferPlugin.cpp +++ b/plugins/filetransfer/FileTransferPlugin.cpp @@ -1,7 +1,7 @@ /* * FileTransferPlugin.cpp - implementation of FileTransferPlugin class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.h b/plugins/filetransfer/FileTransferPlugin.h index 3c0faad33..3c50d415b 100644 --- a/plugins/filetransfer/FileTransferPlugin.h +++ b/plugins/filetransfer/FileTransferPlugin.h @@ -1,7 +1,7 @@ /* * FileTransferPlugin.h - declaration of FileTransferPlugin class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferUserConfiguration.h b/plugins/filetransfer/FileTransferUserConfiguration.h index 307ca6b80..d35f71a44 100644 --- a/plugins/filetransfer/FileTransferUserConfiguration.h +++ b/plugins/filetransfer/FileTransferUserConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferUserConfiguration.h - user config values for file transfer * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/LogonHelper.cpp b/plugins/platform/common/LogonHelper.cpp index 9a274ce75..760731a02 100644 --- a/plugins/platform/common/LogonHelper.cpp +++ b/plugins/platform/common/LogonHelper.cpp @@ -1,7 +1,7 @@ /* * LogonHelper.cpp - implementation of LogonHelper class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/LogonHelper.h b/plugins/platform/common/LogonHelper.h index 8ac7a5d53..ee5e74c9c 100644 --- a/plugins/platform/common/LogonHelper.h +++ b/plugins/platform/common/LogonHelper.h @@ -1,7 +1,7 @@ /* * LogonHelper.h - declaration of LogonHelper class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.cpp b/plugins/platform/common/PersistentLogonCredentials.cpp index 478821de8..6e18a1567 100644 --- a/plugins/platform/common/PersistentLogonCredentials.cpp +++ b/plugins/platform/common/PersistentLogonCredentials.cpp @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.cpp - implementation of PersistentLogonCredentials class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.h b/plugins/platform/common/PersistentLogonCredentials.h index cda9dcb7c..4f7d6acb1 100644 --- a/plugins/platform/common/PersistentLogonCredentials.h +++ b/plugins/platform/common/PersistentLogonCredentials.h @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.h - declaration of PersistentLogonCredentials class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index 781d26aa8..7d4ab6f3c 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -1,7 +1,7 @@ /* * PlatformSessionManager.cpp - implementation of PlatformSessionManager class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.h b/plugins/platform/common/PlatformSessionManager.h index b51302e43..6af7d87ba 100644 --- a/plugins/platform/common/PlatformSessionManager.h +++ b/plugins/platform/common/PlatformSessionManager.h @@ -1,7 +1,7 @@ /* * PlatformSessionManager.h - declaration of PlatformSessionManager class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.cpp b/plugins/platform/common/ServiceDataManager.cpp index 874d7a272..90d65f660 100644 --- a/plugins/platform/common/ServiceDataManager.cpp +++ b/plugins/platform/common/ServiceDataManager.cpp @@ -1,7 +1,7 @@ /* * ServiceDataManager.cpp - implementation of ServiceDataManager class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.h b/plugins/platform/common/ServiceDataManager.h index 1ca303ad0..95f228d1d 100644 --- a/plugins/platform/common/ServiceDataManager.h +++ b/plugins/platform/common/ServiceDataManager.h @@ -1,7 +1,7 @@ /* * ServiceDataManager.h - header file for ServiceDataManager class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 5bef935e8..6900439fc 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.cpp - implementation of LinuxCoreFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index ddc827826..ad5284413 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.h - declaration of LinuxCoreFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxDesktopIntegration.h b/plugins/platform/linux/LinuxDesktopIntegration.h index 8b5231ef0..b2ab5f204 100644 --- a/plugins/platform/linux/LinuxDesktopIntegration.h +++ b/plugins/platform/linux/LinuxDesktopIntegration.h @@ -1,7 +1,7 @@ /* * LinuxDesktopIntegration.h - declaration of LinuxDesktopIntegration class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.cpp b/plugins/platform/linux/LinuxFilesystemFunctions.cpp index 0fa6bea12..fc7dd5485 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.cpp +++ b/plugins/platform/linux/LinuxFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.cpp - implementation of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.h b/plugins/platform/linux/LinuxFilesystemFunctions.h index 1964d37ba..5fc1a1767 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.h +++ b/plugins/platform/linux/LinuxFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.h - declaration of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp index 45c512d97..485dca4be 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.cpp - implementation of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.h b/plugins/platform/linux/LinuxInputDeviceFunctions.h index 79d694c42..6236cf15b 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.h +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.h - declaration of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.cpp b/plugins/platform/linux/LinuxKeyboardInput.cpp index 7a63baf88..a8937d76d 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.cpp +++ b/plugins/platform/linux/LinuxKeyboardInput.cpp @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.cpp - implementation of LinuxKeyboardInput class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.h b/plugins/platform/linux/LinuxKeyboardInput.h index cee707678..6f3ae3a27 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.h +++ b/plugins/platform/linux/LinuxKeyboardInput.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.h - declaration of LinuxKeyboardInput class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h index 93b2f56c0..c64e0c0cc 100644 --- a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h +++ b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardShortcutTrapper.h - dummy KeyboardShortcutTrapper implementation * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.cpp b/plugins/platform/linux/LinuxNetworkFunctions.cpp index 1e9ca5f1b..f249af8f9 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.cpp +++ b/plugins/platform/linux/LinuxNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.cpp - implementation of LinuxNetworkFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.h b/plugins/platform/linux/LinuxNetworkFunctions.h index 56b597b1b..47cd2f623 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.h +++ b/plugins/platform/linux/LinuxNetworkFunctions.h @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.h - declaration of LinuxNetworkFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfiguration.h b/plugins/platform/linux/LinuxPlatformConfiguration.h index 4e18576af..70f82d88e 100644 --- a/plugins/platform/linux/LinuxPlatformConfiguration.h +++ b/plugins/platform/linux/LinuxPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfiguration.h - configuration values for LinuxPlatform plugin * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp index c2902c0f9..7cd5520b5 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.h b/plugins/platform/linux/LinuxPlatformConfigurationPage.h index 779013079..c8900aca5 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.h +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.h - header for the LinuxPlatformConfigurationPage class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.cpp b/plugins/platform/linux/LinuxPlatformPlugin.cpp index f28ac24e7..30f264d31 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.cpp +++ b/plugins/platform/linux/LinuxPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.cpp - implementation of LinuxPlatformPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.h b/plugins/platform/linux/LinuxPlatformPlugin.h index 04c59af24..d788cd781 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.h +++ b/plugins/platform/linux/LinuxPlatformPlugin.h @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.h - declaration of LinuxPlatformPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index 125fcf54e..ef11d819b 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServerProcess class * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServerProcess.h b/plugins/platform/linux/LinuxServerProcess.h index c17d2bd88..b25e60b0a 100644 --- a/plugins/platform/linux/LinuxServerProcess.h +++ b/plugins/platform/linux/LinuxServerProcess.h @@ -1,7 +1,7 @@ /* * LinuxServerProcess.h - declaration of LinuxServerProcess class * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index cab81ca11..3084d05a3 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index 66c5bee04..3d7cb83b3 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -1,7 +1,7 @@ /* * LinuxServiceCore.h - declaration of LinuxServiceCore class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.cpp b/plugins/platform/linux/LinuxServiceFunctions.cpp index f2512aa9b..75bf9073d 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.cpp +++ b/plugins/platform/linux/LinuxServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.h b/plugins/platform/linux/LinuxServiceFunctions.h index 595384975..92460e978 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.h +++ b/plugins/platform/linux/LinuxServiceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.h - declaration of LinuxServiceFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 4b698c67e..05f0a32a4 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.cpp - implementation of LinuxSessionFunctions class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 019eb6053..be3103660 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.h - declaration of LinuxSessionFunctions class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index f8f019eb9..28eef8f03 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.cpp - implementation of LinuxUserFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index a0a1cd493..b83092213 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.h - declaration of LinuxUserFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp index ca5f9cc1e..95cf6f90a 100644 --- a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp +++ b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp @@ -1,7 +1,7 @@ /* * VeyonAuthHelper.cpp - main file for Veyon Authentication Helper * - * Copyright (c) 2010-2022 Tobias Junghans + * Copyright (c) 2010-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.cpp b/plugins/platform/windows/DesktopInputController.cpp index 73dc21188..f2c55c5b0 100644 --- a/plugins/platform/windows/DesktopInputController.cpp +++ b/plugins/platform/windows/DesktopInputController.cpp @@ -1,7 +1,7 @@ /* * DesktopInputController.cpp - implementation of DesktopInputController class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.h b/plugins/platform/windows/DesktopInputController.h index 3752f7add..078ca05f1 100644 --- a/plugins/platform/windows/DesktopInputController.h +++ b/plugins/platform/windows/DesktopInputController.h @@ -1,7 +1,7 @@ /* * DesktopInputController.h - declaration of DesktopInputController class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.cpp b/plugins/platform/windows/SasEventListener.cpp index b22eb175f..4d72d39a4 100644 --- a/plugins/platform/windows/SasEventListener.cpp +++ b/plugins/platform/windows/SasEventListener.cpp @@ -1,7 +1,7 @@ /* * SasEventListener.cpp - implementation of SasEventListener class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.h b/plugins/platform/windows/SasEventListener.h index b331c30ea..cd6160e3e 100644 --- a/plugins/platform/windows/SasEventListener.h +++ b/plugins/platform/windows/SasEventListener.h @@ -1,7 +1,7 @@ /* * SasEventListener.h - header file for SasEventListener class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 7340e1b1b..bfc2c1456 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.cpp - implementation of WindowsCoreFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index 5cd533146..f9b67ef60 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.h - declaration of WindowsCoreFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.cpp b/plugins/platform/windows/WindowsFilesystemFunctions.cpp index 583753f8c..8c380d114 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.cpp +++ b/plugins/platform/windows/WindowsFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.cpp - implementation of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.h b/plugins/platform/windows/WindowsFilesystemFunctions.h index 0edc0fe87..89bb2d230 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.h +++ b/plugins/platform/windows/WindowsFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.h - declaration of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp index c1ca26cec..aba59510f 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.cpp - implementation of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.h b/plugins/platform/windows/WindowsInputDeviceFunctions.h index 482fb145c..9e8b53111 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.h +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.h - declaration of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp index efd953d86..2ead91bfc 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h index e4883ea38..2246dcbed 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.cpp b/plugins/platform/windows/WindowsNetworkFunctions.cpp index 61b71ac5e..c71c59000 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.cpp +++ b/plugins/platform/windows/WindowsNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.cpp - implementation of WindowsNetworkFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.h b/plugins/platform/windows/WindowsNetworkFunctions.h index 92347ee57..a76140fb2 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.h +++ b/plugins/platform/windows/WindowsNetworkFunctions.h @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.h - declaration of WindowsNetworkFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfiguration.h b/plugins/platform/windows/WindowsPlatformConfiguration.h index acf112803..791d0f130 100644 --- a/plugins/platform/windows/WindowsPlatformConfiguration.h +++ b/plugins/platform/windows/WindowsPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfiguration.h - configuration values for WindowsPlatform plugin * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp index 12c9145b5..0baf473ba 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.h b/plugins/platform/windows/WindowsPlatformConfigurationPage.h index 31e8ca03c..d8edacd9b 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.h +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.h - header for the WindowsPlatformConfigurationPage class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.cpp b/plugins/platform/windows/WindowsPlatformPlugin.cpp index 4e2fbc662..756bf3c7f 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.cpp +++ b/plugins/platform/windows/WindowsPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.cpp - implementation of WindowsPlatformPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.h b/plugins/platform/windows/WindowsPlatformPlugin.h index 36cd35586..667d23b51 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.h +++ b/plugins/platform/windows/WindowsPlatformPlugin.h @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.h - declaration of WindowsPlatformPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 6e766ad0e..7eefe9ea8 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceControl.h - class for managing a Windows service * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.h b/plugins/platform/windows/WindowsServiceControl.h index 8161730ba..4f6d55b5e 100644 --- a/plugins/platform/windows/WindowsServiceControl.h +++ b/plugins/platform/windows/WindowsServiceControl.h @@ -1,7 +1,7 @@ /* * WindowsService.h - class for managing a Windows service * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index 4775dc888..847399b3c 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceCore.cpp - implementation of WindowsServiceCore class * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.h b/plugins/platform/windows/WindowsServiceCore.h index c4122fc89..10c2fbd1d 100644 --- a/plugins/platform/windows/WindowsServiceCore.h +++ b/plugins/platform/windows/WindowsServiceCore.h @@ -1,7 +1,7 @@ /* * WindowsServiceCore.h - header file for WindowsServiceCore class * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.cpp b/plugins/platform/windows/WindowsServiceFunctions.cpp index d5e732d81..1b56d27de 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.cpp +++ b/plugins/platform/windows/WindowsServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.cpp - implementation of WindowsServiceFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.h b/plugins/platform/windows/WindowsServiceFunctions.h index c0642d3fb..d33c7bdf0 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.h +++ b/plugins/platform/windows/WindowsServiceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.h - declaration of WindowsServiceFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 448a4d582..3b3757063 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.cpp - implementation of WindowsSessionFunctions class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index e100d2879..b89d8b76e 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.h - declaration of WindowsSessionFunctions class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index b866e986c..4b7e345df 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.cpp - implementation of WindowsUserFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index 1dc693ecc..6f201cf7f 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.h - declaration of WindowsUserFunctions class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 71b4ac599..828b0047c 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -1,7 +1,7 @@ /* * WtsSessionManager.cpp - implementation of WtsSessionManager class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index c82e76e03..fcd3813cd 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -1,7 +1,7 @@ /* * WtsSessionManager.h - header file for WtsSessionManager class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 25cdd6643..4190cf85e 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.cpp - implementation of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.h b/plugins/powercontrol/PowerControlFeaturePlugin.h index ecd8ec0b6..c797d35b2 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.h +++ b/plugins/powercontrol/PowerControlFeaturePlugin.h @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.h - declaration of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.cpp b/plugins/powercontrol/PowerDownTimeInputDialog.cpp index bb0c6f2cb..d544ea96c 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.cpp +++ b/plugins/powercontrol/PowerDownTimeInputDialog.cpp @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - implementation of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.h b/plugins/powercontrol/PowerDownTimeInputDialog.h index e37f1ddcf..54610a147 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.h +++ b/plugins/powercontrol/PowerDownTimeInputDialog.h @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - declaration of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 5e2f076e4..402ee145d 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.cpp - implementation of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index 4bbd67335..24e3f13e1 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.h - declaration of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.cpp b/plugins/remoteaccess/RemoteAccessPage.cpp index 947c49998..1af2cdedd 100644 --- a/plugins/remoteaccess/RemoteAccessPage.cpp +++ b/plugins/remoteaccess/RemoteAccessPage.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.h b/plugins/remoteaccess/RemoteAccessPage.h index 445f9a72a..df14f357b 100644 --- a/plugins/remoteaccess/RemoteAccessPage.h +++ b/plugins/remoteaccess/RemoteAccessPage.h @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index bc2a68139..0aa0904b9 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.cpp - widget containing a VNC-view and controls for it * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index 4f6fb18a9..c3dc2a9c4 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.h - widget containing a VNC view and controls for it * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.cpp b/plugins/screenlock/ScreenLockFeaturePlugin.cpp index e7b1cbaae..c565db72c 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.cpp +++ b/plugins/screenlock/ScreenLockFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.cpp - implementation of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.h b/plugins/screenlock/ScreenLockFeaturePlugin.h index 17248aba0..7271c2946 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.h +++ b/plugins/screenlock/ScreenLockFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.h - declaration of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.cpp b/plugins/screenshot/ScreenshotFeaturePlugin.cpp index 6ccfa2514..0542b2abc 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.cpp +++ b/plugins/screenshot/ScreenshotFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.cpp - implementation of ScreenshotFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.h b/plugins/screenshot/ScreenshotFeaturePlugin.h index 8e927ac21..0daf5d975 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.h +++ b/plugins/screenshot/ScreenshotFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.h - declaration of ScreenshotFeature class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotListModel.cpp b/plugins/screenshot/ScreenshotListModel.cpp index 9d28e7446..e98a82b8f 100644 --- a/plugins/screenshot/ScreenshotListModel.cpp +++ b/plugins/screenshot/ScreenshotListModel.cpp @@ -1,7 +1,7 @@ /* * ScreenshotListModel.cpp - implementation of ScreenshotListModel * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotListModel.h b/plugins/screenshot/ScreenshotListModel.h index 4c118c8a2..16b937e37 100644 --- a/plugins/screenshot/ScreenshotListModel.h +++ b/plugins/screenshot/ScreenshotListModel.h @@ -1,7 +1,7 @@ /* * ScreenshotListModel.h - declaration of ScreenshotListModel * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp index 937504ab4..15cb513fe 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.cpp - implementation of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.h b/plugins/systemusergroups/SystemUserGroupsPlugin.h index 5395bfdf4..fc334e765 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.h +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.h @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.h - declaration of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.cpp b/plugins/testing/TestingCommandLinePlugin.cpp index 9c2c759ef..a86dda2aa 100644 --- a/plugins/testing/TestingCommandLinePlugin.cpp +++ b/plugins/testing/TestingCommandLinePlugin.cpp @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.cpp - implementation of TestingCommandLinePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.h b/plugins/testing/TestingCommandLinePlugin.h index 753807638..f8f945e8a 100644 --- a/plugins/testing/TestingCommandLinePlugin.h +++ b/plugins/testing/TestingCommandLinePlugin.h @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.h - declaration of TestingCommandLinePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.cpp b/plugins/textmessage/TextMessageDialog.cpp index e0ac19a32..cc7d67779 100644 --- a/plugins/textmessage/TextMessageDialog.cpp +++ b/plugins/textmessage/TextMessageDialog.cpp @@ -1,7 +1,7 @@ /* * TextMessageDialog.cpp - implementation of text message dialog class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.h b/plugins/textmessage/TextMessageDialog.h index 0299ac792..ad52fabb7 100644 --- a/plugins/textmessage/TextMessageDialog.h +++ b/plugins/textmessage/TextMessageDialog.h @@ -1,7 +1,7 @@ /* * TextMessageDialog.h - declaration of text message dialog class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.cpp b/plugins/textmessage/TextMessageFeaturePlugin.cpp index 0f8315d76..9b1bc3c85 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.cpp +++ b/plugins/textmessage/TextMessageFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.cpp - implementation of TextMessageFeaturePlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.h b/plugins/textmessage/TextMessageFeaturePlugin.h index bf97a41a1..ece971e3e 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.h +++ b/plugins/textmessage/TextMessageFeaturePlugin.h @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.h - declaration of TextMessageFeature class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.cpp b/plugins/usersessioncontrol/UserLoginDialog.cpp index aec8142d9..427b21347 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.cpp +++ b/plugins/usersessioncontrol/UserLoginDialog.cpp @@ -1,7 +1,7 @@ /* * UserLoginDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.h b/plugins/usersessioncontrol/UserLoginDialog.h index eba6920a5..a06efa726 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.h +++ b/plugins/usersessioncontrol/UserLoginDialog.h @@ -1,7 +1,7 @@ /* * UserLoginDialog.h - dialog for querying logon credentials * - * Copyright (c) 2019-2022 Tobias Junghans + * Copyright (c) 2019-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp index 1eba45e44..c613c2734 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.cpp - implementation of UserSessionControlPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.h b/plugins/usersessioncontrol/UserSessionControlPlugin.h index d598a63b3..6530ec617 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.h +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.h @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.h - declaration of UserSessionControlPlugin class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.cpp b/plugins/vncserver/external/ExternalVncServer.cpp index 36cce8ea2..8e7a7e775 100644 --- a/plugins/vncserver/external/ExternalVncServer.cpp +++ b/plugins/vncserver/external/ExternalVncServer.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServer.cpp - implementation of ExternalVncServer class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.h b/plugins/vncserver/external/ExternalVncServer.h index f3888ee74..49959f2a0 100644 --- a/plugins/vncserver/external/ExternalVncServer.h +++ b/plugins/vncserver/external/ExternalVncServer.h @@ -1,7 +1,7 @@ /* * ExternalVncServer.h - declaration of ExternalVncServer class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfiguration.h b/plugins/vncserver/external/ExternalVncServerConfiguration.h index 08454b66a..e7a250d65 100644 --- a/plugins/vncserver/external/ExternalVncServerConfiguration.h +++ b/plugins/vncserver/external/ExternalVncServerConfiguration.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfiguration.h - configuration values for external VNC server * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp index 062391224..5b039777f 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - implementation of the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h index d6894ccb6..5a8612489 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - header for the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncConfiguration.h b/plugins/vncserver/headless/HeadlessVncConfiguration.h index e8117b77f..acdd71dc3 100644 --- a/plugins/vncserver/headless/HeadlessVncConfiguration.h +++ b/plugins/vncserver/headless/HeadlessVncConfiguration.h @@ -1,7 +1,7 @@ /* * HeadlessVncConfiguration.h - headless VNC server specific configuration values * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp index c4133dc86..cd7a9545f 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.cpp +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -1,7 +1,7 @@ /* * HeadlessVncServer.cpp - implementation of HeadlessVncServer class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.h b/plugins/vncserver/headless/HeadlessVncServer.h index f24799973..10928673f 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.h +++ b/plugins/vncserver/headless/HeadlessVncServer.h @@ -1,7 +1,7 @@ /* * HeadlessVncServer.h - declaration of HeadlessVncServer class * - * Copyright (c) 2020-2022 Tobias Junghans + * Copyright (c) 2020-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp index 4505d3974..626a033fe 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.cpp - implementation of BuiltinUltraVncServer class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h index 209157589..a99e35cdd 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.h - declaration of BuiltinUltraVncServer class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp index e7758e78d..2a5e0a0b2 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp @@ -1,7 +1,7 @@ /* * LogoffEventFilter.cpp - implementation of LogoffEventFilter class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h index b223c90bc..f20c8c815 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h @@ -1,7 +1,7 @@ /* * LogoffEventFilter.h - declaration of LogoffEventFilter class * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h index a1a9f15d9..b43eca462 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h @@ -1,7 +1,7 @@ /* * UltraVncConfiguration.h - UltraVNC-specific configuration values * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp index c3235583a..271532853 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - implementation of the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h index 573169bee..3ad1114b8 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - header for the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index e867c16b4..c5c30a6fd 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.cpp - implementation of BuiltinX11VncServer class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h index 7153a2703..05146ef9d 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.h - declaration of BuiltinX11VncServer class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h index 62f29fcba..4ec30f802 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h @@ -1,7 +1,7 @@ /* * X11VncConfiguration.h - x11vnc-specific configuration values * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp index 3c06864d1..dde1a990d 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - implementation of the X11VncConfigurationWidget class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h index 5c4436416..5b641bd07 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - header for the X11VncConfigurationWidget class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlClient.cpp b/server/src/ComputerControlClient.cpp index 8405d3321..c556b8ffe 100644 --- a/server/src/ComputerControlClient.cpp +++ b/server/src/ComputerControlClient.cpp @@ -1,7 +1,7 @@ /* * ComputerControlClient.cpp - implementation of the ComputerControlClient class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlClient.h b/server/src/ComputerControlClient.h index 4eaf7571d..044962ea7 100644 --- a/server/src/ComputerControlClient.h +++ b/server/src/ComputerControlClient.h @@ -1,7 +1,7 @@ /* * ComputerControlClient.h - header file for the ComputerControlClient class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 94a1a28cf..cca8f2cf8 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -1,7 +1,7 @@ /* * ComputerControlServer.cpp - implementation of ComputerControlServer * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index 3c6c006e7..d1ddfaa6f 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -1,7 +1,7 @@ /* * ComputerControlServer.h - header file for ComputerControlServer * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index f4b517b08..23764b6b3 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.cpp - implementation of ServerAccessControlManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.h b/server/src/ServerAccessControlManager.h index 9cf8cd096..9f06eec1d 100644 --- a/server/src/ServerAccessControlManager.h +++ b/server/src/ServerAccessControlManager.h @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.h - header file for ServerAccessControlManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.cpp b/server/src/ServerAuthenticationManager.cpp index 5725a22c7..5899a5b9d 100644 --- a/server/src/ServerAuthenticationManager.cpp +++ b/server/src/ServerAuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.cpp - implementation of ServerAuthenticationManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.h b/server/src/ServerAuthenticationManager.h index 91a4f6c5a..1389c051c 100644 --- a/server/src/ServerAuthenticationManager.h +++ b/server/src/ServerAuthenticationManager.h @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.h - header file for ServerAuthenticationManager * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/TlsServer.cpp b/server/src/TlsServer.cpp index 1efe0dddb..1f11a4d53 100644 --- a/server/src/TlsServer.cpp +++ b/server/src/TlsServer.cpp @@ -1,7 +1,7 @@ /* * TlsServer.cpp - header file for TlsServer * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/TlsServer.h b/server/src/TlsServer.h index e03af4762..c135a5878 100644 --- a/server/src/TlsServer.h +++ b/server/src/TlsServer.h @@ -1,7 +1,7 @@ /* * TlsServer.h - header file for TlsServer * - * Copyright (c) 2021-2022 Tobias Junghans + * Copyright (c) 2021-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.cpp b/server/src/VeyonServerProtocol.cpp index 92c84b071..1f9d2f4c1 100644 --- a/server/src/VeyonServerProtocol.cpp +++ b/server/src/VeyonServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.cpp - implementation of the VeyonServerProtocol class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.h b/server/src/VeyonServerProtocol.h index 46d767381..af2100595 100644 --- a/server/src/VeyonServerProtocol.h +++ b/server/src/VeyonServerProtocol.h @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.h - header file for the VeyonServerProtocol class * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.cpp b/server/src/VncProxyConnection.cpp index 068a2c6c8..e3c83f743 100644 --- a/server/src/VncProxyConnection.cpp +++ b/server/src/VncProxyConnection.cpp @@ -1,7 +1,7 @@ /* * VncProxyConnection.cpp - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.h b/server/src/VncProxyConnection.h index da7b1462c..7f2820de1 100644 --- a/server/src/VncProxyConnection.h +++ b/server/src/VncProxyConnection.h @@ -1,7 +1,7 @@ /* * VncProxyConnection.h - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnectionFactory.h b/server/src/VncProxyConnectionFactory.h index 9edb5db53..9b986afe9 100644 --- a/server/src/VncProxyConnectionFactory.h +++ b/server/src/VncProxyConnectionFactory.h @@ -1,7 +1,7 @@ /* * VncProxyConnectionFactory.h - abstract factory class for VncProxyConnectionFactory objects * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.cpp b/server/src/VncProxyServer.cpp index 109c7a910..871de767b 100644 --- a/server/src/VncProxyServer.cpp +++ b/server/src/VncProxyServer.cpp @@ -1,7 +1,7 @@ /* * VncProxyServer.cpp - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.h b/server/src/VncProxyServer.h index f5d8fbc70..a8790c052 100644 --- a/server/src/VncProxyServer.h +++ b/server/src/VncProxyServer.h @@ -1,7 +1,7 @@ /* * VncProxyServer.h - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.cpp b/server/src/VncServer.cpp index 1941c26b0..fcd591eae 100644 --- a/server/src/VncServer.cpp +++ b/server/src/VncServer.cpp @@ -2,7 +2,7 @@ * VncServer.cpp - implementation of VncServer, a VNC-server- * abstraction for platform independent VNC-server-usage * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.h b/server/src/VncServer.h index 42fcba751..02c46a719 100644 --- a/server/src/VncServer.h +++ b/server/src/VncServer.h @@ -2,7 +2,7 @@ * VncServer.h - class VncServer, a VNC server abstraction for * platform-independent VNC server usage * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/main.cpp b/server/src/main.cpp index 5450db9e1..8e9358d8e 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Server * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/veyon-server.rc.in b/server/veyon-server.rc.in index 24d3da4d7..6b7ef1536 100644 --- a/server/veyon-server.rc.in +++ b/server/veyon-server.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Server\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-server.exe\0" END END diff --git a/service/src/main.cpp b/service/src/main.cpp index 4b0e6ffa7..492a16197 100644 --- a/service/src/main.cpp +++ b/service/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Service * - * Copyright (c) 2006-2022 Tobias Junghans + * Copyright (c) 2006-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/service/veyon-service.rc.in b/service/veyon-service.rc.in index a35dd891b..776c78377 100644 --- a/service/veyon-service.rc.in +++ b/service/veyon-service.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Service\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-service.exe\0" END END diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index c9355de09..d7953ac18 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.cpp - class which handles communication between service and feature * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/FeatureWorkerManagerConnection.h b/worker/src/FeatureWorkerManagerConnection.h index a4ff598ad..961f7bdae 100644 --- a/worker/src/FeatureWorkerManagerConnection.h +++ b/worker/src/FeatureWorkerManagerConnection.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.h - class which handles communication between worker manager and worker * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.cpp b/worker/src/VeyonWorker.cpp index 6f8c6e056..4f4a8a33e 100644 --- a/worker/src/VeyonWorker.cpp +++ b/worker/src/VeyonWorker.cpp @@ -1,7 +1,7 @@ /* * VeyonWorker.cpp - basic implementation of Veyon Worker * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.h b/worker/src/VeyonWorker.h index 9dd84fb2f..15f4474eb 100644 --- a/worker/src/VeyonWorker.h +++ b/worker/src/VeyonWorker.h @@ -1,7 +1,7 @@ /* * VeyonWorker.h - basic implementation of Veyon Worker * - * Copyright (c) 2018-2022 Tobias Junghans + * Copyright (c) 2018-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/main.cpp b/worker/src/main.cpp index 79df78b45..302f7ee11 100644 --- a/worker/src/main.cpp +++ b/worker/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Feature Worker * - * Copyright (c) 2017-2022 Tobias Junghans + * Copyright (c) 2017-2023 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/veyon-worker.rc.in b/worker/veyon-worker.rc.in index da00ab58a..41b811b99 100644 --- a/worker/veyon-worker.rc.in +++ b/worker/veyon-worker.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2022 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-worker.exe\0" END END From 8642f2cdf0fdefcb754863bc55cb0433a2dcefaf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Apr 2023 12:51:27 +0200 Subject: [PATCH 1487/1765] VeyonConfigurationProperties: add remoteAccessImageQuality property --- configurator/src/MasterConfigurationPage.ui | 237 +++++++++++--------- core/src/VeyonConfigurationProperties.h | 1 + 2 files changed, 138 insertions(+), 100 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 643c2cb71..6de060d52 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -76,50 +76,134 @@ User interface + + + + Background color + + + + + + - + + + ms + + + 250 + + + 10000 + + + 250 + + + 1000 + + + + + + + Sort order + + + + + + + Monitoring image quality + + + + + + + px + + + + + + 2 + + + 50 + + + 16 + + + + + + + Thumbnail spacing + + + + + + + Computer thumbnail caption + + + + + + + + - Auto + Computer and user name - 16:9 + Only user name - 16:10 + Only computer name + + + + - 3:2 + Highest - 4:3 + High + + + + + Medium + + + + + Low + + + + + Lowest - - - - Thumbnail spacing - - - - - - - Use modern user interface (experimental) - - - - + @@ -138,113 +222,72 @@ - - - - Computer thumbnail caption - - - - - - - - + + - Text color + Thumbnail aspect ratio - + - Thumbnail aspect ratio + Thumbnail update interval - - - - px - - - - - - 2 - - - 50 - - - 16 + + + + Text color - - + + - Computer and user name + Auto - Only user name + 16:9 - Only computer name + 16:10 + + + + + 3:2 + + + + + 4:3 - - - - - + + - Thumbnail update interval + Use modern user interface (experimental) - - + + - Image quality + Remote access image quality - - - ms - - - 250 - - - 10000 - - - 250 - - - 1000 - - - - - - - Sort order - - - - - + Highest @@ -272,13 +315,6 @@ - - - - Background color - - - @@ -539,6 +575,7 @@ openUserConfigurationDirectory openScreenshotDirectory computerMonitoringImageQuality + remoteAccessImageQuality computerMonitoringUpdateInterval computerMonitoringAspectRatio computerMonitoringBackgroundColor diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index e417417de..9b66363ff 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -109,6 +109,7 @@ #define FOREACH_VEYON_MASTER_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, modernUserInterface, setModernUserInterface, "ModernUserInterface", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), VncConnectionConfiguration::Quality, computerMonitoringImageQuality, setComputerMonitoringImageQuality, "ComputerMonitoringImageQuality", "Master", QVariant::fromValue(VncConnectionConfiguration::Quality::Medium), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), VncConnectionConfiguration::Quality, remoteAccessImageQuality, setRemoteAccessImageQuality, "RemoteAccessImageQuality", "Master", QVariant::fromValue(VncConnectionConfiguration::Quality::Highest), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringUpdateInterval, setComputerMonitoringUpdateInterval, "ComputerMonitoringUpdateInterval", "Master", 1000, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringThumbnailSpacing, setComputerMonitoringThumbnailSpacing, "ComputerMonitoringThumbnailSpacing", "Master", 5, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::DisplayRoleContent, computerDisplayRoleContent, setComputerDisplayRoleContent, "ComputerDisplayRoleContent", "Master", QVariant::fromValue(ComputerListModel::DisplayRoleContent::UserAndComputerName), Configuration::Property::Flag::Standard ) \ From 794131ed1e68566b466c3c1439483d70aa16f68a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Apr 2023 12:51:58 +0200 Subject: [PATCH 1488/1765] CCI: use remoteAccessImageQuality for UpdateMode::Live --- core/src/ComputerControlInterface.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 3e9276039..10d44a7aa 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -381,6 +381,7 @@ void ComputerControlInterface::setQuality() break; case UpdateMode::Live: + quality = VeyonCore::config().remoteAccessImageQuality(); break; } } From edebf1d2d197ca8ab25cf75e83d3c68b5c238eae Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Apr 2023 12:47:45 +0200 Subject: [PATCH 1489/1765] ComputerSelectPanel: make columns sortable --- master/src/ComputerSelectPanel.ui | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/master/src/ComputerSelectPanel.ui b/master/src/ComputerSelectPanel.ui index ad2cf0abd..f026a9902 100644 --- a/master/src/ComputerSelectPanel.ui +++ b/master/src/ComputerSelectPanel.ui @@ -11,6 +11,9 @@ QAbstractItemView::NoEditTriggers + + true + true @@ -21,7 +24,7 @@ 180 - false + true From e6522e41cf78793eaa5678b8becaa747ae9dd431 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Apr 2023 12:51:00 +0200 Subject: [PATCH 1490/1765] ComputerSelectPanel: improve placeholder text --- master/src/ComputerSelectPanel.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ComputerSelectPanel.ui b/master/src/ComputerSelectPanel.ui index f026a9902..036b23e56 100644 --- a/master/src/ComputerSelectPanel.ui +++ b/master/src/ComputerSelectPanel.ui @@ -31,7 +31,7 @@ - Computer search + Search computers From 69fa655e5416a1b71f0631817b9ff9ecf777aa88 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Apr 2023 12:57:55 +0200 Subject: [PATCH 1491/1765] MasterConfigurationPage: improve label text --- configurator/src/MasterConfigurationPage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 6de060d52..c2897acc6 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -115,7 +115,7 @@ - Monitoring image quality + Image quality in monitoring mode From eb654278a772b84dfbef0794943811ff06acfae1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Apr 2023 13:08:19 +0200 Subject: [PATCH 1492/1765] Transifex: migrate config file to new format --- .tx/config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.tx/config b/.tx/config index cc433b02b..f7022cb79 100644 --- a/.tx/config +++ b/.tx/config @@ -1,9 +1,9 @@ [main] host = https://www.transifex.com -minimum_perc = 5 -[veyon.veyon_50] +[o:veyon-solutions:p:veyon:r:veyon_50] file_filter = translations/veyon_.ts source_file = translations/veyon.ts source_lang = en +minimum_perc = 5 type = QT From 9029600bc667662133a80c169fcfbf4ea11d7c40 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 Apr 2023 09:39:50 +0200 Subject: [PATCH 1493/1765] 3rdparty: ultravnc: update submodule (1.4.2.0) --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 628a23a45..b5a6dcb9b 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 628a23a45874e587cba31c650abb60d5931f4257 +Subproject commit b5a6dcb9b8b595d8e224a45ff260f3db11c6ef7b From e3feeabf8e2cf75a00eb36ca1fe1703c4a538a37 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 Apr 2023 11:01:18 +0200 Subject: [PATCH 1494/1765] CCLM: disconnect from CCI when stopping it Since references to a CCI instances may exist (e.g. in worker threads in plugins) and the CCI instance continue to live, we must not receive signals any further from it since it's not part of the model any longer and therefore any data update attempts will result in invalid model indexes being referenced. --- master/src/ComputerControlListModel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 61aa83d26..80d722e67 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -417,6 +417,7 @@ void ComputerControlListModel::stopComputerControlInterface( const ComputerContr { m_master->stopAllFeatures( { controlInterface } ); + controlInterface->disconnect(this); controlInterface->disconnect( &m_master->computerManager() ); controlInterface->setUserInformation({}, {}); From 14fc2f21c9fc448ea152b7c2bcb6305cadd95157 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 Apr 2023 12:02:29 +0200 Subject: [PATCH 1495/1765] NSIS: update copyright --- nsis/veyon.nsi.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index 687ab73ee..f817386ba 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -2,7 +2,7 @@ !define COMP_NAME "Veyon Solutions" !define WEB_SITE "https://veyon.io" !define VERSION "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@.@VERSION_BUILD@" -!define COPYRIGHT "2004-2022 Veyon Solutions / Tobias Junghans" +!define COPYRIGHT "2004-2023 Veyon Solutions / Tobias Junghans" !define DESCRIPTION "Veyon Installer" !define LICENSE_TXT "COPYING" !define INSTALLER_NAME "veyon-${VERSION}-@VEYON_WINDOWS_ARCH@-setup.exe" From 46fe92a57b38b093c82578737a78d50ebd1bfdaf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 25 Apr 2023 14:35:10 +0200 Subject: [PATCH 1496/1765] CMake: WindowsInstaller: bundle Qt's OpenSSL TLS backend With Qt 6 the TLS backends are refactored into dedicated plugins. --- cmake/modules/WindowsInstaller.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/modules/WindowsInstaller.cmake b/cmake/modules/WindowsInstaller.cmake index 9fcd94203..78ac11334 100644 --- a/cmake/modules/WindowsInstaller.cmake +++ b/cmake/modules/WindowsInstaller.cmake @@ -61,6 +61,8 @@ add_custom_target(windows-binaries COMMAND cp ${MINGW_PREFIX}/plugins/platforms/qwindows.dll ${WINDOWS_INSTALL_FILES}/platforms COMMAND mkdir -p ${WINDOWS_INSTALL_FILES}/styles COMMAND cp ${MINGW_PREFIX}/plugins/styles/*.dll ${WINDOWS_INSTALL_FILES}/styles + COMMAND mkdir -p ${WINDOWS_INSTALL_FILES}/tls + COMMAND cp ${MINGW_PREFIX}/plugins/tls/qopensslbackend.dll ${WINDOWS_INSTALL_FILES}/tls COMMAND ${MINGW_TOOL_PREFIX}strip ${WINDOWS_INSTALL_FILES}/*.dll ${WINDOWS_INSTALL_FILES}/*.exe ${WINDOWS_INSTALL_FILES}/plugins/*.dll ${WINDOWS_INSTALL_FILES}/platforms/*.dll ${WINDOWS_INSTALL_FILES}/styles/*.dll ${WINDOWS_INSTALL_FILES}/crypto/*.dll COMMAND cp ${CMAKE_SOURCE_DIR}/COPYING ${WINDOWS_INSTALL_FILES} COMMAND cp ${CMAKE_SOURCE_DIR}/COPYING ${WINDOWS_INSTALL_FILES}/LICENSE.TXT From d62a50be2b2f40065f5dc36343acdc47fc8c8434 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 26 Apr 2023 15:05:13 +0200 Subject: [PATCH 1497/1765] 3rdparty: ultravnc: update submodule Includes fix to run in service mode properly and allows to build without LayeredWindows implementation. --- 3rdparty/ultravnc | 2 +- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index b5a6dcb9b..8b99d4556 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit b5a6dcb9b8b595d8e224a45ff260f3db11c6ef7b +Subproject commit 8b99d4556d1fb2ea82eca80b80dc21d41a6e26ed diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index b6e8e5a33..f52a91ab5 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -25,7 +25,6 @@ set(ultravnc_CXX_SOURCES ${ultravnc_DIR}/winvnc/winvnc/HideDesktop.cpp ${ultravnc_DIR}/winvnc/winvnc/inifile.cpp ${ultravnc_DIR}/winvnc/winvnc/IPC.cpp - ${ultravnc_DIR}/winvnc/winvnc/LayeredWindows.cpp ${ultravnc_DIR}/winvnc/winvnc/MouseSimulator.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbRegion_win32.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbUpdateTracker.cpp From c22714c77021e54c53891143e4453ce3f99c9642 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 26 Apr 2023 15:24:32 +0200 Subject: [PATCH 1498/1765] NSIS: bundle Qt's OpenSSL TLS backend This amends commit 46fe92a57b38b093c82578737a78d50ebd1bfdaf. --- nsis/veyon.nsi.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index f817386ba..b8f22dc38 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -186,6 +186,9 @@ SetOutPath "$INSTDIR\platforms" File "platforms/qwindows.dll" SetOutPath "$INSTDIR\styles" File "styles/*.dll" +# Qt TLS backend +SetOutPath "$INSTDIR\tls" +File "tls/qopensslbackend.dll" # configuration ExecWait '"$INSTDIR\veyon-wcli.exe" service register' ExecWait '"$INSTDIR\veyon-wcli.exe" config set Network/FirewallExceptionEnabled 1' From 9b872daae7d20ee4d62938eda7ef956a66dbf465 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 10 May 2023 20:33:00 +0200 Subject: [PATCH 1499/1765] HeadlessVncServer: add missing include Partially fixes #886. --- plugins/vncserver/headless/HeadlessVncServer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp index cd7a9545f..894ce2eee 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.cpp +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -28,6 +28,8 @@ extern "C" { #include +#include + #include "HeadlessVncServer.h" #include "VeyonConfiguration.h" From 2db2d64af0793b27e0afdd95be166daa51eb260e Mon Sep 17 00:00:00 2001 From: FastAct <93490087+FastAct@users.noreply.github.com> Date: Fri, 9 Jun 2023 10:50:50 +0200 Subject: [PATCH 1500/1765] Update veyon_nl.ts --- translations/veyon_nl.ts | 955 ++++++++++++++++++++------------------- 1 file changed, 479 insertions(+), 476 deletions(-) diff --git a/translations/veyon_nl.ts b/translations/veyon_nl.ts index bb790e5c2..1d3052e75 100644 --- a/translations/veyon_nl.ts +++ b/translations/veyon_nl.ts @@ -217,35 +217,35 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Accessing computer and local computer - + Toegang tot computer en lokale computer User being accessed - + Gebruiker die benaderd wordt is logged in locally - + is lokaal ingelogd is logged in remotely - + is op afstand ingelogd No user is logged in locally - + Geen enkele gebruiker is lokaal ingelogd One or multiple users are logged in locally - + Een of meerdere gebruikers zijn lokaal ingelogd No user is logged in remotely - + Er is geen gebruiker op afstand ingelogd One or multiple users are logged in remotely - + Een of meerdere gebruikers zijn op afstand ingelogd is located at @@ -253,15 +253,15 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an is not located at - + bevindt zich niet in are located at the same location - + bevinden zich op dezelfde locatie are not located the same location - + bevinden zich niet op dezelfde locatie is member of group @@ -269,59 +269,59 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an is not member of group - + is geen lid van groep is authenticated via - + is geverifieerd via is not authenticated via - + is niet geverifieerd via has one or more groups in common with user being accessed - + heeft een of meer groepen gemeen met de gebruiker die wordt benaderd has no groups in common with user being accessed - + heeft geen groepen gemeen met de gebruiker die wordt benaderd equals user being accessed - + is gelijk aan de gebruiker die wordt benaderd is different from user being accessed - + verschilt van de gebruiker die wordt benaderd is already connected - + is al verbonden is not connected - + is niet verbonden is local computer - + is de lokale computer is not local computer - + is geen lokale computer Computer being accessed - + Computer die wordt benaderd Session being accessed is a user session - + De sessie die wordt geopend is een gebruikerssessie Session being accessed is a login screen - + De sessie die wordt geopend is een inlogscherm @@ -332,7 +332,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Accessing user: - Toegangzoekende gebruiker: + Toegang tot gebruiker: Local computer: @@ -340,7 +340,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Accessing computer: - Toegangzoekende computer: + Computer benaderen: Please enter the following user and computer information in order to test the configured ruleset. @@ -352,7 +352,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Connected users: - Geconnecteerde gebruikers: + Verbonden gebruikers: The access in the given scenario is allowed. @@ -368,7 +368,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an ERROR: Unknown action - FOUT: onbekende actie + FOUT: Onbekende actie Test result @@ -376,7 +376,7 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Authentication method - + Authenticatiemethode @@ -387,15 +387,15 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Please perform the following steps to set up key file authentication: - Gelieve volgende stappen te volgen om sleutel authenticatie in te stellen: + Voer de volgende stappen uit om de verificatie van sleutelbestanden in te stellen: 1) Create a key pair on the master computer. - 1) Maak een key pair op de master computer. + 1) Maak een key pair aan op de master computer. 2) Set an access group whose members should be allowed to access other computers. - + Stel een toegangsgroep in waarvan de leden toegang moeten krijgen tot andere computers. 3) Export the public key and import it on all client computers with the same name. @@ -403,30 +403,33 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Raadpleeg de <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> voor meer informatie. Key file directories - Sleutelbestand folder + Sleutelbestand map Public key file base directory - Publieke sleutel basis bestands folder + Publieke sleutel basis bestandsmap Private key file base directory - Privé sleutel basis bestands folder + Privé sleutel basis bestandsmap Available authentication keys - Beschikbare authenticatie sleutels + Beschikbare authenticatiesleutels An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Een authenticatiesleutelpaar bestaat uit twee gekoppelde cryptografische sleutels, een private en een publieke sleutel. +Een privesleutel geeft gebruikers op de mastercomputer toegang tot clientcomputers. +Het is belangrijk dat alleen bevoegde gebruikers leestoegang hebben tot het bestand met de prive-sleutel. +De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaanvragen te controleren. Create key pair @@ -458,11 +461,11 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to create an authentication key pair: - Geef de naam van de gebruikers groep of rol waarvoor u een authenticatie sleutelpaar wil maken: + Geef de naam van de gebruikersgroep of rol waarvoor een authenticatie sleutelpaar moet worden gemaakt: Do you really want to delete authentication key "%1/%2"? - Bent u zeker om met de verwijdering van authenticatiesleutel "%1/%2" door te gaan? + Wilt u echt de authenticatie sleutel "%1/%2" verwijderen? Please select a key to delete! @@ -493,19 +496,19 @@ The public key is used on client computers to authenticate incoming connection r Key name contains invalid characters! - Key naam bevat niet toegestane karakters + Sleutel naam bevat ongeldige tekens! Invalid key type specified! Please specify "%1" or "%2". - + Ongeldig sleutel type opgegeven! Geef "%1" of "%2" op. Specified key does not exist! Please use the "list" command to list all installed keys. - + De opgegeven sleutel bestaat niet! Gebruik het "list" commando om alle geïnstalleerde sleutels op te sommen. One or more key files already exist! Please delete them using the "delete" command. - Eén of meer key files bestaan al! Verwijder ze door gebruik te maken van het commando "verwijder". + Eén of meer sleutelbestanden bestaan al! Verwijder ze met het commando "delete". Creating new key pair for "%1" @@ -517,15 +520,15 @@ The public key is used on client computers to authenticate incoming connection r Newly created key pair has been saved to "%1" and "%2". - Het nieuwe sleutelpaar is opgeslagen op "%1" en "%2" + Het nieuw aangemaakt sleutelpaar is opgeslagen in "%1" en "%2" Could not remove key file "%1"! - Kan sleutelbestand "%1" niet verwijderen! + Kon sleutelbestand "%1" niet verwijderen! Could not remove key file directory "%1"! - + Kon sleutelbestand map "%1" niet verwijderen! Failed to create directory for output file. @@ -541,7 +544,7 @@ The public key is used on client computers to authenticate incoming connection r Key "%1/%2" has been exported to "%3" successfully. - + Sleutel "%1/%2" is met succes geëxporteerd naar "%3". Failed read input file. @@ -565,15 +568,15 @@ The public key is used on client computers to authenticate incoming connection r Failed to set permissions for key file "%1"! - + Het instellen van machtigingen voor sleutelbestand "%1"! is mislukt! Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Sleutel "%1/%2" is met succes geïmporteerd. Controleer de bestandsrechten van "%3" om onrechtmatige toegang te voorkomen. Failed to convert private key to public key - Omzetten van private sleutel naar publieke sleutel is mislukt. + Het converteren van de private sleutel naar de publieke sleutel is mislukt Failed to create directory for private key file "%1". @@ -585,31 +588,31 @@ The public key is used on client computers to authenticate incoming connection r Failed to set permissions for private key file "%1"! - + Het instellen van machtigingen voor privésleutelbestand "%1" is mislukt! Failed to create directory for public key file "%1". - + Het aanmaken van de map voor het publieke sleutelbestand "%1" is mislukt. Failed to save public key in file "%1"! - + Het opslaan van de openbare sleutel in bestand "%1" is mislukt! Failed to set permissions for public key file "%1"! - + Het instellen van machtigingen voor openbare sleutelbestand "%1" is mislukt! Failed to set owner of key file "%1" to "%2". - + Het instellen van de eigenaar van sleutelbestand "%1" op "%2" is mislukt. Failed to set permissions for key file "%1". - + Het instellen van machtigingen voor sleutelbestand "%1" is mislukt. Key "%1" is now accessible by user group "%2". - + Sleutel "%1" is nu toegankelijk door gebruikersgroep "%2". <N/A> @@ -617,22 +620,22 @@ The public key is used on client computers to authenticate incoming connection r Failed to read key file. - Lezen van het sleutelbestand is mislukt. + Het lezen van het sleutelbestand is mislukt. AuthKeysPlugin Create new authentication key pair - + Maak nieuw verificatiesleutelpaar aan Delete authentication key - Verwijder authenticatie sleutel + Verwijder verificatiesleutel List authentication keys - + Lijst van verificatiesleutels Import public or private key @@ -644,11 +647,11 @@ The public key is used on client computers to authenticate incoming connection r Extract public key from existing private key - + Haal de openbare sleutel uit de bestaande private sleutel Set user group allowed to access a key - + Stel de gebruikersgroep in die toegang heeft tot een sleutel KEY @@ -660,7 +663,7 @@ The public key is used on client computers to authenticate incoming connection r This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + Dit commando past de bestandstoegangsrechten aan op <KEY> zodat alleen de gebruikersgroep <ACCESS GROUP> leestoegang heeft. NAME @@ -672,19 +675,19 @@ The public key is used on client computers to authenticate incoming connection r This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + Dit commando exporteert de authenticatiesleutel <KEY> naar <FILE>. Als <FILE> niet is opgegeven, wordt een naam samengesteld uit de naam en het type van <KEY>. This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + Dit commando importeert de authenticatiesleutel <KEY> uit <FILE>. Als <FILE> niet is opgegeven, wordt een naam samengesteld uit de naam en het type van <KEY>. This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Dit commando geeft een lijst weer van alle beschikbare authenticatiesleutels in de geconfigureerde sleutel map. Als de optie "%1" is opgegeven, wordt in plaats daarvan een tabel met sleuteldetails weergegeven. Sommige details kunnen ontbreken als een sleutel niet toegankelijk is, bijvoorbeeld door het ontbreken van leesrechten. Please specify the command to display help for! - + Geef het commando op waarvoor hulp moet worden weergegeven! TYPE @@ -696,35 +699,35 @@ The public key is used on client computers to authenticate incoming connection r Commands for managing authentication keys - + Commando's voor het beheren van authenticatiesleutels This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + Dit commando maakt een nieuw authenticatiesleutelpaar met de naam <NAME> en slaat de private en publieke sleutel op in de geconfigureerde sleutelmappen. De parameter moet een naam voor de sleutel zijn, die alleen letters mag bevatten. This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + Dit commando verwijdert de authenticatiesleutel <KEY> uit de geconfigureerde sleutelmap. Merk op dat een sleutel'niet kan worden hersteld als hij eenmaal is verwijderd. This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Dit commando haalt het openbare sleutelgedeelte uit de private sleutel <KEY> en slaat het op als de corresponderende publieke sleutel. Bij het opzetten van een andere mastercomputer is het daarom voldoende om alleen de private sleutel over te dragen. De openbare sleutel kan dan worden uitgepakt. Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Authenticatiesleutelbestanden zijn op deze computer niet correct ingesteld. Maak nieuwe sleutelbestanden aan of schakel over op een andere authenticatiemethode met behulp van de Veyon Configurator. Key file authentication - Sleutel bestand authenticatie + Sleutelbestand authenticatie Key file - + Sleutelbestand Please specify the key name (e.g. "teacher/public") as the first argument. - + Geef de sleutelnaam (bijv. "teacher/public") op als eerste argument. @@ -754,11 +757,11 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + Gebruikersnaam aan DN koppelen: e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + bijv. %username%@DOMAIN of cn=%username%,ou=users,dc=example,dc=org @@ -769,7 +772,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + Voer uw domein/LDAP-gebruikersnaam en wachtwoord in om toegang te krijgen tot computers. Username @@ -781,11 +784,11 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - Authenticatie fout + Authenticatiefout Logon failed with given username and password. Please try again! - Inloggen mislukt met de opgegeven gebruikersnaam en wachtwoord. Probeer het opnieuw! + Aanmelden mislukt met de opgegeven gebruikersnaam en wachtwoord. Probeer het opnieuw! @@ -808,18 +811,18 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - Authenticatie fout + Authenticatiefout Logon failed with given username and password. Please try again! - Inloggen mislukt met de opgegeven gebruikersnaam en wachtwoord. Probeer het opnieuw! + Aanmelden mislukt met de opgegeven gebruikersnaam en wachtwoord. Probeer het opnieuw! AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + De opgegeven gebruikersnaam of wachtwoord is onjuist. Voer geldige gegevens in of schakel over op een andere authenticatiemethode met behulp van de Veyon Configurator. Logon authentication @@ -827,7 +830,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + Log in @@ -838,44 +841,44 @@ The public key is used on client computers to authenticate incoming connection r Please enter the Veyon password: - + Voer het Veyon wachtwoord in: Authentication error - Authenticatie fout + Authenticatiefout Logon failed with given password. Please try again! - + Aanmelden mislukt met opgegeven wachtwoord. Probeer het opnieuw! AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Het opgegeven wachtwoord is onjuist. Voer het juiste wachtwoord in of schakel over op een andere authenticatiemethode met behulp van de Veyon Configurator. Simple password authentication - + Eenvoudige wachtwoordverificatie Simple password - + Eenvoudig wachtwoord AuthenticationPage Authentication is set up properly on this computer. - + Authenticatie is correct ingesteld op deze computer. AuthenticationPageTab Enabled - + Ingeschakeld Test @@ -886,7 +889,7 @@ The public key is used on client computers to authenticate incoming connection r BuiltinDirectoryConfiguration Builtin directory - + Ingebouwde map @@ -921,19 +924,19 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - + Ingebouwde map Locations - + Locaties Add new location - + Voeg nieuwe locatie toe Remove selected location - + Verwijder geselecteerde locatie New location @@ -941,30 +944,30 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + Map naam Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + Het importeren van CSV-bestanden is mogelijk via de opdrachtregelinterface. Zie voor meer informatie de <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. BuiltinDirectoryPlugin Show help for specific command - + Geef hulp weer voor een specifiek commando Import objects from given file - Importeer objecten van opgegeven bestand + Importeer objecten uit een opgegeven bestand Export objects to given file - Exporteer objecten van opgegeven bestand + Exporteer objecten naar een opgegeven bestand Invalid type specified. Valid values are "%1" or "%2". - + Ongeldig type opgegeven. Geldige waarden zijn "%1" of "%2". Type @@ -976,7 +979,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + Host adres MAC address @@ -984,7 +987,7 @@ The public key is used on client computers to authenticate incoming connection r Specified object not found. - Gevraagd object niet gevonnden. + Het opgegeven object is niet gevonden. File "%1" does not exist! @@ -1000,11 +1003,11 @@ The public key is used on client computers to authenticate incoming connection r Computer "%1" (host address: "%2" MAC address: "%3") - + Computer "%1" (host adres: "%2" MAC-adres: "%3") Unclassified object "%1" with ID "%2" - + Niet-geclassificeerd object "%1" met ID "%2" None @@ -1024,63 +1027,63 @@ The public key is used on client computers to authenticate incoming connection r Error while parsing line %1. - + Fout tijdens het ontleden van regel %1. Network object directory which stores objects in local configuration - + Netwerk object map die objecten opslaat in lokale configuratie Commands for managing the builtin network object directory - + Commando's voor het beheren van de ingebouwde netwerk object map No format string or regular expression specified! - + Geen format string of reguliere expressie gespecificeerd! Can't open file "%1" for writing! - + Can't open bestand "%1" om te schrijven! No format string specified! - + Geen format string gespecificeerd! Object UUID - + Object UUID Parent UUID - + Ouder UUID Add a location or computer - + Een locatie of computer toevoegen Clear all locations and computers - + Wis alle locaties en computers Dump all or individual locations and computers - + Alle of afzonderlijke locaties en computers dumpen List all locations and computers - + Alle locaties en computers weergeven Remove a location or computer - + Een locatie of computer verwijderen Location "%1" - + Locatie "%1" Builtin (computers and locations in local configuration) - + Ingebouwd (computers en locaties in lokale configuratie) Location @@ -1096,43 +1099,43 @@ The public key is used on client computers to authenticate incoming connection r FORMAT-STRING-WITH-PLACEHOLDERS - + FORMAT-STRING-MET-PLAATSHOUDERS REGULAR-EXPRESSION-WITH-PLACEHOLDER - + REGELMATIG-EXPRESSIE-MET-PLAATSHOUDER Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Importeert objecten uit het opgegeven tekstbestand met behulp van de opgegeven opmaaktekenreeks of reguliere expressie die een of meer plaatsaanduidingen bevat. Geldige plaatsaanduidingen zijn: %1 Import simple CSV file to a single room - + Importeer eenvoudig CSV-bestand naar een enkele kamer Import CSV file with location name in first column - + CSV-bestand importeren met locatienaam in eerste kolom Import text file with with key/value pairs using regular expressions - + Tekstbestand importeren met sleutel/waarde-paren met behulp van reguliere expressies Import arbitrarily formatted data - + Willekeurig opgemaakte gegevens importeren Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Exporteert objecten naar het opgegeven tekstbestand met behulp van de opgegeven opmaaktekenreeks die een of meerdere plaatsaanduidingen bevat. Geldige plaatsaanduidingen zijn: %1 Export all objects to a CSV file - + Alle objecten exporteren naar een CSV-bestand Export all computers in a specific location to a CSV file - + Alle computers op een specifieke locatie exporteren naar een CSV-bestand TYPE @@ -1144,11 +1147,11 @@ The public key is used on client computers to authenticate incoming connection r PARENT - + OUDER Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Voegt een object toe waarbij %1 een van "%2" of "%3" kan zijn. %4 kan worden gespecificeerd met naam of UUID. Add a room @@ -1156,15 +1159,15 @@ The public key is used on client computers to authenticate incoming connection r Add a computer to room %1 - + Een computer toevoegen aan ruimte %1 OBJECT - + OBJECT Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Verwijdert het opgegeven object uit de map. %1 kan worden opgegeven met naam of UUID. Als een locatie wordt verwijderd, worden ook alle gerelateerde computers verwijderd. Remove a computer by name @@ -1172,19 +1175,19 @@ The public key is used on client computers to authenticate incoming connection r Remove an object by UUID - + Verwijder een object op UUID "Room 01" - + " Ruimte 01" "Computer 01" - + "Computer 01" HOST ADDRESS - + HOST ADRES MAC ADDRESS @@ -1213,7 +1216,7 @@ The public key is used on client computers to authenticate incoming connection r Active features: %1 - + Actieve functies: %1 Online and connected @@ -1245,23 +1248,23 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + Locatie: %1 [no user] - + [geen gebruiker] Veyon Server unreachable or not running - + Veyon Server onbereikbaar of niet actief Name: %1 - + Naam: %1 invalid - + ongeldig @@ -1280,30 +1283,30 @@ The public key is used on client computers to authenticate incoming connection r User "%1" at host "%2" is now accessing this computer. - + Gebruiker "%1" op host "%2" benadert nu deze computer. User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Gebruiker "%1" op host "%2" probeerde toegang te krijgen tot deze computer maar kon zich niet met succes aanmelden. Access control error - + Fout bij toegangscontrole User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Gebruiker "%1" op host "%2" heeft geprobeerd toegang te krijgen tot deze computer, maar is geblokkeerd vanwege de instellingen voor toegangscontrole. Active connections: - + Actieve verbindingen: ComputerGroupSelector Group %1 - + Groep %1 @@ -1318,19 +1321,19 @@ The public key is used on client computers to authenticate incoming connection r No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - Er is geen standaard plugin voor netwerkobjecten gevonden. Controleer uw installatie of configureer een andere netwerk object directory backend via%1 Configurator. + Er is geen standaard plugin voor de netwerkobjectdirectory gevonden. Controleer uw installatie of configureer een andere netwerk object directory backend via %1 Configurator. Location detection failed - + Locatiedetectie mislukt Computer name;Hostname;User - + Computernaam;Hostnaam;Gebruiker Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + Kan de locatie van deze computer niet bepalen. Dit wijst op een probleem met de systeemconfiguratie. In plaats daarvan worden alle locaties weergegeven in het selectiepaneel van de computer. @@ -1345,19 +1348,19 @@ The public key is used on client computers to authenticate incoming connection r Select all - + Selecteer alle Unselect all - + Alles de-selecteren Add to group - + Toevoegen aan groep Remove from group - + Verwijder uit groep @@ -1368,7 +1371,7 @@ The public key is used on client computers to authenticate incoming connection r Add location - + Locatie toevoegen Save computer/user list @@ -1388,22 +1391,22 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. - Kon de computer en gebruikerslijst niet schrijven naar %1! Controleer de toegangsrechten voor het bestand. + Kon de computer- en gebruikerslijst niet schrijven naar %1! Controleer de toegangsrechten voor het bestand. ConfigCommands Clear system-wide Veyon configuration - Veyon-configuratie helemaal wissen + Veyon-configuratie voor het hele systeem wissen List all configuration keys and values - Lijst alle configuratie sleutels en waarden op + Alle configuratiesleutels en -waarden weergeven Import configuration from given file - Importeer configuratie van opgegeven bestand + Importeer configuratie uit opgegeven bestand Export configuration to given file @@ -1411,23 +1414,23 @@ The public key is used on client computers to authenticate incoming connection r Read and output configuration value for given key - Lees en lever configuratiewaarde voor de gegeven sleutel uit + Configuratiewaarde lezen en uitvoeren voor gegeven sleutel Write given value to given configuration key - Schrijf de gegeven waarde naar de gegeven configuratiesleutel + Schrijf een gegeven waarde naar een gegeven configuratiesleutel Unset (remove) given configuration key - Ontkoppel (verwijder) de gegeven configuratiesleutel + Ontkoppel (verwijder) een gegeven configuratiesleutel Upgrade and save configuration of program and plugins - + Configuratie van programma en plugins upgraden en opslaan Please specify an existing configuration file to import. - Geef alstublieft een bestaand configuratiebestand op om te importeren. + Geef een bestaand configuratiebestand op om te importeren. Configuration file is not readable! @@ -1435,19 +1438,19 @@ The public key is used on client computers to authenticate incoming connection r Please specify a valid filename for the configuration export. - Geef alstublieft een geldige bestandsnaam op voor de configuratie export. + Geef een geldige bestandsnaam op voor de configuratie-export. Output file is not writable! - Uitvoerbestand is niet schrijfbaar! + Uitvoerbestand is niet beschrijfbaar! Output directory is not writable! - Uitvoermap is niet schrijfbaar! + Uitvoermap is niet beschrijfbaar! Please specify a valid key. - Geef alstublief een geldige sleutel op. + Geef een geldige sleutel op. Specified key does not exist in current configuration! @@ -1455,42 +1458,42 @@ The public key is used on client computers to authenticate incoming connection r Please specify a valid value. - Geef alstublief een geldige waarde op. + Geef een geldige waarde op. Configure Veyon at command line - Configureer Veyon via opdrachtregel + Configureer Veyon via de opdrachtregel Commands for managing the configuration of Veyon - Commando's voor het beheren van de configuratie van Veyon + Commando's voor het beheer van de configuratie van Veyon ConfigurationManager Could not modify the autostart property for the %1 Service. - Kon de autostart eigenschap niet wijzigen voor de %1 service. + Kon de autostart eigenschap voor de %1 service niet wijzigen. Could not configure the firewall configuration for the %1 Server. - + Kon de firewallconfiguratie voor de %1 Server niet configureren. Could not configure the firewall configuration for the %1 Worker. - + Kon de firewallconfiguratie voor de %1 Werker niet configureren. Configuration is not writable. Please check your permissions! - + Configuratie is niet beschrijfbaar. Controleer uw rechten! Could not apply platform-specific configuration settings. - + Kon platform-specifieke configuratie-instellingen niet toepassen. Could not configure the firewall configuration for the %1 Service. - + Kon de firewallconfiguratie voor de %1-service niet configureren. @@ -1508,11 +1511,11 @@ The public key is used on client computers to authenticate incoming connection r Tunables - Tunables + Afstembare ms - ms + ms Key frame interval @@ -1524,7 +1527,7 @@ The public key is used on client computers to authenticate incoming connection r MB - MB + MB Update interval @@ -1532,11 +1535,11 @@ The public key is used on client computers to authenticate incoming connection r s - s + s Slow down thumbnail updates while demo is running - + Vertraag thumbnailupdates terwijl demo draait @@ -1551,67 +1554,67 @@ The public key is used on client computers to authenticate incoming connection r Give a demonstration by screen broadcasting - Geef een demonstratie door het uitzenden van het scherm + Geef een demonstratie door middel van schermuitzendingen In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - In deze modus wordt uw scherm in een venster op alle computers weergegeven. De gebruikers kunnen, indien nodig, overstappen naar andere vensters. + In deze modus wordt je scherm weergegeven in een venster op alle computers. De gebruikers kunnen naar behoefte naar andere vensters overschakelen. Demo - + Demo Share your screen or allow a user to share his screen with other users. - + Deel je scherm of laat een gebruiker zijn scherm delen met andere gebruikers. Full screen demo - + Demoweergave op volledig scherm Share your own screen in fullscreen mode - + Deel je eigen scherm in schermvullende modus In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + In deze modus wordt je scherm in volledig scherm weergegeven op alle computers terwijl de invoerapparaten van de gebruikers zijn vergrendeld. Share your own screen in a window - + Deel je eigen scherm in een venster Share selected user's screen in fullscreen mode - + Deel het scherm van geselecteerde gebruiker's op volledig scherm In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + In deze modus wordt het scherm van de geselecteerde gebruiker schermvullend weergegeven op alle computers terwijl de invoerapparaten van de gebruikers zijn vergrendeld. Share selected user's screen in a window - + Deel het scherm van geselecteerde gebruiker's in een venster In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + In deze modus wordt het scherm van de geselecteerde gebruiker weergegeven in een venster op alle computers. De gebruikers kunnen naar behoefte naar andere vensters overschakelen. Please select a user screen to share. - + Selecteer een gebruikersscherm om te delen. Please select only one user screen to share. - + Selecteer slechts een gebruikersscherm om te delen. All screens - + Alle schermen Screen %1 [%2] - + Scherm %1 [%2] @@ -1649,7 +1652,7 @@ The public key is used on client computers to authenticate incoming connection r Predefined websites - + Voorgedefinieerde websites Remove selected website @@ -1665,27 +1668,27 @@ The public key is used on client computers to authenticate incoming connection r Applications & websites - + Toepassingen & websites Predefined applications - + Voorgedefinieerde toepassingen Add new application - + Nieuwe toepassing toevoegen Remove selected application - + Verwijder geselecteerde toepassing Add new website - + Nieuwe website toevoegen New application - + Nieuwe toepassing @@ -1708,23 +1711,23 @@ The public key is used on client computers to authenticate incoming connection r Start application - + Start toepassing Click this button to start an application on all computers. - + Klik op deze knop om een toepassing op alle computers te starten. Start application "%1" - + Start toepassing "%1" Custom application - + Aangepaste toepassing Start apps and open websites in user sessions - + Start apps en open websites in gebruikerssessies @@ -1735,11 +1738,11 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + Room %1 Please complete all tasks within the next 5 minutes. - + Voltooi alle taken binnen de komende 5 minuten. Custom website @@ -1747,31 +1750,31 @@ The public key is used on client computers to authenticate incoming connection r Open file manager - + Open bestandsbeheer Start learning tool - + Leermiddel starten Play tutorial video - + Zelfstudievideo afspelen Handout - + Uitreiking Texts to read - + Te lezen teksten generic-student-user - + generieke-student-gebruiker Custom application - + Aangepaste toepassing @@ -1800,14 +1803,14 @@ The public key is used on client computers to authenticate incoming connection r FeatureControl Feature control - Kenmerkencontrole + Functiebeheer FileTransferConfigurationPage File transfer - + Bestandsoverdracht Directories @@ -1815,65 +1818,65 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Bestemmingsmap Default source directory - + Standaard bronmap Options - + Opties Remember last source directory - + Onthoud laatste bronmap Create destination directory if it does not exist - + Doelmap aanmaken als deze niet bestaat FileTransferController Could not open file "%1" for reading! Please check your permissions! - + Kon bestand "%1" niet openen om te lezen! Controleer uw rechten! FileTransferDialog File transfer - + Bestandsoverdracht Options - + Opties Transfer only - + Alleen overdracht Transfer and open file(s) with associated program - + Bestand(en) overdragen en openen met bijbehorend programma Transfer and open destination folder - + Doelmap overbrengen en openen Files - + Bestanden Start - + Start Overwrite existing files - + Bestaande bestanden overschrijven @@ -1887,7 +1890,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferPlugin File transfer - + Bestandsoverdracht Click this button to transfer files from your computer to all computers. @@ -1899,19 +1902,19 @@ The public key is used on client computers to authenticate incoming connection r Transfer files to remote computer - + Bestanden overzetten naar externe computer Received file "%1". - + Ontvangen bestand "%1". Could not receive file "%1" as it already exists. - + Kon bestand "%1" niet ontvangen omdat het al bestaat. Could not receive file "%1" as it could not be opened for writing! - + Kon bestand "%1" niet ontvangen omdat het niet geopend kon worden om te schrijven! @@ -2002,11 +2005,11 @@ The public key is used on client computers to authenticate incoming connection r Could not remove all log files. - Kon alle log bestanden niet verwijderen. + Kon niet alle logbestanden verwijderen. MB - MB + MB Rotate log files @@ -2018,19 +2021,19 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - + TLS configuration - + Use certificate authority for TLS connections - + CA certificate file - + ... @@ -2038,25 +2041,25 @@ The public key is used on client computers to authenticate incoming connection r Host certificate file - + Host private key file - + HeadlessVncServer Headless VNC server - + LdapBrowseDialog Browse LDAP - + @@ -2088,7 +2091,7 @@ The public key is used on client computers to authenticate incoming connection r Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + LDAP bind successful @@ -2106,7 +2109,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query the configured base DN. Please check the base DN parameter. %1 - + LDAP base DN test successful @@ -2116,7 +2119,7 @@ The public key is used on client computers to authenticate incoming connection r The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP naming context test failed @@ -2126,7 +2129,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + LDAP naming context test successful @@ -2176,7 +2179,7 @@ The public key is used on client computers to authenticate incoming connection r User login name attribute - + group members @@ -2200,23 +2203,23 @@ The public key is used on client computers to authenticate incoming connection r Computer display name attribute - + Invalid hostname - + You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Computer hostname attribute - + computer MAC addresses @@ -2228,15 +2231,15 @@ The public key is used on client computers to authenticate incoming connection r computer locations - + Computer location attribute - + Location name attribute - + users @@ -2256,7 +2259,7 @@ The public key is used on client computers to authenticate incoming connection r computer containers - + groups of user @@ -2268,7 +2271,7 @@ The public key is used on client computers to authenticate incoming connection r Could not find a user with the name "%1". Please check the username or the user tree parameter. - + groups of computer @@ -2280,27 +2283,27 @@ The public key is used on client computers to authenticate incoming connection r Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Hostname lookup failed - + Could not lookup hostname for IP address %1. Please check your DNS server settings. - + location entries - + Computer groups filter - + Computer locations identification - + Filter for computer groups @@ -2308,11 +2311,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + An empty or invalid value has been supplied for this test. - + LDAP %1 test failed @@ -2322,7 +2325,7 @@ The public key is used on client computers to authenticate incoming connection r Could not query any entries in configured %1. Please check the parameter "%2". %3 - + LDAP %1 test successful @@ -2334,21 +2337,21 @@ The public key is used on client computers to authenticate incoming connection r LDAP test failed - + Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + and - + LDAP test successful - + %1 %2 have been queried successfully: @@ -2380,7 +2383,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP directory - + @@ -2675,67 +2678,67 @@ The public key is used on client computers to authenticate incoming connection r Computer location attribute - + Computer display name attribute - + Location name attribute - + e.g. cn or displayName - + Computer locations identification - + Identify computer locations (e.g. rooms) via: - + Location attribute in computer objects - + List all entries of a location - + List all locations - + Enter computer display name - + Please enter a computer display name to query: - + Enter computer location name - + Please enter the name of a computer location (wildcards allowed): - + Enter location name - + Please enter the name of a location whose entries to query: - + Browse - + Test @@ -2743,43 +2746,43 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Computer hostname attribute - + Please enter a computer hostname to query: - + Enter hostname - + Please enter a computer hostname whose group memberships to query: - + User login name attribute - + Configured attribute for user login name or computer hostname (OpenLDAP) - + Directory name - + Query options - + Query nested user groups (supported by AD only) - + @@ -2790,7 +2793,7 @@ The public key is used on client computers to authenticate incoming connection r Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + @@ -2813,43 +2816,43 @@ The public key is used on client computers to authenticate incoming connection r Basic LDAP/AD support for Veyon - + %1 (load computers and locations from LDAP/AD) - + %1 (load users and groups from LDAP/AD) - + Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + No naming context attribute name given - falling back to configured value. - + Could not query base DN. Please check your LDAP configuration. - + Configuring %1 as base DN and disabling naming context queries. - + Test binding to an LDAP server - + The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + LDAP bind - + @@ -2860,27 +2863,27 @@ The public key is used on client computers to authenticate incoming connection r Custom PAM service for user authentication - + User authentication - + User sessions - + Minimum session lifetime before server start - + User login - + Login key sequence - + @@ -2894,7 +2897,7 @@ The public key is used on client computers to authenticate incoming connection r LocationDialog Select location - + enter search filter... @@ -3068,7 +3071,7 @@ The public key is used on client computers to authenticate incoming connection r Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Only show powered on computers @@ -3080,23 +3083,23 @@ The public key is used on client computers to authenticate incoming connection r &View - + &Standard - + &Advanced - + Use custom computer arrangement - + Locations && computers - + Authentication @@ -3104,19 +3107,19 @@ The public key is used on client computers to authenticate incoming connection r Adjust size of computer icons automatically - + Slideshow - + Spotlight - + Veyon Master - + Locations & computers @@ -3203,7 +3206,7 @@ The public key is used on client computers to authenticate incoming connection r Modes and features - + User and computer name @@ -3227,11 +3230,11 @@ The public key is used on client computers to authenticate incoming connection r Sort order - + Computer and user name - + Computer locations @@ -3239,47 +3242,47 @@ The public key is used on client computers to authenticate incoming connection r Show current location only - + Allow adding hidden locations manually - + Hide empty locations - + Show confirmation dialog for potentially unsafe actions - + Perform access control - + Automatically select current location - + Automatically open computer select panel - + Use modern user interface (experimental) - + Thumbnail spacing - + px - + Hide local session - + Auto @@ -3287,15 +3290,15 @@ The public key is used on client computers to authenticate incoming connection r Thumbnail aspect ratio - + Automatically adjust computer icon size - + Open feature windows on the same screen as the main window - + @@ -3310,14 +3313,14 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. - + NestedNetworkObjectDirectory All directories - + @@ -3335,14 +3338,14 @@ The public key is used on client computers to authenticate incoming connection r NetworkObjectDirectoryConfigurationPageTab Enabled - + NetworkObjectTreeModel Locations/Computers - + @@ -3353,15 +3356,15 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + Remember and add to website menu - + e.g. www.veyon.io - + Please enter the URL of the website to open: @@ -3369,22 +3372,22 @@ The public key is used on client computers to authenticate incoming connection r Name: - + Website name - + PluginsCommands List names of all installed plugins - + Show table with details of all installed plugins - + Name @@ -3392,23 +3395,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Version - + UID - + Plugin-related CLI operations - + Commands for managing plugins - + @@ -3455,7 +3458,7 @@ The public key is used on client computers to authenticate incoming connection r Power on a computer via Wake-on-LAN (WOL) - + MAC ADDRESS @@ -3463,11 +3466,11 @@ The public key is used on client computers to authenticate incoming connection r This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Please specify the command to display help for! - + Invalid MAC address specified! @@ -3475,7 +3478,7 @@ The public key is used on client computers to authenticate incoming connection r Commands for controlling power status of computers - + Power down now @@ -3487,7 +3490,7 @@ The public key is used on client computers to authenticate incoming connection r Power down after user confirmation - + Power down after timeout @@ -3495,25 +3498,25 @@ The public key is used on client computers to authenticate incoming connection r The computer was remotely requested to power down. Do you want to power down the computer now? - + The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + Do you really want to reboot <b>ALL</b> computers? - + Do you really want to power down <b>ALL</b> computers? - + Do you really want to power down the selected computers? - + @@ -3524,15 +3527,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + minutes - + seconds - + @@ -3574,7 +3577,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + @@ -3585,7 +3588,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + @@ -3652,11 +3655,11 @@ Please save your work and close all programs. Exit - + Connecting... - + @@ -3679,15 +3682,15 @@ Please save your work and close all programs. Lock input devices - + Unlock input devices - + To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + @@ -3706,7 +3709,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + @@ -3775,7 +3778,7 @@ Please save your work and close all programs. Do you really want to delete all selected screenshots? - + @@ -3839,7 +3842,7 @@ Please save your work and close all programs. Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Show notification on remote connection @@ -3847,27 +3850,27 @@ Typically this is required to support terminal servers. Show notification when an unauthorized access is blocked - + Maximum session count - + Network port numbers - + Veyon server - + Internal VNC server - + Feature manager - + Demo server @@ -3875,23 +3878,23 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + Session mode - + Local session mode (single server instance for primary local session) - + Active session mode (single server instance for active local or remote session) - + Multi session mode (distinct server instance for each local and remote desktop session) - + @@ -3910,11 +3913,11 @@ Typically this is required to support terminal servers. Unregistering service %1 - + Service control - + @@ -3964,7 +3967,7 @@ Typically this is required to support terminal servers. ShellCommandLinePlugin Run command file - + File "%1" does not exist! @@ -3972,69 +3975,69 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon Control - + Commands for shell functionalities - + SlideshowPanel Previous - + Start/pause - + Next - + Duration: - + SpotlightPanel Add selected computers - + Remove selected computers - + Update computers in realtime - + Spotlight - + Please select at least one computer to add. - + Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + StartAppDialog Start application - + Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" @@ -4042,19 +4045,19 @@ The second button removes the selected or last computer. Remember and add to application menu - + Application name - + Name: - + e.g. VLC - + @@ -4068,22 +4071,22 @@ The second button removes the selected or last computer. SystemUserGroupsPlugin User groups backend for system user groups - + Default (system user groups) - + TestingCommandLinePlugin Test internal Veyon components and functions - + Commands for testing internal components and functions of Veyon - + @@ -4094,7 +4097,7 @@ The second button removes the selected or last computer. Please enter your message which send to all selected users. - + @@ -4136,15 +4139,15 @@ The second button removes the selected or last computer. Enable multi monitor support - + Enable Desktop Duplication Engine on Windows 8 and newer - + Maximum CPU usage - + @@ -4162,11 +4165,11 @@ The second button removes the selected or last computer. UserLoginDialog User login - + Please enter a username and password for automatic login on all computers. - + Username @@ -4181,27 +4184,27 @@ The second button removes the selected or last computer. UserSessionControlPlugin Log in - + Click this button to log in a specific user on all computers. - + Log off - + Click this button to log off users from all computers. - + Confirm user logoff - + Do you really want to log off the selected users? - + User session control @@ -4209,7 +4212,7 @@ The second button removes the selected or last computer. Do you really want to log off <b>ALL</b> users? - + @@ -4248,39 +4251,39 @@ The second button removes the selected or last computer. No module specified or module not found - available modules are: - + Plugin not licensed - + INFO - + ERROR - + USAGE - + DESCRIPTION - + EXAMPLES - + WARNING - + Authentication test - + @@ -4301,7 +4304,7 @@ The second button removes the selected or last computer. WindowsPlatformConfigurationPage Windows - + General @@ -4313,47 +4316,47 @@ The second button removes the selected or last computer. Screen lock - + Hide taskbar - + Hide start menu - + Hide desktop - + User authentication - + Use alternative user authentication mechanism - + User login - + Input start delay - + Simulated key presses interval - + Confirm legal notice (message displayed before user logs in) - + Use input device interception driver - + @@ -4367,31 +4370,31 @@ The second button removes the selected or last computer. WindowsServiceControl The service "%1" is already installed. - + The service "%1" could not be installed. - + The service "%1" has been installed successfully. - + The service "%1" could not be uninstalled. - + The service "%1" has been uninstalled successfully. - + The start type of service "%1" could not be changed. - + Service "%1" could not be found. - + From 0e5a91900232e4a564308c7cf9d950e3c5b4b886 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Jun 2023 16:15:17 +0200 Subject: [PATCH 1501/1765] Windows: DesktopInputController: run in native thread With Qt 6 it looks like QThread already create windows or hooks in the newly created thread which makes SetThreadDesktop() return ERROR_BUSY. Therefore create a native Win32 thread to make SetThreadDesktop() succeed and faked key presses (used by the user logon feature) work again. Closes #890. --- .../windows/DesktopInputController.cpp | 36 +++++++++++++------ .../platform/windows/DesktopInputController.h | 10 +++--- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/plugins/platform/windows/DesktopInputController.cpp b/plugins/platform/windows/DesktopInputController.cpp index f2c55c5b0..8bce25f73 100644 --- a/plugins/platform/windows/DesktopInputController.cpp +++ b/plugins/platform/windows/DesktopInputController.cpp @@ -26,9 +26,6 @@ #include -#include -#include - #include "DesktopInputController.h" #include "VeyonCore.h" @@ -45,15 +42,23 @@ void keybd_uni_event( BYTE bVk, BYTE bScan, DWORD dwFlags, ULONG_PTR dwExtraInfo DesktopInputController::DesktopInputController( int keyEventInterval ) : m_keyEventInterval( static_cast( keyEventInterval ) ) { - start(); + m_threadHandle = CreateThread(nullptr, 0, [](LPVOID param) WINAPI -> DWORD { + return reinterpret_cast(param)->run(); + }, this, 0, nullptr); + + if (!m_threadHandle) + { + vCritical() << "could not create thread"; + } } DesktopInputController::~DesktopInputController() { - requestInterruption(); - wait( ThreadStopTimeout ); + m_requestStop = 1; + + WaitForSingleObject(m_threadHandle, ThreadStopTimeout); } @@ -102,17 +107,23 @@ void DesktopInputController::pressAndReleaseKey( QLatin1Char character ) -void DesktopInputController::run() +DWORD DesktopInputController::run() { auto desktop = OpenInputDesktop( 0, false, GENERIC_WRITE ); + if (!desktop) + { + const auto error = GetLastError(); + vCritical() << "failed to open input desktop:" << error; + return -1; + } - if( SetThreadDesktop( desktop ) ) + if (SetThreadDesktop(desktop)) { vncKeymap::ClearShiftKeys(); QMutex waitMutex; - while( isInterruptionRequested() == false ) + while (m_requestStop == 0) { waitMutex.lock(); m_inputWaitCondition.wait( &waitMutex, ThreadSleepInterval ); @@ -130,8 +141,11 @@ void DesktopInputController::run() } else { - vCritical() << GetLastError(); + const auto error = GetLastError(); + vCritical() << "failed to set thread desktop:" << error; } - CloseDesktop( desktop ); + CloseDesktop(desktop); + + return 0; } diff --git a/plugins/platform/windows/DesktopInputController.h b/plugins/platform/windows/DesktopInputController.h index 078ca05f1..4f9831189 100644 --- a/plugins/platform/windows/DesktopInputController.h +++ b/plugins/platform/windows/DesktopInputController.h @@ -26,12 +26,11 @@ #include #include -#include #include // clazy:excludeall=copyable-polymorphic -class DesktopInputController : public QThread +class DesktopInputController : public QObject { Q_OBJECT public: @@ -48,16 +47,17 @@ class DesktopInputController : public QThread void pressAndReleaseKey( QChar character ); void pressAndReleaseKey( QLatin1Char character ); -protected: - void run() override; - private: + DWORD run(); + static constexpr int ThreadStopTimeout = 3000; static constexpr int ThreadSleepInterval = 100; + HANDLE m_threadHandle = 0; QMutex m_dataMutex; QQueue > m_keys; QWaitCondition m_inputWaitCondition; + QAtomicInt m_requestStop; unsigned long m_keyEventInterval; From 441e642183b3b7567f6600230bd8ceeb6bc3318d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Jun 2023 16:20:56 +0200 Subject: [PATCH 1502/1765] 3rdparty: ultravnc: update submodule (1.4.3.0) --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 8b99d4556..7a3eaf96b 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 8b99d4556d1fb2ea82eca80b80dc21d41a6e26ed +Subproject commit 7a3eaf96ba04ef32aac577f744026313f199368a From bc82cd1e6549989e7ea237b31489805e323bc0fd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Jun 2023 16:23:58 +0200 Subject: [PATCH 1503/1765] 3rdparty: x11vnc: update submodule --- 3rdparty/x11vnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/x11vnc b/3rdparty/x11vnc index 4e18eee54..2ecb981c9 160000 --- a/3rdparty/x11vnc +++ b/3rdparty/x11vnc @@ -1 +1 @@ -Subproject commit 4e18eee54766e53d51edf459b04ec587e506d679 +Subproject commit 2ecb981c9468b83e4fe3e6cedee2a917155e295d From 1845127ca7b8bbe46754723190b4cf4e945ddaab Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Jun 2023 16:39:33 +0200 Subject: [PATCH 1504/1765] CI: add Debian 12 Even though Qt 6 is available in Debian 12, we can't use it since QCA for Qt 6 has not been packaged. --- .ci/linux.debian.bookworm/Dockerfile | 23 +++++++++++++++++++++++ .ci/linux.debian.bookworm/script.sh | 27 +++++++++++++++++++++++++++ .ci/linux.debian.bullseye/script.sh | 19 ------------------- .github/workflows/build.yml | 2 +- .gitlab-ci.yml | 3 ++- 5 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 .ci/linux.debian.bookworm/Dockerfile create mode 100755 .ci/linux.debian.bookworm/script.sh diff --git a/.ci/linux.debian.bookworm/Dockerfile b/.ci/linux.debian.bookworm/Dockerfile new file mode 100644 index 000000000..8767dd192 --- /dev/null +++ b/.ci/linux.debian.bookworm/Dockerfile @@ -0,0 +1,23 @@ +FROM debian:bookworm +MAINTAINER Tobias Junghans + +RUN \ + apt-get update && \ + apt-get install --no-install-recommends -y \ + dpkg-dev \ + ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + xorg-dev \ + libfakekey-dev \ + libpng-dev libjpeg-dev zlib1g-dev liblzo2-dev \ + libvncserver-dev \ + libssl-dev \ + libpam0g-dev \ + libproc2-dev \ + libldap2-dev \ + libsasl2-dev \ + libqca-qt5-2-dev libqca-qt5-2-plugins \ + libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.debian.bookworm/script.sh b/.ci/linux.debian.bookworm/script.sh new file mode 100755 index 000000000..6feb839a6 --- /dev/null +++ b/.ci/linux.debian.bookworm/script.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +set -e + +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.bookworm" + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-deb.sh $1 $2 + +if [ -z "$3" ] ; then + +# generate source tarball +cd $1 +VERSION=$(git describe --tags --abbrev=0 | sed -e 's/^v//g') +cp $2/CONTRIBUTORS . + +$1/.ci/common/strip-kldap-sources.sh +$1/.ci/common/strip-libvncserver-sources.sh +$1/.ci/common/strip-ultravnc-sources.sh +$1/.ci/common/strip-x11vnc-sources.sh + +cd .. +tar --transform "s,^veyon,veyon-$VERSION," --exclude=".git" --exclude="*.deb" -cjf $2/veyon-$VERSION-src.tar.bz2 veyon + +mv -v $2/*.tar.bz2 $1 + +fi diff --git a/.ci/linux.debian.bullseye/script.sh b/.ci/linux.debian.bullseye/script.sh index 538026d97..c8daee8f4 100755 --- a/.ci/linux.debian.bullseye/script.sh +++ b/.ci/linux.debian.bullseye/script.sh @@ -6,22 +6,3 @@ export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.bullseye" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 - -if [ -z "$3" ] ; then - -# generate source tarball -cd $1 -VERSION=$(git describe --tags --abbrev=0 | sed -e 's/^v//g') -cp $2/CONTRIBUTORS . - -$1/.ci/common/strip-kldap-sources.sh -$1/.ci/common/strip-libvncserver-sources.sh -$1/.ci/common/strip-ultravnc-sources.sh -$1/.ci/common/strip-x11vnc-sources.sh - -cd .. -tar --transform "s,^veyon,veyon-$VERSION," --exclude=".git" --exclude="*.deb" -cjf $2/veyon-$VERSION-src.tar.bz2 veyon - -mv -v $2/*.tar.bz2 $1 - -fi diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f3fad6a88..96e2ce178 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,7 +5,7 @@ jobs: strategy: matrix: dist: - - debian.buster + - debian.bookworm - fedora.36 - opensuse.tumbleweed - ubuntu.focal diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 463122caa..29395145b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,6 +13,7 @@ build-linux: - centos.7.9 - debian.buster - debian.bullseye + - debian.bookworm - fedora.36 - fedora.37 - opensuse.15.4 @@ -38,7 +39,7 @@ build-windows: collect-artifacts: stage: collect - image: veyon/ci.linux.debian.buster:latest + image: veyon/ci.linux.debian.bookworm:latest dependencies: [ build-linux ] only: [ tags ] script: From 482c41ece01e1067390102921e35dc503eb7d2d9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 Jun 2023 16:55:08 +0200 Subject: [PATCH 1505/1765] LinuxServerProcess: fix build with libproc2 --- plugins/platform/linux/LinuxServerProcess.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index ef11d819b..39f5592e1 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -25,7 +25,9 @@ #include #include +#ifdef HAVE_LIBPROCPS #include +#endif #include #include #include From 3ae0c4085aca0cf18c7fe4b974e816e306eceefe Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Jul 2023 09:34:41 +0200 Subject: [PATCH 1506/1765] Windows: DesktopInputController: use std::thread It's simpler and causes less troubles with executing lambdas. --- .../platform/windows/DesktopInputController.cpp | 16 +++------------- .../platform/windows/DesktopInputController.h | 7 +++++-- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/plugins/platform/windows/DesktopInputController.cpp b/plugins/platform/windows/DesktopInputController.cpp index 8bce25f73..5d264b15a 100644 --- a/plugins/platform/windows/DesktopInputController.cpp +++ b/plugins/platform/windows/DesktopInputController.cpp @@ -42,14 +42,6 @@ void keybd_uni_event( BYTE bVk, BYTE bScan, DWORD dwFlags, ULONG_PTR dwExtraInfo DesktopInputController::DesktopInputController( int keyEventInterval ) : m_keyEventInterval( static_cast( keyEventInterval ) ) { - m_threadHandle = CreateThread(nullptr, 0, [](LPVOID param) WINAPI -> DWORD { - return reinterpret_cast(param)->run(); - }, this, 0, nullptr); - - if (!m_threadHandle) - { - vCritical() << "could not create thread"; - } } @@ -58,7 +50,7 @@ DesktopInputController::~DesktopInputController() { m_requestStop = 1; - WaitForSingleObject(m_threadHandle, ThreadStopTimeout); + m_thread.join(); } @@ -107,14 +99,14 @@ void DesktopInputController::pressAndReleaseKey( QLatin1Char character ) -DWORD DesktopInputController::run() +void DesktopInputController::run() { auto desktop = OpenInputDesktop( 0, false, GENERIC_WRITE ); if (!desktop) { const auto error = GetLastError(); vCritical() << "failed to open input desktop:" << error; - return -1; + return; } if (SetThreadDesktop(desktop)) @@ -146,6 +138,4 @@ DWORD DesktopInputController::run() } CloseDesktop(desktop); - - return 0; } diff --git a/plugins/platform/windows/DesktopInputController.h b/plugins/platform/windows/DesktopInputController.h index 4f9831189..0e454feec 100644 --- a/plugins/platform/windows/DesktopInputController.h +++ b/plugins/platform/windows/DesktopInputController.h @@ -24,6 +24,8 @@ #pragma once +#include + #include #include #include @@ -48,9 +50,8 @@ class DesktopInputController : public QObject void pressAndReleaseKey( QLatin1Char character ); private: - DWORD run(); + void run(); - static constexpr int ThreadStopTimeout = 3000; static constexpr int ThreadSleepInterval = 100; HANDLE m_threadHandle = 0; @@ -61,4 +62,6 @@ class DesktopInputController : public QObject unsigned long m_keyEventInterval; + std::thread m_thread = std::thread([this](){ run(); }); + }; From a608417ba409e8585310b86d34d91606ff161bf5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Jul 2023 09:35:58 +0200 Subject: [PATCH 1507/1765] CMake: ignore dllimport/export attribute warnings Otherwise GCC 12 shows warnings when building with Qt 6.5. --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 965f52e04..c44807d7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,8 @@ if(WIN32) set(VEYON_WINDOWS_ARCH "win32") endif() add_definitions(-DUNICODE -D_UNICODE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-attributes") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-attributes") endif() if(APPLE) set(VEYON_BUILD_APPLE 1) From 1578e015a440a28bb033d80e1ff04d7273bde94b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Jul 2023 09:49:13 +0200 Subject: [PATCH 1508/1765] CMake: CPackDefinitions: add deps for Qt 6 RPMs --- cmake/CPackDefinitions.cmake | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmake/CPackDefinitions.cmake b/cmake/CPackDefinitions.cmake index 261d39055..d9c11b3e8 100644 --- a/cmake/CPackDefinitions.cmake +++ b/cmake/CPackDefinitions.cmake @@ -70,7 +70,11 @@ if(OS_OPENSUSE) set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "libqca-qt5-plugins, libqt5-qtquickcontrols2") endif() else() - set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "qca-qt5-ossl, qt5-qtquickcontrols2") + if(WITH_QT6) + set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "qca-qt6-ossl, qt6-qtdeclarative") + else() + set(CPACK_RPM_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES} "qca-qt5-ossl, qt5-qtquickcontrols2") + endif() endif() set(CPACK_RPM_PACKAGE_LICENSE "GPLv2") set(CPACK_RPM_PACKAGE_DESCRIPTION ${CPACK_DEBIAN_PACKAGE_DESCRIPTION}) From 99543b32dd68e57eb50c553f3cd982cdde58dedd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Jul 2023 09:53:35 +0200 Subject: [PATCH 1509/1765] CI: drop Ubuntu 18.04 Ubuntu 18.04 is EOL as of 2023-06. --- .ci/linux.ubuntu.bionic/Dockerfile | 25 ------------------------- .ci/linux.ubuntu.bionic/script.sh | 8 -------- .gitlab-ci.yml | 1 - 3 files changed, 34 deletions(-) delete mode 100644 .ci/linux.ubuntu.bionic/Dockerfile delete mode 100755 .ci/linux.ubuntu.bionic/script.sh diff --git a/.ci/linux.ubuntu.bionic/Dockerfile b/.ci/linux.ubuntu.bionic/Dockerfile deleted file mode 100644 index c085b9672..000000000 --- a/.ci/linux.ubuntu.bionic/Dockerfile +++ /dev/null @@ -1,25 +0,0 @@ -FROM ubuntu:bionic -MAINTAINER Tobias Junghans - -RUN \ - apt-get update && \ - DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ - dpkg-dev \ - ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ - xorg-dev \ - libfakekey-dev \ - libjpeg-dev \ - zlib1g-dev \ - libssl-dev \ - libpam0g-dev \ - libprocps-dev \ - libldap2-dev \ - libsasl2-dev \ - libpng-dev \ - liblzo2-dev \ - libqca-qt5-2-dev libqca-qt5-2-plugins \ - libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ - && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.ubuntu.bionic/script.sh b/.ci/linux.ubuntu.bionic/script.sh deleted file mode 100755 index 1a6dd707f..000000000 --- a/.ci/linux.ubuntu.bionic/script.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.bionic" - -$1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 29395145b..b1cfef429 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,7 +18,6 @@ build-linux: - fedora.37 - opensuse.15.4 - opensuse.tumbleweed - - ubuntu.bionic - ubuntu.focal - ubuntu.jammy artifacts: From 93f8d47aa2214df255c3eb88d91e02e95c436f51 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Jul 2023 11:49:05 +0200 Subject: [PATCH 1510/1765] CI: drop Fedora 36 and add Fedora 38 Fedora 36 is EOL as of 2023-05-16. --- .ci/{linux.fedora.36 => linux.fedora.38}/Dockerfile | 8 ++++---- .ci/{linux.fedora.36 => linux.fedora.38}/script.sh | 2 +- .github/workflows/build.yml | 2 +- .gitlab-ci.yml | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename .ci/{linux.fedora.36 => linux.fedora.38}/Dockerfile (70%) rename .ci/{linux.fedora.36 => linux.fedora.38}/script.sh (57%) diff --git a/.ci/linux.fedora.36/Dockerfile b/.ci/linux.fedora.38/Dockerfile similarity index 70% rename from .ci/linux.fedora.36/Dockerfile rename to .ci/linux.fedora.38/Dockerfile index a33c0c0fb..aaef320b2 100644 --- a/.ci/linux.fedora.36/Dockerfile +++ b/.ci/linux.fedora.38/Dockerfile @@ -1,11 +1,11 @@ -FROM fedora:36 +FROM fedora:38 MAINTAINER Tobias Junghans RUN \ - dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-36.noarch.rpm && \ + dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-38.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ - qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ + qt6-qtbase-devel qt6-qtbase-private-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ @@ -13,7 +13,7 @@ RUN \ openssl-devel \ pam-devel \ procps-devel \ - qca-qt5-devel qca-qt5-ossl \ + qca-qt6-devel qca-qt6-ossl \ ffmpeg-devel \ cyrus-sasl-devel \ openldap-devel diff --git a/.ci/linux.fedora.36/script.sh b/.ci/linux.fedora.38/script.sh similarity index 57% rename from .ci/linux.fedora.36/script.sh rename to .ci/linux.fedora.38/script.sh index 237db06b7..9d18880ab 100755 --- a/.ci/linux.fedora.36/script.sh +++ b/.ci/linux.fedora.38/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.36" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=fedora.38" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 96e2ce178..3141515a4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ jobs: matrix: dist: - debian.bookworm - - fedora.36 + - fedora.38 - opensuse.tumbleweed - ubuntu.focal runs-on: ubuntu-latest diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b1cfef429..3c158d2d9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,8 +14,8 @@ build-linux: - debian.buster - debian.bullseye - debian.bookworm - - fedora.36 - fedora.37 + - fedora.38 - opensuse.15.4 - opensuse.tumbleweed - ubuntu.focal From 582b5c5c908f83428f7f3c2310247e0e14b546e6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Jul 2023 11:49:57 +0200 Subject: [PATCH 1511/1765] CMake: WindowsInstaller: don't copy Qt6OpenGL.dll It doesn't exist any longer with Qt 6.5. --- cmake/modules/WindowsInstaller.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/modules/WindowsInstaller.cmake b/cmake/modules/WindowsInstaller.cmake index 78ac11334..28457dc60 100644 --- a/cmake/modules/WindowsInstaller.cmake +++ b/cmake/modules/WindowsInstaller.cmake @@ -48,7 +48,6 @@ add_custom_target(windows-binaries ${DLLDIR}/Qt6Widgets.dll ${DLLDIR}/Qt6Network.dll ${DLLDIR}/Qt6Concurrent.dll - ${DLLDIR}/Qt6OpenGL.dll ${DLLDIR}/Qt6Qml.dll ${DLLDIR}/Qt6QmlModels.dll ${DLLDIR}/Qt6Quick.dll From 13ad4baf1aeb3c4a362f88750e39454a4972af05 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 5 Jul 2023 11:50:00 +0200 Subject: [PATCH 1512/1765] 3rdparty: ddengine: update to 1.4.3.0 --- 3rdparty/ddengine/ddengine.dll | Bin 253280 -> 259016 bytes 3rdparty/ddengine/ddengine64.dll | Bin 330080 -> 336328 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/3rdparty/ddengine/ddengine.dll b/3rdparty/ddengine/ddengine.dll index 9c6a9ddaa96a9cfd216364dc7619e73c1ec5c481..ab7a5295077e7e76ceb5e8997022a7096d0d6d91 100644 GIT binary patch delta 86071 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 W`hAbu8_(Ay$1!Hrm*ECD$^QUn-%RrW delta 80125 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 diff --git a/3rdparty/ddengine/ddengine64.dll b/3rdparty/ddengine/ddengine64.dll index 52e6af0726a1316766a32388b23a693fe5ded6e3..4882e9834f3c04611e4511e3aa37b93e33827bab 100644 GIT binary patch delta 128420 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 G@P7b=RrH?# delta 122233 zcmZsE2Ut|c_x8?(mCmBDfYe1mu%IXw6crHAC4ypX#ERWSV=NGRKoNDlu5Hv&V?m9v z#zqu1iK3|3YhsBeVoc&C*b`e+_IqdUvii&a+vkxxGw(T5&di)Sb7t=KWT{vAVy}g5 z*siyB_KOk{a*Y{%Ub{AFzPb9};2ur3Xb>OVqs10`@r>S*hiCtf)Oi1oqPL6`@g`e> z1>S56!PB)#v&}2<{3f%_78mhszQs*EPj6PAEk*ppj|Y$7Wogu315HMXMl)oVgQh(9 z-~el)=CP)Z!9{ZS(A2lnXl@aaJTr$jB@s>uT8+kDqe2Gf6-oZEEdm)_L?kzJfpRmY*&rO!_HnaW>JX0cOC*7HDjRoCD>^)>=%XjQ4h(n z#qxS6*8{1%d=S3>GiWqfjm8Zbm_1OV`L#2$0H-Dc&qlPf6LTl55CXo-mZN*_vo?!5B65gKmSH$u#XbGhu|$G{Io* zJW+9kWQ_84qbWHo!D!aHJwk;{c1F|qSo|{@&7B+%a-mxE8^CBwHjU3hI1~R8@Gk@Z zkm2|-33J9r8|5>~qd=bN8Kq^A`aB$f!~j0LBBjTiET$SWz+G||y0C!t;) z3~8pELSsRRZsrS!&}i;a2+?$` z`7uVw0T299diCcOhImp=mL)hMMN^jG${&yw`-`q~s4K~x=_!YBX;(w~*dd(yId*Zn zjQ*dA(%aH;j?KwebhBfB?*>&Ci&0MBWh^+A9VM4N)*VT7%zsG(oVq0Kf_&B1Ud0eT z(P0Ehlz%nK9end9Mr(4ybiv7}jWf!$=zjo#rF8o1lZfSxuBOSpL#H|Ql@jaIn@)8l zQy*&Q+<-q^TCQ!RuP4w9*C@xGe{jjJXi!w( z8cU=Lz35@L(UQ;aw6VM2(BZv={L)O(5Mi{@oL;V+{6OUEAfHqoBxp1zQce=1oKg<_ z;z3oi>59@#Eu0gb6h!+$l&+w^N=~Fa)+ojA@XZNyhkIadlNwx#>6?}7Ne~y$DF3Cs zF6AWTtyM-LkGyG*H90{>xrc(B$`$jwYIL@u*}nmK$$QA6dK#ZIGq)s)Wns%sq5mDj3NE%ZGdz=IgN zHNUaf*px$FD^0eOQBHNNkT4WV&%TQ)>cV}w!*%~z` zzZ}v{GfkN|CqECNWYd%}C-U>qXT)gMFS!9lV|H7Ohebajm>PV0hOEQvNi(M`H=4Ud zDsx{VB2QbMBA>wAJ_+F~!zuGkqJQ{KCBx~U+QS^?T({Hc=1ry-YS;Em@Z*YW_G1(T zcB4ff>_@-%Ye!r8xk>FiQKR2Dsef&xWKa+Ph|nKKK=s5N_9*`oDNq7g}WSoDGZcAAu! zQz8=1@sjm+`9S|sOG}4NITT+*+v@CF# zR5p}04q7dhbfD*hq9wnMi-SAlUdG5Ja~b0EQR(oBs7_kA|}cdXy85` zd{+F_90|}Kj+nsf8VT@>arnX_+B0GXq4R;gdWOG$)dLG08hQDj6^atm*ZT zjx-O&_>NXD(k>{+Us)_lGH8tjmTY%1WBFJ(m`t-m0;P_ZX>LfAS5_@M&GS-{?RIdY z5Yq*vcQP#rsU127`QFI3Z(33rlxB7-xWv1tB<6C=DT_W9Jeaa$=$nwhSV5QLn`YLg zf+ptj0Xt1F`ZUZ+)3ijLV|-D@92z6UZPB~cqFw9w(iauvG0Jen9C{VM0=z80}Sy*o{uTX z$QS3OTyoKUgc_o8VSycuy!r*Fa)M$mqxQp)jrjwV{Z?n?kxzmxJB+vAlpSV3cO{y; zf}k(Yw1BqtMnH~<0mY(%1dJ>*Mf-CDunzEE#Mrf6on`kWb z-Y#`b&amibdC-iA5Wm4_GJ5%!ydO$HrpayrMfeYd*6l2nBj&nT&Oq&Wa64x$HAFTI z{7jx*$m?TXu$ezh2bSYuntl;~6?Zx*a+DO+mfnl(FD1629qWbCG4%qa;l1gCda3$^ zHk@JnM9eJc=DK;XU7NQldQdNdNQP6?yTLT6l`CD^pl40uDlDs+Te+gZG+adAG{}r^p{gkx|=;c7#Qrqop?*Wk`ct6g6mkUXrf(6}@g^Po#6TDT(oucGsqXF)fKw z)FXxvvW)g>_Pun#hw7Uz&Mo6BiQLtQNtR&IH?D$J47&_%ocRrqG`VvI282=WoB&yw zz7Jc7w#8V=VAVQ^CQl8EHBAkRPBRS&%R(SB4MQjs0oaOD!ywr6g!gmj1fzV#qQCT3 z(#W&8c;q!aqh$H(`b+T4e<|q-V0a^8^oTV1i>yTXoKn%47ymd}zLrw(dv@Pp3u#u1 zASqnxMe)zp$k^ploHrCnaMQEV%+k&cK>59-p%y7HuS z!8j~SaqvY!uxOx!T`dy565Ar?^}oE;vQYS3ty}aJBBfLH^u4S`F~0QK+=lXRsCH~< zL+aByNE+UNwrt%=+Sh>2Y@I7LZ$PziQ>6X%>5RBht`9xbW;U&_(J<0h@-FgdQ&W`fGgqT;ufnZre)jHHq>|-M*(> zE`dtrDQ=6qEkQC*&?={eNCNYbpw6_g#Qk3(1LX)Bf+>h$WY~;&ni&CgjcAOm1+-BU zU2rZsNx!=Y!v|(_vXbkFDr0VDTS^7Fd<7YB;a5H9966Vb`EC7BkS3@0fiWmo`7Mmg z^`tVZ6tyyGEl2G!ye=f`_MJ%3?fXgTa*S7Yo@kIU=B%;+JJ zH15 zonR0G?~Q_N0evFG= zi29~YB4YJ-dsd>hI7Epn6D|JTnxIwu`2Md&%42!@LwY^@{zH@6#q^V}pwOCK5orFA0ayh|(ce)6|O z8>QBf`uP-gH<;AxrU$Yu8x&p?-w=m>csdJe6q-)Rx~hJN2El$dCF zrvPb=J+120!g-Z&XtXoRCxqT}=|7-UiNy+ZR_RR#q*3xY{W~p`d`NxL8+pXrNt$%| zSgQO}Dr(Tgj`m28_Ui;!NhJ)CtI9L!efXY4*QPfJdDw(+2}|Hx;zKW?N4H)^`95Z1 z9)^Zd)|R%SmFeB2(GO`tXCJp|@JWgNu37unLpr2$v*xjIujxD-&<4N9)iVEEmzx9= zCH*niF0!8(;XJzmefpIukD?_F4e8=3oqa&ptn_obZXsMC2Od#vm&VdWk?1*7O&t1& zXUQ|4@`w)Z5*uAJ)~Xj^8>PxGA$s)e*7IqEOf91nV?Lc_T8GS*~F;cMpp;$_XA8y}5!8 z{4kKzrMVxrBEIy%hsnB*+#QyGENei2sMsA1scW~44`RQa)aEX7q$Zl=wge$`&}-JmvGsMz;%nh{au>ZBi!EwajcqH zj@+@|{Y}zT+8guh!t(IDOG|o0NKbyF6+MEYb_2BOFOhSc%o6GPTs?Pd?^i8YO~zB1Y#d66%CVZ3EGMJxVN z_{dUqMV)ZoS=xKO_&`0H?FsnH_uwub0$y%~p>4Hk3a#o{FUVAmd3Y3saeY#8yMdUG zJPhw^PB~5K72Kv73buL@qGggMKh+(4j8X9fmC0#n(f7C`XW>Gi*H-AN8M}I{(MJo?0fXPidXMr>$fzr|Es-;j}gP324sX zun>~r58PQqmH7aV)|>JaOe*EzI8p;hpDTG73xM?_w6EexlQH1!9k5~ ztHRq?*Csrh;A-8bC;J9Tlj~BYZ(FJ8R~peTQfiV;yY@R8cn(9Pm1DNAF~7tEQ*{mI zpfT=f&V97F>2F2R{XZtT5zw7*$ll-uoCHlvu1jUi!udQYMteH~QZnnKMe-TgoX^wk z!7xTekEp1h4J{Ywhbp>3MO|&^X@NFV(E^U-2sBScFRAFy zHZ)qGgH*IgMSrxRegaKa(WNSS)rQ)q=W=1zRpALLe9;C!Oyj7dihiV`r)}tUf&O(( z$RkcgkJ-?p0zIpufhu~)hHe+=j%yM&Br#e`xM*>S4PGYTg(~wM6+LQ0^8`9hMN3um zUBRCSw7ZIKRMB?@cNb_26`dV!FE&K`ZCSSyu&)Y#tTJ!4p^*ap_o`@dCl%dpLu(22 zmWoEH=nfnD20Lbp{*a35RCLz^-hMFx{uFSb3O@-G^4Mczz9`TcDtbjl-xYjNphHx2 zuZq4a_$z^SP*J9$DA-zV?tB49s_-Nge%IoO0(Dl=J}UZ^jd_qj@Bbv^(N;yj=BP<4 z90c+ita&OLtfGZB-WGy)SFQ>Z6<%+H4FX=QqIW}uJXYCIXMtv`=y4TYW<&q^fQ!1P zif&TTg*Nn8fySz+DOZJO*x-`__EX`JDw=IW_XzaOkD|rt95rdbMw(b8u% zW$jRvW zedR?--6&h7A!|QY^Z8KCN4Dl;OK+{FkN**RLoI+0iPdTWLA(Hnwp6jCX~^s|(bt*nDe& zCji=7I7!9EseIe4e6scAl~u zVY=X%;0Ax3+rS{&{NqOMKlurZ-jiF9QT}x7$B|N~Lcjd@TJD_`cx!Y8--5hMdkGQl z_)y*;ab`(&7sV4UOJy9)F=Y|A`po*37<8!PNIaC@BG;UH$_ka-0Q>_L_vHB1+VHMx zry^5$jWsxNn2RkNHs}d6ExLj}a7!tf^vNgnf(~LFC0Z_7wDmwLJTDdgKo4+lvJygL zM+QhQlWEV9K@G1bW0&+L-0%r=U(UgPHoxsTq)0i<68BWJ&-tbBA^hC^M?qE)P%RNonRw`Szdo^Iux41wHM}-GjU@-Cwoy?g8`{3wGFObOB zz-!U}eZJ`KsJ4V0qamZmO9|)bve7*y4xu4aIsr-|m=W=*jEv0w3*seGz z6-ceTzY7~NYz0J?-2f?v6jCy#wsi0e4H#p{b=C7>kJ9@%i_&2M zy9Fd*o*|ElFYAEa5B-bAYL#ccoYb0i%qitbm>RFhL;yk_7 zXv+{+COe|b_Woh3w3m_$X0)J&6Eb@B2R$;zCv6@mHS!Hz!7lLTzaqNXI}uQJtJ~$s zf}1&EsN86tUlb~aI`PVW&f|e1o;@D&n1~(fIByy@wz=dPPy3AZ>+S%Gr#cVp&~!Dm zl8DrFbH?+8_Q!UZ3PNBBeM%3&2ZUO3PY@*HnCDa9v4z8S*j0MUPX365P4a4&rfH`yGFnv<-Q4L5Z_YlQtS@ zW!f4@;>DI}H3;!RP^NXZhW0~T8so?ku303`T83jPB)v5J9Lw0bkPHl}N_hiT?MRV*>h%$~Bio{6N@h@H~niFYl&SV~! zwO9DVq)l$aTTmZ=)fR*yq_&`uHB?UJByv4ix|Kqs!5`b`Azq-k3td468 z4ct%T&e~a*#W>&a-0Cb-2Ht>2>>a*`cYs-6`m!2NAn{InxkACDZWNi3jBDnh{42Z!oxqRVRO1cjVB+a2S0C> zyv~F7RNpY8@x?`S)m$FM?CDnu(ZA)R(GoryoEQ#fw+Dz<+`lbk@C0F16}DVQ<0tq! zrFTX`e)zd|G;2bL^!+NDKOw|5`WH@|{umWILU&E@mF69xrzgZq-HuR~iP6%ETeR&& zgVgc}9WXK2?O_S(4k;yA^fybWJh5qQR?NlFb|D^>wT!YI)&_3kIF{0@6GJmbs_2ma zpl7)V@=G0!aks}+@TTG1A18Oh`{%*Ef4;o`Jz_AGCb_F?D~`>yAG_18lR8Ub?sVOx z*53Uv2ov*9l4O(iLj)@wl4Wgb8~S8YRBb;F=?>oY8b78?Yj#s}DAUe%qb(;lZPW`1 z`6nIAv>g!O2i_R|2qio(Gh}<_pEQ(dqY&i^(WGtQM%m;L>HY`w;N(R2JFd`Z8ckld zhwSzsjyg?|+u5HJqaoypIvNs`+gJE#fs8U0<*dN8RxDE~!a+LN8AlD2*-Q zBiAYKvgozctF*_|!?pH1i^D8vt?0xTkL|RZooU@^BAq2mVDt)NNu_+cTC_sSikCc?p&A8JAKTf>hYR-fws*XA~kTJ8}gb; zFKW zOs4npdz0C;{mi-~i+()w1sOpH76eN}_R$#y@lvPrw6vhHH2FOJr(izmN%LpbtM&36 z&T&mOQca^{F;vW2!+CmW)^6#ib9C%%e@S^w=g*!(8c^psX}W5jQqMhfp{bih_Rv2}pGgaM)1Gs~hJUh~Pb0A=Whj3n@ndAWX_KHO zcQ?Q^!=n2ste(fZ-GM6*&k2DF+6gI}w2L_`Yh^1{+-&Vc1S@0mhlE8!_Sz0ODB(9) zU@ghoehuiIxt?(uDsgr>7?Z7GH-uw(IR97%+@BakvC7mR#2{L6NA12?rPndqSPmmO zw7a}Wvh1Yyb4AiW)eJQnHoGpdTqmvg0NZwEB z^2HxW(iZyr;x3W9H^Z@CX34piUhq7-W~#aK`Hl9W zO=`LB6>_X6?gOSrD#~|s4Q(VPl+g1uNQyjC^pH9b$>%VAu_Q=}I81$(o~=FY3V7s~ zM$^o&&3q(5w|#&*)jCAqEDe-iAEN%t3Z&$Xbp5gj&kMUn{`bXIy|l1MW$XT;Tgz$@ z>G=lwnDv%cZlGz)drR#$6m4FfL2?Us2=X5;^KQij(y4oe+DOOAy^3s5k(0_GAUI~% z*ZGdm==410txDj0MX=^6i7Km}s07QETPi_?n!|F%U?nKW97hhjl<#)b5~ZJ1DRwEA zZ;5&^=ZO30IGFQ791UH4kRDkXCe8Mz_g2RA`E37BWWy>Ec#Bi+*cqs zi$00RMYqZUCzZM)gT63POxmXWL`+yDaFMN|(W?SICkTmi8zBl!IExi?70p@|*s-H6 z{p}v!i6}@kNu*@J_(2<^2HKA!~Tk zttv8scY=J0Umj@&W?U{s%n&WVzBigb_97k&dOyR(tsgggY|`kLVQ zET}At{_;xHQ1o^}F^``X@yEO#ebeN!n9K4x+$@4LE&2g~cy+T;UAsT&wl)4z&}w>e zO_<~%O7c@+W22-47pp7s*)CC$@)f)yEw}*-*kps_IjmOMxJ9&K=(%dvP?dFwV5NC$ z9h$VY@%_CMe8Tt^7Gs7*pNguX#!fJ`Gpya&LFGKZ*1`4Bh3Z^4?xc6t8X67uMpw0f z`7e%uFF*?DiOL9ze$R3t4Sv%HS$F4VR@n;LxG=0%S0HCAwjCGV5m><$yXeruFz+cV zM8Vi0C5KH!$(a~P1D4aZg@LY))>5ODLp$in!jQ1>dX&oFTH!`CKYK>O_fYXlSAKDa z$DS;wZtH5-T!XUS8<=HG^ndy~hlDYoZV7=L2KTl6at~`9wVQZP2}2AR3I99su!vR(-VLB#tWAcdDfVcF@bx3=l8zvEwv5~nBPV!ZO}_v zMr&_K>FKR}tR!{DPFKVwx$T*hHb8d3WicuR_TqI_s;Lu%Z$hL7=h^yGamu z-WB(qg-SZ395||)agVkN6 zwT(L;?SwU<^unFRh1~8mdnFi;{D#XMIO;|h>yA;~wuoGB74`&FqZ+!brgh0wvJVO7 z1?7+wpJ%$5%Zd9nd3+{4n=fuBb{S*QFP^6cCo0J*eHU>x-k`jFtg?eaqeNQsn!_Xh zB4S=Z_ihXFsRwJEOC49*lfw*E+!Y`@DKSNVZ6idw?8EU{6N`GB3HVPR2Egb2X9lqo`HSGv#UJG26eGYpd3rvR12mhBR z7HLa(T6HEkTyiUOptpBKhVOOYvpfw;8K!uoVC>7S^=z@kWDUSnzigrncLv5x!F_Q) ze4>>mg6Aa7KL@UqX=KDVQWqDcR# z1X$n{M3UUq*OV9_Yc~-ZyjSo0)wdQ)vfR;EG|!$l&(twfS-h5}?e!;P>4?2`J9b`6 z(7o~Cwf}+Ze52ev4iVkFK*X>frO1CIx6+0oDMfy!n>7Y%R(5Z2E_+1&E8HCa5gf^} z+GiU2)82m4G7W9EZ$@Ap4ftmeR4OIrK?Q&F&{*&s?k8FMyTy)P+1J)?37($CO~kWf zaj0E?#6K-gw)4UB+v4&1-BotTp)PVz>fqv6a%|LsDm&U{|0(JAj3S2vZZ597vL)Op ze#~d)Gio@tn0!)HbZmT$;osn$NV};{yqha}uH@s*RE|1|wKTS7jxLSwXOqqC@$!?) zXP6CqDaNIp!~pK3!aEh#2_58*cTs=0ZW67Wln?Vidt_0n{ zt5?=yy(|8=*cugfwC4GUuv;n#ik+*5c(KD_(8$_JNGQ`5D|WQ+`R1*Y@M4dpM0nrw z+cpPeKh+(RJ{loq?FEYkMwi*G4v!t@`zMpu4`FqJT(}fabnkqSop&F`dr?eLynw>D zO98VLM7QK#clB{>UE`!r^kQOlV;JuS7y|{ zyOj5hoQJ+quBl<6=+4lpD*>1Z{y&D0RkZDoex0Xt)RfQBWI4%|+ee)yVz$~TBl9r5 z)jYVe4Od|SWdN$C7B3fw)Yf@~t&1W)^!p#ZKazgqtNMfFxpyFM7iBFjF3Q>m+`}R3 zPw+><<(yi|kJtIsx~eAc#Dl+rIS>1L4KxSpJ{50lVaogf1Y$~V)pq9{+Tf=Jb%KzP zj5jkzjLS=odzNg9dR18Q}c9{qaA;AJf1T1caydS4;L)u!Ye`rD`YO5IZ^&dKFlYvsjU}+yajj* z(ybgzb7hJ`uJNjBe?u%$S9~s6SFE9T_65?{SKXvlx2f~Bkhm4VOl{ZVFKRTCKQLr* zbr-Kpa~-ZsTMV<5hxoi3g9u;3$E2B}GH(|RyXIvl4Vp}+{`{fjJ+SEF&y%!p3Vu-D zN;)u!7L>n~E=;7kcNR%)_`{n<{`QP)qd|AG62AT%^AOY0pllwB9C5m1Lct=TawOO2 zW<9l$6sRPNZ6qg0(nEKf>q4;oO*JJs;#%u$t=APQ{T|utFYI5f`gS;iiiAZJ;^@P- zwQ(0h%L+CnG1o6#?!zkd3_q1+w`tQLc zvS{7!J`(9m5B%B1%WDSUgqaVrom1t`p!pqUEt?)qJZa;5Nn|}8fA2W?owiaMwH`Yi zRWQxUL&kDv54p_v;*L?5a2%Rh>8V0|oTtqFg9~_0o+y>)*sn{`I^}^Rd9R`iD+8p$ z&U8m*MDFX;nA4!I98#uzgfO?zjPks&EUt2~Zg!l8(xxAqh-hh<_8cgnB{Y>SuueoubPUz#qo4GkKljqfODpiK! zh_G^Aet0$#tetj{n+9fmQGRtVIt>=R$a{E=iZL7ZU=W->hd=eEyYHt-9Y3X(`^O~H zsG{Q!=19_lA+*cmVN%2pTKu?>{6I6G9I91g0%Vf^mhb~P-W^v{XynsSX$9U?e%b`D zSLHr!h=pzYQyRFmRP_E3DDcw=zOTR!meRg|M}{m^DWFI@s38}n0;`RzZHZ`^_R~_j z@$Zd6^K)Pw4o=DtYbe~2FcDrV(;#AVdTr$u9q~`JApslvy3KgE?V?TG9T5Q zJS_TOlj;6{Mo4c)6xDfVN79SN^C2)h0m4ojJUbQ-uA8`8JE?q$tJVvRWwVV)C75UO zIc26w&NoUR=fFGiQT^$-=jM7#+w-Cp@b0(h=cp09O^3)7HDVBv(d}vEi{(;sdwTSR zEbUC7U0#OdcAvm|X`vkay>m$qVbDAElh~|dB#4Mqr#vsm z_997MAO=fwYa|a!Ly1%)UB)Ou*3byW%Noj5oUNe@MI%DyE{@8>@w_0jc25?)^`^N` zr!3xiH&EB-M@hEx!7)77^`oe3RRB$XTT2=@ingh$?Nd46f5}AQ?MKn_w|bue|H&en zXW=a{81Dbe=g6_Y=^^6bf{(u)@Ckv-{0rm}P`XD&I3V2V(FF9?k*2$%o%i-T&WWi9qb~ zn@KF;m8378AS>*}*l z-AJRbR3siWpx%6*8v61Y{>nF2cz52a`^y@#!)_$T=V_FL_i9SHZo-#O7N~2%w1&*d zoiq*I@(#Q*SG#kII%a0S8#Bwdu>S6(zHc_(+J^FhW}S?X?HIEjD|9FIB>yOO#+@)} z@g_DzN9uTg{;~=c%I8-kP(PzQaiTK#Wfk)XveOsu){#gpv9O=LF!KJ4XD_|T_FALX zsY4>ux=HT4j_uQvNVld)w_0tl3t6R}7^FLe%*~qwwKz}+7A%v~#1Vd6L<`i(YQ1OLste|rv0Xn4fMu~*yW*+i8p2kz3|zGpu^ryz zGtaUxapY)#ybNNw>=4SLeMpw{dmXmehlEQ}VeEhpW=usWd+S5GJ8W7bc2_L%FUgaA z)|5CEXZw<+r2a?)pUcK_QBa97^hi#C*%+-PbU}yl<5zBZ`C!$%nZ#oJNYCgAtN4I7 zOtr_h@Kbmjha(PnDjqoW3Fdvkk3@1h9x$NU%4T-J4XtS++2M>>A_wMo)BR;k^Rz)*QFDO#z4 zBqLrNlh328;FGTkM59czq9Oe}_B0SOUL44}2a#5!6Pq7I0_!(v!OfuRvtQh;jRZ%s ztR$O0%@v2fi5|knsu{?Bf}J3p4Pbu3Bt+U0z}g0r;Zi~X`#P8y$VyfQOP!2mkAu;1 zd;D250|}MP{_Gd>}I~< zWQ+8j7b^`X5z=C>;``y`ndD_RpUCB1uHZKj!Kwsr>;#TqeTi zsSFN-orsy*{$yrt>ya5!b2B?qkEBW0YBF7Y(o$d7gNsl-!Ots%V!)AUP1dJANtH6@ zv9Ifs>(b{k%WFW=Tz#wG3RHH4vg-{<1D8{-qIWF%5?AKlkc8>xA^}sUm%7p#SYksG zojx)KRG9P$%H9AWx}ynPbUfi@9bue)3^o|EBJDkkR!N*9=xZfa)1R!v4mBi=r5En( zQA08=p5LXy9=SwL3P_GCndZaY`Tn<{S4q?P32&TdAbOY&SakcCcDis0p(1Ns*!4!_M&wOr-qaGKxu-{5QnqgX zcCL%fk04S*UImoc%dH$ZtH;aEf+q1vwogNlej+%v`U{=uy7A@-O1M_PFiuSnZ@!#d-+4vp2&8Q z-F}7TP_bo{#Ufr-fZJ2%U#ilusOF@lv~W5b)|~W|B5SZi%`u@orx)LCPNopAtGOtg z`+3D}Te)<$_E;_(*OG+0t_FgM`d7WcKDlfIQX0%`@m@8Qr%kv_+~PrI(Jzuv?}8HO z`JBUL+W6e!zguEnk{!&yHR&wLQ`yMYBtrkmIljPJXVXHo%%YDcY*TB})8jJ>(ZKzX z19fykd3v^rF1+PKOHB5~k#S_S)bi8GXehoGkudkET#?-aTTM)mI&gxvQyTaXygjY` zQP>;$wjdN=cz~Cr)#T!HZHZR0tM!JkpW;b`o${J6OFUU<*Zd`6ixWr}>0Tt$WsQFLf)`n5{ZA!-)nJgZYnBAoz0yM%0=eXo`n1Cdj%KWTy1HN zFhF3g2H@`8?i`lVo+PzTh_G1RJIBHHrV&!G!r>)Bz7;b32RA70Dvq;Oj%y;=>Gq_N z`$hPWtq!a6N-3+6M1oy6AdMeenYGUXS(7Bvs$>86sk$O!l>g>R^)_rUg^!`OJk7lJ zBEsDGYU;(GSZ%`vEx$U5tyUo0okZIBwB)PXdpjAi)i@E(cQVY7OlnEX!kNKN@?yqh zazZ*CMiVWbt_O70TZou2Y$3XC%1a@34UHkZDrSBHqqGs>bPpv)4frbc5jgl*ROy@& z$hI5FA^qg1L^IcI4$S>M_N`9~kxm%Ra#P78Y1Sw<<^z%(T=EF(SwV?>Asb7G@uJZr zKDC0A2%eQPzxc`rO`*L~>gfe(Wd(yRe9l$Q<{m zMpj*d)6Z7@ihuZs)F5_u?g*BU$A1f!6?m!rKi7fpN1}uSPU7xi-$>@yhxo_6sH(D5 ze`l=p1;QB7>RUSR&inH45eL5NI4P&zqh89!^da+FoOR=x#+O$gWAzY^8RY?(7)yJ!@yxU9ZorylN+QAOIKW%rhvXl;QpxMk_e3caz9?;h3 z1SSXda~A5HyP!;Gh5az9`t~DkEnWVb!^79s91_(WF4uT3hY}%)3ko(a{YaqqT8_Op zKRo~|&)JoJp zE4Cj@Cfd2q`@6~l6UC8lQP`Yeq?6M#3I4?6vpagQ9iNceL67)>BzKut+9mG8Fg&A# zzhimIJcq+-+r&ByCqW&)dMfhbUy@r|S!KazC89|sIu45-B(?9E4V?fq@9-|PLc{NI zo>AtjoV*r&*w*1BT5|r8-5L(d;?WiMVmQ|N8Nn=U1c|Zh2i4wt1kABld)dYjBv?}X zakVj!-5r7bf2<#C_c8G$f3jX5lb~9mx4DS*33hy7q#G2=A8hu=WEQ#2+&>}Br1h6r z@+YKzo0X4j6_XWIdp55a?&o*OQZ}d%uNO>J?sY;#{(NE+87lh;36ugau~VOrJn74e ztkXz1InJ>qBgvxRyAN!HKmG}BISF3_%W0d?^tsvS0ri(W3SNwF-Vse^@+i`c{8fB= z6#1S=cNDgIG+Akv^ABOIKO;l1Q(yZT$+lZ`R-M*`zlu3J@K5&SBPqzPt2H@GP3~$< zuBj&1F{sI}@IuZ1&S=@`U?dt`fq^uJ^l^NGMaU4LcG$C9Q|uP~$eh7NaM3PFhP zfk4BJ@y2mZP3Ste&qc`Sf!AfUlfBuJv1E~Jyrz0C_V|T08AobIOtz*ZDA72H;`209 z`4=_~`sc6}%2f2fu(9JH#|C=#_c*dkYVO81jwj9A|AkLvaTbG8coT2h91!ahdI8lE zR>CTpc1N?Aw_wigk#SZ)sKB-JWq zXLGP;!MORH^y=~XUC2ljH}SFLM@by1PX_U^OO@2!lf?44cTuPj&rY=(;z5a-ZN0q>q~4 zz*84_LU|Iz(kBt4w6+doldxt@gzZ0x9CzMQNi@TBjkS|1i_Mb>uHw%5t9aQI(u7Fq z6~(8f5}7z($9l&}3h%N0Utr)bu3$^PAg83<18hJprqHnOSza!AP5xk0^T>yia|OGY zM^c-)@MV&(JY5a=+?%g59F2ln?i8sk6>|ZWjgk*96lMk1V_~K4V(HV#YVwd(PDj2! zA7HLCNR<78dsUWYA(9V`|JjlCok7CL5;lDX8A@8Pdo##7GLM<^;WCNa&$i{0FLd7( z6AjsWmJcKlGi?Vxqu|w@3~uLq3&~nSnMpK!*;+pi;VKj!nZ*2@xB#!@RN-*%C@Vl zY!>$7;q37&n1~m@W!|$%|G3R}xFUeZfh$F$JWAZ|$Vluzpg*t8({gp}#41aUh}x|C zL#<7$a;=Q*oQ>`FO!muck}DPNWc}xmOJoI$Hjzc78#`(u?VWw0vmj9I#hc81E(xu{ z5Xb8=U7q@|&U1-Ztv$br((x4>Y};T@kK4_%=aONhJ-ayMH{g^;7n7!bT;cJu4DM+cANn|U>Qq@ zDcS|}@aLeTjTM%;Txsa%;6)I1_Ob{<~6%vdb2C{pPoYzO|~jZ1=|n~lLqFm$SBXl`YwZ(}eDhB`Ke#}F|-%%d{o>Si{z za=dck+K(3zFF2m8uWrvZ!BN5EyiSd+3@2?2Ck(uaB{qf=f?}rmBR*qpdj%>lv-&VvD!O*jsp{|voxs9QZV2H9YOc4y>)eNC3LwCjA z#?e%8yjfS>>_LL#A0Fq;1}eJZ3O;hD%IQWhZ}u4*Ls!92x{k>V{q88TTWLd$0$se0 zeb3QNg7;$^+ESnc*Rcm2{X(FzHZ(|}(d$^ya-iV?b+DmtFYz9=6tXVMNl;)%pjK~k z8iF|bPJl_@501N>LPDFY(zCV8iGyd*wd!&H<38v#i$0~09av5RJs)0Gfdu6%70?&5 z3J!=5a$up#QnFRxkF~7!3KEdJKycuFhz@FcF>X@{Z&P~V`_86??qWsdUp#>ERH*o> z)FvBs$@|oURO%R&xS4Yy4{m z=5%cB)O5=lX5r~u)O4)9YWk%$ENUgvr>N-(N>ep`!y49yr>CpwS&F@yp0kFTR+3#S$c8JU`Zah*x^)7I47MW!i#~`G z#f!PzS8#b(bIq`FJ=22Aq@4wF>+qC$(bJFd+F^7qU8RoB+*KHz?XGa4aii#;Jwlp8 zSFshVFbLhPK!S2i1)8s7rvP;M)%u!Uma>Ec_^GZF{y9arQ+_xfYlaHEdn4mKny+5l z1-_f(Uc7?13I`|J?lr9WYBH#HI*7P|;>fR7;n12Nvqa+!{55RXYT_N<;tXF(tu7j~ zcGEd7xOd058EBaDE2~^h{G|AE%wY`)Z2lEk_&OhL#Jv}IY4~flwhZF_lR*~GVBDE1 zdgrZ|x9&e6I#Hu^VEJoEGwvE+gEji&v+S2OBsuE@zG#k`yvlJ`jEyapBju7wTZFU& zBEyi=r~({zxTq>#Gf9GRF!n6b9OAcVV9CoJJ-ELU_lSh2v+hc?D!9oXyl@$`7n&W_a*EkrggRD-4p3^J9fuQb#bDs z&MO#nY=|VUWPR4bxi@H~wS?vCVAT4qWap786`x`+){#0=pXJPdJvNdnR?B_)JL`P#rb7o zaEWuR`WAh`QbhA#_RlbG zgEOnakyTZ>9PJ42kKS_1$~&wYPFHz(uj`*wqsD5qu@&_NT3L^DlHEQ=9N&yoYD2L>QGAG~5pS*J zxbk_zUE2vucyC+uu;oCnZ^8*=x2AX~E0D$9>-dy|t3_WMFm}bwig4Fg@2V2HaiZWz zPyunX=$}(TQxorqn6!6l*=gnk-mb;`H(gll(r{*VSAp?{kfyY{y0t5gz|OY42*%R}fmI&RReKW&ds@ zEu`NmYx*^5?*v0qQ>opbt6_KcNC9lc*Z8RUU{r$F6K4SU&r-PWhrca`lMuh9?CjU1 ziLZ~9Ks2POAV5PdEn)giB%;kY!cIXLYReCK8#u9_f(LJ={E)!M%ey-3~;f z(aL4M`QUyXKHS#57P@>82ry8S_yg}p!;j}yRu09Dupv==QU#N8<1y6Jte^h|EMRSl zP4>bvZA%oxf9Tsxs6gw5^_m{7kri}p3v}HBketvy<%DJ0->vk@1+htYQxI3*Ranm} zmLGmq#~N=Y(Yi^99^e-OaSzQy8OcU(Cb9M{a0cw`G-8`I%|J(tml(ca!OWcj&@#);+NxR{W zlh)5>_xBJ#m(OSOnSoxOHk;Kf!k)hKY}F5)Rs=t^VK(`hJyAY$i=B{ z;B0p4Tip71J&PCX1P_;Rp1aF#ucYF)-;#PH@K6EIUHweCOu27ZZ7h!ZHWaX=eK-!I zMD<#CUL(BLEydnipGDqzt@{$;wPx^I*DU^NA8Agc%d42{ev;>#wi`WZ>JW*Ob3^rE z`bnkrD)!ZWGFcinof!_0x;59#KrL`CaTBgHT+3*zCQHL-u-pTyZEXLGGC1=h9ZgS?vt);|3Naj&euDt zaPP6>yL*rLBD}H`+D1Kq)$ORF11%ZstMAC?QtvNV!1p9Pa6>L8YXH7tn$ACRi#Z9a zA&*N7_Y!ki|L;km^ye4*ejv^4q+L^rTa=I)1nb#>BV?l6w(V%!;5N(odio`6cNDw$ zSM1_ZQs6dw8%F~6^T|Ge4Jsv#>!10CcL#SN?pg>1U55jW~8p zHV-Cwuk6R^WVc?ABvyEmyz(C04s19E<|4b$i4WEbN|$zQ=P8mI_{&%>JB<8QVR?KU z!}XKcKe6wC{{1R`Zp*?>lhcxWTlV-giI?_%%9@GF9JYDw)_ zN99iIXvN7cZp+3%4|zKqR+K(GLZlOw=tNSBCBZM7@CzAL^i~9)dBhkH)L(Ep?g=3@ zK*vzAk&r+O-O(=>wT$4qj$nI5vlY%c#mIMfz)>v7)gI0F9W}NLe1J}A1NBFg8}A}G zw18frQ8?X#2Ol%W``ufPfQebj+Q}kow{WM(zuw{tjv0G})PX3Jib!1CUshIcjHI&q z=mL{XD$3~f3%u%aZzlDm(KoiN*0$G#&J88zl)6HE%c_2FYFPGS{^G zJfoeF)g7iy=Xu+c$WyFLK0IkGs1@)kg|yjk%s`dN!(q1l#*d#eMzP{hUhA|ml6^Rg zcR!8&Ywrx><4zkx8^jGmE_xytV=$emkcAPT<0^4~aZ;`SCX)2Lvr;;e zVeMHSbH+G>`6lw+XN;ls{t(HDnll6YVxbi8jspQSS;?|amNo_Y*vWiFG!(2Y&l+>s zy&?R@S*(_v8p6%zjEh*8A^eMT#^E7%8>&orr#usOze1j$JXM|v1*dq^-;fDiU*Vtq zX7u*%qFkXS1xHeqrV9@A(1!fbZ^oC{uEE^zJa#p{JeWJqLo3)ngtF}JKeMdfV4ip0 zc#9n#$cqcnUsZh>g{Hi}S|-Wt$RJ+p0_yYXL9)M^JV^9c)uZQB=&!>0k_%{h%yam! z7tjTMH;_ggjTf#iaO24rji0b-1GxJo^!vRBh#FIB9XNouyaX4G2FQLt`4am5NBu>= z&sSW+Eo1Jy*Y8-U$eGW7_}#dQU3s4;Tt@rgI)iV$Y}{|O^95Io9<22QzUqpxS>pG7 zNbt!{n`sP4!@r7~%8$K=WJb)c%bxf>$@?tV4`p1>ZarW8-jjt-?g!PI2#)7$K2HF- zZ1Z_HKJBWpk&6wqh4F2@F)_T4TPb_V;@q9Mc^WQbqs%^T{*x{am_R_Q)fI&;^@OM|yQ90uh+fxoUB0~@!jz~9ixZ*%f{ zmGiqz=bLq7(;jEjDS&bh!$D!j9)_LL;H__lL3prF|1XT?JLP|J?v!5+a#>Q$=WUCO zAugjpTljsg+B~huIM7m(hT=#MH`&nj4w%cY78z66YiWG?SH@aA`I@n&_ClH%#Ma_V zuNk)nPMh|efz4}UoCBMy?}~v<&fa2Ubz|U@sn22lW3-cb^i(+tiu=R3)9+Asx?j&S zGfOmM*r{_|R3y47|CjDO?1r%ko70^Sxnca=Sip@pjbm8VZhZVrv@Owb{L7ohCC1>K z_9e!6jSaBp%)evYX*5pa1O77lq5nz!%Xq@*k<#PFqmV{6cpE;;(&=vabh zMT=QKZB3(1TZ76rZM^~u^e3fO3@{o!K<#K5O|>JKRgR{L5y(G$U_8p+jOG&`q7lL9 z!}JJE-pY==^CRPFV+{9uYlB>BXNs#_VBMW{&NNv4+N~CGl`0OE7ll^Nh@wMfAz}+Q?op zvU8C+RWuf4G%n8xbzx>BW68XoiM7HS*klu%#0E^{S4}KR`*OI*PhZ}t5=->#(o$?B zipLcz*!_;y-N#|>_#@A$#9FiC&3Q>B)`XRW@w%0nH#;82BP+AljsE=W%51gU?Qzad zEaXK##Fd3K8-iV_nX}T7gEP)pX3hYN%lgF?;}LX7utKv~YHcA5Co$a)<3GEyKz6wq zKjq2>vz^U&>nhBzR`Muk)a$<>RCv4@9}Nq)=rW7DU3qpDX0r`$3ZWTakPkEzlQ-9h zj*I3|o-O#nDy(s>qUO|s|NUKA_o08st5;=h*w3LnwkiwiKV^*cF;cJIRrDXEKRmxo zWW*!vWRqR@Z5-}!>f9Uy(LuyQ5vDrHR>F%Icp)Y~NW+Nl_|~edS%a5x2u}{S#YnrP zh$^()^OS@klpJY)GM;-^V=ZfR1T$X6pq0-1sE+C5_>gL>w$^LN6aLaG(BPga6DA%m zq0zGIc>aAgb(Us zWkJX`dTYpN;Xj($F`v_eD7Hdbh!F~=WZ0;cO=G3@7XDdvHnI8A>Wa{fY|8f2d`9jv zMu!;mZgz3Wt0!eah+faaJ6TX5ORMvV78dVb8+^_=yG^e)DCdBM^Vlf^MMtO1|t!Tw;A>gS|b**znh63i!fu_RVKn4k1w0|So?l##XT zv8_d95#91pZkB1>Fy6cHX~3DG6}-FA zt)h3?aa-mbpUTy2d4J}ctRbvvdt6<7<`Y^8#NU^wC*i^h}2(;P`=0OHRlVv zm-|V(c)eEyZ|TF@vQ!&?-G_b4cKUOFUpBYj9`aa-d$);jG8aeeBq6s&nYfWz!tVP% zPH`)pc1e1ywEIBWCFyfo@F%|PBNkVef8@tPSYTbg-4B&B>m})xP4C!Ph>Pnf#o+Tms}RBQBJ#fy_&S^tL)@_l)LKWoQk`|_dwtgiQHUpT=5O1fc14U}!A)?U7Ru|Ko1X1+Yf zpS{Sg_$;xpcK#uQoZ-KQkstE??>J}pLz@}s_-1XMVq*cUrw`{gR+lyN;W;)ox_SQ> zoeo{4Lu;ACZcPz!)fUBP3~Pd`Ex>K9b%*JF2hmg$5 z4tgC3Em-D@Q01$M*Zwh2hjabVFWd5~od(fQG z(W%`wVnYjk!Grq+u@S6`m1hL8z$X4y=tpzWK+NtEA+9v)9D+F+CbUp?Z4iw-jjf}R z*jDeHLqY6!7uKv+PEH6*VC)!C zn=>!X7@hMtf`wPnetK-k3Gcw(anV}cH}D@jv$op(druzKudC|?_c zvh$@cFNtB1TEw3Q-nc9Kl(&^XNU|$YS;jF|G zthj+><_c&g;~a}!iJoN|5y9)c$VRh;Aw1(nHo^VBw~0NAm}uKVJC5x+zI7YpqFj4a zLc-)~x{ZtudjhVT$0iAEzO{JqC_D2{yWvSZQxb4J^(8Vo;uGj*gF(32^Fa!Z35y5e zY8U^Z=L=gzn>w#dJ6%14MJT;PB!!;Tu=*E*BRWxZ1By0Z(r5-wS4F6iCUgaFkVR%f zE#h|Gp=2W^!Vph>-Od{Mwh%7+;NIT&M7^Fs`bPpu(!D)-i&)l-RSV|BW7(U5RVnf$ zU;ncewp&vFRC=+3S3Ru!Q7juf@S+C}U*iewX|DPS7)$M8r2Zmz1!R*LX3%>=fa>4$ z|AL5{c5N!?B8s0%8fkecI)diYif?%d|U&4y|gA& zhfZ5U%rk}QzNKN;TuX>)HZV)W?%4iip4Wu`){BLBJt&5_tbXqH%y)H2vS+?hQfmF~ z8u#msYLRh`_w3Dr_#3_15SB5LAMeeg`z-nLacLLFyy%^)|AGEpvYD%Vsg=F^qQ|z-IS- zAE!Yb_;T>g#*RCjc*0MHTcr;oy3QwBAjtp@)-qs#&q8y zIkp7W#8@-o65@@CDpozvz7^<^P56+3tag?BVF(-!xrg!efy|?F^6$u>w1#}yKvep_ ze&>e6*umYAE} zJIOn|$^sjF1M5;8?#eB0jNu-p^bYffAmK)$7vMtZWQfjZzsi~o>JJ+l@HRuLzKyXK z^1CCr;6H8z%0*IQb?-Ed!7@!}0B|vDWxXnbr0%^}$?7myCpkzlH$B-KO^Eq%1MWT? zt$)@f-fuW-&w5E6HD0*f zQg*XPNHP6O4O~wV)@CR?*PA}yS;l3)aTG>tR$qR36uP-B=Xua*){rG%;yp&AJ50X7 zKN`(0vh<65S`ypHCjZ8x#;|#Hs$8H@bVEa$>tY|?%gwHBwP$wa`mI8KVGOgf(}n!r z7lt!|`Hpp3YVqEi>-{i)r(wEv1J3(Rm&`4xK{Q8QyOk zYsKC@$Fs()a&q3 z6PO3&j-tTs9uV|7&um48z zHkr(5L!Nhw`Xe{85VxpbaO0tq*jm>81ivtez0KO3CeH;R*qnkedj?KHG;kc`7thV3L&PWd`>+iuv zkus*@Dy)>c`a~k3YK}g}2c)uwe(j!R3D6rVmVjgY<5bMIY9HhKQrT$N?QT@6H@oq6 zZy=w>9^_NrV2jzdBi!;P%FVY&c>On-t;XCV!h_i1F2N|}`sgEkz?(?Jp4IrLvzcGW z{WcA!4Gh1lUq4K22W95$$e4~#!j@F&moJLYmxX-I z6sSiocj84;P>XML;;wJ8;DCZoIMV2cMCUM+?y+aNEyGt(YUR0T^UPm$!nSGF+^1>! zZ#$ z-$ze8DWAt{yv=H*tutYiF}j{;y&A^g;5zOA0*T%N=_RSPu+Aq0m0D{_5f}!ZiOXu) zJ?*hjYvR7=ow2iL+>J*_itA!9;Y6sw;}Rt7Vcn1iztJu9vuEVH#714W%xsEQ62T4( zu%KNQ8*g61Kt?eCf(Vn-7I6*}voQYd56sU>(JT&yi&NE+PU~PeSe@}7et_~K2~l~6 zHA~y>LK`)(_WxfP5RXk5JL&YG3<mQ4aT#)7Fblkgwpe3btXZt|5H%a3W7Rp;fX&o zj|c;tkRk_*$>`E(od|L+X~?cX2*7C+Of(S~%rrM6b&D(EaQ9{&Kb6(9{s1P&X>fl6 zgHQ%pHyz<~r!t>vLlrCk6+KF*v6e5?6I1apMpk=!2Wr|(V+cfHRmF7Gjh~;&0-_(a z2L&@0i~`*4)Lp@+FvQiK5rhwy_-C1J5lhs`)RQ7%XlRR9p{S|MG(Bn0qu*ug7v{a@ z?cy+f*q;CV9t%oKfdl<&AYDKTo(Y8YLXT{3#t>%% z$r(wUCTyiCPPIFV?O82X!ABI!IRLl|JPgHFyeXugsSn8xlPd|s{lB=EhY!eLqtZ(0 zMB2FA1iMBr7ptaFuZ>BXeiD0jXeex++>S!vR!x7qp%5}$;u_R(VHk^VpkzQ2WIXgv zJp}d`SnCZCT5Jtz4Ktw7D-t_qto^``VZSi<(tz;4-(>-5E_6PaZi<{)h$$FOi#l%O z9$BQcN&nCN$EEVnXmY1@OOYtL1y_j?r8{N-2f?mCIgZkR8-tT+UyYqC>{(qg0LR%_ ztjwUxi*x);I!TJS-m^;7UaEd9c1D07BBgD3+;*Q zw;oBxx2LoEUPZ_`L#i3abD-{|Cx0sy_s~CX!m)NAQ2ip7ip2Y_1Kjnh&3V{#7W0yr zUYimU)kmTLV`uB4+&NurQm>+wT4Ofw_h+yM!&gywk=9kH-MoSXL1kJ;GH}{m5)TnE zJI>VHF(^(#Rl@y+kXs+obf*>s!MpYo1rMi*C3;7=+@p8#2uep|_jb9=`BEmX zvilhP>I!JFmjNM1T2#Sghmt%!hxeY%8r1jFFj?3`PaB2%b%P80kv+ISayo5cb-u7( zbOJ|NW@9Y*$1nWyY}T25^$Tw}hjnLHLUN|eVZlcK2qbRiJMP8q4!cWSrX2%t)MtMX z?V00TGYW73-J4(ijMe7XGg;%{gAu4S^7S*JFqm!n0Te7fI9yR?W6>@SFz~3k%r`BQ z=ux|&$_&rzge}!a3Xs6zhiRMP5X!PF^D4x=*o`ilHUs++m_DK!)gykODpE{3C zVQ%gD-Fd8t1+?QAve;K{qiQ+p)6rUd$@{EzdkvJVp`MxE`hV_V?C`J%t7Yi^u`qyV z@v4X6NjQ1cw&Ms&!CI(uahoNlVv*^$qBXBNA8QnE)HE12V$6y-K#ZXlA3L8lZ~X^K zf2Qd?{=;__kAc1gs;zgip0r253Ei%v1Tm_OdsQO!m2gf2AK2koCyb+ z)>%OGVHLRg)#TP}R=-AmGiFGk`LJED-imUL$7Qp6zNZo5A_&pca+Ta#NITF@(T3-R;M_jxv8krd zNSyXp@i!EY7!hT?3TR@|1J542^Vb$&`6m1pU$%e+wfLIkW~D)eP??&Y>*Q>S@QZYe z$T#tp6t(dwk?w4LHqOmsLtPA$h_S?Eu-wJ&Ockoe6*u?jeN^O7NLC% z!`+1}NP80o-$gj=+8>7Yi@*~J!^?}5e4b{5hSZ$9b?6vw>pr*W;fV^3QYv-hb5pn5G3X;AuUIQEQ3rkpt zHv5i|yKz>#_NUhr$XBqW|0T}deB`sgl`U%=nK}$2Q zm&C6GaRw1H>a8S12&c!!vaI|51UbvR;|_Lp{}qA8Ky>Wgpprqsuq@6M*(_+Yp~zMa z37@eGtzAZYdXJBa#IbU*koqR1)`8e$h$RU{KG2}5RMjul<`b7H+ z=|k3{N-VCr!drQ5gL0xjWIc=)(n~oC#5Seldi%EghQ_-J>ki4nfc%qHh2limHyNV?lX&_bY*B z{T{U2mV`Wf%%%r01MUXjR@nQUmUh4sOgE(61=wA<%^NRg)f!5t31A&~ z7A)JQ-)FKX_|-t082o<0#3nAw`UB%bmt!Ja{T5%koP{NF`YyB5OP3elqBk9(K5R!;`{3t%Tb?W?q#)Bp&RQ z?C>$GQ*|(`Dey5R{MC#RStmnyc)_qv!KOAVz1h)Os>(vfv`45}y+J3QUz3CH>@{0#rB}_P2 zG1>F)hxqM>!hU<#i$!1g9U~JN9ytw1oQBgdK*-kZ7cYFZwJbHaKS6tt<@YNSsrie6 zCwu}$N8Ouz&L^y`Z%w$-`?W>$*~j9K&?T4)Ny@_nQ^5`X+b67cN^nmjh=`p`k_%5x$g?ty=&wHSFoMX z%wpc0bDcZBWjz9mEhGv9Sd5j@im_1-_xR@qXGZFW$s)^dbTNPUEvw)3iwbju41F^VB7Sk>M3bFk9p=4Qivs`Jh5@tyG z&rSZ_8s?RjLUEvR6-MPNmKfCYsX}E!HE2C1lq5J+x_SdZul-MzNz)2aCP9jG0x#tB zA~_~0r@fTZf#e)QPWWLwg!C*^;#{FrQo*USMCx9A!7OwywMYFfp-m628O8PT$j0u~_L+SVpay&*kMqTO?AW*fGrS`OXpFLI^UMEbP3ryNh3@qkT~wb%6oN8cR1L=Eq?#^>q z!P~nDR`l#ozgf)#=j*G-!A3>l-j?pcNgL(ips{;V`w8 z7Wbr@r|$wvD04k0w~M%V-ee^_BlsRJ87`hJ@ACNI9M^whZ?KO(;E6x8R+j2W;;8mV zaoeG#XZw9V{69alVE43z&PHq>681wce(Gm75o@RXrC(TY@0A~rXC=5F3UB1zH@<;2 zb7&Nne87MD1q%~T-1+riSWJ&UPeTiI2BYF};i7qS)9<2+=;xsA{I5|yD_sxE19Oon zQUO)A35ll9?Twxy;!!lysj8pg({ivZ8}J$P@*NMsn9yOTD+bon=OFn?N)3)``fAYm zyboBgcN58h_f_Z;q%Sc@$%g&d(>(h#sQs^>;u}80#=<~_uRO&ui3|2Y|5!%DjC zFZci#xu7b2c?N@K2OH5fyB7 za9l@Gi-wjM3VLVawI`tSB@m=-;^Us`X}Xx zU0+a+#OpK4ktzC{Wk_Z^5=I|gjteEv0O0)b7c4$)Hp-LTF<%TUD20XD4!5KeY^2{n0?Pg;#m`};_gk^B z89>XzaQ+(UyVGEpej5gv`IrfmWj}65cc6tbKR62=@ktWsr+*>@iWyo}arW``@Y3Sf z9OmQTv1jZq)$_rCYG1UW0QE_(u6}(BO_}*8;t+GYRCfg8WALF&R!W24#hai+(&q`6 zsWlzuxnKp$JHoF6#Zayu&<~?M1pf(=g$ej*gpBTV#F1wxpv#g#4?iMqjdP|%G$c{L zee^3-D&(F9=wMNQ-=$#N&f+MP2)9LsJE=mr|HQ(!!~En7h5IDhG7;{pkb`iD1e%hNJ--E2B1NsKD<{^e*;fL}5ugJ>Wl%vIF-3?RAod%)A$Q31$2Y4_~{^>pz zRqw_D%0Vb=rcZGzdJOe$AbOBvHA#*<#kNPU)ryzyW8G*!aom2^+T}G*=*?&EXEF6? zUk@gDGrM7Ar+@ngLc0qdHA2-aY7Y`Rk4)1sUb3Ir>N}^frad*NK141Duy=G*y~L)5Zn`2~{rtd@69Ah%IYY-ks}h=lDBwe4-fsr1w4b$x#`<<~aX z;^TPpaQ7kZ`xWzH`R=^USIlm+2zd^_Ge=Rhlu~iFI|Los1MaSe=&7_9yy_7p(=6_T z%``WVScp4+@)eunyWs&X!s%3=pgAlpI)E|0X!uQgkMa+`W`X7ss0UQE7VP19Uo&gh z7c9^M)_>L=2*0u(WqM*8 z9=-wH`kPnzxD71Gv-ed*r*voctT(WO?qTZnSTvFyuJV-|SQAsqPP8ox4{h@2e{Ns{ zna>s8b0hQeZyPBq!AW@Ez44QmvfRRPsw2*^ue)Qr?ia~tZe)$!)?uzhOKp|(`d9d- zjm++O78ELFM*+7;1*2YYnb+Bb73)=(c@&`6wS4%9rx9t8W>d;w{a8MKeG{e&)AsRs zo3K~-UPr!T6Lw*Ge#D#n3i^?D{Ka2ch{vroBnO)DdBMq4s>1i`{@?SAU$OIRReOHv zS0u)n=G<#D^5Nhf-gYyyweB#DVv<^;)cR;D+!pAsU8G7}?2g4ET8FYx%X~SSis-yx zXitUE8sG5+n^|KvWhdXfnR&5lmHCOyY*Nj?IogB=*e9Y&@3O7@2;{9y?8a%E;#^CMS!%G9ErkMaho|4%umHY2xd1Sv+gKgjdT${D0cV zo91B`$vXvnejYY`o_&Y^lE>26?8dzHR_xX}T91$23Ps7Xdi;y6jI&XzdAn`cb8f%E zzud+?Y*GayT^Y-a10qkeL6ALYBHEv5953C5Gh-NUj4t8hwzCFqJ?OFqv6Cz29RCCq zHfTTJxt+bhjudc9KDG_s+Q*ycvmjQO%lqfEkQ%RwTNbdJOgigxme0>eNjaU%*W@#w zv<1IX1xI6;-rmoEMiiU!*l>d93KTaUPGJ3zM37!??-Pb`SD~lo#s0I6kKDl; zv0*#;f*mZJ{qzRkv4eH?ne&FIBr~=nuW0eKhc~uQBI9)bY#y|eWwid_D5gZ{!%Wl3 z;0{AF888es4TS->j@uBeV&*8$oZwni3ju87=lR6Q&+TNs?k~#aarvz z=kqEBY=+-AXt_wF-$!JCNWV-nK&0Q4BmC|xiUirIfbb`Kq=0u*ghYjvI^ca;D*%ue%_VT+J{x1uMAC7xaMwHquKb*t%9I9x$ z1hs^wd!A^ECfBexK93c!Na$HG9qDE+f9qktbO5aSif>eazd1(t&qy)#{|Jt07mS?88xYu@;|a&%0L% z^VjWnAoXHLdNeZD;gWkd#y!%Q60B!YPfjx{m)B4v&Y<0?t9L^4k5OT%H5s%_P45MK zr=beUOvav4^r>&b3$*a%BU9WsfpO<`+|YlBryXLIZ2n~~ipS5~H6F}L#&ZUNAx0MCjh22!*8S3e0kf*+Z={o zFMk{#a~Ks8`1^-(q9f{eUVIphhxhLsmlL&N^&arpBUpCdIhId6!aA~9WBHmREU@V< zqv0io+k-hV%{#p0aCwj(7uMdTw2MozYpM0XSc)YLULD;_sDXa+(UPMq!Yw2oNz=Fx zMZf-f9(@#^loYViS?p1NO% zm9Pk_6ljUNIb!}Y+>NOeX~ghwe3=lvlayO*>56Srj-%*SAYu6SCYmUEO(M%wRE&kDldNr;2edfhXFB1) zeC8{K`j?0y2Fx?$b`aBiXkAe#^vJ=LBQ05X5DI<7DXIc<#Ei7fhmmL^Q>~CUvYfMx zWyUUWf*3D|ZaUTx`@cR6!H ze_a?!!&kHo9fe*4coB6R2-kN-GFo?IDn~}AR7vkp$1>w>Vj3(Qk!n+KzKi!e!`f(- zP*N70VeM=0_`_%juGFqlS4&J@Or|LZD8NsD82QyRY&uKX#mAmyLp;}Db|Jp@eh30Ip%N7=0)e&xXR1x!7BVVfB84oJ}5f`LBKL~^oCrl zZR>}CLTOK1e;nO!Qhn=^%{TtW+BQ2t&6zx8Br_DvRT$bly)L$5(pUtD=s~ybb(r41 z#+P4Z0mjOF^HruBH}h3G3mMjZds!j7u~HPW;$A4)j!qtVx_PxRrLF$WCX%%WN7gT( zK+=e^3N|Rgld1^U%-pw3U@yk5_--^$LT9rO673noLlA{M`U?$tSP=_}*^XCyRaqXX zylE`_aDyL}^~VrZd`++WxtK-l(VL_Dh0*~6yg-s8oydi@UcOZ}L?aO$yY;C&uZT4= ze#fsDvF1k3>t18AHM3qu!e#7?wnsfly+N+q@wcwA@RrFK)@`f;hgjKg{{jNH6%Pq7 z&FWcM@4N~=I?g*xGodUOleMUlsjbk*r(Wb2t}*{QeL>I2jm|W6BL?UJ^VV0UY>ZjO z>lC9;uXB+n7BesNSA%F(ayXs~vfjNQNG@3*E&Sm-(H{ZFJ_HGmV+DJ*Ij!?Tx19hiaqrjd1bZX3LbVwQ-wA_T*BUxcHm*K zlyUzFnjRDr(T*JklQUSN$| zI@VI)PSHr$%Q1a0JU}yK*5`;=?a{y8Ovxd%s=_JOh)oG=`TG~pO!$4xYg}YK61!7f z$XZ9usACQ(862kD-{WqI0-9I&(*jNtvCN^DAZ@cTxEXu_A$J_mQPKfVO3MZ)-86)Q zMxf%TL%;M1-*OS#<2SD2)h@9BccI*fCfz?BJznxL*Ns|p-s>?s!p$pr%45ta`ULQ0 zk1^tO`JJDB%w7m`jiOX6v}dK@ndg~zEi*9fG3>0gcQ0xh&NA-SkL=-Ho}eWfdWok! z!8Gr~EqwhG)}M9S!fTYWF1Dj>lz_n`;EZL)M+o^&O$ex^f4-X+UP1SqU5efOd^6uz z%0g?$U!-b_v`obP93|7+oP(+tlaeYM78^BB_gm{_RqpO;58tPMk+Hae7RkO^zj&C2 zmk&N#?9ftchkfLUMrOIgwH zjH2H(%6t-9t;zLejof>jpT3U6Y?I5lbPvo9p*|7?9>v2lgNm8F=K#Lb@xv%{%xa_9 zGyqp<-fW<>m6UCg5&}w?r2Hr;m^_*5OUkE`5($d0q-3Q@5}GG-O-Xu3QtY6(O3D~X zNdm=FQU*v$GAL*)DL`E%WeO-b=0KEiL2;y0*@`m%h3kkxtSgCgBvD_5OL0N1BB`SP zk20T;tbhLebcr8To)WaNhF-RZ)BVInr$nR7K9aIYQrtnQAt_%=N&+Y^O3G46Nwh~* zHMf_fSwHiYzhiYd_GfSR3`^c>uvAGJ6wf- z2iNjJSFzjw^{M==tJw3gy(_LnvHiiSng4<|Rw&(T=!bvgk$3^_@=uUk*_3P9h=RV`Hbc$iS%SUKTXg~3cU>r#> z;J83{M@gKc2qifck0u>XvFZVksCwM33zpnq%h+4p`NucdyX-+6_q~aVzd4R4+(a%+ zkK>DP;#_=_IDYLW7I@v_c-0at@Z9LeLrU1V!095eDVOb0k0<%WHog%X^~W3N?{NXy zzF5b0T$$C4|6IbpWHqMnS8lOZ=IP&|w}s-CdfNcL;uc#~XCKC|8v{Wqda;xmWa_*U z5RcTweAsO^-F@yGSRbbw`>@rqxJd8GZ{NmDXq5~1y2I*gBc3oGeTS{rRy<)jkM6K8 zMy(K}&VR9sX|o ziTI}Bn~QG=zR&S}k8cCM9rzC8`wibUe0TA&$KZX;+8GwWuoT~?_`byV9loFNZN#?~ z-!6Oy@twf;8@|iafEp3YVP?r8qs4hywl&zX6d#XYLPA&K4rPJ(qCG~ zlmEu#Z(I!j=5OXxsRza@4g+u67H`P-H(`}{(cf%}=aJ4-Do& znJZBGaStU8F|pJ9hfZ=HZJDtLIf56 zrLWpdq2o)WN_Um?47X#QZz0U#haRxyfvYeiQ_S`mR97(5nFp_N5)+%<3-vuS`22^g zzDt8*Xo1#0WUtm5Nxkpz0$Lh4fUuNW4efc;M_?I@V{ts;5o=lf&Thqmfyq0c^JS0N z3)Md@qnY&vpYxlK*oy%zcfhCADo{_2K)j1JXhVxmV=f^FSbCQoys}XX3jGM(xC&#` zdoqlo^MJmBmPyTnAchFo@o=CmA7Iq#`rM&9ErtS>^)ql@Tmz>F3f~CTTYbi}(IK{9 zg7sT8D(7jW`o=6_MiXGZnonwwJp*m*1V-Y6C`;eaFNC>S=(5B7l0^$l+X?)(WpKToM~J6c%M*Z>87Gn9 z;I7y3D0XxpPlHT9fG;k{ybd7t(1lnnPwc~ki+cIw;=S|85PP29WR#`YT1&_(Hdg~g zCEEVG@M8DvPL_dgdDx#vdlGSnve|LefX#~*cfUSh1T^~yIPf$!5sH0>;47rPhe3j# zU@jJc9SEA>DImMQ1ucR2Y2)D@$O#=T`OH2N-arJ4;JdpEw)0!-pB0{YV5_2gJ=X9r zH`UOZ)%O;xgH1Lmjy3hWzZU|`gGKn= zLl*&Vzqrf)oAPq<>M2!D@{1FW!EU`N@c`dnOY@9Q5{?F&k_i?k9L#?>WH&-kFIk0T zj`ZqQ{+)zf@Z=Ef@T}KGgsSMP&_M@zu!k1dsK4MEyejc)8V}90`j==c zQ8vyabo$#Se$+#=^|*hcuHcrps;ULEH{Rict7;K}=^vE!hXIpie^_)1rAGGIH}#d1`P!;lLuNJc zb5*sM*~taGZ8dE)YrTPgQBCX0O4jph)iCk%Y|K5}w7x8PJs<0)VXsj(uW8m=*Pf4U z`u5?NOJWyYn|Dv7n(U^gu&tElb4cPgC9J>+xI?0JK+U>umi_MW4_nxFSrICAB zOjZ{SkaiqtnDe4rkD(Rl4Jdh7P)Wx$94i@l(|MLvt5f|yaE-lK;&4^N5dO1Oi%1&| zTB-FlFgi|RN;?);T*I7kuTttzbkbcbxY*SI!f+}j3}ZHPUkr|54#Ck6Xa%12cZXuN zp{2zwLInuJ!*sep6U)}e@YV*bv1tW&k|yvZPi;_x-MbBj$sV-fxd5g&s@}F+LJRQM zNE~QH`;U_@CUXI=;;k*O5x%3e6b~?2LTJjLu{~)U|IJgY&GJ+EeNQchZ8Y$XUYb8^ z)qy8^X}#Es2L4|!tqDu*FV?84i?pS&{wy)VB}NAqLmLT>iaa@nO0cs^Mh z&%O)d?S0WV22J2YeYH57aV$n#q}d45e`${H4%glFLv{$lf=G<#=11V!!9riH4eJ@e zef+d$Y*Gsz=coC3_Y4+GLbzc2*f_C1iOaRO>7irzbU&;Wy7b0XQCb&vCWxQ+(|oL( zgOK-kcNkO5>L#%R`utwpQdjeB@-yj`vaF*}f{}-x0@J_j`j|#%xa`Kn$(B?F`asMP zc~mBzX-ciD^%xThMPRL{#vB> zTnrWMnO)Z)k`twIHAXLSz4;3^tr><4!ge)A;cN8oBRJlw!AReq`vhnMLMx3&qJ-z$ zGiT;fslaAhG5Ms&P@?)GNLkk9gD6pfZw%+320)L~$d^Y4YKg{!{Ifu{+Q5tz>Bji!ZKOC$f zda!}&&s@83a90E_lFV+>oIvJuBMm9%l9sjTC&&T62;6FEPA8t_(kvpGEzJmYT3Lt+ zh-nHeoS}9GY=ol0gJ|OEOO73LMIh|bEMnG<%qlWr(kysvp(1c0VJ2 zLP*gsQs6x@uO+%;ZamDiiMfcyl;hL$RuIeZDg1mR&Dwq?S&2A6kezJi;u_KN5RevL zMCYA~j3l{e!7Sdqv1U!{{STYCSt4AC#1$>g(PWMwvt#Z-K|fw*Mi^a-TvX$Rb1 z^yjgP_K8KmKZQ>zI_kv7A%N5KvPtI8PMRRCA<~ee$iigGAcixgsf& zfn(V~(kV%A)rF5}q6N2pL>@a6Hi3dtecqba)qK*9c5-r-hcg`^5&4-@W{Fgfrtq13L=KP{2`VzFRh^2Y zLgGpzl8VJRxF{E0LJl3>qxHd3H1E7W*czgJOAwv*94 zn$K;f`6S(eFHe_XLjH< znrl8D<0(;`ks?<`JG^*wbA+}_nN4|CVf0K{W!LLJ$1+)3Cg@elES*`gP26}dD@9HP z^QWHWp`D($hP?llNGPFnN~oytAV1w4HTBE4_`T*@c-qWX^u|k;$*mYns^nKJooLyY z!kzx>1(GYxy_B1i*UH_f5{dlLAnz!fs{V<>_%Q0~?f&S7!;T~gq&CFKz;Ge*OPt;S4Vnc;U(xSkA z+|p9>YFXte2BboQ!&P$J#E`SxkMwtw4bH8}$9PzT=3y3x#U$^~eMPulT8M>;ayRJC zrS;UO$Vj&^Nnh8!BD+|?l@@*a@-JFyt;06NBLyqwy=aI=_#<`8V!we(6l6y0*=?vB zuv+ywaF+d)JH3cUw9=Y~^elqF=aebEk#M3Km3_5&Rx2%#oodg2Y^AlZ-hUS_gw1J9 z)z%z36Xu`BJTB#U?KCN^>1-ExZ!pwVu%?1c!59Sv6aHGwl>9vu9Hrni1!pO^M8Pi= z+@#=c1&>RZX82tZZY$_IOL|aU;Y}32=6y;3T)`y@zNcWaf{6!6gcQui$P4e^>C)To>WLp^ig_w26Z46zrkkUMQE;n*l#TR@Q-ybsf`tn1RdBO{-z)g)3T4Pv zaIAvq3QDmC!>g(kJMn`vWXd`58_(dYhZ?9KHiR|egW72?__`%Y+&+T|dbUZE_P?=o ze&MX<;k)!}$#H#yHbDAOf(M!w)+T7^T+T=CU4e%Y z9Y3-^slpmJ@ae>CYa=6kc872Nh21t@JBYc#=fZ4EGelCJ6@DUNS&q74EHYXEui^9J6=vi&yw~g(oSz zroz(|{+hy9lEQ0C)R3-lXKh@qaH`kzbG8XkPKw_;Wsmh1@heccRpBQUJ{h>^ zJ#|G$Q4IGKo~m%yJ~Bo)4kLcv3V&1KVG6IR@Mwj;W#EGeg_p!lPUV?3WqX8{9OA=`B1fppSQv_8GmGfYA&(UUHl>y zL%PE43V&DO2@1#AGx1AOxSPVA&GK}GPf_+`6h24c$s+whT%ib5H|ghW&)<`%VV$y{ zr|^RcpQ&(N;bw*3Q}`@}yZ4hRFk9g^g{Re3gh)jQR=BexsitsehZ3mpc&7k`Cn-Er z;pqx@C_G!?a}~Zq;x8L;x03j+Q4HP+Kd5kjh3g8Rr0{zRpP_K?{xXJh6duw)r;%NI zQl+iCS+=3>lT@#w7;Nh$Jy*dwPQJ3S0e`i(R=<7U7#GpqjZiQf(57Ti6?1l%?p>V~ zRCc%Cz-|23K3Y&0bmOffQn&HK#1M3V#FzC)74F|$1@KqE(q5>aP$SKd^ zBmQUQQd(eer&QxMiX#fO6GYBz;P6zHB-Z|q( z-n5G=_lEf5`DYKYDnVAyCeb~x+CZltiAb*f&tgXO>^hQOa7k=MR_}(KD|5iC%J(RyaNE;Gr>roz1XPVHUU_9u~ zAN3&zfk*T1Ntk8#{HF^_0%u2>1ba%I>R?|avupk z8=&YxDhf=fAdu*Zz@N=NqE{41945Ze$`cdZXG3W3{ZEg{K{DvhA9+0GIeZkr6&3i%#hQQN zi|hkik^W$!(qad}21vj15dJf%3;u=gPZFqp6c9t-=gSKL-T4#sE$kV_?7FhP{9E7d zq=!{9it3W2_y;T8Y5#wKX+psNf$=H6b;`p{%ELm1yC~f5CnGRN;lA}`K%MnAI#A-d z;c3z^ucd@>5fZkmCZTIB3EdS8>mc!U?Iny1mCzXhUD@Aj@ig5zYB~FYq_1csp?8{x zG$gx8=p1)B1t$8-n5;A@ht=fxZbVfHx2u>$`bxfR7fJV4F}Z zorM1@OzI~+NKr6d!FdW6RPa!a_Y$9pqBAQhHnyVm{ujQVKzII#FSi1pvj`9@d4}(v zyo#q!Uh4 zfq0h>8m09}^B7c~ER?Jvz-@r^BRN!dC~L-7;3F65z@InP*;Ij#lC$7B@<^`x%fer& zi6alZ`Jn+?Eh`x-j;e{vUT!r*Is;MaE|!*C9jstQt_sVoD$WlmP~QCY1o%bas91c+ z@A!YWno@4HVz3B3_+>Cw3oE|2kLHnf5Oy|UBS#h`!7?Y-Et4sKcDaOcSt=(!mQYvp zNAF8KI9tNpg%Tz!IAejryG)#rGIEMj7iviEI%VYW)Rdf?N!a#W!}pc)5K_ECc#VN7 z%Jyfh;)RtAd@}4R2Hu(d&!%8@1wKl~+5XMiwl_q=6a`m*BLkiErG$$bNc)od z(w(XcY5%Iya8{P1N&qErH2sn9h^jqA3bKE#JXkHE)14D~D|$O6$4QrPM7a(nMKLBd zcv^7CS5mO6^2pl>75{1_I9k@pC$bLR|#|1OX$qpsqn}7qo8C< zfB7~ymzp`9CTgD=jqCWZftpv1inWC}3;B;IRifxH*P(pSaIJn?^3bP4?d*LPf$sc~ z+Z7e~C=;EbIaq;@TogXT7v1QoBJ*sC`DYQ*RkAsUWg#bJ^lb|6Jty%gMDurTl43kapKdoX&1l{?gY)m2- zir|z?aQQQQtN(@XA4Lj$Hn`^rFKcf9kG1!KtE$TS|IdY^UJw-&6%_TVq-3b5sQ4$n znH8xesTG;oRZ+>T$gIfBOJ+r8MP?mRD>5r8D>P?h$|-7`iOOcEoMOrvDtjJg9&2um zHB4Fk-s|jj*Yd_Lrd;Rq6zhLGmGu@hua6T6*h{ie z@|{oT>A`Gyo1#*;$o=VfYmxKxy!gK1%IsfUFpiD5H`4!sTL1rY{Rmra7m&iCCZO00 z$bYUMl{&uvck2fW(*HKz8Ml}NN$?aCSV4EQ!73Gt6!TL}{s!gVis)g9j?{Jy*uC_Z zyDZ+df0aXpke}x7rf#t|<`ybc-C%E)KN=5e~>g4)1JBfFAYKoe0 z;yEG{u4hWp;?^lD`&+;naS2mY)EQAlVpMF3WFl{kDiYJ0)}p31MUmE`IZImGG7fL1 zE%$DccUe${iCn!jfk9A`L|dj)udu(_k_C$M6sIcAQT&g6L4V>(YEvE>X3s2>2L4YS zmklrh6lNMs8e}kE^H-kaytXQS*n)zk$FEh9VP=YYCz>Y;Fi%fJz4Bw5ug$RLIsF&# zwp?+sGk!sQ-)U*Xjr-c^CLC`i^6>xs6w7({M&9UbKF?XTI{wTlmFlf(|P;68@sMzEp3)3OZXjVL|7*RZ;*rIq;(Yn)&h^^>XOj1l%OjS%%%uoyn%EFkb z8Ci;|12E($y)@eqQqP4*|3Md8@LyF~! z)rt*@5yiB-O#M8?e8m}xg^I;@#hcsD8#JR*v0AZKu~D%_F>tqOAYZXWu}ZN{u~{+s z9%CO=EK#huC(jgAX@<^9t5$h~VnoqjVeGRi_H4U3{^1VciCfJY!6>?ET^ru`tSJvX zXVAO7?BUTnO@3&D!Flf*ELHUUHmcvPdrWzw!IP}uPLr`(aqFK9_Zm3(mOgMg#mn(r z@;{^8>EiJwZNjr#sl4D={+{vc<9qn_G~62>@`Xe9>(D7SDFz-e`6Y@CiUG&uhZL(6 zn-l|;TCP~5nEasTE7ln7ZPjZ=lVU_MZ}Xlv?~6aTz3f_UDtXv=SgBa5xLUDHah+nh z;s(V{idBl$inWUS6dM!|8Vp-ansG?6S@E!9MDd7Xi{ep5>k$*Ut>{-wR!mdORLoX1 z{^@_NW=vF^s#u^HQY=<1Ra~c7u2`X1rC6&di-)9oNwHb6MKSqN6KFtD8j#-S zC=V(YD25)5Kg%^J)r@k*D#hK3dll;yn-u-qw83qA67P=xLwv6S%?K%$D3)z=MsALu zvFEnU@rg-ppJj_Q?KRcq1XEJ8ayh}26jAP-M7AiGOF>Eg-lDP z)Cw3Lc0W}ld0A?Zs0KO8y+`!&lqYF)@TCUuCaJ52tn)1XrztN}e!B8<Y|W@vK23Rz^6AQJm7lA; zPWepb^~wvBHz>bAd86_Rm4}-&W3Fa2D_^WUqFg4bq!#5qZy|Waj9{GdWaaV71IlgX zWx5KrGdyhNs6l%*2rBQOyg<2Mc}RJJ@_;(*sJukWla!Y!@1(p!d1sf?tt!pvq6Rg} zla<#gPf_lzt6i0Q>uNXU4QijNyh(X?rPA4^UpCe4z3=<(bMGl%J%$N%0V} z6>4BB_s*L-D6i7;1m!i#<@<7y>XaubZ&04Byh(XC%Fpc#SRn-RENd5&_Qp0ov(+sX@+cTgTuo}j!$d7|<%4DNHOdo|*C|g_-k`jf@+RdIl(#7N1(?|+ z|Ldm52?3W{Y047~4_jH9F+mOTl>0JGg?!I}@~oBLvuCfo#j{uLuQwy$%Qg0C$`gdk{-328iE5DNRmd|H z^1X89g`s|{~f z-b;B){hkkh9pBj(f30=-p3nEhckdYXP8+9~8dkoZM(UVa!4J$JU9IKb<)~7tK+797 zBc%L8}2<-buLQNB;P)o40& z(B*9AWX(!zSm-ekjHSjKenw8(K6_T}r zcT1r~%XL;ByM^H0V(|aP4DmLtpQij?bptU(RZluuWlrMymgp7QsU=V%WTl;>;tJIV`{f2_P%dH4g(DAkNN zm6t33mGVmEuPU!ren5Gx^6kp&l|QSzQTbn$Hya+d?$eAGHE2@q|HzEUOUl!f|516C z@=ulLDgQ`$zVc6$7b^dY@?w`W{(sO6OZQ{%CQGSS@GiLXwA{N%Qm*C8wSJnGdpBJw zwY*r%^K=s>DzBDu+5R&$qfi|TQ(mhMu2CLT2OX8yYxySSjmjTa-mLsNOjwltYR&HUdv0Bd-q5R)V`CJmuvY<FVKjGDsR#970OGre1vlU z$EE|N%4@ZJyz(?HU#mP^q5-66hIiX(vhpmgaEJ0d<+GKSY6Byc=WF>5%9FMHB;|!# zzSQurc->p2T_NOQ>*YYcrS1P|nd4t-Ys=QjuZ*w_QwN4Ets6nk7 ztW#dBNaH8@?Ex%QHv+^gEwHAI&INgG-fHXoI7bS8Dlc<;~h)KzX&6FI3*B<$aacYI#U`x%ijupQ{=5 zYVfe~CgnFO4`@JxmA7d5Wy<}ZnoV?-@-*e~%CnSzraTXRt{m+uG$UUP9#vkbe3$ZK zOJpSwZc{deZ2zi9iOE6)2*4-xybp}9LqZj zSbK(k5k-2YE*kQ2A*6Oqe>hmUL%Jn z7oP0AdW}AiI%8$4Hz_J~i{#tt$7+>hBD@9+fRd!)suAYlu1y2XW?82g2pH}?gccZi zyj{^TJLk=R#m`UAA7#oL`kBW%YZU98(^}&Dom`S@imjohxKeq}DaV_K_T14Df1&S` zbF^iwd^ z`y~Kfj=&Z022he`C+Lr|6P^qYfRdu^q8pZ3;GYz2$L{UT%V*%4E4TDU&n(Y$nQ9 z%C@#C<0RdA?8o>e@fEiDQeRTRR5P~=LHTxHcc*NX&yG2m1o%;vZ~BSLz_oU}Ak<3* z=xx19nN-ukx1v3ZEA?E1Nfnf@0E*|TYmWEaa01U#EtY3-rJlu}0ORUaY?3i=H?Yz3p~+QEqCYbm?6w)x8wm({iyh zJuMIueiG*^g)te%Pob(n=oxzzHzU9F3=?cP;U9_!JM^P1jA zs(1(eztra(_rCKb{;z~U?NX$?^%;?2Dsbf^k=&@p!YOy@y>ey%&M)@g@(xuOVhg#c+9?hWG znb9o4q!!92ASJT8bow0Sr5U}gSMe;>Vnrsd)N>ssc|6O(w<5)JP&`AuRE!?Wvs8=a zSzM{-BsT|8)r)e<6)!0@fMW5a5mh;bt+Mvt|y zNwrv=7gy@J5tCXd-#2rI)ko)}JU2z@(v+BcDZ2CG!rM@funO~Z4qreMkFpA%mhU~S zL){R1TespenR>B;6<_MQ0FxRhA4@ytx<1Nv(+ONly;!crm%6TysCkBn&#B?s-DLUR zBSi#PjIQ2glZkb#O(q`HVLc|bP`7&+ddSjTcG9$bfMiB+soJk-SJ*F1lP z-ZM@FSc1A&qQ{C=s>O;`T&d?0OzNS0gw7q;ZpV9WIe}-X7R$4^QqMIK zGmok989VXp#tijRDSE7!rCKb{;z~V7BxY!p@!TLWM|o~JfoG`}%d@yr&pF$OxjQj; zZ;cu1rBd`*F-x^rp2d}VF2^}Wx zqAo>`6|+=}Da=o& zx$aIuf4g0BlzX=+vyP=vvyvjduP1?3$@z7ZWj%VV-b%Gtf#J$KBOL4R)f!Yqx1N@>7T2EM?tJZ#+R& zuJgQBT}*qTl}C3wIpf%{cgo6WwP|)fjkhxrsTCrZ4~DUgp&fH7H~z^v6A9uso^?vB8hgp)IO~(2GFCNiFGVz&91YAMv6oSp6M z-bvD81Xq0c&T=08F+L+Hjc^!vi%;iij=08+#kcBAPRCMm{QYc;uhq%!#aAiYO@w+W z4?PXzwn?hRno53Wgr99tLvcA(`BI#C*Yk=)v^| zj*U=4AfPtRP`}-;V*ynP$>P&-5|Nx?pIYLX;JX|>R!CAWR!D`;PU&bR#f?!lpg-L*17sun`a+!p1Q zTqplitdC?>yS4QwXD@Aza$pUJy@Xm+jTNxCi%$92c_}*Jf&s_2MyF!h@KTnuGm)Vy zqgoZ&dhdDHBog+oL42PQmQqR%@?&~JM zd9^cr3hZE{2Q$)QrL!pq?xkRqE_q__rRbqcb6)L&yAZ_{RN>QH-b}BK@=%W+LGUU= zB-XKpNIXQR8th_j*DP`4-tg>})mlYc&;yQCPNS61km>H2_AKXfFh1IKtj{%3_3NT^ z2}A6?6y4`a=hbBTTu5>9$xICsjm#dW>LktsvdHvO0eUG?k3>$Ec2AdjvF_}Oujo{H zg66Bljk!-dzc#9lG!vb?RX>@`=bJEk?C*@vw0k9a{p2HCIsV8y$$7P_ z-8&)qIohH|&`C+Pd%MG)UIzD4HF^UQ$YugK3sO0H1xxLAL8`?XdT|w<3b6B1^w71q z&7G8tS1(B`(aAj#BO}>)w4L4W*vVMi!HqaOIc;-hWZM2?ohgw(yUEI)lpqnb;JUIk zFRtu4=Z~p&Uw7$u0)uV4pEb0#@f`FvvrYcVUY~YlxU!u--R;4qIpNLpfb)p%UUPNi zRpX#c^5lxtJy_L6xo<-E4|5L+%)Zm4Lagm0PL4~@$KHi=oDn_PC~`8CnvYvAX%lA7 zBm}8lPHD)smQx7x(@9i?di3LBOHY?tv9@x#^Jxz|!~YB`01F~t@9Cl4?^r>N;BeN9 z;qJ=d-V1|zsRX_4;vi*GE!O%ZuJnpIr-rIfzBVIkPTfi-p_FQhpvSs~lxnd&iz_|j z@?#RrA!a8fO)tjeJcb-Em7vFRE;VC04?6b_VnpgTFee+ICvNIjdfwd$(HP~u1zlTU zLZnNDSQDbI)oI5<8qOcVUOB=Y3_0hR2=!7adaQV*TC8~Uotx8Hhs!9grz+2C$Pmlz zj%cqf6h%h1w&JxW)na+AH(r}0R;ux2hj^7(!%<#J(PMd)YO%bEtLRjJg8FTJ26ndk z8y&qArHwk?VF*JnMcc8Xoy3mDbx^YN)Q|B=@wFpuXSmPq;irN)$rpoe?P|oIb9IK@ zE!>FOHV)TyZfg_5E23hHZZfNlUE!|QK1ACE+t^iNM{=L3Jno29C~=v^!dK#k>nV^5KeJ{}oxOJHbCJxyTs`I1Cs+Jt&tpAbcS?ub1L7|ond598ZujkM$-l%i z{}zwlIlmun_Y2qXWXv%6R&3@K?!#<>A@NoKpI%;OP7a6Hcq_)kw_DKUlxZsmsK z3=5`+!$$JlUbw*&6iQz6@pgq$IdXiS+epiCd2`%0tTUqg4K1AG8YYuj@(RJMkl|wl zY}?wMDOVUrtO?-*^azeV0fncbX`uEWmwu=ToiT#jF2HEy1hrDTE%7T$*pKM@kIHrnVqEpGgr)`#TA@#NuG(pePpEuXD+AzO-%cIo*x~y@Z4*zk;Yh|t$lf9 zlxU6QcKmlp`0U~ZD;5_`b)yWlvqF-$;+hqUGIQML+C$`(`Htm{lyj48CosxR?p%Cc zoK@|!-Q6!Z#F;e89x^S+W4>kNO`(dc83pVMlIDSAaiSUT=C1^$qzsfDa|0+(VpS?; z&31N;vd1hO)6M-Ru~i64c?&2HQa!>$Ny2{z$^%pfLGkm0@)0~mCHxFf+Ib8VySFs| zGtF<;!)boq?mb4DYI29jvNrMDu0)^Gr@hsuD8Wk0^;?Ov z+Lwq;EjB)VOgE#C^Vw*7Sc2qNke}(KkFie)%OF(7+16T`6*tKmVFoCXWPuV%u3`|B zZ8Jl;*Aud=H~Pz8RtHe(rVKE>*bYiBCJZ#ZDAR1;Et#x|;(VuOya~$0Sbvf+s0L-i zdOr zI|wBV!a{7MJVfWt(?|1e0449_lU*0qGEjKA^0*=DGrOJDD>vOr;LYl|63dc-&By0P zQ_Z>wJ4p|!{WHox9AY`|jkQxQkqr}|f~48{lEyjN>O9r9QrWQWXT`Z2wuN~n>0Qbt zaY1%md4raZ)Yo5baZby#m%9DrWZsfiqz@(ZQ_^Zs#;II4>L$&13;A<3OP-A9*j(Kq zLE*mvrQTbhq>n-I`wb|byNxz>Cxh4}S`$zto#TucXAkUAlV#d19cx*C8*hB2O>mZt zv!_f7P9iR(aI$UnZx?5^o72hV-;h@%dAO1CXx>`K`TIC~KsYC8Su>HnY9GygY3;1E z*HRn0hEfWWIr{V;>9%biruvi)gRkhi;LA;l9+fX8te@s;hZD#~|7*+g?^{{%b7ol^~G##^&!TAJOVbEj7E z*|~01)_#!4t^ZM8bg_oXFBYA@u}k7};tHgDL~5lEZf~U(B{QYFSpHphiR?=)v>{cc zjVgSPD0KCXKNq4%+EM7NooG*s+jp(=$BA|?!M{(m=MTtbt(D0dSz%e1ayZ?mf$c=! z>vCt=sdnFUJv)0P&mJQmsofOxbE0@culDTdU94U!dNie$bPGv6>DaB2VK9v}9~{z(V=UvF7M<&j%bLYm+0U>bhXHl{|pHYJyMwguQ-k6eVUV1n(l>;bI6 z+RpG*mh~dCnQ}p2oX?750{YrBCsxGe`20Tp^)o!d=iD>NKB>LC;?H$noMaCeSvr;T zA2$T^XBSTLl)t^kDCvoDR^rI^1zNB3WP9NN(QD_L!~fgVIe&xM5|@FJ)@*P#PPQi{ zid_?Sfm@vqC);COo_BG)^;m_|D`@u`B;_HvY{kw)&0q|F$oP5!l=Q|!&fK6qXo_t0 za%?w}C-&dbuB14vw|=urt^WpP1FYR*_zqC)|Fy+=EyyY$ZPsX;XKLM9il&BTz4C~u zlTc-HazXL=kn&pPnU9i5ny}5-Uk^%hl&7~@h#N1Cmopd3y4VbW8;mv248Y&DLj_xn zv-?3wFDOsx?YDZ*>Bb7s)#~_eho*KVc1SvtrS*H!3F+u~?aXNp8$Sy{*N^f)fYO;S zAGXH26-Lop$w)~%em@iE1vtNjmzl)z4p36N&CbXv_V~WCe-^~Ce|BO@E@b7vzVuSF zRSI`I>!;Ww-40ffC-q;~0KJohyAK<`Pl1x&Q~o(9@qDj5MV2?FviPr$^5xdi&b|lk zc**#C2bA>rOPo-Mqpvli_g-@V8V*XD0!m;h(t)+61Cgi(ntw3m?T;G!XuGsfytVax zQ@$6J6kQ&qJnaA%E7CyT0q3>T?UC-8S}_HZ=O1R!8;vi&H@4q_l6um(1Rwap88X%G z<<_mxx{)>`Irtx@ZZ0TkB`9@o`iHZMx;BIY=o4z*r312(C&ag+i?fDm&_R4jT|GL*%c!oX2oe?>dN&We{ z^{!OBeW&sJJ5bVFp!DO^T_%44C_FvAy_L?{ZS+Y{AwG*!Gnwci!z9!konIEzYB;bslw#a|nqyT|ost=!|xJ<}dPOa`l3gMV0U zpH|FZmWhunoo#2m^*bck~lyl$PKv{Ag1m((k2bci90!F7T zKN@xfl=@wMvSzvtvVSsHTjM}+@M};Ud;uncSGeJ@^-SCKD^D&;S~}buitg;^a|fU>AXc0ZfHEM_ho$^QPLFB!thwU51m9Br zB=rXmG`1IklH7$v&yy;#3!SR@?lC;k>O3p4Bq8K?4|R3wCka0T`#7&nv(Ftb{+r4F zE5}qfh6Jr2V>}V8Bv~eY znr!Oz44QglLD5o9O0@d;(yf$8m!?h)9qSTG{Gkpx=8#>ke)bKIFLE8W%P})3MR5e^ zrTHhB23`au9abI~Y#N%B#mNQv7lC526qMSxD{ptQ&$)4`o$mIuhL$C5?P8qOg3_ZD zceE1O2NRB6!8B@=(-`dx-Qu~Rq^ZiIS66GX8J&^XOPT~u>1+J2=v4INR{4pyVvecHTV4o|Pe+zkvFZ4sLY)KDT_YW2`!7ax-ZszcTy*@RXfVLiaWUF zln07T`9@IE>&jF5`K^9)lC0j?cbU~OBD<`_Ttgj+b^M6%~(T+pbp|n@2!tyyDa zX~z~_<@z0H-HamYZcq%HLD?4)OH6*>5@*(IJ>3mlX`F~7sUs4+==cjQhlacht@m#* zJ}+J6Hf9|HrH$WUBRSDWI`N&(L$8T+C~;%^5;+AAN*jSBD^MKg#LuxWbLV~yhT`NE z?a`kUd){uGUj#}zQf@lX^$x=q+~GVu$L=*&M!ZpdB#b!Ofzcxk*;StaeTDC2{VKR%+TD`18y*z5B~% zQ*rnf<1o0zNxZ=BwM2HDDk`nOxj4Q!s$Sw&Qzsjgv;`DxyXKoU-yHJ%v&@=bkFR$& zntDy3q_gjH*3*_d-y@Vu%2AtZ)F#&Il~xjO{bRlHbv^?kDb`^&h@HeflGtZ$GWN?s zN!KgqW>S}9caw^#P8K6z@pl*ZnA z+}OPXN{YT?6~eCF6Q;cFF{PX`NoQ31E_EZHQ*9hv3X0~Q6l^n>ZZ+4M;I5~^51%&< ze*`5>uQ9ys>1iW%Bn{l*%qq0Un;$~1GkJA8oz3K(DV+&iZ+zc^Z%Owleo<%q{s2lk z`&AQHbO#$tQ*5BOR*DQ&ufe|?-~2IKuO;!k2Nc+wC-cn6(6$7 zu5a-5bcxeo96Sw*_CkX*cdot7y()^VG8I12M!!;A-)tIx0+e*P*%@-N-OIh~OuNz4 z@r^PaOHp(V8{0QP(f&($+l?2bzNAyWaW-CT4|1=xiq+>hM zw2|@J$TU#gU!Yu2y08S4%bpuF-~W{fBJ(RoUet5Q5W}UQ7~cGq^X5EzNKfgBf3+Ef zs-va{`;PjYj+fYd%2+E>&Q0;wUEDbovz>`fulaT__qbF@zT~~Hz8>vlY<>qy8qwMC=>4aR zI`cX^E9UDtS#XW<@tOL#Jk``$3rcGH^GC7TXXKiJ>dpVtl^905|5x`v?JLy&XZ62B z{r@pl&#iRYBRqmFre$-OM_ekm+hf9L6l zU84A4IL-9*B~a44pfnU~DXCE>-i3+;bA%f*?r8Kf^*e&5zT5#f*CuHrkG}&xzBhLa zkktg?RD|pdcQI^K?DDOr#QP7*w?vx^Fq6?;IxJInbX83|CV^GVw&;01(fsz=niR& z%e@lpC5EoFed}~n@8RjrhYRf?bL3RAid#PkY|^xMQ**o@82ZhKvnC^bsUzs?z#XNv ze3&Q)TW*|on$r4XME_ZFRu1w!wzENJ`64^uR4lUd28lZfa0nm$iC-FLy^e|CAmr?0 z-1%w|XBuKFgLB7?aaRA;an`yq@h(n>=fgL{CEbF4M-)%zQ{>6-y4$v)eH}j{h2q?9 zNV}KZ5NEAL{+o6Mg@2DEsV}!%Q`~Mj&llP0#{%|U9%qeSZpQQ~@O(s2#`vn`&R0ct zj~?DwJwblP6{c+D6;7|k_5%xLT$^NE<%gT7v6_EJoV5fIKY|JJgUv`2u;g`Ek1yo6 z1Spu&ru_R2aaQtOan?s;oL)<~KkUV@^PV`XdqtepacsO50#mx!R+rrNR+o_-kNv20 zEjDYAug5scme^yC{V+AIGR`_3`C11hR^1;R?x{xE_>vgJ73~UQ+4g!k&bkE|L@bh0 zy0+(6(qyaauFg$KB^|vV%Q{-M7=<2*vrZf93|Y#dA|+9-am=F&UdPrv7iS$s=6lZC z49KjVan@zX^<$k~#rD8(0%N){uD~a_A}(fpf5H53$S?KxqFronXHoe*o zdO8M!T_fj{rFP%0Ucc^nk-Y(_80&N{wtG#Je3`K??`5X{HqLrl``h>BIBOK*@mK>s z=A}4m24aGB-YvFA_L2!$!i+M%0H4Dz!1?+Mu+#T4v!G16%D?bkce>Rn`Rf%G2PGt#}O zTSH1+mt&LkqYs(HAH~I6KaF*|F0;qDE8j8`@Umt00O5Bp7M6IyWAc!(Hr#mFXF6e$n{<@?u2V^@k{5i0M7q=oV64gnrCLOlfB#yNUP^A zxBEF?F0;qFV_QJe?%4X)TkV_dhPXQUW!`!Ca=Y&!>$^DXVr0hE=128tp5BcGVVi6F z8KH^e&dYhWeED)a``8|NWn#Q_EpjF?2*%n7|0aK2$M|Cdo6fzZWX?pBR~$Rcxxc07 z5U3B^#Ns%&;q;+AR^a2u#7IJuxu}+3-7R@mWtbKDJl_4Lpd2n%(D>?9bLjXtC~0R; z!+o->IsGrQd%F`w+DPx#dJ$N1)R;>ZS=D4>CtYI>t@3RqNx#Rv9$H;4f0Dl;St~G_3Mye7yBVKj-gP*nQ8I2@%0b3hyrV&FyY={YLNUQ%U+W5a*Ko1J$wo z{>Q9!54+gplP`AZ&b=4#Fs@`L|9E^qq%SS>BPf0}?b3b-UD4mzSAnjp#MWQY#aBvy zztw+bN1oA2w9>gD+i6xpleCjZnb_ZtFG;ue;TL1csO{tY{YtyUVX$bs?DN`ManD;DZaluN`#-W1 zI<}A(xXz7(r{ph|&umGGc3Bj|rF`G3t=(#E#x2l4Uem?b+4uj+?%uJSrdpfpAs^vt z>n3vEz5Tn5-146Vdw;=y%XPN%e4O3AOW=B*2SsYUKBZqQU#g03goo6u4Hvpu$Nh1? zszr|1cd^ThVdwR!;(F7k8k*Bh$qRqm$iZTIqkz z2B{!l-H{aSZ__$A>$pFjzrs>8y{4C(z@dC0MUv+*fPR#vwr%np*5dH_^b-dtUony7 z`I8RU?Q*k@`{VgbyTNw4*!a64c8BHr1d^it75{?2Qv6*d19$>|^2L(2{xHyUIBSH9ElDQTNLe=YcPXW)&o9M3UBmg;0YYc7f9MVJn{<;YjNn#z!UhB zua30!xBD0TrLEQ(xH@)+ef>_-kDpCDg^oxZE=h2a|Bqwvxp^qi@jxJ2dIw{kW_UQJo6-K5*F3vzZB zW%nI<^{4ZsMwDIQ?bN}pD$1^eya4_*-FtFMc$k=x`YLu+j8mMds8y^nge2))#U+Ys z6mL^}K=BF1y^3!tzHcyW9ny?%6#eu?QfKAa%4_a6`P&p9P+Y56q8L&t5!s-)U9nd2O~p?Xk0|=fjh_LEBL(GIhkVUg zsJKFLjp7Ey&5GLOD25bQg3`WKp&3so?p171{7msX#Uve> z48^I6OBB~AKA`xV;+u+x6pyagf9%-nP7`Ui;zY%B73V3ID&DQQO>wv4KE(ry|D||D z(Z9j8lc^Zoz|JVCP&1Y(u2H;OajRmD;%kZxivOi}MA6c@lBAfSn5{To@yxI)a}}2< zu2#HFaiikHiZzO_DZ0Jj&kUWsa}}Eu_ba}v_?+UjDpe{JmnoJhdX5+BEcUp(0v4UV zTIb9P+j~3Q(r)(h#fwXvPG$DkJu}Me?f$^bcC#0+oV~Irf5DYS%NJYLhjC{KUvb%$ zOXu8BviL$L`3^fGpIxqC!c>HFuFy}AD;6k*6w4GV6>Ajh6dM&IivBB&KQG$I%Hz3p z?Q#4ZEBW{gE6|4LwBZG9cqocHb(8E=r_Hl+lH)rn#JKJu#&*m+9K7#arsAb#12dTlAtW#41JB+`oXARbD;TzZZ%1x`-XqU;c zEV9Yq>FB;V+rKApx1H0@N#108|8125QX@Xae$M{?e=w}+p!zLTzfm~EZ7?b$CLcyn z!yI1`!$r`+xZqr8)+T$9;3~xzx7xj&y_@V*$$VEczgHY^zcHSsxI%IB{q``ifAfBB z)`4*k*yjq)QrxEajp7u?ly6l0OmSqTeWuh~RmsghaC4>lRs6ov_#gS8JxR(}DDHaD z|Wb!+UvT-_@BGQ*uPoH_bZ;=VhsI4o)>dP=eyfRu z;c+7bPjQAmWNNzPCMDY*GHs227~h>9woeh?5O-i!JZ#+VQvP@4Lmn~Z3m-9+cRga7 z`Th}OKfX%qS84NACjWcQ2YWl`JZg87#uh$mj5jO3`>1h>vwqHL+w9?D^kS7g(D~s} z?Z7rujv1XhYV^3goF#eVMvW*MQ8aGks09l~Iw?Esq5r$p z{2j*{a%cF9JKQ~C&xbqg!9H2=17Yr>1(3)D+sX#dR6QTOMD;Q-l!6U!ISc0Z;5N-T zPP{>0RkH%)IY|cNdhr7RdNTN0Z+@*pkAN4l-pboxA@J8o33?qkx(}yc6_6kb|3<^A zMd#mYSepVo7>iy7?nETGI`C6O90mGw=MRy5!IK7a6IFCDlNTWUr=o*C-ghh(9W2b| z{t$WyycrQc71^AAeG6%zfPdIw-Hk-h`DYwf1WB7j55O#zI;oHYhEx|UMI?wauvYWy zBu{lg|8QfI3|@?6;xh#P5y_VSYu$j-DaSM*uMA#@xJKXyNFEiMz&<04O#u8H$(P{3 z^`m*08odHsHh~5wbEOH6o5bY@dh6?p_HnN^$}5g@!;^U%3ZuE;yU12_!NEZueM8Ry zXCiyi1@AhI9~#gF??al=qu*crhP;ha2_ncls^Bw77JBPzinjZ@;;CnHy+(dml(|R| zBm@r3=d}~`==T=oea3H*O7aEMW)K{@T`u$ON1NUXO%mcsuyk95X`u!Ba0_ z_nSh`z%kr_ZNNru#NL5OUAcMt->Nr*ZxmYAA?W}(_#y%dGb~vsXA41}0p5*BeWb&4S|3p?|lW~b<%}3k`4u&`J zM;r;hfk+Ssz&Z07c6wF}zKzKHtPNnorKWNNIBo%U*yMvDMEnR|uX+u55Sf8Z3wZWI z6T}Sg282$At#v4mAkuIZ_yz1-Bq6@x&xHe#7v8kK{ez@EOeFW@w zg|SHmN2#6*UWL@*rv%)G$Q(Kf_P)~CXM|BEC@BTEt1fuORd6bogL@DOq8aQ^Vx0QH z!HDDs!Ams16m&Gd9!$O347=cki1fY&d>Eo z*MaA*q|WIaguq+)oh~1J9r!9D6HR`*`xKG7hrr3#v0P&#kKew6l%dyM$NqoH^(-uq zZ166m4!sh52a(DLK!2&x1^cKT0P|HByhQa7Sck~+EEv&zLHh>dNAMh^ctV&Spk%FL zn5METg0CWn31T1EjL5_k>~^EkQ^7^57lAh-66k8MM)L)4Ud^6@&vl@Kh)pFp>LwmC zB0m>=G|ZoD$ab*%8fGfG`~-6$A`O>krs*f)V2n8?-WHQ-x1sSkpK zZsrjv^0UAqM7F(PmFi(pdf&o!#V7|HvyRz+2D=}4J|aPE0^d{p0NCkP<0u(C1qorF z4gLiwML!7U-)3wCUqHmqZZL4W$rqe|yR8326oPEk0>PSc_E#JU{t=O(YXHAR#8C^_ z>kgBj4Su3}*?Qi3yVC>_0PjN%(y>k8+eiex0UW-;=s7ZMUqMyfn`WqnBK2L zc>cBY< zay5-l!Ty_>uxGLUXQHHRWfRD-gP$ONjGDlthnex@3(kCmAjmHOzu!jh7*hEyaN1*L zgl2%d5D8*8_?_mrfJe8RIg#`@^+ed4O2D@tXZy=S(EvGuNM*sgCrkyw_SI%G`oTGf zR2F;%kxkPGPI!t&2yP;H4Mh`@&$0bw)tiHICn6O#fG;5u z&|z@Q^QPf4@J-bZfx~J{ehv5~BK8rm*G{8nfM*~wqWR#`T?99s^9k@tMDqFRHEjK? zB>4r)I%_wFV2tv?MMx?=D*>nc%2b#NTE9kS*e>Rv%cumw`aNtm>Ixo4+zxrKce=o};4HtrOzvW738XtWG&qd_ORsf#-Dgj}i z4Q@wr&tVA%pZuL^tQtJ+_iS47r-Hp-XLQjsz%6eWeJglY_)Q|GARkQM&o!GEfuj)V zK`uDsZT4Ln6HIxBZH`SUIQCu6hSBrDyWV5jMy~+hM5Jy5IO_lt{A@Ncc;BBHAv!bX zeam_u$s#}O|A5(xNQH^u?TyB1Ie73d^b#Y%Q$IAl4}yaZGMgEpEO5}rCO->o{wtG^ zKm|Yl)YLr$?)l7|$kc)z4>3XnngsUvg6%K6U)mR3n;|j*=Yh@t%_hM}u{DV_+I#2}$zoujKUT`}iCm`FuX8(Wq zpX?%3I07bp%Qj zEclU;DB!RQ&f>TC8RxPI!21yQ{9k_Ie@_UT-~bp=UGPwx&y7^Dz3p=kNPaL25&K+l zj_S+7dF^~w8n0jrUXLWxSSk1zBKF(CMnpzhFdX0B6!7A@HC*)^@M6{Hfw!w(4(>&y zvfzJfelxg`Ck9KUm*7i?Trcbehx2ZA75O<}AQ3swcJV3n#@Vd@J5VNcB+@xdKyVu( zi_&&*dXmpQc+3E=L}ZedfG;4@o84eH9{Q4iQo)-L*+t91gQ_0_2X;1fGr{+eJc2j? ze$^$+P|jiv=;E`^Pd1ec!IM*PKz=qjiMIg`qX)s)5ow?vY{zqd(r_|38p&ta^T4Hu z1Xm2+hDgxm;4am7gFRAx){fas{4mNbh*Vey9zmo5t25Yv zi%1Und%-}O$rrp0k>JX~L_U}(Hc4Qm>Vk2-+5WW>HOdzmJUhp*G=twG((qBq>+7?E zY(K$+NChJyIFGlv3(*CgfX^zxPdzxTzX@Un_$pFKFM|Vo)_g=d83JEJWPThRz(4$5 zGtg%prE)DeKhwI}=$T;E5F8O)HF)zWY(ILl4&0dSvodI)4jenwG@J)+L9*$6 z9eDXL<`y=~!6_qrRtfr4u+K=J)xa+{e3sN_eTzs$E#Q-*d{#37)q&G zreX4P!3~HEui*2D^sELPFvbLt36>yYBY05r1+N^-T#A#guZ zk1jZEf^ixGZ$PB6)!^L|SxgA70{jt?y~g5G2&G6Cb!)+#Nv1KuortV@&ESB^KKH~V zoQd)ha)6%g1+NNHz)+Wfznx;{L>+kF>Bi9}@Xe_{K4!-D0|%U8dU*s~b*9fMCx12g z5h4@$AUNPGW0MJ9g-8cVz!%P9`wQ6(c_iNqbrsn4Y*Qf>ybp2D;laO7qXE{5Ch#aC zbpVgj<5=1pPVusOk!P!Xe1uVle!t4SNaa0EGMr4}_jyTt>Xu058L>#RH z|BdWFpN7F@Gfn<-@Nq=yR)fzK_^cvqYQW%mX5{k0J&3eb3#QD%Ue5nhQ9eYZmxsao zX0tTX%T3_o^O?OkssyK9U>cYK{vMHiI_E;4bylIt&j*hp?yd_CyU65E1;0R~0}=4~ zxkj%6!(U#^!og5Pz)R=(tQHzu2mTt7TPAhjANdkN0r>~PKh38{1lIsAyVPgZlD{0x z37Lk2;46r9rVf;+xujvi+Y#w~6(~=QRbC+H|0s(PDJTN(MWhFtz?YDw3z?YU-;jFr z!=QgL_5>{$KnljccMJWVMzlNa6F9zR6lF=K%f|aZR z_z}#wmQ98(Scphlg5}q-{fnuv8|58D8an`9b-kIfCE&jhIo)mnCzYCE41!l9_C*Xe z_yQtM|)7lYM^TnPz&vC3y9QMY*&`~P`28mG$zSDPRN*CJA3#!Wu! z&xmZ-CeharIh7m1>)3oU5~bi{hy<}6`~(sE)nz{Ge{NzHU53Ep~}&)SN95WM;h<^uXkuufziGaTH%-sj$?6TJLRf+l|-_`3~k zf{SVFF7|sw0<8tt-)&aa4d4%9{#4CnF#!iuu-(uz!8J$=dKvg%kAV`uHRpllLK?wHlGlCpdIFdkX$@z{QVqbVV-) z*FUc7{|3mDh%{CWeum^-!i__4{1Z4rp9n5Rq&LOj6NtOqg70bm0q|$lttZ*d5R1BH zU|Kc)X*dJC1}Pr<4a`TRVZnb(KKrr#3?qWbN+(#2 zh)oUHu!A1cfZ+Yln*2)eQ$&J31P*-;UDp2`lpBS}j0NrI+4fWxJRgzevk-g`5u2^x z+!`9hW*+z?;*K0RaHnZ36RbqUUhtnt=6o)4z^q*+Uod>Dl7ryn7ffUM;9n708IyOj zJ0Wu7&;)kc5f`9rgs~AoXfv>-8t_$kHg|C={P%)TZXEsd+_?+mBT#ewX z9FD0gxaBpo$+m(Yyrv69Bjo&jObSk$3c;s;ZyfCaC;!1j9R&Z3$f#_3ojs=BtdfF% zLga+A0sQCicH#@?d(I`Cy=-lZ&D;73Tfg@~F_GX7|s3SQ8_$z+I; z0RMp0QlTDv;9U+d=#^mhd#1;N1&9P8SgN|<)IYnOG-tpq;H4kClgkQ$4F z5_}7hy8A)<6Ir0b>}Dtv5IKFG2%h>^mQ|t-fmT?bUoa!$b9Y_A_rJzxkmCqA;~VN?9~R|L zh&0>)+W$1eC3w>jvqzMHKYnX;>pMp4U#77H?k>#3t}2Uz`aJtVd)X2)2ulb4S!4AC9xeL8SK+!AiuPEZ{#i{|I=VZSv=U z_o!Y0?pIy#YTje5BZ!rPysTP7aDt0?WlTn>2z(u>B)EF;f{t<4#PAe$Gn6Vs8Wxl{ zaYeVmXAoIfc7Puva+9G6EaN*1bu!f8WWKdfj~)cCLaZW={or;){0RP2^&{XFT}*xn z82*4i()&g*E7=regO{it0`EY?rV@Myk>mOSFup7HG-iV%5wV#HcHqT9`9azb&K8~g zIiQ0`KsDgMjUKj+qU7^s1}T^W-i>7Av;zDdDMvpFp2=4p3ek(eFd|O3gI^&MPy|fk zLkn{35FCosV!s=l$@dXj&U8?FavXNN17<#93z{Vv`T9QN0YT9>{C> zoQMh*X3`!p0k0d(8?aQ~1YVdG=iV_{3GPQ^69_(c zGWF+U56b%#@{^n3VMInwaP%q6e0=7e!iPAPL!@9U_#Ps?IRIMOIz-?s)k8z$tosqM zuLQqAq?bp)3ByeOM6d;s2`E@JoL!Ea5`yokegK@D!xwhWVEqrGbRIzkB1#5lBND_M zFnJ`CWdZr%&4`@CuLI|eVi&|-@M%PX*a7|nk-8D^zFbC>%dSn}z|jmh_L<-Vh}!{h zNO+7H#%yrhcoq$eCW7luWip}*1}9U28_|NjPop>FXMm9@G|Z)$;Pk1y3(Res8Q_Cw zFae7hQE=Ir*kQjM>~Z*G8leIF77_m~;GRM@Q}{9pP(DY}&?8{?OITdcbHE^yg(6&LQJeUSOJuxI+itqq@AX^e5FDz`}*> z5d(s;0VMAVP71DM zwxj#O%T};nqb~54^zRlh)u&a zU<64<$^>VtJ_p=_ z$Yj|Hj=jSKGy`0Y1aTzz8X`9Pz#;272$7!+K7vSRs=yx+S!1j_`>uKx8uszJW+%P2l299PIbXQBhtwxFz}Gk1#f(a?JpH7Alnhq1$V11_&3!LgGW^teBfb@ z?KE5omOjFn61w1@k$LEi;H)aM?dO1xAQD6k`1p2?wAfT{4|C@8I46pbmEdQH7zLh) zvmQd~$ZrP6JZXkH4=h9^P{C5w1;0e3ZUh`!&6yIDItOh3v>7=+cmX0dh2RsS%k!Vr zC=o3X9P^AZ$^+M^UIxB{$V58;j^1H(wN`}hy>jT_Ib|i z(g85MfInhX1a^Nu&e}(h)4)Q+jTAh+h9lJ#tO4NUo#tp31aCx|v0n}DMWkWDACO$^ zkAmZNG2786f;S_D=mJk)UQkfx!|>k z1Xl`<|Fy}V2!4)8{vmM79+STn{4?VA9{gVQqu|_Hw!c)ESIaK(8#9beV9JXoKNUPf z^?dM3L>!fXpCJ1Q?l9QvB}NWC16+XQT*-)n8#RA7nENu{O~Xd;Rz%t@52Nf;(g=Q9 z7iZ0(@*%M7HF|IkXFlMNeXM-s=YloJ26Vw?f57G{RzvV_h@5;L23Nms79zn*-(b(d zJ_HVUi&Js*OzwB9{|5>GIOf4SEh(g`}2nTmbX_$_iS-`M)R+A#yog z1+!C@Nw8j<`X|4(mM0#4P|{?D+T5K?4FaiYN# z`w$`JxMgS{h0uf$N``}I+?+}pl*Xg^m^sEqjW@0aN~Kb1yoySqC>0I*zwhC6)xF=- z_dVbD{Cl3&@7-&!wf4LBTI*fw-S+vtfHC#mHxmnZACe=~eFzxQ(ETK$0MA1TfqXGi z&!Dg1;3#0|^X{n?4)_cbHX8MUL2GL4uB`kLwo{OBc0>UVZt5~G!cH{wVdQ|w;p0#-rFfij4@=sND1)(`V!H65Kz=X-&+8>YA|UPP{h5peLkakP)9l!p}Gw0S^y{i$VTTK#dXIbzK1OK*GUZ2l#db z^glML2xLjVkgDMh`~hnq)q+d{G15v%L^O;KKr=n2*gJLsRMm$82>B$S38V@zy%>cG zBTPwyHAKXyQ79u~l&El!5itrB=6g{fV8|ytK*Y#Ra?lVWMr29>84-gDVHpe#gn@xj z#vmscyaZ(oUVH!V$cN&4=`E-#_2#A5o2!TOe4ey z@g~Iih!}DL%V5X}3^#!?A_ieV84($!QAWgQ1Sn%50Spd+G9m$7;wS@BG^7>910=gg z9(RFQ6H5B}32!0(>VoY z3*svSe?RFgP-r5?5^O2jO8nWkQi)F!kxHj?1&n4QTp(;C90g~ZiJimYD@-QsJbaTW zEmRZg3N3^dBCg0qnWMPU>D9jNS3r`43g%!eTVXd%EC)#;n$? zjx1WXbhcu)TDIT=TvgEUhF}xbqFRw)&>Q#|k1ZJ4O6V}jLJNUYE8#}O!P60Bwi1?v zxYehvgsy!>T6LOYx>`CrT{oRfw@Bxvr=$zhbJB~`Po$ToSEN^`*QVE{CuZP<>oOWM zS~EH_XqnQPikY67KAAz8ahZvk$(aI|HsUfjC$|{BVW%ZSN5Q?gr23?Wr^cqnr6#5( zr>3L|Q*%;Jq?V>uq*kZarq-o4rnaU^r>UjsrjcnDY1}l&G(quOLf5D`??hf{UPWGY zUTt1oUSnQsUPm4+UpikgUoD@VubWTiTjX=|9rIoCJ@b9?1-uqQSFjKN({Cl%Y`ED% zZeg!yD};p-l=^;+VJ*ZcjbbJ(15}jsw4=~d7$l4pCc@({nfQ)K1lr6}SXQ7OEmtv@ zolE9&b6s+Ma>H}ua+7m~aG#~Q)wy-Kt+_OjqKGXb#Y4phhDn?#StJw{i%Lb+qB>El zNTB?lNR_GvYfBTHdQUXD(^|U~N-Rh&NGT8&-9m}_I4r^oV+-R76AP0I z>xvqST8ld1lX~#rP${9bur|Fly#s!?KuZR@C9wQRj8scbt4-@jQ-fagOi%3T#YQN$ z>n+5qNddL7gHC|z6`(u`qcIK?trgMobn{&DV)Js~ag+IR`PKRCf^g7C5r$`MVNPLf zp<B$w~=?L93X}&5q43&ZgzKk~193idQAx?E#qP%K(h!XFuO8)I zhQ)LzSV|0cSI$6E2@hnIE|aLy0T8To}R z=9rPDScR!%_`Qm&qpb^%4!KcHAMwSO2FKD0mq3DI}O-93ukTE(P z9(T-3ds*Qlo%3-T@?_e>9~Jrp8Pns!8e93ar`vSfH*Ld zT)Adh_LD6uUzLrYetdt_#@IK3JEhKAC+y8y`}V1I*;sXJZ-()?GVSRpWp(=rhTv-i(i_0_z6A$f4KyW0hYLyPRgybiCP&&t_B zl`R`B_rTXv-R}2$P4Phk?jAZGcIhnb=0JheVVOe7+iXE76KUR~d{-M1mGS4|L-RLtI=*X%;ImUXD)C$@oM`Ejpc8 zK`s+q>w@Sgy{85_LsEidB-l%C&KGA+dogfzwDnF{Z}`_FbizY;7^A-zVe1J?m1lPyY1O z$dF#9=2tfGA5EYEsRz9RCQzG_^yJUx&u%7rMp#&s#PXSfr#TB@lPr}cRyFLEqt3S zCyd%?l6QU4tb_B)t5RCI(+Q&>Dbmu3$m|&nzJi<+r~k>d*58PxmJz;V}gmy zpai90>(B8frY8Q;k-8&>NRwmxNX+CDFq4nS0pF*hH2k`V{*3{@nfcN5(G&jJ^idMS z0H!07jQ9uBF-cMaOvku?$8`K)Htc5NVC%6M@mo+&Eh2s$8NY_)3dakr6Radn@g2jU^-aUo{x=_a=U_*1v9H8fwHQ97%i9f+gE+im4C?_Wti1W3a`rm`JR6uLY^s zg7w#W)q6!dG`>8T*>TQ+UXwCnkTm0spT9vlm;_3)>%x5z><{3l01Dq$DXm~-PAN6o z)amLk^YoPGR??-p>fn=GImV9m=4yJ?vAW(VGr9dVPn|t9cHNwZvuoM%ErV2?ZucKH zbV}RE;AEv&{Zr}pzaDd5>J@#~LVscTht0MI8`3u3HJm>E-acVPz4NJ%9EY3EH-faN zO$?8*NAwnMUdYxz`Ia`{|5U|GT4z;8&8a6#pUSmzMRT0;S6yZCPcE?!maa89&hM(v^&CAxV{>4jz$S>JVs5c>{JM{q%8T|d zi&4M#c>A%hp$1=ebdD>TI>5}3{Jk;hfK>P%%2BC()14QZ`4%s7-WAA|ENc#I;qVpx zNWP*sgAVK6hX2Yk{n9WQ{_D-+-?y=X>2gwwsht6a*|(R!+nHpzZExwe%!cBr*8DQo zNX^p)Q_t!7Em_ms(8H#W;KOHrYmO=OO}Fi`V!xYXr{90dg-c!YKLoC?`nKuQ2>y}N z^3%iXsm(&cqE`ppCvK5GGAs{&D~S!d^W>MYIE?EcWrMLWHBCvGt?ArT`RhKU7_88dHqzw z-bbDj53gIsE%5qk9=32mnOAhAqw{e+jju!cr5`_@yV3hib^?D^za2a6<}@waf9^%S zrh)gPPj$8*j(s&=pe`Sw+3@1SBXxR)DkYbp+M4*jFS~h^{zGa*T@{~J5^iT0C^L4% zy6q{Y*&AnEt$A1{W9ZO&S~V%x?)_LszhS!BseAe%n*Hn+wGKAE?&k+-_WQ4Kkznq;bA=AsNk?rj+WRsz)Gp|{j?h|Ix>pw91s-~##;nlhcVV?D(QYN zfEzJ0bGBRX;sDnu-^JnRwBSB0fX5!ib}$7;Ya_|0q%2^U!S2~*ESEY|Gbw2L#E+Hh zZ|+myKcM&ELr*LI?2p?FRdQgr)(SHNc){4XA^KWIz4VowVE?GE6&Ov>w=bo{(e=|~ zgTrLOmK5!71C+E6=y!&R2B~{q&p}|W6c#*y# zJzEsmp9U`o_7gunwrzJCQA@=ho4Le60~bw|l80>!2YLy}#LO&bkug8s;D6gKy5xv% zO|||-w@}^v0?y>Gb}pyA_ItTc+rNo7cTjxVEBANB^aAUMe3LCwixT#Xq?rg7I#v2B zPtiO5$34B1M$LXlo?N%-J2SaszQ(FoS$&>9rsgf?TGVW1y|7)ebnulc1sdmScW!;x zO1%#0DA;9bM3s#^5o>v2O=e3=(Ynpok}fT7x|wp!N=wsne|h_!oc1+O&fi!Oagn8W z)TUvz{D|`9(&L>vWlKyaeY-ri=KbNlQ=TO59`wHSrK$3rKQF~S*!sHb%r*~RO#9WG zsxF!L+sFLAGjZXChwX=^)Ld(n+3J04%~G=svH9vI)E1pG6I%^0h1~Insygo&yeX+| zxIJWXf2(aDwpZ?}cYJ-?RiVaQkPv$zb&O=^5(CdF@~2G->z{TqB>bre*Jy8YE;;+h zSv{515${eY@Z-Q^Qk8g2{zj2Y7yHdeOK|q!TQhm@r7UPBcl17qZuo==O z*`%iAn4~8R=-H=4iktSwrp4nIwll`0(J0bDs3#nmF#Ly7-3mlY2K6W&Y=zKe6l@+O zr9$cAZS^OHl3E!sKzrV7z}#2-KG#Q?kfSX|nfBUJ6#3n`obJ4qSC@Up_MKju1r--P z{|6`ec+96@M~8#118)D()W>8=pBsWc>OakY@s1+8i7Fm-d$jr-6T2>jCpFWuV#~tr zHa&Vc?Okd`eB#IKEd!r(^$MQPZBM&5(|=6_ssBjRS9JkP>Z4#63juYF!%SMMfAd>mu5UaAzS$J8nx+z~S@W#u zR8=3FRJsnKZR_+mtNFjSDb%lw%6FTBFQ~@A3S|1%3o1*})C4lRt=;!!=s#M8sQ=|M z^h>)}q_9EM@$g*mayQio2br@;*6~zF)WDd)_w2qJH~Sp7J~n8WZifbM`nU?2#1Ya~ou4M?L_37b9r2#M zMS2L&(IddAh+)nB*#5}GV!O>V!>o5+I#=QzD>-#4R*GcRLfm~lZnQBB&mYTs8=^zq zJSg8!J)~gm{NS(7Ys)sw;N;D&t&Eyc?-8PX&YcRo%*wNwT%x@spt;%n?XI2iBMiTu zP7%>9ZWRsZ?v-(E)$>^EIj?E0qwUaj&mJGWHRAAcuB+$L%`-SGryWeY^Vh7Iz?1UU zO8dgmuxD?IH|&+zy-V<{%Hib+yhHr!?a8lA-2cYHana^z5tif_(%ejFD&!;>_gJi` z$WdUKjAF$0O}upxTTgu7WoAAqDiTinifvc8l9W32^J}#jiKPU~xrhuV^(Dt(IW_;f zLYQA<_|KOh$9^x%=&g-!u&a003N(C`}eG=AWCqW8icCgAHzrzv*@bUXQSOZYpyx%}cRe zb8=Te)#I8)^)vLMX_E~ytFG*A%ys&BRMl&nZFz}J!t)QM)I@9hIh5+G`i!x+gGbyR zy7Ea};HvrgCC)|z_dMIDQ#8AOQ$((9r~Fcj+*JANM-SZ}zh~Jc?F&&?|8$T^IR9nq z@WUFrUapmHeAE=>6Y7&WbD4a_M9+uMI~|n|JUjQ8b~ffviZV}m*q@jB8*0&P%BLt_ z3>;jg$x2W5p5wN0e7)&xe!mMPR06{};^4~#b~Z~me8w!2&zLE8%r^c%?Yu_+yd$1q z%TQeYvjOkzDhT5<1ooOzM$`{`dE@VHh77^cCfM0EeYWPb&1%b2^IjLitRL!osqnDA$B(y#vIrflEX--cs}ad652|JrL%ly!{Zgo7vnmg^6A!H zA6(zeEz$bZw*%c4@t;yCc{)rHaR27mPYHIA-QIk7U|0Gpj>mql+9&g`ocEq7^71_Y zQud>u(DrPYsbyB*lv{Qw3d>A2lRi?Bs|UR1onC!s$z$htX^ZRLQI8Wn!)*JW@Sfyi z?{@b2R?R~P96s_j^baxCjnU683qG=Z{moM~I?vSYD^stV49m576EKf*&V7*Q>D)3} zO+S}?-G2+sQbC+{+UE{Hy|-YK&_6dkw8B{q&Y!?`(XsE&rl+ zCGS)IfLkq{e8v}!;I@ZQ>w=}hXp5~M*BSiAQ9N+GuAw3@)0oqK|6wMxZu?eE%V%#? l+%6h^`_?uw-OjEgaLv0EgB Date: Fri, 7 Jul 2023 13:03:01 +0200 Subject: [PATCH 1513/1765] LinuxSessionFunctions: add optional ignoreErrors parameter Suppress warnings if set to true. --- plugins/platform/linux/LinuxSessionFunctions.cpp | 10 +++++++--- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 05f0a32a4..601267cd1 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -378,7 +378,7 @@ QProcessEnvironment LinuxSessionFunctions::getSessionEnvironment( int sessionLea -QString LinuxSessionFunctions::currentSessionPath() +QString LinuxSessionFunctions::currentSessionPath(bool ignoreErrors) { const auto xdgSessionPath = QProcessEnvironment::systemEnvironment().value( sessionPathEnvVarName() ); if (xdgSessionPath.isEmpty() == false) @@ -433,8 +433,12 @@ QString LinuxSessionFunctions::currentSessionPath() } } - vWarning() << "could not determine dbus object path of current session – please make sure systemd is " - "up to date and/or the environment variable" << xdgSessionIdEnvVarName() << "is set"; + if (ignoreErrors == false) + { + vWarning() << "could not determine dbus object path of current session – please make sure systemd is " + "up to date and/or the environment variable" << xdgSessionIdEnvVarName() << "is set"; + } + return {}; } diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index be3103660..0f4458af5 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -105,7 +105,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions static QProcessEnvironment getSessionEnvironment( int sessionLeaderPid ); - static QString currentSessionPath(); + static QString currentSessionPath(bool ignoreErrors = false); static QString kdeSessionVersionEnvVarName() { From fd408b6166c2420ac35e268b16155ede3ed126e1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Jul 2023 13:03:32 +0200 Subject: [PATCH 1514/1765] LinuxUserFunctions: fall back to environment variable silently If the current session path is empty, don't call getSessionUser(). --- plugins/platform/linux/LinuxUserFunctions.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 28eef8f03..b0d7e377e 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -243,13 +243,17 @@ QString LinuxUserFunctions::currentUser() { QString username; - const auto sessionUserPath = LinuxSessionFunctions::getSessionUser(LinuxSessionFunctions::currentSessionPath()); - if (sessionUserPath.isEmpty() == false) + const auto sessionPath = LinuxSessionFunctions::currentSessionPath(true); + if (sessionPath.isEmpty() == false) { - username = getUserProperty(sessionUserPath, QStringLiteral("Name")).toString(); - if (username.isEmpty() == false) + const auto sessionUserPath = LinuxSessionFunctions::getSessionUser(sessionPath); + if (sessionUserPath.isEmpty() == false) { - return username; + username = getUserProperty(sessionUserPath, QStringLiteral("Name")).toString(); + if (username.isEmpty() == false) + { + return username; + } } } From 7714b0946d95f44ae1feadc3af7d552bd3353481 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Jul 2023 11:53:30 +0200 Subject: [PATCH 1515/1765] ComputerControlServer: omit tray icon control if no user is logged in Prevents unneccessary session worker starts and subsequent warnings caused by lacking user session. --- server/src/ComputerControlServer.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index cca8f2cf8..63164e6ea 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -184,7 +184,8 @@ void ComputerControlServer::showAuthenticationMessage( VncServerClient* client ) { vWarning() << "Authentication failed for" << client->hostAddress() << client->username(); - if( VeyonCore::config().failedAuthenticationNotificationsEnabled() ) + if (VeyonCore::config().failedAuthenticationNotificationsEnabled() && + VeyonCore::platform().sessionFunctions().currentSessionHasUser()) { QMutexLocker l( &m_dataMutex ); @@ -213,7 +214,8 @@ void ComputerControlServer::showAccessControlMessage( VncServerClient* client ) { vInfo() << "Access control successful for" << client->hostAddress() << client->username(); - if( VeyonCore::config().remoteConnectionNotificationsEnabled() ) + if (VeyonCore::config().remoteConnectionNotificationsEnabled() && + VeyonCore::platform().sessionFunctions().currentSessionHasUser()) { const auto fqdn = HostAddress( client->hostAddress() ).tryConvert( HostAddress::Type::FullyQualifiedDomainName ); @@ -284,6 +286,11 @@ void ComputerControlServer::sendAsyncFeatureMessages(VncProxyConnection* connect void ComputerControlServer::updateTrayIconToolTip() { + if (VeyonCore::platform().sessionFunctions().currentSessionHasUser() == false) + { + return; + } + auto toolTip = tr( "%1 Service %2 at %3:%4" ).arg( VeyonCore::applicationName(), VeyonCore::versionString(), HostAddress::localFQDN(), QString::number( VeyonCore::config().veyonServerPort() + VeyonCore::sessionId() ) ); From 83550da21dbf9b687efe0134a695dfce29d7645d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Jul 2023 11:58:38 +0200 Subject: [PATCH 1516/1765] LinuxCoreFunctions: add isSystemdManaged() --- plugins/platform/linux/LinuxCoreFunctions.cpp | 16 ++++++++++++++++ plugins/platform/linux/LinuxCoreFunctions.h | 1 + 2 files changed, 17 insertions(+) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 6900439fc..79f120124 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -41,6 +41,7 @@ #include "LinuxDesktopIntegration.h" #include "LinuxUserFunctions.h" #include "PlatformUserFunctions.h" +#include "ProcessHelper.h" #include #include @@ -406,6 +407,21 @@ LinuxCoreFunctions::DBusInterfacePointer LinuxCoreFunctions::consoleKitManager() +bool LinuxCoreFunctions::isSystemdManaged() +{ + if (QFile::exists(QStringLiteral("/sbin/systemd")) == false && + QFile::exists(QStringLiteral("/usr/sbin/systemd")) == false && + QFile::exists(QStringLiteral("/lib/systemd/systemd")) == false) + { + return false; + } + + const auto status = ProcessHelper(QStringLiteral("systemctl"), {QStringLiteral("is-system-running")}).runAndReadAll(); + return status.isEmpty() == false && status != "offline"; +} + + + int LinuxCoreFunctions::systemctl( const QStringList& arguments ) { QProcess process; diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index ad5284413..08d8e308f 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -80,6 +80,7 @@ class LinuxCoreFunctions : public PlatformCoreFunctions static DBusInterfacePointer systemdLoginManager(); static DBusInterfacePointer consoleKitManager(); + static bool isSystemdManaged(); static int systemctl( const QStringList& arguments ); static void restartDisplayManagers(); From 1440f9c822bb4a452fc4807dd3e6108c838fbd0b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Jul 2023 12:05:17 +0200 Subject: [PATCH 1517/1765] LinuxServiceFunctions: suppress service config error if not managed by systemd When running e.g. the WebAPI proxy in a Docker container, systemd is not available and operations such as importing a configuration file should not generate an error message. --- plugins/platform/linux/LinuxServiceFunctions.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/platform/linux/LinuxServiceFunctions.cpp b/plugins/platform/linux/LinuxServiceFunctions.cpp index 75bf9073d..3ad5dc4d6 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.cpp +++ b/plugins/platform/linux/LinuxServiceFunctions.cpp @@ -94,6 +94,12 @@ bool LinuxServiceFunctions::uninstall( const QString& name ) bool LinuxServiceFunctions::setStartMode( const QString& name, PlatformServiceFunctions::StartMode startMode ) { + if (LinuxCoreFunctions::isSystemdManaged() == false) + { + vWarning() << "System is not managed by systemd – unable to configure start mode for service" << name; + return true; + } + if( startMode == StartMode::Auto ) { return LinuxCoreFunctions::systemctl( { QStringLiteral("enable"), name } ) == 0; From e35a591a1fe5f85fc8ba5bc085e42cd5cd12dfe7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Jul 2023 11:43:52 +0200 Subject: [PATCH 1518/1765] Core: Filesystem: add support for USER variable Closes #847. --- core/src/Filesystem.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index d460ddf23..c2d11787c 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -30,6 +30,7 @@ #include "VeyonConfiguration.h" #include "Filesystem.h" #include "PlatformFilesystemFunctions.h" +#include "PlatformUserFunctions.h" QString Filesystem::expandPath( QString path ) const @@ -37,6 +38,7 @@ QString Filesystem::expandPath( QString path ) const const auto p = QDir::toNativeSeparators( path.replace( QStringLiteral( "%HOME%" ), QDir::homePath() ). replace( QStringLiteral( "%HOSTNAME%" ), QHostInfo::localHostName() ). replace( QStringLiteral( "%PROFILE%" ), QDir::homePath() ). + replace(QStringLiteral( "%USER%" ), VeyonCore::platform().userFunctions().currentUser()). replace(QStringLiteral("%DESKTOP%"), QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)). replace(QStringLiteral("%DOCUMENTS%"), QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)). replace(QStringLiteral("%DOWNLOADS%"), QStandardPaths::writableLocation(QStandardPaths::DownloadLocation)). @@ -93,6 +95,12 @@ QString Filesystem::shrinkPath( QString path ) const } } + const auto currentUser = VeyonCore::platform().userFunctions().currentUser(); + if (currentUser.isEmpty() == false) + { + path.replace(currentUser, QStringLiteral("%USER%")); + } + // remove duplicate directory separators - however skip the first two chars // as they might specify an UNC path on Windows if( path.length() > 3 ) From f107adbec46e91d21c0a6eefb3b6c9a7de73e196 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Jul 2023 12:14:40 +0200 Subject: [PATCH 1519/1765] Core: VeyonConfiguration: add ClipboardSynchronizationDisabled option --- configurator/src/ServiceConfigurationPage.cpp | 2 +- configurator/src/ServiceConfigurationPage.ui | 13 ++++++++++--- core/src/VeyonConfigurationProperties.h | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index 15a498329..a37a3c909 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -44,7 +44,7 @@ ServiceConfigurationPage::ServiceConfigurationPage( QWidget* parent ) : ui->setupUi(this); Configuration::UiMapping::setFlags( ui->networkPortNumbersGroupBox, Configuration::Property::Flag::Advanced ); - Configuration::UiMapping::setFlags( ui->miscNetworkSettingsGroupBox, Configuration::Property::Flag::Advanced ); + Configuration::UiMapping::setFlags(ui->miscSettingsGroupBox, Configuration::Property::Flag::Advanced); updateServiceControl(); populateVncServerPluginComboBox(); diff --git a/configurator/src/ServiceConfigurationPage.ui b/configurator/src/ServiceConfigurationPage.ui index 66dba883e..afefeec2b 100644 --- a/configurator/src/ServiceConfigurationPage.ui +++ b/configurator/src/ServiceConfigurationPage.ui @@ -59,7 +59,6 @@ - 75 true @@ -273,9 +272,9 @@ Typically this is required to support terminal servers. - + - Miscellaneous network settings + Miscellaneous settings @@ -292,6 +291,13 @@ Typically this is required to support terminal servers. + + + + Disable clipboard synchronization + + + @@ -357,6 +363,7 @@ Typically this is required to support terminal servers. demoServerPort isFirewallExceptionEnabled localConnectOnly + clipboardSynchronizationDisabled vncServerPlugin diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 9b66363ff..623eaa5c7 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -67,6 +67,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, multiSessionModeEnabled, setMultiSessionModeEnabled, "MultiSession", "Service", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, maximumSessionCount, setMaximumSessionCount, "MaximumSessionCount", "Service", 100, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, autostartService, setServiceAutostart, "Autostart", "Service", true, Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, clipboardSynchronizationDisabled, setClipboardSynchronizationDisabled, "ClipboardSynchronizationDisabled", "Service", false, Configuration::Property::Flag::Advanced ) \ #define FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QStringList, enabledNetworkObjectDirectoryPlugins, setEnabledNetworkObjectDirectoryPlugins, "EnabledPlugins", "NetworkObjectDirectory", QStringList(), Configuration::Property::Flag::Standard ) \ From f48cc216986663919eaafb69e6f6232981fb72f9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Jul 2023 12:15:30 +0200 Subject: [PATCH 1520/1765] RemoteAccessFeaturePlugin: skip clipboard sync if disabled If clipboard synchronization is disabled by config, skip any related operations. Closes #828. --- .../RemoteAccessFeaturePlugin.cpp | 26 +++++++++++++++---- .../remoteaccess/RemoteAccessFeaturePlugin.h | 1 + 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 402ee145d..e2e38b2c7 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -64,9 +64,10 @@ RemoteAccessFeaturePlugin::RemoteAccessFeaturePlugin( QObject* parent ) : { QStringLiteral("view"), m_remoteViewFeature.displayName() }, { QStringLiteral("control"), m_remoteControlFeature.displayName() }, { QStringLiteral("help"), tr( "Show help about command" ) }, - } ) + } ), + m_clipboardSynchronizationDisabled(VeyonCore::config().clipboardSynchronizationDisabled()) { - if (VeyonCore::component() == VeyonCore::Component::Server) + if (VeyonCore::component() == VeyonCore::Component::Server && m_clipboardSynchronizationDisabled == false) { connect (QGuiApplication::clipboard(), &QClipboard::dataChanged, this, &RemoteAccessFeaturePlugin::updateClipboardData); @@ -149,7 +150,7 @@ bool RemoteAccessFeaturePlugin::handleFeatureMessage(ComputerControlInterface::P { Q_UNUSED(computerControlInterface) - if (message.featureUid() == m_clipboardExchangeFeature.uid()) + if (message.featureUid() == m_clipboardExchangeFeature.uid() && m_clipboardSynchronizationDisabled == false) { for (auto it = m_vncViews.constBegin(), end = m_vncViews.constEnd(); it != end; ++it) { @@ -180,7 +181,7 @@ bool RemoteAccessFeaturePlugin::handleFeatureMessage(VeyonServerInterface &serve server.featureWorkerManager().sendMessageToUnmanagedSessionWorker(message); return true; } - else if (message.featureUid() == m_clipboardExchangeFeature.uid()) + else if (message.featureUid() == m_clipboardExchangeFeature.uid() && m_clipboardSynchronizationDisabled == false) { loadClipboardData(message); return true; @@ -216,7 +217,7 @@ void RemoteAccessFeaturePlugin::sendAsyncFeatureMessages(VeyonServerInterface& s { const auto clipboardDataVersion = messageContext.ioDevice()->property(clipboardDataVersionProperty()).toInt(); - if (clipboardDataVersion != m_clipboardDataVersion) + if (m_clipboardSynchronizationDisabled == false && clipboardDataVersion != m_clipboardDataVersion) { FeatureMessage message{m_clipboardExchangeFeature.uid()}; @@ -423,6 +424,11 @@ void RemoteAccessFeaturePlugin::storeClipboardData(FeatureMessage *message, cons void RemoteAccessFeaturePlugin::loadClipboardData(const FeatureMessage &message) { + if (m_clipboardSynchronizationDisabled) + { + return; + } + const auto clipboard = QGuiApplication::clipboard(); const auto text = message.argument(Argument::ClipboardText).toString(); @@ -445,6 +451,11 @@ void RemoteAccessFeaturePlugin::loadClipboardData(const FeatureMessage &message) void RemoteAccessFeaturePlugin::sendClipboardData(ComputerControlInterface::Pointer computerControlInterface) { + if (m_clipboardSynchronizationDisabled) + { + return; + } + FeatureMessage message{m_clipboardExchangeFeature.uid()}; const auto clipboard = QGuiApplication::clipboard(); @@ -459,6 +470,11 @@ void RemoteAccessFeaturePlugin::sendClipboardData(ComputerControlInterface::Poin void RemoteAccessFeaturePlugin::updateClipboardData() { + if (m_clipboardSynchronizationDisabled) + { + return; + } + m_clipboardDataMutex.lock(); const auto clipboard = QGuiApplication::clipboard(); diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index 24e3f13e1..131fc8112 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -146,6 +146,7 @@ private Q_SLOTS: QMap m_commands; + bool m_clipboardSynchronizationDisabled; QMutex m_clipboardDataMutex; int m_clipboardDataVersion{0}; QString m_clipboardText; From e1f8a2fc0bdaadcdaf4041c889c6fba700b127d7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 4 Aug 2023 14:41:20 +0200 Subject: [PATCH 1521/1765] CI: add openSUSE 15.5 --- .ci/linux.opensuse.15.5/Dockerfile | 19 +++++++++++++++++++ .ci/linux.opensuse.15.5/script.sh | 8 ++++++++ .gitlab-ci.yml | 1 + 3 files changed, 28 insertions(+) create mode 100644 .ci/linux.opensuse.15.5/Dockerfile create mode 100755 .ci/linux.opensuse.15.5/script.sh diff --git a/.ci/linux.opensuse.15.5/Dockerfile b/.ci/linux.opensuse.15.5/Dockerfile new file mode 100644 index 000000000..cbf7657f9 --- /dev/null +++ b/.ci/linux.opensuse.15.5/Dockerfile @@ -0,0 +1,19 @@ +FROM opensuse/leap:15.5 +MAINTAINER Tobias Junghans + +RUN \ + zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ + libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel libqt5-qtwebengine-devel \ + libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ + libfakekey-devel \ + libjpeg8-devel \ + zlib-devel \ + libpng16-devel libpng16-compat-devel \ + libopenssl-devel \ + procps-devel \ + pam-devel lzo-devel \ + libqca-qt5-devel libqca-qt5-plugins \ + libavcodec-devel libavformat-devel libavutil-devel libswscale-devel \ + cyrus-sasl-devel \ + openldap2-devel + diff --git a/.ci/linux.opensuse.15.5/script.sh b/.ci/linux.opensuse.15.5/script.sh new file mode 100755 index 000000000..9d4696e3b --- /dev/null +++ b/.ci/linux.opensuse.15.5/script.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=opensuse.15.5" + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3c158d2d9..157ab9b6f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,6 +17,7 @@ build-linux: - fedora.37 - fedora.38 - opensuse.15.4 + - opensuse.15.5 - opensuse.tumbleweed - ubuntu.focal - ubuntu.jammy From 13c10c3c263c4dc2126bd0756e96fc6c519c00bb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 9 Aug 2023 13:56:15 +0200 Subject: [PATCH 1522/1765] Filesystem: don't replace username with USER variable This may lead to undesired side effects so let the user use %USER% explicitly only. --- core/src/Filesystem.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index c2d11787c..3d29eebb1 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -95,12 +95,6 @@ QString Filesystem::shrinkPath( QString path ) const } } - const auto currentUser = VeyonCore::platform().userFunctions().currentUser(); - if (currentUser.isEmpty() == false) - { - path.replace(currentUser, QStringLiteral("%USER%")); - } - // remove duplicate directory separators - however skip the first two chars // as they might specify an UNC path on Windows if( path.length() > 3 ) From 9b4b8abd5d52adaae67ce8a18307fbbb39a1b29d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 9 Aug 2023 14:18:26 +0200 Subject: [PATCH 1523/1765] 3rdparty: ultravnc: update submodule (1.4.3.1) --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 7a3eaf96b..fc755de16 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 7a3eaf96ba04ef32aac577f744026313f199368a +Subproject commit fc755de1698db35b67adc3fa7de14ad34072495d From 8675740a7f0bfb220941a1410a86f7fff01380f2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 14 Aug 2023 14:54:51 +0200 Subject: [PATCH 1524/1765] VeyonCore: set QToolTip colors via palette On Windows both the style-sheet based text color as well as the QPalette::ToolTipBase palette role are ignored. Therefore set everything via QPalette and additionally set the QPalette::Window role. --- core/src/VeyonCore.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 99d8a42ba..efc6692e2 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include "AuthenticationCredentials.h" #include "AuthenticationManager.h" @@ -627,8 +628,15 @@ void VeyonCore::initUi() app->setStyleSheet(QStringLiteral( "QToolButton:checked {background-color:#88ddff;}" - "QToolTip {color:#ffffff; background-color:#198cb3; padding:5px; border:0px;}" + "QToolTip {padding:5px; border:0px;}" )); + + auto toolTipPalette = QToolTip::palette(); + static const char* toolTipBackgroundColor = "#198cb3"; + toolTipPalette.setColor(QPalette::Window, toolTipBackgroundColor); + toolTipPalette.setColor(QPalette::ToolTipBase, toolTipBackgroundColor); + toolTipPalette.setColor(QPalette::ToolTipText, Qt::white); + QToolTip::setPalette(toolTipPalette); } } From 854d500e54940f1a1b4a2591457ba6a7987e8267 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 14 Aug 2023 15:19:17 +0200 Subject: [PATCH 1525/1765] LinuxCoreFunctions: fix systemd status evaluation Trim trailing newline. --- plugins/platform/linux/LinuxCoreFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 79f120124..60824d4b8 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -416,7 +416,7 @@ bool LinuxCoreFunctions::isSystemdManaged() return false; } - const auto status = ProcessHelper(QStringLiteral("systemctl"), {QStringLiteral("is-system-running")}).runAndReadAll(); + const auto status = ProcessHelper(QStringLiteral("systemctl"), {QStringLiteral("is-system-running")}).runAndReadAll().trimmed(); return status.isEmpty() == false && status != "offline"; } From 4189cc796a238c32f687fefe9205e9a37cf5c346 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 22 Sep 2023 15:27:31 +0200 Subject: [PATCH 1526/1765] LinuxPlatformPlugin: add crash handlers Dump backtrace when receiving SIGKILL, SIGBUS or SIGSEGV. --- .../platform/linux/LinuxPlatformPlugin.cpp | 44 ++++++++++++++++++- plugins/platform/linux/LinuxPlatformPlugin.h | 3 ++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxPlatformPlugin.cpp b/plugins/platform/linux/LinuxPlatformPlugin.cpp index 30f264d31..ddeaeefa2 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.cpp +++ b/plugins/platform/linux/LinuxPlatformPlugin.cpp @@ -23,6 +23,7 @@ */ #include +#include #include "LinuxPlatformPlugin.h" #include "LinuxPlatformConfiguration.h" @@ -35,7 +36,11 @@ LinuxPlatformPlugin::LinuxPlatformPlugin( QObject* parent ) : qunsetenv( "XDG_CONFIG_DIRS" ); // don't abort with SIGPIPE when writing to closed sockets e.g. while shutting down VncConnection - signal( SIGPIPE, SIG_IGN ); + ::signal(SIGPIPE, SIG_IGN); + + ::signal(SIGKILL, abort); + ::signal(SIGBUS, abort); + ::signal(SIGSEGV, abort); } @@ -53,4 +58,41 @@ ConfigurationPage* LinuxPlatformPlugin::createConfigurationPage() } + +void LinuxPlatformPlugin::abort(int signal) +{ + qInstallMessageHandler(nullptr); + + vCritical() << "Received signal" << signal; + + qCritical().noquote() << formattedBacktraceString(); + + qFatal("Aborting due to severe error"); + ::abort(); +} + + + +QString LinuxPlatformPlugin::formattedBacktraceString() +{ + static constexpr int BackTraceMaxDepth = 20; + + void* stackFrame[BackTraceMaxDepth + 1]; + const auto frameCount = backtrace(stackFrame, BackTraceMaxDepth + 1); + + char** humanReadableFrames = backtrace_symbols(stackFrame, frameCount); + + QStringList list{QLatin1String("BACKTRACE:")}; + list.reserve(frameCount); + for (int i = 1; i < frameCount; i++) + { + list.append(QStringLiteral("\t %1").arg( QLatin1String(humanReadableFrames[i]))); + } + + free(humanReadableFrames); + + return list.join(QLatin1String("\n")); +} + + IMPLEMENT_CONFIG_PROXY(LinuxPlatformConfiguration) diff --git a/plugins/platform/linux/LinuxPlatformPlugin.h b/plugins/platform/linux/LinuxPlatformPlugin.h index d788cd781..3c0456872 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.h +++ b/plugins/platform/linux/LinuxPlatformPlugin.h @@ -116,6 +116,9 @@ class LinuxPlatformPlugin : public QObject, PlatformPluginInterface, PluginInter ConfigurationPage* createConfigurationPage() override; + static void abort(int signal); + static QString formattedBacktraceString(); + private: LinuxCoreFunctions m_linuxCoreFunctions{}; LinuxFilesystemFunctions m_linuxFilesystemFunctions{}; From 14545741d68c2c4711c16e557345626f99b63957 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 26 Sep 2023 10:09:49 +0200 Subject: [PATCH 1527/1765] NSIS: remove TLS backends directory This amends commit c22714c77021e54c53891143e4453ce3f99c9642. Closes #903. --- nsis/veyon.nsi.in | 1 + 1 file changed, 1 insertion(+) diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index b8f22dc38..eb6b0fe51 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -305,6 +305,7 @@ RmDir /r "$INSTDIR\imageformats" RmDir /r "$INSTDIR\plugins" RmDir /r "$INSTDIR\platforms" RmDir /r "$INSTDIR\styles" +RmDir /r "$INSTDIR\tls" RmDir /r "$INSTDIR\translations" RmDir /r "$INSTDIR\interception" From 088ef293ea100d8ce250bfc2b329bfa8cfe03e0e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 9 Oct 2023 10:47:43 +0200 Subject: [PATCH 1528/1765] Platform: Linux: check for system bus being connected --- plugins/platform/linux/LinuxSessionFunctions.cpp | 6 ++++++ plugins/platform/linux/LinuxUserFunctions.cpp | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 601267cd1..82d98fdfb 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -141,6 +141,12 @@ QVariant LinuxSessionFunctions::getSessionProperty(const QString& session, const QStringLiteral("org.freedesktop.DBus.Properties"), QDBusConnection::systemBus() ); + if (loginManager.connection().isConnected() == false) + { + vDebug() << "system bus not connected"; + return {}; + } + const QDBusReply reply = loginManager.call( QStringLiteral("Get"), QStringLiteral("org.freedesktop.login1.Session"), property ); diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index b0d7e377e..f783fd704 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -481,6 +481,12 @@ QVariant LinuxUserFunctions::getUserProperty(const QString& userPath, const QStr QStringLiteral("org.freedesktop.DBus.Properties"), QDBusConnection::systemBus()); + if (loginManager.connection().isConnected() == false) + { + vDebug() << "system bus not connected"; + return {}; + } + const QDBusReply reply = loginManager.call(QStringLiteral("Get"), QStringLiteral("org.freedesktop.login1.User"), property); From b519f78ca0735751b3b97837f45f8884aa629a29 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 13 Oct 2023 09:02:23 +0200 Subject: [PATCH 1529/1765] LinuxUserFunctions: check for system bus being connected The fallbacks are sufficient so it's desirable to supress the log messages generated by subsequent LinuxSessionFunctions::getSessionProperty() calls. --- plugins/platform/linux/LinuxUserFunctions.cpp | 17 ++++++++++------- plugins/platform/linux/LinuxUserFunctions.h | 4 ++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index f783fd704..e62fa7022 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -243,16 +243,19 @@ QString LinuxUserFunctions::currentUser() { QString username; - const auto sessionPath = LinuxSessionFunctions::currentSessionPath(true); - if (sessionPath.isEmpty() == false) + if (m_systemBus.isConnected()) { - const auto sessionUserPath = LinuxSessionFunctions::getSessionUser(sessionPath); - if (sessionUserPath.isEmpty() == false) + const auto sessionPath = LinuxSessionFunctions::currentSessionPath(true); + if (sessionPath.isEmpty() == false) { - username = getUserProperty(sessionUserPath, QStringLiteral("Name")).toString(); - if (username.isEmpty() == false) + const auto sessionUserPath = LinuxSessionFunctions::getSessionUser(sessionPath); + if (sessionUserPath.isEmpty() == false) { - return username; + username = getUserProperty(sessionUserPath, QStringLiteral("Name")).toString(); + if (username.isEmpty() == false) + { + return username; + } } } } diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index b83092213..b4ef2f482 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -24,6 +24,8 @@ #pragma once +#include + #include "LogonHelper.h" #include "PlatformUserFunctions.h" @@ -55,6 +57,8 @@ class LinuxUserFunctions : public PlatformUserFunctions static QVariant getUserProperty(const QString& userPath, const QString& property, bool logErrors = true); private: + QDBusConnection m_systemBus = QDBusConnection::systemBus(); + static constexpr auto AuthHelperTimeout = 10000; LogonHelper m_logonHelper{}; From 4c0dbc2d17c8372e2b96345238ad60035e6641c5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 20 Oct 2023 15:14:43 +0200 Subject: [PATCH 1530/1765] Logger: increase maximum log message size --- core/src/Logger.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/Logger.h b/core/src/Logger.h index 148b51172..a58d3a0c0 100644 --- a/core/src/Logger.h +++ b/core/src/Logger.h @@ -54,7 +54,7 @@ class VEYON_CORE_EXPORT Logger static constexpr int DefaultFileSizeLimit = 100; static constexpr int DefaultFileRotationCount = 10; - static constexpr int MaximumMessageSize = 1000; + static constexpr int MaximumMessageSize = 16384; static constexpr const char* DefaultLogFileDirectory = "%TEMP%"; explicit Logger( const QString &appName ); From c6cfd8554bf43c36f88a0c66296840428a1d8fc1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Nov 2023 11:09:29 +0100 Subject: [PATCH 1531/1765] EnumHelper: properly resolve enum strings by value --- core/src/EnumHelper.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/EnumHelper.h b/core/src/EnumHelper.h index 22237ef16..5dd9ce387 100644 --- a/core/src/EnumHelper.h +++ b/core/src/EnumHelper.h @@ -34,7 +34,7 @@ class EnumHelper template static QString toString( T item ) { - return QLatin1String( QMetaEnum::fromType().key( static_cast( item ) ) ); + return QLatin1String(QMetaEnum::fromType().valueToKey(int(item))); } template From 1564828f9961becdc136f49d3e4a5c058b6f164f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 11 Dec 2023 09:20:10 +0100 Subject: [PATCH 1532/1765] NetworkObjectDirectory: emit signals with model IDs Since all users of these signals require the effective model IDs only we can pass the model ID values directly. --- core/src/NetworkObjectDirectory.cpp | 4 ++-- core/src/NetworkObjectDirectory.h | 6 +++--- master/src/NetworkObjectTreeModel.cpp | 12 ++++++------ master/src/NetworkObjectTreeModel.h | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index 06f5f4b09..34061e9e5 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -279,7 +279,7 @@ void NetworkObjectDirectory::addOrUpdateObject( const NetworkObject& networkObje if( index < 0 ) { - Q_EMIT objectsAboutToBeInserted( parent, objectList.count(), 1 ); + Q_EMIT objectsAboutToBeInserted(parent.modelId(), objectList.count(), 1); objectList.append( completeNetworkObject ); if( completeNetworkObject.isContainer() ) @@ -318,7 +318,7 @@ void NetworkObjectDirectory::removeObjects( const NetworkObject& parent, const N objectsToRemove.append( it->modelId() ); } - Q_EMIT objectsAboutToBeRemoved( parent, index, 1 ); + Q_EMIT objectsAboutToBeRemoved(parent.modelId(), index, 1); it = objectList.erase( it ); Q_EMIT objectsRemoved(); } diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index cc76c84e5..0b1430035 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -90,10 +90,10 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject NetworkObjectList m_defaultObjectList{}; Q_SIGNALS: - void objectsAboutToBeInserted( const NetworkObject& parent, int index, int count ); + void objectsAboutToBeInserted(NetworkObject::ModelId parentId, int index, int count); void objectsInserted(); - void objectsAboutToBeRemoved( const NetworkObject& parent, int index, int count ); + void objectsAboutToBeRemoved(NetworkObject::ModelId parentId, int index, int count); void objectsRemoved(); - void objectChanged( const NetworkObject& parent, int index ); + void objectChanged(NetworkObject::ModelId parentId, int index ); }; diff --git a/master/src/NetworkObjectTreeModel.cpp b/master/src/NetworkObjectTreeModel.cpp index 160e48991..53fc72357 100644 --- a/master/src/NetworkObjectTreeModel.cpp +++ b/master/src/NetworkObjectTreeModel.cpp @@ -226,9 +226,9 @@ Qt::ItemFlags NetworkObjectTreeModel::flags( const QModelIndex& index ) const -void NetworkObjectTreeModel::beginInsertObjects( const NetworkObject& parent, int index, int count ) +void NetworkObjectTreeModel::beginInsertObjects(NetworkObject::ModelId parentId, int index, int count) { - beginInsertRows( objectIndex( parent.modelId() ), index, index+count-1 ); + beginInsertRows(objectIndex(parentId), index, index+count-1); } @@ -240,9 +240,9 @@ void NetworkObjectTreeModel::endInsertObjects() -void NetworkObjectTreeModel::beginRemoveObjects( const NetworkObject& parent, int index, int count ) +void NetworkObjectTreeModel::beginRemoveObjects(NetworkObject::ModelId parentId, int index, int count) { - beginRemoveRows( objectIndex( parent.modelId() ), index, index+count-1 ); + beginRemoveRows(objectIndex(parentId), index, index+count-1); } @@ -254,9 +254,9 @@ void NetworkObjectTreeModel::endRemoveObjects() -void NetworkObjectTreeModel::updateObject( const NetworkObject& parent, int row ) +void NetworkObjectTreeModel::updateObject(NetworkObject::ModelId parentId, int row) { - const auto index = createIndex( row, 0, parent.modelId() ); + const auto index = createIndex(row, 0, parentId); Q_EMIT dataChanged( index, index ); } diff --git a/master/src/NetworkObjectTreeModel.h b/master/src/NetworkObjectTreeModel.h index 02fa5c18c..fd59aa9e8 100644 --- a/master/src/NetworkObjectTreeModel.h +++ b/master/src/NetworkObjectTreeModel.h @@ -52,13 +52,13 @@ class NetworkObjectTreeModel : public NetworkObjectModel Qt::ItemFlags flags( const QModelIndex& index ) const override; private: - void beginInsertObjects( const NetworkObject& parent, int index, int count ); + void beginInsertObjects(NetworkObject::ModelId parentId, int index, int count); void endInsertObjects(); - void beginRemoveObjects( const NetworkObject& parent, int index, int count ); + void beginRemoveObjects(NetworkObject::ModelId parentId, int index, int count); void endRemoveObjects(); - void updateObject( const NetworkObject& parent, int index ); + void updateObject(NetworkObject::ModelId parent, int index ); QModelIndex objectIndex( NetworkObject::ModelId object, int column = 0 ) const; const NetworkObject& object( const QModelIndex& index ) const; From ebb98195a55e7e289be93a8eab8b029d4aa49943 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 11 Dec 2023 09:23:57 +0100 Subject: [PATCH 1533/1765] NetworkObjectDirectory: propagate child object changes to parents In order to force reevaluations of parent objets by QSortFilterProxyModel instances attached to NetworkObjectTreeModel, propagate object changes for all parents of a certain object. This fixes hidden locations when enabling the "Hide empty locations" option together with the NetworkDiscovery network object directory. --- core/src/NetworkObjectDirectory.cpp | 20 +++++++++++++++++++- core/src/NetworkObjectDirectory.h | 1 + 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index 34061e9e5..c2aa1e3c6 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -288,11 +288,13 @@ void NetworkObjectDirectory::addOrUpdateObject( const NetworkObject& networkObje } Q_EMIT objectsInserted(); + + propagateChildObjectChange(parent.modelId(), objectList.count()); } else if( objectList[index].exactMatch( completeNetworkObject ) == false ) { objectList.replace( index, completeNetworkObject ); - Q_EMIT objectChanged( parent, index ); + propagateChildObjectChange(parent.modelId(), index); } } @@ -366,3 +368,19 @@ void NetworkObjectDirectory::setObjectPopulated( const NetworkObject& networkObj } } } + + + +void NetworkObjectDirectory::propagateChildObjectChange(NetworkObject::ModelId objectId, int childIndex) +{ + while (objectId != 0) + { + Q_EMIT objectChanged(objectId, childIndex); + + const auto newObjectId = parentId(objectId); + childIndex = index(newObjectId, objectId); + objectId = newObjectId; + } + + Q_EMIT objectChanged(rootId(), childIndex); +} diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 0b1430035..d4668a495 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -80,6 +80,7 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject void removeObjects( const NetworkObject& parent, const NetworkObjectFilter& removeObjectFilter ); void replaceObjects( const NetworkObjectList& objects, const NetworkObject& parent ); void setObjectPopulated( const NetworkObject& networkObject ); + void propagateChildObjectChange(NetworkObject::ModelId objectId, int childIndex); private: const QString m_name; From 94f9f3667d4603ebe7773aeee74ea5c7380816eb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 12 Dec 2023 12:00:13 +0100 Subject: [PATCH 1534/1765] Update translations --- translations/veyon_ar.ts | 230 +++- translations/veyon_bg.ts | 248 ++++- translations/veyon_ca_ES.ts | 2072 +++++++++++++++++++---------------- translations/veyon_cs.ts | 248 ++++- translations/veyon_de.ts | 248 ++++- translations/veyon_el.ts | 636 +++++++---- translations/veyon_es_ES.ts | 285 ++++- translations/veyon_et.ts | 287 ++++- translations/veyon_fa.ts | 234 +++- translations/veyon_fr.ts | 378 +++++-- translations/veyon_he.ts | 244 ++++- translations/veyon_hu.ts | 258 ++++- translations/veyon_id.ts | 430 +++++--- translations/veyon_it.ts | 258 ++++- translations/veyon_ja.ts | 430 +++++--- translations/veyon_ko.ts | 248 ++++- translations/veyon_lt.ts | 248 ++++- translations/veyon_lv.ts | 604 ++++++---- translations/veyon_mn.ts | 226 +++- translations/veyon_nl.ts | 708 +++++++----- translations/veyon_no_NO.ts | 226 +++- translations/veyon_pl.ts | 326 ++++-- translations/veyon_pt_BR.ts | 242 +++- translations/veyon_pt_PT.ts | 226 +++- translations/veyon_ru.ts | 529 ++++++--- translations/veyon_sl.ts | 236 +++- translations/veyon_sr.ts | 250 ++++- translations/veyon_sv.ts | 226 +++- translations/veyon_th.ts | 258 ++++- translations/veyon_tr.ts | 248 ++++- translations/veyon_uk.ts | 250 ++++- translations/veyon_vi.ts | 226 +++- translations/veyon_zh_CN.ts | 340 ++++-- translations/veyon_zh_TW.ts | 299 +++-- 34 files changed, 9084 insertions(+), 3318 deletions(-) diff --git a/translations/veyon_ar.ts b/translations/veyon_ar.ts index 4e55a09b8..85723297e 100644 --- a/translations/veyon_ar.ts +++ b/translations/veyon_ar.ts @@ -680,10 +680,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE @@ -724,6 +720,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -923,7 +927,7 @@ The public key is used on client computers to authenticate incoming connection r Locations - + العناوين Add new location @@ -974,7 +978,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + عنوان المضيف MAC address @@ -1188,6 +1192,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1261,6 +1269,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1607,10 +1619,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1795,9 +1803,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + الاسم + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + - Feature control + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -3113,6 +3245,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Only show computers with logged on users + + MasterConfigurationPage @@ -3303,6 +3439,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3368,7 +3516,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3649,6 +3797,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3909,41 +4065,41 @@ Typically this is required to support terminal servers. - ServiceControlPlugin + ServiceControlCommands - Service is running + Register Veyon Service - Service is not running + Unregister Veyon Service - Configure and control Veyon service + Start Veyon Service - Register Veyon Service + Stop Veyon Service - Unregister Veyon Service + Restart Veyon Service - Start Veyon Service + Query status of Veyon Service - Stop Veyon Service + Service is running - Restart Veyon Service + Service is not running - Query status of Veyon Service + Configure and control Veyon service @@ -3952,7 +4108,7 @@ Typically this is required to support terminal servers. - ShellCommandLinePlugin + ShellCommands Run command file @@ -3962,7 +4118,7 @@ Typically this is required to support terminal servers. - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4273,6 +4429,10 @@ The second button removes the selected or last computer. Authentication test + + Screen %1 + + VeyonServiceControl @@ -4353,6 +4513,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl @@ -4361,27 +4525,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. + + + + Service "%1" could not be found. - The service "%1" could not be uninstalled. + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_bg.ts b/translations/veyon_bg.ts index 87123e6af..ebe5e109f 100644 --- a/translations/veyon_bg.ts +++ b/translations/veyon_bg.ts @@ -685,10 +685,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - Please specify the command to display help for! - TYPE TYPE @@ -729,6 +725,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1193,6 +1197,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1612,10 +1624,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1800,10 +1808,134 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + HOST ADDRESS + + + FEATURE + + - Feature control - Feature control + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Name + + + Description + + + + Master + Master + + + Service + Service + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -3137,6 +3269,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Locations & computers + + Only show computers with logged on users + + MasterConfigurationPage @@ -3327,6 +3463,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3392,7 +3540,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3675,6 +3823,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3936,19 +4092,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Service is running - - - Service is not running - Service is not running - - - Configure and control Veyon service - Configure and control Veyon service - + ServiceControlCommands Register Veyon Service Register Veyon Service @@ -3973,13 +4117,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service Query status of Veyon Service + + Service is running + Service is running + + + Service is not running + Service is not running + + + Configure and control Veyon service + Configure and control Veyon service + Commands for configuring and controlling Veyon Service Commands for configuring and controlling Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file Run command file @@ -3989,8 +4145,8 @@ Typically this is required to support terminal servers. File "%1" does not exist! - Interactive shell and script execution for Veyon Control - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4300,6 +4456,10 @@ The second button removes the selected or last computer. Authentication test Authentication test + + Screen %1 + + VeyonServiceControl @@ -4380,6 +4540,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl @@ -4387,30 +4551,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. The service "%1" is already installed. - - The service "%1" could not be installed. - The service "%1" could not be installed. - The service "%1" has been installed successfully. The service "%1" has been installed successfully. - - The service "%1" could not be uninstalled. - The service "%1" could not be uninstalled. - The service "%1" has been uninstalled successfully. The service "%1" has been uninstalled successfully. - - The start type of service "%1" could not be changed. - The start type of service "%1" could not be changed. - Service "%1" could not be found. Service "%1" could not be found. + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_ca_ES.ts b/translations/veyon_ca_ES.ts index 1371fe57e..ea816c073 100644 --- a/translations/veyon_ca_ES.ts +++ b/translations/veyon_ca_ES.ts @@ -15,64 +15,66 @@ About Veyon - + Quant al Veyon Contributors - + Col·laboradors Version: - + Versió: Website: - + Lloc web: Current language not translated yet (or native English). If you're interested in translating Veyon into your local or another language or want to improve an existing translation, please contact a Veyon developer! - + La llengua actual encara no s'ha traduït (o anglès natiu). + +Si esteu interessat a traduir el Veyon al vostre idioma local o a un altre o voleu millorar una traducció existent, poseu-vos en contacte amb un desenvolupador del Veyon! About %1 %2 - + Quant a %1 %2 Support Veyon project with a donation - + Doneu suport al projecte Veyon amb una donació AccessControlPage Computer access control - + Control d'accés a l'ordinador Grant access to every authenticated user (default) - + Concedeix accés a cada usuari autenticat (per defecte) Test - Comprova + Prova Process access control rules - + Processa les regles de control d'accés User groups authorized for computer access - + Grups d'usuaris autoritzats per a accedir a l'ordinador Please add the groups whose members should be authorized to access computers in your Veyon network. - + Afegiu els grups els membres dels quals haurien d'estar autoritzats per a accedir als ordinadors de la vostra xarxa Veyon. Authorized user groups - + Grups d'usuaris autoritzats All groups @@ -80,78 +82,78 @@ If you're interested in translating Veyon into your local or another langua Access control rules - + Regles de control d'accés Add access control rule - + Afegeix una regla de control d'accés Remove access control rule - + Suprimeix la regla de control d'accés Move selected rule down - + Mou avall la regla seleccionada Move selected rule up - + Mou amunt la regla seleccionada Edit selected rule - + Edita la regla seleccionada Enter username - + Introduïu el nom d'usuari Please enter a user login name whose access permissions to test: - + Introduïu un nom d'usuari d'inici de sessió amb els permisos d'accés per provar: Access allowed - + Accés permès The specified user is allowed to access computers with this configuration. - + L'usuari especificat té permís per a accedir als ordinadors amb aquesta configuració. Access denied - + Accés denegat The specified user is not allowed to access computers with this configuration. - + L'usuari especificat no té permís per a accedir als ordinadors amb aquesta configuració. Enable usage of domain groups - + Habilita l'ús de grups de domini User groups backend: - + Rerefons dels grups d'usuaris: Missing user groups backend - + Falta el rerefonss de grups d'usuaris No default user groups plugin was found. Please check your installation! - + No s'ha trobat cap connector de grups d'usuaris predeterminat. Comproveu la instal·lació! Restrict access to members of specific user groups - + Restringeix l'accés als membres de grups d'usuaris específics AccessControlRuleEditDialog Edit access control rule - + Edita la regla de control d'accés General @@ -159,253 +161,253 @@ If you're interested in translating Veyon into your local or another langua enter a short name for the rule here - + introduïu aquí un nom curt per a la regla Rule name: - + Nom de la regla: enter a description for the rule here - + introduïu aquí una descripció per a la regla Rule description: - + Descripció de la regla: Conditions - + Condicions If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Si s'activa més d'una condició cada condició s'ha de complir per tal que s'apliqui la regla (I lògic). Si només s'ha de complir una de les múltiples condicions (O lògic) creeu regles de control d'accés múltiples. Action - + Acció Allow access - + Permet l'accés Deny access - + Denega l'accés Ask logged on user for permission - + Demana permís a l'usuari None (rule disabled) - + Cap (regla inhabilitada) Accessing user - + S'està accedint a l'usuari Accessing computer - + S'està accedint a l'ordinador Always process rule and ignore conditions - + Processa sempre la regla i ignora les condicions Accessing computer and local computer - + Accés a l'ordinador i a l'ordinador local User being accessed - + S'està accedint a l'usuari is logged in locally - + està connectat localment is logged in remotely - + està connectat remotament No user is logged in locally - + No hi ha cap usuari connectat localment One or multiple users are logged in locally - + Un o diversos usuaris han iniciat la sessió local No user is logged in remotely - + No hi ha cap usuari connectat remotament One or multiple users are logged in remotely - + Un o diversos usuaris han iniciat sessió remotament is located at - + està situat a is not located at - + no està situat a are located at the same location - + es troben a la mateixa ubicació are not located the same location - + no es troben a la mateixa ubicació is member of group - + és membre del grup is not member of group - + no és membre del grup is authenticated via - + s'ha autenticat via is not authenticated via - + no s'ha autenticat via has one or more groups in common with user being accessed - + té un o més grups en comú amb l'usuari que s'està accedint has no groups in common with user being accessed - + no té grups en comú amb l'usuari que s'està accedint equals user being accessed - + és igual que l'usuari que s'està accedint is different from user being accessed - + és diferent que l'usuari que s'està accedint is already connected - + ja està connectat is not connected - + no està connectat is local computer - + és un ordinador local is not local computer - + no és un ordinador local Computer being accessed - + S'està accedint a l'ordinador Session being accessed is a user session - + La sessió que s'està accedint és una sessió d'usuari Session being accessed is a login screen - + La sessió que s'està accedint és una pantalla d'inici de sessió AccessControlRulesTestDialog Access control rules test - + Prova de regles de control d'accés Accessing user: - + Accés a l'usuari: Local computer: - + Ordinador local: Accessing computer: - + Accés a l'ordinador: Please enter the following user and computer information in order to test the configured ruleset. - + Introduïu la següent informació de l'usuari i de l'ordinador per a provar el conjunt de regles configurat. Local user: - + Usuari local: Connected users: - + Usuaris connectats: The access in the given scenario is allowed. - + Es permet l'accés a l'escenari indicat. The access in the given scenario is denied. - + Es denega l'accés a l'escenari indicat. The access in the given scenario needs permission of the logged on user. - + L'accés a l'escenari indicat necessita el permís de l'usuari connectat. ERROR: Unknown action - + ERROR: acció desconeguda Test result - + Resultat de la prova Authentication method - + Mètode d'autenticació AuthKeysConfigurationWidget Introduction - + Introducció Please perform the following steps to set up key file authentication: - + Realitzeu els passos següents per a configurar l'autenticació del fitxer de claus: 1) Create a key pair on the master computer. - + 1) Creeu un parell de claus a l'ordinador principal. 2) Set an access group whose members should be allowed to access other computers. - + 2) Establiu un grup d'accés els membres del qual han de tenir permís per accedir a altres ordinadors. 3) Export the public key and import it on all client computers with the same name. - + 3) Exporteu la clau pública i importeu en tots els ordinadors de client amb el mateix nom. Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Consulteu <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Manual de l'administrador del Veyon</a> per a més informació. Key file directories - + Directoris de fitxers de claus Public key file base directory @@ -417,300 +419,299 @@ If you're interested in translating Veyon into your local or another langua Available authentication keys - + Claus d'autenticació disponibles An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Un parell de claus d'autenticació consisteix en dues claus criptogràfiques acoblades, una clau privada i una de pública. +Una clau privada permet als usuaris de l'ordinador mestre accedir als ordinadors de client. +És important que només els usuaris autoritzats tinguin accés a la clau privada. +La clau pública s'utilitza en ordinadors de client per autenticar la sol·licitud de connexió entrant. Create key pair - + Crea un parell de claus Delete key - + Suprimeix la clau Import key - + Importa la clau Export key - + Exporta la clau Set access group - + Estableix el grup d'accés Key files (*.pem) - + Fitxers de claus (*.perm) Authentication key name - + Nom de la clau d'autenticació Please enter the name of the user group or role for which to create an authentication key pair: - + Introduïu el nom del grup d'usuaris o el rol per al qual crear un parell de claus d'autenticació: Do you really want to delete authentication key "%1/%2"? - + Esteu segur que voleu suprimir la clau d'autenticació «%1/%2»? Please select a key to delete! - + Seleccioneu una clau per suprimir! Please enter the name of the user group or role for which to import the authentication key: - + Introduïu el nom del grup d'usuaris o el rol per al qual s'importarà la clau d'autenticació: Please select a key to export! - + Seleccioneu una clau per exportar! Please select a user group which to grant access to key "%1": - + Seleccioneu un grup d'usuaris que puguin accedir a la clau "%1": Please select a key which to set the access group for! - + Seleccioneu una clau per a la qual establir el grup d'accés! AuthKeysManager Please check your permissions. - + Comproveu els permisos. Key name contains invalid characters! - + El nom de la clau conté caràcters no vàlids! Invalid key type specified! Please specify "%1" or "%2". - + S'ha especificat un tipus de clau no vàlid! Especifiqueu "%1" o "%2". Specified key does not exist! Please use the "list" command to list all installed keys. - + La clau especificada no existeix! Utilitzeu l'ordre «list» per a llistar totes les claus instal·lades. One or more key files already exist! Please delete them using the "delete" command. - + Ja existeix un o més fitxers de claus! Suprimiu-les utilitzant l'ordre «delete». Creating new key pair for "%1" - + S'està creant un parell de claus nou per a «%1» Failed to create public or private key! - + No s'ha pogut crear la clau pública o privada! Newly created key pair has been saved to "%1" and "%2". - + La parella de claus creada recentment s'ha desat a «%1» i «%2». Could not remove key file "%1"! - + No s'ha pogut suprimir el fitxer de claus «%1»! Could not remove key file directory "%1"! - + No s'ha pogut eliminar el directori de fitxers de claus «%1»! Failed to create directory for output file. - + No s'ha pogut crear el directori per al fitxer de sortida. File "%1" already exists. - + El fitxer «%1» ja existeix. Failed to write output file. - + No s'ha pogut escriure el fitxer de sortida. Key "%1/%2" has been exported to "%3" successfully. - + La clau "%1/%2" s'ha exportat a «%3» amb èxit. Failed read input file. - + Ha fallat la lectura del fitxer d'entrada. File "%1" does not contain a valid private key! - + El fitxer «%1» no conté una clau privada vàlida! File "%1" does not contain a valid public key! - + El fitxer «%1» no conté una clau pública vàlida! Failed to create directory for key file. - + No s'ha pogut crear el directori per al fitxer de claus. Failed to write key file "%1". - + No s'ha pogut escriure el fitxer de claus «%1». Failed to set permissions for key file "%1"! - + No s'han pogut establir els permisos del fitxer de claus «%1»! Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + La clau «%1/%2» s'ha importat correctament. Comproveu els permisos del fitxer de «%3» per a evitar els accessos no autoritzats. Failed to convert private key to public key - + No s'ha pogut convertir la clau privada a la clau pública Failed to create directory for private key file "%1". - + No s'ha pogut crear el directori per al fitxer de claus privades «%1». Failed to save private key in file "%1"! - + No s'ha pogut desar la clau privada al fitxer «%1»! Failed to set permissions for private key file "%1"! - + No s'han pogut establir els permisos del fitxer de claus privades «%1»! Failed to create directory for public key file "%1". - + No s'ha pogut crear el directori per al fitxer de claus públiques «%1». Failed to save public key in file "%1"! - + No s'ha pogut desar la clau pública al fitxer «%1»! Failed to set permissions for public key file "%1"! - + No s'han pogut establir els permisos del fitxer de claus públiques «%1»! Failed to set owner of key file "%1" to "%2". - + No s'ha pogut establir el propietari del fitxer de claus «%1» a «%2». Failed to set permissions for key file "%1". - + No s'han pogut establir els permisos del fitxer de claus «%1». Key "%1" is now accessible by user group "%2". - + La clau «%1» ara és accessible per al grup d'usuaris «%2». <N/A> - + <N/D> Failed to read key file. - + No s'ha pogut llegir el fitxer de claus. AuthKeysPlugin Create new authentication key pair - + Crea un parell de claus d'autenticació nou Delete authentication key - + Suprimeix la clau d'autenticació List authentication keys - + Llista les claus d'autenticació Import public or private key - + Importa una clau pública o privada Export public or private key - + Exporta la clau pública o privada Extract public key from existing private key - + Extreu la clau pública de la clau privada existent Set user group allowed to access a key - + Estableix el grup d'usuaris permesos per a accedir a una clau KEY - + CLAU ACCESS GROUP - + GRUP D'ACCÉS This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + Aquesta ordre ajusta els permisos d'accés als fitxers <KEY>de manera que només el grup d'usuaris<ACCESS GROUP> hi té permís de lectura. NAME - + NOM FILE - + FITXER This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + Aquesta ordre exporta la clau d'autenticació <KEY> a <FILE>. Si no s'especifica <FILE>, es construirà un nom a partir del nom i el tipus de <KEY>. This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + Aquesta ordre importa la clau d'autenticació <KEY> de <FILE>. Si no s'especifica <FILE>,. es construirà un nom a partir del nom i el tipus de <KEY>. This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - - - Please specify the command to display help for! - + Aquesta ordre llista totes les claus d'autenticació disponibles al directori de claus configurat. Si s'especifica l'opció «%1» es mostrarà una taula amb els detalls de la clau. Pot ser que faltin alguns detalls si una clau no és accessible p. ex. a causa de la manca de permisos de lectura. TYPE - + TIPUS PAIR ID - + ID DEL PARELL Commands for managing authentication keys - + Ordres per gestionar les claus d'autenticació This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + Aquesta ordre crea un nou parell de claus d'autenticació amb el nom <NAME> i desa la clau privada i pública als directoris de claus configurats. El paràmetre ha de ser un nom per a la clau, que només pot contenir lletres. This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + Aquesta ordre elimina la clau d'autenticació <KEY> del directori de claus configurat. Tingueu en compte que una clau no es pot recuperar una vegada s'ha eliminat. This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Aquesta ordre extreu la part de la clau pública de la clau privada <KEY> i la desa com a clau pública corresponent. Per tant, quan es crea un altre ordinador mestre, n'hi ha prou amb transferir la clau privada només. Llavors es pot extreure la clau pública. Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Els fitxers de claus d'autenticació no s'han configurat correctament en aquest ordinador. Creeu fitxers de claus nous o canvieu a un mètode d'autenticació diferent utilitzant el configurador de Veyon. Key file authentication @@ -718,11 +719,19 @@ The public key is used on client computers to authenticate incoming connection r Key file - + Fitxer de claus Please specify the key name (e.g. "teacher/public") as the first argument. - + Indiqueu el nom de la clau (p. ex. «professor/públic») com a primer argument. + + + Please specify the command to display help for. + Indiqueu l'ordre per a la qual es mostrarà l'ajuda. + + + The specified command does not exist or no help is available for it. + L'ordre indicada no existeix o no hi ha cap ajuda disponible per a ella. @@ -737,11 +746,11 @@ The public key is used on client computers to authenticate incoming connection r Access group - + Grup d'accés Pair ID - + ID del parell @@ -752,22 +761,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + Nom d'usuari per vincular el mapatge DN: e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + per exemple %username%MAINDOMAIN o cn=%username%,ou=usuaris,dc=example,dc=org AuthLdapDialog Veyon Logon - + Inici de sessió Veyon Please enter your domain/LDAP username and password in order to access computers. - + Introduïu el vostre nom d'usuari i contrasenya de domini/LDAP per a accedir als ordinadors. Username @@ -775,7 +784,7 @@ The public key is used on client computers to authenticate incoming connection r Password - Clau d'accés + Contrasenya Authentication error @@ -783,18 +792,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + L'inici de sessió ha fallat amb el nom d'usuari i la contrasenya indicats. Torneu-ho a provar! AuthLogonDialog Veyon Logon - + Inici de sessió Veyon Please enter your username and password in order to access computers. - + Introduïu el vostre nom d'usuari i contrasenya per a accedir als ordinadors. Username @@ -802,7 +811,7 @@ The public key is used on client computers to authenticate incoming connection r Password - Clau d'accés + Contrasenya Authentication error @@ -810,14 +819,14 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + L'inici de sessió ha fallat amb el nom d'usuari i la contrasenya indicats. Torneu-ho a provar! AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + El nom d'usuari o la contrasenya indicats no són correctes. Introduïu unes credencials vàlides o canvieu a un mètode d'autenticació diferent utilitzant el Configurador de Veyon. Logon authentication @@ -825,18 +834,18 @@ The public key is used on client computers to authenticate incoming connection r Logon - + Inici de sessió AuthSimpleDialog Veyon Logon - + Inici de sessió Veyon Please enter the Veyon password: - + Introduïu la contrasenya de Veyon: Authentication error @@ -844,54 +853,54 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + L'inici de sessió ha fallat amb la contrasenya indicada. Torneu-ho a provar! AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + La contrasenya proporcionada és incorrecta. Introduïu la contrasenya correcta o canvieu a un mètode d'autenticació diferent utilitzant el Configurador de Veyon. Simple password authentication - + Autenticació de contrasenya simple Simple password - + Contrasenya simple AuthenticationPage Authentication is set up properly on this computer. - + L'autenticació s'ha configurat correctament en aquest ordinador. AuthenticationPageTab Enabled - + Activat Test - Comprova + Prova BuiltinDirectoryConfiguration Builtin directory - + Directori integrat BuiltinDirectoryConfigurationPage Computers - + Ordinadors Name @@ -899,7 +908,7 @@ The public key is used on client computers to authenticate incoming connection r Host address/IP - + Adreça/IP de l'amfitrió MAC address @@ -907,62 +916,62 @@ The public key is used on client computers to authenticate incoming connection r Add new computer - + Afegeix un ordinador nou Remove selected computer - + Suprimeix l'ordinador seleccionat New computer - + Ordinador nou Builtin directory - + Directori integrat Locations - + Ubicacions Add new location - + Afegeix una ubicació nova Remove selected location - + Suprimeix la ubicació seleccionada New location - + Ubicació nova Directory name - + Nom del directori Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + La importació de fitxers CSV és possible a través de la interfície de la línia d'ordres. Per a més informació, vegeu la .<a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">documentació en línia</a>. BuiltinDirectoryPlugin Show help for specific command - + Mostra l'ajuda per a una ordre específica Import objects from given file - + Importa objectes des d'un fitxer donat Export objects to given file - + Exporta objectes a un fitxer donat Invalid type specified. Valid values are "%1" or "%2". - + S'ha especificat un tipus no vàlid. Els valors vàlids són «%1» o «%2». Type @@ -974,7 +983,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + Adreça de l'amfitrió MAC address @@ -982,291 +991,299 @@ The public key is used on client computers to authenticate incoming connection r Specified object not found. - + No s'ha trobat l'objecte especificat. File "%1" does not exist! - + El fitxer «%1» no existeix! Can't open file "%1" for reading! - + No es pot obrir el fitxer «%1» per a la lectura! Unknown argument "%1". - + Argument desconegut «%1». Computer "%1" (host address: "%2" MAC address: "%3") - + Ordinador "%1" (adreça host: "%2" adreça MAC: "%3") Unclassified object "%1" with ID "%2" - + Objecte no classificat «%1» amb ID «%2» None - + Cap Computer - + Ordinador Root - + Arrel Invalid - + No vàlid Error while parsing line %1. - + S'ha produït un error en analitzar la línia %1. Network object directory which stores objects in local configuration - + Directori d'objectes de xarxa que emmagatzema objectes en la configuració local Commands for managing the builtin network object directory - + Ordres per a gestionar el directori d'objectes de xarxa integrat No format string or regular expression specified! - + No s'ha especificat cap cadena de format o expressió regular! Can't open file "%1" for writing! - + No es pot obrir el fitxer «%1» per escriure! No format string specified! - + No s'ha especificat cap cadena de format! Object UUID - + UUID de l'objecte Parent UUID - + UUID pare Add a location or computer - + Afegeix una ubicació o un ordinador Clear all locations and computers - + Neteja totes les ubicacions i ordinadors Dump all or individual locations and computers - + Bolca totes les ubicacions o ordinadors individuals List all locations and computers - + Llista totes les ubicacions i ordinadors Remove a location or computer - + Elimina una ubicació o un ordinador Location "%1" - + Ubicació «%1» Builtin (computers and locations in local configuration) - + Integrat (ordinadors i ubicacions en la configuració local) Location - + Ubicació FILE - + FITXER LOCATION - + UBICACIÓ FORMAT-STRING-WITH-PLACEHOLDERS - + FORMAT-CADENA-AMB-MARCADORS-DE-POSICIÓ REGULAR-EXPRESSION-WITH-PLACEHOLDER - + EXPRESSIÓ-REGULAR-AMB-MARCADORS-DE-POSICIÓ Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Importa objectes del fitxer de text indicat utilitzant el format indicat cadena o expressió regular que conté un o diversos espais reservats. Els marcadors de posició vàlids són: %1 Import simple CSV file to a single room - + Importa un fitxer CSV senzill a una única sala Import CSV file with location name in first column - + Importa un fitxer CSV amb el nom de la ubicació a la primera columna Import text file with with key/value pairs using regular expressions - + Importa un fitxer de text amb parells clau/valor utilitzant expressions regulars Import arbitrarily formatted data - + Importa dades amb format arbitrari Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Exporta objectes al fitxer de text especificat utilitzant la cadena de format indicat que conté un o diversos espais reservats. Els marcadors de posició vàlids són: %1 Export all objects to a CSV file - + Exporta tots els objectes a un fitxer CSV Export all computers in a specific location to a CSV file - + Exporta tots els ordinadors en una ubicació específica a un fitxer CSV TYPE - + TIPUS NAME - + NOM PARENT - + PARE Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Afegeix un objecte on %1 pot ser un de «%2» o «%3». %4 es pot especificar per nom o UUID. Add a room - + Afegeix una sala Add a computer to room %1 - + Afegeix un ordinador a la sala %1 OBJECT - + OBJECTE Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Elimina l'objecte especificat del directori. Es pot especificar %1 per nom o UUID. Eliminar una ubicació també eliminarà tots els ordinadors relacionats. Remove a computer by name - + Suprimeix un ordinador per nom Remove an object by UUID - + Suprimeix un objecte per UUID "Room 01" - + «Sala 01» "Computer 01" - + «Ordinadors 01» HOST ADDRESS - + ADREÇA DE L'AMFITRIÓ MAC ADDRESS - + ADREÇA MAC + + + The specified command does not exist or no help is available for it. + L'ordre indicada no existeix o no hi ha cap ajuda disponible per a ella. BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + Servidor VNC integrat (UltraVNC) BuiltinX11VncServer Builtin VNC server (x11vnc) - + Servidor VNC integrat (x11vnc) ComputerControlListModel Host/IP address: %1 - + Adreça IP/amfitrió: %1 Active features: %1 - + Característiques actives: %1 Online and connected - + En línia i connectat Establishing connection - + S'està establint la connexió Computer offline or switched off - + Ordinador desconnectat o desactivat Authentication failed or access denied - + Ha fallat l'autenticació o s'ha denegat l'accés Disconnected - + Desconnectat No user logged on - + No hi ha cap usuari connectat Logged on user: %1 - + Usuari connectat: %1 Location: %1 - + Ubicació: %1 [no user] - + [cap usuari] Veyon Server unreachable or not running - + No es pot accedir al servidor Veyon o no s'està executant Name: %1 - + Nom: %1 invalid - + no vàlid + + + [none] + [cap] ComputerControlServer %1 Service %2 at %3:%4 - + %1 servei %2 a les %3:%4 Authentication error @@ -1274,27 +1291,27 @@ The public key is used on client computers to authenticate incoming connection r Remote access - + Accés remot User "%1" at host "%2" is now accessing this computer. - + L'usuari «%1» a l'amfitrió «%2» ara està accedint a aquest ordinador. User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + L'usuari «%1» a l'amfitrió «%2» ha intentat accedir a aquest ordinador, però no s'ha pogut autenticar correctament. Access control error - + Error de control d'accés User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + L'usuari «%1» a l'amfitrió «%2» ha intentat accedir a aquest ordinador, però s'ha blocat a causa de la configuració del control d'accés. Active connections: - + Connexions actives: @@ -1308,38 +1325,38 @@ The public key is used on client computers to authenticate incoming connection r ComputerManager User - + Usuari Missing network object directory plugin - + Falta el connector de directori d'objectes de xarxa No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + No s'ha trobat cap connector de directori d'objectes de xarxa per defecte. Comproveu la instal·lació o configureu un rerefons de directoris d'objectes de xarxa diferent a través del configurador de %1. Location detection failed - + Ha fallat la detecció de la ubicació Computer name;Hostname;User - + Nom de l'ordinador;Nom de l'ordinador;Usuari Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + No s'ha pogut determinar la ubicació d'aquest ordinador. Això indica un problema amb la configuració del sistema. Totes les ubicacions es mostraran al plafó de selecció de l'ordinador. ComputerMonitoring Computers - + Ordinadors Search users and computers - + Cerca usuaris i ordinadors Select all @@ -1362,261 +1379,257 @@ The public key is used on client computers to authenticate incoming connection r ComputerSelectPanel Computer search - + Cerca per ordinador Add location - + Afegeix una ubicació Save computer/user list - + Desa la llista d'ordinadors o usuaris Select output filename - + Selecciona el nom del fitxer de sortida CSV files (*.csv) - + Fitxers CSV (*.csv) File error - + Error de fitxer Could not write the computer and users list to %1! Please check the file access permissions. - + No s'ha pogut escriure la llista d'ordinadors i usuaris a %1! Comproveu els permisos d'accés als fitxers. ConfigCommands Clear system-wide Veyon configuration - + Neteja la configuració de Veyon a tot el sistema List all configuration keys and values - + Llista totes les claus i valors de configuració Import configuration from given file - + Importa la configuració des d'un fitxer donat Export configuration to given file - + Exporta la configuració al fitxer indicat Read and output configuration value for given key - + Valor de configuració de lectura i sortida per a la clau donada Write given value to given configuration key - + Escriu el valor donat a la clau de configuració donada Unset (remove) given configuration key - + Desfa (suprimeix) la clau de configuració donada Upgrade and save configuration of program and plugins - + Actualitza i desa la configuració del programa i els connectors Please specify an existing configuration file to import. - + Indiqueu un fitxer de configuració existent per importar. Configuration file is not readable! - + El fitxer de configuració no es pot llegir! Please specify a valid filename for the configuration export. - + Indiqueu un nom de fitxer vàlid per a l'exportació de la configuració. Output file is not writable! - + No es pot escriure el fitxer de sortida! Output directory is not writable! - + No es pot escriure en el directori de sortida! Please specify a valid key. - + Indiqueu una clau vàlida. Specified key does not exist in current configuration! - + La clau indicada no existeix a la configuració actual! Please specify a valid value. - + Indiqueu un valor vàlid. Configure Veyon at command line - + Configura Veyon a la línia d'ordres Commands for managing the configuration of Veyon - + Ordres per a gestionar la configuració de Veyon ConfigurationManager Could not modify the autostart property for the %1 Service. - + No s'ha pogut modificar la propietat d'inici automàtic per al servei %1. Could not configure the firewall configuration for the %1 Server. - + No s'ha pogut configurar la configuració del tallafoc per al servidor %1. Could not configure the firewall configuration for the %1 Worker. - + No s'ha pogut configurar la configuració del tallafoc per a l'operador de treball %1. Configuration is not writable. Please check your permissions! - + No es pot escriure la configuració. Comproveu-ne els permisos! Could not apply platform-specific configuration settings. - + No s'han pogut aplicar els paràmetres de configuració específics de la plataforma. Could not configure the firewall configuration for the %1 Service. - + No s'ha pogut configurar la configuració del tallafoc per al servei %1. DemoClient %1 Demo - + Demostració %1 DemoConfigurationPage Demo server - Servidor demo + Servidor de demostració Tunables - + Tunables ms - + ms Key frame interval - + Interval del marc de la clau Memory limit - + Límit de memòria MB - + MB Update interval - + Interval d'actualització s - + s Slow down thumbnail updates while demo is running - + Alenteix les actualitzacions de miniatures mentre s'està executant la demostració DemoFeaturePlugin Stop demo - + Atura la demostració Window demo - Demo en finestra + Demostració en finestra Give a demonstration by screen broadcasting - + Fa una demostració per emissió de pantalla In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + En aquest mode la pantalla es mostra en una finestra de tots els ordinadors. Els usuaris poden canviar a altres finestres segons sigui necessari. Demo - + Demostració Share your screen or allow a user to share his screen with other users. - + Comparteix la pantalla o permet que un usuari comparteixi la seva pantalla amb altres usuaris. Full screen demo - + Demostració en pantalla completa Share your own screen in fullscreen mode - + Compartiu la vostra pantalla en mode de pantalla completa In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + En aquest mode la pantalla es mostra en mode de pantalla completa en tots els ordinadors mentre que els dispositius d'entrada dels usuaris estan blocats. Share your own screen in a window - + Compartiu la vostra pantalla en una finestra Share selected user's screen in fullscreen mode - + Comparteix la pantalla de l'usuari seleccionat en mode de pantalla completa In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + En aquest mode la pantalla de l'usuari seleccionat es mostra en mode de pantalla completa en tots els ordinadors mentre que els dispositius d'entrada dels usuaris estan blocats. Share selected user's screen in a window - + Comparteix la pantalla de l'usuari seleccionat en una finestra In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + En aquest mode la pantalla de l'usuari seleccionat es mostra en una finestra de tots els ordinadors. Els usuaris poden canviar a altres finestres segons sigui necessari. Please select a user screen to share. - + Seleccioneu una pantalla d'usuari per a compartir. Please select only one user screen to share. - + Seleccioneu només una pantalla d'usuari per a compartir. All screens - - - - Screen %1 [%2] - + Totes les pantalles DesktopAccessDialog Desktop access dialog - + Diàleg d'accés a l'escriptori Confirm desktop access @@ -1632,7 +1645,7 @@ The public key is used on client computers to authenticate incoming connection r The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + L'usuari %1 de l'ordinador %2 vol accedir a l'escriptori. Voleu concedir-hi accés? @@ -1643,86 +1656,86 @@ The public key is used on client computers to authenticate incoming connection r Path - + Camí Predefined websites - + Llocs web predefinits Remove selected website - + Elimina el lloc web seleccionat URL - + URL New website - + Lloc web nou Applications & websites - + Aplicacions i llocs web Predefined applications - + Aplicacions predefinides Add new application - + Afegeix una aplicació nova Remove selected application - + Suprimeix l'aplicació seleccionada Add new website - + Afegeix un lloc web nou New application - + Aplicació nova DesktopServicesFeaturePlugin Open website - + Obre el lloc web Click this button to open a website on all computers. - + Feu clic en aquest botó per a obrir un lloc web en tots els ordinadors. Open website "%1" - + Obre el lloc web «%1» Custom website - + Lloc web personalitzat Start application - + Inicia l'aplicació Click this button to start an application on all computers. - + Feu clic en aquest botó per a iniciar una aplicació en tots els ordinadors. Start application "%1" - + Inicia l'aplicació «%1» Custom application - + Aplicació personalitzada Start apps and open websites in user sessions - + Inicia aplicacions i obre llocs web en sessions d'usuari @@ -1733,183 +1746,307 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + Sala %1 Please complete all tasks within the next 5 minutes. - + Completeu totes les tasques en els pròxims 5 minuts. Custom website - + Lloc web personalitzat Open file manager - + Obre el gestor de fitxers Start learning tool - + Inicia l'eina d'aprenentatge Play tutorial video - + Reprodueix un vídeo d'aprenentatge Handout - + Gestió Texts to read - + Textos per llegir generic-student-user - + usuari-estudiant-genèric Custom application - + Aplicació personalitzada ExternalVncServer External VNC server - + Servidor VNC extern ExternalVncServerConfigurationWidget External VNC server configuration - + Configuració externa del servidor VNC Port: - + Port: Password: - + Contrasenya: - FeatureControl + FeatureCommands - Feature control - + List names of all available features + Llista els noms de totes les característiques disponibles + + + Show table with details of all available features + Mostra la taula amb els detalls de totes les característiques disponibles + + + Start a feature on a remote host + Inicia una característica en un amfitrió remot + + + Stop a feature on a remote host + Atura una característica en un amfitrió remot + + + Please specify the command to display help for. + Indiqueu l'ordre per a la qual es mostrarà l'ajuda. + + + Displays a list with the names of all available features. + Mostra una llista amb els noms de totes les característiques disponibles. + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Mostra una taula amb informació detallada sobre totes les característiques disponibles. Aquesta informació inclou una descripció, l'UID, el nom del connector que proporciona la característica respectiva i alguns altres detalls relacionats amb la implementació. + + + HOST ADDRESS + ADREÇA DE L'AMFITRIÓ + + + FEATURE + CARACTERÍSTICA + + + ARGUMENTS + ARGUMENTS + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + Inicia la característica especificada a l'amfitrió especificat connectant-se al servidor Veyon que s'executa remotament. La característica es pot especificar per nom o UID. Utilitzeu l'ordre «show» per a veure totes les característiques disponibles. Depenent de la característica, s'han d'especificar arguments addicionals (com el missatge de text a mostrar) codificats com una cadena JSON única. Consulteu la documentació del desenvolupador per a més informació + + + Lock the screen + Bloca la pantalla + + + Display a text message + Mostra un missatge de text + + + Test message + Missatge de prova + + + Start an application + Inicia una aplicació + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + Atura la característica especificada a l'amfitrió especificat connectant-se al servidor Veyon que s'exectua remotament. La característica es pot especificar per nom o UID. Utilitzeu l'ordre «show» per a veure totes les característiques disponibles. + + + Unlock the screen + Desbloca la pantalla + + + The specified command does not exist or no help is available for it. + L'ordre indicada no existeix o no hi ha cap ajuda disponible per a ella. + + + Name + Nom + + + Description + Descripció + + + Master + Mestre + + + Service + Servei + + + Worker + Treballador + + + UID + UID + + + Plugin + Connector + + + Invalid feature name or UID specified + El nom o l'UID de l'objecte no és vàlid + + + Error parsing the JSON-encoded arguments: %1 + S'ha produït un error en analitzar els arguments codificats per JSON: %1 + + + Failed to initialize credentials + No s'han pogut inicialitzar les credencials + + + Could not establish a connection to host %1 + No s'ha pogut establir una connexió a l'amfitrió %1 + + + Failed to send feature control message to host %1 + No s'ha pogut enviar el missatge de control de característiques a l'amfitrió %1 + + + Feature-related CLI operations + Operacions CLI relacionades amb les característiques + + + Commands for controlling features + Ordres per a les funcions de control FileTransferConfigurationPage File transfer - + Transferència de fitxers Directories - Carpetes + Directoris Destination directory - + Directori de destinació Default source directory - + Directori font per defecte Options - + Opcions Remember last source directory - + Recorda l'últim directori font Create destination directory if it does not exist - + Crea un directori de destinació si no existeix FileTransferController Could not open file "%1" for reading! Please check your permissions! - + No s'ha pogut obrir el fitxer «%1» per a la lectura! Comproveu-ne els permisos! FileTransferDialog File transfer - + Transferència de fitxers Options - + Opcions Transfer only - + Només la transferència Transfer and open file(s) with associated program - + Transfereix i obre fitxers amb el programa associat Transfer and open destination folder - + Transfereix i obre la carpeta de destinació Files - + Fitxers Start - + Inici Overwrite existing files - + Sobreescriu els fitxers existents FileTransferFileDialog Select one or more files to transfer - + Seleccioneu un o més fitxers a transferir FileTransferPlugin File transfer - + Transferència de fitxers Click this button to transfer files from your computer to all computers. - + Feu clic en aquest botó per a transferir fitxers des del vostre ordinador a tots els ordinadors. Select one or more files to transfer - + Seleccioneu un o més fitxers a transferir Transfer files to remote computer - + Transfereix els fitxers a l'ordinador remot Received file "%1". - + Fitxer «%1» rebut. Could not receive file "%1" as it already exists. - + No s'ha pogut rebre el fitxer «%1» perquè ja existeix. Could not receive file "%1" as it could not be opened for writing! - + No s'ha pogut rebre el fitxer «%1» perquè no s'ha pogut obrir per escriure! @@ -1924,11 +2061,11 @@ The public key is used on client computers to authenticate incoming connection r Use system language setting - + Utilitza la configuració de llengua del sistema Veyon - + Veyon Logging @@ -1968,7 +2105,7 @@ The public key is used on client computers to authenticate incoming connection r Limit log file size - Límita la mida del fitxer de registre + Limita la mida del fitxer de registre Clear all log files @@ -1976,15 +2113,15 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - Registra en la sortida d'error estàndard + Registra cap a la sortida d'error estàndard %1 service - + Servei %1 The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + Cal parar temporalment el servei %1 per a eliminar els fitxers de registre. Voleu continuar? Log files cleared @@ -2004,31 +2141,31 @@ The public key is used on client computers to authenticate incoming connection r MB - + MB Rotate log files - + Fes rotació dels fitxers de registre x - + x Write to logging system of operating system - + Escriu al sistema de registre del sistema operatiu TLS configuration - + Configuració TLS Use certificate authority for TLS connections - + Utilitza l'autoritat de certificació per a les connexions TLS CA certificate file - + Fitxer de certificat CA ... @@ -2036,349 +2173,368 @@ The public key is used on client computers to authenticate incoming connection r Host certificate file - + Fitxer de certificat de l'amfitrió Host private key file - + Fitxer de clau privada de l'amfitrió HeadlessVncServer Headless VNC server - + Servidor VNC sense cap LdapBrowseDialog Browse LDAP - + Navega per l'LDAP LdapClient LDAP error description: %1 - + Descripció de l'error LDAP: %1 LdapConfiguration LDAP connection failed - + Ha fallat la connexió LDAP Could not connect to the LDAP server. Please check the server parameters. %1 - + No s'ha pogut connectar al servidor LDAP. Comproveu els paràmetres del servidor. + +%1 LDAP bind failed - + Ha fallat el vincle LDAP Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + No s'ha pogut vincular al servidor LDAP. Comproveu els paràmetres del servidor i vinculeu-ne les credencials. + +%1 LDAP bind successful - + Enllaç LDAP correcte Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + S'ha connectat correctament al servidor LDAP i s'ha realitzat un enllaç LDAP. Els paràmetres bàsics LDAP estan configurats correctament. LDAP base DN test failed - + Ha fallat la prova DN base de l'LDAP Could not query the configured base DN. Please check the base DN parameter. %1 - + No s'ha pogut consultar el DN base configurat. Comproveu el paràmetre base DN. + +%1 LDAP base DN test successful - + Prova DN base LDAP correcta The LDAP base DN has been queried successfully. The following entries were found: %1 - + El DN base LDAP s'ha consultat correctament. Es van trobar les següents entrades: + +%1 LDAP naming context test failed - + Ha fallat la prova de context de nomenclatura LDAP Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + No s'ha pogut consultar el DN base mitjançant contexts de nomenclatura. Comproveu el paràmetre de l'atribut de context de noms. + +%1 LDAP naming context test successful - + Prova de context de nomenclatura LDAP correcta The LDAP naming context has been queried successfully. The following base DN was found: %1 - + El context de nomenclatura LDAP s'ha consultat correctament. Es va trobar la base DN següent: +%1 user tree - + arbre d'usuari User tree - + Arbre d'usuari group tree - + arbre del grup Group tree - + Arbre de grups computer tree - + arbre de l'ordinador Computer tree - + Arbre de l'ordinador computer group tree - + arbre de grups d'ordinador Computer group tree - + Arbre de grups de l'ordinador user objects - + objectes d'usuari User login name attribute - + L'atribut de nom d'inici de sessió d'usuari group members - + membres del grup Group member attribute - + Atribut del membre del grup Group not found - + No s'ha trobat el grup Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + No s'ha pogut trobar un grup amb el nom «%1». Comproveu el nom del grup o el paràmetre de l'arbre de grups. computer objects - + objectes d'ordinador Computer display name attribute - + L'atribut nom de la pantalla de l'ordinador Invalid hostname - + El nom d'amfitrió no és vàlid You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + Heu configurat els noms d'amfitrió de l'ordinador perquè s'emmagatzemin com a noms de domini plenament qualificats (FQDN) però heu introduït un nom d'amfitrió sense domini. You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Heu configurat els noms de host de l'ordinador perquè s'emmagatzemin com a noms d'amfitrió senzills sense un nom de domini, però heu introduït un nom d'amfitrió amb una part del nom de domini. Computer hostname attribute - + L'atribut de nom de l'ordinador computer MAC addresses - + adreces MAC de l'ordinador Computer MAC address attribute - + L'atribut d'adreça MAC de l'ordinador computer locations - + ubicacions de l'ordinador Computer location attribute - + Atribut de la ubicació de l'ordinador Location name attribute - + Atribut del nom de la ubicació users - + usuaris user groups - + grups d'usuaris computers - + ordinadors computer groups - + grups d'ordinador computer containers - + contenidors d'ordinador groups of user - + grups d'usuari User not found - + No s'ha trobat l'usuari Could not find a user with the name "%1". Please check the username or the user tree parameter. - + No s'ha pogut trobar un usuari amb el nom «%1». Comproveu el nom d'usuari o el paràmetre de l'arbre d'usuaris. groups of computer - + grups d'ordinador Computer not found - + No s'ha trobat l'ordinador Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + No s'ha pogut trobar un ordinador amb el nom d'amfitrió «%1». Comproveu el nom del servidor o el paràmetre de l'arbre de l'ordinador. Hostname lookup failed - + Ha fallat la cerca del nom d'amfitrió Could not lookup hostname for IP address %1. Please check your DNS server settings. - + No s'ha pogut cercar el nom de l'amfitrió per a l'adreça IP per cent1. Comproveu la configuració del servidor DNS. location entries - + entrades de la ubicació Computer groups filter - + Filtre de grups d'ordinador Computer locations identification - + Identificació de les ubicacions de l'ordinador Filter for computer groups - + Filtra per grups d'ordinador Invalid test value - + Valor de prova no vàlid An empty or invalid value has been supplied for this test. - + S'ha proporcionat un valor buit o no vàlid per a aquesta prova. LDAP %1 test failed - + Ha fallat la prova LDAP %1 Could not query any entries in configured %1. Please check the parameter "%2". %3 - + No s'ha pogut consultar cap entrada a la configuració %1. Comproveu el paràmetre «%2». + +3% LDAP %1 test successful - + Prova LDAP %1 correcta The %1 has been queried successfully and %2 entries were found. - + S'ha consultat amb èxit %1 i s'han trobat %2 entrades. LDAP test failed - + Ha fallat la prova LDAP Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + No s'ha pogut consultar cap %1. Comproveu els paràmetres %2 i introduïu el nom d'un objecte existent. + +3% and - + i LDAP test successful - + Prova LDAP correcta %1 %2 have been queried successfully: %3 - + S'ha preguntat amb èxit %1 %2: + +3% LDAP filter test failed - + Ha fallat la prova del filtre LDAP Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + No s'ha pogut consultar %1 utilitzant el filtre configurat. Comproveu el filtre LDAP per a %1. + +2% LDAP filter test successful - + Prova de filtre LDAP correcta %1 %2 have been queried successfully using the configured filter. - + S'ha consultat correctament 1% 2% utilitzant el filtre configurat. LDAP directory - + Directori LDAP LdapConfigurationPage Basic settings - + Paràmetres bàsics General @@ -2386,347 +2542,347 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + Servidor LDAP i port Bind DN - + Enllaça DN Bind password - + Contrasenya d'enllaç Anonymous bind - + Anònim Use bind credentials - + Utilitza les credencials d'enllaç Base DN - + DN base Fixed base DN - + DN base fixa e.g. dc=example,dc=org - + p. ex. dc=example,dc=org Discover base DN by naming context - + DN base del Discover nomenant context e.g. namingContexts or defaultNamingContext - + p. ex. nomsContexts o defaultNamingContext Environment settings - + Configuració de l'entorn Object trees - + Objectes Computer tree - + Arbre de l'ordinador e.g. OU=Groups - + p. ex. OU=Groups User tree - + Arbre d'usuari e.g. OU=Users - + p. ex. OU=Users e.g. OU=Computers - + p. ex. OU=Computers Group tree - + Arbre de grups Perform recursive search operations in object trees - + Realitza operacions de cerca recursiva en arbres d'objectes Object attributes - + Atributs de l'objecte e.g. hwAddress - + p. ex. hwAddress e.g. member or memberUid - + p. ex. membre o membreUid e.g. dNSHostName - + p. ex. dNSHostName Computer MAC address attribute - + L'atribut d'adreça MAC de l'ordinador Group member attribute - + Atribut del membre del grup e.g. uid or sAMAccountName - + p. ex. uid o sAMAccountName Advanced settings - + Paràmetres avançats Optional object filters - + Filtres d'objectes opcionals Filter for user groups - + Filtra per grups d'usuaris Filter for users - + Filtra per usuaris Filter for computer groups - + Filtra per grups d'ordinador Group member identification - + Identificació dels membres del grup Distinguished name (Samba/AD) - + Nom distingit (Samba/AD) List all groups of a user - + Llista tots els grups d'un usuari List all groups of a computer - + Llista tots els grups d'un ordinador Get computer object by IP address - + Obté l'objecte d'ordinador per adreça IP Enter username - + Introduïu el nom d'usuari Please enter a user login name (wildcards allowed) which to query: - + Introduïu un nom d'usuari (es permeten els comodins) que voleu consultar: Enter group name - + Introduïu el nom del grup Please enter a group name whose members to query: - + Introduïu un nom de grup els membres del qual han de consultar: Enter computer name - + Introduïu el nom de l'ordinador Enter computer DN - + Introduïu el DN de l'ordinador Please enter the DN of a computer whose MAC address to query: - + Introduïu el DN d'un ordinador l'adreça MAC del qual s'ha de consultar: Please enter a user login name whose group memberships to query: - + Introduïu un nom d'usuari d'inici de sessió els membres del grup del qual consultaran: Enter computer IP address - + Introduïu l'adreça IP de l'ordinador Please enter a computer IP address which to resolve to an computer object: - + Introduïu una adreça IP de l'ordinador que s'ha de resoldre a un objecte de l'ordinador: (only if different from group tree) - + (només si és diferent de l'arbre de grups) Computer group tree - + Arbre de grups de l'ordinador Filter for computers - + Filtra per ordinadors e.g. room or computerLab - + p. ex. sala o ordinadorLab Integration tests - + Proves d'integració Computer groups - + Grups d'ordinador e.g. name or description - + p. ex. nom o descripció Filter for computer containers - + Filtra per contenidors d'ordinador Computer containers or OUs - + Contenidors d'ordinador o OU Connection security - + Seguretat de la connexió TLS certificate verification - + Verificació del certificat TLS System defaults - + Valors predeterminats del sistema Never (insecure!) - + Mai (insegur!) Custom CA certificate file - + Fitxer de certificat CA personalitzat None - + Cap TLS - + TLS SSL - + SSL e.g. (objectClass=computer) - + p. ex. (objectClass=computer) e.g. (objectClass=group) - + p. ex. (objectClass=group) e.g. (objectClass=person) - + p. ex. (objectClass=persona) e.g. (objectClass=room) or (objectClass=computerLab) - + p. ex. (objectClass=room) o (objectClass=computerLab) e.g. (objectClass=container) or (objectClass=organizationalUnit) - + p. ex. (objectClass=container) o (objectClass=organizationalUnit) Certificate files (*.pem) - + Fitxers de certificat (*.pem) Encryption protocol - + Protocol de xifratge Computer location attribute - + Atribut de la ubicació de l'ordinador Computer display name attribute - + L'atribut nom de la pantalla de l'ordinador Location name attribute - + Atribut del nom de la ubicació e.g. cn or displayName - + p. ex. cn o displayName Computer locations identification - + Identificació de les ubicacions de l'ordinador Identify computer locations (e.g. rooms) via: - + Identifica les ubicacions dels ordinadors (per exemple, les sales) a través de: Location attribute in computer objects - + L'atribut de localització en objectes d'ordinador List all entries of a location - + Llista totes les entrades d'una ubicació List all locations - + Llista totes les ubicacions Enter computer display name - + Introduïu el nom de la pantalla de l'ordinador Please enter a computer display name to query: - + Introduïu un nom per a la visualització de l'ordinador a consultar: Enter computer location name - + Introduïu el nom de la ubicació de l'ordinador Please enter the name of a computer location (wildcards allowed): - + Introduïu el nom d'una ubicació de l'ordinador (es permeten comodins): Enter location name - + Introduïu el nom de la ubicació Please enter the name of a location whose entries to query: - + Introduïu el nom d'una ubicació les entrades de la qual s'han de consultar: Browse - + Navega Test @@ -2734,177 +2890,177 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Noms d'amfitrió emmagatzemats com a noms de domini plenament qualificats (FQDN, p. ex. myhost.example.org) Computer hostname attribute - + L'atribut de nom de l'ordinador Please enter a computer hostname to query: - + Introduïu un nom d'amfitrió per a consultar: Enter hostname - + Introduïu el nom de l'amfitrió Please enter a computer hostname whose group memberships to query: - + Introduïu un nom d'amfitrió de l'ordinador les afiliacions del grup del qual consultar: User login name attribute - + L'atribut nom d'usuari Configured attribute for user login name or computer hostname (OpenLDAP) - + Atribut configurat per a l'usuari nom d'usuari o nom de l'ordinador (OpenLDAP) Directory name - + Nom del directori Query options - + Opcions de consulta Query nested user groups (supported by AD only) - + Consulta els grups d'usuaris imbricats (disponible només AD) LdapNetworkObjectDirectoryConfigurationPage LDAP - + LDAP Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + Utilitzeu la pàgina de configuració global LDAP per a configurar com recuperar ubicacions i ordinadors del servei de directori basat en LDAP. LdapPlugin Auto-configure the base DN via naming context - + Configura automàticament el DN base mitjançant el context de nomenclatura Query objects from LDAP directory - + Consulta objectes del directori LDAP Show help about command - + Mostra l'ajuda sobre l'ordre Commands for configuring and testing LDAP/AD integration - + Ordres per a configurar i provar la integració LDAP/AD Basic LDAP/AD support for Veyon - + Suport bàsic LDAP/AD per a Veyon %1 (load computers and locations from LDAP/AD) - + %1 (carrega els ordinadors i les ubicacions des de LDAP/AD) %1 (load users and groups from LDAP/AD) - + %1 (carrega usuaris i grups des de LDAP/AD) Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + Indiqueu un URL LDAP vàlid seguint l'esquema «ldap[s]://[usuar[:contrassenya]@nomamfitrió[:port]» No naming context attribute name given - falling back to configured value. - + No s'ha indicat el nom de l'atribut de context de noms - es retorna al valor configurat. Could not query base DN. Please check your LDAP configuration. - + No s'ha pogut consultar la base DN. Comproveu la configuració LDAP. Configuring %1 as base DN and disabling naming context queries. - + S'està configurant 1% com a base DN i s'estan inhabilitant les consultes de context de nomenclatura. Test binding to an LDAP server - + Prova la vinculació a un servidor LDAP The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + El nom d'usuari o la contrasenya indicats no són correctes. Introduïu credencials vàlides o canvieu a un mètode d'autenticació diferent utilitzant el Configurador de Veyon. LDAP bind - + Enllaç LDAP LinuxPlatformConfigurationPage Linux - + Linux Custom PAM service for user authentication - + Servei PAM personalitzat per a l'autenticació de l'usuari User authentication - + Autenticació de l'usuari User sessions - + Sessions d'usuari Minimum session lifetime before server start - + Durada mínima de la sessió abans de l'inici del servidor User login - + Usuari Login key sequence - + Seqüència de la clau d'inici de sessió LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + Connector implementant funcions abstractes per a la plataforma Linux LocationDialog Select location - + Selecciona la ubicació enter search filter... - + introduïu un filtre de cerca... MainToolBar Configuration - + Configuració Disable balloon tooltips - + Desactiva els consells d'eina de globus Show icons only - + Mostra només les icones @@ -2955,11 +3111,11 @@ The public key is used on client computers to authenticate incoming connection r Configuration not writable - La configuració no es pot escriure + No es pot escriure la configuració Load settings from file - Carregar ajustaments des d'un fitxer + Carrega ajustaments des d'un fitxer Save settings to file @@ -2971,31 +3127,31 @@ The public key is used on client computers to authenticate incoming connection r There are unsaved settings. Quit anyway? - Hi ha ajustaments no desats. Voleu sortir de totes formes? + Hi ha ajustaments sense desar. Voleu sortir de totes formes? Veyon Configurator - + Configurador de Veyon Service - + Servei Master - + Mestre Access control - + Control d'accés About Veyon - + Quant a Veyon Auto - + Automàtic About @@ -3003,91 +3159,91 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + %1 Configurador 2% JSON files (*.json) - + Fitxers JSON (*.json) The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + El rerefons de configuració local ha informat que no es pot escriure la configuració! Executeu el configurador de %1 amb privilegis més alts. Access denied - + Accés denegat According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + D'acord amb la configuració local, no teniu permís per a accedir als ordinadors de la xarxa. Inicieu sessió amb un compte diferent o deixeu que l'administrador del sistema comprovi la configuració local. Screenshots - + Captures de pantalla Feature active - + Funció activa The feature "%1" is still active. Please stop it before closing %2. - + La característica «%1» encara està activa. Atureu-la abans de tancar %2. Reset configuration - + Reinicia la configuració Do you really want to reset the local configuration and revert all settings to their defaults? - + Esteu segur que voleu restablir la configuració local i revertir tots els ajustaments als seus valors predeterminats? Search users and computers - + Cerca usuaris i ordinadors Align computers to grid - + Alinea els ordinadors a la graella %1 Configurator - + Configurador %1 Insufficient privileges - + Privilegis insuficients Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + No s'ha pogut iniciar amb els privilegis administratius. Assegureu-vos que hi ha instal·lat un programa semblant a sudo per al vostre entorn d'escriptori! El programa s'executarà amb privilegis d'usuari normals. Only show powered on computers - + Mostra només els ordinadors engegats &Save settings to file - + De&sa els ajustaments al fitxer &View - + &Visualitza &Standard - + E&stàndard &Advanced - + &Avançat Use custom computer arrangement - + Utilitza l'arranjament personalitzat de l'ordinador Locations && computers - + Ubicacions i ordinadors Authentication @@ -3095,15 +3251,15 @@ The public key is used on client computers to authenticate incoming connection r Adjust size of computer icons automatically - + Ajusta la mida de les icones de l'ordinador automàticament Slideshow - + Presentació Spotlight - + Focus Veyon Master @@ -3111,66 +3267,70 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers - + Ubicacions i ordinadors + + + Only show computers with logged on users + Mostra només els ordinadors amb usuaris connectats MasterConfigurationPage Directories - Carpetes + Directoris User configuration - + Configuració de l'usuari Feature on computer double click: - + Característica en fer doble clic a l'ordinador: Features - + Característiques All features - + Totes les característiques Disabled features - + Característiques desactivades Screenshots - + Captures de pantalla <no feature> - + <no feature> Basic settings - + Paràmetres bàsics Behaviour - + Comportament Enforce selected mode for client computers - + Força el mode seleccionat per als ordinadors de client Hide local computer - + Oculta l'ordinador local Hide computer filter field - + Oculta el camp de filtre de l'ordinador Actions such as rebooting or powering down computers - + Accions com ara reiniciar o apagar ordinadors User interface @@ -3178,129 +3338,141 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Color del fons Thumbnail update interval - + Interval d'actualització de les miniatures ms - + ms Program start - + Inici del programa Modes and features - + Modes i característiques User and computer name - + Nom d'usuari i ordinador Only user name - + Només nom d'usuari Only computer name - + Només nom de l'ordinador Computer thumbnail caption - + Títol de la miniatura de l'ordinador Text color - + Color del text Sort order - + Ordenació Computer and user name - + Nom de l'ordinador i l'usuari Computer locations - + Ubicacions de l'ordinador Show current location only - + Mostra només la ubicació actual Allow adding hidden locations manually - + Permet afegir ubicacions ocultes manualment Hide empty locations - + Oculta les ubicacions buides Show confirmation dialog for potentially unsafe actions - + Mostra el diàleg de confirmació per a accions potencialment insegures Perform access control - + Control d'accés Automatically select current location - + Selecciona automàticament la ubicació actual Automatically open computer select panel - + Obre automàticament el tauler de selecció de l'ordinador Use modern user interface (experimental) - + Utilitza la interfície d'usuari moderna (experimental) Thumbnail spacing - + Espaiat de les miniatures px - + px Hide local session - + Oculta la sessió local Auto - + Automàtic Thumbnail aspect ratio - + Relació d'aspecte de la miniatura Automatically adjust computer icon size - + Ajusta automàticament la mida de la icona de l'ordinador Open feature windows on the same screen as the main window - + Obre les finestres de les característiques a la mateixa pantalla que la finestra principal MonitoringMode Monitoring - + Monitoratge Builtin monitoring mode - + Mode de monitoratge integrat This mode allows you to monitor all computers at one or more locations. + Aquest mode us permet controlar tots els ordinadors en una o més ubicacions. + + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens @@ -3308,59 +3480,59 @@ The public key is used on client computers to authenticate incoming connection r NestedNetworkObjectDirectory All directories - + Tots els directoris NetworkObjectDirectoryConfigurationPage Update interval: - + Interval d'actualització: seconds - segons + segonds NetworkObjectDirectoryConfigurationPageTab Enabled - + Activat NetworkObjectTreeModel Locations/Computers - + Ubicacions/ordinadors OpenWebsiteDialog Open website - + Obre el lloc web e.g. Veyon - + p. ex. Veyon Remember and add to website menu - + Recorda i afegeix al menú del lloc web e.g. www.veyon.io - + p. ex. www.veyon.io Please enter the URL of the website to open: - + Introduïu l'URL del lloc web a obrir: Name: - + Nom: Website name @@ -3368,14 +3540,14 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins - + Llista els noms de tots els connectors instal·lats Show table with details of all installed plugins - + Mostra la taula amb els detalls de tots els connectors instal·lats Name @@ -3383,23 +3555,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + Descripció Version - + Versió UID - + UID Plugin-related CLI operations - + Operacions de l'CLI relacionades amb els connectors Commands for managing plugins - + Ordres per a gestionar connectors @@ -3410,7 +3582,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Feu clic en aquest botó per a activar tots els ordinadors. D'aquesta manera no cal engegar cada ordinador a mà. Reboot @@ -3418,7 +3590,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to reboot all computers. - + Feu clic en aquest botó per a reiniciar tots els ordinadors. Power down @@ -3426,85 +3598,87 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Feu clic en aquest botó per activar tots els ordinadors. D'aquesta manera no cal apagar cada ordinador a mà. Power on/down or reboot a computer - + Engega, apaga o reinicia un ordinador Confirm reboot - + Confirma el reinici Confirm power down - + Confirma l'apagada Do you really want to reboot the selected computers? - + Esteu segur que voleu reiniciar els ordinadors seleccionats? Power on a computer via Wake-on-LAN (WOL) - + Engega un ordinador via Wake-on-LAN (WOL) MAC ADDRESS - + ADREÇA MAC This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Aquesta ordre emet un paquet Wake-on-LAN (WOL) a la xarxa per tal d'engegar l'ordinador amb l'adreça MAC indicada. Please specify the command to display help for! - + Indiqueu l'ordre per a la qual es mostrarà l'ajuda! Invalid MAC address specified! - + S'ha indicat una adreça MAC no vàlida! Commands for controlling power status of computers - + Ordres per a controlar l'estat d'energia dels ordinadors Power down now - + Apaga ara Install updates and power down - + Instal·la les actualitzacions i apaga Power down after user confirmation - + Apaga després de la confirmació de l'usuari Power down after timeout - + Apaga després del temps d'espera The computer was remotely requested to power down. Do you want to power down the computer now? - + Ja s'ha demanat a l'ordinador que s'apagui remotament. Voleu apagar l'ordinador ara? The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + L'ordinador s'apagarà en %1 minuts, %2 segons. + +Deseu el vostre treball i tanqueu tots els programes. Do you really want to reboot <b>ALL</b> computers? - + Esteu segur que voleu reiniciar <b>TOTS</b> els ordinadors? Do you really want to power down <b>ALL</b> computers? - + Esteu segur que voleu engegar <b>TOTS</b> els ordinadors? Do you really want to power down the selected computers? - + Esteu segur que voleu apagar els ordinadors seleccionats? @@ -3515,26 +3689,26 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + Indiqueu un temps d'espera per a apagar els ordinadors seleccionats: minutes - + minuts seconds - + segons RemoteAccessFeaturePlugin Remote view - + Visualització remota Open a remote view for a computer without interaction. - + Obre una visualització remota per a un ordinador sense interacció. Remote control @@ -3542,23 +3716,23 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Obre una finestra de control remot per a un ordinador. Remote access - + Accés remot Remote view or control a computer - + Visualització remota o control remot a un ordinador Please enter the hostname or IP address of the computer to access: - + Introduïu el nom d'amfitrió o l'adreça IP de l'ordinador on voleu accedir: Show help about command - + Mostra l'ajuda sobre l'ordre @@ -3572,11 +3746,11 @@ Please save your work and close all programs. RemoteAccessWidget %1 - %2 Remote Access - + Accés remot %1 -%2 %1 - %2 - %3 Remote Access - + Accés remot %1 -%2 - 3% @@ -3591,7 +3765,7 @@ Please save your work and close all programs. Send shortcut - + Envia la drecera Fullscreen @@ -3603,35 +3777,35 @@ Please save your work and close all programs. Ctrl+Alt+Del - + Ctrl+Alt+Supr Ctrl+Esc - + Ctrl+Esc Alt+Tab - + Alt+Tab Alt+F4 - + Alt+F4 Win+Tab - + Win+Tab Win - + Win Menu - + Menú Alt+Ctrl+F1 - + Alt+Ctrl+F1 Connected. @@ -3639,46 +3813,54 @@ Please save your work and close all programs. Screenshot - + Captura Exit - + Surt Connecting... + S'està connectant... + + + Select screen + + All screens + Totes les pantalles + ScreenLockFeaturePlugin Lock - + Bloca Unlock - + Desbloca Lock screen and input devices of a computer - + Bloca la pantalla i els dispositius d'entrada d'un ordinador To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Per a reclamar tota l'atenció de l'usuari podeu blocar-li els ordinadors utilitzant aquest botó. En aquest mode es bloquen tots els dispositius d'entrada i les pantalles es posen en negre. Lock input devices - + Bloca els dispositius d'entrada Unlock input devices - + Desbloca els dispositius d'entrada To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Per a reclamar tota l'atenció de l'usuari podeu blocar-li els ordinadors utilitzant aquest botó. En aquest mode es bloquen tots els dispositius d'entrada mentre l'escriptori encara és visible. @@ -3689,52 +3871,52 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + No s'ha pogut prendre una captura de pantalla, ja que el directori %1 no existeix i no s'ha pogut crear. Screenshot - + Captura Could not open screenshot file %1 for writing. - + No s'ha pogut obrir el fitxer de captura de pantalla %1 en mode l'escriptura. ScreenshotFeaturePlugin Screenshot - + Captura Use this function to take a screenshot of selected computers. - + Utilitzeu aquesta funció per a fer una captura de pantalla dels ordinadors seleccionats. Screenshots taken - + Captures de pantalla Screenshot of %1 computer have been taken successfully. - + La captura de pantalla de l'ordinador %1 s'ha fet correctament. Take screenshots of computers and save them locally. - + Fa captures de pantalla dels ordinadors i les desa localment. ScreenshotManagementPage Screenshots - + Captures de pantalla ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + Aquí es llisten totes les captures de pantalla que heu fet. Podeu fer captures de pantalla fent clic a l'element «Captura de pantalla» del menú contextual d'un ordinador. Les captures de pantalla es poden gestionar utilitzant els botons següents. User: @@ -3742,7 +3924,7 @@ Please save your work and close all programs. Computer: - + Ordinador: Date: @@ -3762,11 +3944,11 @@ Please save your work and close all programs. Screenshot - + Captura Do you really want to delete all selected screenshots? - + Esteu segur que voleu suprimir totes les captures de pantalla seleccionades? @@ -3777,11 +3959,11 @@ Please save your work and close all programs. Autostart - Arranc automàtic + Inici automàtic Hide tray icon - Ocultar icona de la barra del sistema + Oculta la icona de la barra del sistema Start service @@ -3801,7 +3983,7 @@ Please save your work and close all programs. Enable firewall exception - Activar excepció en el tallafocs + Activa una excepció en el tallafocs Allow connections from localhost only @@ -3809,19 +3991,19 @@ Please save your work and close all programs. VNC server - + Servidor VNC Plugin: - + Connector: Restart %1 Service - + Reinicia el servei %1 All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Tots els ajustaments s'han desat correctament. Per a poder fer-ho efectiu, cal reiniciar el servei %1. Voleu reiniciar-la ara? Running @@ -3830,210 +4012,212 @@ Please save your work and close all programs. Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Si activeu aquesta opció, el servei iniciarà un procés de servidor per a cada sessió interactiva en un ordinador. +Normalment es requereix per a donar suport als servidors de terminals. Show notification on remote connection - + Mostra la notificació a la connexió remota Show notification when an unauthorized access is blocked - + Mostra la notificació quan es bloca un accés no autoritzat Maximum session count - + Nombre màxim de sessions Network port numbers - + Números del port de la xarxa Veyon server - + Servidor Veyon Internal VNC server - + Servidor VNC intern Feature manager - + Gestor de característiques Demo server - Servidor demo + Servidor de demostració Miscellaneous network settings - + Paràmetres de xarxa diversos Session mode - + Mode de sessió Local session mode (single server instance for primary local session) - + Mode de sessió local (instància única del servidor per a la sessió local primària) Active session mode (single server instance for active local or remote session) - + Mode de sessió activa (instància única del servidor per a la sessió activa local o remota) Multi session mode (distinct server instance for each local and remote desktop session) - + Mode de sessió múltiple (instàncies del servidor diferents per a cada sessió d'escriptori local i remot) ServiceControl Starting service %1 - + S'està iniciant el servei %1 Stopping service %1 - + S'està aturant el servei %1 Registering service %1 - + S'està registrant el servei %1 Unregistering service %1 - + S'està cancel·lant el registre del servei %1 Service control - + Control del servei - ServiceControlPlugin - - Service is running - - - - Service is not running - - - - Configure and control Veyon service - - + ServiceControlCommands Register Veyon Service - + Registre del servei Veyon Unregister Veyon Service - + Desregistrament del servei Veyon Start Veyon Service - + Inicia el servei Veyon Stop Veyon Service - + Atura el servei Veyon Restart Veyon Service - + Reinicia el servei Veyon Query status of Veyon Service - + Consulta l'estat del servei Veyon + + + Service is running + El servei s'està executant + + + Service is not running + El servei no s'està executant + + + Configure and control Veyon service + Configura i controla el servei Veyon Commands for configuring and controlling Veyon Service - + Ordres per a configurar i controlar el servei Veyon - ShellCommandLinePlugin + ShellCommands Run command file - + Executa el fitxer d'ordres File "%1" does not exist! - + El fitxer «%1» no existeix! - Interactive shell and script execution for Veyon Control - + Interactive shell and script execution for Veyon CLI + Execució interactiva de shell i script per a Veyon CLI Commands for shell functionalities - + Ordres per a les funcionalitats del shell SlideshowPanel Previous - + Anterior Start/pause - + Inicia/pausa Next - + Endavant Duration: - + Duració: SpotlightPanel Add selected computers - + Afegeix els ordinadors seleccionats Remove selected computers - + Suprimeix els ordinadors seleccionats Update computers in realtime - + Actualitza els ordinadors en temps real Spotlight - + Focus Please select at least one computer to add. - + Seleccioneu almenys un ordinador per a afegir-lo. Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + Afegiu ordinadors fent clic amb el botó central del ratolí o fent clic al primer botó de sota. +El segon botó elimina l'ordinador seleccionat o l'últim. StartAppDialog Start application - + Inicia l'aplicació Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + Introduïu les aplicacions que voleu iniciar en els ordinadors seleccionats. Podeu separar múltiples aplicacions per línies. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + p. ex. «C:\Program Files\VideoLAN\VLC\vlc.exe» Remember and add to application menu - + Recorda i afegeix al menú de l'aplicació Application name @@ -4041,40 +4225,40 @@ The second button removes the selected or last computer. Name: - + Nom: e.g. VLC - + p. ex. VLC SystemTrayIcon System tray icon - + Icona de la safata del sistema SystemUserGroupsPlugin User groups backend for system user groups - + Rerefons de grups d'usuari per a grups d'usuaris del sistema Default (system user groups) - + Per defecte (grups d'usuaris del sistema) TestingCommandLinePlugin Test internal Veyon components and functions - + Prova els components i funcions interns de Veyon Commands for testing internal components and functions of Veyon - + Ordres per a provar components i funcions interns de Veyon @@ -4085,7 +4269,7 @@ The second button removes the selected or last computer. Please enter your message which send to all selected users. - + Introduïu el missatge que s'enviarà a tots els usuaris seleccionats. @@ -4096,7 +4280,7 @@ The second button removes the selected or last computer. Use this function to send a text message to all users e.g. to assign them new tasks. - + Utilitzeu aquesta funció per a enviar un missatge de text a tots els usuaris p. ex. per assignar-los tasques noves. Message from teacher @@ -4104,7 +4288,7 @@ The second button removes the selected or last computer. Send a message to a user - + Envia un missatge a un usuari @@ -4119,23 +4303,23 @@ The second button removes the selected or last computer. Low accuracy (turbo mode) - Baixa precissió (mode turbo) + Baixa precisió (mode turbo) Builtin UltraVNC server configuration - + Configuració del servidor UltraVNC integrat Enable multi monitor support - + Habilita el suport per a monitors múltiples Enable Desktop Duplication Engine on Windows 8 and newer - + Habilita el motor de duplicació de l'escriptori al Windows 8 i posterior Maximum CPU usage - + Ús màxim de la CPU @@ -4146,18 +4330,18 @@ The second button removes the selected or last computer. Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + No s'ha pogut desar la vostra configuració personal! Comproveu el camí del fitxer de configuració de l'usuari utilitzant el configurador de %1. UserLoginDialog User login - + Inici de sessió de l'usuari Please enter a username and password for automatic login on all computers. - + Introduïu un nom d'usuari i una contrasenya per a l'inici de sessió automàtic en tots els ordinadors. Username @@ -4165,112 +4349,116 @@ The second button removes the selected or last computer. Password - Clau d'accés + Contrasenya UserSessionControlPlugin Log in - + Inicia la sessió Click this button to log in a specific user on all computers. - + Feu clic en aquest botó per a iniciar sessió en un usuari específic de tots els ordinadors. Log off - + Tanca la sessió Click this button to log off users from all computers. - + Feu clic en aquest botó per a tancar la sessió als usuaris de tots els ordinadors. Confirm user logoff - + Confirma la sortida de l'usuari Do you really want to log off the selected users? - + Esteu segur que voleu tancar la sessió als usuaris seleccionats? User session control - + Control de sessió d'usuari Do you really want to log off <b>ALL</b> users? - + Esteu segur que voleu tancar la sessió a <b>TOTS</b> els usuaris? VeyonCore [OK] - + [OK] [FAIL] - + [FALLADA] Invalid command! - + L'ordre no és vàlida! Available commands: - + Ordres disponibles: Invalid arguments given - + S'han donat arguments no vàlids Not enough arguments given - use "%1 help" for more information - + No s'han donat prou arguments - useu «%1 help» per a més informació Unknown result! - + Resultat desconegut! Available modules: - + Mòduls disponibles: No module specified or module not found - available modules are: - + No s'ha indicat cap mòdul o no s'ha trobat - els mòduls disponibles són: Plugin not licensed - + Connector sense llicència INFO - + INFORMACIÓ ERROR - + ERROR USAGE - + ÚS DESCRIPTION - + DESCRIPCIÓ EXAMPLES - + EXEMPLES WARNING - + AVÍS Authentication test + Prova d'autenticació + + + Screen %1 @@ -4278,21 +4466,21 @@ The second button removes the selected or last computer. VeyonServiceControl Veyon Service - + Servei Veyon WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + No s'ha pogut canviar la configuració de la generació SAS per programari. L'enviament de Ctrl+Alt+Supr a través del control remot no funcionarà! WindowsPlatformConfigurationPage Windows - + Windows General @@ -4300,57 +4488,61 @@ The second button removes the selected or last computer. Enable SAS generation by software (Ctrl+Alt+Del) - + Habilita la generació de SAS per programari (Ctrl+Alt+Del) Screen lock - + Bloqueig de la pantalla Hide taskbar - + Oculta la barra de tasques Hide start menu - + Oculta el menú d'inici Hide desktop - + Oculta l'escriptori User authentication - + Autenticació de l'usuari Use alternative user authentication mechanism - + Usa un mecanisme alternatiu d'autenticació d'usuari User login - + Inici de sesisó de l'usuari Input start delay - + Retard d'inici de l'entrada Simulated key presses interval - + Interval de pulsació de tecles simulades Confirm legal notice (message displayed before user logs in) - + Avís legal de confirmació (missatge que es mostra abans que l'usuari iniciï sessió) Use input device interception driver - + Utilitza el controlador d'intercepció del dispositiu d'entrada WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform + Connector implementant funcions abstractes per a la plataforma Windows + + + Internal display @@ -4358,46 +4550,50 @@ The second button removes the selected or last computer. WindowsServiceControl The service "%1" is already installed. - + El servei «%1» ja està instal·lat. - The service "%1" could not be installed. - + The service "%1" has been installed successfully. + El servei «%1» s'ha instal·lat correctament. - The service "%1" has been installed successfully. - + The service "%1" has been uninstalled successfully. + El servei «%1» s'ha desinstal·lat correctament. - The service "%1" could not be uninstalled. - + Service "%1" could not be found. + No s'ha trobat el servei «%1». - The service "%1" has been uninstalled successfully. - + The service "%1" could not be installed (error %2). + No s'ha pogut instal·lar el servei «%1» (error %2). - The start type of service "%1" could not be changed. - + Could not change the failure actions config for service "%1" (error %2). + No s'ha pogut canviar la configuració de les accions de fallada del servei «%1» (error %2). - Service "%1" could not be found. - + The service "%1" could not be uninstalled (error %2). + No s'ha pogut desintal·lar el servei «%1» (error%2). + + + The start type of service "%1" could not be changed (error %2). + No s'ha pogut canviar el tipus d'inici del servei «%1» (error %2). X11VncConfigurationWidget Builtin x11vnc server configuration - + Configuració del servidor x11vnc integrat Custom x11vnc parameters: - + Paràmetres personalitzats de x11vnc: Do not use X Damage extension - + No utilitzis l'extensió X Damage \ No newline at end of file diff --git a/translations/veyon_cs.ts b/translations/veyon_cs.ts index ff330f810..8f9f45a6e 100644 --- a/translations/veyon_cs.ts +++ b/translations/veyon_cs.ts @@ -685,10 +685,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Tento příkaz vypíše všechny dostupné ověřovací klíče v nastavené složce s klíči. Pokud je zadaná volba „%1“, bude namísto toho zobrazena tabulka s podrobnostmi o klíči. Některé podrobnosti mohou chybět pokud klíč není dostupný například kvůli chybějícím právům na čtení. - - Please specify the command to display help for! - Zadejte příkaz pro který chcete zobrazit nápovědu! - TYPE TYP @@ -729,6 +725,14 @@ Veřejná část je použita na klientských počítačích pro ověření pří Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1193,6 +1197,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří MAC ADDRESS MAC ADRESA + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří invalid + + [none] + + ComputerControlServer @@ -1612,10 +1624,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1800,10 +1808,134 @@ Veřejná část je použita na klientských počítačích pro ověření pří - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + ADRESA STROJE + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Název + + + Description + Popis + + + Master + Řídící + + + Service + Služba + + + Worker + + - Feature control - Ovládání funkce + UID + + + + Plugin + Zásuvný modul + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -3133,6 +3265,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří Locations & computers Umístění a počítače + + Only show computers with logged on users + + MasterConfigurationPage @@ -3323,6 +3459,18 @@ Veřejná část je použita na klientských počítačích pro ověření pří This mode allows you to monitor all computers at one or more locations. Tento režim umožňuje monitorovat veškeré počítače v jednom a více umístěních. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3388,7 +3536,7 @@ Veřejná část je použita na klientských počítačích pro ověření pří - PluginsCommands + PluginCommands List names of all installed plugins Vypsat názvy všech nainstalovaných zásuvných modulů @@ -3671,6 +3819,14 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3932,19 +4088,7 @@ Typicky je toto třeba na terminálových serverech. - ServiceControlPlugin - - Service is running - Služba je spuštěná - - - Service is not running - Služba není spuštěná - - - Configure and control Veyon service - Nastavit a ovládat službu Veyon - + ServiceControlCommands Register Veyon Service Zaregistrovat službu Veyon @@ -3969,13 +4113,25 @@ Typicky je toto třeba na terminálových serverech. Query status of Veyon Service Dotázat se na stav služby Veyon + + Service is running + Služba je spuštěná + + + Service is not running + Služba není spuštěná + + + Configure and control Veyon service + Nastavit a ovládat službu Veyon + Commands for configuring and controlling Veyon Service Přikazy pro nastavování a ovládání služby Veyon - ShellCommandLinePlugin + ShellCommands Run command file Spustit příkazový soubor @@ -3985,8 +4141,8 @@ Typicky je toto třeba na terminálových serverech. Soubor „%1“ neexistuje! - Interactive shell and script execution for Veyon Control - Interaktivní vykonávání shellu a skriptu pro ovládání Veyon + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4296,6 +4452,10 @@ The second button removes the selected or last computer. Authentication test Vyzkoušení ověřování + + Screen %1 + + VeyonServiceControl @@ -4376,6 +4536,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Zásuvný modul implementující abstrahující funkce pro platformu Windows + + Internal display + + WindowsServiceControl @@ -4383,30 +4547,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. Služba „%1“ je už nainstalovaná. - - The service "%1" could not be installed. - Službu „%1“ se nepodařilo nainstalovat - The service "%1" has been installed successfully. Služba „%1“ byla úspěšně nainstalována. - - The service "%1" could not be uninstalled. - Službu „%1“ se nepodařilo odinstalovat. - The service "%1" has been uninstalled successfully. Služba „%1“ byla úspěšně odinstalována. - - The start type of service "%1" could not be changed. - Typ spouštění služby „%1“ nemůže být změněn. - Service "%1" could not be found. Službu „%1“ se nedaří najít. + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_de.ts b/translations/veyon_de.ts index 7e54eb305..b3b0f970d 100644 --- a/translations/veyon_de.ts +++ b/translations/veyon_de.ts @@ -682,10 +682,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Dieser Befehl listet alle verfügbaren Authentifizierungsschlüssel im konfigurierten Schlüsselverzeichnis auf. Wenn die Option "%1" angegeben wird, wird stattdessen eine Tabelle mit Schlüsseldetails ausgegeben. Einige Details können fehlen, wenn auf einen Schlüssel nicht zugegriffen werden kann, z.B. aufgrund fehlender Leserechte. - - Please specify the command to display help for! - Bitte geben Sie den Befehl an, für den Hilfe angezeigt werden soll! - TYPE TYP @@ -726,6 +722,14 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Please specify the key name (e.g. "teacher/public") as the first argument. Bitte geben Sie den Schlüsselname (z.B. "teacher/public") als erstes Argument an. + + Please specify the command to display help for. + Bitte geben Sie den Befehl an, für den Hilfe angezeigt werden soll. + + + The specified command does not exist or no help is available for it. + Der angegebene Befehl existiert nicht oder es ist keine Hilfe für ihn verfügbar. + AuthKeysTableModel @@ -1190,6 +1194,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e MAC ADDRESS MAC-ADRESSE + + The specified command does not exist or no help is available for it. + Der angegebene Befehl existiert nicht oder es ist keine Hilfe für ihn verfügbar. + BuiltinUltraVncServer @@ -1263,6 +1271,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e invalid ungültig + + [none] + [keine] + ComputerControlServer @@ -1609,10 +1621,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e All screens Alle Bildschirme - - Screen %1 [%2] - Bildschirm %1 [%2] - DesktopAccessDialog @@ -1797,10 +1805,134 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e - FeatureControl + FeatureCommands + + List names of all available features + Namen aller verfügbaren Funktionen auflisten + + + Show table with details of all available features + Tabelle mit Details zu allen verfügbaren Funktionen anzeigen + + + Start a feature on a remote host + Eine Funktion auf einem entfernten Computer starten + + + Stop a feature on a remote host + Eine Funktion auf einem entfernten Computer stoppen + + + Please specify the command to display help for. + Bitte geben Sie den Befehl an, für den Hilfe angezeigt werden soll. + + + Displays a list with the names of all available features. + Zeigt eine Liste mit den Namen aller verfügbaren Funktionen an. + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Zeigt eine Tabelle mit detaillierten Informationen über alle verfügbaren Funktionen an. Diese Informationen umfassen eine Beschreibung, die UID, den Namen des Plugins, das die jeweilige Funktion bereitstellt, sowie einige andere implementierungsbezogene Details. + + + HOST ADDRESS + HOST-ADRESSE + + + FEATURE + FUNKTION + + + ARGUMENTS + ARGUMENTE + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + Startet die angegebene Funktion auf dem angegebenen Computer, indem eine Verbindung zum entfernt laufenden Veyon Server hergestellt wird. Die Funktion kann mittels Name oder UID angegeben werden. Benutzen Sie den ``show``-Befehl, um alle verfügbaren Funktionen zu sehen. Abhängig von der Funktion müssen zusätzliche Argumente (wie z.B. die anzuzeigende Textnachricht), kodiert als einzelne JSON-String, angegeben werden. Weitere Informationen entnehmen Sie bitte der Entwicklerdokumentation. + + + Lock the screen + Den Bildschirm sperren + + + Display a text message + Eine Textnachricht anzeigen + + + Test message + Testnachricht + + + Start an application + Eine Anwendung starten + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + Stoppt die angegebene Funktion auf dem angegebenen Computer, indem eine Verbindung zum entfernt laufenden Veyon Server hergestellt wird. Die Funktion kann mittels Name oder UID angegeben werden. Verwenden Sie den Befehl ``show``, um alle verfügbaren Funktionen zu sehen. + + + Unlock the screen + Den Bildschirm entsperren + + + The specified command does not exist or no help is available for it. + Der angegebene Befehl existiert nicht oder es ist keine Hilfe für ihn verfügbar. + + + Name + Name + + + Description + Beschreibung + + + Master + Master + + + Service + Dienst + + + Worker + Worker + + + UID + UID + + + Plugin + Plugin + + + Invalid feature name or UID specified + Ungültiger Featurename oder -UID angegeben + + + Error parsing the JSON-encoded arguments: %1 + Fehler beim Parsen der JSON-kodierten Argumente: %1 + + + Failed to initialize credentials + Initialisierung der Zugangsdaten fehlgeschlagen + + + Could not establish a connection to host %1 + Es konnte keine Verbindung zum Computer %1 hergestellt werden + + + Failed to send feature control message to host %1 + Die Funktionskontrollnachricht konnte nicht an den Computer %1 gesendet werden. + - Feature control - Funktionssteuerung + Feature-related CLI operations + Funktionsbezogene CLI-Operationen + + + Commands for controlling features + Befehle zur Steuerung von Funktionen @@ -3134,6 +3266,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Locations & computers Standorte & Computer + + Only show computers with logged on users + Nur Computer mit angemeldeten Benutzern anzeigen + MasterConfigurationPage @@ -3324,6 +3460,18 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e This mode allows you to monitor all computers at one or more locations. Dieser Modus erlaubt es Ihnen, alle Computer an einem oder mehreren Standorten zu beobachten. + + Query application version of the server + Anwendungsversion des Servers abfragen + + + Query active features + Aktive Funktionen abfragen + + + Query properties of remotely available screens + Eigenschaften entfernt verfügbarer Bildschirme abfragen + NestedNetworkObjectDirectory @@ -3389,7 +3537,7 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e - PluginsCommands + PluginCommands List names of all installed plugins Namen aller installierter Plugins auflisten @@ -3672,6 +3820,14 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Connecting... Verbinde... + + Select screen + Bildschirm auswählen + + + All screens + Alle Bildschirme + ScreenLockFeaturePlugin @@ -3933,19 +4089,7 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen. - ServiceControlPlugin - - Service is running - Dienst läuft - - - Service is not running - Dienst läuft nicht - - - Configure and control Veyon service - Veyon-Dienst konfigurieren und steuern - + ServiceControlCommands Register Veyon Service Veyon-Dienst registrieren @@ -3970,13 +4114,25 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Query status of Veyon Service Status des Veyon-Diensts abfragen + + Service is running + Dienst läuft + + + Service is not running + Dienst läuft nicht + + + Configure and control Veyon service + Veyon-Dienst konfigurieren und steuern + Commands for configuring and controlling Veyon Service Befehle zur Konfiguration und Steuerung des Veyon-Diensts - ShellCommandLinePlugin + ShellCommands Run command file Befehlsdatei ausführen @@ -3986,8 +4142,8 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Datei "%1 existiert nicht! - Interactive shell and script execution for Veyon Control - Interaktive Shell und Scriptausführung für Veyon Control + Interactive shell and script execution for Veyon CLI + Interaktive Shell und Scriptausführung für Veyon CLI Commands for shell functionalities @@ -4298,6 +4454,10 @@ Der zweite Button entfernt den gewählten oder letzten Computer. Authentication test Authentifizierungstest + + Screen %1 + Bildschirm %1 + VeyonServiceControl @@ -4378,6 +4538,10 @@ Der zweite Button entfernt den gewählten oder letzten Computer. Plugin implementing abstract functions for the Windows platform Plugin zur Implementierung abstrakter Funktionen für die Windows-Plattform + + Internal display + Interne Anzeige + WindowsServiceControl @@ -4385,30 +4549,34 @@ Der zweite Button entfernt den gewählten oder letzten Computer. The service "%1" is already installed. Der Dienst "%1" ist bereits installiert. - - The service "%1" could not be installed. - Der Dienst "%1" konnte nicht installiert werden. - The service "%1" has been installed successfully. Der Dienst "%1" wurde erfolgreich installiert. - - The service "%1" could not be uninstalled. - Der Dienst "%1" konnte nicht deinstalliert werden. - The service "%1" has been uninstalled successfully. Der Dienst "%1" wurde erfolgreich deinstalliert. - - The start type of service "%1" could not be changed. - Der Starttyp des Diensts "%1" konnte nicht geändert werden. - Service "%1" could not be found. Der Dienst "%1" wurde nicht gefunden. + + The service "%1" could not be installed (error %2). + Der Dienst "%1" konnte nicht installiert werden (Fehler %2). + + + Could not change the failure actions config for service "%1" (error %2). + Die Konfiguration der Fehlermaßnahmen für den Dienst "%1" konnte nicht geändert werden (%2). + + + The service "%1" could not be uninstalled (error %2). + Der Dienst "%1" konnte nicht deinstalliert werden (Fehler %2). + + + The start type of service "%1" could not be changed (error %2). + Der Starttyp des Diensts "%1" konnte nicht geändert werden (Fehler %2). + X11VncConfigurationWidget diff --git a/translations/veyon_el.ts b/translations/veyon_el.ts index df08ae472..e0f1a48e6 100644 --- a/translations/veyon_el.ts +++ b/translations/veyon_el.ts @@ -11,7 +11,7 @@ License - Άδεια + Άδεια χρήσης About Veyon @@ -39,11 +39,11 @@ If you're interested in translating Veyon into your local or another langua About %1 %2 - Σχετικά %1 %2 + Σχετικά με το %1 %2 Support Veyon project with a donation - Υποστήριξε το Veyon με μία δωρεά + Υποστήριξε το Veyon με μια δωρεά @@ -62,11 +62,11 @@ If you're interested in translating Veyon into your local or another langua Process access control rules - Επεξεργασία κανόνα ελέγχου πρόσβασης + Κανόνες ελέγχου πρόσβασης διεργασίας User groups authorized for computer access - Εξουσιοδοτημένα μέλη ομάδων με πρόσβαση στον υπολογιστή + Ομάδες χρηστών εξουσιοδοτημένες για πρόσβαση στον υπολογιστή Please add the groups whose members should be authorized to access computers in your Veyon network. @@ -74,7 +74,7 @@ If you're interested in translating Veyon into your local or another langua Authorized user groups - Εξουσιοδοτημένα μέλη ομάδων + Εξουσιοδοτημένες ομάδες χρηστών All groups @@ -82,7 +82,7 @@ If you're interested in translating Veyon into your local or another langua Access control rules - Έλεγχος πρόσβασης + Κανόνες ελέγχου πρόσβασης Add access control rule @@ -94,11 +94,11 @@ If you're interested in translating Veyon into your local or another langua Move selected rule down - Μετακίνηση του κανόνα προς τα κάτω + Μετακίνηση επιλεγμένου κανόνα προς τα κάτω Move selected rule up - Μετακίνηση του κανόνα προς τα πάνω + Μετακίνηση επιλεγμένου κανόνα προς τα επάνω Edit selected rule @@ -106,7 +106,7 @@ If you're interested in translating Veyon into your local or another langua Enter username - Εισάγετε όνομα χρήστη + Εισαγωγή ονόματος χρήστη Please enter a user login name whose access permissions to test: @@ -118,7 +118,7 @@ If you're interested in translating Veyon into your local or another langua The specified user is allowed to access computers with this configuration. - Ο συγκεκριμένος χρήστης έχει δικαίωμα πρόσβασης σε υπολογιστή, με αυτή την διαμόρφωση. + Ο συγκεκριμένος χρήστης έχει δικαίωμα πρόσβασης σε υπολογιστές με αυτή τη διαμόρφωση. Access denied @@ -126,11 +126,11 @@ If you're interested in translating Veyon into your local or another langua The specified user is not allowed to access computers with this configuration. - Ο συγκεκριμένος χρήστης δεν έχει δικαίωμα πρόσβασης σε υπολογιστή, με αυτή την διαμόρφωση. + Ο συγκεκριμένος χρήστης δεν έχει δικαίωμα πρόσβασης σε υπολογιστές με αυτή τη διαμόρφωση. Enable usage of domain groups - Ενεργοποιήση χρήσης ομάδων τομέα + Ενεργοποιήση χρήσης ομάδων τομέων User groups backend: @@ -197,7 +197,7 @@ If you're interested in translating Veyon into your local or another langua Ask logged on user for permission - + Ζήτησε άδεια από τον συνδεδεμένο χρήστη None (rule disabled) @@ -205,11 +205,11 @@ If you're interested in translating Veyon into your local or another langua Accessing user - + Πρόσβαση χρήστη Accessing computer - + Πρόσβαση υπολογιστή Always process rule and ignore conditions @@ -225,43 +225,43 @@ If you're interested in translating Veyon into your local or another langua is logged in locally - + είναι τοπικά συνδεδεμένος is logged in remotely - + είναι απομακρισμένα συνδεδεμένος No user is logged in locally - + Κανένας χρήστης δεν είναι τοπικά συνδεδεμένος One or multiple users are logged in locally - + Ένας ή παραπάνω χρήστες είναι τοπικά συνδεδεμένοι No user is logged in remotely - + Κανένας χρήστης δεν είναι απομακρισμένα συνδεδεμένος One or multiple users are logged in remotely - + Ένας ή παραπάνω χρήστες είναι απομακρισμένα συνδεδεμένοι is located at - + βρίσκεται στο is not located at - + δεν βρίσκεται στο are located at the same location - + βρίσκονται στην ίδια τοποθεσία are not located the same location - + δεν βρίσκονται στην ίδια τοποθεσία is member of group @@ -269,15 +269,15 @@ If you're interested in translating Veyon into your local or another langua is not member of group - + δεν είναι μέρος κάποιας ομάδας is authenticated via - + είναι πιστοποιημένος μέσω is not authenticated via - + δεν είναι πιστοποιημένος μέσω has one or more groups in common with user being accessed @@ -297,19 +297,19 @@ If you're interested in translating Veyon into your local or another langua is already connected - + έχει ήδη συνδεθεί is not connected - + δεν έχει συνδεθεί is local computer - + είναι τοπικός υπολογιστής is not local computer - + δεν είναι τοπικός υπολογιστής Computer being accessed @@ -340,7 +340,7 @@ If you're interested in translating Veyon into your local or another langua Accessing computer: - + Πρόσβαση στον υπολογιστή: Please enter the following user and computer information in order to test the configured ruleset. @@ -356,19 +356,19 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario is allowed. - + Επιτρέπεται η πρόσβαση στο δεδομένο σενάριο. The access in the given scenario is denied. - + Η πρόσβαση στο δεδομένο σενάριο δεν επιτρέπεται. The access in the given scenario needs permission of the logged on user. - + Η πρόσβαση στο δεδομένο σενάριο χρειάζεται άδεια από τον συνδεδεμένο χρήστη. ERROR: Unknown action - + ΣΦΑΛΜΑ: Άγνωστη ενέργεια Test result @@ -454,7 +454,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication key name - + Όνομα κλειδιού ελέγχου ταυτότητας Please enter the name of the user group or role for which to create an authentication key pair: @@ -613,7 +613,7 @@ The public key is used on client computers to authenticate incoming connection r <N/A> - + <N/A> Failed to read key file. @@ -652,7 +652,7 @@ The public key is used on client computers to authenticate incoming connection r KEY - + ΚΛΕΙΔΙ ACCESS GROUP @@ -664,11 +664,11 @@ The public key is used on client computers to authenticate incoming connection r NAME - + ΟΝΟΜΑ FILE - + ΑΡΧΕΙΟ This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. @@ -682,13 +682,9 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE - + ΤΥΠΟΣ PAIR ID @@ -726,6 +722,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -735,7 +739,7 @@ The public key is used on client computers to authenticate incoming connection r Type - + Τύπος Access group @@ -758,7 +762,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + π.χ. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org @@ -781,7 +785,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - + Σφάλμα ελέγχου ταυτότητας Logon failed with given username and password. Please try again! @@ -808,7 +812,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - + Σφάλμα ελέγχου ταυτότητας Logon failed with given username and password. Please try again! @@ -827,7 +831,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + Σύνδεση @@ -842,7 +846,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - + Σφάλμα ελέγχου ταυτότητας Logon failed with given password. Please try again! @@ -901,7 +905,7 @@ The public key is used on client computers to authenticate incoming connection r Host address/IP - Διεύθυνση ΙΡ + Διεύθυνση/ΙΡ κεντρικού υπολογιστή MAC address @@ -909,7 +913,7 @@ The public key is used on client computers to authenticate incoming connection r Add new computer - Προσθήκη υπολογιστή + Προσθήκη νέου υπολογιστή Remove selected computer @@ -917,7 +921,7 @@ The public key is used on client computers to authenticate incoming connection r New computer - Καινούριος υπολογιστής + Νέος υπολογιστής Builtin directory @@ -925,23 +929,23 @@ The public key is used on client computers to authenticate incoming connection r Locations - + Τοποθεσίες Add new location - + Προσθήκη νέας τοποθεσίας Remove selected location - + Αφαίρεση της επιλεγεμένης τοποθεσίας New location - + Νέα τοποθεσία Directory name - + Όνομα καταλόγου Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -968,7 +972,7 @@ The public key is used on client computers to authenticate incoming connection r Type - + Τύπος Name @@ -976,7 +980,7 @@ The public key is used on client computers to authenticate incoming connection r Host address - + Διεύθυνση υπολογιστή MAC address @@ -988,7 +992,7 @@ The public key is used on client computers to authenticate incoming connection r File "%1" does not exist! - + Το αρχείο "%1" δεν υπάρχει! Can't open file "%1" for reading! @@ -1012,7 +1016,7 @@ The public key is used on client computers to authenticate incoming connection r Computer - + Υπολογιστής Root @@ -1056,11 +1060,11 @@ The public key is used on client computers to authenticate incoming connection r Add a location or computer - + Προσθέστε μια τοποθεσία ή υπολογιστή Clear all locations and computers - + Εκκαθάριση όλων των τοποθεσιών και υπολογιστών Dump all or individual locations and computers @@ -1072,11 +1076,11 @@ The public key is used on client computers to authenticate incoming connection r Remove a location or computer - + Αφαιρέστε μια τοποθεσία ή υπολογιστή Location "%1" - + Τοποθεσία "%1" Builtin (computers and locations in local configuration) @@ -1084,15 +1088,15 @@ The public key is used on client computers to authenticate incoming connection r Location - + Τοποθεσία FILE - + ΑΡΧΕΙΟ LOCATION - + ΤΟΠΟΘΕΣΙΑ FORMAT-STRING-WITH-PLACEHOLDERS @@ -1136,11 +1140,11 @@ The public key is used on client computers to authenticate incoming connection r TYPE - + ΤΥΠΟΣ NAME - + ΟΝΟΜΑ PARENT @@ -1160,7 +1164,7 @@ The public key is used on client computers to authenticate incoming connection r OBJECT - + ΑΝΤΙΚΕΙΜΕΝΟ Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. @@ -1188,6 +1192,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + ΔΙΕΥΘΥΝΣΗ MAC + + + The specified command does not exist or no help is available for it. @@ -1237,7 +1245,7 @@ The public key is used on client computers to authenticate incoming connection r No user logged on - + Κανένας χρήστης σε σύνδεση Logged on user: %1 @@ -1257,12 +1265,16 @@ The public key is used on client computers to authenticate incoming connection r Name: %1 - + Όνομα: %1 invalid + + [none] + + ComputerControlServer @@ -1272,7 +1284,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - + Σφάλμα ελέγχου ταυτότητας Remote access @@ -1296,7 +1308,7 @@ The public key is used on client computers to authenticate incoming connection r Active connections: - + Ενεργές συνδέσεις: @@ -1326,7 +1338,7 @@ The public key is used on client computers to authenticate incoming connection r Computer name;Hostname;User - + Όνομα υπολογιστή;Κεντρικός υπολογιστής;Χρήστης Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. @@ -1341,15 +1353,15 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Αναζήτηση χρηστών και υπολογιστών Select all - + Επιλογή όλων Unselect all - + Αποεπιλογή όλων Add to group @@ -1368,7 +1380,7 @@ The public key is used on client computers to authenticate incoming connection r Add location - + Προσθήκη τοποθεσίας Save computer/user list @@ -1380,7 +1392,7 @@ The public key is used on client computers to authenticate incoming connection r CSV files (*.csv) - + Αρχεία CSV (*.csv) File error @@ -1504,7 +1516,7 @@ The public key is used on client computers to authenticate incoming connection r DemoConfigurationPage Demo server - + Διακομιστής επίδειξης Tunables @@ -1607,11 +1619,7 @@ The public key is used on client computers to authenticate incoming connection r All screens - - - - Screen %1 [%2] - + Όλες οι οθόνες @@ -1657,7 +1665,7 @@ The public key is used on client computers to authenticate incoming connection r URL - + URL New website @@ -1665,7 +1673,7 @@ The public key is used on client computers to authenticate incoming connection r Applications & websites - + Εφαρμογές και ιστότοποι Predefined applications @@ -1681,11 +1689,11 @@ The public key is used on client computers to authenticate incoming connection r Add new website - + Προσθήκη νέου ιστότοπου New application - + Νέα εφαρμογή @@ -1708,7 +1716,7 @@ The public key is used on client computers to authenticate incoming connection r Start application - + Έναρξη εφαρμογής Click this button to start an application on all computers. @@ -1797,9 +1805,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + Κλείδωμα οθόνης + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Όνομα + + + Description + + - Feature control + Master + + + + Service + Υπηρεσία + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -1807,7 +1939,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferConfigurationPage File transfer - + Μεταφορά αρχείων Directories @@ -1823,7 +1955,7 @@ The public key is used on client computers to authenticate incoming connection r Options - + Επιλογές Remember last source directory @@ -1845,11 +1977,11 @@ The public key is used on client computers to authenticate incoming connection r FileTransferDialog File transfer - + Μεταφορά αρχείων Options - + Επιλογές Transfer only @@ -1865,11 +1997,11 @@ The public key is used on client computers to authenticate incoming connection r Files - + Αρχεία Start - + Εκκίνηση Overwrite existing files @@ -1880,14 +2012,14 @@ The public key is used on client computers to authenticate incoming connection r FileTransferFileDialog Select one or more files to transfer - + Επιλέξτε ένα ή περισσότερα αρχεία για μεταφορά FileTransferPlugin File transfer - + Μεταφορά αρχείων Click this button to transfer files from your computer to all computers. @@ -1895,7 +2027,7 @@ The public key is used on client computers to authenticate incoming connection r Select one or more files to transfer - + Επιλέξτε ένα ή περισσότερα αρχεία για μεταφορά Transfer files to remote computer @@ -2261,7 +2393,7 @@ The public key is used on client computers to authenticate incoming connection r User not found - + Δεν βρέθηκε ο χρήστης Could not find a user with the name "%1". Please check the username or the user tree parameter. @@ -2548,7 +2680,7 @@ The public key is used on client computers to authenticate incoming connection r Enter computer name - + Εισαγωγή ονόματος υπολογιστή Enter computer DN @@ -2564,7 +2696,7 @@ The public key is used on client computers to authenticate incoming connection r Enter computer IP address - + Εισαγωγή διεύθυνσης IP υπολογιστή Please enter a computer IP address which to resolve to an computer object: @@ -2632,11 +2764,11 @@ The public key is used on client computers to authenticate incoming connection r TLS - + TLS SSL - + SSL e.g. (objectClass=computer) @@ -2764,7 +2896,7 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + Όνομα καταλόγου Query options @@ -2849,7 +2981,7 @@ The public key is used on client computers to authenticate incoming connection r LinuxPlatformConfigurationPage Linux - + Linux Custom PAM service for user authentication @@ -2857,7 +2989,7 @@ The public key is used on client computers to authenticate incoming connection r User authentication - + Έλεγχος ταυτότητας χρήστη User sessions @@ -2869,7 +3001,7 @@ The public key is used on client computers to authenticate incoming connection r User login - + Σύνδεση χρήστη Login key sequence @@ -2887,7 +3019,7 @@ The public key is used on client computers to authenticate incoming connection r LocationDialog Select location - + Επιλογή τοποθεσίας enter search filter... @@ -2945,7 +3077,7 @@ The public key is used on client computers to authenticate incoming connection r L&oad settings from file - + Φ&όρτωση ρυθμίσεων από αρχείο Ctrl+O @@ -2961,7 +3093,7 @@ The public key is used on client computers to authenticate incoming connection r Load settings from file - + Φόρτωση ρυθμίσεων από αρχείο Save settings to file @@ -3009,7 +3141,7 @@ The public key is used on client computers to authenticate incoming connection r JSON files (*.json) - + Αρχεία JSON (*.json) The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. @@ -3045,7 +3177,7 @@ The public key is used on client computers to authenticate incoming connection r Search users and computers - + Αναζήτηση χρηστών και υπολογιστών Align computers to grid @@ -3069,11 +3201,11 @@ The public key is used on client computers to authenticate incoming connection r &Save settings to file - + &Αποθήκευση ρυθμίσεων σε αρχείο &View - + &Προβολή &Standard @@ -3089,11 +3221,11 @@ The public key is used on client computers to authenticate incoming connection r Locations && computers - + Τοποθεσίες && υπολογιστές Authentication - + Αυθεντικοποίηση Adjust size of computer icons automatically @@ -3113,6 +3245,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + Τοποθεσίες & υπολογιστές + + + Only show computers with logged on users @@ -3204,11 +3340,11 @@ The public key is used on client computers to authenticate incoming connection r Only user name - + Μόνο όνομα χρήστη Only computer name - + Μόνο όνομα υπολογιστή Computer thumbnail caption @@ -3216,7 +3352,7 @@ The public key is used on client computers to authenticate incoming connection r Text color - + Χρώμα κειμένου Sort order @@ -3240,7 +3376,7 @@ The public key is used on client computers to authenticate incoming connection r Hide empty locations - + Απόκρυψη άδειων τοποθεσιών Show confirmation dialog for potentially unsafe actions @@ -3305,6 +3441,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3362,7 +3510,7 @@ The public key is used on client computers to authenticate incoming connection r Name: - + Όνομα: Website name @@ -3370,7 +3518,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3424,7 +3572,7 @@ The public key is used on client computers to authenticate incoming connection r Power down - + Τερματισμός λειτουργίας Click this button to power down all computers. This way you do not have to power down each computer by hand. @@ -3452,7 +3600,7 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS - + ΔΙΕΥΘΥΝΣΗ MAC This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. @@ -3472,19 +3620,19 @@ The public key is used on client computers to authenticate incoming connection r Power down now - + Τερματισμός λειτουργίας τώρα Install updates and power down - + Εγκατάσταση ενημερώσεων και τερματισμός λειτουργίας Power down after user confirmation - + Τερματισμός λειτουργίας μετά από επιβεβαίωση χρήστη Power down after timeout - + Τερματισμός λειτουργίας μετά από λήξη χρονικού ορίου The computer was remotely requested to power down. Do you want to power down the computer now? @@ -3513,7 +3661,7 @@ Please save your work and close all programs. PowerDownTimeInputDialog Power down - + Τερματισμός λειτουργίας Please specify a timeout for powering down the selected computers: @@ -3521,18 +3669,18 @@ Please save your work and close all programs. minutes - + λεπτά seconds - + δευτερόλεπτα RemoteAccessFeaturePlugin Remote view - + Απομακρυσμένη προβολή Open a remote view for a computer without interaction. @@ -3567,25 +3715,25 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + Απομακρυσμένη πρόσβαση: %1 RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 Απομακρυσμένη πρόσβαση %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Απομακρυσμένη πρόσβαση RemoteAccessWidgetToolBar View only - Προβολή μόνο + Μόνο προβολή Remote control @@ -3645,11 +3793,19 @@ Please save your work and close all programs. Exit - + Έξοδος Connecting... - + Σύνδεση... + + + Select screen + Επιλογή οθόνης + + + All screens + Όλες οι οθόνες @@ -3672,11 +3828,11 @@ Please save your work and close all programs. Lock input devices - + Κλείδωμα συσκευών εισόδου Unlock input devices - + Ξεκλείδωμα συσκευών εισόδου To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. @@ -3695,7 +3851,7 @@ Please save your work and close all programs. Screenshot - Στιγμιότυπο + Στιγμιότυπο οθόνης Could not open screenshot file %1 for writing. @@ -3706,7 +3862,7 @@ Please save your work and close all programs. ScreenshotFeaturePlugin Screenshot - Στιγμιότυπο + Στιγμιότυπο οθόνης Use this function to take a screenshot of selected computers. @@ -3729,7 +3885,7 @@ Please save your work and close all programs. ScreenshotManagementPage Screenshots - Στιγμιότυπα + Στιγμιότυπα οθόνης @@ -3756,7 +3912,7 @@ Please save your work and close all programs. Show - Προβολή + Εμφάνιση Delete @@ -3764,7 +3920,7 @@ Please save your work and close all programs. Screenshot - Στιγμιότυπο + Στιγμιότυπο οθόνης Do you really want to delete all selected screenshots? @@ -3791,7 +3947,7 @@ Please save your work and close all programs. Stopped - Τερματισμένη + Τερματίστηκε Stop service @@ -3811,15 +3967,15 @@ Please save your work and close all programs. VNC server - + Διακομιστής VNC Plugin: - + Προσθήκη: Restart %1 Service - + Επανεκκίνηση της υπηρεσίας %1 All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? @@ -3852,7 +4008,7 @@ Typically this is required to support terminal servers. Veyon server - + Διακομιστής Veyon Internal VNC server @@ -3860,11 +4016,11 @@ Typically this is required to support terminal servers. Feature manager - + Διαχείριση δυνατοτήτων Demo server - + Διακομιστής επίδειξης Miscellaneous network settings @@ -3891,11 +4047,11 @@ Typically this is required to support terminal servers. ServiceControl Starting service %1 - + Εκκίνηση της υπηρεσίας %1 Stopping service %1 - + Τερματισμός της υπηρεσίας %1 Registering service %1 @@ -3911,19 +4067,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Η υπηρεσία εκτελείται - - - Service is not running - Η υπηρεσία δεν εκτελείται - - - Configure and control Veyon service - - + ServiceControlCommands Register Veyon Service @@ -3948,23 +4092,35 @@ Typically this is required to support terminal servers. Query status of Veyon Service + + Service is running + Η υπηρεσία εκτελείται + + + Service is not running + Η υπηρεσία δεν εκτελείται + + + Configure and control Veyon service + + Commands for configuring and controlling Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file File "%1" does not exist! - + Το αρχείο "%1" δεν υπάρχει! - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -3976,34 +4132,34 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Προηγούμενο Start/pause - + Έναρξη/παύση Next - + Επόμενο Duration: - + Διάρκεια: SpotlightPanel Add selected computers - + Προσθήκη επιλεγμένων υπολογιστών Remove selected computers - + Αφαίρεση επιλεγμένων υπολογιστών Update computers in realtime - + Ενημέρωση υπολογιστών σε πραγματικό χρόνο Spotlight @@ -4023,7 +4179,7 @@ The second button removes the selected or last computer. StartAppDialog Start application - + Έναρξη εφαρμογής Please enter the applications to start on the selected computers. You can separate multiple applications by line. @@ -4031,23 +4187,23 @@ The second button removes the selected or last computer. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + π.χ. "C:\Program Files\VideoLAN\VLC\vlc.exe" Remember and add to application menu - + Απομνημόνευση και προσθήκη στο μενού εφαρμογών Application name - + Όνομα εφαρμογής Name: - + Όνομα: e.g. VLC - + π.χ. VLC @@ -4083,7 +4239,7 @@ The second button removes the selected or last computer. TextMessageDialog Send text message - Αποστολή μηνύματος + Αποστολή κειμένου μηνύματος Please enter your message which send to all selected users. @@ -4094,7 +4250,7 @@ The second button removes the selected or last computer. TextMessageFeaturePlugin Text message - Μήνυμα + Κείμενο μηνύματος Use this function to send a text message to all users e.g. to assign them new tasks. @@ -4137,14 +4293,14 @@ The second button removes the selected or last computer. Maximum CPU usage - + Μέγιστη χρήση CPU UserConfig No write access - + Χωρίς πρόσβαση εγγραφής Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. @@ -4155,11 +4311,11 @@ The second button removes the selected or last computer. UserLoginDialog User login - + Σύνδεση χρήστη Please enter a username and password for automatic login on all computers. - + Παρακαλώ εισάγετε ένα όνομα χρήστη και κωδικό πρόσβασης για αυτόματη σύνδεση σε όλους τους υπολογιστές. Username @@ -4174,27 +4330,27 @@ The second button removes the selected or last computer. UserSessionControlPlugin Log in - + Σύνδεση Click this button to log in a specific user on all computers. - + Κάντε κλικ σε αυτό το κουμπί για να συνδεθείτε σε έναν συγκεκριμένο χρήστη σε όλους τους υπολογιστές. Log off - + Αποσύνδεση Click this button to log off users from all computers. - + Κάντε κλικ σε αυτό το κουμπί για να αποσυνδέσετε χρήστες από όλους τους υπολογιστές. Confirm user logoff - + Επιβεβαίωση αποσύνδεσης χρήστη Do you really want to log off the selected users? - + Θέλετε πραγματικά να αποσυνδέσετε τους επιλεγμένους χρήστες; User session control @@ -4209,15 +4365,15 @@ The second button removes the selected or last computer. VeyonCore [OK] - + [OK] [FAIL] - + [ΑΠΟΤΥΧΙΑ] Invalid command! - + Μη έγκυρη εντολή! Available commands: @@ -4233,7 +4389,7 @@ The second button removes the selected or last computer. Unknown result! - + Άγνωστο αποτέλεσμα! Available modules: @@ -4249,38 +4405,42 @@ The second button removes the selected or last computer. INFO - + ΠΛΗΡ. ERROR - + ΣΦΑΛΜΑ USAGE - + ΧΡΗΣΗ DESCRIPTION - + ΠΕΡΙΓΡΑΦΗ EXAMPLES - + ΠΑΡΑΔΕΙΓΜΑΤΑ WARNING - + ΠΡΟΕΙΔΟΠΟΙΗΣΗ Authentication test + + Screen %1 + Οθόνη %1 + VeyonServiceControl Veyon Service - + Υπηρεσία Veyon @@ -4306,23 +4466,23 @@ The second button removes the selected or last computer. Screen lock - + Κλείδωμα οθόνης Hide taskbar - + Απόκρυψη γραμμής εργασιών Hide start menu - + Απόκρυψη μενού έναρξης Hide desktop - + Απόκρυψη επιφάνειας εργασίας User authentication - + Έλεγχος ταυτότητας χρήστη Use alternative user authentication mechanism @@ -4330,7 +4490,7 @@ The second button removes the selected or last computer. User login - + Σύνδεση χρήστη Input start delay @@ -4355,36 +4515,44 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl The service "%1" is already installed. - + Η υπηρεσία "%1" είναι ήδη εγκατεστημένη. - The service "%1" could not be installed. - + The service "%1" has been installed successfully. + Η υπηρεσία "%1" έχει εγκατασταθεί με επιτυχία. - The service "%1" has been installed successfully. - + The service "%1" has been uninstalled successfully. + Η υπηρεσία "%1" έχει απεγκατασταθεί με επιτυχία. - The service "%1" could not be uninstalled. - + Service "%1" could not be found. + Η υπηρεσία "%1" δεν ήταν δυνατό να βρεθεί. - The service "%1" has been uninstalled successfully. - + The service "%1" could not be installed (error %2). + Η υπηρεσία "%1" δεν ήταν δυνατό να εγκατασταθεί (σφάλμα %2). - The start type of service "%1" could not be changed. + Could not change the failure actions config for service "%1" (error %2). - Service "%1" could not be found. - + The service "%1" could not be uninstalled (error %2). + Η υπηρεσία "%1" δεν ήταν δυνατό να απεγκατασταθεί (σφάλμα %2). + + + The start type of service "%1" could not be changed (error %2). + Ο τύπος έναρξης της υπηρεσίας "%1" δεν μπόρεσε να αλλάξει (σφάλμα %2). diff --git a/translations/veyon_es_ES.ts b/translations/veyon_es_ES.ts index 62f4886d2..f140f2c5e 100644 --- a/translations/veyon_es_ES.ts +++ b/translations/veyon_es_ES.ts @@ -687,10 +687,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Este comando enumera todas las claves de autenticación disponibles en el directorio de claves configurado. Si se especifica la opción "%1", se mostrará una tabla con los detalles de las claves. Es posible que falten algunos detalles si no se puede acceder a una clave, p. ej. debido a la falta de permisos de lectura. - - Please specify the command to display help for! - Por favor, ¡especifique el comando sobre el cual mostrar ayuda! - TYPE TIPO @@ -731,6 +727,14 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Please specify the key name (e.g. "teacher/public") as the first argument. Especifique el nombre de la clave (p. ej., "teacher/public") como primer argumento. + + Please specify the command to display help for. + Por favor, especifique el comando para mostrar ayuda de el. + + + The specified command does not exist or no help is available for it. + El comando especificado no existe o no hay ayuda sobre el. + AuthKeysTableModel @@ -946,11 +950,11 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Directory name - + Nombre del directorio Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + Es posible importar archivos CSV a través de la interfaz de línea de comandos. Para obtener más información, consulte la <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">documentación en línea</a>. @@ -1195,6 +1199,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu MAC ADDRESS DIRECCIÓN MAC + + The specified command does not exist or no help is available for it. + El comando especificado no existe o no hay ayuda sobre el. + BuiltinUltraVncServer @@ -1262,12 +1270,16 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Name: %1 - + Nombre: %1 invalid invalido + + [none] + [ninguno/a] + ComputerControlServer @@ -1614,10 +1626,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu All screens Todas las pantallas - - Screen %1 [%2] - Pantalla %1 [%2] - DesktopAccessDialog @@ -1802,10 +1810,134 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu - FeatureControl + FeatureCommands + + List names of all available features + Lista de nombres de todas las funciones disponibles + + + Show table with details of all available features + Mostrar tabla con detalles de todas las funciones disponibles + + + Start a feature on a remote host + Iniciar una función en un host remoto + + + Stop a feature on a remote host + Detener una función en un host remoto + + + Please specify the command to display help for. + Por favor, especifique el comando para mostrar ayuda de el. + + + Displays a list with the names of all available features. + Muestra una lista con los nombres de todas las funciones disponibles. + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Muestra una tabla con información detallada sobre todas las funciones disponibles. Esta información incluye una descripción, el UID, el nombre del complemento que proporciona la función respectiva y algunos otros detalles relacionados con la implementación. + + + HOST ADDRESS + DIRECCIÓN DE EQUIPO + + + FEATURE + CARACTERÍSTICA + + + ARGUMENTS + ARGUMENTOS + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + Inicia la función especificada en el host especificado conectándose al Veyon Server que se ejecuta de forma remota. La función se puede especificar por nombre o UID. Utilice el comando ``show`` para ver todas las funciones disponibles. Dependiendo de la función, se deben especificar argumentos adicionales (como el mensaje de texto que se mostrará) codificados como una sola cadena JSON. Consulte la documentación para desarrolladores para obtener más información. + + + Lock the screen + Bloquear la pantalla + + + Display a text message + Mostrar un mensaje de texto + + + Test message + Mensaje de prueba + + + Start an application + Empezar una aplicación + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + Detiene la función especificada en el host especificado al conectarse al servidor Veyon que se ejecuta de forma remota. La función se puede especificar por nombre o UID. Utilice el comando ``show`` para ver todas las funciones disponibles. + + + Unlock the screen + Desbloquea la pantalla + + + The specified command does not exist or no help is available for it. + El comando especificado no existe o no hay ayuda sobre el. + + + Name + Nombre + + + Description + Descripción + + + Master + Maestro + + + Service + Servicio + + + Worker + Trabajador + + + UID + UID + + + Plugin + Complemento + + + Invalid feature name or UID specified + Se ha especificado un nombre de función o UID no válido + + + Error parsing the JSON-encoded arguments: %1 + Error al analizar los argumentos codificados en JSON: %1 + + + Failed to initialize credentials + Fallo al inicializar las credenciales + + + Could not establish a connection to host %1 + No se pudo establecer una conexión con el host %1 + + + Failed to send feature control message to host %1 + Error al enviar el mensaje de control de funciones al host %1 + - Feature control - Control de funciones + Feature-related CLI operations + Operaciones de CLI relacionadas con funciones + + + Commands for controlling features + Comandos para controlar funciones @@ -2027,15 +2159,15 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu TLS configuration - + Configuración de TLS Use certificate authority for TLS connections - + Utilizar la autoridad de certificación para las conexiones TLS CA certificate file - + Archivo de certificado de CA ... @@ -2043,11 +2175,11 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Host certificate file - + Archivo de certificado de equipo Host private key file - + Archivo de clave privada de equipo @@ -2397,7 +2529,7 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu LDAP directory - + Directorio LDAP @@ -2788,7 +2920,7 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Directory name - + Nombre del directorio Query options @@ -2807,7 +2939,7 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + Utilice la página de configuración global de LDAP para configurar cómo recuperar ubicaciones y computadoras de su servicio de directorio basado en LDAP. @@ -3139,6 +3271,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Locations & computers Ubicaciones y equipos + + Only show computers with logged on users + Mostrar solo equipos con usuarios registrados + MasterConfigurationPage @@ -3329,12 +3465,24 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu This mode allows you to monitor all computers at one or more locations. Este modo le permite monitorear todos los equipos en una o más ubicaciones. + + Query application version of the server + Consultar la versión de la aplicación del servidor + + + Query active features + Consultar funciones activas + + + Query properties of remotely available screens + Consultar propiedades de pantallas disponibles de forma remota + NestedNetworkObjectDirectory All directories - + Todos los directorios @@ -3394,7 +3542,7 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu - PluginsCommands + PluginCommands List names of all installed plugins Lista de nombres de todos los complementos instalados @@ -3675,7 +3823,15 @@ Por favor guarde su trabajo y cierre todos los programas. Connecting... - + Conectando ... + + + Select screen + Seleccionar pantalla + + + All screens + Todas las pantallas @@ -3899,19 +4055,19 @@ Por lo general, esto es necesario para admitir servidores de terminales. Session mode - + Modo de sesión Local session mode (single server instance for primary local session) - + Modo de sesión local (instancia de servidor único para sesión local principal) Active session mode (single server instance for active local or remote session) - + Modo de sesión activa (instancia de servidor único para sesión local o remota activa) Multi session mode (distinct server instance for each local and remote desktop session) - + Modo de sesión múltiple (instancia de servidor distinta para cada sesión de escritorio local y remota) @@ -3938,19 +4094,7 @@ Por lo general, esto es necesario para admitir servidores de terminales. - ServiceControlPlugin - - Service is running - El servicio esta ejecutándose - - - Service is not running - El servicio no está ejecutándose - - - Configure and control Veyon service - Configurar y controlar el Servicio de Veyon - + ServiceControlCommands Register Veyon Service Registrar Servicio Veyon @@ -3975,13 +4119,25 @@ Por lo general, esto es necesario para admitir servidores de terminales.Query status of Veyon Service Consultar estado de Servicio Veyon + + Service is running + El servicio esta ejecutándose + + + Service is not running + El servicio no está ejecutándose + + + Configure and control Veyon service + Configurar y controlar el Servicio de Veyon + Commands for configuring and controlling Veyon Service Comandos para configurar y controlar el Servicio Veyon - ShellCommandLinePlugin + ShellCommands Run command file Ejecutar archivo de comandos @@ -3991,8 +4147,8 @@ Por lo general, esto es necesario para admitir servidores de terminales.¡El archivo "%1" no existe! - Interactive shell and script execution for Veyon Control - Ejecución interactiva de shell y script para el Control de Veyon + Interactive shell and script execution for Veyon CLI + Ejecución interactiva de shell y script para Veyon CLI Commands for shell functionalities @@ -4043,7 +4199,8 @@ Por lo general, esto es necesario para admitir servidores de terminales. Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + Agregue computadoras haciendo clic con el botón central del ratón o haciendo clic en el botón primario más abajo. +El botón secundario elimina el equipo seleccionado o el último. @@ -4302,6 +4459,10 @@ The second button removes the selected or last computer. Authentication test Prueba de autenticacion + + Screen %1 + Pantalla %1 + VeyonServiceControl @@ -4382,6 +4543,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Plugin implementando funciones abstractas para la plataforma Windows + + Internal display + Pantalla interna + WindowsServiceControl @@ -4389,30 +4554,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. El servicio "%1" ya está instalado. - - The service "%1" could not be installed. - No se pudo instalar el servicio "%1". - The service "%1" has been installed successfully. El servicio "%1" se ha instalado correctamente. - - The service "%1" could not be uninstalled. - El servicio "%1" no se pudo desinstalar. - The service "%1" has been uninstalled successfully. El servicio "%1" se ha desinstalado correctamente. - - The start type of service "%1" could not be changed. - El tipo de inicio de servicio "%1" no se pudo cambiar. - Service "%1" could not be found. No se pudo encontrar el servicio "%1". + + The service "%1" could not be installed (error %2). + No se pudo instalar el servicio "%1" (error %2). + + + Could not change the failure actions config for service "%1" (error %2). + No se pudo cambiar la configuración de acciones de fallo para el servicio "%1" (error %2). + + + The service "%1" could not be uninstalled (error %2). + No se pudo desinstalar el servicio "%1" (error %2). + + + The start type of service "%1" could not be changed (error %2). + No se pudo cambiar el tipo de inicio del servicio "%1" (error %2). + X11VncConfigurationWidget diff --git a/translations/veyon_et.ts b/translations/veyon_et.ts index 763c50483..e228d863b 100644 --- a/translations/veyon_et.ts +++ b/translations/veyon_et.ts @@ -685,10 +685,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. See käsk loetleb kõik saadaolevad autentimisvõtmed konfigureeritud võtmete kataloogis. Kui määratakse suvand "%1", kuvatakse selle asemel võtme üksikasjadega tabel. Mõni detail võib puududa, kui võtmele pole juurdepääsu, nt. lugemisõiguste puudumise tõttu. - - Please specify the command to display help for! - Palun määrake käsk, mille jaoks abi kuvatakse! - TYPE TÜÜP @@ -729,6 +725,14 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Please specify the key name (e.g. "teacher/public") as the first argument. Palun määrake esimese argumendina võtme nimi (näiteks „õpetaja/avalik”). + + Please specify the command to display help for. + Palun määrake käsk abi kuvamiseks. + + + The specified command does not exist or no help is available for it. + Määratud käsku pole olemas või selle jaoks pole abi saadaval. + AuthKeysTableModel @@ -944,11 +948,11 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Directory name - + Kataloogi nimi Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + CSV -failide importimine on võimalik käsurealiidese kaudu. Lisateabe saamiseks vaadake <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">veebipõhist dokumentatsiooni</a>. @@ -1193,6 +1197,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten MAC ADDRESS MAC AADRESS + + The specified command does not exist or no help is available for it. + Määratud käsku pole olemas või selle jaoks pole abi saadaval. + BuiltinUltraVncServer @@ -1260,12 +1268,16 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Name: %1 - + Nimi: %1 invalid kehtetu + + [none] + [pole] + ComputerControlServer @@ -1612,10 +1624,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten All screens Kõik ekraanid - - Screen %1 [%2] - Ekraan %1 [%2] - DesktopAccessDialog @@ -1800,10 +1808,134 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten - FeatureControl + FeatureCommands + + List names of all available features + Loetlege kõigi saadaolevate funktsioonide nimed + + + Show table with details of all available features + Kuva tabel kõigi saadaolevate funktsioonide üksikasjadega + + + Start a feature on a remote host + Käivitage funktsioon kaughostis + + + Stop a feature on a remote host + Funktsiooni peatamine kaughostis + + + Please specify the command to display help for. + Palun määrake käsk abi kuvamiseks. + + + Displays a list with the names of all available features. + Kuvab loendi kõigi saadaolevate funktsioonide nimedega. + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Kuvab tabeli üksikasjaliku teabega kõigi saadaolevate funktsioonide kohta. See teave sisaldab kirjeldust, UID-d, vastavat funktsiooni pakkuva pistikprogrammi nime ja mõningaid muid juurutamisega seotud üksikasju. + + + HOST ADDRESS + IP AADRESS + + + FEATURE + Tunnusjoon + + + ARGUMENTS + ARGUMENTID + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + Käivitab määratud funktsiooni määratud hostis, luues ühenduse kaugtöötava Veyoni serveriga. Funktsiooni saab määrata nime või UID-ga. Kõigi saadaolevate funktsioonide vaatamiseks kasutage käsku ``show``. Olenevalt funktsioonist tuleb määrata täiendavad argumendid (nt kuvatav tekstsõnum), mis on kodeeritud ühe JSON-stringina. Lisateabe saamiseks vaadake arendaja dokumentatsiooni + + + Lock the screen + Lukustage ekraan + + + Display a text message + Tekstisõnumi kuvamine + + + Test message + Testsõnum + + + Start an application + Käivitage rakendus + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + Peatab määratud funktsiooni määratud hostis, luues ühenduse kaugtöötava Veyoni serveriga. Funktsiooni saab määrata nime või UID-ga. Kõigi saadaolevate funktsioonide vaatamiseks kasutage käsku ``show``. + + + Unlock the screen + Avage ekraan + + + The specified command does not exist or no help is available for it. + Määratud käsku pole olemas või selle jaoks pole abi saadaval. + + + Name + Nimi + + + Description + Kirjeldus + + + Master + Master + + + Service + Teenus + + + Worker + Tööline + + + UID + UID + + + Plugin + Pistikprogramm + + + Invalid feature name or UID specified + Määratud on kehtetu objekti nimi või UID + + + Error parsing the JSON-encoded arguments: %1 + Viga JSON-kodeeritud argumentide sõelumisel: %1 + + + Failed to initialize credentials + Mandaatide lähtestamine ebaõnnestus + + + Could not establish a connection to host %1 + Hostiga %1 ei õnnestunud ühendust luua + + + Failed to send feature control message to host %1 + Funktsiooni juhtsõnumi saatmine hostile %1 ebaõnnestus + - Feature control - Funktsiooni juhtimine + Feature-related CLI operations + Funktsioonidega seotud CLI toimingud + + + Commands for controlling features + Funktsioonide juhtimise käsud @@ -2025,15 +2157,15 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten TLS configuration - + TLS konfiguratsioon Use certificate authority for TLS connections - + Kasutage TLS -ühenduste jaoks sertifikaati CA certificate file - + CA sertifikaadi fail ... @@ -2041,11 +2173,11 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Host certificate file - + Hosti sertifikaadi fail Host private key file - + Hosti privaatvõtme fail @@ -2395,7 +2527,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten LDAP directory - + LDAP kataloog @@ -2786,7 +2918,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Directory name - + Kataloogi nimi Query options @@ -2805,7 +2937,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + Kasutage üldist LDAP-i konfiguratsioonilehte, et konfigureerida, kuidas LDAP-põhisest kataloogiteenusest asukohti ja arvuteid alla laadida. @@ -3137,6 +3269,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Locations & computers Asukohad&arvutid + + Only show computers with logged on users + Kuva ainult arvutid, mille kasutajad on sisse logitud + MasterConfigurationPage @@ -3327,12 +3463,24 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten This mode allows you to monitor all computers at one or more locations. See režiim võimaldab teil jälgida kõiki arvuteid ühes või mitmes kohas. + + Query application version of the server + Päring serveri rakenduse versioonist + + + Query active features + Aktiivsete funktsioonide päring + + + Query properties of remotely available screens + Pärige kaugkasutatavate ekraanide atribuute + NestedNetworkObjectDirectory All directories - + Kõik kataloogid @@ -3392,7 +3540,7 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten - PluginsCommands + PluginCommands List names of all installed plugins Loetlege kõigi installitud pistikprogrammide nimed @@ -3673,7 +3821,15 @@ Salvestage oma töö ja sulgege kõik programmid. Connecting... - + Ühendamine... + + + Select screen + Valige ekraan + + + All screens + Kõik ekraanid @@ -3897,19 +4053,19 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Session mode - + Seansi režiim Local session mode (single server instance for primary local session) - + Kohaliku seansi režiim (ühe serveri eksemplar esmase kohaliku seansi jaoks) Active session mode (single server instance for active local or remote session) - + Aktiivne seansirežiim (ühe serveri eksemplar aktiivse kohaliku või kaugseansi jaoks) Multi session mode (distinct server instance for each local and remote desktop session) - + Mitme seansi režiim (iga kohaliku ja kaugtöölaua seansi jaoks eraldi serveri eksemplar) @@ -3936,19 +4092,7 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. - ServiceControlPlugin - - Service is running - Teenus töötab - - - Service is not running - Teenus on peatatud - - - Configure and control Veyon service - Veyoni teenuse konfigureerimine ja juhtimine - + ServiceControlCommands Register Veyon Service Registreerige Veyoni teenus @@ -3963,7 +4107,7 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Stop Veyon Service - Peatage Veyoni teenus + Peatan Veyoni teenuse Restart Veyon Service @@ -3973,13 +4117,25 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Query status of Veyon Service Veyoni teenuse päringu olek + + Service is running + Teenus töötab + + + Service is not running + Teenus on peatatud + + + Configure and control Veyon service + Veyoni teenuse konfigureerimine ja juhtimine + Commands for configuring and controlling Veyon Service Käsud Veyon Service'i konfigureerimiseks ja juhtimiseks - ShellCommandLinePlugin + ShellCommands Run command file Käivitage käsufail @@ -3989,8 +4145,8 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Faili "%1" ei ole! - Interactive shell and script execution for Veyon Control - Interaktiivne kesta ja skripti käivitamine Veyon-i juhtimisele + Interactive shell and script execution for Veyon CLI + Interaktiivne kest ja skripti täitmine Veyon CLI jaoks Commands for shell functionalities @@ -4041,7 +4197,8 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + Arvutite lisamiseks klõpsake hiire keskmise nupuga või klõpsake esimest nuppu allpool. +Teine nupp eemaldab valitud või viimase arvuti. @@ -4300,6 +4457,10 @@ The second button removes the selected or last computer. Authentication test Autentimistest + + Screen %1 + Ekraan %1 + VeyonServiceControl @@ -4380,6 +4541,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Pistikprogramm, mis rakendab Windowsi platvormi jaoks abstraktseid funktsioone + + Internal display + Sisemine ekraan + WindowsServiceControl @@ -4387,30 +4552,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. Teenus "%1" on juba installitud. - - The service "%1" could not be installed. - Teenust "%1" ei saanud installida. - The service "%1" has been installed successfully. Teenus "%1" installiti edukalt. - - The service "%1" could not be uninstalled. - Teenust "%1" ei saanud desinstallida. - The service "%1" has been uninstalled successfully. Teenuse "%1" desinstallimine õnnestus. - - The start type of service "%1" could not be changed. - Teenuse algustüüpi "%1" ei saanud muuta. - Service "%1" could not be found. Teenust "%1" ei leitud. + + The service "%1" could not be installed (error %2). + Teenust "%1" ei saanud installida (viga %2). + + + Could not change the failure actions config for service "%1" (error %2). + Teenuse "%1" tõrketoimingute konfiguratsiooni ei saanud muuta (viga %2). + + + The service "%1" could not be uninstalled (error %2). + Teenust "%1" ei saanud desinstallida (viga %2). + + + The start type of service "%1" could not be changed (error %2). + Teenuse algustüüpi "%1" ei saanud muuta (viga %2). + X11VncConfigurationWidget diff --git a/translations/veyon_fa.ts b/translations/veyon_fa.ts index 25254a7df..a15c8d13d 100644 --- a/translations/veyon_fa.ts +++ b/translations/veyon_fa.ts @@ -681,10 +681,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE @@ -725,6 +721,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1189,6 +1193,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1262,6 +1270,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1608,10 +1620,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1796,10 +1804,134 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands - Feature control - کنترل ویژگی + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -3114,6 +3246,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Only show computers with logged on users + + MasterConfigurationPage @@ -3304,6 +3440,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3369,7 +3517,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3650,6 +3798,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3910,19 +4066,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - سرویس در حال اجرا است - - - Service is not running - سرویس اجرا نمی شود - - - Configure and control Veyon service - پیکربندی و کنترل سرویس ویون - + ServiceControlCommands Register Veyon Service ثبت سرویس های ویون @@ -3947,13 +4091,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service بررسی وضعیت سرویس ویون + + Service is running + سرویس در حال اجرا است + + + Service is not running + سرویس اجرا نمی شود + + + Configure and control Veyon service + پیکربندی و کنترل سرویس ویون + Commands for configuring and controlling Veyon Service شامل فرمان هایی برای پیکربندی و کنترل سرویس ویون - ShellCommandLinePlugin + ShellCommands Run command file @@ -3963,7 +4119,7 @@ Typically this is required to support terminal servers. - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4274,6 +4430,10 @@ The second button removes the selected or last computer. Authentication test + + Screen %1 + + VeyonServiceControl @@ -4354,6 +4514,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform پلاگین اجرای توابع انتزاعی برای پلت فرم ویندوز + + Internal display + + WindowsServiceControl @@ -4362,27 +4526,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. - The service "%1" could not be uninstalled. + Service "%1" could not be found. - The service "%1" has been uninstalled successfully. + The service "%1" could not be installed (error %2). - The start type of service "%1" could not be changed. + Could not change the failure actions config for service "%1" (error %2). - Service "%1" could not be found. + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_fr.ts b/translations/veyon_fr.ts index fc85236e7..d34499a9b 100644 --- a/translations/veyon_fr.ts +++ b/translations/veyon_fr.ts @@ -23,11 +23,11 @@ Version: - Version: + Version : Website: - Site Internet: + Site Internet : Current language not translated yet (or native English). @@ -110,7 +110,7 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Please enter a user login name whose access permissions to test: - Pour tester, veuillez entrer un identifiant qui possède des droits d'accès: + Pour tester, veuillez entrer un identifiant qui possède des droits d'accès : Access allowed @@ -134,7 +134,7 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, User groups backend: - Groupes d'utilisateurs de processus d'arrière plan: + Groupes d'utilisateurs de processus d'arrière plan : Missing user groups backend @@ -165,7 +165,7 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Rule name: - Nom de la règle: + Nom de la règle : enter a description for the rule here @@ -173,7 +173,7 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Rule description: - Description de la règle: + Description de la règle : Conditions @@ -332,15 +332,15 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Accessing user: - Utilisateur accédant: + Utilisateur accédant : Local computer: - Ordinateur local: + Ordinateur local : Accessing computer: - Ordinateur accédant: + Ordinateur accédant : Please enter the following user and computer information in order to test the configured ruleset. @@ -348,11 +348,11 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Local user: - Utilisateur local: + Utilisateur local : Connected users: - Utilisateurs connectés + Utilisateurs connectés : The access in the given scenario is allowed. @@ -368,7 +368,7 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, ERROR: Unknown action - ERREUR: Action inconnue + ERREUR : Action inconnue Test result @@ -387,7 +387,7 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Please perform the following steps to set up key file authentication: - Veuillez suivre les indications suivantes pour configurer la clé d'authentification: + Veuillez suivre les indications suivantes pour configurer la clé d'authentification : 1) Create a key pair on the master computer. @@ -461,7 +461,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter the name of the user group or role for which to create an authentication key pair: - Entrer le nom du groupe d'utilisateurs ou du rôle pour lequel se fait la création de la paire de clé d'authentification: + Entrer le nom du groupe d'utilisateurs ou du rôle pour lequel se fait la création de la paire de clé d'authentification : Do you really want to delete authentication key "%1/%2"? @@ -473,7 +473,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter the name of the user group or role for which to import the authentication key: - Entrez le nom du groupe d'utilisateurs ou du rôle pour lequel se fait l'import de la clé d'authentification: + Entrez le nom du groupe d'utilisateurs ou du rôle pour lequel se fait l'import de la clé d'authentification : Please select a key to export! @@ -481,7 +481,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please select a user group which to grant access to key "%1": - Veuillez sélectionner un groupe d'utilisateur pour lequel vous accordez l'accès à la clé "%1": + Veuillez sélectionner un groupe d'utilisateur pour lequel vous accordez l'accès à la clé "%1" : Please select a key which to set the access group for! @@ -685,10 +685,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Cette commande liste toutes les clés d'authentification disponibles dans le répertoire des clés configuré. Si l'option "%1" est spécifiée, un tableau avec les détails de la clé sera affiché à la place. Certaines informations peuvent être manquantes si une clé n'est pas accessible ex: en cas d'un manque de permission en lecture. - - Please specify the command to display help for! - Veuillez spécifier la commande pour afficher l'aide correspondante ! - TYPE TYPE @@ -729,6 +725,14 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please specify the key name (e.g. "teacher/public") as the first argument. Veuillez spécifier le nom de la clé (par exemple "enseignant/public") comme premier argument. + + Please specify the command to display help for. + Veuillez spécifier la commande pour afficher l'aide correspondante. + + + The specified command does not exist or no help is available for it. + La commande demandée n'existe pas et il n'y a pas d'aide à son propos. + AuthKeysTableModel @@ -757,7 +761,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Username to bind DN mapping: - Nom d'utilisateur à lier au mapping DN: + Nom d'utilisateur à lier au mapping DN : e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org @@ -841,7 +845,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter the Veyon password: - Veuillez entrer le mot de passe Veyon: + Veuillez entrer le mot de passe Veyon : Authentication error @@ -1003,7 +1007,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Computer "%1" (host address: "%2" MAC address: "%3") - Ordinateur "%1" (adresse hôte: "%2" adresse MAC: "%3") + Ordinateur "%1" (adresse hôte : "%2" adresse MAC : "%3") Unclassified object "%1" with ID "%2" @@ -1107,7 +1111,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - Importe des objets à partir d'un fichier texte spécifique utilisant la chaîne de caractères donnée ou une expression régulière contenant un ou plusieurs jokers. Les jokers valides sont: %1 + Importe des objets à partir d'un fichier texte spécifique utilisant la chaîne de caractères donnée ou une expression régulière contenant un ou plusieurs jokers. Les jokers valides sont : %1 Import simple CSV file to a single room @@ -1127,7 +1131,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - Exporte les objets vers un fichier texte spécifique utilisant la chaîne de caractères donnée contenant un ou plusieurs jokers. Les jokers valides sont: %1 + Exporte les objets vers un fichier texte spécifique utilisant la chaîne de caractères donnée contenant un ou plusieurs jokers. Les jokers valides sont : %1 Export all objects to a CSV file @@ -1193,6 +1197,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif MAC ADDRESS ADRESSE MAC + + The specified command does not exist or no help is available for it. + La commande demandée n'existe pas et il n'y a pas d'aide à son propos. + BuiltinUltraVncServer @@ -1212,11 +1220,11 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif ComputerControlListModel Host/IP address: %1 - Adresse de l'hôte / IP: %1 + Adresse de l'hôte / IP : %1 Active features: %1 - Fonctionnalités activées: %1 + Fonctionnalités activées : %1 Online and connected @@ -1244,11 +1252,11 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Logged on user: %1 - Connecté sur l'utilisateur: %1 + Connecté sur l'utilisateur : %1 Location: %1 - Emplacement: %1 + Emplacement : %1 [no user] @@ -1260,18 +1268,22 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Name: %1 - Nom: %1 + Nom : %1 invalid invalide + + [none] + [Aucun] + ComputerControlServer %1 Service %2 at %3:%4 - Service %1 %2 sur %3:%4 + Service %1 %2 à %3:%4 Authentication error @@ -1299,7 +1311,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Active connections: - Connexions actives: + Connexions actives : @@ -1612,10 +1624,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif All screens Tous les écrans - - Screen %1 [%2] - Écran %1 [%2] - DesktopAccessDialog @@ -1792,18 +1800,142 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Port: - Port: + Port : Password: - Mot de passe: + Mot de passe : - FeatureControl + FeatureCommands + + List names of all available features + Lister les noms de toutes les fonctionnalités disponibles + + + Show table with details of all available features + Afficher le tableau avec les détails de toutes les fonctionnalités disponibles + + + Start a feature on a remote host + Démarrer la fonctionnalité sur l'hôte distant + + + Stop a feature on a remote host + Arrêter la fonctionnalité sur un hôte distant + + + Please specify the command to display help for. + Veuillez spécifier la commande pour afficher l'aide correspondante. + + + Displays a list with the names of all available features. + Affiche une liste avec le nom de toutes les fonctionnalités disponibles. + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Affiche un tableau avec des informations détaillées sur toutes les fonctionnalités disponibles. Ces informations incluent une description, l'UID, le nom du plugin fournissant la fonctionnalité respective et d'autres détails liés à l'implémentation. + + + HOST ADDRESS + ADRESSE HÔTE + + + FEATURE + FONCTIONNALITÉS + + + ARGUMENTS + ARGUMENTS + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + Démarre la fonctionnalité spécifiée sur l'hôte spécifié en se connectant au serveur Veyon exécuté à distance. La fonctionnalité peut être spécifiée par nom ou UID. Utilisez la commande ``show`` pour voir toutes les fonctionnalités disponibles. Selon la fonctionnalité, des arguments supplémentaires (tels que le message texte à afficher) codés sous la forme d'une chaîne JSON unique doivent être spécifiés. Veuillez vous référer à la documentation du développeur pour plus d'informations + + + Lock the screen + Verrouiller l'écran + + + Display a text message + Afficher un message + + + Test message + Message de test + + + Start an application + Démarrer une application + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + Arrête la fonctionnalité spécifiée sur l'hôte spécifié en se connectant au serveur Veyon exécuté à distance. La fonctionnalité peut être spécifiée par nom ou UID. Utilisez la commande ``show`` pour voir toutes les fonctionnalités disponibles. + + + Unlock the screen + Déverrouiller l'écran + + + The specified command does not exist or no help is available for it. + La commande demandée n'existe pas et il n'y a pas d'aide à son propos. + + + Name + Nom + + + Description + Description + + + Master + Maître + + + Service + Service + + + Worker + Travailleur + + + UID + UID + + + Plugin + Greffon + + + Invalid feature name or UID specified + Nom de fonction ou UID spécifié non valide + + + Error parsing the JSON-encoded arguments: %1 + Erreur lors de l'analyse des arguments encodés en JSON : %1 + + + Failed to initialize credentials + Échec de l'initialisation des informations d'identification + + + Could not establish a connection to host %1 + Impossible d'établir une connexion avec l'hôte %1 + + + Failed to send feature control message to host %1 + Échec de l'envoi du message de contrôle des fonctionnalités à l'hôte %1 + - Feature control - Contrôle des fonctionnalités + Feature-related CLI operations + Opérations CLI liées aux fonctionnalités + + + Commands for controlling features + Commandes pour contrôler les fonctionnalités @@ -1925,7 +2057,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Language: - Langue: + Langue : Use system language setting @@ -2066,7 +2198,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif LdapClient LDAP error description: %1 - Description de l'erreur LDAP: %1 + Description de l'erreur LDAP : %1 @@ -2123,7 +2255,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif The LDAP base DN has been queried successfully. The following entries were found: %1 - La base LDAP DN a été interrogée avec succès. Les entrées suivantes ont été trouvées: + La base LDAP DN a été interrogée avec succès. Les entrées suivantes ont été trouvées : %1 @@ -2146,7 +2278,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif The LDAP naming context has been queried successfully. The following base DN was found: %1 - Le contexte de nommage LDAP à été interrogé avec succès. La base DN suivante à été trouvée: + Le contexte de nommage LDAP à été interrogé avec succès. La base DN suivante à été trouvée : %1 @@ -2369,7 +2501,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif %1 %2 have been queried successfully: %3 - %2 %1 a été interrogé avec succès: + %2 %1 a été interrogé avec succès : %3 @@ -2558,7 +2690,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter a user login name (wildcards allowed) which to query: - Veuillez entrer un identifiant utilisateur (jokers autorisé ? *) à rechercher: + Veuillez entrer un identifiant utilisateur (jokers autorisé ? *) à rechercher : Enter group name @@ -2566,7 +2698,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter a group name whose members to query: - Veuillez entrer le nom d'un groupe dont vous recherchez les membres: + Veuillez entrer le nom d'un groupe dont vous recherchez les membres : Enter computer name @@ -2578,11 +2710,11 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter the DN of a computer whose MAC address to query: - Veuillez entrer le DN d'un ordinateur dont vous recherchez l'adresse MAC: + Veuillez entrer le DN d'un ordinateur dont vous recherchez l'adresse MAC : Please enter a user login name whose group memberships to query: - Veuillez entrer l'identifiant dont vous recherchez les groupes d'appartenance: + Veuillez entrer l'identifiant dont vous recherchez les groupes d'appartenance : Enter computer IP address @@ -2590,7 +2722,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter a computer IP address which to resolve to an computer object: - Veuillez entrer une adresse IP pour trouver un ordinateur: + Veuillez entrer une adresse IP pour trouver un ordinateur : (only if different from group tree) @@ -2710,7 +2842,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Identify computer locations (e.g. rooms) via: - Identifier des emplacements ordinateur (ex salles) via: + Identifier des emplacements ordinateur (ex salles) via : Location attribute in computer objects @@ -2730,7 +2862,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter a computer display name to query: - Veuillez entrer un nom d'affichage d'ordinateur à interroger: + Veuillez entrer un nom d'affichage d'ordinateur à interroger : Enter computer location name @@ -2738,7 +2870,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter the name of a computer location (wildcards allowed): - Veuillez entrer le nom d'un emplacement d'ordinateur (jokers autorisés): + Veuillez entrer le nom d'un emplacement d'ordinateur (jokers autorisés) : Enter location name @@ -2746,7 +2878,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter the name of a location whose entries to query: - Veuillez entrer le nom d'un emplacement dont les entrées sont à interroger. + Veuillez entrer le nom d'un emplacement dont les entrées sont à interroger : Browse @@ -2766,7 +2898,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter a computer hostname to query: - Veuillez entrer un nom d'ordinateur hôte à rechercher: + Veuillez entrer un nom d'ordinateur hôte à rechercher : Enter hostname @@ -2774,7 +2906,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter a computer hostname whose group memberships to query: - Veuillez entrer un nom d’hôte pour l’ordinateur appartenant au groupe à interroger + Veuillez entrer un nom d’hôte pour l’ordinateur appartenant au groupe à interroger : User login name attribute @@ -3137,6 +3269,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Locations & computers Emplacements & ordinateurs + + Only show computers with logged on users + Afficher uniquement les ordinateurs avec des utilisateurs connectés + MasterConfigurationPage @@ -3150,7 +3286,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Feature on computer double click: - Action au double clique sur un ordinateur: + Action au double clique sur un ordinateur : Features @@ -3327,6 +3463,18 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif This mode allows you to monitor all computers at one or more locations. Ce mode vous permet de surveiller tous les ordinateurs d'un ou de plusieurs emplacements. + + Query application version of the server + Interroger la version de l'application du serveur + + + Query active features + Interroger les fonctionnalités actives + + + Query properties of remotely available screens + Interroger les propriétés des écrans distants disponibles + NestedNetworkObjectDirectory @@ -3339,7 +3487,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif NetworkObjectDirectoryConfigurationPage Update interval: - Intervalle de rafraichissement: + Intervalle de rafraichissement : seconds @@ -3380,11 +3528,11 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please enter the URL of the website to open: - Veuillez entrer l'URL du site internet à ouvrir: + Veuillez entrer l'URL du site internet à ouvrir : Name: - Nom: + Nom : Website name @@ -3392,7 +3540,7 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif - PluginsCommands + PluginCommands List names of all installed plugins Lister les noms de tous les greffons installés @@ -3541,7 +3689,7 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Please specify a timeout for powering down the selected computers: - Veuillez spécifier un délai d'attente pour éteindre les ordinateurs sélectionnés: + Veuillez spécifier un délai d'attente pour éteindre les ordinateurs sélectionnés : minutes @@ -3580,7 +3728,7 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Please enter the hostname or IP address of the computer to access: - Pour accéder, veuillez entrer le nom de l'hôte ou l'adresse IP de l'ordinateur: + Pour accéder, veuillez entrer le nom de l'hôte ou l'adresse IP de l'ordinateur : Show help about command @@ -3591,7 +3739,7 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. RemoteAccessPage Remote access: %1 - Accès à distance: %1 + Accès à distance : %1 @@ -3673,7 +3821,15 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Connecting... - + En cours de connexion + + + Select screen + Sélectionner l'écran + + + All screens + Tous les écrans @@ -3764,19 +3920,19 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. User: - Utilisateur: + Utilisateur : Computer: - Ordinateur: + Ordinateur : Date: - Date: + Date : Time: - Heure: + Heure : Show @@ -3839,7 +3995,7 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Plugin: - Extension: + Extension : Restart %1 Service @@ -3936,19 +4092,7 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term - ServiceControlPlugin - - Service is running - Le service est en cours d’exécution - - - Service is not running - Le service n'est pas en fonctionnement - - - Configure and control Veyon service - Configure et contrôle le service Veyon - + ServiceControlCommands Register Veyon Service Inscription du service Veyon @@ -3973,13 +4117,25 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Query status of Veyon Service Interrogation du statut du service Veyon + + Service is running + Le service est en cours d’exécution + + + Service is not running + Le service n'est pas en fonctionnement + + + Configure and control Veyon service + Configure et contrôle le service Veyon + Commands for configuring and controlling Veyon Service Commandes pour configurer et contrôler le Service Veyon - ShellCommandLinePlugin + ShellCommands Run command file Lance un fichier de commande @@ -3989,8 +4145,8 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Le fichier "%1" n'existe pas. - Interactive shell and script execution for Veyon Control - Terminal interactif et script d'exécution pour le Contrôle de Veyon + Interactive shell and script execution for Veyon CLI + Shell interactif et exécution de script pour Veyon CLI Commands for shell functionalities @@ -4013,7 +4169,7 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Duration: - Durée: + Durée : @@ -4069,7 +4225,7 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin Name: - Nom: + Nom : e.g. VLC @@ -4247,7 +4403,7 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin Available commands: - Commandes disponibles: + Commandes disponibles : Invalid arguments given @@ -4263,11 +4419,11 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin Available modules: - Modules disponibles: + Modules disponibles : No module specified or module not found - available modules are: - Aucun module spécifié ou module non trouvé - les modules disponibles sont: + Aucun module spécifié ou module non trouvé - les modules disponibles sont : Plugin not licensed @@ -4301,6 +4457,10 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin Authentication test Test d'authentification + + Screen %1 + Écran %1 + VeyonServiceControl @@ -4381,6 +4541,10 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin Plugin implementing abstract functions for the Windows platform Extension implémentant les fonctions abstraites pour le système Windows + + Internal display + Affichage interne + WindowsServiceControl @@ -4388,30 +4552,34 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin The service "%1" is already installed. Le service "%1" est déjà installé. - - The service "%1" could not be installed. - Le service "%1" ne peut pas être installé. - The service "%1" has been installed successfully. Le service "%1" a été installé avec succès. - - The service "%1" could not be uninstalled. - Le service "%1" ne peut pas être désinstallé. - The service "%1" has been uninstalled successfully. Le service "%1" a été désinstallé avec succès. - - The start type of service "%1" could not be changed. - Le type de démarrage du service "%1" ne peut pas être changé. - Service "%1" could not be found. Service "%1" impossible à trouvé. + + The service "%1" could not be installed (error %2). + Le service "%1" n'a pas pu être installé (erreur %2). + + + Could not change the failure actions config for service "%1" (error %2). + Impossible de modifier la configuration des actions d'échec pour le service "%1" (erreur %2). + + + The service "%1" could not be uninstalled (error %2). + Le service "%1" n'a pas pu être désinstallé (erreur %2). + + + The start type of service "%1" could not be changed (error %2). + Le type de démarrage du service "%1" n'a pas pu être modifié (erreur %2). + X11VncConfigurationWidget @@ -4421,7 +4589,7 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin Custom x11vnc parameters: - Paramètres personnalisés x11vnc: + Paramètres personnalisés x11vnc : Do not use X Damage extension diff --git a/translations/veyon_he.ts b/translations/veyon_he.ts index 466440e87..02500709c 100644 --- a/translations/veyon_he.ts +++ b/translations/veyon_he.ts @@ -683,10 +683,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE @@ -727,6 +723,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1191,6 +1195,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1264,6 +1272,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1610,10 +1622,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1799,9 +1807,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + - Feature control + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + שם + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -3117,6 +3249,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Only show computers with logged on users + + MasterConfigurationPage @@ -3307,6 +3443,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3372,7 +3520,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3653,6 +3801,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3913,19 +4069,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - שירות רץ - - - Service is not running - שירות לא רץ - - - Configure and control Veyon service - הגדר ושלוט בשירות Veyon - + ServiceControlCommands Register Veyon Service הוסף שירות Veyon @@ -3950,13 +4094,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service בדוק מצד של שירות Veyon + + Service is running + שירות רץ + + + Service is not running + שירות לא רץ + + + Configure and control Veyon service + הגדר ושלוט בשירות Veyon + Commands for configuring and controlling Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file @@ -3966,7 +4122,7 @@ Typically this is required to support terminal servers. - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4277,6 +4433,10 @@ The second button removes the selected or last computer. Authentication test בדיקת התחברות + + Screen %1 + + VeyonServiceControl @@ -4357,6 +4517,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform התוסף ממש פונקציות אבסטרקטיות של פלטפורמת Windows + + Internal display + + WindowsServiceControl @@ -4364,30 +4528,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. השירות "%1" כבר מותקן. - - The service "%1" could not be installed. - השירות "%1" לא הותקן. - The service "%1" has been installed successfully. השירות "%1" הותקן בהצלחה. - - The service "%1" could not be uninstalled. - השירות "%1" לא יכול היה להימחק. - The service "%1" has been uninstalled successfully. השירות "%1" נמחק בהצלחה. - - The start type of service "%1" could not be changed. - סוג ההפעלה של השירות "%1" לא יכול היה לעבור שינוי. - Service "%1" could not be found. השירות "%1" לא יכול היה להימצא. + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_hu.ts b/translations/veyon_hu.ts index 20212a35e..59b2e3fba 100644 --- a/translations/veyon_hu.ts +++ b/translations/veyon_hu.ts @@ -685,10 +685,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Ez a parancs a beállított kulcskönyvtárban lévő összes elérhető hitelesítési kulcsot felsorolja. Ha "%1" lehetőség meg van adva, egy, a kulcs részleteit tartalmazó táblázat fog megjelenni. Ha a kulcs nem érhető el, például olvasási jogosultságok hiánya miatt, néhány részlete hiányozhat. - - Please specify the command to display help for! - Kérem, válaszd ki az a parancsot, melynek súgóját megjelenítsük! - TYPE TÍPUS @@ -729,6 +725,14 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -830,7 +834,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Logon - + Bejelentkezés @@ -1193,6 +1197,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso MAC ADDRESS FIZIKAI CÍM + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso invalid + + [none] + + ComputerControlServer @@ -1348,19 +1360,19 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Select all - + Mind kijelölése Unselect all - + Minden kijelölés törlése Add to group - + Hozzadás csoporthoz Remove from group - + Eltávolítás csoportból @@ -1612,10 +1624,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1800,10 +1808,134 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso - FeatureControl + FeatureCommands - Feature control - Szolgáltatásvezérlés + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + HOST ADDRESS + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Megnevezés + + + Description + + + + Master + Mester + + + Service + Szolgáltatás + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -3137,6 +3269,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Locations & computers Helyszínek és számítógépek + + Only show computers with logged on users + + MasterConfigurationPage @@ -3327,6 +3463,18 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso This mode allows you to monitor all computers at one or more locations. Ez az alapértelmezett mód, ami lehetővé teszi, hogy monitorozd az egy vagy több helyszínen lévő összes számítógépet. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3392,7 +3540,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso - PluginsCommands + PluginCommands List names of all installed plugins @@ -3673,6 +3821,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3933,19 +4089,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Veyon szolgáltatás jelenleg fut - - - Service is not running - Veyon szolgáltatás jelenleg nem fut - - - Configure and control Veyon service - Veyon szolgáltatás konfigurálása és felügyelete - + ServiceControlCommands Register Veyon Service Regisztrált Veyon szolgáltatás @@ -3970,13 +4114,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service Veyon Szolgáltatás állapotának lekérdezése + + Service is running + Veyon szolgáltatás jelenleg fut + + + Service is not running + Veyon szolgáltatás jelenleg nem fut + + + Configure and control Veyon service + Veyon szolgáltatás konfigurálása és felügyelete + Commands for configuring and controlling Veyon Service Veyon Szolgáltatás konfigurációs és felügyeleti parancsai - ShellCommandLinePlugin + ShellCommands Run command file Parancsfájl futtatása @@ -3986,8 +4142,8 @@ Typically this is required to support terminal servers. "%1" fájl nem létezik! - Interactive shell and script execution for Veyon Control - Interaktív héj és szkriptfuttatás a Veyon vezérlésből + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4297,6 +4453,10 @@ The second button removes the selected or last computer. Authentication test Hitelesítési teszt + + Screen %1 + + VeyonServiceControl @@ -4377,6 +4537,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform A bővítmény absztrakt függvényekkel egészíti ki a Windows platformot + + Internal display + + WindowsServiceControl @@ -4384,30 +4548,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. "%1" szolgáltatás már telepítve van. - - The service "%1" could not be installed. - "%1" szolgáltatás nem telepíthető. - The service "%1" has been installed successfully. "%1" szolgáltatást sikeresen telepítette. - - The service "%1" could not be uninstalled. - "%1" szolgáltatás nem távolítható el. - The service "%1" has been uninstalled successfully. "%1" szolgáltatást sikeresen eltávolította. - - The start type of service "%1" could not be changed. - "%1" szolgáltatás indítási típusa nem módosítható. - Service "%1" could not be found. "%1" szolgáltatás nem található. + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_id.ts b/translations/veyon_id.ts index 3f92bd54c..413244b3a 100644 --- a/translations/veyon_id.ts +++ b/translations/veyon_id.ts @@ -309,19 +309,19 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a is not local computer - + bukan komputer lokal Computer being accessed - + komputer sedang diakses Session being accessed is a user session - + Sesi yang diakses adalah sesi pengguna Session being accessed is a login screen - + Sesi yang diakses adalah layar log masuk @@ -403,7 +403,7 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Silakan merujuk pada <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Manual Administrasi Veyon</a> untuk informasi lebih lanjut. Key file directories @@ -473,7 +473,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter the name of the user group or role for which to import the authentication key: - + Harap masukkan nama grup pengguna atau peran untuk mengimpor kunci autentikasi: Please select a key to export! @@ -481,11 +481,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please select a user group which to grant access to key "%1": - + Silakan pilih grup pengguna yang akan diberikan akses ke kunci "%1": Please select a key which to set the access group for! - + Silakan pilih kunci untuk mengatur grup akses! @@ -500,15 +500,15 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Invalid key type specified! Please specify "%1" or "%2". - + Jenis kunci yang ditentukan tidak valid! Silakan tentukan "%1" atau "%2". Specified key does not exist! Please use the "list" command to list all installed keys. - + Kunci yang ditentukan tidak ada! Silakan gunakan perintah "daftar" untuk mendaftar semua kunci yang diinstal. One or more key files already exist! Please delete them using the "delete" command. - + Satu atau lebih file kunci sudah ada! Harap hapus dengan menggunakan perintah "hapus". Creating new key pair for "%1" @@ -520,7 +520,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Newly created key pair has been saved to "%1" and "%2". - + Pasangan kunci yang baru dibuat telah disimpan ke "%1" dan "%2". Could not remove key file "%1"! @@ -544,7 +544,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Key "%1/%2" has been exported to "%3" successfully. - + Kunci "%1/%2" berhasil diekspor ke "%3". Failed read input file. @@ -552,11 +552,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone File "%1" does not contain a valid private key! - + Berkas "%1" tidak berisi kunci privat yang valid! File "%1" does not contain a valid public key! - + Berkas "%1" tidak berisi kunci publik yang valid! Failed to create directory for key file. @@ -564,55 +564,55 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Failed to write key file "%1". - + Gagal menulis berkas kunci "%1". Failed to set permissions for key file "%1"! - + Gagal menyetel izin untuk file kunci "%1"! Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Kunci "%1/%2" berhasil diimpor. Harap periksa izin file "%3" untuk mencegah akses tidak sah. Failed to convert private key to public key - + Gagal mengubah kunci privat menjadi kunci publik Failed to create directory for private key file "%1". - + Gagal membuat direktori untuk file kunci pribadi "%1". Failed to save private key in file "%1"! - + Gagal menyimpan kunci pribadi di file "%1"! Failed to set permissions for private key file "%1"! - + Gagal menyetel izin untuk file kunci pribadi "%1"! Failed to create directory for public key file "%1". - + Gagal membuat direktori untuk file kunci publik "%1". Failed to save public key in file "%1"! - + Gagal menyimpan kunci publik di berkas "%1"! Failed to set permissions for public key file "%1"! - + Gagal menyetel izin untuk file kunci publik "%1"! Failed to set owner of key file "%1" to "%2". - + Gagal menyetel pemilik untuk file kunci "%1" menjadi "%2". Failed to set permissions for key file "%1". - + Gagal menyetel izin untuk file kunci "%1". Key "%1" is now accessible by user group "%2". - + Kunci "%1" sekarang dapat diakses oleh grup pengguna "%2". <N/A> @@ -620,14 +620,14 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Failed to read key file. - + Gagal membaca file kunci AuthKeysPlugin Create new authentication key pair - + Buat pasangan kunci autentikasi baru Delete authentication key @@ -663,7 +663,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + Perintah ini menyesuaikan izin akses file <KEY> sedemikian rupa sehingga hanya grup pengguna <ACCESS GROUP> yang memiliki akses baca ke sana. NAME @@ -683,11 +683,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - - - Please specify the command to display help for! - + Perintah ini mencantumkan semua kunci autentikasi yang tersedia di direktori kunci yang dikonfigurasi. Jika opsi "%1" ditentukan sebagai gantinya, tabel dengan detail kunci akan ditampilkan. Beberapa detail mungkin hilang jika kunci tidak dapat diakses, mis. karena kurangnya izin membaca. TYPE @@ -699,7 +695,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Commands for managing authentication keys - + Perintah untuk mengelola kunci autentikasi This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. @@ -727,7 +723,15 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please specify the key name (e.g. "teacher/public") as the first argument. - + Silakan tentukan nama kunci (misalnya "guru/umum") sebagai argumen pertama. + + + Please specify the command to display help for. + Harap tentukan perintah untuk menampilkan bantuan. + + + The specified command does not exist or no help is available for it. + Perintah yang ditentukan tidak ada atau tidak ada bantuan yang tersedia untuk itu. @@ -889,7 +893,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone BuiltinDirectoryConfiguration Builtin directory - + Direktori bawaan @@ -924,7 +928,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Builtin directory - + Direktori bawaan Locations @@ -963,11 +967,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Export objects to given file - + Ekspor objek ke file yang diberikan Invalid type specified. Valid values are "%1" or "%2". - + Jenis yang ditentukan tidak valid. Nilai yang valid adalah "%1" atau "%2". Type @@ -1007,7 +1011,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Unclassified object "%1" with ID "%2" - + Objek tidak terklasifikasi "%1" dengan ID "%2" None @@ -1019,7 +1023,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Root - + Root Invalid @@ -1027,7 +1031,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Error while parsing line %1. - + Terjadi kesalahan saat mengurai baris %1. Network object directory which stores objects in local configuration @@ -1039,7 +1043,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone No format string or regular expression specified! - + Tidak ada string format atau ekspresi reguler yang ditentukan! Can't open file "%1" for writing! @@ -1047,7 +1051,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone No format string specified! - + Tidak ada string format yang ditentukan! Object UUID @@ -1067,7 +1071,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Dump all or individual locations and computers - + Buang semua atau lokasi individual dan komputer List all locations and computers @@ -1095,35 +1099,35 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LOCATION - + LOKASI FORMAT-STRING-WITH-PLACEHOLDERS - + FORMAT-STRING-WITH-PLACEHOLDERS REGULAR-EXPRESSION-WITH-PLACEHOLDER - + REGULAR-EXPRESSION-WITH-PLACEHOLDER Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Mengimpor objek dari file teks yang ditentukan menggunakan string format yang diberikan atau ekspresi reguler yang berisi satu atau beberapa tempat penampung. Tempat penampung yang valid adalah: %1 Import simple CSV file to a single room - + Impor file CSV sederhana ke satu ruangan Import CSV file with location name in first column - + Impor file CSV dengan nama lokasi di kolom pertama Import text file with with key/value pairs using regular expressions - + Impor file teks dengan pasangan kunci/nilai menggunakan ekspresi reguler Import arbitrarily formatted data - + Impor data yang diformat secara sewenang-wenang Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 @@ -1131,7 +1135,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Export all objects to a CSV file - + Ekspor semua objek ke file CSV Export all computers in a specific location to a CSV file @@ -1193,6 +1197,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone MAC ADDRESS + + The specified command does not exist or no help is available for it. + Perintah yang ditentukan tidak ada atau tidak ada bantuan yang tersedia untuk itu. + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone invalid + + [none] + + ComputerControlServer @@ -1612,10 +1624,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1800,9 +1808,133 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + Harap tentukan perintah untuk menampilkan bantuan. + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + Perintah yang ditentukan tidak ada atau tidak ada bantuan yang tersedia untuk itu. + + + Name + Nama + + + Description + + + + Master + + + + Service + Layanan + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + - Feature control + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -2073,7 +2205,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LdapConfiguration LDAP connection failed - + Sambungan LDAP gagal Could not connect to the LDAP server. Please check the server parameters. @@ -2083,7 +2215,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP bind failed - + Pengikatan LDAP gagal Could not bind to the LDAP server. Please check the server parameters and bind credentials. @@ -2093,7 +2225,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP bind successful - + Pengikatan LDAP berhasil Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. @@ -2101,7 +2233,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP base DN test failed - + Pengujian DN berdasarkan LDAP gagal Could not query the configured base DN. Please check the base DN parameter. @@ -2111,7 +2243,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP base DN test successful - + Pengujian DN berdasarkan LDAP berhasil The LDAP base DN has been queried successfully. The following entries were found: @@ -2121,7 +2253,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP naming context test failed - + Uji konteks penamaan LDAP gagal Could not query the base DN via naming contexts. Please check the naming context attribute parameter. @@ -2131,7 +2263,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP naming context test successful - + Uji konteks penamaan LDAP berhasil The LDAP naming context has been queried successfully. The following base DN was found: @@ -2172,7 +2304,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone user objects - + objek pengguna User login name attribute @@ -2180,7 +2312,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone group members - + anggota kelompok Group member attribute @@ -2188,7 +2320,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Group not found - + Grup tidak ditemukan Could not find a group with the name "%1". Please check the group name or the group tree parameter. @@ -2196,7 +2328,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone computer objects - + objek komputer Computer display name attribute @@ -2220,7 +2352,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone computer MAC addresses - + Alamat MAC komputer Computer MAC address attribute @@ -2232,7 +2364,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Computer location attribute - + Atribut lokasi komputer Location name attribute @@ -2240,19 +2372,19 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone users - + pengguna user groups - + group pengguna computers - + komputer computer groups - + group komputer computer containers @@ -2260,11 +2392,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone groups of user - + kelompok pengguna User not found - + Pengguna tidak ditemukan Could not find a user with the name "%1". Please check the username or the user tree parameter. @@ -2272,11 +2404,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone groups of computer - + kelompok komputer Computer not found - + komputer tidak ditemukan Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. @@ -2316,7 +2448,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP %1 test failed - + Tes LDAP %1 gagal Could not query any entries in configured %1. Please check the parameter "%2". @@ -2326,11 +2458,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP %1 test successful - + Tes LDAP %1 berhasil The %1 has been queried successfully and %2 entries were found. - + %1 telah berhasil dikueri dan %2 entri ditemukan. LDAP test failed @@ -2358,7 +2490,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP filter test failed - + Tes filter LDAP gagal Could not query any %1 using the configured filter. Please check the LDAP filter for %1. @@ -2368,11 +2500,11 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone LDAP filter test successful - + Tes filter LDAP berhasil %1 %2 have been queried successfully using the configured filter. - + %1 %2 telah berhasil ditanyakan menggunakan filter yang dikonfigurasi. LDAP directory @@ -2531,7 +2663,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Get computer object by IP address - + Dapatkan objek komputer berdasarkan alamat IP Enter username @@ -2539,23 +2671,23 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter a user login name (wildcards allowed) which to query: - + Silakan masukkan nama login pengguna (bisa menggunakan wildcards) yang akan di query: Enter group name - + Masukkan nama grup Please enter a group name whose members to query: - + Harap masukkan nama grup yang anggotanya akan ditanyakan: Enter computer name - + Masukkan nama komputer Enter computer DN - + Masukkan DN komputer Please enter the DN of a computer whose MAC address to query: @@ -2563,19 +2695,19 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please enter a user login name whose group memberships to query: - + Harap masukkan nama login pengguna yang keanggotaan grupnya akan ditanyakan: Enter computer IP address - + masukan alamat IP komputer Please enter a computer IP address which to resolve to an computer object: - + Silakan masukkan alamat IP komputer yang akan diselesaikan ke objek komputer: (only if different from group tree) - + (hanya jika berbeda dari pohon grup) Computer group tree @@ -2583,31 +2715,31 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Filter for computers - + Filter untuk komputer e.g. room or computerLab - + misalnya ruangan atau "laboratorium komputer" Integration tests - + Tes integrasi Computer groups - + Grup komputer e.g. name or description - + misalnya nama atau deskripsi Filter for computer containers - + Filter untuk wadah komputer Computer containers or OUs - + Wadah komputer atau OU Connection security @@ -2619,7 +2751,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone System defaults - + Default sistem Never (insecure!) @@ -2671,7 +2803,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Computer location attribute - + Atribut lokasi komputer Computer display name attribute @@ -3118,6 +3250,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Locations & computers Lokasi & komputer + + Only show computers with logged on users + + MasterConfigurationPage @@ -3308,6 +3444,18 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3373,7 +3521,7 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone - PluginsCommands + PluginCommands List names of all installed plugins @@ -3654,6 +3802,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3914,19 +4070,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Layanan berjalan - - - Service is not running - Layanan tidak berjalan - - - Configure and control Veyon service - Konfigurasi dan kontrol layanan Veyon - + ServiceControlCommands Register Veyon Service Daftarkan Layanan Veyon @@ -3951,13 +4095,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service + + Service is running + Layanan berjalan + + + Service is not running + Layanan tidak berjalan + + + Configure and control Veyon service + Konfigurasi dan kontrol layanan Veyon + Commands for configuring and controlling Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file @@ -3967,7 +4123,7 @@ Typically this is required to support terminal servers. Berkas "%1" tidak ada! - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4278,6 +4434,10 @@ The second button removes the selected or last computer. Authentication test + + Screen %1 + + VeyonServiceControl @@ -4358,6 +4518,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Pengaya menerapkan fungsi abstrak untuk platform Windows + + Internal display + + WindowsServiceControl @@ -4366,27 +4530,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. + + + + The service "%1" has been uninstalled successfully. - The service "%1" has been installed successfully. + Service "%1" could not be found. - The service "%1" could not be uninstalled. + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_it.ts b/translations/veyon_it.ts index a972f2e2d..61aba76a1 100644 --- a/translations/veyon_it.ts +++ b/translations/veyon_it.ts @@ -682,10 +682,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Questo comando elenca tutte le chiavi di autenticazione disponibili nella directory delle chiavi configurate. Se viene specificata l'opzione "%1", verrà visualizzata una tabella con i dettagli chiave. Alcuni dettagli potrebbero mancare se una chiave non è accessibile, ad es. a causa della mancanza di permessi di lettura. - - Please specify the command to display help for! - Si prega di specificare il comando per visualizzare la guida per! - TYPE TIPO @@ -726,6 +722,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. Si prega di specificare il nome della chiave (ad es. "insegnante/pubblico") come primo argomento. + + Please specify the command to display help for. + Specificare il comando per cui visualizzare la guida. + + + The specified command does not exist or no help is available for it. + Il comando specificato non esiste o non è disponibile alcun aiuto. + AuthKeysTableModel @@ -1190,6 +1194,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS MAC ADDRESS + + The specified command does not exist or no help is available for it. + Il comando specificato non esiste o non è disponibile alcun aiuto. + BuiltinUltraVncServer @@ -1263,6 +1271,10 @@ The public key is used on client computers to authenticate incoming connection r invalid non valido + + [none] + [nessuno] + ComputerControlServer @@ -1609,10 +1621,6 @@ The public key is used on client computers to authenticate incoming connection r All screens Tutti gli schermi - - Screen %1 [%2] - Schermo %1 [%2] - DesktopAccessDialog @@ -1797,10 +1805,134 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + Elenca nomi di tutte le funzioni disponibili + + + Show table with details of all available features + Mostra tabella con i dettagli di tutte le funzionalità disponibili + + + Start a feature on a remote host + Avvia una funzione su un host remoto + + + Stop a feature on a remote host + Arresta una funzione su un host remoto + + + Please specify the command to display help for. + Specificare il comando per cui visualizzare la guida. + + + Displays a list with the names of all available features. + Visualizza un elenco con i nomi di tutte le funzioni disponibili. + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Visualizza una tabella con informazioni dettagliate su tutte le funzioni disponibili. Queste informazioni includono una descrizione, l'UID, il nome del plug-in che fornisce la rispettiva funzione e alcuni altri dettagli relativi all'implementazione. + + + HOST ADDRESS + INDIRIZZO COMPUTER + + + FEATURE + CARATTERISTICA + + + ARGUMENTS + ARGOMENTI + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + Avvia la funzione specificata sull'host specificato connettendosi al server Veyon in esecuzione in remoto. La funzione può essere specificata per nome o UID. Usa il comando ``mostra`` per vedere tutte le funzionalità disponibili. A seconda della funzionalità, devono essere specificati argomenti aggiuntivi (come il messaggio di testo da visualizzare) codificati come una singola stringa JSON. Si prega di fare riferimento alla documentazione per gli sviluppatori per ulteriori informazioni + + + Lock the screen + Blocca lo schermo + + + Display a text message + Visualizza un messaggio di testo + + + Test message + Messaggio di prova + + + Start an application + Avvia un'applicazione + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + Arresta la funzione specificata sull'host specificato connettendosi al server Veyon in esecuzione in remoto. La funzione può essere specificata per nome o UID. Usa il comando ``mostra`` per vedere tutte le funzionalità disponibili. + + + Unlock the screen + Sblocca lo schermo + + + The specified command does not exist or no help is available for it. + Il comando specificato non esiste o non è disponibile alcun aiuto. + + + Name + Nome + + + Description + Descrizione + + + Master + Principale + + + Service + Servizio + + + Worker + Lavoratore + + + UID + UID + + + Plugin + Plugin + + + Invalid feature name or UID specified + Nome della funzione o UID specificato non valido + + + Error parsing the JSON-encoded arguments: %1 + Errore durante l'analisi degli argomenti con codifica JSON: %1 + + + Failed to initialize credentials + Impossibile inizializzare le credenziali + + + Could not establish a connection to host %1 + Impossibile stabilire una connessione all'host %1 + + + Failed to send feature control message to host %1 + Impossibile inviare il messaggio di controllo della funzionalità all'host %1 + - Feature control - Controllo delle opzioni + Feature-related CLI operations + Operazioni CLI relative alle funzionalità + + + Commands for controlling features + Comandi per il controllo delle funzioni @@ -3124,6 +3256,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Posizioni e computers + + Only show computers with logged on users + Mostra solo computer con utenti connessi + MasterConfigurationPage @@ -3314,6 +3450,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. Questa modalità consente di monitorare tutti i computer in una o più posizioni. + + Query application version of the server + Interroga la versione dell'applicazione del server + + + Query active features + Interroga le funzionalità attive + + + Query properties of remotely available screens + Interroga le proprietà delle schermate disponibili in remoto + NestedNetworkObjectDirectory @@ -3379,7 +3527,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins Elenca i nomi di tutti i plugin installati @@ -3660,7 +3808,15 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Connecting... - + Connessione in corso... + + + Select screen + Seleziona lo schermo + + + All screens + Tutti gli schermi @@ -3883,19 +4039,19 @@ Typically this is required to support terminal servers. Session mode - + Modalità sessione Local session mode (single server instance for primary local session) - + Modalità sessione locale (singola istanza del server per la sessione locale primaria) Active session mode (single server instance for active local or remote session) - + Modalità sessione attiva (istanza server singola per sessione attiva locale o remota) Multi session mode (distinct server instance for each local and remote desktop session) - + Modalità multisessione (istanza del server distinta per ogni sessione desktop locale e remota) @@ -3922,19 +4078,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Servizio in esecuzione - - - Service is not running - Servizio non in esecuzione - - - Configure and control Veyon service - Configura e controlla il servizio Veyon - + ServiceControlCommands Register Veyon Service Registra Servizio Veyon @@ -3959,13 +4103,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service Stato del query del Servizio Veyon + + Service is running + Servizio in esecuzione + + + Service is not running + Servizio non in esecuzione + + + Configure and control Veyon service + Configura e controlla il servizio Veyon + Commands for configuring and controlling Veyon Service Comandi per configurare e controllare il Servizio Veyon - ShellCommandLinePlugin + ShellCommands Run command file Esegui il file di comando @@ -3975,8 +4131,8 @@ Typically this is required to support terminal servers. Il file "%1" non esiste! - Interactive shell and script execution for Veyon Control - Esecuzione interattiva di shell e script per controllo Veyon + Interactive shell and script execution for Veyon CLI + Shell interattiva ed esecuzione di script per Veyon CLI Commands for shell functionalities @@ -4287,6 +4443,10 @@ Il secondo pulsante rimuove il computer selezionato o l'ultimo.Authentication test Test di autenticazione + + Screen %1 + Schermo %1 + VeyonServiceControl @@ -4367,6 +4527,10 @@ Il secondo pulsante rimuove il computer selezionato o l'ultimo.Plugin implementing abstract functions for the Windows platform Plugin che implementa funzioni astratte per la piattaforma Windows + + Internal display + Schermo interno + WindowsServiceControl @@ -4374,30 +4538,34 @@ Il secondo pulsante rimuove il computer selezionato o l'ultimo.The service "%1" is already installed. Il servizio "%1" è già installato. - - The service "%1" could not be installed. - Il servizio "%1" non può essere installato. - The service "%1" has been installed successfully. Il servizio "%1" è stato installato correttamente. - - The service "%1" could not be uninstalled. - Il servizio "%1" non può essere disinstallato. - The service "%1" has been uninstalled successfully. Il servizio "%1" è stato disinstallato correttamente. - - The start type of service "%1" could not be changed. - Non è stato possibile modificare il tipo di avvio del servizio "%1". - Service "%1" could not be found. Il servizio "%1" non è stato trovato. + + The service "%1" could not be installed (error %2). + Il servizio "%1" non può essere installato (errore %2). + + + Could not change the failure actions config for service "%1" (error %2). + Impossibile modificare la configurazione delle azioni di errore per il servizio "%1" (errore %2). + + + The service "%1" could not be uninstalled (error %2). + Impossibile disinstallare il servizio "%1" (errore %2). + + + The start type of service "%1" could not be changed (error %2). + Impossibile modificare il tipo di avvio del servizio "%1" (errore %2). + X11VncConfigurationWidget diff --git a/translations/veyon_ja.ts b/translations/veyon_ja.ts index 5538e2ae3..1cf14d4c7 100644 --- a/translations/veyon_ja.ts +++ b/translations/veyon_ja.ts @@ -270,7 +270,7 @@ If you're interested in translating Veyon into your local or another langua is not member of group - + はグループのメンバーではありません is authenticated via @@ -298,19 +298,19 @@ If you're interested in translating Veyon into your local or another langua is already connected - + すでに接続されています is not connected - + 接続されていません is local computer - + ローカルコンピュータです is not local computer - + ローカルコンピュータではありません Computer being accessed @@ -686,10 +686,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. このコマンドは設定されたキーディレクトリーにあるすべての有効な認証キーを一覧にします。"%1"が指定されていれば、キーの詳細が表で表示されます。キーにアクセス権限が無いなどキーにアクセスできなかった場合、いくつかの詳細が表示されない場合があります。 - - Please specify the command to display help for! - ヘルプを表示するコマンドを指定してください! - TYPE タイプ @@ -730,6 +726,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. 第一引数にキー名(例:"teacher/public")を指定してください。 + + Please specify the command to display help for. + ヘルプを表示するコマンドを指定してください。 + + + The specified command does not exist or no help is available for it. + 指定されたコマンドが存在しないか、そのコマンドに対するヘルプがありません。 + AuthKeysTableModel @@ -758,7 +762,7 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + bindDNにマッピングするユーザー名: e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org @@ -945,11 +949,11 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + ディレクトリ名 Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + CSVファイルのインポートは、コマンドライン・インターフェースで可能です。詳しくは、<a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">オンラインドキュメント</a>をご覧ください。 @@ -1168,7 +1172,7 @@ The public key is used on client computers to authenticate incoming connection r Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + 指定されたオブジェクトをディレクトリから削除します。%1 は名前または UUID で指定できます。場所を削除すると、関連するすべてのコンピュータも削除されます。 Remove a computer by name @@ -1194,6 +1198,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS MACアドレス + + The specified command does not exist or no help is available for it. + 指定されたコマンドが存在しないか、そのコマンドに対するヘルプがありません。 + BuiltinUltraVncServer @@ -1261,12 +1269,16 @@ The public key is used on client computers to authenticate incoming connection r Name: %1 - + 名前: %1 invalid 無効 + + [none] + [なし] + ComputerControlServer @@ -1318,11 +1330,11 @@ The public key is used on client computers to authenticate incoming connection r Missing network object directory plugin - + ネットワークオブジェクトプラグインが見つかりません No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + 既定のネットワーク オブジェクト ディレクトリ プラグインが見つかりませんでした。インストールを確認するか、%1 Configurator で別のネットワーク オブジェクト ディレクトリ バックエンドを構成してください。 Location detection failed @@ -1330,7 +1342,7 @@ The public key is used on client computers to authenticate incoming connection r Computer name;Hostname;User - + コンピュータ名;ホスト名;ユーザー Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. @@ -1392,7 +1404,7 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. - + コンピュータとユーザのリストを %1 に書き込めません! ファイルのアクセス許可を確認してください。 @@ -1427,15 +1439,15 @@ The public key is used on client computers to authenticate incoming connection r Upgrade and save configuration of program and plugins - + プログラムおよびプラグインのアップグレードと設定の保存 Please specify an existing configuration file to import. - + インポートする既存の設定ファイルを指定してください。 Configuration file is not readable! - + 設定ファイルは読み込む事ができません! Please specify a valid filename for the configuration export. @@ -1443,31 +1455,31 @@ The public key is used on client computers to authenticate incoming connection r Output file is not writable! - + 出力ファイルは書き込む事ができません! Output directory is not writable! - + 出力先ディレクトリは書き込むことができません! Please specify a valid key. - + 有効なキーを指定してください。 Specified key does not exist in current configuration! - + 指定されたキーは現在の構成に存在しません! Please specify a valid value. - + 有効な値を指定してください。 Configure Veyon at command line - + コマンドラインからVeynを設定する Commands for managing the configuration of Veyon - + Veyonの設定を管理するためのコマンド @@ -1508,11 +1520,11 @@ The public key is used on client computers to authenticate incoming connection r DemoConfigurationPage Demo server - デモサーバー + デモサーバ Tunables - 調整可能 + チューニング ms @@ -1536,7 +1548,7 @@ The public key is used on client computers to authenticate incoming connection r s - + s Slow down thumbnail updates while demo is running @@ -1567,7 +1579,7 @@ The public key is used on client computers to authenticate incoming connection r Share your screen or allow a user to share his screen with other users. - + 自分の画面、または選択したユーザーの画面を他のユーザーに共有します。 Full screen demo @@ -1613,10 +1625,6 @@ The public key is used on client computers to authenticate incoming connection r All screens 全ての画面 - - Screen %1 [%2] - 画面 %1 [%2] - DesktopAccessDialog @@ -1716,7 +1724,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to start an application on all computers. - + 全てのコンピューターでアプリケーションを起動します Start application "%1" @@ -1801,9 +1809,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + ヘルプを表示するコマンドを指定してください。 + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + ホストアドレス + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + 指定されたコマンドが存在しないか、そのコマンドに対するヘルプがありません。 + + + Name + 名前 + + + Description + + + + Master + マスター + + + Service + サービス + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + - Feature control + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -1982,7 +2114,7 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - + ログを標準エラー出力に出力する %1 service @@ -2014,7 +2146,7 @@ The public key is used on client computers to authenticate incoming connection r Rotate log files - + ログファイルをローテーション x @@ -2022,7 +2154,7 @@ The public key is used on client computers to authenticate incoming connection r Write to logging system of operating system - + OSのシステムログに書き込む TLS configuration @@ -2612,7 +2744,7 @@ The public key is used on client computers to authenticate incoming connection r Connection security - + 接続の安全性 TLS certificate verification @@ -2620,15 +2752,15 @@ The public key is used on client computers to authenticate incoming connection r System defaults - + システムの標準 Never (insecure!) - + しない(安全ではありません!) Custom CA certificate file - + カスタムCA証明書ファイル None @@ -2768,7 +2900,7 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + ディレクトリ名 Query options @@ -3045,7 +3177,7 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reset the local configuration and revert all settings to their defaults? - + ローカル設定をリセットし、すべての設定をデフォルトに戻して良いですか? Search users and computers @@ -3089,7 +3221,7 @@ The public key is used on client computers to authenticate incoming connection r Use custom computer arrangement - + コンピュータの自由配置を使用する Locations && computers @@ -3119,6 +3251,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers 場所&コンピューター + + Only show computers with logged on users + + MasterConfigurationPage @@ -3172,7 +3308,7 @@ The public key is used on client computers to authenticate incoming connection r Hide computer filter field - + "コンピューターを検索"の欄を隠す Actions such as rebooting or powering down computers @@ -3276,7 +3412,7 @@ The public key is used on client computers to authenticate incoming connection r Hide local session - + ローカルセッションを隠す Auto @@ -3309,6 +3445,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. このモードでは、全てのコンピューターを1つ以上の場所でモニターできるようになります。 + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3354,7 +3502,7 @@ The public key is used on client computers to authenticate incoming connection r Remember and add to website menu - + Webサイトのメニューに追加・記録する e.g. www.veyon.io @@ -3374,7 +3522,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3448,7 +3596,7 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - + 選択したコンピューターを再起動して良いですか? Power on a computer via Wake-on-LAN (WOL) @@ -3503,15 +3651,15 @@ Please save your work and close all programs. Do you really want to reboot <b>ALL</b> computers? - + 全てのコンピューターを再起動しても良いですか? Do you really want to power down <b>ALL</b> computers? - + 全てのコンピューターをシャットダウンしても良いですか? Do you really want to power down the selected computers? - + 選択したコンピューターをシャットダウンしても良いですか? @@ -3522,15 +3670,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + 選択されているコンピュータの電源を切るまでのタイムアウト時間を指定してください。 minutes - + seconds - + @@ -3549,7 +3697,7 @@ Please save your work and close all programs. Open a remote control window for a computer. - + リモート操作ウィンドウを開きます Remote access @@ -3561,7 +3709,7 @@ Please save your work and close all programs. Please enter the hostname or IP address of the computer to access: - + アクセスするコンピュータのホスト名、またはIPアドレスを入力してください Show help about command @@ -3656,6 +3804,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + 全ての画面 + ScreenLockFeaturePlugin @@ -3719,15 +3875,15 @@ Please save your work and close all programs. Screenshots taken - + スクリーンショット取得 Screenshot of %1 computer have been taken successfully. - + %1 台のコンピューターのスクリーンショットを正常に取得しました Take screenshots of computers and save them locally. - + コンピューターのスクリーンショットを取得しローカルに保存しました @@ -3773,7 +3929,7 @@ Please save your work and close all programs. Do you really want to delete all selected screenshots? - + 選択したスクリーンショットを削除しても良いですか? @@ -3808,7 +3964,7 @@ Please save your work and close all programs. Enable firewall exception - + ファイアウォールの例外を有効にする Allow connections from localhost only @@ -3853,7 +4009,7 @@ Typically this is required to support terminal servers. Network port numbers - + 通信ポート番号 Veyon server @@ -3861,35 +4017,35 @@ Typically this is required to support terminal servers. Internal VNC server - 内部VNCサーバー + 内部VNCサーバ Feature manager - + 機能マネージャー Demo server - デモサーバー + デモサーバ Miscellaneous network settings - + その他のネットワーク設定 Session mode - + セッションモード Local session mode (single server instance for primary local session) - + ローカルセッションモード(プライマリローカルセッション用の単一サーバーインスタンス) Active session mode (single server instance for active local or remote session) - + アクティブセッションモード(アクティブなローカルまたはリモートセッション用の単一サーバーインスタンス) Multi session mode (distinct server instance for each local and remote desktop session) - + マルチセッションモード(ローカルおよびリモートデスクトップセッションごとに異なるサーバーインスタンス) @@ -3916,19 +4072,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - サービス実行中 - - - Service is not running - サービス停止中 - - - Configure and control Veyon service - Veyonサービスの構成と制御 - + ServiceControlCommands Register Veyon Service Veyonサービスを登録 @@ -3953,13 +4097,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service + + Service is running + サービス実行中 + + + Service is not running + サービス停止中 + + + Configure and control Veyon service + Veyonサービスの構成と制御 + Commands for configuring and controlling Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file @@ -3969,7 +4125,7 @@ Typically this is required to support terminal servers. ファイル"%1"が存在しません! - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4008,7 +4164,7 @@ Typically this is required to support terminal servers. Update computers in realtime - + リアルタイムでコンピュータを更新 Spotlight @@ -4016,12 +4172,13 @@ Typically this is required to support terminal servers. Please select at least one computer to add. - + 追加するコンピューターを少なくとも1台は選択してください Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + マウスの中ボタンでクリックするか、下の1番目のボタンをクリックすると、コンピュータが追加されます。 +2番目のボタンは、選択されたコンピュータまたは最後のコンピュータを削除します。 @@ -4032,15 +4189,16 @@ The second button removes the selected or last computer. Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + 選択したコンピューターで起動するアプリケーションを入力してください +複数のアプリケーションを行ごとに分けることができます e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + (例)"C:\Program Files\VideoLAN\VLC\vlc.exe" Remember and add to application menu - + アプリケーションのメニューに追加・記録する Application name @@ -4066,22 +4224,22 @@ The second button removes the selected or last computer. SystemUserGroupsPlugin User groups backend for system user groups - + システムユーザグループのためのユーザグループバックエンド Default (system user groups) - + デフォルト(システムユーザーグループ) TestingCommandLinePlugin Test internal Veyon components and functions - + Veyonの内部コンポーネントや機能のテスト Commands for testing internal components and functions of Veyon - + 内部コンポーネントやVeyonの機能をテストするためのコマンド @@ -4092,7 +4250,7 @@ The second button removes the selected or last computer. Please enter your message which send to all selected users. - + 選択したすべてのユーザーに送信するメッセージを入力してください。 @@ -4103,7 +4261,7 @@ The second button removes the selected or last computer. Use this function to send a text message to all users e.g. to assign them new tasks. - + 例えば新しい作業を指示するなど、この機能を使用してすべてのユーザーにテキストメッセージを送信できます Message from teacher @@ -4118,15 +4276,15 @@ The second button removes the selected or last computer. UltraVncConfigurationWidget Enable capturing of layered (semi-transparent) windows - + レイヤー(半透明)ウィンドウのキャプチャを可能にする Poll full screen (leave this enabled per default) - + フルスクリーンでポーリング(デフォルトで有効のまま) Low accuracy (turbo mode) - + 低精度(ターボモード) Builtin UltraVNC server configuration @@ -4138,22 +4296,22 @@ The second button removes the selected or last computer. Enable Desktop Duplication Engine on Windows 8 and newer - + Windows 8以降でDesktop Duplication Engineを有効化する Maximum CPU usage - + CPUの最大使用率 UserConfig No write access - + 書込不可 Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + 個人設定を保存できませんでした! %1 Configuratorを使ってユーザー設定ファイルのパスを確認してください。 @@ -4164,7 +4322,7 @@ The second button removes the selected or last computer. Please enter a username and password for automatic login on all computers. - + すべてのコンピュータで自動ログインする為にユーザー名とパスワードを入力してください。 Username @@ -4195,11 +4353,11 @@ The second button removes the selected or last computer. Confirm user logoff - + ユーザーログオフの確認 Do you really want to log off the selected users? - + 選択したユーザーをログオフしても良いですか? User session control @@ -4207,7 +4365,7 @@ The second button removes the selected or last computer. Do you really want to log off <b>ALL</b> users? - + 全てのユーザーをログオフしても良いですか? @@ -4222,15 +4380,15 @@ The second button removes the selected or last computer. Invalid command! - + 無効なコマンドです! Available commands: - + 使用可能なコマンド: Invalid arguments given - + 無効な引数が指定されました Not enough arguments given - use "%1 help" for more information @@ -4280,6 +4438,10 @@ The second button removes the selected or last computer. Authentication test 認証テスト + + Screen %1 + + VeyonServiceControl @@ -4292,7 +4454,7 @@ The second button removes the selected or last computer. WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + SAS生成の設定をソフトウェアで変更することができませんでした。リモコンでCtrl+Alt+Delを送っても動作しません! @@ -4331,7 +4493,7 @@ The second button removes the selected or last computer. Use alternative user authentication mechanism - + 代替のユーザー認証機構を使用する User login @@ -4347,18 +4509,22 @@ The second button removes the selected or last computer. Confirm legal notice (message displayed before user logs in) - + 法的通知の確認(メッセージはユーザーがログインする前に表示されます) Use input device interception driver - + 入力デバイス遮断ドライバを使用する WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + Windows環境用の抽象関数を実装したプラグイン + + + Internal display + 内蔵ディスプレイ @@ -4368,28 +4534,32 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. - The service "%1" could not be uninstalled. + Service "%1" could not be found. + サービス "%1"が見つかりませんでした。 + + + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. - サービス "%1"が見つかりませんでした。 + The start type of service "%1" could not be changed (error %2). + @@ -4404,7 +4574,7 @@ The second button removes the selected or last computer. Do not use X Damage extension - + X Damage extensionは使わないでください \ No newline at end of file diff --git a/translations/veyon_ko.ts b/translations/veyon_ko.ts index 3c117430a..c67bad004 100644 --- a/translations/veyon_ko.ts +++ b/translations/veyon_ko.ts @@ -685,10 +685,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. 이 명령어는 설정된 키폴더에 있는 모든 인증키를 리스트해 줍니다. 만일 옵션 "%1"가 지정되면 키 상세 테이블이 대신 표시됩니다. 키가 접근 불가할 경우엔 일부 내용이 누락될 수 있습니다. 즉 e.g. 읽기 권한이 없는 경우등. - - Please specify the command to display help for! - 도움말을 표시할 명령어를 지정하세요 - TYPE TYPE @@ -729,6 +725,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1193,6 +1197,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS 맥 어드레스 + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1612,10 +1624,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1800,10 +1808,134 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + HOST ADDRESS + + + FEATURE + + - Feature control - 기능제어 + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + 이름 + + + Description + + + + Master + 마스터 + + + Service + 서비스 + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -3135,6 +3267,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers 위치 및 컴퓨터들 + + Only show computers with logged on users + + MasterConfigurationPage @@ -3325,6 +3461,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. 이모드는 하나 또는 많은 위치에 있는 모든 컴퓨터들의 모니터를 가능하게 합니다. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3390,7 +3538,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3673,6 +3821,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3934,19 +4090,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - 서비스 실행중 - - - Service is not running - 서비스 실행중이 아님 - - - Configure and control Veyon service - Veyon 서비스 설정및 제어 - + ServiceControlCommands Register Veyon Service Veyon 서비스 등록 @@ -3971,13 +4115,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service Veyon 서비스 상태 조회 + + Service is running + 서비스 실행중 + + + Service is not running + 서비스 실행중이 아님 + + + Configure and control Veyon service + Veyon 서비스 설정및 제어 + Commands for configuring and controlling Veyon Service Veyon 서비스 설정 및 제어 명령어 - ShellCommandLinePlugin + ShellCommands Run command file 명령어행 실행 @@ -3987,8 +4143,8 @@ Typically this is required to support terminal servers. 화일 "%1" 이 없음! - Interactive shell and script execution for Veyon Control - Veyon 제어용 대화형 쉘과 스크립트 실행 + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4298,6 +4454,10 @@ The second button removes the selected or last computer. Authentication test 인증 테스트 + + Screen %1 + + VeyonServiceControl @@ -4378,6 +4538,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform 윈도우즈 플래폼용 플러그인 실행용 추상화 함수 + + Internal display + + WindowsServiceControl @@ -4385,30 +4549,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. 서비스 "%1"은 이미 설치되어 있습니다. - - The service "%1" could not be installed. - 서비스 "%1"을 설치할 수 없습니다. - The service "%1" has been installed successfully. 서비스 "%1"을 성공적으로 설치했습니다. - - The service "%1" could not be uninstalled. - 서비스 "%1"을 제거할 수 없습니다. - The service "%1" has been uninstalled successfully. 서비스 "%1"을 성공적으로 제거했습니다. - - The start type of service "%1" could not be changed. - 서비스 "%1"의 시작형식을 변경할 수 없음. - Service "%1" could not be found. 서비스 "%1"을 찾을 수 없습니다. + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_lt.ts b/translations/veyon_lt.ts index 2c7e4d0a9..1f6b84789 100644 --- a/translations/veyon_lt.ts +++ b/translations/veyon_lt.ts @@ -684,10 +684,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Ši komanda parodo visus galimus prieigos raktus, kurie yra sukonfigūruoti raktų direktorijoje. Jeigu opcija "%1" yra užpildyta, lentelė su rakto duomenimis bus parodyta. Ne visos detalės gali būti rodomos jeigu raktas yra nepasiekiamas, pavyzdžiui dėl teisių trūkumo. - - Please specify the command to display help for! - Nurodykite komandą, kuriai norite peržiūrėti pagalbą! - TYPE TIPAS @@ -728,6 +724,14 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1192,6 +1196,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u MAC ADDRESS MAC ADRESAS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1265,6 +1273,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u invalid + + [none] + + ComputerControlServer @@ -1611,10 +1623,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u All screens Visi ekranai - - Screen %1 [%2] - Ekranas %1 [%2] - DesktopAccessDialog @@ -1799,10 +1807,134 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u - FeatureControl + FeatureCommands - Feature control - Funkcijų valdymas + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + SERVERIO ADRESAS + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Vardas + + + Description + + + + Master + + + + Service + Tarnyba + + + Worker + + + + UID + + + + Plugin + Plėtinys + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -3118,6 +3250,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Locations & computers Vietos ir kompiuteriai + + Only show computers with logged on users + + MasterConfigurationPage @@ -3308,6 +3444,18 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3373,7 +3521,7 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u - PluginsCommands + PluginCommands List names of all installed plugins @@ -3654,6 +3802,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + Visi ekranai + ScreenLockFeaturePlugin @@ -3914,19 +4070,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Tarnyba vykdoma - - - Service is not running - Tarnyba nevykdoma - - - Configure and control Veyon service - Konfigūruoti ir kontroliuoti Veyon tarnybą - + ServiceControlCommands Register Veyon Service Užregistruoti Veyon tarnybą @@ -3951,13 +4095,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service Užklausti Veyon tarnybos statuso + + Service is running + Tarnyba vykdoma + + + Service is not running + Tarnyba nevykdoma + + + Configure and control Veyon service + Konfigūruoti ir kontroliuoti Veyon tarnybą + Commands for configuring and controlling Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file Paleisti komandos failą @@ -3967,8 +4123,8 @@ Typically this is required to support terminal servers. Failas "%1" neegzistuoja! - Interactive shell and script execution for Veyon Control - Interaktyvus shell ir script vykdymas + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4278,6 +4434,10 @@ The second button removes the selected or last computer. Authentication test Autentifikacijos testas + + Screen %1 + + VeyonServiceControl @@ -4358,6 +4518,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Plėtinio įgyvendinimo abstrakčios funkcijos Windows platformai + + Internal display + + WindowsServiceControl @@ -4365,30 +4529,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. Tarnyba "%1" jau yra įdiegta. - - The service "%1" could not be installed. - Tarnyba "%1" negali būti įdiegta. - The service "%1" has been installed successfully. Tarnyba "%1" buvo sėkmingai įdiegta. - - The service "%1" could not be uninstalled. - Tarnyba "%1" negali būti išdiegta. - The service "%1" has been uninstalled successfully. Tarnyba "%" buvo sėkmingai išdiegta. - - The start type of service "%1" could not be changed. - Paleisties tipas tarnybai "%1" negali būti pakeistas. - Service "%1" could not be found. Tarnyba "%1" nerasta. + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_lv.ts b/translations/veyon_lv.ts index 66496920d..b3d4d440e 100644 --- a/translations/veyon_lv.ts +++ b/translations/veyon_lv.ts @@ -126,27 +126,27 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l The specified user is not allowed to access computers with this configuration. - + Norādītajam lietotājam nav piekļuve datoriem ar šo konfigurāciju. Enable usage of domain groups - + Iespējot domēnu grupas lietošanu User groups backend: - + Lietotāju grupas backends: Missing user groups backend - + Trūks lietotāju grupas backends No default user groups plugin was found. Please check your installation! - + Neviens pamata lietotāja grupas spraudnis netika atrasts. Lūdzu pārbaudi instalāciju. Restrict access to members of specific user groups - + Ierobežot piekļuvi konkrētas grupas lietotājiem @@ -181,7 +181,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Ja ir vairāk kā viens nosacījums aktivizēts, tad visiem nosacījumiem jāizpildās, lai izpildītos (loģiskais UN). Ja vienam vai vairākiem nosacījumiem jāizpildās (loģiskais VAI), lūdzu izveidojiet vairākus piekļuves kontroles noteikumus. Action @@ -213,7 +213,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Always process rule and ignore conditions - + Vienmēr apstrādāt noteikumus un ignorēt nosacījumus Accessing computer and local computer @@ -221,15 +221,15 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l User being accessed - + Piekļūt lietotājam is logged in locally - + ir pieslēdzies lokāli is logged in remotely - + ir pieslēdzies attālināti No user is logged in locally @@ -249,7 +249,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l is located at - + atrodas is not located at @@ -391,19 +391,19 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l 1) Create a key pair on the master computer. - + 1) Izveido atslēgu pāri galvenajam datoram 2) Set an access group whose members should be allowed to access other computers. - + 2) Izveido piekļuves grupu dalībniekiem kuru dalībniekiem atļauts piekļūt citu datoriem 3) Export the public key and import it on all client computers with the same name. - + 3) Izgul publisko atslēgu un iegul, ar vienādu vārdu, visos klientu datoros. Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Lūdzu skaties <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon administratoru pamācību </a> vairāk informācijai Key file directories @@ -462,7 +462,7 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to delete authentication key "%1/%2"? - + Vai tiešām izdzēst autentifikācijas atslēgu "%1/%2"? Please select a key to delete! @@ -482,7 +482,7 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! - + Izvēlies atslēgu kuru piešķirt piekļuves grupai! @@ -493,7 +493,7 @@ The public key is used on client computers to authenticate incoming connection r Key name contains invalid characters! - + Atslēga satur neatbilstošus simbolus! Invalid key type specified! Please specify "%1" or "%2". @@ -509,7 +509,7 @@ The public key is used on client computers to authenticate incoming connection r Creating new key pair for "%1" - + Veido jaunu atslēgu pāri priekš "%1" Failed to create public or private key! @@ -521,7 +521,7 @@ The public key is used on client computers to authenticate incoming connection r Could not remove key file "%1"! - + Nevar noņemt atslēgas failu "%1"! Could not remove key file directory "%1"! @@ -624,7 +624,7 @@ The public key is used on client computers to authenticate incoming connection r AuthKeysPlugin Create new authentication key pair - + Izveidot jaunu autentificēšanās atslēgas pāri Delete authentication key @@ -632,15 +632,15 @@ The public key is used on client computers to authenticate incoming connection r List authentication keys - + Saraksts ar autentificēšanās atslēgām Import public or private key - + Importēt publisko vai privāto atslēgu Export public or private key - + Eksporēt publisko vai privāto atslēgu Extract public key from existing private key @@ -682,10 +682,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE TIPS @@ -726,6 +722,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -925,19 +929,19 @@ The public key is used on client computers to authenticate incoming connection r Locations - + Vietas Add new location - + Pievienot jaunu vietu Remove selected location - + Noņemt izvēlēto vietu New location - + Jauna vieta Directory name @@ -992,11 +996,11 @@ The public key is used on client computers to authenticate incoming connection r Can't open file "%1" for reading! - + Nevar atvērt failu "%1" lasīšanai! Unknown argument "%1". - + Nezināma arguments "%1". Computer "%1" (host address: "%2" MAC address: "%3") @@ -1040,7 +1044,7 @@ The public key is used on client computers to authenticate incoming connection r Can't open file "%1" for writing! - + Nevar atvērt failu "%1" rakstīšanai! No format string specified! @@ -1056,11 +1060,11 @@ The public key is used on client computers to authenticate incoming connection r Add a location or computer - + Pievienot vietu vai datoru Clear all locations and computers - + Notīrīt visas vietas un datorus Dump all or individual locations and computers @@ -1068,15 +1072,15 @@ The public key is used on client computers to authenticate incoming connection r List all locations and computers - + Saraksts ar vietām un datoriem Remove a location or computer - + Noņemt vietu vai datoru Location "%1" - + Vieta "%1" Builtin (computers and locations in local configuration) @@ -1084,7 +1088,7 @@ The public key is used on client computers to authenticate incoming connection r Location - + Vieta FILE @@ -1092,7 +1096,7 @@ The public key is used on client computers to authenticate incoming connection r LOCATION - + VIETA FORMAT-STRING-WITH-PLACEHOLDERS @@ -1152,7 +1156,7 @@ The public key is used on client computers to authenticate incoming connection r Add a room - + Pievienot istabu Add a computer to room %1 @@ -1160,7 +1164,7 @@ The public key is used on client computers to authenticate incoming connection r OBJECT - + OBJEKTS Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. @@ -1168,7 +1172,7 @@ The public key is used on client computers to authenticate incoming connection r Remove a computer by name - + Noņemt datorus ar vārdu Remove an object by UUID @@ -1176,11 +1180,11 @@ The public key is used on client computers to authenticate incoming connection r "Room 01" - + "Istaba 01" "Computer 01" - + "Dators 01" HOST ADDRESS @@ -1190,6 +1194,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS MAC adrese + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1202,7 +1210,7 @@ The public key is used on client computers to authenticate incoming connection r BuiltinX11VncServer Builtin VNC server (x11vnc) - + Iebūvētais VNC serveris (x11vnc) @@ -1225,7 +1233,7 @@ The public key is used on client computers to authenticate incoming connection r Computer offline or switched off - + Dators nav tiešsaistē vai ir izslēgts Authentication failed or access denied @@ -1241,15 +1249,15 @@ The public key is used on client computers to authenticate incoming connection r Logged on user: %1 - + Ielogojies lietotajā: %1 Location: %1 - + Vieta: %1 [no user] - + [nav lietotājs] Veyon Server unreachable or not running @@ -1257,11 +1265,15 @@ The public key is used on client computers to authenticate incoming connection r Name: %1 - + Vārds: %1 invalid - + nederīgs + + + [none] + [neviens] @@ -1288,7 +1300,7 @@ The public key is used on client computers to authenticate incoming connection r Access control error - + Piekļuves kontroles kļūda User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. @@ -1296,7 +1308,7 @@ The public key is used on client computers to authenticate incoming connection r Active connections: - + Aktīvās konekcijas: @@ -1368,7 +1380,7 @@ The public key is used on client computers to authenticate incoming connection r Add location - + Pievienot vietu Save computer/user list @@ -1399,7 +1411,7 @@ The public key is used on client computers to authenticate incoming connection r List all configuration keys and values - + Saraksts ar konfigurācijas atslēgām un vērtībām Import configuration from given file @@ -1439,15 +1451,15 @@ The public key is used on client computers to authenticate incoming connection r Output file is not writable! - + Izejas fails nav rakstāms! Output directory is not writable! - + Izejas mape nav rakstāma! Please specify a valid key. - + Precizē derīgu atslēgu. Specified key does not exist in current configuration! @@ -1455,11 +1467,11 @@ The public key is used on client computers to authenticate incoming connection r Please specify a valid value. - + Lūdzu precizē derīgu vērtību. Configure Veyon at command line - + Konfirugē Veyon komandrindā Commands for managing the configuration of Veyon @@ -1559,7 +1571,7 @@ The public key is used on client computers to authenticate incoming connection r Demo - + Demo Share your screen or allow a user to share his screen with other users. @@ -1567,11 +1579,11 @@ The public key is used on client computers to authenticate incoming connection r Full screen demo - + Pilna ekrāna priekšskatījums Share your own screen in fullscreen mode - + Dalies ar savu ekrānu pilnekrāna veidā In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. @@ -1579,7 +1591,7 @@ The public key is used on client computers to authenticate incoming connection r Share your own screen in a window - + Dalies ar savu ekrānu logā Share selected user's screen in fullscreen mode @@ -1607,11 +1619,7 @@ The public key is used on client computers to authenticate incoming connection r All screens - - - - Screen %1 [%2] - + Visi ekrāni @@ -1622,15 +1630,15 @@ The public key is used on client computers to authenticate incoming connection r Confirm desktop access - + Apstiprini darba virsmas piekļuvi Never for this session - + Nekad šai sesijai Always for this session - + Vienmēr šai sesijai The user %1 at computer %2 wants to access your desktop. Do you want to grant access? @@ -1649,11 +1657,11 @@ The public key is used on client computers to authenticate incoming connection r Predefined websites - + Iepriekšdefinētas web lapas Remove selected website - + Noņemt izvēlēto web adresi URL @@ -1661,11 +1669,11 @@ The public key is used on client computers to authenticate incoming connection r New website - + Jauna web adrese Applications & websites - + Lietotnes un web adreses Predefined applications @@ -1673,19 +1681,19 @@ The public key is used on client computers to authenticate incoming connection r Add new application - + Pievienot jaunu lietotni Remove selected application - + Noņemt izvēlēto lietotni Add new website - + Pievienot jaunu web adresi New application - + Jauna lietotne @@ -1696,31 +1704,31 @@ The public key is used on client computers to authenticate incoming connection r Click this button to open a website on all computers. - + Spied šo pogu lai atvērtu web adresi visos datoros. Open website "%1" - + Atvērt web adresi "1%" Custom website - + Pielāgota web adrese Start application - + Palaist lietotni Click this button to start an application on all computers. - + Spied šo pogu lai palaistu lietotni visos datoros. Start application "%1" - + Palaist lietotni "%1" Custom application - + Pielāgota lietotne Start apps and open websites in user sessions @@ -1731,11 +1739,11 @@ The public key is used on client computers to authenticate incoming connection r DocumentationFigureCreator Teacher - + Skolotājs Room %1 - + Istaba %1 Please complete all tasks within the next 5 minutes. @@ -1743,27 +1751,27 @@ The public key is used on client computers to authenticate incoming connection r Custom website - + Pielāgota web adrese Open file manager - + Atvērt failu pārvaldnieku Start learning tool - + Sākt mācīšanās rīku Play tutorial video - + Atskaņot pamācību video Handout - + Izdale Texts to read - + Teksts lasīšanai generic-student-user @@ -1771,14 +1779,14 @@ The public key is used on client computers to authenticate incoming connection r Custom application - + Pielāgota lietotne ExternalVncServer External VNC server - + Ārējais VNC serveris @@ -1789,7 +1797,7 @@ The public key is used on client computers to authenticate incoming connection r Port: - + Ports: Password: @@ -1797,9 +1805,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + Saraksts ar visām pieejām iespējām + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + ARGUMENTI + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + Aizslēgt ekrānu + + + Display a text message + Parādīt teksta ziņojumu + + + Test message + Testa ziņojums + + + Start an application + Palaist lietotni + - Feature control + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + Ieslēgt ekrānu + + + The specified command does not exist or no help is available for it. + + + + Name + Vārds + + + Description + Apraksts + + + Master + Galvenais + + + Service + Pakalpojums + + + Worker + Darbinieks + + + UID + UID + + + Plugin + Spraudnis + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -1807,7 +1939,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferConfigurationPage File transfer - + Faila pārsūtīšana Directories @@ -1815,11 +1947,11 @@ The public key is used on client computers to authenticate incoming connection r Destination directory - + Mērķa mape Default source directory - + Noklusējuma avota mape Options @@ -1845,7 +1977,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferDialog File transfer - + Faila pārsūtīšana Options @@ -1853,7 +1985,7 @@ The public key is used on client computers to authenticate incoming connection r Transfer only - + Pārsūtīšana tikai Transfer and open file(s) with associated program @@ -1865,15 +1997,15 @@ The public key is used on client computers to authenticate incoming connection r Files - + Faili Start - + Sākt Overwrite existing files - + Pārrakstīt esošos failus @@ -1887,7 +2019,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferPlugin File transfer - + Faila pārsūtīšana Click this button to transfer files from your computer to all computers. @@ -1903,7 +2035,7 @@ The public key is used on client computers to authenticate incoming connection r Received file "%1". - + Saņemts fails "%1" Could not receive file "%1" as it already exists. @@ -1918,7 +2050,7 @@ The public key is used on client computers to authenticate incoming connection r GeneralConfigurationPage User interface - + Lietotāja saskarne Language: @@ -1946,7 +2078,7 @@ The public key is used on client computers to authenticate incoming connection r Nothing - + Nekas Only critical messages @@ -1954,11 +2086,11 @@ The public key is used on client computers to authenticate incoming connection r Errors and critical messages - + Kļūdas un kritisko kļūdu ziņojumi Warnings and errors - + Brīdinājumi un kļūdas Information, warnings and errors @@ -1974,7 +2106,7 @@ The public key is used on client computers to authenticate incoming connection r Clear all log files - + Noņemt visus ziņojumu failus Log to standard error output @@ -2141,7 +2273,7 @@ The public key is used on client computers to authenticate incoming connection r User tree - + Lietotāju koks group tree @@ -2149,15 +2281,15 @@ The public key is used on client computers to authenticate incoming connection r Group tree - + Grupu koks computer tree - + datoru koks Computer tree - + Datoru koks computer group tree @@ -2165,7 +2297,7 @@ The public key is used on client computers to authenticate incoming connection r Computer group tree - + Datoru grupu koks user objects @@ -2273,7 +2405,7 @@ The public key is used on client computers to authenticate incoming connection r Computer not found - + Dators nav atrasts Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. @@ -2341,7 +2473,7 @@ The public key is used on client computers to authenticate incoming connection r and - + un LDAP test successful @@ -2380,7 +2512,7 @@ The public key is used on client computers to authenticate incoming connection r LdapConfigurationPage Basic settings - + Pamata iestatījumi General @@ -2432,11 +2564,11 @@ The public key is used on client computers to authenticate incoming connection r Object trees - + Objektu koks Computer tree - + Datoru koks e.g. OU=Groups @@ -2444,7 +2576,7 @@ The public key is used on client computers to authenticate incoming connection r User tree - + Lietotāju koks e.g. OU=Users @@ -2456,7 +2588,7 @@ The public key is used on client computers to authenticate incoming connection r Group tree - + Grupu koks Perform recursive search operations in object trees @@ -2492,7 +2624,7 @@ The public key is used on client computers to authenticate incoming connection r Advanced settings - + Paplašināti iestatījumi Optional object filters @@ -2504,7 +2636,7 @@ The public key is used on client computers to authenticate incoming connection r Filter for users - + Lietotāju filtrs Filter for computer groups @@ -2552,7 +2684,7 @@ The public key is used on client computers to authenticate incoming connection r Enter computer DN - + Ievadi datora DN Please enter the DN of a computer whose MAC address to query: @@ -2564,7 +2696,7 @@ The public key is used on client computers to authenticate incoming connection r Enter computer IP address - + Ievadi datora IP adresi Please enter a computer IP address which to resolve to an computer object: @@ -2576,7 +2708,7 @@ The public key is used on client computers to authenticate incoming connection r Computer group tree - + Datoru grupu koks Filter for computers @@ -2596,7 +2728,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. name or description - + piemēram vārds vai apraksts Filter for computer containers @@ -2620,7 +2752,7 @@ The public key is used on client computers to authenticate incoming connection r Never (insecure!) - + Nekad (nedrošs!) Custom CA certificate file @@ -2632,11 +2764,11 @@ The public key is used on client computers to authenticate incoming connection r TLS - + TLS SSL - + SSL e.g. (objectClass=computer) @@ -2664,7 +2796,7 @@ The public key is used on client computers to authenticate incoming connection r Encryption protocol - + Kriptēšanas protokols Computer location attribute @@ -2700,7 +2832,7 @@ The public key is used on client computers to authenticate incoming connection r List all locations - + Saraksts ar visām vietām Enter computer display name @@ -2849,7 +2981,7 @@ The public key is used on client computers to authenticate incoming connection r LinuxPlatformConfigurationPage Linux - + Linux Custom PAM service for user authentication @@ -2857,7 +2989,7 @@ The public key is used on client computers to authenticate incoming connection r User authentication - + Lietotāja autentificēšanās User sessions @@ -2869,7 +3001,7 @@ The public key is used on client computers to authenticate incoming connection r User login - + Lietotāja logins Login key sequence @@ -2906,7 +3038,7 @@ The public key is used on client computers to authenticate incoming connection r Show icons only - + Rādīt ikonas tikai @@ -2985,7 +3117,7 @@ The public key is used on client computers to authenticate incoming connection r Master - + Galvenais Access control @@ -3105,7 +3237,7 @@ The public key is used on client computers to authenticate incoming connection r Spotlight - + Izcelt Veyon Master @@ -3113,6 +3245,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + Vietas un datori + + + Only show computers with logged on users @@ -3152,7 +3288,7 @@ The public key is used on client computers to authenticate incoming connection r Basic settings - + Pamata iestatījumi Behaviour @@ -3176,7 +3312,7 @@ The public key is used on client computers to authenticate incoming connection r User interface - + Lietotāja saskarne Background color @@ -3200,11 +3336,11 @@ The public key is used on client computers to authenticate incoming connection r User and computer name - + Lietotāja un datora vārds Only user name - + Tikai lietotāja vārdu Only computer name @@ -3216,7 +3352,7 @@ The public key is used on client computers to authenticate incoming connection r Text color - + Teksta krāsa Sort order @@ -3305,6 +3441,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3362,7 +3510,7 @@ The public key is used on client computers to authenticate incoming connection r Name: - + Vārds: Website name @@ -3370,7 +3518,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3385,15 +3533,15 @@ The public key is used on client computers to authenticate incoming connection r Description - + Apraksts Version - + Versija UID - + UID Plugin-related CLI operations @@ -3472,7 +3620,7 @@ The public key is used on client computers to authenticate incoming connection r Power down now - + Izslēgt tagad Install updates and power down @@ -3521,11 +3669,11 @@ Please save your work and close all programs. minutes - + minūtes seconds - + sekundes @@ -3645,12 +3793,20 @@ Please save your work and close all programs. Exit - + Iziet Connecting... + Pieslēdzas... + + + Select screen + + All screens + Visi ekrāni + ScreenLockFeaturePlugin @@ -3672,11 +3828,11 @@ Please save your work and close all programs. Lock input devices - + Slēgt ievadierīces Unlock input devices - + Pieslēgt ievadierīces To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. @@ -3844,19 +4000,19 @@ Typically this is required to support terminal servers. Maximum session count - + Maksimālais sesiju skaits Network port numbers - + Tīkla porta numurs Veyon server - + Veyon serveris Internal VNC server - + Iekšējais VNC serveris Feature manager @@ -3911,19 +4067,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Pakalpojums darbojas - - - Service is not running - Pakalpojums nedarbojas - - - Configure and control Veyon service - - + ServiceControlCommands Register Veyon Service Reģistrēt Veyon pakalpojumu @@ -3948,13 +4092,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service + + Service is running + Pakalpojums darbojas + + + Service is not running + Pakalpojums nedarbojas + + + Configure and control Veyon service + + Commands for configuring and controlling Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file Palaist komandu failu @@ -3964,7 +4120,7 @@ Typically this is required to support terminal servers. Fails "%1" neeksistē! - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -3976,38 +4132,38 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Iepriekšējais Start/pause - + Starts/pauze Next - + Nākošais Duration: - + Ilgums: SpotlightPanel Add selected computers - + Pievienot izvēlētos datorus Remove selected computers - + Noņemt izvēlētos datorus Update computers in realtime - + Atjaunot datorus tiešsaistē Spotlight - + Izcelt Please select at least one computer to add. @@ -4023,7 +4179,7 @@ The second button removes the selected or last computer. StartAppDialog Start application - + Palaist lietotni Please enter the applications to start on the selected computers. You can separate multiple applications by line. @@ -4043,11 +4199,11 @@ The second button removes the selected or last computer. Name: - + Vārds: e.g. VLC - + piemēram VLC @@ -4137,7 +4293,7 @@ The second button removes the selected or last computer. Maximum CPU usage - + Maksimālais procesora lietojums @@ -4155,7 +4311,7 @@ The second button removes the selected or last computer. UserLoginDialog User login - + Lietotāja logins Please enter a username and password for automatic login on all computers. @@ -4174,7 +4330,7 @@ The second button removes the selected or last computer. UserSessionControlPlugin Log in - + Pieslēgties Click this button to log in a specific user on all computers. @@ -4182,7 +4338,7 @@ The second button removes the selected or last computer. Log off - + Atslēgties Click this button to log off users from all computers. @@ -4190,7 +4346,7 @@ The second button removes the selected or last computer. Confirm user logoff - + Apstiprināt lietotāja atslēgšanu Do you really want to log off the selected users? @@ -4257,23 +4413,27 @@ The second button removes the selected or last computer. USAGE - + LIETOJUMS DESCRIPTION - + APRAKSTS EXAMPLES - + PIEMĒRI WARNING - + BRĪDINĀJUMS Authentication test - + Autentifikācijas tests + + + Screen %1 + Ekrāns %1 @@ -4294,7 +4454,7 @@ The second button removes the selected or last computer. WindowsPlatformConfigurationPage Windows - + Windows General @@ -4306,23 +4466,23 @@ The second button removes the selected or last computer. Screen lock - + Aizslēgt ekrānu Hide taskbar - + Paslēpt uzdevumu joslu Hide start menu - + Paslēpt start menu Hide desktop - + Paslēpt darba virsmu User authentication - + Lietotāja autentificēšanās Use alternative user authentication mechanism @@ -4330,11 +4490,11 @@ The second button removes the selected or last computer. User login - + Lietotāja logins Input start delay - + Ievadi palaišanas aizkavi Simulated key presses interval @@ -4355,6 +4515,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + Iekšējais ekrāns + WindowsServiceControl @@ -4363,27 +4527,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. + + + + Service "%1" could not be found. - The service "%1" could not be uninstalled. + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_mn.ts b/translations/veyon_mn.ts index 92f447550..1e0c5875d 100644 --- a/translations/veyon_mn.ts +++ b/translations/veyon_mn.ts @@ -680,10 +680,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE @@ -724,6 +720,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1188,6 +1192,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1261,6 +1269,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1607,10 +1619,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1795,9 +1803,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Нэр + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + - Feature control + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -3113,6 +3245,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Only show computers with logged on users + + MasterConfigurationPage @@ -3303,6 +3439,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3368,7 +3516,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3649,6 +3797,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3909,41 +4065,41 @@ Typically this is required to support terminal servers. - ServiceControlPlugin + ServiceControlCommands - Service is running + Register Veyon Service - Service is not running + Unregister Veyon Service - Configure and control Veyon service + Start Veyon Service - Register Veyon Service + Stop Veyon Service - Unregister Veyon Service + Restart Veyon Service - Start Veyon Service + Query status of Veyon Service - Stop Veyon Service + Service is running - Restart Veyon Service + Service is not running - Query status of Veyon Service + Configure and control Veyon service @@ -3952,7 +4108,7 @@ Typically this is required to support terminal servers. - ShellCommandLinePlugin + ShellCommands Run command file @@ -3962,7 +4118,7 @@ Typically this is required to support terminal servers. - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4273,6 +4429,10 @@ The second button removes the selected or last computer. Authentication test + + Screen %1 + + VeyonServiceControl @@ -4353,6 +4513,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl @@ -4361,27 +4525,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. + + + + Service "%1" could not be found. - The service "%1" could not be uninstalled. + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_nl.ts b/translations/veyon_nl.ts index 1d3052e75..99c12339f 100644 --- a/translations/veyon_nl.ts +++ b/translations/veyon_nl.ts @@ -685,10 +685,6 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Dit commando geeft een lijst weer van alle beschikbare authenticatiesleutels in de geconfigureerde sleutel map. Als de optie "%1" is opgegeven, wordt in plaats daarvan een tabel met sleuteldetails weergegeven. Sommige details kunnen ontbreken als een sleutel niet toegankelijk is, bijvoorbeeld door het ontbreken van leesrechten. - - Please specify the command to display help for! - Geef het commando op waarvoor hulp moet worden weergegeven! - TYPE TYPE @@ -699,7 +695,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Commands for managing authentication keys - Commando's voor het beheren van authenticatiesleutels + Commando's voor het beheren van authenticatiesleutels This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. @@ -729,6 +725,14 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Please specify the key name (e.g. "teacher/public") as the first argument. Geef de sleutelnaam (bijv. "teacher/public") op als eerste argument. + + Please specify the command to display help for. + Geef het commando op waarvoor hulp moet worden weergegeven. + + + The specified command does not exist or no help is available for it. + De opgegeven opdracht bestaat niet of er is geen hulp voor beschikbaar. + AuthKeysTableModel @@ -1035,7 +1039,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Commands for managing the builtin network object directory - Commando's voor het beheren van de ingebouwde netwerk object map + Commando's voor het beheren van de ingebouwde netwerk object map No format string or regular expression specified! @@ -1193,6 +1197,10 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa MAC ADDRESS MAC ADRES + + The specified command does not exist or no help is available for it. + De opgegeven opdracht bestaat niet of er is geen hulp voor beschikbaar. + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa invalid ongeldig + + [none] + [geen] + ComputerControlServer @@ -1466,7 +1478,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Commands for managing the configuration of Veyon - Commando's voor het beheer van de configuratie van Veyon + Commando's voor het beheer van de configuratie van Veyon @@ -1612,10 +1624,6 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa All screens Alle schermen - - Screen %1 [%2] - Scherm %1 [%2] - DesktopAccessDialog @@ -1800,10 +1808,136 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa - FeatureControl + FeatureCommands + + List names of all available features + Namen van alle beschikbare functies weergeven + + + Show table with details of all available features + Toon tabel met details van alle beschikbare functies + + + Start a feature on a remote host + Een functie starten op een externe host + + + Stop a feature on a remote host + Een functie op een externe host stoppen + + + Please specify the command to display help for. + Geef het commando op waarvoor hulp moet worden weergegeven. + + + Displays a list with the names of all available features. + Geeft een lijst weer met de namen van alle beschikbare functies. + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Toont een tabel met gedetailleerde informatie over alle beschikbare functies. Deze informatie bevat een beschrijving, de UID, de naam van de plugin die de betreffende eigenschap levert en enkele andere implementatie-gerelateerde details. + + + HOST ADDRESS + HOST ADRES + + + FEATURE + FUNCTIE + + + ARGUMENTS + STANDPUNTEN + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + Start de opgegeven functie op de opgegeven host door verbinding te maken met de Veyon Server die extern draait. De functie kan op naam of UID worden opgegeven. Gebruik het ``show`` commando om alle beschikbare functies te zien. Afhankelijk van het kenmerk moeten extra argumenten (zoals de weer te geven tekstboodschap) gecodeerd als een enkele JSON string worden opgegeven. Raadpleeg de documentatie voor ontwikkelaars voor meer informatie + +Translated with DeepL + + + Lock the screen + Scherm vergrendelen + + + Display a text message + Tekstbericht weergeven + + + Test message + Testbericht + + + Start an application + Start een toepassing + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + Stopt de opgegeven functie op de opgegeven host door verbinding te maken met de Veyon Server die extern draait. De functie kan worden opgegeven met naam of UID. Gebruik het ``show`` commando om alle beschikbare functies te zien. + + + Unlock the screen + Ontgrendel het scherm + + + The specified command does not exist or no help is available for it. + De opgegeven opdracht bestaat niet of er is geen hulp voor beschikbaar. + + + Name + Naam + + + Description + Beschrijving + - Feature control - Functiebeheer + Master + Master + + + Service + Service + + + Worker + Werknemer + + + UID + UID + + + Plugin + Plugin + + + Invalid feature name or UID specified + Ongeldige functienaam of UID gespecificeerd + + + Error parsing the JSON-encoded arguments: %1 + Fout bij het ontleden van de JSON-gecodeerde argumenten: %1 + + + Failed to initialize credentials + Initialisatie van referenties mislukt + + + Could not establish a connection to host %1 + Kon geen verbinding maken met host %1 + + + Failed to send feature control message to host %1 + Fout bij het verzenden van functie-controle bericht naar host %1 + + + Feature-related CLI operations + Functie-gerelateerde CLI-bewerkingen + + + Commands for controlling features + Commando's voor het bedienen van functies @@ -2021,19 +2155,19 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Write to logging system of operating system - + Schrijven naar het logsysteem van het besturingssysteem TLS configuration - + TLS configuratie Use certificate authority for TLS connections - + Gebruik een certificeringsinstantie voor TLS-verbindingen CA certificate file - + CA-certificaat bestand ... @@ -2041,25 +2175,25 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Host certificate file - + Hostcertificaat bestand Host private key file - + Host privé sleutelbestand HeadlessVncServer Headless VNC server - + VNC-server zonder hoofd LdapBrowseDialog Browse LDAP - + Bladeren door LDAP @@ -2091,7 +2225,9 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + Kan niet koppelen aan de LDAP-server. Controleer de serverparameters en de aanmeldingsgegevens. + +%1 LDAP bind successful @@ -2109,7 +2245,9 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Could not query the configured base DN. Please check the base DN parameter. %1 - + De geconfigureerde basis-DN kon niet worden opgevraagd. Controleer de parameter base DN. + +%1 LDAP base DN test successful @@ -2119,7 +2257,9 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa The LDAP base DN has been queried successfully. The following entries were found: %1 - + De LDAP base DN is met succes opgevraagd. De volgende vermeldingen zijn gevonden: + +%1 LDAP naming context test failed @@ -2129,7 +2269,9 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + Kan de basis-DN niet opvragen via naamcontexten. Controleer de naamcontext attribuutparameter. + +%1 LDAP naming context test successful @@ -2179,7 +2321,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa User login name attribute - + Attribuut inlognaam gebruiker group members @@ -2203,23 +2345,23 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Computer display name attribute - + Attribuut weergavenaam computer Invalid hostname - + Ongeldige hostnaam You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + Je hebt hostnamen van computers geconfigureerd om te worden opgeslagen als volledig gekwalificeerde domeinnamen (FQDN), maar je hebt een hostnaam zonder domein ingevoerd. You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Je hebt hostnamen van computers geconfigureerd om te worden opgeslagen als eenvoudige hostnamen zonder domeinnaam, maar je hebt een hostnaam ingevoerd met een domeinnaamgedeelte. Computer hostname attribute - + Computer hostnaam kenmerk computer MAC addresses @@ -2231,15 +2373,15 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa computer locations - + computerlocaties Computer location attribute - + Computerlocatiekenmerk Location name attribute - + Kenmerk locatienaam users @@ -2259,7 +2401,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa computer containers - + computercontainers groups of user @@ -2271,7 +2413,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Could not find a user with the name "%1". Please check the username or the user tree parameter. - + Kon geen gebruiker vinden met de naam "%1". Controleer de gebruikersnaam of de parameter van de gebruikersstructuur. groups of computer @@ -2283,27 +2425,29 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Kon geen computer vinden met de hostnaam "%1". Controleer de hostnaam of de computerstructuur parameter. + + Hostname lookup failed - + Hostnaam opzoeken mislukt Could not lookup hostname for IP address %1. Please check your DNS server settings. - + Kan hostnaam voor IP-adres %1 niet opzoeken. Controleer uw DNS-server instellingen. location entries - + locatievermeldingen Computer groups filter - + Filter computergroepen Computer locations identification - + Identificatie computerlocaties Filter for computer groups @@ -2311,11 +2455,11 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Invalid test value - + Ongeldige testwaarde An empty or invalid value has been supplied for this test. - + Er is een lege of ongeldige waarde opgegeven voor deze test. LDAP %1 test failed @@ -2325,7 +2469,9 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Could not query any entries in configured %1. Please check the parameter "%2". %3 - + Er konden geen items worden opgevraagd in geconfigureerd %1. Controleer de parameter "%2". + +%3 LDAP %1 test successful @@ -2337,21 +2483,23 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa LDAP test failed - + LDAP test mislukt Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + Kan %1 niet opvragen. Controleer de parameter(s) %2 en voer de naam van een bestaand object in. + +%3 and - + en LDAP test successful - + LDAP-test geslaagd %1 %2 have been queried successfully: @@ -2383,7 +2531,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa LDAP directory - + LDAP map @@ -2678,67 +2826,67 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Computer location attribute - + Computerlocatiekenmerk Computer display name attribute - + Attribuut weergavenaam computer Location name attribute - + Kenmerk locatienaam e.g. cn or displayName - + bijv. cn of displayName Computer locations identification - + Identificatie computerlocaties Identify computer locations (e.g. rooms) via: - + Computerlocaties (bijv. ruimtes) identificeren via: Location attribute in computer objects - + Locatiekenmerk in computerobjecten List all entries of a location - + Alle vermeldingen van een locatie weergeven List all locations - + Alle locaties weergeven Enter computer display name - + Voer de weergavenaam van de computer in Please enter a computer display name to query: - + Voer een computernaam in om op te vragen: Enter computer location name - + Voer de naam van de computerlocatie in Please enter the name of a computer location (wildcards allowed): - + Voer de naam van een computerlocatie in (jokertekens toegestaan): Enter location name - + Locatie naam invoeren Please enter the name of a location whose entries to query: - + Voer de naam in van een locatie waarvan u de gegevens wilt opvragen: Browse - + Bladeren Test @@ -2746,43 +2894,43 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Hostnamen opgeslagen als volledig gekwalificeerde domeinnamen (FQDN, bijv. myhost.example.org) Computer hostname attribute - + Computer hostnaam kenmerk Please enter a computer hostname to query: - + Voer de hostnaam van een computer in om een zoekopdracht uit te voeren: Enter hostname - + Voer hostnaam in Please enter a computer hostname whose group memberships to query: - + Voer een hostnaam van een computer in waarvan de groepslidmaatschappen moeten worden opgevraagd: User login name attribute - + Attribuut inlognaam gebruiker Configured attribute for user login name or computer hostname (OpenLDAP) - + Geconfigureerd attribuut voor aanmeldingsnaam van gebruiker of hostnaam van computer (OpenLDAP) Directory name - + Map naam Query options - + Zoekopties Query nested user groups (supported by AD only) - + Geneste gebruikersgroepen opvragen (alleen ondersteund door AD) @@ -2793,7 +2941,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + Gebruik de globale LDAP-configuratiepagina om te configureren hoe locaties en computers worden opgehaald uit uw LDAP-gebaseerde mapservice. @@ -2816,43 +2964,43 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Basic LDAP/AD support for Veyon - + Basis LDAP/AD-ondersteuning voor Veyon %1 (load computers and locations from LDAP/AD) - + %1 (computers en locaties laden vanuit LDAP/AD) %1 (load users and groups from LDAP/AD) - + %1 (gebruikers en groepen laden vanuit LDAP/AD) Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + Geef een geldige LDAP-url op volgens het schema "ldap[s]://[user[:password]@]hostnaam[:poort]". No naming context attribute name given - falling back to configured value. - + Geen naamgeving context attribuut gegeven - wordt teruggezet op geconfigureerde waarde. Could not query base DN. Please check your LDAP configuration. - + Kan basis-DN niet opvragen. Controleer uw LDAP-configuratie. Configuring %1 as base DN and disabling naming context queries. - + %1 configureren als basis DN en zoekopdrachten voor naamcontext uitschakelen. Test binding to an LDAP server - + Test de koppeling met een LDAP-server The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + De opgegeven gebruikersnaam of wachtwoord is onjuist. Voer geldige gegevens in of schakel over op een andere authenticatiemethode met behulp van de Veyon Configurator. LDAP bind - + LDAP koppeling @@ -2863,27 +3011,27 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Custom PAM service for user authentication - + Aangepaste PAM-service voor gebruikersverificatie User authentication - + Gebruikersverificatie User sessions - + Gebruiker sessies Minimum session lifetime before server start - + Minimale sessieduur voor het starten van de server User login - + Aanmelden gebruiker Login key sequence - + Toetsvolgorde aanmelden @@ -2897,7 +3045,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa LocationDialog Select location - + Kies locatie enter search filter... @@ -3071,7 +3219,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Kon niet starten met beheerdersrechten. Zorg ervoor dat er een sudo-achtig programma is geïnstalleerd voor je desktopomgeving! Het programma wordt uitgevoerd met normale gebruikersrechten. Only show powered on computers @@ -3083,23 +3231,23 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa &View - + &View &Standard - + &Standard &Advanced - + &Advanced Use custom computer arrangement - + Aangepaste computeropstelling gebruiken Locations && computers - + Locaties && computers Authentication @@ -3107,24 +3255,28 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Adjust size of computer icons automatically - + Pas de grootte van computerpictogrammen automatisch aan Slideshow - + Diavoorstelling Spotlight - + In de kijker Veyon Master - + Veyon Master Locations & computers Locaties & computers + + Only show computers with logged on users + Toon alleen computers met aangemelde gebruikers + MasterConfigurationPage @@ -3206,7 +3358,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Modes and features - + Modi en functies User and computer name @@ -3230,11 +3382,11 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Sort order - + Sorteer volgorde Computer and user name - + Computer- en gebruikersnaam Computer locations @@ -3242,47 +3394,47 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Show current location only - + Alleen huidige locatie weergeven Allow adding hidden locations manually - + Toestaan om verborgen locaties handmatig toe te voegen Hide empty locations - + Verberg lege locaties Show confirmation dialog for potentially unsafe actions - + Bevestigingsdialoog weergeven voor mogelijk onveilige acties Perform access control - + Toegangscontrole uitvoeren Automatically select current location - + Automatisch huidige locatie selecteren Automatically open computer select panel - + Automatisch computer selectiepaneel openen Use modern user interface (experimental) - + Gebruik moderne gebruikersinterface (experimenteel) Thumbnail spacing - + Tussenruimte voor miniaturen px - + px Hide local session - + Lokale sessie verbergen Auto @@ -3290,15 +3442,15 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Thumbnail aspect ratio - + Beeldverhouding miniaturen Automatically adjust computer icon size - + Pictogramgrootte van computer automatisch aanpassen Open feature windows on the same screen as the main window - + Functievensters openen op hetzelfde scherm als het hoofdvenster @@ -3313,14 +3465,26 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa This mode allows you to monitor all computers at one or more locations. - + Deze modus stelt je in staat om alle computers op één of meer locaties te controleren. + + + Query application version of the server + Toepassingsversie van de server opvragen + + + Query active features + Actieve functies opvragen + + + Query properties of remotely available screens + Eigenschappen opvragen van schermen die op afstand beschikbaar zijn NestedNetworkObjectDirectory All directories - + Alle mappen @@ -3338,14 +3502,14 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa NetworkObjectDirectoryConfigurationPageTab Enabled - + Ingeschakeld NetworkObjectTreeModel Locations/Computers - + Locaties/Computers @@ -3356,15 +3520,15 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa e.g. Veyon - + bijv. Veyon Remember and add to website menu - + Onthoud en voeg toe aan website menu e.g. www.veyon.io - + bijv. www.veyon.io Please enter the URL of the website to open: @@ -3372,22 +3536,22 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Name: - + Naam: Website name - + Website naam - PluginsCommands + PluginCommands List names of all installed plugins - + Namen van alle geïnstalleerde plugins weergeven Show table with details of all installed plugins - + Tabel weergeven met details van alle geïnstalleerde plugins Name @@ -3395,23 +3559,23 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Description - + Beschrijving Version - + Versie UID - + UID Plugin-related CLI operations - + Plugin-gerelateerde CLI-bewerkingen Commands for managing plugins - + Commando's voor het beheren van plugins @@ -3458,7 +3622,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Power on a computer via Wake-on-LAN (WOL) - + Een computer inschakelen via Wake-on-LAN (WOL) MAC ADDRESS @@ -3466,11 +3630,11 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Dit commando zendt een Wake-on-LAN (WOL) pakket uit naar het netwerk om de computer met het opgegeven MAC-adres in te schakelen. Please specify the command to display help for! - + Geef het commando op waarvoor hulp moet worden weergegeven! Invalid MAC address specified! @@ -3478,7 +3642,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Commands for controlling power status of computers - + Commando's om de energiestatus van computers te regelen Power down now @@ -3490,7 +3654,7 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Power down after user confirmation - + Schakel uit na gebruikersbevestiging Power down after timeout @@ -3498,25 +3662,27 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa The computer was remotely requested to power down. Do you want to power down the computer now? - + Er is op afstand gevraagd om de computer uit te schakelen. Wilt u de computer nu uitschakelen? The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + De computer wordt over %1 minuten, %2 seconden uitgeschakeld. + +Sla je werk op en sluit alle programma's af. Do you really want to reboot <b>ALL</b> computers? - + Wilt u echt <b>ALLE</b> computers opnieuw opstarten? Do you really want to power down <b>ALL</b> computers? - + Wilt u echt <b>ALLE</b> computers uitschakelen? Do you really want to power down the selected computers? - + Wil je echt de geselecteerde computers uitschakelen? @@ -3527,15 +3693,15 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + Geef een time-out op voor het uitschakelen van de geselecteerde computers: minutes - + minuten seconds - + seconden @@ -3577,7 +3743,7 @@ Please save your work and close all programs. RemoteAccessPage Remote access: %1 - + Toegang op afstand: %1 @@ -3588,7 +3754,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Toegang op afstand @@ -3655,11 +3821,19 @@ Please save your work and close all programs. Exit - + Verlaten Connecting... - + Verbinden... + + + Select screen + Selecteer scherm + + + All screens + Alle schermen @@ -3682,15 +3856,15 @@ Please save your work and close all programs. Lock input devices - + Invoerapparaten vergrendelen Unlock input devices - + Ontgrendel invoerapparaten To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Om de volledige aandacht van alle gebruikers terug te krijgen, kun je hun computers vergrendelen met deze knop. In deze modus worden alle invoerapparaten vergrendeld terwijl het bureaublad nog steeds zichtbaar is. @@ -3709,7 +3883,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + Kan schermopnamebestand %1 niet openen om te schrijven. @@ -3778,7 +3952,7 @@ Please save your work and close all programs. Do you really want to delete all selected screenshots? - + Wil je echt alle geselecteerde schermafbeeldingen verwijderen? @@ -3842,7 +4016,8 @@ Please save your work and close all programs. Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Het inschakelen van deze optie zorgt ervoor dat de service een serverproces start voor elke interactieve sessie op een computer. +Dit is meestal nodig om terminalservers te ondersteunen. Show notification on remote connection @@ -3850,27 +4025,27 @@ Typically this is required to support terminal servers. Show notification when an unauthorized access is blocked - + Meldingen tonen wanneer een niet-geautoriseerde toegang is geblokkeerd Maximum session count - + Maximaal aantal sessies Network port numbers - + Netwerkpoort nummers Veyon server - + Veyon server Internal VNC server - + Interne VNC server Feature manager - + Functiebeheerder Demo server @@ -3878,23 +4053,23 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + Diverse netwerkinstellingen Session mode - + Sessie modus Local session mode (single server instance for primary local session) - + Lokale sessiemodus (enkele serverinstantie voor primaire lokale sessie) Active session mode (single server instance for active local or remote session) - + Actieve sessiemodus (één serverinstantie voor actieve lokale of externe sessie) Multi session mode (distinct server instance for each local and remote desktop session) - + Modus voor meerdere sessies (afzonderlijke serverinstantie voor elke lokale en externe desktopsessie) @@ -3913,27 +4088,15 @@ Typically this is required to support terminal servers. Unregistering service %1 - + Dienst %1 afmelden Service control - + Servicecontrole - ServiceControlPlugin - - Service is running - Service is actief - - - Service is not running - Service is niet actief - - - Configure and control Veyon service - Configureer en beheer Veyon service - + ServiceControlCommands Register Veyon Service Registreer Veyon Service @@ -3958,86 +4121,99 @@ Typically this is required to support terminal servers. Query status of Veyon Service Bevraag status van Veyon Service + + Service is running + Service is actief + + + Service is not running + Service is niet actief + + + Configure and control Veyon service + Configureer en beheer Veyon service + Commands for configuring and controlling Veyon Service Commando's voor het configureren en besturen van Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file - + Opdrachtbestand uitvoeren File "%1" does not exist! Bestand "%1" bestaat niet! - Interactive shell and script execution for Veyon Control - + Interactive shell and script execution for Veyon CLI + Interactieve shell en uitvoering van scripts voor Veyon CLI Commands for shell functionalities - + Commando's voor shell-functionaliteiten SlideshowPanel Previous - + Vorige Start/pause - + Start/pauze Next - + Volgende Duration: - + Duur: SpotlightPanel Add selected computers - + Voeg geselecteerde computers toe Remove selected computers - + Verwijder geselecteerde computers Update computers in realtime - + Computers in realtime bijwerken Spotlight - + In de kijker Please select at least one computer to add. - + Selecteer ten minste één computer om toe te voegen. Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + Voeg computers toe door met de middelste muisknop te klikken of door op de eerste knop hieronder te klikken. +De tweede knop verwijdert de geselecteerde of laatste computer. StartAppDialog Start application - + Start toepassing Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + Voer de applicaties in die moeten worden gestart op de geselecteerde computers. Je kunt meerdere applicaties van elkaar scheiden door een regel. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" @@ -4045,19 +4221,19 @@ The second button removes the selected or last computer. Remember and add to application menu - + Onthouden en toevoegen aan applicatiemenu Application name - + Applicatie naam Name: - + Naam: e.g. VLC - + bijv. VLC @@ -4071,22 +4247,22 @@ The second button removes the selected or last computer. SystemUserGroupsPlugin User groups backend for system user groups - + Gebruikersgroepen backend voor systeemgebruikersgroepen Default (system user groups) - + Standaard (systeemgebruikersgroepen) TestingCommandLinePlugin Test internal Veyon components and functions - + Interne Veyon componenten en functies testen Commands for testing internal components and functions of Veyon - + Commando's voor het testen van interne componenten en functies van Veyon @@ -4097,7 +4273,7 @@ The second button removes the selected or last computer. Please enter your message which send to all selected users. - + Voer uw bericht in en verstuur het naar alle geselecteerde gebruikers. @@ -4139,15 +4315,15 @@ The second button removes the selected or last computer. Enable multi monitor support - + Ondersteuning voor meerdere monitors inschakelen Enable Desktop Duplication Engine on Windows 8 and newer - + Bureaublad Duplicatie Engine inschakelen op Windows 8 en nieuwer Maximum CPU usage - + Maximaal CPU-gebruik @@ -4165,11 +4341,11 @@ The second button removes the selected or last computer. UserLoginDialog User login - + Aanmelden gebruiker Please enter a username and password for automatic login on all computers. - + Voer een gebruikersnaam en wachtwoord in om automatisch in te loggen op alle computers. Username @@ -4184,27 +4360,27 @@ The second button removes the selected or last computer. UserSessionControlPlugin Log in - + Log in Click this button to log in a specific user on all computers. - + Klik op deze knop om een specifieke gebruiker op alle computers aan te melden. Log off - + Afmelden Click this button to log off users from all computers. - + Klik op deze knop om gebruikers van alle computers uit te loggen. Confirm user logoff - + Bevestig uitloggen gebruiker Do you really want to log off the selected users? - + Wil je echt de geselecteerde gebruikers afmelden? User session control @@ -4212,7 +4388,7 @@ The second button removes the selected or last computer. Do you really want to log off <b>ALL</b> users? - + Wilt u echt <b>ALLE</b> gebruikers afmelden? @@ -4251,39 +4427,43 @@ The second button removes the selected or last computer. No module specified or module not found - available modules are: - + Geen module opgegeven of module niet gevonden - beschikbare modules zijn: Plugin not licensed - + Plugin niet gelicentieerd INFO - + INFO ERROR - + FOUT USAGE - + GEBRUIK DESCRIPTION - + BESCHRIJVING EXAMPLES - + VOORBEELDEN WARNING - + WAARSCHUWING Authentication test - + Authenticatietest + + + Screen %1 + Scherm %1 @@ -4304,7 +4484,7 @@ The second button removes the selected or last computer. WindowsPlatformConfigurationPage Windows - + Windows General @@ -4316,47 +4496,47 @@ The second button removes the selected or last computer. Screen lock - + Schermvergrendeling Hide taskbar - + Verberg taakbalk Hide start menu - + Verberg startmenu Hide desktop - + Verberg bureaublad User authentication - + Gebruikersverificatie Use alternative user authentication mechanism - + Gebruik alternatief authenticatiemechanisme voor gebruikers User login - + Aanmelden gebruiker Input start delay - + Ingangsvertraging Simulated key presses interval - + Interval gesimuleerde toetsaanslagen Confirm legal notice (message displayed before user logs in) - + Bevestig wettelijke kennisgeving (bericht dat wordt weergegeven voordat de gebruiker inlogt) Use input device interception driver - + Gebruik het stuurprogramma voor het onderscheppen van invoerapparaten @@ -4365,36 +4545,44 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Uitvoering plugin abstracte functies voor Windows + + Internal display + Intern scherm + WindowsServiceControl The service "%1" is already installed. - + De service "%1" is al geïnstalleerd. - The service "%1" could not be installed. - + The service "%1" has been installed successfully. + De service "%1" is met succes geïnstalleerd. - The service "%1" has been installed successfully. - + The service "%1" has been uninstalled successfully. + De service "%1" is met succes verwijderd. - The service "%1" could not be uninstalled. - + Service "%1" could not be found. + Service "%1" kon niet worden gevonden. - The service "%1" has been uninstalled successfully. - + The service "%1" could not be installed (error %2). + De service "%1" kon niet worden geïnstalleerd (fout %2). - The start type of service "%1" could not be changed. - + Could not change the failure actions config for service "%1" (error %2). + Kon de storing acties config niet wijzigen voor service "%1" (fout %2). - Service "%1" could not be found. - + The service "%1" could not be uninstalled (error %2). + De service "%1" kon niet worden verwijderd (fout %2). + + + The start type of service "%1" could not be changed (error %2). + Het starttype van de service "%1" kon niet worden gewijzigd (fout %2). diff --git a/translations/veyon_no_NO.ts b/translations/veyon_no_NO.ts index bb375bfeb..4bb1c0613 100644 --- a/translations/veyon_no_NO.ts +++ b/translations/veyon_no_NO.ts @@ -680,10 +680,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE @@ -724,6 +720,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1188,6 +1192,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1261,6 +1269,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1607,10 +1619,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1795,9 +1803,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Navn + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + - Feature control + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -3113,6 +3245,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Only show computers with logged on users + + MasterConfigurationPage @@ -3303,6 +3439,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3368,7 +3516,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3649,6 +3797,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3909,41 +4065,41 @@ Typically this is required to support terminal servers. - ServiceControlPlugin + ServiceControlCommands - Service is running + Register Veyon Service - Service is not running + Unregister Veyon Service - Configure and control Veyon service + Start Veyon Service - Register Veyon Service + Stop Veyon Service - Unregister Veyon Service + Restart Veyon Service - Start Veyon Service + Query status of Veyon Service - Stop Veyon Service + Service is running - Restart Veyon Service + Service is not running - Query status of Veyon Service + Configure and control Veyon service @@ -3952,7 +4108,7 @@ Typically this is required to support terminal servers. - ShellCommandLinePlugin + ShellCommands Run command file @@ -3962,7 +4118,7 @@ Typically this is required to support terminal servers. - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4273,6 +4429,10 @@ The second button removes the selected or last computer. Authentication test + + Screen %1 + + VeyonServiceControl @@ -4353,6 +4513,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl @@ -4361,27 +4525,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. + + + + Service "%1" could not be found. - The service "%1" could not be uninstalled. + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_pl.ts b/translations/veyon_pl.ts index dd77a6f62..54d2d4286 100644 --- a/translations/veyon_pl.ts +++ b/translations/veyon_pl.ts @@ -217,35 +217,35 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne Accessing computer and local computer - + Uzyskiwanie dostępu do komputera i komputera lokalnego User being accessed - + Użytkownik uzyskuje dostęp is logged in locally - + zalogowany lokalnie is logged in remotely - + zalogowany zdalnie No user is logged in locally - + Żaden użytkownik nie jest zalogowany lokalnie One or multiple users are logged in locally - + Jeden lub kliku użytkowników zalogowanych lokalnie No user is logged in remotely - + Żaden użytkownik nie jest zalogowany zdalnie One or multiple users are logged in remotely - + Jeden lub wielu użytkowników jest zalogowanych zdalnie is located at @@ -253,7 +253,7 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne is not located at - + nie jest w are located at the same location @@ -269,7 +269,7 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne is not member of group - + nie jest członkiem grupy is authenticated via @@ -297,31 +297,31 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne is already connected - + jest już podłączony is not connected - + nie jest połączony is local computer - + jest komputerem lokalnym is not local computer - + nie jest komputerem lokalnym Computer being accessed - + Dostęp do komputera Session being accessed is a user session - + Dostęp do sesji jest sesją użytkownika Session being accessed is a login screen - + Dostęp do sesji to ekran logowania @@ -685,10 +685,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. To polecenie wyświetla listę wszystkich dostępnych kluczy uwierzytelniania w katalogu kluczy. Jeśli podano opcję „%1”, zamiast niej zostanie wyświetlona tabela ze szczegółami klucza. Niektórych szczegółów może brakować, jeśli klucz nie jest dostępny, np. z powodu braku uprawnień do odczytu. - - Please specify the command to display help for! - Podaj polecenie aby wyświetlić pomoc! - TYPE TYP @@ -727,6 +723,14 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Please specify the key name (e.g. "teacher/public") as the first argument. + Proszę wybrać nazwę klucza (np. "nauczyciel/publiczny") jako pierwszy argument + + + Please specify the command to display help for. + Podaj polecenie, dla którego chcesz wyświetlić pomoc. + + + The specified command does not exist or no help is available for it. @@ -944,7 +948,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Directory name - + Nazwa katalogu Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. @@ -1193,6 +1197,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc MAC ADDRESS ADRES MAC + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1264,6 +1272,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc invalid + nieprawidłowy + + + [none] @@ -1612,10 +1624,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc All screens Wszystkie ekrany - - Screen %1 [%2] - Ekran %1 [%2} - DesktopAccessDialog @@ -1668,7 +1676,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Applications & websites - + Aplikacje i strony internetowe Predefined applications @@ -1676,19 +1684,19 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Add new application - + Dodaj nową aplikacje Remove selected application - + Usuń wybraną aplikację Add new website - + Dodaj nową stronę New application - + Nowa aplikacja @@ -1711,7 +1719,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Start application - + Uruchom aplikację Click this button to start an application on all computers. @@ -1727,7 +1735,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Start apps and open websites in user sessions - + Uruchamiaj aplikacje i otwieraj strony internetowe w sesjach użytkownika @@ -1800,10 +1808,134 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + Podaj polecenie, dla którego chcesz wyświetlić pomoc. + + + Displays a list with the names of all available features. + Wyświetla listę z nazwami wszystkich dostępnych funkcji. + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Wyświetla tabelę ze szczegółowymi informacjami o wszystkich dostępnych funkcjach. Informacje te obejmują opis, identyfikator UID, nazwę wtyczki zapewniającej odpowiednią funkcję oraz kilka innych szczegółów związanych z implementacją. + + + HOST ADDRESS + ADRES HOSTA + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + Zablokuj ekran + + + Display a text message + Wyświetl wiadomość tekstową + + + Test message + Wiadomość testowa + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + Odblokuj ekran + + + The specified command does not exist or no help is available for it. + + + + Name + Nazwa + + + Description + Opis + + + Master + Master + + + Service + Usługa + + + Worker + + - Feature control - Zarządzanie funkcjami + UID + Identyfikator użytkownika + + + Plugin + Dodatki + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -2033,7 +2165,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc CA certificate file - + Plik certyfikatu CA ... @@ -2041,11 +2173,11 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Host certificate file - + Plik certyfikatu hosta Host private key file - + Plik klucza prywatnego hosta @@ -2616,7 +2748,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Filter for computer containers - + Filtruj według grup komputerów Computer containers or OUs @@ -2781,15 +2913,15 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Directory name - + Nazwa katalogu Query options - + Opcje zapytań Query nested user groups (supported by AD only) - + Zapytanie o zagnieżdżone grupy użytkowników (obsługiwane tylko przez AD) @@ -2878,7 +3010,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc User sessions - + Sesja użytkownia Minimum session lifetime before server start @@ -2890,7 +3022,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Login key sequence - + Sekwencja klawiszy logowania @@ -3132,6 +3264,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Locations & computers Sale i komputery + + Only show computers with logged on users + + MasterConfigurationPage @@ -3322,6 +3458,18 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc This mode allows you to monitor all computers at one or more locations. Ten tryb umożliwia monitorowanie wszystkich komputerów w co najmniej jednej lokalizacji. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3387,7 +3535,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc - PluginsCommands + PluginCommands List names of all installed plugins Wyświetl nazwy wszystkich zainstalowanych wtyczek @@ -3668,7 +3816,15 @@ Zapisz swoją pracę i zamknij wszystkie programy. Connecting... - + Łączenie... + + + Select screen + Wybierz ekran + + + All screens + Wszystkie ekrany @@ -3868,7 +4024,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Network port numbers - + Numery portów sieciowych Veyon server @@ -3931,19 +4087,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. - ServiceControlPlugin - - Service is running - Usługa jest uruchomiona - - - Service is not running - Usługa nie jest uruchomiona - - - Configure and control Veyon service - Konfiguruj i zarządzaj usługą Veyon - + ServiceControlCommands Register Veyon Service Rejestracja usługi Veyon @@ -3968,13 +4112,25 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Query status of Veyon Service Status kolejki usługi Veyon + + Service is running + Usługa jest uruchomiona + + + Service is not running + Usługa nie jest uruchomiona + + + Configure and control Veyon service + Konfiguruj i zarządzaj usługą Veyon + Commands for configuring and controlling Veyon Service Komendy do konfiguracji i zarządzania usługą Veyon - ShellCommandLinePlugin + ShellCommands Run command file Uruchom plik komend @@ -3984,8 +4140,8 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Plik "%1" nie istnieje! - Interactive shell and script execution for Veyon Control - Interaktywne wykonywanie powłok i skryptów dla Veyon Control + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4031,7 +4187,7 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Please select at least one computer to add. - + Wybierz co najmniej jeden komputer do dodania. Add computers by clicking with the middle mouse button or clicking the first button below. @@ -4043,7 +4199,7 @@ The second button removes the selected or last computer. StartAppDialog Start application - + Uruchom aplikację Please enter the applications to start on the selected computers. You can separate multiple applications by line. @@ -4222,7 +4378,7 @@ The second button removes the selected or last computer. Do you really want to log off <b>ALL</b> users? - + Czy na pewno chcesz wylogować WSZYSTKICH użytkowników? @@ -4295,6 +4451,10 @@ The second button removes the selected or last computer. Authentication test Test uwierzytelnienia + + Screen %1 + + VeyonServiceControl @@ -4375,6 +4535,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Wtyczka dodająca specyficzne funkcje dla platformy Windows + + Internal display + + WindowsServiceControl @@ -4382,30 +4546,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. Usługa „%1” jest już zainstalowana. - - The service "%1" could not be installed. - Nie można zainstalować usługi „%1”. - The service "%1" has been installed successfully. Usługa „%1” została pomyślnie zainstalowana. - - The service "%1" could not be uninstalled. - Nie można odinstalować usługi „%1”. - The service "%1" has been uninstalled successfully. Usługa „%1” została pomyślnie odinstalowana. - - The start type of service "%1" could not be changed. - Nie można zmienić typu usługi „%1”. - Service "%1" could not be found. Nie można znaleźć usługi „%1”. + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_pt_BR.ts b/translations/veyon_pt_BR.ts index 8b59fc85f..64ab1a46f 100644 --- a/translations/veyon_pt_BR.ts +++ b/translations/veyon_pt_BR.ts @@ -675,20 +675,16 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + Este comando exporta a chave de autenticação de <KEY> para <FILE>. Se <FILE> não estiver especificado um nome será construído do nome e tipo de <KEY>. This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + Este comando importa a chave de autenticação de<KEY> de <FILE>. Se <FILE> não tiver um nome especificado será atribuído o nome e tipo de <KEY>. This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Este comando lista todas as chaves de autenticação disponíveis no diretório de chaves configurado. Se a opção "%1" for especificada, uma tabela com detalhes da chave será exibida. Alguns detalhes podem estar faltando se uma chave não estiver acessível. devido à falta de permissões de leitura. - - Please specify the command to display help for! - Especifique o comando para o qual exibir ajuda! - TYPE Tipo @@ -727,7 +723,15 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please specify the key name (e.g. "teacher/public") as the first argument. - + Por favor, especifique o nome da chave (ex. "Professor/público") como primeiro argumento. + + + Please specify the command to display help for. + Por favor, especifique o comando para o qual quer exibir ajuda. + + + The specified command does not exist or no help is available for it. + O comando especificado não existe ou não possui ajuda disponível. @@ -1193,6 +1197,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç MAC ADDRESS Endereço MAC + + The specified command does not exist or no help is available for it. + O comando especificado não existe ou não possui ajuda disponível. + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç invalid + + [none] + + ComputerControlServer @@ -1612,10 +1624,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç All screens Todas as telas - - Screen %1 [%2] - Tela %1 [%2] - DesktopAccessDialog @@ -1800,10 +1808,134 @@ A chave pública é usada no computadores clientes para autenticar as requisiç - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + Por favor, especifique o comando para o qual quer exibir ajuda. + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + Endereço host + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + O comando especificado não existe ou não possui ajuda disponível. + + + Name + Nome + + + Description + + + + Master + Mestre + + + Service + Serviço + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + - Feature control - Controle de funcionalidades + Commands for controlling features + @@ -3123,6 +3255,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Locations & computers Locais e computadores + + Only show computers with logged on users + + MasterConfigurationPage @@ -3313,6 +3449,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3378,7 +3526,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç - PluginsCommands + PluginCommands List names of all installed plugins @@ -3659,6 +3807,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + Todas as telas + ScreenLockFeaturePlugin @@ -3919,19 +4075,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Serviço em execução - - - Service is not running - Serviço não está em execução - - - Configure and control Veyon service - Configurar e controlar serviço Veyon - + ServiceControlCommands Register Veyon Service Registrar serviço Veyon @@ -3956,13 +4100,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service Estado de query do Serviço Veyon + + Service is running + Serviço em execução + + + Service is not running + Serviço não está em execução + + + Configure and control Veyon service + Configurar e controlar serviço Veyon + Commands for configuring and controlling Veyon Service Comandos para configurar e controlar o Serviço Veyon - ShellCommandLinePlugin + ShellCommands Run command file @@ -3972,7 +4128,7 @@ Typically this is required to support terminal servers. O arquivo "%1" não existe! - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4283,6 +4439,10 @@ The second button removes the selected or last computer. Authentication test Teste de autenticação + + Screen %1 + + VeyonServiceControl @@ -4363,6 +4523,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Plugin implementando funções abstratas para a plataforma WIndows + + Internal display + + WindowsServiceControl @@ -4371,28 +4535,32 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. - The service "%1" could not be uninstalled. + Service "%1" could not be found. + Serviço "%1" não foi encontrado. + + + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. - Serviço "%1" não foi encontrado. + The start type of service "%1" could not be changed (error %2). + diff --git a/translations/veyon_pt_PT.ts b/translations/veyon_pt_PT.ts index ae6ecdec5..be478d9de 100644 --- a/translations/veyon_pt_PT.ts +++ b/translations/veyon_pt_PT.ts @@ -682,10 +682,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE @@ -726,6 +722,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1190,6 +1194,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1263,6 +1271,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1609,10 +1621,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1797,9 +1805,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + - Feature control + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -3115,6 +3247,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Only show computers with logged on users + + MasterConfigurationPage @@ -3305,6 +3441,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3370,7 +3518,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3651,6 +3799,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3911,41 +4067,41 @@ Typically this is required to support terminal servers. - ServiceControlPlugin + ServiceControlCommands - Service is running + Register Veyon Service - Service is not running + Unregister Veyon Service - Configure and control Veyon service + Start Veyon Service - Register Veyon Service + Stop Veyon Service - Unregister Veyon Service + Restart Veyon Service - Start Veyon Service + Query status of Veyon Service - Stop Veyon Service + Service is running - Restart Veyon Service + Service is not running - Query status of Veyon Service + Configure and control Veyon service @@ -3954,7 +4110,7 @@ Typically this is required to support terminal servers. - ShellCommandLinePlugin + ShellCommands Run command file @@ -3964,7 +4120,7 @@ Typically this is required to support terminal servers. - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4275,6 +4431,10 @@ The second button removes the selected or last computer. Authentication test + + Screen %1 + + VeyonServiceControl @@ -4355,6 +4515,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl @@ -4363,27 +4527,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. + + + + Service "%1" could not be found. - The service "%1" could not be uninstalled. + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_ru.ts b/translations/veyon_ru.ts index b5112df66..634eccc07 100644 --- a/translations/veyon_ru.ts +++ b/translations/veyon_ru.ts @@ -35,7 +35,7 @@ If you're interested in translating Veyon into your local or another language or want to improve an existing translation, please contact a Veyon developer! Перевод на данный язык ещё не осуществлён. -Если Вы желаете добавить перевод программы Veyon на новый язык или улучшить уже существующий, пожалуйста, свяжитесь с разработчиками Veyon! +Чтобы добавить перевод программы Veyon на новый язык или улучшить уже существующий, пожалуйста, свяжитесь с разработчиками Veyon! About %1 %2 @@ -66,7 +66,7 @@ If you're interested in translating Veyon into your local or another langua User groups authorized for computer access - Группы пользователей, разрешенные для доступа к компьютеру + Группы пользователей, которым разрешён доступ к компьютерам Please add the groups whose members should be authorized to access computers in your Veyon network. @@ -74,7 +74,7 @@ If you're interested in translating Veyon into your local or another langua Authorized user groups - Разрешенные группы пользователей + Разрешённые группы пользователей All groups @@ -114,7 +114,7 @@ If you're interested in translating Veyon into your local or another langua Access allowed - Доступ разрешен + Доступ разрешён The specified user is allowed to access computers with this configuration. @@ -217,35 +217,35 @@ If you're interested in translating Veyon into your local or another langua Accessing computer and local computer - + Доступ к компьютеру и локальный компьютер User being accessed - + Пользователь для доступа is logged in locally - + вошёл в систему локально is logged in remotely - + вошёл в систему удалённо No user is logged in locally - + Нет пользователей, вошедших в систему локально One or multiple users are logged in locally - + Один или несколько пользователей вошли в систему локально No user is logged in remotely - + Нет пользователей, вошедших в систему удалённо One or multiple users are logged in remotely - + Один или несколько пользователей вошли в систему удалённо is located at @@ -253,15 +253,15 @@ If you're interested in translating Veyon into your local or another langua is not located at - + не расположен в are located at the same location - + расположены в одном и том же месте are not located the same location - + не расположены в одном и том же месте is member of group @@ -269,59 +269,59 @@ If you're interested in translating Veyon into your local or another langua is not member of group - + не является членом группы is authenticated via - + аутентифицирован с помощью is not authenticated via - + не аутентифицирован с помощью has one or more groups in common with user being accessed - + входит в одну или несколько групп, членом которых является пользователь для доступа has no groups in common with user being accessed - + не входит ни в одну из групп, членом которых является пользователь для доступа equals user being accessed - + совпадает с пользователем для доступа is different from user being accessed - + отличается от пользователя для доступа is already connected - + уже подключён is not connected - + не подключён is local computer - + является локальным компьютером is not local computer - + не является локальным компьютером Computer being accessed - + Компьютер для доступа Session being accessed is a user session - + Сеанс для доступа является сеансом пользователя Session being accessed is a login screen - + Сеанс для доступа является экраном входа @@ -352,11 +352,11 @@ If you're interested in translating Veyon into your local or another langua Connected users: - Подключенные пользователи: + Подключённые пользователи: The access in the given scenario is allowed. - Доступ в данном сценарии разрешен. + Доступ в данном сценарии разрешён. The access in the given scenario is denied. @@ -465,7 +465,7 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to delete authentication key "%1/%2"? - Вы действительно хотите удалить ключ аутентификации «%1/%2»? + Действительно удалить ключ аутентификации "%1/%2"? Please select a key to delete! @@ -481,7 +481,7 @@ The public key is used on client computers to authenticate incoming connection r Please select a user group which to grant access to key "%1": - Выберите группу пользователей, которая предоставит доступ к ключу «%1»: + Выберите группу пользователей, которая предоставит доступ к ключу "%1": Please select a key which to set the access group for! @@ -500,19 +500,19 @@ The public key is used on client computers to authenticate incoming connection r Invalid key type specified! Please specify "%1" or "%2". - Указан недопустимый тип ключа! Укажите «%1» или «%2». + Указан недопустимый тип ключа! Укажите "%1" или "%2". Specified key does not exist! Please use the "list" command to list all installed keys. - Указанный ключ не существует! Пожалуйста, используйте команду «list», чтобы перечислить все установленные ключи. + Указанный ключ не существует! Пожалуйста, используйте команду "list", чтобы перечислить все установленные ключи. One or more key files already exist! Please delete them using the "delete" command. - Один или несколько ключевых файлов уже существуют! Удалите их, используя команду «удалить». + Один или несколько ключевых файлов уже существуют! Удалите их, используя команду "удалить". Creating new key pair for "%1" - Создание новой ключевой пары для «%1» + Создание новой ключевой пары для "%1" Failed to create public or private key! @@ -572,7 +572,7 @@ The public key is used on client computers to authenticate incoming connection r Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - Ключ "%1/%2» был успешно импортирован. Пожалуйста, проверьте права доступа к файлу "%3», чтобы предотвратить неуполномоченный доступ. + Ключ "%1/%2" был успешно импортирован. Пожалуйста, проверьте права доступа к файлу "%3", чтобы предотвратить неуполномоченный доступ. Failed to convert private key to public key @@ -683,11 +683,7 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - Эта команда выводит список всех ключей аутентификации в настроенном каталоге ключей. Если выбрана опция "%1", то вместо списка будет выведена таблица с подробностями про ключи. Некоторые параметры ключа могут быть не показаны, если доступ к ключу ограничен, например из-за нехватки прав на чтение файла ключа. - - - Please specify the command to display help for! - Пожалуйста, укажите команду, для которой следует показать справку! + Эта команда выводит список всех ключей аутентификации в настроенном каталоге ключей. Если выбрана опция "%1", то вместо списка будет выведена таблица с подробностями про ключи. Некоторые параметры ключа могут быть не показаны, если доступ к ключу ограничен, например, из-за нехватки прав на чтение файла ключа. TYPE @@ -727,7 +723,15 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. - + Укажите имя ключа (например, "teacher/public") в качестве первого аргумента. + + + Please specify the command to display help for. + Укажите команду, для которой следует показать справку. + + + The specified command does not exist or no help is available for it. + Указанная команда не существует, или для неё недоступна справка. @@ -761,7 +765,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - например %username%@DOMAIN или cn=%username%,ou=users,dc=example,dc=org + например, %username%@DOMAIN или cn=%username%,ou=users,dc=example,dc=org @@ -799,7 +803,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your username and password in order to access computers. - Пожалуйста, введите имя пользователя и пароль для доступа компьютеров. + Пожалуйста, введите имя пользователя и пароль для доступа к компьютерам. Username @@ -944,11 +948,11 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + Имя каталога Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + Файлы CSV можно импортировать с помощью интерфейса командной строки. Для получения дополнительных сведений ознакомьтесь с <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">документацией в Интернете</a>. @@ -1193,6 +1197,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS MAC-АДРЕСА + + The specified command does not exist or no help is available for it. + Указанная команда не существует, или для неё недоступна справка. + BuiltinUltraVncServer @@ -1220,7 +1228,7 @@ The public key is used on client computers to authenticate incoming connection r Online and connected - Онлайн и подключен + Онлайн и подключён Establishing connection @@ -1260,11 +1268,15 @@ The public key is used on client computers to authenticate incoming connection r Name: %1 - + Имя: %1 invalid - + некорректно + + + [none] + [нет] @@ -1515,7 +1527,7 @@ The public key is used on client computers to authenticate incoming connection r ms - мс + мс Key frame interval @@ -1527,7 +1539,7 @@ The public key is used on client computers to authenticate incoming connection r MB - МБ + МБ Update interval @@ -1535,7 +1547,7 @@ The public key is used on client computers to authenticate incoming connection r s - с + с Slow down thumbnail updates while demo is running @@ -1602,7 +1614,7 @@ The public key is used on client computers to authenticate incoming connection r Please select a user screen to share. - Выберите экран пользователя, который вы хотите демонстрировать. + Выберите экран пользователя, который следует демонстрировать. Please select only one user screen to share. @@ -1612,10 +1624,6 @@ The public key is used on client computers to authenticate incoming connection r All screens Все экраны - - Screen %1 [%2] - Экран %1 [%2] - DesktopAccessDialog @@ -1637,7 +1645,7 @@ The public key is used on client computers to authenticate incoming connection r The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - Пользователь %1 компьютера %2 пытается подключиться к Вашему рабочему столу. Разрешить ему доступ к Вашему рабочему столу? + Пользователь %1 компьютера %2 пытается подключиться к вашему рабочему столу. Разрешить ему доступ к вашему рабочему столу? @@ -1668,27 +1676,27 @@ The public key is used on client computers to authenticate incoming connection r Applications & websites - + Приложения и веб-сайты Predefined applications - + Предопределённые приложения Add new application - + Добавить новое приложение Remove selected application - + Удалить выбранное приложение Add new website - + Добавить новый веб-сайт New application - + Новое приложение @@ -1707,27 +1715,27 @@ The public key is used on client computers to authenticate incoming connection r Custom website - Необычный сайт + Другой веб-сайт Start application - + Запустить приложение Click this button to start an application on all computers. - + Нажмите эту кнопку, чтобы запустить приложение на всех компьютерах. Start application "%1" - + Запустить приложение "%1" Custom application - + Другое приложение Start apps and open websites in user sessions - + Запустить программы и открыть веб-сайты в сеансах пользователей @@ -1746,7 +1754,7 @@ The public key is used on client computers to authenticate incoming connection r Custom website - Необычный сайт + Другой веб-сайт Open file manager @@ -1774,7 +1782,7 @@ The public key is used on client computers to authenticate incoming connection r Custom application - + Другое приложение @@ -1800,10 +1808,134 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + Показать названия всех доступных функций + + + Show table with details of all available features + Показать таблицу с описанием всех доступных функций + + + Start a feature on a remote host + Запустить функцию на удалённом хосте + + + Stop a feature on a remote host + Остановить функцию на удалённом хосте + + + Please specify the command to display help for. + Укажите команду, для которой следует показать справку. + + + Displays a list with the names of all available features. + Показывает список с именами всех доступных функций. + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Показывает таблицу с подробной информацией обо всех доступных функциях. Эта информация включает описание, UID, имя плагина, предоставляющего соответствующую функцию, и некоторые другие сведения, которые относятся к реализации. + + + HOST ADDRESS + АДРЕСА ХОСТА + + + FEATURE + ФУНКЦИЯ + + + ARGUMENTS + АРГУМЕНТЫ + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + Запускает указанную функцию на указанном хосте путём соединения с запущенным удалённо сервером Veyon. Функцию можно указать по имени или UID. Воспользуйтесь командой "show" для просмотра списка всех доступных функций. В зависимости от функции, могут указываться дополнительные аргументы (например, текстовое сообщение для показа), которые должны быть закодированы в одну строку JSON. Чтобы узнать больше, обратитесь к документации для разработчиков. + + + Lock the screen + Заблокировать экран + + + Display a text message + Показать текстовое сообщение + + + Test message + Проверочное сообщение + + + Start an application + Запустить приложение + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + Останавливает указанную функцию на указанном хосте путём соединения с запущенным удалённо сервером Veyon. Функцию можно указать по имени или UID. Воспользуйтесь командой "show" для просмотра списка всех доступных функций. + + + Unlock the screen + Разблокировать экран + + + The specified command does not exist or no help is available for it. + Указанная команда не существует, или для неё недоступна справка. + + + Name + Имя + + + Description + Описание + + + Master + Мастер + + + Service + Сервис + + + Worker + Рабочая станция + + + UID + UID + + + Plugin + Плагин + + + Invalid feature name or UID specified + Указано некорректное имя или UID функции + - Feature control - Управление функциями + Error parsing the JSON-encoded arguments: %1 + Ошибка при обработке аргументов в кодировке JSON: %1 + + + Failed to initialize credentials + Не удалось инициализировать регистрационные данные + + + Could not establish a connection to host %1 + Не удалось установить подключение к хосту %1 + + + Failed to send feature control message to host %1 + Не удалось отправить сообщение управления функциями хосту %1 + + + Feature-related CLI operations + Связанные с функцией операции CLI + + + Commands for controlling features + Команды для управления функциями @@ -2009,7 +2141,7 @@ The public key is used on client computers to authenticate incoming connection r MB - МБ + МБ Rotate log files @@ -2025,15 +2157,15 @@ The public key is used on client computers to authenticate incoming connection r TLS configuration - + Конфигурация TLS Use certificate authority for TLS connections - + Использовать центр сертификации для подключений TLS CA certificate file - + Файл сертификата центра сертификации ... @@ -2041,11 +2173,11 @@ The public key is used on client computers to authenticate incoming connection r Host certificate file - + Файл сертификата хоста Host private key file - + Файл закрытого ключа хоста @@ -2395,7 +2527,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP directory - + Каталог LDAP @@ -2578,11 +2710,11 @@ The public key is used on client computers to authenticate incoming connection r Please enter the DN of a computer whose MAC address to query: - Пожалуйста, укажите DN компьютера, запрос по MAC-адресу которого следует прислать: + Пожалуйста, укажите DN компьютера, чей MAC-адрес необходимо получить: Please enter a user login name whose group memberships to query: - Пожалуйста, укажите имя записи пользователя, для кого следует получить данные об участии в группах: + Пожалуйста, укажите имя пользователя, для которого следует получить данные об участии в группах: Enter computer IP address @@ -2590,7 +2722,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter a computer IP address which to resolve to an computer object: - Пожалуйста, укажите IP-адрес компьютера, с которой следует определить объект компьютера: + Пожалуйста, укажите IP-адрес компьютера, для которого необходимо получить объект компьютера. (only if different from group tree) @@ -2702,7 +2834,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. cn or displayName - например cn или displayName + например, cn или displayName Computer locations identification @@ -2710,7 +2842,7 @@ The public key is used on client computers to authenticate incoming connection r Identify computer locations (e.g. rooms) via: - Идентифицировать места компьютеров (например классы) на основе: + Идентифицировать места компьютеров (например, классы) на основе: Location attribute in computer objects @@ -2758,7 +2890,7 @@ The public key is used on client computers to authenticate incoming connection r Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - Имена хостов сохранены как полные доменные имена (FQDN, например myhost.example.org) + Имена хостов сохранены как полные доменные имена (FQDN, например, myhost.example.org) Computer hostname attribute @@ -2774,7 +2906,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter a computer hostname whose group memberships to query: - Пожалуйста, укажите имя хоста компьютера, для кого следует получить данные об участии в группах: + Пожалуйста, укажите имя компьютера, для которого следует получить данные об участии в группах: User login name attribute @@ -2786,15 +2918,15 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + Имя каталога Query options - + Параметры запроса Query nested user groups (supported by AD only) - + Опросить вложенные группы пользователей (поддерживается только AD) @@ -2805,7 +2937,7 @@ The public key is used on client computers to authenticate incoming connection r Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + Воспользуйтесь общей страницей настройки LDAP для настройки способа получения данных о расположениях и компьютерах от службы каталогов на основе LDAP. @@ -2883,11 +3015,11 @@ The public key is used on client computers to authenticate incoming connection r User sessions - + Сеансы пользователей Minimum session lifetime before server start - + Минимальная продолжительность сеанса перед запуском сервера User login @@ -2895,7 +3027,7 @@ The public key is used on client computers to authenticate incoming connection r Login key sequence - + Последовательность ключей для входа @@ -2967,7 +3099,7 @@ The public key is used on client computers to authenticate incoming connection r L&oad settings from file - Загрузить настройки из файла + &Загрузить настройки из файла Ctrl+O @@ -3043,11 +3175,11 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - Согласно локальных настроек вам запрещён доступ к компьютерам в сети. Пожалуйста, войдите из-под другой учётной записи или попросите администратора вашей системы изменить локальные настройки соответствующим образом. + Согласно локальным настройкам вам запрещён доступ к компьютерам в сети. Пожалуйста, войдите с другой учётной записью или попросите администратора вашей системы изменить локальные настройки соответствующим образом. Screenshots - Скриншоты + Снимки экрана Feature active @@ -3063,7 +3195,7 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reset the local configuration and revert all settings to their defaults? - Вы действительно хотите сбросить локальную конфигурацию и вернуть все настройки по умолчанию? + Действительно сбросить локальную конфигурацию и вернуть все настройки по умолчанию? Search users and computers @@ -3107,7 +3239,7 @@ The public key is used on client computers to authenticate incoming connection r Use custom computer arrangement - Использовать необычное расположение компьютеров + Использовать нестандартное расположение компьютеров Locations && computers @@ -3137,6 +3269,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Места и компьютеры + + Only show computers with logged on users + Показывать только те компьютеры, где пользователи выполнили вход в систему + MasterConfigurationPage @@ -3162,11 +3298,11 @@ The public key is used on client computers to authenticate incoming connection r Disabled features - Отключенные функции + Отключённые функции Screenshots - Скриншоты + Снимки экрана <no feature> @@ -3290,7 +3426,7 @@ The public key is used on client computers to authenticate incoming connection r px - пикселей + пкс Hide local session @@ -3327,12 +3463,24 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. В этом режиме вы можете наблюдать за всеми компьютерами в одном или нескольких местах. + + Query application version of the server + Запросить версию серверного приложения + + + Query active features + Запросить активные функции + + + Query properties of remotely available screens + Запросить свойства удаленно доступных экранов + NestedNetworkObjectDirectory All directories - + Все каталоги @@ -3343,7 +3491,7 @@ The public key is used on client computers to authenticate incoming connection r seconds - секунд + сек. @@ -3368,7 +3516,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - например Veyon + например, Veyon Remember and add to website menu @@ -3376,7 +3524,7 @@ The public key is used on client computers to authenticate incoming connection r e.g. www.veyon.io - например www.veyon.io + например, www.veyon.io Please enter the URL of the website to open: @@ -3388,18 +3536,18 @@ The public key is used on client computers to authenticate incoming connection r Website name - + Имя веб-сайта - PluginsCommands + PluginCommands List names of all installed plugins - Список имен всех установленных плагинов + Список имён всех установленных плагинов Show table with details of all installed plugins - Показать таблицу с деталями всех установленных плагинов + Показать таблицу с описанием всех установленных плагинов Name @@ -3434,7 +3582,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - Нажмите эту кнопку для включения всех компьютеров. Это позволит вам не включать каждый компьютер вручную. + Нажмите эту кнопку для включения всех компьютеров. Это позволит не включать каждый компьютер вручную. Reboot @@ -3450,7 +3598,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - Нажмите эту кнопку для выключения всех компьютеров. Это позволит вам не выключать каждый компьютер вручную. + Нажмите эту кнопку для выключения всех компьютеров. Это позволит не выключать каждый компьютер вручную. Power on/down or reboot a computer @@ -3466,7 +3614,7 @@ The public key is used on client computers to authenticate incoming connection r Do you really want to reboot the selected computers? - Вы действительно хотите перезагрузить выбранные компьютеры? + Действительно перезагрузить выбранные компьютеры? Power on a computer via Wake-on-LAN (WOL) @@ -3510,27 +3658,27 @@ The public key is used on client computers to authenticate incoming connection r The computer was remotely requested to power down. Do you want to power down the computer now? - Компьютер получил удалённую команду по выключению. Хотите выключить компьютер сейчас? + Компьютер получил удалённую команду по выключению. Выключить компьютер сейчас? The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - Компьютер выключится через %1 минут, %2 секунд. + Компьютер выключится через %1 мин., %2 сек. -Пожалуйста, сохраните результаты вашей работы и завершите работу всех программ. +Пожалуйста, сохраните результаты работы и завершите работу всех программ. Do you really want to reboot <b>ALL</b> computers? - + Действительно перезагрузить <b>ВСЕ</b> компьютеры? Do you really want to power down <b>ALL</b> computers? - + Действительно выключить <b>ВСЕ</b> компьютеры? Do you really want to power down the selected computers? - + Действительно выключить выбранные компьютеры? @@ -3545,11 +3693,11 @@ Please save your work and close all programs. minutes - минут + мин. seconds - секунд + сек. @@ -3661,11 +3809,11 @@ Please save your work and close all programs. Connected. - Подключен. + Подключён. Screenshot - Скриншот + Снимок экрана Exit @@ -3673,7 +3821,15 @@ Please save your work and close all programs. Connecting... - + Подключение... + + + Select screen + Выбрать экран + + + All screens + Все экраны @@ -3719,7 +3875,7 @@ Please save your work and close all programs. Screenshot - Скриншот + Снимок экрана Could not open screenshot file %1 for writing. @@ -3730,7 +3886,7 @@ Please save your work and close all programs. ScreenshotFeaturePlugin Screenshot - Скриншот + Снимок экрана Use this function to take a screenshot of selected computers. @@ -3753,7 +3909,7 @@ Please save your work and close all programs. ScreenshotManagementPage Screenshots - Скриншоты + Снимки экрана @@ -3788,11 +3944,11 @@ Please save your work and close all programs. Screenshot - Скриншот + Снимок экрана Do you really want to delete all selected screenshots? - Вы действительно хотите удалить выбранные скриншоты? + Действительно удалить выбранные снимки экрана? @@ -3897,19 +4053,19 @@ Typically this is required to support terminal servers. Session mode - + Режим сеанса Local session mode (single server instance for primary local session) - + Режим локального сеанса (один экземпляр сервера для основного локального сеанса) Active session mode (single server instance for active local or remote session) - + Режим активного сеанса (один экземпляр сервера для активного локального или удалённого сеанса) Multi session mode (distinct server instance for each local and remote desktop session) - + Режим мультисеанса (отдельный экземпляр сервера для каждого сеанса локального и удалённого рабочего стола) @@ -3936,19 +4092,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Сервис работает - - - Service is not running - Сервис не работает - - - Configure and control Veyon service - Настройка и управление сервисом Veyon - + ServiceControlCommands Register Veyon Service Регистрация сервиса Veyon @@ -3973,13 +4117,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service Определить состояние сервиса Veyon + + Service is running + Сервис работает + + + Service is not running + Сервис не работает + + + Configure and control Veyon service + Настройка и управление сервисом Veyon + Commands for configuring and controlling Veyon Service Команды для настройки и управления сервисом Veyon - ShellCommandLinePlugin + ShellCommands Run command file Запустить командный файл @@ -3989,8 +4145,8 @@ Typically this is required to support terminal servers. Файла "%1" не существует! - Interactive shell and script execution for Veyon Control - Интерактивная оболочка и средство выполнения скриптов для Управления Veyon + Interactive shell and script execution for Veyon CLI + Интерактивная оболочка и способ выполнения сценариев для CLI Veyon Commands for shell functionalities @@ -4041,18 +4197,19 @@ Typically this is required to support terminal servers. Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + Нажимайте среднюю кнопку мыши или первую расположенную ниже кнопку, чтобы добавить компьютеры. +Вторая кнопка удаляет выбранный или последний компьютер. StartAppDialog Start application - + Запустить приложение Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + Укажите приложения для запуска на выбранных компьютерах. Чтобы перечислить несколько приложений, укажите каждое в отдельной строке. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" @@ -4060,11 +4217,11 @@ The second button removes the selected or last computer. Remember and add to application menu - + Запомнить и добавить в меню приложений Application name - + Имя приложения Name: @@ -4072,7 +4229,7 @@ The second button removes the selected or last computer. e.g. VLC - например VLC + например, VLC @@ -4108,11 +4265,11 @@ The second button removes the selected or last computer. TextMessageDialog Send text message - Послать текстовое сообщение + Отправить текстовое сообщение Please enter your message which send to all selected users. - + Введите сообщение, которое будет отправлено всем выбранным пользователям. @@ -4123,7 +4280,7 @@ The second button removes the selected or last computer. Use this function to send a text message to all users e.g. to assign them new tasks. - Используйте эту функцию для посылки текстового сообщения всем пользователям, например, сказав им о новых задачах и т. д. + Используйте эту функцию для отправки текстового сообщения всем пользователям (например, чтобы сообщить им о новых задачах). Message from teacher @@ -4131,7 +4288,7 @@ The second button removes the selected or last computer. Send a message to a user - Послать сообщение пользователю + Отправить сообщение пользователю @@ -4142,7 +4299,7 @@ The second button removes the selected or last computer. Poll full screen (leave this enabled per default) - Опрос полного экрана (оставьте включенным по умолчанию) + Опрос полного экрана (оставьте включённым по умолчанию) Low accuracy (turbo mode) @@ -4219,7 +4376,7 @@ The second button removes the selected or last computer. Do you really want to log off the selected users? - Вы действительно хотите выполнить выход из системы для выбранных пользователей? + Действительно выполнить выход из системы для выбранных пользователей? User session control @@ -4227,7 +4384,7 @@ The second button removes the selected or last computer. Do you really want to log off <b>ALL</b> users? - + Действительно выполнить выход из системы для <b>ВСЕХ</b> пользователей? @@ -4254,7 +4411,7 @@ The second button removes the selected or last computer. Not enough arguments given - use "%1 help" for more information - Дано недостаточно аргументов - используйте "справку %1" для большей информации + Недостаточно аргументов - используйте "%1 help" для получения дополнительной информации Unknown result! @@ -4300,6 +4457,10 @@ The second button removes the selected or last computer. Authentication test Тест аутентификации + + Screen %1 + Экран %1 + VeyonServiceControl @@ -4380,36 +4541,44 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Плагин, который реализует абстрактные функции на платформе Windows + + Internal display + Внутренний дисплей + WindowsServiceControl The service "%1" is already installed. - Служба «%1» уже установлена. + Служба "%1" уже установлена. - The service "%1" could not be installed. - Не удалось установить службу «%1». + The service "%1" has been installed successfully. + Служба "%1" была успешно установлена. - The service "%1" has been installed successfully. - Служба «%1» была успешно установлена. + The service "%1" has been uninstalled successfully. + Служба "%1" была успешно деинсталлирована. + + + Service "%1" could not be found. + Не удалось найти службу "%1". - The service "%1" could not be uninstalled. - Не удалось деинсталлировать службу «%1». + The service "%1" could not be installed (error %2). + Не удалось установить службу "%1" (ошибка %2). - The service "%1" has been uninstalled successfully. - Служба «%1» была успешно деинсталирована. + Could not change the failure actions config for service "%1" (error %2). + Не удалось изменить конфигурацию действий при отказе для службы "%1" (ошибка %2). - The start type of service "%1" could not be changed. - Не удалось изменить тип запуска службы «%1». + The service "%1" could not be uninstalled (error %2). + Не удалось деинсталлировать службу "%1" (ошибка %2). - Service "%1" could not be found. - Не удалось найти службу «%1». + The start type of service "%1" could not be changed (error %2). + Не удалось изменить тип запуска службы "%1" (ошибка %2). diff --git a/translations/veyon_sl.ts b/translations/veyon_sl.ts index abfa621eb..97236cd42 100644 --- a/translations/veyon_sl.ts +++ b/translations/veyon_sl.ts @@ -685,10 +685,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Ta ukaz navaja vse razpoložljive ključe za overjanje v nastavljenem imeniku ključev. Če je možnost "%1" določena, bo prikazana tabela s podatki ključa namesto tega. Nekateri podatki morda manjkajo, če ključ ni dostopen, npr. zaradi pomanjkanja dovoljenj za branje. - - Please specify the command to display help for! - Navedite ukaz za prikaz pomoči! - TYPE VRSTA @@ -729,6 +725,14 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1193,6 +1197,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti MAC ADDRESS MAC naslov + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti invalid + + [none] + + ComputerControlServer @@ -1612,10 +1624,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1800,10 +1808,134 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti - FeatureControl + FeatureCommands - Feature control - Funkcija nadzora + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + NASLOV GOSTITELJA + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Ime + + + Description + + + + Master + Glavni + + + Service + Storitev + + + Worker + + + + UID + + + + Plugin + Vtičnik + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -3137,6 +3269,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Locations & computers Lokacije in računalniki + + Only show computers with logged on users + + MasterConfigurationPage @@ -3327,6 +3463,18 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti This mode allows you to monitor all computers at one or more locations. Ta način omogoča nadzor vseh računalnikov na eni ali več lokacijah. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3392,7 +3540,7 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti - PluginsCommands + PluginCommands List names of all installed plugins @@ -3673,6 +3821,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3934,19 +4090,7 @@ Običajno je to potrebno za podporo terminalskih strežnikov. - ServiceControlPlugin - - Service is running - Storitev teče - - - Service is not running - Storitev ne teče - - - Configure and control Veyon service - Konfigurirajte in nadzirajte Veyon storitev - + ServiceControlCommands Register Veyon Service Registriraj Veyon storitev @@ -3971,13 +4115,25 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Query status of Veyon Service Stanje poizvedbe storitve Veyon + + Service is running + Storitev teče + + + Service is not running + Storitev ne teče + + + Configure and control Veyon service + Konfigurirajte in nadzirajte Veyon storitev + Commands for configuring and controlling Veyon Service Ukazi za konfiguracijo in nadzor Veyon storitve - ShellCommandLinePlugin + ShellCommands Run command file Zaženi ukazno datoteko @@ -3987,8 +4143,8 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Datoteka "%1" ne obstaja! - Interactive shell and script execution for Veyon Control - Interaktivna lupina in izvedba skripte za nadzor Veyon + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4298,6 +4454,10 @@ The second button removes the selected or last computer. Authentication test Preverjanje pristnosti + + Screen %1 + + VeyonServiceControl @@ -4378,6 +4538,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Vtičnik izvajanja abstraktnih funkcij za platformo Windows + + Internal display + + WindowsServiceControl @@ -4386,27 +4550,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. - The service "%1" could not be uninstalled. + Service "%1" could not be found. - The service "%1" has been uninstalled successfully. + The service "%1" could not be installed (error %2). - The start type of service "%1" could not be changed. + Could not change the failure actions config for service "%1" (error %2). - Service "%1" could not be found. + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_sr.ts b/translations/veyon_sr.ts index a675c7045..bbb2c284b 100644 --- a/translations/veyon_sr.ts +++ b/translations/veyon_sr.ts @@ -685,10 +685,6 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Ova naredba navodi sve dostupne ključeve za proveru autentičnosti u konfiguracionom direktorijumu ključeva. Ako je navedena opcija "%1",specifična tablica s ključnim detaljima biće prikazana umesto opcija. Neki detalji možda nedostaju ako ključ nije dostupan, npr. zbog nedostatka dozvola za čitanje. - - Please specify the command to display help for! - Molimo navedite naredbu za prikaz pomoći! - TYPE TIP @@ -729,6 +725,14 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1195,6 +1199,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u MAC ADDRESS MAC ADRESA + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1268,6 +1276,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u invalid + + [none] + + ComputerControlServer @@ -1614,10 +1626,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1802,10 +1810,134 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + DOMAĆIN ADRESA + + + FEATURE + + - Feature control - Kontrola funkcija + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Ime + + + Description + + + + Master + Glavni + + + Service + Servis + + + Worker + + + + UID + + + + Plugin + Dodatak + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -3139,6 +3271,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Locations & computers Lokacije & računari + + Only show computers with logged on users + + MasterConfigurationPage @@ -3329,6 +3465,18 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u This mode allows you to monitor all computers at one or more locations. Ovaj način rada omogućuje vam praćenje svih računara na jednoj ili više lokacija. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3394,7 +3542,7 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u - PluginsCommands + PluginCommands List names of all installed plugins @@ -3677,6 +3825,14 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3938,19 +4094,7 @@ Obično je ovo zahtevano kao podrška trminal serverima. - ServiceControlPlugin - - Service is running - Servis se izvršava - - - Service is not running - Servis se ne izvršava - - - Configure and control Veyon service - Konfiguracija i kontrola Veyon servisa - + ServiceControlCommands Register Veyon Service Registracija Veyon servisa @@ -3975,24 +4119,36 @@ Obično je ovo zahtevano kao podrška trminal serverima. Query status of Veyon Service Status ispitivanja Veyon servisa + + Service is running + Servis se izvršava + + + Service is not running + Servis se ne izvršava + + + Configure and control Veyon service + Konfiguracija i kontrola Veyon servisa + Commands for configuring and controlling Veyon Service Komande za konfiguraciju i kontrolu Veyon servisa - ShellCommandLinePlugin + ShellCommands Run command file Pokreni komandnu datoteku File "%1" does not exist! - Fajl "%1" nije pronadjen! + Datoteka "%1" nije pronadjena! - Interactive shell and script execution for Veyon Control - Interaktivno izvršavanje ljuske i skripte za Veyon Control + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4302,6 +4458,10 @@ The second button removes the selected or last computer. Authentication test Test provere autentičnosti + + Screen %1 + + VeyonServiceControl @@ -4382,6 +4542,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Plugin implementiranje apstraktnih funkcija za Windows platformu + + Internal display + + WindowsServiceControl @@ -4389,30 +4553,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. Servis "%1" je već instaliran. - - The service "%1" could not be installed. - Servis "%1" ne može biti instaliran. - The service "%1" has been installed successfully. Servis "%1" je instaliran uspešno. - - The service "%1" could not be uninstalled. - Servis "%1" ne može biti deinstalisan. - The service "%1" has been uninstalled successfully. Servis "%1" je deinstalisan uspešno. - - The start type of service "%1" could not be changed. - Tip startanja servisa "%1" ne može biti promenjen. - Service "%1" could not be found. Servis "%1" ne može biti pronađen. + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_sv.ts b/translations/veyon_sv.ts index 217696e8b..71f4f37e1 100644 --- a/translations/veyon_sv.ts +++ b/translations/veyon_sv.ts @@ -682,10 +682,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE @@ -726,6 +722,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1190,6 +1194,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1263,6 +1271,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1609,10 +1621,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1797,9 +1805,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + - Feature control + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -3115,6 +3247,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Only show computers with logged on users + + MasterConfigurationPage @@ -3305,6 +3441,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3370,7 +3518,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3651,6 +3799,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3911,41 +4067,41 @@ Typically this is required to support terminal servers. - ServiceControlPlugin + ServiceControlCommands - Service is running + Register Veyon Service - Service is not running + Unregister Veyon Service - Configure and control Veyon service + Start Veyon Service - Register Veyon Service + Stop Veyon Service - Unregister Veyon Service + Restart Veyon Service - Start Veyon Service + Query status of Veyon Service - Stop Veyon Service + Service is running - Restart Veyon Service + Service is not running - Query status of Veyon Service + Configure and control Veyon service @@ -3954,7 +4110,7 @@ Typically this is required to support terminal servers. - ShellCommandLinePlugin + ShellCommands Run command file @@ -3964,7 +4120,7 @@ Typically this is required to support terminal servers. - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4275,6 +4431,10 @@ The second button removes the selected or last computer. Authentication test + + Screen %1 + + VeyonServiceControl @@ -4355,6 +4515,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl @@ -4363,27 +4527,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. + + + + Service "%1" could not be found. - The service "%1" could not be uninstalled. + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_th.ts b/translations/veyon_th.ts index 37486516b..4136df4f6 100644 --- a/translations/veyon_th.ts +++ b/translations/veyon_th.ts @@ -683,10 +683,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE @@ -727,6 +723,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1191,6 +1195,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1264,6 +1272,10 @@ The public key is used on client computers to authenticate incoming connection r invalid + + [none] + + ComputerControlServer @@ -1346,11 +1358,11 @@ The public key is used on client computers to authenticate incoming connection r Select all - + เลือกทั้งหมด Unselect all - + ยกเลิกการเลือกทั้งหมด Add to group @@ -1608,11 +1620,7 @@ The public key is used on client computers to authenticate incoming connection r All screens - - - - Screen %1 [%2] - + หน้าจอทั้งหมด @@ -1686,7 +1694,7 @@ The public key is used on client computers to authenticate incoming connection r New application - + แอพพลิเคชั่นใหม่ @@ -1709,7 +1717,7 @@ The public key is used on client computers to authenticate incoming connection r Start application - + เริ่มแอพพลิเคชั่น Click this button to start an application on all computers. @@ -1798,9 +1806,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + ล็อกหน้าจอ + + + Display a text message + แสดงข้อความตัวอักษร + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + ปลดล็อกหน้าจอ + + + The specified command does not exist or no help is available for it. + + + + Name + ชื่อ + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + - Feature control + Feature-related CLI operations + + + + Commands for controlling features @@ -2274,7 +2406,7 @@ The public key is used on client computers to authenticate incoming connection r Computer not found - + ไม่พบคอมพิวเตอร์ Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. @@ -3116,6 +3248,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers สถานที่และคอมพิวเตอร์ + + Only show computers with logged on users + + MasterConfigurationPage @@ -3306,6 +3442,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. โหมดนี้จะให้คุณได้สังเกตการณ์คอมพิวเตอร์ทุกเครื่องจากสถานที่ใดสถานที่หนึ่งหรือมากกว่านั้น + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3367,11 +3515,11 @@ The public key is used on client computers to authenticate incoming connection r Website name - + ชื่อเว็บไซต์ - PluginsCommands + PluginCommands List names of all installed plugins @@ -3651,8 +3799,16 @@ Please save your work and close all programs. Connecting... + กำลังเชื่อมต่อ... + + + Select screen + + All screens + หน้าจอทั้งหมด + ScreenLockFeaturePlugin @@ -3913,19 +4069,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - เซอร์วิสกำลังทำงาน - - - Service is not running - เซอร์วิสไม่ได้ทำงาน - - - Configure and control Veyon service - ตั้งค่าและควบคุม Veyon Service - + ServiceControlCommands Register Veyon Service ลงทะเบียน Veyon Service @@ -3950,13 +4094,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service + + Service is running + เซอร์วิสกำลังทำงาน + + + Service is not running + เซอร์วิสไม่ได้ทำงาน + + + Configure and control Veyon service + ตั้งค่าและควบคุม Veyon Service + Commands for configuring and controlling Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file @@ -3966,7 +4122,7 @@ Typically this is required to support terminal servers. ไฟล์ "%1" ไม่มีอยู่! - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4025,7 +4181,7 @@ The second button removes the selected or last computer. StartAppDialog Start application - + เริ่มแอพพลิเคชั่น Please enter the applications to start on the selected computers. You can separate multiple applications by line. @@ -4041,7 +4197,7 @@ The second button removes the selected or last computer. Application name - + ชื่อแอพพลิเคชั่น Name: @@ -4277,6 +4433,10 @@ The second button removes the selected or last computer. Authentication test การทดสอบการยืนยันตัวตน + + Screen %1 + + VeyonServiceControl @@ -4357,6 +4517,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl @@ -4364,28 +4528,32 @@ The second button removes the selected or last computer. The service "%1" is already installed. เซอร์วิส "%1" ถูกติดตั้งอยู่ก่อนแล้ว - - The service "%1" could not be installed. - เซอร์วิส "%1" ไม่สามารถทำการติดตั้งได้ - The service "%1" has been installed successfully. เซอร์วิส "%1" ได้รับการติดตั้งอย่างเสร็จสมบูรณ์แล้ว - - The service "%1" could not be uninstalled. - เซอร์วิส "%1" ไม่สามารถทำการยกเลิกการติดตั้งได้ - The service "%1" has been uninstalled successfully. เซอร์วิส "%1" ได้รับการยกเลิกการติดตั้งอย่างเสร็จสมบูรณ์แล้ว - The start type of service "%1" could not be changed. + Service "%1" could not be found. - Service "%1" could not be found. + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_tr.ts b/translations/veyon_tr.ts index 380ca6fda..a421c931e 100644 --- a/translations/veyon_tr.ts +++ b/translations/veyon_tr.ts @@ -685,10 +685,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Bu komut, yapılandırılmış anahtar dizinindeki tüm kullanılabilir kimlik doğrulama anahtarlarını listeler. "%1" seçeneği belirtilirse, bunun yerine anahtar ayrıntılarını içeren bir tablo görüntülenir. Bir anahtara erişilemiyorsa bazı ayrıntılar eksik olabilir; okuma izinlerinin olmaması nedeniyle. - - Please specify the command to display help for! - Lütfen yardım görüntüleme komutunu belirtin! - TYPE TİP @@ -729,6 +725,14 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1193,6 +1197,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do MAC ADDRESS MAC ADRESİ + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do invalid + + [none] + + ComputerControlServer @@ -1612,10 +1624,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1800,10 +1808,134 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + HOST ADRESİ + + + FEATURE + + - Feature control - Özellik denetimi + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Ad + + + Description + Açıklama + + + Master + Usta + + + Service + Hizmet + + + Worker + + + + UID + UID + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -3129,6 +3261,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Locations & computers Konumlar ve bilgisayarlar + + Only show computers with logged on users + + MasterConfigurationPage @@ -3319,6 +3455,18 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do This mode allows you to monitor all computers at one or more locations. Bu mod, bir veya daha fazla konumdaki tüm bilgisayarları izlemenizi sağlar. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3384,7 +3532,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do - PluginsCommands + PluginCommands List names of all installed plugins Yüklü tüm eklentilerin adlarını listele @@ -3667,6 +3815,14 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3928,19 +4084,7 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir. - ServiceControlPlugin - - Service is running - Hizmet çalışıyor - - - Service is not running - Hizmet çalışmıyor - - - Configure and control Veyon service - Veyon hizmetini ayarla ve denetle - + ServiceControlCommands Register Veyon Service Veyon Hizmetini Kaydet @@ -3965,13 +4109,25 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.Query status of Veyon Service Veyon Hizmetinin sorgu durumu + + Service is running + Hizmet çalışıyor + + + Service is not running + Hizmet çalışmıyor + + + Configure and control Veyon service + Veyon hizmetini ayarla ve denetle + Commands for configuring and controlling Veyon Service Veyon Hizmetini yapılandırmak ve denetlemek için komutlar - ShellCommandLinePlugin + ShellCommands Run command file Komut dosyasını çalıştır @@ -3981,8 +4137,8 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir."%1" dosyası mevcut değil! - Interactive shell and script execution for Veyon Control - Veyon Kontrol için etkileşimli kabuk ve komut dosyası yürütme + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4292,6 +4448,10 @@ The second button removes the selected or last computer. Authentication test Kimlik doğrulama testi + + Screen %1 + + VeyonServiceControl @@ -4372,6 +4532,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Eklenti, Windows platformu için soyut işlevleri yerine getirir + + Internal display + + WindowsServiceControl @@ -4379,30 +4543,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. "%1" hizmeti zaten yüklü. - - The service "%1" could not be installed. - "%1" hizmeti yüklenemedi. - The service "%1" has been installed successfully. "%1" hizmeti başarıyla yüklendi. - - The service "%1" could not be uninstalled. - "%1" hizmeti kaldırılamadı. - The service "%1" has been uninstalled successfully. "%1" hizmeti başarıyla kaldırıldı. - - The start type of service "%1" could not be changed. - "%1" hizmetinin başlangıç ​​türü değiştirilemedi. - Service "%1" could not be found. "%1" hizmeti bulunamadı. + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_uk.ts b/translations/veyon_uk.ts index 2ed0fcbf8..e237c7681 100644 --- a/translations/veyon_uk.ts +++ b/translations/veyon_uk.ts @@ -682,10 +682,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Ця команда виводить список усіх доступних ключів розпізнавання у налаштованому каталозі ключів. Якщо вказано параметр «%1», замість списку буде виведено таблицю із подробицями щодо ключів. Деякі параметри ключа може бути не показано, якщо доступ до ключа обмежено, наприклад через брак прав на читання файла ключа. - - Please specify the command to display help for! - Будь ласка, вкажіть команду, для якої слід показати довідку! - TYPE ТИП @@ -726,6 +722,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. Будь ласка, вкажіть назву ключа (наприклад «teacher/public») першим аргументом. + + Please specify the command to display help for. + Будь ласка, вкажіть команду, для якої слід показати довідку. + + + The specified command does not exist or no help is available for it. + Вказаної команди не існує або немає доступу до довідки до неї. + AuthKeysTableModel @@ -1190,6 +1194,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS MAC-АДРЕСА + + The specified command does not exist or no help is available for it. + Вказаної команди не існує або немає доступу до довідки до неї. + BuiltinUltraVncServer @@ -1263,6 +1271,10 @@ The public key is used on client computers to authenticate incoming connection r invalid некоректний + + [none] + [немає] + ComputerControlServer @@ -1609,10 +1621,6 @@ The public key is used on client computers to authenticate incoming connection r All screens Усі екрани - - Screen %1 [%2] - Екран %1 [%2] - DesktopAccessDialog @@ -1797,10 +1805,134 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands - Feature control - Керування можливосями + List names of all available features + Вивести список назв усіх доступних можливостей + + + Show table with details of all available features + Показати таблицю із подробицями щодо усіх доступних можливостей + + + Start a feature on a remote host + Запустити можливість на віддаленому вузлі + + + Stop a feature on a remote host + Зупинити роботу можливості на віддаленому вузлі + + + Please specify the command to display help for. + Будь ласка, вкажіть команду, для якої слід показати довідку. + + + Displays a list with the names of all available features. + Показати список із назвами усіх доступних можливостей + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + Показує таблицю із докладними відомостями щодо усіх доступних можливостей. Серед цих відомостей опис, UID, назва додатка, який забезпечує роботу можливості, та деякі інші пов'язані із реалізацією подробиці. + + + HOST ADDRESS + АДРЕСА ВУЗЛА + + + FEATURE + МОЖЛИВІСТЬ + + + ARGUMENTS + АРГУМЕНТИ + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + Запускає вказану можливість на вказаному вузлі шляхом з'єднання із запущеним віддалено сервером Veyon. Можливість можна вказати за назвою або UID. Скористайтеся командою «show», щоб переглянути список усіх доступних можливостей. Залежно від можливості, може бути вказано додаткові аргументи (зокрема текстове повідомлення для показу), які має бути закодовано у один рядок JSON. Щоб дізнатися більше, зверніться до документації для розробників. + + + Lock the screen + Заблокувати екран + + + Display a text message + Показати текстове повідомлення + + + Test message + Тестове повідомлення + + + Start an application + Запустити програму + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + Зупиняє роботу вказаної можливості на вказанмоу вузлі шляхом з'єднання із запущеним віддалено сервером Veyon. Можливість можна вказати за назвою або UID. Скористайтеся командою «show», щоб переглянути список усіх доступних можливостей. + + + Unlock the screen + Розблокувати екран + + + The specified command does not exist or no help is available for it. + Вказаної команди не існує або немає доступу до довідки до неї. + + + Name + Назва + + + Description + Опис + + + Master + Основний + + + Service + Служба + + + Worker + Обробник + + + UID + UID + + + Plugin + Додаток + + + Invalid feature name or UID specified + Вказано некоректну назву або UID можливості + + + Error parsing the JSON-encoded arguments: %1 + Помилка під час спроби обробити закодовані у JSON аргументи: %1 + + + Failed to initialize credentials + Не вдалося ініціалізувати реєстраційні дані + + + Could not establish a connection to host %1 + Не вдалося встановити з'єднання із вузлом %1 + + + Failed to send feature control message to host %1 + Не вдалося надіслати повідомлення керування можливістю на вузол %1 + + + Feature-related CLI operations + Пов'язані із можливістю дії командного рядка + + + Commands for controlling features + Команди для керування можливостями @@ -3136,6 +3268,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Місця і комп'ютери + + Only show computers with logged on users + Показувати лише комп'ютери із користувачами у системі + MasterConfigurationPage @@ -3326,6 +3462,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. У цьому режимі ви можете спостерігати за усіма комп'ютерами у одному або декількох місцях. + + Query application version of the server + Опитати сервер щодо версії програми + + + Query active features + Опитати щодо активних можливостей + + + Query properties of remotely available screens + Опитати віддалені доступні екрани щодо властивостей + NestedNetworkObjectDirectory @@ -3391,7 +3539,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins Вивести список назв усіх встановлених додатків @@ -3672,7 +3820,15 @@ Please save your work and close all programs. Connecting... - + Встановлюємо з'єднання… + + + Select screen + Виберіть екран + + + All screens + Усі екрани @@ -3935,19 +4091,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - Службу запущено - - - Service is not running - Службу не запущено - - - Configure and control Veyon service - Налаштовування і керування службою Veyon - + ServiceControlCommands Register Veyon Service Зареєструвати службу Veyon @@ -3972,13 +4116,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service Визначити стан служби Veyon + + Service is running + Службу запущено + + + Service is not running + Службу не запущено + + + Configure and control Veyon service + Налаштовування і керування службою Veyon + Commands for configuring and controlling Veyon Service Команди для налаштовування і керування службою Veyon - ShellCommandLinePlugin + ShellCommands Run command file Виконати файл команди @@ -3988,8 +4144,8 @@ Typically this is required to support terminal servers. Файла «%1» не існує! - Interactive shell and script execution for Veyon Control - Інтерактивна оболонка і засіб виконання скриптів для Керування Veyon + Interactive shell and script execution for Veyon CLI + Інтерактивна оболонка і засіб виконання скриптів для командного рядка Veyon Commands for shell functionalities @@ -4300,6 +4456,10 @@ The second button removes the selected or last computer. Authentication test Перевірка розпізнавання + + Screen %1 + Екран %1 + VeyonServiceControl @@ -4380,6 +4540,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform Додаток, який реалізуває абстрактні функції на платформі Windows + + Internal display + Внутрішній дисплей + WindowsServiceControl @@ -4387,30 +4551,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. Службу «%1» вже встановлено. - - The service "%1" could not be installed. - Не вдалося встановити службу «%1». - The service "%1" has been installed successfully. Службу «%1» було успішно встановлено. - - The service "%1" could not be uninstalled. - Не вдалося вилучити службу «%1». - The service "%1" has been uninstalled successfully. Службу «%1» успішно вилучено. - - The start type of service "%1" could not be changed. - Не вдалося змінити тип запуску служби «%1». - Service "%1" could not be found. Не вдалося знайти службу «%1». + + The service "%1" could not be installed (error %2). + Не вдалося встановити службу «%1» (помилка %2). + + + Could not change the failure actions config for service "%1" (error %2). + Не вдалося змінити налаштування дій у відповідь на помилки для служби «%1» (помилка %2). + + + The service "%1" could not be uninstalled (error %2). + Не вдалося вилучити службу «%1» (помилка %2). + + + The start type of service "%1" could not be changed (error %2). + TНе вдалося змінити тип запуску служби «%1» (помилка %2). + X11VncConfigurationWidget diff --git a/translations/veyon_vi.ts b/translations/veyon_vi.ts index df9e9edbe..a797130a1 100644 --- a/translations/veyon_vi.ts +++ b/translations/veyon_vi.ts @@ -685,10 +685,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. Lệnh này liệt kê tất cả các khóa xác thực khả dụng trong thư mục khóa đã cấu hinh. Nếu tùy chọn "%1" được chỉ định, một bảng với chi tiết khóa sẽ được hiển thị để thay thế. Một số chi tiết có thể bị thiếu nếu một khóa không thể truy cập được ví dụ do thiếu quyền đọc. - - Please specify the command to display help for! - Vui lòng chỉ định lệnh để hiển thị trợ giúp! - TYPE KIỂU @@ -729,6 +725,14 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1193,6 +1197,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực MAC ADDRESS + + The specified command does not exist or no help is available for it. + + BuiltinUltraVncServer @@ -1266,6 +1274,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực invalid + + [none] + + ComputerControlServer @@ -1612,10 +1624,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1800,9 +1808,133 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + Tên + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + - Feature control + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -3118,6 +3250,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Locations & computers + + Only show computers with logged on users + + MasterConfigurationPage @@ -3308,6 +3444,18 @@ Khóa công được sử dụng trên các máy tính khách để xác thực This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3373,7 +3521,7 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - PluginsCommands + PluginCommands List names of all installed plugins @@ -3654,6 +3802,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3914,41 +4070,41 @@ Typically this is required to support terminal servers. - ServiceControlPlugin + ServiceControlCommands - Service is running + Register Veyon Service - Service is not running + Unregister Veyon Service - Configure and control Veyon service + Start Veyon Service - Register Veyon Service + Stop Veyon Service - Unregister Veyon Service + Restart Veyon Service - Start Veyon Service + Query status of Veyon Service - Stop Veyon Service + Service is running - Restart Veyon Service + Service is not running - Query status of Veyon Service + Configure and control Veyon service @@ -3957,7 +4113,7 @@ Typically this is required to support terminal servers. - ShellCommandLinePlugin + ShellCommands Run command file @@ -3967,7 +4123,7 @@ Typically this is required to support terminal servers. - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -4278,6 +4434,10 @@ The second button removes the selected or last computer. Authentication test + + Screen %1 + + VeyonServiceControl @@ -4358,6 +4518,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl @@ -4366,27 +4530,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. + + + + Service "%1" could not be found. - The service "%1" could not be uninstalled. + The service "%1" could not be installed (error %2). - The service "%1" has been uninstalled successfully. + Could not change the failure actions config for service "%1" (error %2). - The start type of service "%1" could not be changed. + The service "%1" could not be uninstalled (error %2). - Service "%1" could not be found. + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_zh_CN.ts b/translations/veyon_zh_CN.ts index 0dbd96bf7..ce6efa6a9 100644 --- a/translations/veyon_zh_CN.ts +++ b/translations/veyon_zh_CN.ts @@ -686,10 +686,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. 此命令列出配置的密钥目录中的所有可用身份验证密钥。 如果指定了选项 "%1" ,则会显示包含密钥详细信息的表格。 如果无法访问密钥,某些细节可能会丢失,例如,没有读取权限。 - - Please specify the command to display help for! - 请指定需要显示用法命令! - TYPE TYPE @@ -728,7 +724,15 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. - + 请指定键名 (例如: "teacher/public") 作为第一个参数。 + + + Please specify the command to display help for. + 请指定显示说明的命令。 + + + The specified command does not exist or no help is available for it. + 指定的命令不存在或没有它的说明可以使用。 @@ -758,7 +762,7 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + 绑定 DN 对应的用户名: e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org @@ -773,7 +777,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter your domain/LDAP username and password in order to access computers. - + 请输入您的域/LDAP用户名和密码以访问计算机。 Username @@ -865,7 +869,7 @@ The public key is used on client computers to authenticate incoming connection r Simple password - + 简单密码 @@ -945,11 +949,11 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + 目录名称 Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + 可以通过命令行导入 CSV 文件。更多信息请查看<a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">在线文档</a>。 @@ -1194,6 +1198,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS MAC 地址(网卡物理地) + + The specified command does not exist or no help is available for it. + 指定的命令不存在或没有它的说明可以使用。 + BuiltinUltraVncServer @@ -1253,19 +1261,23 @@ The public key is used on client computers to authenticate incoming connection r [no user] - + [无用户] Veyon Server unreachable or not running - + Veyon 服务器无法连接或未在运行 Name: %1 - + 名称:%1 invalid - + 无效 + + + [none] + [无] @@ -1307,7 +1319,7 @@ The public key is used on client computers to authenticate incoming connection r ComputerGroupSelector Group %1 - + 组 %1 @@ -1567,7 +1579,7 @@ The public key is used on client computers to authenticate incoming connection r Share your screen or allow a user to share his screen with other users. - + 分享您的屏幕或允许一个用户与其他用户分享其屏幕。 Full screen demo @@ -1575,19 +1587,19 @@ The public key is used on client computers to authenticate incoming connection r Share your own screen in fullscreen mode - + 以全屏模式分享您自己的屏幕 In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + 在此模式下,您的屏幕将以全屏模式显示在所有电脑上,用户的输入设备将被锁定。 Share your own screen in a window - + 在窗口中分享您自己的屏幕 Share selected user's screen in fullscreen mode - + 以全屏模式分享选中用户的屏幕 In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. @@ -1595,7 +1607,7 @@ The public key is used on client computers to authenticate incoming connection r Share selected user's screen in a window - + 在窗口中分享选中用户的屏幕 In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. @@ -1603,19 +1615,15 @@ The public key is used on client computers to authenticate incoming connection r Please select a user screen to share. - + 请选择一个用户的屏幕进行分享 Please select only one user screen to share. - + 请仅选择一个用户的屏幕进行分享 All screens - - - - Screen %1 [%2] - + 所有屏幕 @@ -1669,23 +1677,23 @@ The public key is used on client computers to authenticate incoming connection r Applications & websites - + 程序 & 网站 Predefined applications - + 预定义的程序 Add new application - + 添加新程序 Remove selected application - + 移除选中的程序 Add new website - + 添加新的网站 New application @@ -1712,7 +1720,7 @@ The public key is used on client computers to authenticate incoming connection r Start application - + 启动程序 Click this button to start an application on all computers. @@ -1720,11 +1728,11 @@ The public key is used on client computers to authenticate incoming connection r Start application "%1" - + 启动程序 "%1" Custom application - + 自定义程序 Start apps and open websites in user sessions @@ -1775,7 +1783,7 @@ The public key is used on client computers to authenticate incoming connection r Custom application - + 自定义程序 @@ -1801,10 +1809,134 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + 请指定显示说明的命令。 + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + 主机地址 + + + FEATURE + + + + ARGUMENTS + + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + 锁定屏幕 + + + Display a text message + 显示文字消息 + + + Test message + 文字消息 + + + Start an application + 启动程序 + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + 解锁屏幕 + + + The specified command does not exist or no help is available for it. + 指定的命令不存在或没有它的说明可以使用。 + + + Name + 名称 + + + Description + 介绍 + + + Master + 主机 + + + Service + 服务 + - Feature control - 功能控制 + Worker + + + + UID + + + + Plugin + 插件 + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features + @@ -2026,7 +2158,7 @@ The public key is used on client computers to authenticate incoming connection r TLS configuration - + TLS 配置 Use certificate authority for TLS connections @@ -2034,7 +2166,7 @@ The public key is used on client computers to authenticate incoming connection r CA certificate file - + CA 证书文件 ... @@ -2042,11 +2174,11 @@ The public key is used on client computers to authenticate incoming connection r Host certificate file - + 主机证书文件 Host private key file - + 主机私钥文件 @@ -2787,11 +2919,11 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + 目录名称 Query options - + 查询选项 Query nested user groups (supported by AD only) @@ -2884,7 +3016,7 @@ The public key is used on client computers to authenticate incoming connection r User sessions - + 用户会话 Minimum session lifetime before server start @@ -3138,6 +3270,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers 地点及计算机 + + Only show computers with logged on users + + MasterConfigurationPage @@ -3328,6 +3464,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. 此模式允许您在一个或多个地点监控所有计算机。 + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3393,7 +3541,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3674,7 +3822,15 @@ Please save your work and close all programs. Connecting... - + 正在连接... + + + Select screen + 选择屏幕 + + + All screens + 所有屏幕 @@ -3793,7 +3949,7 @@ Please save your work and close all programs. Do you really want to delete all selected screenshots? - + 您确定要删除所有选中的屏幕截图吗? @@ -3882,7 +4038,7 @@ Typically this is required to support terminal servers. Internal VNC server - + 内部 VNC 服务器 Feature manager @@ -3898,7 +4054,7 @@ Typically this is required to support terminal servers. Session mode - + 会话模式 Local session mode (single server instance for primary local session) @@ -3937,19 +4093,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - 服务正在运行 - - - Service is not running - 服务没有运行 - - - Configure and control Veyon service - 配置和控制 Veyon 服务 - + ServiceControlCommands Register Veyon Service 注册 Veyon 服务 @@ -3974,13 +4118,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service 查询 Veyon 服务状态 + + Service is running + 服务正在运行 + + + Service is not running + 服务没有运行 + + + Configure and control Veyon service + 配置和控制 Veyon 服务 + Commands for configuring and controlling Veyon Service 用于配置和控制Veyon服务的命令 - ShellCommandLinePlugin + ShellCommands Run command file 运行命令文件 @@ -3990,8 +4146,8 @@ Typically this is required to support terminal servers. 文件 "%1" 不存在! - Interactive shell and script execution for Veyon Control - Veyon 控制器的交互式 shell 和脚本运行 + Interactive shell and script execution for Veyon CLI + Commands for shell functionalities @@ -4014,22 +4170,22 @@ Typically this is required to support terminal servers. Duration: - + 持续时间: SpotlightPanel Add selected computers - + 添加选中的计算机 Remove selected computers - + 删除选中的计算机 Update computers in realtime - + 实时更新计算机 Spotlight @@ -4049,7 +4205,7 @@ The second button removes the selected or last computer. StartAppDialog Start application - + 启动程序 Please enter the applications to start on the selected computers. You can separate multiple applications by line. @@ -4228,7 +4384,7 @@ The second button removes the selected or last computer. Do you really want to log off <b>ALL</b> users? - + 您确定要注销 <b>所有</b> 用户吗? @@ -4301,6 +4457,10 @@ The second button removes the selected or last computer. Authentication test 验证测试 + + Screen %1 + 屏幕 %1 + VeyonServiceControl @@ -4381,6 +4541,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform 插件实现 Windows 平台的抽象函数 + + Internal display + 内部显示 + WindowsServiceControl @@ -4388,30 +4552,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. 服务 "%1" 已安装。 - - The service "%1" could not be installed. - 服务 "%1" 未能安装。 - The service "%1" has been installed successfully. 服务 "%1" 已成功安装。 - - The service "%1" could not be uninstalled. - 服务 "%1" 未能卸载。 - The service "%1" has been uninstalled successfully. 服务 "%1" 已成功卸载。 - - The start type of service "%1" could not be changed. - 服务 "%1" 的启动类型无法更改。 - Service "%1" could not be found. 服务 "%1" 未找到。 + + The service "%1" could not be installed (error %2). + + + + Could not change the failure actions config for service "%1" (error %2). + + + + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). + + X11VncConfigurationWidget diff --git a/translations/veyon_zh_TW.ts b/translations/veyon_zh_TW.ts index 7bf7c01a1..9a69c96be 100644 --- a/translations/veyon_zh_TW.ts +++ b/translations/veyon_zh_TW.ts @@ -142,7 +142,7 @@ If you're interested in translating Veyon into your local or another langua No default user groups plugin was found. Please check your installation! - 找不到預設的使用者群組外掛件。 請檢查您的安裝! + 找不到預設的使用者群組外掛程式。 請檢查您的安裝! Restrict access to members of specific user groups @@ -685,10 +685,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. 這個命令列出組態的金鑰目錄中所有可用的驗證金鑰。 如果有指定選項「%1」,則會顯示包含金鑰詳細資料的表格。 如果無法存取金鑰,某些詳細資料可能會遺失,例如: 由於缺乏讀取權限。 - - Please specify the command to display help for! - 請指定顯示說明的命令! - TYPE 類型 @@ -729,6 +725,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. 請指定金鑰名稱 (例如: "teacher/public") 作為第一個引數。 + + Please specify the command to display help for. + 請指定顯示說明的命令。 + + + The specified command does not exist or no help is available for it. + 指定的命令不存在或沒有它的說明可以使用。 + AuthKeysTableModel @@ -944,11 +948,11 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + 目錄名稱 Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + 可以透過命令列界面匯入 CSV 檔案。 更多資訊,請參閱 <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">線上文件</a>。 @@ -1193,6 +1197,10 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS MAC 位址 + + The specified command does not exist or no help is available for it. + 指定的命令不存在或沒有它的說明可以使用。 + BuiltinUltraVncServer @@ -1260,12 +1268,16 @@ The public key is used on client computers to authenticate incoming connection r Name: %1 - + 名稱: %1 invalid 無效 + + [none] + [無] + ComputerControlServer @@ -1348,11 +1360,11 @@ The public key is used on client computers to authenticate incoming connection r Select all - 選擇所有 + 全選 Unselect all - 取消選取所有 + 全部不選 Add to group @@ -1360,7 +1372,7 @@ The public key is used on client computers to authenticate incoming connection r Remove from group - 從群組中移除 + 從群組移除 @@ -1426,7 +1438,7 @@ The public key is used on client computers to authenticate incoming connection r Upgrade and save configuration of program and plugins - 升級並儲存程式及外掛的組態 + 升級並儲存程式及外掛程式的組態 Please specify an existing configuration file to import. @@ -1612,10 +1624,6 @@ The public key is used on client computers to authenticate incoming connection r All screens 所有螢幕 - - Screen %1 [%2] - 螢幕 %1 [%2] - DesktopAccessDialog @@ -1800,10 +1808,134 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + 列出所有可用功能的名稱 + + + Show table with details of all available features + 顯示含所有可用功能的詳細資訊表格 + + + Start a feature on a remote host + 啟動遠端主機功能 + + + Stop a feature on a remote host + 停止遠端主機功能 + + + Please specify the command to display help for. + 請指定顯示說明的命令。 + + + Displays a list with the names of all available features. + 顯示包含所有可用功能名稱的清單。 + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + 顯示表格,其中包含有關所有可用功能的詳細資料。 這個資訊包含描述、UID、提供相應功能的外掛程式名稱以及其它一些與實現相關的詳細資料。 + + + HOST ADDRESS + 主機位址 + + + FEATURE + 功能 + + + ARGUMENTS + 引數 + + + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + 透過連線到遠端執行的 veyon 伺服器來啟動指定主機的指定功能。 該功能可以由名稱或 UID 指定。 使用「show」命令查看所有的可用功能。 根據功能,必須指定編碼為單一 JSON 字串的附加引數 (比如顯示的文字訊息)。 請參閱開發人員文件取得更多資訊 + + + Lock the screen + 鎖定畫面 + + + Display a text message + 顯示文字資訊 + + + Test message + 測試文字 + + + Start an application + 啟動應用程式 + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + 透過連線到遠端執行的 veyon 伺服器來停止指定主機的指定功能。 該功能可以由名稱或 UID 指定。 使用「show」命令查看所有的可用功能。 + + + Unlock the screen + 解鎖畫面 + + + The specified command does not exist or no help is available for it. + 指定的命令不存在或沒有它的說明可以使用。 + + + Name + 名稱 + + + Description + 描述 + + + Master + 主要 + + + Service + 服務 + + + Worker + Worker + + + UID + UID + + + Plugin + 外掛程式 + - Feature control - 功能控制 + Invalid feature name or UID specified + 功能名稱或指定的 UID 無效 + + + Error parsing the JSON-encoded arguments: %1 + 解析 JSON 編碼的參數時錯誤: %1 + + + Failed to initialize credentials + 初始化認證失敗 + + + Could not establish a connection to host %1 + 無法建立到主機 %1 的連線 + + + Failed to send feature control message to host %1 + 向主機 %1 傳送功能控制訊息失敗 + + + Feature-related CLI operations + 功能相關的 CLI 操作 + + + Commands for controlling features + 用於控制功能的命令 @@ -2025,15 +2157,15 @@ The public key is used on client computers to authenticate incoming connection r TLS configuration - + TLS 組態 Use certificate authority for TLS connections - + TLS 連線使用憑證頒發機構 CA certificate file - + 憑證檔 ... @@ -2041,11 +2173,11 @@ The public key is used on client computers to authenticate incoming connection r Host certificate file - + 主機憑證檔 Host private key file - + 主機私密金鑰檔 @@ -2395,7 +2527,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP directory - + LDAP 目錄 @@ -2786,7 +2918,7 @@ The public key is used on client computers to authenticate incoming connection r Directory name - + 目錄名稱 Query options @@ -2805,7 +2937,7 @@ The public key is used on client computers to authenticate incoming connection r Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + 請使用全域 LDAP 組態頁面來組態如何從基於 LDAP 的目錄服務中檢索位置和電腦。 @@ -3137,6 +3269,10 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers 位置 & 電腦 + + Only show computers with logged on users + 只顯示已登入使用者的電腦 + MasterConfigurationPage @@ -3327,12 +3463,24 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. 這個模式允許您監視在一個或數個位置的所有電腦。 + + Query application version of the server + 查詢伺服器的應用程式版本 + + + Query active features + 查詢使用中功能 + + + Query properties of remotely available screens + 查詢遠端可用螢幕的內容 + NestedNetworkObjectDirectory All directories - + 全部目錄 @@ -3392,14 +3540,14 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins 列出所有已安裝外掛程式的名稱 Show table with details of all installed plugins - 顯示包含所有已安裝外掛程式的詳細資訊表格 + 顯示含所有已安裝外掛程式的詳細資訊表格 Name @@ -3419,7 +3567,7 @@ The public key is used on client computers to authenticate incoming connection r Plugin-related CLI operations - 與外掛程式相關的 CLI 操作 + 外掛程式相關的 CLI 操作 Commands for managing plugins @@ -3673,7 +3821,15 @@ Please save your work and close all programs. Connecting... - + 正在連線... + + + Select screen + 選取螢幕 + + + All screens + 所有螢幕 @@ -3897,19 +4053,19 @@ Typically this is required to support terminal servers. Session mode - + 工作階段模式 Local session mode (single server instance for primary local session) - + 本機工作階段模式 (主要本機工作階段的單一伺服器實例) Active session mode (single server instance for active local or remote session) - + 使用中工作階段模式 (使用中本機或遠端工作階段的單ㄧ伺服器實例) Multi session mode (distinct server instance for each local and remote desktop session) - + 多工作階段模式 (每個本機和遠端桌面工作階段的不同伺服器實例) @@ -3936,19 +4092,7 @@ Typically this is required to support terminal servers. - ServiceControlPlugin - - Service is running - 服務正在執行 - - - Service is not running - 服務未執行 - - - Configure and control Veyon service - 組態和控制 Veyon 服務 - + ServiceControlCommands Register Veyon Service 註冊 Veyon 服務 @@ -3973,13 +4117,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service 查詢 Veyon 服務的狀態 + + Service is running + 服務正在執行 + + + Service is not running + 服務未執行 + + + Configure and control Veyon service + 組態和控制 Veyon 服務 + Commands for configuring and controlling Veyon Service 組態和控制 Veyon 服務的命令 - ShellCommandLinePlugin + ShellCommands Run command file 執行命令列 @@ -3989,8 +4145,8 @@ Typically this is required to support terminal servers. 檔案 "%1" 不存在! - Interactive shell and script execution for Veyon Control - Veyon Control 的交互式殼層和指令碼執行 + Interactive shell and script execution for Veyon CLI + Veyon CLI 的交互式殼層和指令碼執行 Commands for shell functionalities @@ -4041,7 +4197,8 @@ Typically this is required to support terminal servers. Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + 以按一下滑鼠中鍵或按一下以下第一個按鈕來加入電腦。 +第二個按鈕移除選取的或最後一個電腦。 @@ -4300,6 +4457,10 @@ The second button removes the selected or last computer. Authentication test 身份驗證測試 + + Screen %1 + 螢幕 %1 + VeyonServiceControl @@ -4380,6 +4541,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform 執行 Windows 平臺的抽象函數的外掛程式 + + Internal display + 內部顯示 + WindowsServiceControl @@ -4387,30 +4552,34 @@ The second button removes the selected or last computer. The service "%1" is already installed. 服務「%1」已經安裝。 - - The service "%1" could not be installed. - 無法安裝服務「%1」。 - The service "%1" has been installed successfully. 服務「%1」安裝成功。 - - The service "%1" could not be uninstalled. - 無法解除安裝服務「%1」。 - The service "%1" has been uninstalled successfully. 服務「%1」解除安裝成功。 - - The start type of service "%1" could not be changed. - 無法變更服務「%1」的啟動類型。 - Service "%1" could not be found. 找不到服務「%1」。 + + The service "%1" could not be installed (error %2). + 無法安裝服務「%1」的啟動類型 (錯誤 %2)。 + + + Could not change the failure actions config for service "%1" (error %2). + 無法變更服務「%1」的失敗動作組態 (錯誤 %2)。 + + + The service "%1" could not be uninstalled (error %2). + 無法解除安裝服務「%1」的啟動類型 (錯誤 %2)。 + + + The start type of service "%1" could not be changed (error %2). + 無法變更服務「%1」的啟動類型 (錯誤 %2)。 + X11VncConfigurationWidget From 0fc35892eed9d1fe70ade4f38ee69736b87b8c41 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 19 Jan 2024 10:44:35 +0100 Subject: [PATCH 1535/1765] FeatureManager: cache disabled features Reading config items (especially complex ones) is quite expensive and shouldn't be performed when processing messages. --- core/src/FeatureManager.cpp | 8 +++++++- core/src/FeatureManager.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index b1975737b..a11f28c00 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -54,6 +54,12 @@ FeatureManager::FeatureManager( QObject* parent ) : } } + const auto disabledFeatures = VeyonCore::config().disabledFeatures(); + m_disabledFeaturesUids.reserve(disabledFeatures.count()); + for (const auto& disabledFeature : disabledFeatures) + { + m_disabledFeaturesUids.append(Plugin::Uid{disabledFeature}); + } } @@ -217,7 +223,7 @@ void FeatureManager::handleFeatureMessage(VeyonServerInterface& server, { vDebug() << "[SERVER]" << message; - if( VeyonCore::config().disabledFeatures().contains( message.featureUid().toString() ) ) + if (m_disabledFeaturesUids.contains(message.featureUid())) { vWarning() << "ignoring message as feature" << message.featureUid() << "is disabled by configuration!"; return; diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index b0705781d..347e122f9 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -82,6 +82,7 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject private: FeatureList m_features{}; + FeatureUidList m_disabledFeaturesUids{}; const FeatureList m_emptyFeatureList{}; QObjectList m_pluginObjects{}; FeatureProviderInterfaceList m_featurePluginInterfaces{}; From ae0a0206a3e304dc7c3c1171628ae957223cbaec Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 19 Jan 2024 10:45:45 +0100 Subject: [PATCH 1536/1765] FeatureProviderInterface: add handleFeatureMessageFromWorker() Provide dedicated method for handling messages from workers. Prepares fix for #927. --- core/src/FeatureProviderInterface.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index 744e11be9..c856f0141 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -151,6 +151,15 @@ class VEYON_CORE_EXPORT FeatureProviderInterface return false; } + virtual bool handleFeatureMessageFromWorker(VeyonServerInterface& server, + const FeatureMessage& message) + { + Q_UNUSED(server) + Q_UNUSED(message) + + return false; + } + /*! * \brief Send asynchronous messages (e.g. notifications or state updates) to client */ From 55708ad0c94f9f5c54b4084cb1a6baeec4a74909 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 19 Jan 2024 10:47:20 +0100 Subject: [PATCH 1537/1765] FeatureManager: add handleFeatureMessageFromWorker() --- core/src/FeatureManager.cpp | 20 ++++++++++++++++++++ core/src/FeatureManager.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index a11f28c00..82c8b129d 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -237,6 +237,26 @@ void FeatureManager::handleFeatureMessage(VeyonServerInterface& server, +void FeatureManager::handleFeatureMessageFromWorker(VeyonServerInterface& server, + const FeatureMessage& message) const +{ + vDebug() << "[FROM WORKER]" << message; + + if (m_disabledFeaturesUids.contains(message.featureUid())) + { + vWarning() << "ignoring message as feature" << message.featureUid() << "is disabled by configuration!"; + return; + } + + for (const auto& featureInterface : qAsConst(m_featurePluginInterfaces)) + { + featureInterface->handleFeatureMessageFromWorker(server, message); + } +} + + + + void FeatureManager::handleFeatureMessage(VeyonWorkerInterface& worker, const FeatureMessage& message) const { vDebug() << "[WORKER]" << message; diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index 347e122f9..ac39753ad 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -74,6 +74,8 @@ class VEYON_CORE_EXPORT FeatureManager : public QObject void handleFeatureMessage(VeyonServerInterface& server, const MessageContext& messageContext, const FeatureMessage& message) const; + void handleFeatureMessageFromWorker(VeyonServerInterface& server, + const FeatureMessage& message) const; void handleFeatureMessage(VeyonWorkerInterface& worker, const FeatureMessage& message) const; void sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) const; From 228609e23e81f8f3be949b5cab965a09ac300591 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 19 Jan 2024 10:48:24 +0100 Subject: [PATCH 1538/1765] FeatureWorkerManager: use new handleFeatureMessageFromWorker() method Use new method for handling messages from worker to fix injection of messages to the server through the FeatureWorkerManager socket. Closes #927. --- core/src/FeatureWorkerManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index 38380820b..0ca07a840 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -278,7 +278,7 @@ void FeatureWorkerManager::processConnection( QTcpSocket* socket ) if( message.command() >= 0 ) { - VeyonCore::featureManager().handleFeatureMessage( m_server, MessageContext( socket ), message ); + VeyonCore::featureManager().handleFeatureMessageFromWorker(m_server, message); } } else From d389b7c80b0589d5e88b7636927ed829c4b6fa54 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 19 Jan 2024 10:50:40 +0100 Subject: [PATCH 1539/1765] DesktopAccessDialog: handle worker messages via handleFeatureMessageFromWorker() --- core/src/DesktopAccessDialog.cpp | 9 +++------ core/src/DesktopAccessDialog.h | 5 ++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index 5ba0c7be6..b6643c5b4 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -85,18 +85,15 @@ void DesktopAccessDialog::abort( FeatureWorkerManager* featureWorkerManager ) -bool DesktopAccessDialog::handleFeatureMessage( VeyonServerInterface& server, - const MessageContext& messageContext, - const FeatureMessage& message ) +bool DesktopAccessDialog::handleFeatureMessageFromWorker(VeyonServerInterface& server, + const FeatureMessage& message) { - Q_UNUSED(messageContext) - if( m_desktopAccessDialogFeature.uid() == message.featureUid() && message.command() == ReportDesktopAccessChoice ) { m_choice = message.argument( Argument::Choice ).value(); - server.featureWorkerManager().stopWorker( m_desktopAccessDialogFeature.uid() ); + server.featureWorkerManager().stopWorker(m_desktopAccessDialogFeature.uid()); m_abortTimer.stop(); diff --git a/core/src/DesktopAccessDialog.h b/core/src/DesktopAccessDialog.h index fba30fc2c..d47686f3f 100644 --- a/core/src/DesktopAccessDialog.h +++ b/core/src/DesktopAccessDialog.h @@ -113,9 +113,8 @@ class VEYON_CORE_EXPORT DesktopAccessDialog : public QObject, public FeatureProv return false; } - bool handleFeatureMessage( VeyonServerInterface& server, - const MessageContext& messageContext, - const FeatureMessage& message ) override; + bool handleFeatureMessageFromWorker(VeyonServerInterface& server, + const FeatureMessage& message) override; bool handleFeatureMessage( VeyonWorkerInterface& worker, const FeatureMessage& message ) override; From ea01aaa3800d7241cf4770bf5e9d708243f4b8cb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 19 Jan 2024 10:54:56 +0100 Subject: [PATCH 1540/1765] 3rdparty: ultravnc: update submodule (1.4.3.6) --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index fc755de16..7f3f925ed 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit fc755de1698db35b67adc3fa7de14ad34072495d +Subproject commit 7f3f925ed5fef1b1eb9cf28436fb7a8bab130c4f From 6663b23ca260d2ec78c8fc89b8fdcab7514de662 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 19 Jan 2024 11:43:37 +0100 Subject: [PATCH 1541/1765] 3rdparty: kldap: update submodule Due to larger upstream refactorings the integration code needs to be adopted as well. Luckily we're still able to integrate kldap-qt-compat. --- 3rdparty/kldap | 2 +- plugins/ldap/common/LdapClient.cpp | 52 ++++++++++++------------- plugins/ldap/common/LdapClient.h | 15 +++++-- plugins/ldap/kldap/CMakeLists.txt | 4 +- plugins/ldap/kldap/KLdapIntegration.cpp | 4 +- plugins/ldap/kldap/kldap_core_export.h | 8 ++++ plugins/ldap/kldap/ldap_core_debug.h | 11 ++++++ plugins/ldap/kldap/ldap_debug.h | 12 +----- 8 files changed, 63 insertions(+), 45 deletions(-) create mode 100644 plugins/ldap/kldap/kldap_core_export.h create mode 100644 plugins/ldap/kldap/ldap_core_debug.h diff --git a/3rdparty/kldap b/3rdparty/kldap index 23abaa68c..27bf9afbf 160000 --- a/3rdparty/kldap +++ b/3rdparty/kldap @@ -1 +1 @@ -Subproject commit 23abaa68c3c43770e86998af38b3c8b2ffde4667 +Subproject commit 27bf9afbf5fb0bc587e7d707c3ea10845dcfdf34 diff --git a/plugins/ldap/common/LdapClient.cpp b/plugins/ldap/common/LdapClient.cpp index 0c3449bba..51393a372 100644 --- a/plugins/ldap/common/LdapClient.cpp +++ b/plugins/ldap/common/LdapClient.cpp @@ -12,16 +12,16 @@ #include "ldapserver.h" -static inline KLDAP::LdapUrl::Scope kldapUrlScope( LdapClient::Scope scope ) +static inline KLDAPCore::LdapUrl::Scope kldapUrlScope(LdapClient::Scope scope) { - switch( scope ) + switch (scope) { - case LdapClient::Scope::Base: return KLDAP::LdapUrl::Base; - case LdapClient::Scope::One: return KLDAP::LdapUrl::One; - case LdapClient::Scope::Sub: return KLDAP::LdapUrl::Sub; + case LdapClient::Scope::Base: return KLDAPCore::LdapUrl::Base; + case LdapClient::Scope::One: return KLDAPCore::LdapUrl::One; + case LdapClient::Scope::Sub: return KLDAPCore::LdapUrl::Sub; } - return KLDAP::LdapUrl::Base; + return KLDAPCore::LdapUrl::Base; } @@ -29,9 +29,9 @@ static inline KLDAP::LdapUrl::Scope kldapUrlScope( LdapClient::Scope scope ) LdapClient::LdapClient( const LdapConfiguration& configuration, const QUrl& url, QObject* parent ) : QObject( parent ), m_configuration( configuration ), - m_server( new KLDAP::LdapServer ), - m_connection( new KLDAP::LdapConnection ), - m_operation( new KLDAP::LdapOperation ), + m_server( new KLDAPCore::LdapServer ), + m_connection( new KLDAPCore::LdapConnection ), + m_operation( new KLDAPCore::LdapOperation ), m_queryTimeout(m_configuration.queryTimeout()) { connectAndBind( url ); @@ -99,7 +99,7 @@ LdapClient::Objects LdapClient::queryObjects( const QString& dn, const QStringLi Objects entries; int result = -1; - auto id = m_operation->search( KLDAP::LdapDN( dn ), kldapUrlScope( scope ), filter, QStringList( attributes ) ); + auto id = m_operation->search(KLDAPCore::LdapDN(dn), kldapUrlScope(scope), filter, attributes); if( id != -1 ) { @@ -111,7 +111,7 @@ LdapClient::Objects LdapClient::queryObjects( const QString& dn, const QStringLi auto isFirstResult = true; - while( ( result = m_operation->waitForResult( id, m_queryTimeout ) ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) + while ((result = m_operation->waitForResult(id, m_queryTimeout)) == KLDAPCore::LdapOperation::RES_SEARCH_ENTRY) { if( isFirstResult ) { @@ -195,14 +195,14 @@ QStringList LdapClient::queryAttributeValues( const QString& dn, const QString& QStringList entries; int result = -1; - int id = m_operation->search( KLDAP::LdapDN( dn ), kldapUrlScope( scope ), filter, QStringList( attribute ) ); + int id = m_operation->search(KLDAPCore::LdapDN(dn), kldapUrlScope(scope), filter, QStringList(attribute)); if( id != -1 ) { bool isFirstResult = true; QString realAttributeName = attribute.toLower(); - while( ( result = m_operation->waitForResult( id, m_queryTimeout ) ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) + while ((result = m_operation->waitForResult(id, m_queryTimeout)) == KLDAPCore::LdapOperation::RES_SEARCH_ENTRY) { if( isFirstResult ) { @@ -270,11 +270,11 @@ QStringList LdapClient::queryDistinguishedNames( const QString& dn, const QStrin QStringList distinguishedNames; int result = -1; - int id = m_operation->search( KLDAP::LdapDN( dn ), kldapUrlScope( scope ), filter, QStringList() ); + int id = m_operation->search( KLDAPCore::LdapDN(dn), kldapUrlScope(scope), filter, QStringList() ); if( id != -1 ) { - while( ( result = m_operation->waitForResult( id, m_queryTimeout ) ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) + while ((result = m_operation->waitForResult(id, m_queryTimeout)) == KLDAPCore::LdapOperation::RES_SEARCH_ENTRY) { distinguishedNames += m_operation->object().dn().toString(); } @@ -325,7 +325,7 @@ QStringList LdapClient::queryObjectAttributes( const QString& dn ) return {}; } - if( m_operation->waitForResult( id, m_queryTimeout ) == KLDAP::LdapOperation::RES_SEARCH_ENTRY ) + if (m_operation->waitForResult(id, m_queryTimeout) == KLDAPCore::LdapOperation::RES_SEARCH_ENTRY) { const auto keys = m_operation->object().attributes().keys(); vDebug() << "results" << keys; @@ -438,7 +438,7 @@ bool LdapClient::connectAndBind( const QUrl& url ) { if( url.isValid() ) { - m_server->setUrl( KLDAP::LdapUrl( url ) ); + m_server->setUrl(KLDAPCore::LdapUrl(url)); } else { @@ -449,24 +449,24 @@ bool LdapClient::connectAndBind( const QUrl& url ) { m_server->setBindDn( m_configuration.bindDn() ); m_server->setPassword( QString::fromUtf8( m_configuration.bindPassword().plainText().toByteArray() ) ); - m_server->setAuth( KLDAP::LdapServer::Simple ); + m_server->setAuth(KLDAPCore::LdapServer::Simple); } else { - m_server->setAuth( KLDAP::LdapServer::Anonymous ); + m_server->setAuth(KLDAPCore::LdapServer::Anonymous); } const auto security = static_cast( m_configuration.connectionSecurity() ); switch( security ) { case ConnectionSecurityTLS: - m_server->setSecurity( KLDAP::LdapServer::TLS ); + m_server->setSecurity(KLDAPCore::LdapServer::TLS); break; case ConnectionSecuritySSL: - m_server->setSecurity( KLDAP::LdapServer::SSL ); + m_server->setSecurity(KLDAPCore::LdapServer::SSL); break; default: - m_server->setSecurity( KLDAP::LdapServer::None ); + m_server->setSecurity(KLDAPCore::LdapServer::None); break; } } @@ -499,18 +499,18 @@ void LdapClient::initTLS() switch( m_configuration.tlsVerifyMode() ) { case TLSVerifyDefault: - m_server->setTLSRequireCertificate( KLDAP::LdapServer::TLSReqCertDefault ); + m_server->setTLSRequireCertificate(KLDAPCore::LdapServer::TLSReqCertDefault); break; case TLSVerifyNever: - m_server->setTLSRequireCertificate( KLDAP::LdapServer::TLSReqCertNever ); + m_server->setTLSRequireCertificate(KLDAPCore::LdapServer::TLSReqCertNever); break; case TLSVerifyCustomCert: - m_server->setTLSRequireCertificate( KLDAP::LdapServer::TLSReqCertHard ); + m_server->setTLSRequireCertificate(KLDAPCore::LdapServer::TLSReqCertHard); m_server->setTLSCACertFile( m_configuration.tlsCACertificateFile() ); break; default: vCritical() << "invalid TLS verify mode specified!"; - m_server->setTLSRequireCertificate( KLDAP::LdapServer::TLSReqCertDefault ); + m_server->setTLSRequireCertificate(KLDAPCore::LdapServer::TLSReqCertDefault); break; } } diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index e2e803119..bb892c671 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -9,11 +9,20 @@ #include "LdapCommon.h" +#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) namespace KLDAP { class LdapConnection; class LdapOperation; class LdapServer; } +namespace KLDAPCore = KLDAP; +#else +namespace KLDAPCore { +class LdapConnection; +class LdapOperation; +class LdapServer; +} +#endif class LdapConfiguration; @@ -116,9 +125,9 @@ class LDAP_COMMON_EXPORT LdapClient : public QObject void initTLS(); const LdapConfiguration& m_configuration; - KLDAP::LdapServer* m_server; - KLDAP::LdapConnection* m_connection; - KLDAP::LdapOperation* m_operation; + KLDAPCore::LdapServer* m_server; + KLDAPCore::LdapConnection* m_connection; + KLDAPCore::LdapOperation* m_operation; enum State { diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index 0d4fb1b1f..f2fa4f4d9 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -19,12 +19,12 @@ set(LDAP_FOUND TRUE) if(NOT WITH_QT6 AND Qt5Core_VERSION VERSION_LESS 5.14.0) set(kldap_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/kldap-qt-compat/src/core) + configure_file(${kldap_SOURCE_DIR}/../kldap_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/kldap_config.h) else() set(kldap_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/kldap/src/core) + configure_file(${kldap_SOURCE_DIR}/kldap_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/kldap_config.h) endif() -configure_file(${kldap_SOURCE_DIR}/../kldap_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/kldap_config.h) - set(kldap_SOURCES ${kldap_SOURCE_DIR}/ber.cpp ${kldap_SOURCE_DIR}/ldif.cpp diff --git a/plugins/ldap/kldap/KLdapIntegration.cpp b/plugins/ldap/kldap/KLdapIntegration.cpp index 24630a670..f59e507c5 100644 --- a/plugins/ldap/kldap/KLdapIntegration.cpp +++ b/plugins/ldap/kldap/KLdapIntegration.cpp @@ -1,7 +1,7 @@ -// Copyright (c) 2016-2023 Tobias Junghans +// Copyright (c) 2016-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later -#include "ldap_debug.h" +#include "ldap_core_debug.h" Q_LOGGING_CATEGORY(LDAP_LOG, "KLDAP"); diff --git a/plugins/ldap/kldap/kldap_core_export.h b/plugins/ldap/kldap/kldap_core_export.h new file mode 100644 index 000000000..1990aecb0 --- /dev/null +++ b/plugins/ldap/kldap/kldap_core_export.h @@ -0,0 +1,8 @@ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later + +#pragma once + +#define KLDAP_CORE_EXPORT __attribute__((visibility("default"))) +#define KLDAP_CORE_NO_EXPORT __attribute__((visibility("hidden"))) diff --git a/plugins/ldap/kldap/ldap_core_debug.h b/plugins/ldap/kldap/ldap_core_debug.h new file mode 100644 index 000000000..e8f1077bf --- /dev/null +++ b/plugins/ldap/kldap/ldap_core_debug.h @@ -0,0 +1,11 @@ +// Copyright (c) 2019-2023 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later + +#pragma once + +#include +#include + +Q_DECLARE_LOGGING_CATEGORY(LDAP_LOG); + diff --git a/plugins/ldap/kldap/ldap_debug.h b/plugins/ldap/kldap/ldap_debug.h index e8f1077bf..f43c42119 100644 --- a/plugins/ldap/kldap/ldap_debug.h +++ b/plugins/ldap/kldap/ldap_debug.h @@ -1,11 +1 @@ -// Copyright (c) 2019-2023 Tobias Junghans -// This file is part of Veyon - https://veyon.io -// SPDX-License-Identifier: LGPL-2.0-or-later - -#pragma once - -#include -#include - -Q_DECLARE_LOGGING_CATEGORY(LDAP_LOG); - +#include "ldap_core_debug.h" From d6d1b478a8195ac1e0b32ae04bb1db9725fc2867 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Jan 2024 15:42:43 +0100 Subject: [PATCH 1542/1765] VncConnection: add control flag for skipping framebuffer updates --- core/src/VncConnection.cpp | 33 ++++++++++++++++++++++++++++----- core/src/VncConnection.h | 15 ++++++++++++++- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 4265f4b41..c25a4d8e8 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -516,8 +516,13 @@ void VncConnection::handleConnection() { loopTimer.start(); - const int i = WaitForMessage(m_client, m_framebufferUpdateInterval > 0 ? - m_messageWaitTimeout * 100 : m_messageWaitTimeout); + const auto waitTimeout = isControlFlagSet(ControlFlag::SkipFramebufferUpdates) ? + m_messageWaitTimeout / 10 + : + (m_framebufferUpdateInterval > 0 ? m_messageWaitTimeout * 100 : m_messageWaitTimeout); + + const int i = WaitForMessage(m_client, waitTimeout); + if( isControlFlagSet( ControlFlag::TerminateThread ) || i < 0 ) { break; @@ -539,18 +544,18 @@ void VncConnection::handleConnection() else if (m_framebufferUpdateWatchdog.elapsed() >= qMax(2*m_framebufferUpdateInterval, m_framebufferUpdateWatchdogTimeout)) { - SendFramebufferUpdateRequest(m_client, 0, 0, m_client->width, m_client->height, false); + requestFrameufferUpdate(FramebufferUpdateType::Full); m_framebufferUpdateWatchdog.restart(); } else if (m_framebufferUpdateInterval > 0 && m_framebufferUpdateWatchdog.elapsed() > m_framebufferUpdateInterval) { - SendIncrementalFramebufferUpdateRequest(m_client); + requestFrameufferUpdate(FramebufferUpdateType::Incremental); m_framebufferUpdateWatchdog.restart(); } else if (isControlFlagSet(ControlFlag::TriggerFramebufferUpdate)) { setControlFlag(ControlFlag::TriggerFramebufferUpdate, false); - SendIncrementalFramebufferUpdateRequest(m_client); + requestFrameufferUpdate(FramebufferUpdateType::Incremental); } const auto remainingUpdateInterval = m_framebufferUpdateInterval - loopTimer.elapsed(); @@ -658,6 +663,24 @@ rfbBool VncConnection::initFrameBuffer( rfbClient* client ) +void VncConnection::requestFrameufferUpdate(FramebufferUpdateType updateType) +{ + if (isControlFlagSet(ControlFlag::SkipFramebufferUpdates) == false) + { + switch (updateType) + { + case FramebufferUpdateType::Incremental: + SendIncrementalFramebufferUpdateRequest(m_client); + break; + case FramebufferUpdateType::Full: + SendFramebufferUpdateRequest(m_client, 0, 0, m_client->width, m_client->height, false); + break; + } + } +} + + + void VncConnection::finishFrameBufferUpdate() { m_framebufferUpdateWatchdog.restart(); diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 28b4fc1df..59fc5a443 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -58,6 +58,12 @@ class VEYON_CORE_EXPORT VncConnection : public QThread Valid } ; + enum class FramebufferUpdateType + { + Full, + Incremental + }; + enum class State { None, @@ -120,6 +126,11 @@ class VEYON_CORE_EXPORT VncConnection : public QThread void setFramebufferUpdateInterval( int interval ); + void setSkipFramebufferUpdates(bool on) + { + setControlFlag(ControlFlag::SkipFramebufferUpdates, on); + } + void setSkipHostPing( bool on ) { setControlFlag( ControlFlag::SkipHostPing, on ); @@ -172,7 +183,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread DeleteAfterFinished = 0x10, SkipHostPing = 0x20, RequiresManualUpdateRateControl = 0x40, - TriggerFramebufferUpdate = 0x80 + TriggerFramebufferUpdate = 0x80, + SkipFramebufferUpdates = 0x100 }; ~VncConnection() override; @@ -187,6 +199,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread bool isControlFlagSet( ControlFlag flag ); rfbBool initFrameBuffer( rfbClient* client ); + void requestFrameufferUpdate(FramebufferUpdateType updateType); void finishFrameBufferUpdate(); void updateEncodingSettingsFromQuality(); From 2a804c0458bad99ccab0d811d9f5f4cc36253898 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Jan 2024 15:44:27 +0100 Subject: [PATCH 1543/1765] ComputerControlInterface: update state first --- core/src/ComputerControlInterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 10d44a7aa..984b22bb5 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -96,9 +96,9 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up Q_EMIT scaledFramebufferUpdated(); } ); + connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); connect(vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::setMinimumFramebufferUpdateInterval); connect(vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateServerVersion); - connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateState ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateUser ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateSessionInfo ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateActiveFeatures ); From 26fb7f6fbb6c2a7cc8978e1632100c6012ad175c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Jan 2024 15:44:57 +0100 Subject: [PATCH 1544/1765] ComputerControlInterface: add update mode FeatureControlOnly --- core/src/ComputerControlInterface.cpp | 10 +++++++++- core/src/ComputerControlInterface.h | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 984b22bb5..89f13a3e8 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -308,7 +308,7 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) if (vncConnection()) { - vncConnection()->setSkipHostPing(m_updateMode == UpdateMode::Basic); + vncConnection()->setSkipHostPing(m_updateMode == UpdateMode::Basic || m_updateMode == UpdateMode::FeatureControlOnly); } } @@ -348,6 +348,13 @@ void ComputerControlInterface::setMinimumFramebufferUpdateInterval() case UpdateMode::Live: break; + + case UpdateMode::FeatureControlOnly: + if (vncConnection()) + { + vncConnection()->setSkipFramebufferUpdates(true); + } + break; } if (vncConnection()) @@ -372,6 +379,7 @@ void ComputerControlInterface::setQuality() switch (m_updateMode) { case UpdateMode::Disabled: + case UpdateMode::FeatureControlOnly: quality = VncConnectionConfiguration::Quality::Lowest; break; diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 6a10d790c..2dc07c686 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -39,7 +39,8 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab Disabled, Basic, Monitoring, - Live + Live, + FeatureControlOnly, }; using Pointer = QSharedPointer; From 35a8a60e697ad63df1fc64ed93532a1bf078bb40 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Jan 2024 15:45:27 +0100 Subject: [PATCH 1545/1765] ComputerControlInterface: add mechanism for reading/writing custom properties While QObject::setProperty() could be used as well, this approach also introduces a signal allowing to react to property changes. --- core/src/ComputerControlInterface.cpp | 25 +++++++++++++++++++++++++ core/src/ComputerControlInterface.h | 7 +++++++ 2 files changed, 32 insertions(+) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 89f13a3e8..96a55f6b8 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -314,6 +314,31 @@ void ComputerControlInterface::setUpdateMode( UpdateMode updateMode ) +void ComputerControlInterface::setProperty(QUuid propertyId, const QVariant& data) +{ + if (propertyId.isNull() == false) + { + lock(); + m_properties[propertyId] = data; + unlock(); + + Q_EMIT propertyChanged(propertyId); + } +} + + + +QVariant ComputerControlInterface::queryProperty(QUuid propertyId) +{ + lock(); + const auto data = m_properties.value(propertyId); + unlock(); + + return data; +} + + + ComputerControlInterface::Pointer ComputerControlInterface::weakPointer() { return Pointer( this, []( ComputerControlInterface* ) { } ); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 2dc07c686..3b4ddb9e2 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -175,6 +175,10 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_updateMode; } + void setProperty(QUuid propertyId, const QVariant& data); + + QVariant queryProperty(QUuid propertyId); + Pointer weakPointer(); private: @@ -225,6 +229,8 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QStringList m_groups; + QMap m_properties; + Q_SIGNALS: void framebufferSizeChanged(); void framebufferUpdated( QRect rect ); @@ -234,6 +240,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab void screensChanged(); void stateChanged(); void activeFeaturesChanged(); + void propertyChanged(QUuid propertyId); }; From 833b9e4c95d60128fdf15f9cd003db6df0bc951b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Jan 2024 15:47:11 +0100 Subject: [PATCH 1546/1765] ComputerControlInterface: add executeIfConnected() helper --- core/src/ComputerControlInterface.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 3b4ddb9e2..2beab50e9 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -181,6 +181,17 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab Pointer weakPointer(); + template + void executeIfConnected(const T& functor) + { + connect(this, &ComputerControlInterface::stateChanged, this, [this, functor]() { + if (state() == State::Connected) + { + functor(); + } + }); + } + private: void ping(); void setMinimumFramebufferUpdateInterval(); From 2c366bfc708d4038cc9666a251f2e0b0a836c057 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 23 Jan 2024 15:50:05 +0100 Subject: [PATCH 1547/1765] Configurator: don't show standard widgets explicitly --- configurator/src/MainWindow.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index 13fc5bf86..4172a16b4 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -303,10 +303,6 @@ void MainWindow::switchToStandardView() { widget->hide(); } - else if( flags & Configuration::Property::Flag::Standard ) - { - widget->show(); - } else if( flags & Configuration::Property::Flag::Advanced ) { widget->hide(); From e4c1c98dae9e06a949cf7c51b911460a9d91b60b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jan 2024 09:39:50 +0100 Subject: [PATCH 1548/1765] Master: update splash for 2024 --- master/resources/splash.png | Bin 5495 -> 10768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/master/resources/splash.png b/master/resources/splash.png index 4f85df2b49042d840399f4cfe911722727a82c67..d9a9493ec8dc9bcef930079c70c60f8e1f549c8b 100644 GIT binary patch literal 10768 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 QS`kFg6*Uw}<;`FJ8=lPPjQ{`u literal 5495 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 Hp<@39V_eCP From 201838b6c940543445d5e9620b948055f367b4bb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jan 2024 13:10:30 +0100 Subject: [PATCH 1549/1765] AccessControlPage: define maximum size for groups groupbox For some reason Qt 6.x gets stuck in an infinite resize/layout update loop if both groupboxes are expanding and the page is embedded in a scrollable container. Closes #901. --- configurator/src/AccessControlPage.ui | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configurator/src/AccessControlPage.ui b/configurator/src/AccessControlPage.ui index 184ffbb22..c88cd0e18 100644 --- a/configurator/src/AccessControlPage.ui +++ b/configurator/src/AccessControlPage.ui @@ -108,6 +108,12 @@ false + + + 16777215 + 400 + + User groups authorized for computer access From d050522ca95ce06b0c7c6b626f05f8b2e18890f2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jan 2024 14:37:45 +0100 Subject: [PATCH 1550/1765] NetworkObjectDirectory: fix child object change propagations --- core/src/NetworkObjectDirectory.cpp | 18 ++++++++---------- core/src/NetworkObjectDirectory.h | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index c2aa1e3c6..5ceb1f5b6 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -289,12 +289,12 @@ void NetworkObjectDirectory::addOrUpdateObject( const NetworkObject& networkObje Q_EMIT objectsInserted(); - propagateChildObjectChange(parent.modelId(), objectList.count()); + propagateChildObjectChange(parent.modelId()); } else if( objectList[index].exactMatch( completeNetworkObject ) == false ) { objectList.replace( index, completeNetworkObject ); - propagateChildObjectChange(parent.modelId(), index); + propagateChildObjectChange(parent.modelId()); } } @@ -371,16 +371,14 @@ void NetworkObjectDirectory::setObjectPopulated( const NetworkObject& networkObj -void NetworkObjectDirectory::propagateChildObjectChange(NetworkObject::ModelId objectId, int childIndex) +void NetworkObjectDirectory::propagateChildObjectChange(NetworkObject::ModelId objectId) { - while (objectId != 0) + if (objectId != 0) { - Q_EMIT objectChanged(objectId, childIndex); + const auto parentObjectId = parentId(objectId); + const auto childIndex = index(parentObjectId, objectId); + Q_EMIT objectChanged(parentObjectId, childIndex); - const auto newObjectId = parentId(objectId); - childIndex = index(newObjectId, objectId); - objectId = newObjectId; + propagateChildObjectChange(parentObjectId); } - - Q_EMIT objectChanged(rootId(), childIndex); } diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index d4668a495..5be2898a0 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -80,7 +80,7 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject void removeObjects( const NetworkObject& parent, const NetworkObjectFilter& removeObjectFilter ); void replaceObjects( const NetworkObjectList& objects, const NetworkObject& parent ); void setObjectPopulated( const NetworkObject& networkObject ); - void propagateChildObjectChange(NetworkObject::ModelId objectId, int childIndex); + void propagateChildObjectChange(NetworkObject::ModelId objectId); private: const QString m_name; From c79d40021e1facb7f7bfd2bdd1d51315b2d37e67 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 24 Jan 2024 14:38:24 +0100 Subject: [PATCH 1551/1765] NetworkObjectDirectory: propagate child object change on remove --- core/src/NetworkObjectDirectory.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index 5ceb1f5b6..4b69b5219 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -323,6 +323,7 @@ void NetworkObjectDirectory::removeObjects( const NetworkObject& parent, const N Q_EMIT objectsAboutToBeRemoved(parent.modelId(), index, 1); it = objectList.erase( it ); Q_EMIT objectsRemoved(); + propagateChildObjectChange(parent.modelId()); } else { From c528ce67c308b070fafa5e1ec6f77a22cab2a32c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 8 Feb 2024 09:22:05 +0100 Subject: [PATCH 1552/1765] CI: add Ubuntu 23.10 First stable Debian-based distribution with Qt6 builds. --- .ci/linux.ubuntu.mantic/Dockerfile | 22 ++++++++++++++++++++++ .ci/linux.ubuntu.mantic/script.sh | 8 ++++++++ .gitlab-ci.yml | 1 + 3 files changed, 31 insertions(+) create mode 100644 .ci/linux.ubuntu.mantic/Dockerfile create mode 100755 .ci/linux.ubuntu.mantic/script.sh diff --git a/.ci/linux.ubuntu.mantic/Dockerfile b/.ci/linux.ubuntu.mantic/Dockerfile new file mode 100644 index 000000000..bb06adaef --- /dev/null +++ b/.ci/linux.ubuntu.mantic/Dockerfile @@ -0,0 +1,22 @@ +FROM ubuntu:mantic +MAINTAINER Tobias Junghans + +RUN \ + apt-get update && \ + apt-get install --no-install-recommends -y \ + dpkg-dev \ + ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ + qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-declarative-dev qt6-httpserver-dev qt6-webengine-dev \ + xorg-dev \ + libfakekey-dev \ + libvncserver-dev \ + libssl-dev \ + libpam0g-dev \ + libproc2-dev \ + libldap2-dev \ + libsasl2-dev \ + libqca-qt6-dev libqca-qt6-plugins \ + libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ + && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.ubuntu.mantic/script.sh b/.ci/linux.ubuntu.mantic/script.sh new file mode 100755 index 000000000..20f76df9e --- /dev/null +++ b/.ci/linux.ubuntu.mantic/script.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=ubuntu.mantic" + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 157ab9b6f..a50669f17 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,6 +21,7 @@ build-linux: - opensuse.tumbleweed - ubuntu.focal - ubuntu.jammy + - ubuntu.mantic artifacts: paths: [ "veyon*" ] expire_in: 1 day From 453facc7c2bffcf6cc9941aae3863099d19198cc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 9 Feb 2024 08:59:08 +0100 Subject: [PATCH 1553/1765] GHA: migrate to CodeQL Action v2 --- .github/workflows/codeql-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4646990bc..c7fffe687 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -27,7 +27,7 @@ jobs: submodules: true - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} @@ -57,4 +57,4 @@ jobs: ninja - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 From 5e5d115b2652403b37b5d06249b78fce6ea4d6c2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Feb 2024 10:51:01 +0100 Subject: [PATCH 1554/1765] WindowsCoreFunctions: add MaximumEnvironmentBlockSize --- plugins/platform/windows/WindowsCoreFunctions.cpp | 5 ++--- plugins/platform/windows/WindowsCoreFunctions.h | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index bfc2c1456..b6e952da7 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -615,18 +615,17 @@ bool WindowsCoreFunctions::terminateProcess( ProcessId processId, DWORD timeout wchar_t* WindowsCoreFunctions::appendToEnvironmentBlock( const wchar_t* env, const QStringList& strings ) { - static constexpr auto MaximumEnvironmentSize = 1024*1024; static constexpr auto MaximumExtraStringsLength = 1024*1024; size_t envPos = 0; - while( envPos < MaximumEnvironmentSize-1 && !(env[envPos] == 0 && env[envPos+1] == 0) ) + while (envPos < MaximumEnvironmentBlockSize-1 && !(env[envPos] == 0 && env[envPos+1] == 0)) { ++envPos; } ++envPos; - if( envPos >= MaximumEnvironmentSize-1 ) + if (envPos >= MaximumEnvironmentBlockSize-1) { return nullptr; } diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index f9b67ef60..454edb5d4 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -87,6 +87,8 @@ class WindowsCoreFunctions : public PlatformCoreFunctions static constexpr DWORD DefaultProcessTerminationTimeout = 5000; static constexpr size_t ScreenSaverSettingsCount = 3; + static constexpr auto MaximumEnvironmentBlockSize = 1024*1024; + static constexpr auto ShutdownFlags = SHUTDOWN_FORCE_OTHERS | SHUTDOWN_FORCE_SELF; static constexpr auto ShutdownReason = SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_FLAG_PLANNED; From 12ec10029308aa5ac3c58baa03804b21ed7c0a96 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Feb 2024 10:52:14 +0100 Subject: [PATCH 1555/1765] WindowsCoreFunctions: add queryProcessEnvironmentVariables() --- .../platform/windows/WindowsCoreFunctions.cpp | 47 +++++++++++++++++++ .../platform/windows/WindowsCoreFunctions.h | 2 + 2 files changed, 49 insertions(+) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index b6e952da7..72cad24a3 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -591,6 +591,53 @@ HANDLE WindowsCoreFunctions::runProgramInSession( const QString& program, +QStringList WindowsCoreFunctions::queryProcessEnvironmentVariables(DWORD processId) +{ + const auto processHandle = OpenProcess(PROCESS_QUERY_INFORMATION, false, processId); + if (processHandle == nullptr) + { + vCritical() << "OpenProcess()" << GetLastError(); + return {}; + } + + HANDLE processToken = nullptr; + if (OpenProcessToken(processHandle, MAXIMUM_ALLOWED, &processToken ) == false) + { + vCritical() << "OpenProcessToken()" << GetLastError(); + CloseHandle(processHandle); + return {}; + } + + LPVOID envBlock = nullptr; + if (CreateEnvironmentBlock(&envBlock, processToken, false) == false || + envBlock == nullptr) + { + vCritical() << "CreateEnvironmentBlock()" << GetLastError(); + CloseHandle(processHandle); + CloseHandle(processToken); + return {}; + } + + const auto env = reinterpret_cast(envBlock); + size_t envPos = 0; + size_t envCurVarStart = 0; + + QStringList envVars; + while (envPos < MaximumEnvironmentBlockSize-1 && !(env[envPos] == 0 && env[envPos+1] == 0)) + { + if (env[envPos] == 0) + { + envVars.append(QString::fromWCharArray(env + envCurVarStart)); + envCurVarStart = envPos+1; + } + ++envPos; + } + + return envVars; +} + + + bool WindowsCoreFunctions::terminateProcess( ProcessId processId, DWORD timeout ) { if( processId != WtsSessionManager::InvalidProcess ) diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index 454edb5d4..3edc8a307 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -80,6 +80,8 @@ class WindowsCoreFunctions : public PlatformCoreFunctions DWORD baseProcessId, const QString& desktop ); + static QStringList queryProcessEnvironmentVariables(DWORD processId); + static bool terminateProcess( ProcessId processId, DWORD timeout = DefaultProcessTerminationTimeout ); private: From e049dd6213abdd2728a91d1b38c9beabe60af384 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Feb 2024 10:55:42 +0100 Subject: [PATCH 1556/1765] WindowsCoreFunctions: add nullptr check in appendToEnvironmentBlock() --- plugins/platform/windows/WindowsCoreFunctions.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 72cad24a3..be6b924b3 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -662,6 +662,11 @@ bool WindowsCoreFunctions::terminateProcess( ProcessId processId, DWORD timeout wchar_t* WindowsCoreFunctions::appendToEnvironmentBlock( const wchar_t* env, const QStringList& strings ) { + if (env == nullptr) + { + return nullptr; + } + static constexpr auto MaximumExtraStringsLength = 1024*1024; size_t envPos = 0; From 5f4135d456e858d235e46d540907ca8550c0a213 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Feb 2024 10:56:31 +0100 Subject: [PATCH 1557/1765] WtsSessionManager: add optional sessionId param to findProcessId() --- plugins/platform/windows/WtsSessionManager.cpp | 7 ++++++- plugins/platform/windows/WtsSessionManager.h | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 828b0047c..1a5a1df8f 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -287,7 +287,7 @@ WtsSessionManager::ProcessId WtsSessionManager::findUserProcessId( const QString -WtsSessionManager::ProcessId WtsSessionManager::findProcessId( const QString& processName ) +WtsSessionManager::ProcessId WtsSessionManager::findProcessId(const QString& processName, SessionId sessionId) { PWTS_PROCESS_INFO processInfo = nullptr; DWORD processCount = 0; @@ -306,6 +306,11 @@ WtsSessionManager::ProcessId WtsSessionManager::findProcessId( const QString& pr continue; } + if (sessionId != InvalidSession && processInfo[proc].SessionId != sessionId) + { + continue; + } + if( processName.compare( QString::fromWCharArray( processInfo[proc].pProcessName ), Qt::CaseInsensitive ) == 0 ) { pid = processInfo[proc].ProcessId; diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index fcd3813cd..b2c885b4e 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -60,6 +60,6 @@ class WtsSessionManager static ProcessId findWinlogonProcessId( SessionId sessionId ); static ProcessId findUserProcessId( const QString& userName ); - static ProcessId findProcessId( const QString& processName ); + static ProcessId findProcessId(const QString& processName, SessionId sessionId = InvalidSession); } ; From b2e49ab2f4c0b2841e0ada80ce96aeb2501e02cb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Feb 2024 10:57:18 +0100 Subject: [PATCH 1558/1765] WtsSessionManager: drop findWinlogonProcessId() Use findProcessId() with new sessionId parameter instead. --- .../platform/windows/WindowsServiceCore.cpp | 2 +- .../platform/windows/WtsSessionManager.cpp | 41 ------------------- plugins/platform/windows/WtsSessionManager.h | 1 - 3 files changed, 1 insertion(+), 43 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index 847399b3c..d8851c21c 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -50,7 +50,7 @@ class VeyonServerProcess void start( DWORD wtsSessionId, const ServiceDataManager::Token& token ) { - const auto baseProcessId = WtsSessionManager::findWinlogonProcessId( wtsSessionId ); + const auto baseProcessId = WtsSessionManager::findProcessId(QStringLiteral("winlogon.exe"), wtsSessionId); const auto user = WtsSessionManager::querySessionInformation( wtsSessionId, WtsSessionManager::SessionInfo::UserName ); const QStringList extraEnv{ diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 1a5a1df8f..d4febdfc9 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -197,47 +197,6 @@ bool WtsSessionManager::isRemote( SessionId sessionId ) -WtsSessionManager::ProcessId WtsSessionManager::findWinlogonProcessId( SessionId sessionId ) -{ - if( sessionId == InvalidSession ) - { - vCritical() << "called with invalid session ID"; - return InvalidProcess; - } - - PWTS_PROCESS_INFO processInfo = nullptr; - DWORD processCount = 0; - - if( WTSEnumerateProcesses( WTS_CURRENT_SERVER_HANDLE, 0, 1, &processInfo, &processCount ) == false ) - { - return InvalidProcess; - } - - auto pid = InvalidProcess; - const auto processName = QStringLiteral("winlogon.exe"); - - for( DWORD proc = 0; proc < processCount; ++proc ) - { - if( processInfo[proc].ProcessId == 0 ) - { - continue; - } - - if( processName.compare( QString::fromWCharArray( processInfo[proc].pProcessName ), Qt::CaseInsensitive ) == 0 && - sessionId == processInfo[proc].SessionId ) - { - pid = processInfo[proc].ProcessId; - break; - } - } - - WTSFreeMemory( processInfo ); - - return pid; -} - - - WtsSessionManager::ProcessId WtsSessionManager::findUserProcessId( const QString& userName ) { DWORD sidLen = SECURITY_MAX_SID_SIZE; // Flawfinder: ignore diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index b2c885b4e..9dc4c6442 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -58,7 +58,6 @@ class WtsSessionManager static QString querySessionInformation( SessionId sessionId, SessionInfo sessionInfo ); static bool isRemote( SessionId sessionId ); - static ProcessId findWinlogonProcessId( SessionId sessionId ); static ProcessId findUserProcessId( const QString& userName ); static ProcessId findProcessId(const QString& processName, SessionId sessionId = InvalidSession); From 40680cd63d5b5a8fbbd028640a4339c6089a0502 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Feb 2024 11:01:21 +0100 Subject: [PATCH 1559/1765] Windows: drop unused headers --- plugins/platform/windows/WindowsServiceCore.cpp | 3 ++- plugins/platform/windows/WindowsUserFunctions.cpp | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index d8851c21c..4505ffc43 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -30,7 +30,6 @@ #include "Filesystem.h" #include "WindowsServiceCore.h" #include "SasEventListener.h" -#include "PlatformUserFunctions.h" #include "VeyonConfiguration.h" #include "WindowsCoreFunctions.h" #include "WindowsInputDeviceFunctions.h" @@ -386,6 +385,8 @@ void WindowsServiceCore::serviceMain() DWORD WindowsServiceCore::serviceCtrl( DWORD ctrlCode, DWORD eventType, LPVOID eventData, LPVOID context ) { + Q_UNUSED(context); + static const QMap controlMessages{ { SERVICE_CONTROL_SHUTDOWN, "SHUTDOWN" }, { SERVICE_CONTROL_STOP, "STOP" }, diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 4b7e345df..03e502d5f 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -27,14 +27,10 @@ #include #include "DesktopInputController.h" -#include "VariantStream.h" #include "VeyonConfiguration.h" -#include "VeyonServerInterface.h" #include "WindowsCoreFunctions.h" #include "WindowsInputDeviceFunctions.h" #include "WindowsPlatformConfiguration.h" -#include "WindowsServiceControl.h" -#include "WindowsServiceCore.h" #include "WindowsUserFunctions.h" #include "WtsSessionManager.h" From 952423d2d121aef6d6814358439e5fdabb0e737b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 15 Feb 2024 13:58:47 +0100 Subject: [PATCH 1560/1765] PlatformSessionFunctions: add currentSessionEnvironmentVariables() --- core/src/PlatformSessionFunctions.h | 3 +++ .../platform/linux/LinuxSessionFunctions.cpp | 21 +++++++++++++++++++ .../platform/linux/LinuxSessionFunctions.h | 2 ++ .../windows/WindowsSessionFunctions.cpp | 21 +++++++++++++++++++ .../windows/WindowsSessionFunctions.h | 2 ++ 5 files changed, 49 insertions(+) diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 77278385c..23f486acd 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -33,6 +33,7 @@ class PlatformSessionFunctions public: using SessionId = int; using SessionUptime = int; + using EnvironmentVariables = QMap; struct SessionInfo { SessionId id = InvalidSessionId; @@ -71,4 +72,6 @@ class PlatformSessionFunctions virtual bool currentSessionHasUser() const = 0; virtual bool currentSessionIsRemote() const = 0; + virtual EnvironmentVariables currentSessionEnvironmentVariables() const = 0; + }; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 82d98fdfb..f6f2791ce 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -103,6 +103,27 @@ bool LinuxSessionFunctions::currentSessionIsRemote() const +LinuxSessionFunctions::EnvironmentVariables LinuxSessionFunctions::currentSessionEnvironmentVariables() const +{ + const auto sessionLeader = getSessionLeaderPid(currentSessionPath()); + auto sessionEnv = getSessionEnvironment(sessionLeader); + if (sessionEnv.isEmpty()) + { + sessionEnv = QProcessEnvironment::systemEnvironment(); + } + const auto sessionEnvVars = sessionEnv.keys(); + + EnvironmentVariables envVars; + for (const auto& sessionEnvVar : sessionEnvVars) + { + envVars[sessionEnvVar] = sessionEnv.value(sessionEnvVar); + } + + return envVars; +} + + + QStringList LinuxSessionFunctions::listSessions() { QStringList sessions; diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index 0f4458af5..b30327691 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -90,6 +90,8 @@ class LinuxSessionFunctions : public PlatformSessionFunctions bool currentSessionHasUser() const override; bool currentSessionIsRemote() const override; + EnvironmentVariables currentSessionEnvironmentVariables() const override; + static QStringList listSessions(); static QVariant getSessionProperty(const QString& session, const QString& property, bool logErrors = true); diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 3b3757063..142ee5dbf 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -24,6 +24,7 @@ #include +#include "WindowsCoreFunctions.h" #include "PlatformSessionManager.h" #include "WindowsSessionFunctions.h" #include "WtsSessionManager.h" @@ -98,3 +99,23 @@ bool WindowsSessionFunctions::currentSessionHasUser() const return WtsSessionManager::querySessionInformation( WtsSessionManager::currentSession(), WtsSessionManager::SessionInfo::UserName ).isEmpty() == false; } + + + +PlatformSessionFunctions::EnvironmentVariables WindowsSessionFunctions::currentSessionEnvironmentVariables() const +{ + const auto processId = WtsSessionManager::findProcessId(QStringLiteral("explorer.exe"), WtsSessionManager::currentSession()); + const auto envStrings = WindowsCoreFunctions::queryProcessEnvironmentVariables(processId); + + EnvironmentVariables environmentVariables; + for (const auto& envString : envStrings) + { + const auto envStringParts = envString.split(QLatin1Char('=')); + if (envStringParts.size() >= 2) + { + environmentVariables[envStringParts.at(0)] = envStringParts.mid(1).join(QLatin1Char('=')); + } + } + + return environmentVariables; +} diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index b89d8b76e..3677ad4f0 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -42,4 +42,6 @@ class WindowsSessionFunctions : public PlatformSessionFunctions bool currentSessionHasUser() const override; bool currentSessionIsRemote() const override; + EnvironmentVariables currentSessionEnvironmentVariables() const override; + }; From 8e2a596c2d12f45bb7ef65b0343d6f4442f236aa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Feb 2024 13:31:20 +0100 Subject: [PATCH 1561/1765] PlatformSessionFunctions: add querySettingsValueInCurrentSession() --- core/src/PlatformSessionFunctions.h | 1 + .../platform/linux/LinuxSessionFunctions.cpp | 9 +++++ .../platform/linux/LinuxSessionFunctions.h | 1 + .../windows/WindowsSessionFunctions.cpp | 37 +++++++++++++++++++ .../windows/WindowsSessionFunctions.h | 1 + 5 files changed, 49 insertions(+) diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 23f486acd..ecf18ca02 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -73,5 +73,6 @@ class PlatformSessionFunctions virtual bool currentSessionIsRemote() const = 0; virtual EnvironmentVariables currentSessionEnvironmentVariables() const = 0; + virtual QVariant querySettingsValueInCurrentSession(const QString& key) const = 0; }; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index f6f2791ce..3c5d69769 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -22,10 +22,12 @@ * */ +#include #include #include #include #include +#include #ifdef HAVE_LIBPROCPS #include @@ -124,6 +126,13 @@ LinuxSessionFunctions::EnvironmentVariables LinuxSessionFunctions::currentSessio +QVariant LinuxSessionFunctions::querySettingsValueInCurrentSession(const QString& key) const +{ + return QSettings(QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()).value(key); +} + + + QStringList LinuxSessionFunctions::listSessions() { QStringList sessions; diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index b30327691..dcdffba11 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -91,6 +91,7 @@ class LinuxSessionFunctions : public PlatformSessionFunctions bool currentSessionIsRemote() const override; EnvironmentVariables currentSessionEnvironmentVariables() const override; + QVariant querySettingsValueInCurrentSession(const QString& key) const override; static QStringList listSessions(); diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 142ee5dbf..462aa9b31 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -22,7 +22,11 @@ * */ +#include + +#include #include +#include #include "WindowsCoreFunctions.h" #include "PlatformSessionManager.h" @@ -119,3 +123,36 @@ PlatformSessionFunctions::EnvironmentVariables WindowsSessionFunctions::currentS return environmentVariables; } + + + +QVariant WindowsSessionFunctions::querySettingsValueInCurrentSession(const QString& key) const +{ + if (key.startsWith(QLatin1String("HKEY"))) + { + HANDLE userToken = nullptr; + const auto sessionId = WtsSessionManager::currentSession(); + if (WTSQueryUserToken(sessionId, &userToken) == false) + { + vCritical() << "could not query user token for session" << sessionId; + return {}; + } + + if (ImpersonateLoggedOnUser(userToken) == false) + { + vCritical() << "could not impersonate session user"; + return {}; + } + + const auto keyParts = key.split(QLatin1Char('\\')); + const auto value = QSettings(keyParts.mid(0, keyParts.length()-1).join(QLatin1Char('\\')), QSettings::NativeFormat) + .value(keyParts.constLast()); + + RevertToSelf(); + CloseHandle(userToken); + + return value; + } + + return QSettings(QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()).value(key); +} diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index 3677ad4f0..5b0497e03 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -43,5 +43,6 @@ class WindowsSessionFunctions : public PlatformSessionFunctions bool currentSessionIsRemote() const override; EnvironmentVariables currentSessionEnvironmentVariables() const override; + QVariant querySettingsValueInCurrentSession(const QString& key) const override; }; From 5d56add877f56120f6937c69d8fdb2c5cd738c38 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Feb 2024 13:32:46 +0100 Subject: [PATCH 1562/1765] WtsSessionManager: add queryUserSid() --- .../platform/windows/WtsSessionManager.cpp | 49 +++++++++++++++++++ plugins/platform/windows/WtsSessionManager.h | 2 + 2 files changed, 51 insertions(+) diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index d4febdfc9..a275378c2 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include @@ -176,6 +177,54 @@ QString WtsSessionManager::querySessionInformation(SessionId sessionId, SessionI +QString WtsSessionManager::queryUserSid(SessionId sessionId) +{ + HANDLE userToken = nullptr; + if (WTSQueryUserToken(sessionId, &userToken) == false) + { + vCritical() << "could not query user token for session" << sessionId; + return {}; + } + + DWORD tokenSize = 0; + if (GetTokenInformation(userToken, TokenUser, nullptr, 0, &tokenSize) || + tokenSize == 0 || + GetLastError() != ERROR_INSUFFICIENT_BUFFER) + { + CloseHandle(userToken); + return {}; + } + + const auto userInfo = reinterpret_cast(HeapAlloc(GetProcessHeap(), 0, tokenSize)); + if (!userInfo) + { + CloseHandle(userToken); + return {}; + } + + if (!GetTokenInformation(userToken, TokenUser, userInfo, tokenSize, &tokenSize)) + { + HeapFree(GetProcessHeap(), 0, userInfo); + CloseHandle(userToken); + return {}; + } + + QString sid; + wchar_t* stringSid = nullptr; + if (ConvertSidToStringSid(userInfo->User.Sid, &stringSid) && stringSid) + { + sid = QString::fromWCharArray(stringSid); + LocalFree(stringSid); + } + + HeapFree(GetProcessHeap(), 0, userInfo); + CloseHandle(userToken); + + return sid; +} + + + bool WtsSessionManager::isRemote( SessionId sessionId ) { const auto WTSIsRemoteSession = static_cast(29); diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index 9dc4c6442..fc23aea67 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -56,6 +56,8 @@ class WtsSessionManager static SessionList activeSessions(); static QString querySessionInformation( SessionId sessionId, SessionInfo sessionInfo ); + static QString queryUserSid(SessionId sessionId); + static bool isRemote( SessionId sessionId ); static ProcessId findUserProcessId( const QString& userName ); From 30cde866679e63dd77265ae49e73123fcef8bb9b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Feb 2024 13:54:27 +0100 Subject: [PATCH 1563/1765] CI: drop Fedora 37 and add Fedora 39 Fedora 37 is EOL as of 2023-12-05. --- .ci/{linux.fedora.37 => linux.fedora.39}/Dockerfile | 8 ++++---- .ci/{linux.fedora.37 => linux.fedora.39}/script.sh | 2 +- .gitlab-ci.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) rename .ci/{linux.fedora.37 => linux.fedora.39}/Dockerfile (71%) rename .ci/{linux.fedora.37 => linux.fedora.39}/script.sh (57%) diff --git a/.ci/linux.fedora.37/Dockerfile b/.ci/linux.fedora.39/Dockerfile similarity index 71% rename from .ci/linux.fedora.37/Dockerfile rename to .ci/linux.fedora.39/Dockerfile index 1f80dbe4f..e8a081d3f 100644 --- a/.ci/linux.fedora.37/Dockerfile +++ b/.ci/linux.fedora.39/Dockerfile @@ -1,11 +1,11 @@ -FROM fedora:37 +FROM fedora:39 MAINTAINER Tobias Junghans RUN \ - dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-37.noarch.rpm && \ + dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-39.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ - qt5-qtbase-devel qt5-qtbase-private-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebengine-devel \ + qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel qt6-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ @@ -13,7 +13,7 @@ RUN \ openssl-devel \ pam-devel \ procps-devel \ - qca-qt5-devel qca-qt5-ossl \ + qca-qt6-devel qca-qt6-ossl \ ffmpeg-devel \ cyrus-sasl-devel \ openldap-devel diff --git a/.ci/linux.fedora.37/script.sh b/.ci/linux.fedora.39/script.sh similarity index 57% rename from .ci/linux.fedora.37/script.sh rename to .ci/linux.fedora.39/script.sh index 514416630..42b4c5119 100755 --- a/.ci/linux.fedora.37/script.sh +++ b/.ci/linux.fedora.39/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.37" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=fedora.39" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a50669f17..0f3fb7185 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,8 +14,8 @@ build-linux: - debian.buster - debian.bullseye - debian.bookworm - - fedora.37 - fedora.38 + - fedora.39 - opensuse.15.4 - opensuse.15.5 - opensuse.tumbleweed From 81d7cc0b9aa4c95e023f07149a2e698fcaaaf9b4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Feb 2024 14:43:28 +0100 Subject: [PATCH 1564/1765] GHA: bump to Fedora 39 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3141515a4..4549a2a04 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ jobs: matrix: dist: - debian.bookworm - - fedora.38 + - fedora.39 - opensuse.tumbleweed - ubuntu.focal runs-on: ubuntu-latest From aec8c95fc081cc91568a71e34058ebc83c6b905d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 16 Feb 2024 15:10:11 +0100 Subject: [PATCH 1565/1765] CI: don't install qt6*private*devel For Qt 6 based builds we can rely on Qt HttpServer so no need to build it on our own (which requires Qt's private headers). --- .ci/linux.fedora.38/Dockerfile | 2 +- .ci/linux.opensuse.tumbleweed/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/linux.fedora.38/Dockerfile b/.ci/linux.fedora.38/Dockerfile index aaef320b2..9da97070a 100644 --- a/.ci/linux.fedora.38/Dockerfile +++ b/.ci/linux.fedora.38/Dockerfile @@ -5,7 +5,7 @@ RUN \ dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-38.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ - qt6-qtbase-devel qt6-qtbase-private-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qtwebengine-devel \ + qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel qt6-qtwebengine-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ diff --git a/.ci/linux.opensuse.tumbleweed/Dockerfile b/.ci/linux.opensuse.tumbleweed/Dockerfile index 7284aa48f..2c7ff3c51 100644 --- a/.ci/linux.opensuse.tumbleweed/Dockerfile +++ b/.ci/linux.opensuse.tumbleweed/Dockerfile @@ -3,7 +3,7 @@ MAINTAINER Tobias Junghans RUN \ zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ - qt6-widgets-devel qt6-widgets-private-devel qt6-concurrent-devel qt6-linguist-devel qt6-tools-devel qt6-quickcontrols2-devel qt6-webenginewidgets-devel qt6-httpserver-devel \ + qt6-widgets-devel qt6-qt5compat-devel qt6-concurrent-devel qt6-linguist-devel qt6-tools-devel qt6-quickcontrols2-devel qt6-webenginewidgets-devel qt6-httpserver-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg8-devel \ From d91730b65833fc6768f14d349e96a7872daa4538 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 19 Feb 2024 16:18:37 +0100 Subject: [PATCH 1566/1765] Convert temporary QRegularExpressions to static const objects No need to evaluate the expression each time it's used. --- core/src/Configuration/LocalStore.cpp | 3 ++- core/src/Screenshot.cpp | 4 ++-- core/src/TranslationLoader.cpp | 4 ++-- core/src/VncClientProtocol.cpp | 4 ++-- core/src/VncConnection.cpp | 19 +++++++++++++------ core/src/VncServerProtocol.cpp | 4 ++-- plugins/authkeys/AuthKeysManager.cpp | 7 ++++--- .../BuiltinDirectoryPlugin.cpp | 3 ++- plugins/ldap/common/LdapConfigurationPage.cpp | 6 ++++-- plugins/platform/linux/LinuxUserFunctions.cpp | 4 ++-- 10 files changed, 35 insertions(+), 23 deletions(-) diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index 6572f6e1b..49a37b8bd 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -63,7 +63,8 @@ static void loadSettingsTree( Object *obj, QSettings *s, for( const auto& k : childKeys ) { const auto stringValue = s->value( k ).toString(); - const auto jsonValueMatch = QRegularExpression( QStringLiteral("^@JsonValue(\\(.*\\))$") ).match( stringValue ); + static const QRegularExpression jsonValueRX(QStringLiteral("^@JsonValue(\\(.*\\))$")); + const auto jsonValueMatch = jsonValueRX.match(stringValue); if( jsonValueMatch.hasMatch() ) { diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index 25cffc872..44149fba9 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -154,8 +154,8 @@ void Screenshot::take( const ComputerControlInterface::Pointer& computerControlI QString Screenshot::constructFileName( const QString& user, const QString& hostAddress, QDate date, QTime time ) { - const auto userSimplified = VeyonCore::stripDomain( user ).toLower().remove( - QRegularExpression( QStringLiteral("[^a-z0-9.]") ) ); + static const QRegularExpression nonAllowedCharsRX{QStringLiteral("[^a-z0-9.]")}; + const auto userSimplified = VeyonCore::stripDomain(user).toLower().remove(nonAllowedCharsRX); return QStringLiteral( "%1_%2_%3_%4.png" ).arg( userSimplified, hostAddress, diff --git a/core/src/TranslationLoader.cpp b/core/src/TranslationLoader.cpp index 3a24d6a15..d64b06744 100644 --- a/core/src/TranslationLoader.cpp +++ b/core/src/TranslationLoader.cpp @@ -42,8 +42,8 @@ bool TranslationLoader::load( const QString& resourceName ) { QLocale configuredLocale( QLocale::C ); - const auto configuredLocaleMatch = QRegularExpression{ QStringLiteral( "[^(]*\\(([^)]*)\\)") } - .match( VeyonCore::config().uiLanguage() ); + static const QRegularExpression configuredLocaleRX{QStringLiteral( "[^(]*\\(([^)]*)\\)")}; + const auto configuredLocaleMatch = configuredLocaleRX.match(VeyonCore::config().uiLanguage()); if( configuredLocaleMatch.hasMatch() ) { configuredLocale = QLocale( configuredLocaleMatch.captured( 1 ) ); diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 3655db84d..ce612518f 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -236,8 +236,8 @@ bool VncClientProtocol::readProtocol() return false; } - const auto match = QRegularExpression{ QStringLiteral("RFB (\\d\\d\\d)\\.(\\d\\d\\d)\n") } - .match( QString::fromUtf8( protocol ) ); + static const QRegularExpression rfbRX{QStringLiteral("RFB (\\d\\d\\d)\\.(\\d\\d\\d)\n")}; + const auto match = rfbRX.match(QString::fromUtf8(protocol)); if( match.hasMatch() == false || match.captured( 1 ).toInt() != 3 || diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index c25a4d8e8..f84423eef 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -148,18 +148,25 @@ void VncConnection::setHost( const QString& host ) QMutexLocker locker( &m_globalMutex ); m_host = host; + static const QRegularExpression ipv6MappedRX1{QStringLiteral("^::[fF]{4}:(\\d+.\\d+.\\d+.\\d+)$")}; + static const QRegularExpression ipv6MappedRX2{QStringLiteral("^::[fF]{4}:(\\d+.\\d+.\\d+.\\d+):(\\d+)$")}; + static const QRegularExpression ipv6MappedRX3{QStringLiteral("^\\[::[fF]{4}:(\\d+.\\d+.\\d+.\\d+)\\]:(\\d+)$")}; + static const QRegularExpression ipv6WithPortRX{QStringLiteral("^\\[([0-9a-fA-F:]+)\\]:(\\d+)$")}; + static const QRegularExpression ipv6IrregularWithPortRX{QStringLiteral("^([0-9a-fA-F:]+):(\\d{5})$"), QRegularExpression::InvertedGreedinessOption}; + static const QRegularExpression anyWithPortRX{QStringLiteral("^([^:]+):(\\d+)$")}; + QRegularExpressionMatch match; if( // if IPv6-mapped IPv4 address use plain IPv4 address as libvncclient cannot handle IPv6-mapped IPv4 addresses on Windows properly - ( match = QRegularExpression( QStringLiteral("^::[fF]{4}:(\\d+.\\d+.\\d+.\\d+)$") ).match( m_host ) ).hasMatch() || - ( match = QRegularExpression( QStringLiteral("^::[fF]{4}:(\\d+.\\d+.\\d+.\\d+):(\\d+)$") ).match( m_host ) ).hasMatch() || - ( match = QRegularExpression( QStringLiteral("^\\[::[fF]{4}:(\\d+.\\d+.\\d+.\\d+)\\]:(\\d+)$") ).match( m_host ) ).hasMatch() || + (match = ipv6MappedRX1.match(m_host)).hasMatch() || + (match = ipv6MappedRX2.match(m_host)).hasMatch() || + (match = ipv6MappedRX3.match(m_host)).hasMatch() || // any other IPv6 address with port number - ( match = QRegularExpression( QStringLiteral("^\\[([0-9a-fA-F:]+)\\]:(\\d+)$") ).match( m_host ) ).hasMatch() || + (match = ipv6WithPortRX.match(m_host)).hasMatch() || // irregular IPv6 address + port number specification where port number can be identified if > 9999 - ( match = QRegularExpression( QStringLiteral("^([0-9a-fA-F:]+):(\\d{5})$"), QRegularExpression::InvertedGreedinessOption ).match( m_host ) ).hasMatch() || + (match = ipv6IrregularWithPortRX.match(m_host)).hasMatch() || // any other notation with trailing port number - ( match = QRegularExpression( QStringLiteral("^([^:]+):(\\d+)$") ).match( m_host ) ).hasMatch() + (match = anyWithPortRX.match(m_host)).hasMatch() ) { const auto matchedHost = match.captured( 1 ); diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index bc471bc2e..a015de18f 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -130,8 +130,8 @@ bool VncServerProtocol::readProtocol() return false; } - if( QRegularExpression{ QStringLiteral("RFB (\\d\\d\\d)\\.(\\d\\d\\d)\n") } - .match( QString::fromUtf8( protocol ) ).hasMatch() == false ) + static const QRegularExpression rfbRX{QStringLiteral("RFB (\\d\\d\\d)\\.(\\d\\d\\d)\n")}; + if (rfbRX.match(QString::fromUtf8(protocol)).hasMatch() == false) { vCritical() << "invalid protocol version"; m_socket->close(); diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index 3953983df..2cbe9e808 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -53,7 +53,8 @@ AuthKeysManager::AuthKeysManager( AuthKeysConfiguration& configuration, QObject* bool AuthKeysManager::isKeyNameValid( const QString& authKeyName ) { - return QRegularExpression( QStringLiteral("^[\\w-]+$") ).match( authKeyName ).hasMatch(); + static const QRegularExpression keyNameRX{QStringLiteral("^[\\w-]+$")}; + return keyNameRX.match(authKeyName).hasMatch(); } @@ -470,8 +471,8 @@ QString AuthKeysManager::exportedKeyFileName( const QString& name, const QString QString AuthKeysManager::keyNameFromExportedKeyFile( const QString& keyFile ) { - const auto keyNameMatch = QRegularExpression( QStringLiteral("^(.*)_(.*)_key.pem$") ) - .match(QFileInfo(keyFile).fileName()); + static const QRegularExpression keyNameRX{QStringLiteral("^(.*)_(.*)_key.pem$")}; + const auto keyNameMatch = keyNameRX.match(QFileInfo(keyFile).fileName()); if( keyNameMatch.hasMatch() ) { diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 7983f5b04..cebf888b7 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -701,7 +701,8 @@ NetworkObject BuiltinDirectoryPlugin::toNetworkObject( const QString& line, cons QString& location ) { QStringList placeholders; - auto varDetectionMatchIterator = QRegularExpression{ QStringLiteral("\\((%\\w+%):[^)]+\\)") }.globalMatch( regExWithPlaceholders ); + static const QRegularExpression varDetectionRX{QStringLiteral("\\((%\\w+%):[^)]+\\)")}; + auto varDetectionMatchIterator = varDetectionRX.globalMatch(regExWithPlaceholders); while( varDetectionMatchIterator.hasNext() ) { diff --git a/plugins/ldap/common/LdapConfigurationPage.cpp b/plugins/ldap/common/LdapConfigurationPage.cpp index b509b332d..1ce8d0dab 100644 --- a/plugins/ldap/common/LdapConfigurationPage.cpp +++ b/plugins/ldap/common/LdapConfigurationPage.cpp @@ -74,13 +74,15 @@ LdapConfigurationPage::LdapConfigurationPage( LdapConfiguration& configuration, ui->tlsCACertificateFile->setEnabled( ui->tlsVerifyMode->currentIndex() == LdapClient::TLSVerifyCustomCert ); } ); - const auto browseButtons = findChildren( QRegularExpression( QStringLiteral("browse.*") ) ); + static const QRegularExpression browseButtonsRX{QStringLiteral("browse.*")}; + const auto browseButtons = findChildren(browseButtonsRX); for( auto button : browseButtons ) { button->setToolTip( tr( "Browse" ) ); } - const auto testButtons = findChildren( QRegularExpression( QStringLiteral("test.*") ) ); + static const QRegularExpression testButtonsRX{QStringLiteral("test.*")}; + const auto testButtons = findChildren( testButtonsRX ); for( auto button : testButtons ) { button->setToolTip( tr( "Test" ) ); diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index e62fa7022..a857988f0 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -321,8 +321,8 @@ bool LinuxUserFunctions::performLogon( const QString& username, const Password& sequence = QStringLiteral("%username%%password%"); } - auto matchIterator = QRegularExpression( QStringLiteral("(<[\\w\\d_]+>|%username%|%password%|[\\w\\d]+)") ) - .globalMatch( sequence ); + static const QRegularExpression keySequenceRX(QStringLiteral("(<[\\w\\d_]+>|%username%|%password%|[\\w\\d]+)")); + auto matchIterator = keySequenceRX.globalMatch(sequence); if( matchIterator.hasNext() == false ) { vCritical() << "invalid user login key sequence"; From b48567020de3dc16ce809f626f84bf66f5d88b9b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 19 Feb 2024 16:20:05 +0100 Subject: [PATCH 1567/1765] VeyonCore: add exited() signal --- core/src/VeyonCore.cpp | 2 ++ core/src/VeyonCore.h | 1 + 2 files changed, 3 insertions(+) diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index efc6692e2..c7100079f 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -517,6 +517,8 @@ int VeyonCore::exec() vDebug() << "Exit"; + Q_EMIT exited(); + return result; } diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index cbdf29e0e..a7430cf0d 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -250,6 +250,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject Q_SIGNALS: void initialized(); void applicationLoaded(); + void exited(); }; From 05d5cfccc94cca1c164848d5ef8ff81d56c6f237 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 20 Feb 2024 13:14:01 +0100 Subject: [PATCH 1568/1765] ConfigurationProperty: add missing template keyword --- core/src/Configuration/Property.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/Configuration/Property.h b/core/src/Configuration/Property.h index 9623073b4..d41113f21 100644 --- a/core/src/Configuration/Property.h +++ b/core/src/Configuration/Property.h @@ -147,8 +147,7 @@ class TypedProperty : public Property T value() const { - const auto v = variantValue(); - return QVariant( v ).value(); + return variantValue().template value(); } void setValue( Type value ) const From 65b2c0ed0a484097185b757f41931035a6474f10 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 20 Feb 2024 13:18:52 +0100 Subject: [PATCH 1569/1765] Windows: use custom power scheme for screen lock In the custom power scheme the action for power/sleep buttons is unset so users can't escape the lock screen by pressing the power button while having an application open which (interactively) prevents the shutdown/reboot. --- .../windows/WindowsInputDeviceFunctions.cpp | 49 +++++++++++++++++++ .../windows/WindowsInputDeviceFunctions.h | 6 +++ .../windows/WindowsPlatformConfiguration.h | 1 + .../WindowsPlatformConfigurationPage.ui | 7 +++ translations/veyon.ts | 4 ++ 5 files changed, 67 insertions(+) diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp index aba59510f..71a7f263f 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp @@ -29,6 +29,7 @@ #include "ConfigurationManager.h" #include "PlatformServiceFunctions.h" +#include "ProcessHelper.h" #include "VeyonConfiguration.h" #include "WindowsCoreFunctions.h" #include "WindowsInputDeviceFunctions.h" @@ -37,6 +38,15 @@ #include "WtsSessionManager.h" +class Powercfg : public ProcessHelper +{ +public: + Powercfg(const QStringList& arguments) : ProcessHelper(QStringLiteral("powercfg"), arguments) + { + } +}; + + static int interception_is_any( InterceptionDevice device ) { Q_UNUSED(device) @@ -62,6 +72,7 @@ void WindowsInputDeviceFunctions::enableInputDevices() { disableInterception(); restoreHIDService(); + restorePowerScheme(); m_inputDevicesDisabled = false; } @@ -75,6 +86,7 @@ void WindowsInputDeviceFunctions::disableInputDevices() { enableInterception(); stopHIDService(); + setCustomPowerScheme(); m_inputDevicesDisabled = true; } @@ -173,6 +185,43 @@ void WindowsInputDeviceFunctions::restoreHIDService() +void WindowsInputDeviceFunctions::setCustomPowerScheme() +{ + if (WindowsPlatformConfiguration(&VeyonCore::config()).useCustomPowerSchemeForScreenLock() == false || + m_originalPowerSchemeId.isEmpty() == false) + { + return; + } + + QUuid activeSchemeId{Powercfg{{QStringLiteral("/getactivescheme")}}.runAndReadAll().split(':').value(1).trimmed().split(' ').constFirst()}; + if (activeSchemeId.isNull() || activeSchemeId == CustomPowerSchemeId) + { + return; + } + + m_originalPowerSchemeId = activeSchemeId.toString(QUuid::WithoutBraces); + Powercfg{{QStringLiteral("/delete"), CustomPowerSchemeIdString}}.run(); + Powercfg{{QStringLiteral("/duplicatescheme"), m_originalPowerSchemeId, CustomPowerSchemeIdString}}.run(); + Powercfg{{QStringLiteral("/setacvalueindex"), CustomPowerSchemeIdString, + QStringLiteral("4f971e89-eebd-4455-a8de-9e59040e7347"), QStringLiteral("7648efa3-dd9c-4e3e-b566-50f929386280"), QStringLiteral("0")}}.run(); + Powercfg{{QStringLiteral("/setdcvalueindex"), CustomPowerSchemeIdString, + QStringLiteral("4f971e89-eebd-4455-a8de-9e59040e7347"), QStringLiteral("7648efa3-dd9c-4e3e-b566-50f929386280"), QStringLiteral("0")}}.run(); + Powercfg{{QStringLiteral("/setactive"), CustomPowerSchemeIdString}}.run(); +} + + + +void WindowsInputDeviceFunctions::restorePowerScheme() +{ + if (m_originalPowerSchemeId.isNull() == false) + { + Powercfg{{QStringLiteral("/setactive"), m_originalPowerSchemeId}}.run(); + Powercfg{{QStringLiteral("/delete"), CustomPowerSchemeIdString}}.run(); + } +} + + + void WindowsInputDeviceFunctions::stopHIDService() { initHIDServiceStatus(); diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.h b/plugins/platform/windows/WindowsInputDeviceFunctions.h index 9e8b53111..9f097456a 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.h +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.h @@ -46,6 +46,9 @@ class WindowsInputDeviceFunctions : public PlatformInputDeviceFunctions static void stopOnScreenKeyboard(); private: + const QUuid CustomPowerSchemeId{QStringLiteral("2699bf3e-30c6-4c74-914a-47d4504203f6")}; + const QString CustomPowerSchemeIdString = CustomPowerSchemeId.toString(QUuid::WithoutBraces); + static constexpr auto OnScreenKeyboardTerminateTimeout = 5000; void enableInterception(); @@ -53,6 +56,8 @@ class WindowsInputDeviceFunctions : public PlatformInputDeviceFunctions void initHIDServiceStatus(); void stopHIDService(); void restoreHIDService(); + void setCustomPowerScheme(); + void restorePowerScheme(); static bool installInterception(); static bool uninstallInterception(); @@ -63,5 +68,6 @@ class WindowsInputDeviceFunctions : public PlatformInputDeviceFunctions QString m_hidServiceName{QStringLiteral("hidserv")}; bool m_hidServiceStatusInitialized{false}; bool m_hidServiceActivated{false}; + QString m_originalPowerSchemeId{}; }; diff --git a/plugins/platform/windows/WindowsPlatformConfiguration.h b/plugins/platform/windows/WindowsPlatformConfiguration.h index 791d0f130..9ac5f427a 100644 --- a/plugins/platform/windows/WindowsPlatformConfiguration.h +++ b/plugins/platform/windows/WindowsPlatformConfiguration.h @@ -32,6 +32,7 @@ OP( WindowsPlatformConfiguration, m_configuration, bool, hideDesktopForScreenLock, setHideDesktopForScreenLock, "HideDesktopForScreenLock", "Windows", true, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, bool, hideTaskbarForScreenLock, setHideTaskbarForScreenLock, "HideTaskbarForScreenLock", "Windows", true, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, bool, hideStartMenuForScreenLock, setHideStartMenuForScreenLock, "HideStartMenuForScreenLock", "Windows", true, Configuration::Property::Flag::Advanced ) \ + OP( WindowsPlatformConfiguration, m_configuration, bool, useCustomPowerSchemeForScreenLock, setUseCustomPowerSchemeForScreenLock, "UseCustomPowerSchemeForScreenLock", "Windows", true, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, bool, useInterceptionDriver, setUseInterceptionDriver, "UseInterceptionDriver", "Windows", true, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, int, logonInputStartDelay, setLogonInputStartDelay, "LogonInputStartDelay", "Windows", 1000, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, int, logonKeyPressInterval, setLogonKeyPressInterval, "LogonKeyPressInterval", "Windows", 10, Configuration::Property::Flag::Advanced ) \ diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.ui b/plugins/platform/windows/WindowsPlatformConfigurationPage.ui index f88f77786..90393e005 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.ui +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.ui @@ -144,6 +144,13 @@ + + + + Use custom power scheme with disabled power button + + + diff --git a/translations/veyon.ts b/translations/veyon.ts index 633429f02..19ebef753 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -4348,6 +4348,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin From 7bc90c4ec6c3c5a5035874a98d0be5f583b20eee Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 21 Feb 2024 12:02:42 +0100 Subject: [PATCH 1570/1765] Update copyright --- README.md | 2 +- cli/src/ConfigCommands.cpp | 2 +- cli/src/ConfigCommands.h | 2 +- cli/src/FeatureCommands.cpp | 2 +- cli/src/FeatureCommands.h | 2 +- cli/src/PluginCommands.cpp | 2 +- cli/src/PluginCommands.h | 2 +- cli/src/ServiceControlCommands.cpp | 2 +- cli/src/ServiceControlCommands.h | 2 +- cli/src/ShellCommands.cpp | 2 +- cli/src/ShellCommands.h | 2 +- cli/src/main.cpp | 2 +- cli/veyon-cli.rc.in | 2 +- cli/veyon-wcli.rc.in | 2 +- cmake/modules/BuildVeyonApplication.cmake | 2 +- cmake/modules/BuildVeyonFuzzer.cmake | 2 +- cmake/modules/BuildVeyonPlugin.cmake | 2 +- cmake/modules/CreateTranslations.cmake | 2 +- cmake/modules/FindLibVNCClient.cmake | 2 +- cmake/modules/FindLibVNCServer.cmake | 2 +- cmake/modules/ImportQtTranslations.cmake | 2 +- configurator/src/AccessControlPage.cpp | 2 +- configurator/src/AccessControlPage.h | 2 +- configurator/src/AccessControlRuleEditDialog.cpp | 2 +- configurator/src/AccessControlRuleEditDialog.h | 2 +- configurator/src/AccessControlRuleListModel.cpp | 2 +- configurator/src/AccessControlRuleListModel.h | 2 +- configurator/src/AccessControlRulesTestDialog.cpp | 2 +- configurator/src/AccessControlRulesTestDialog.h | 2 +- configurator/src/AuthenticationPage.cpp | 2 +- configurator/src/AuthenticationPage.h | 2 +- configurator/src/AuthenticationPageTab.cpp | 2 +- configurator/src/AuthenticationPageTab.h | 2 +- configurator/src/GeneralConfigurationPage.cpp | 2 +- configurator/src/GeneralConfigurationPage.h | 2 +- configurator/src/MainWindow.cpp | 2 +- configurator/src/MainWindow.h | 2 +- configurator/src/MasterConfigurationPage.cpp | 2 +- configurator/src/MasterConfigurationPage.h | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPage.cpp | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPage.h | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPageTab.h | 2 +- configurator/src/ServiceConfigurationPage.cpp | 2 +- configurator/src/ServiceConfigurationPage.h | 2 +- configurator/src/main.cpp | 2 +- configurator/veyon-configurator.rc.in | 2 +- core/src/AboutDialog.cpp | 2 +- core/src/AboutDialog.h | 2 +- core/src/AboutDialog.ui | 2 +- core/src/AccessControlProvider.cpp | 2 +- core/src/AccessControlProvider.h | 2 +- core/src/AccessControlRule.cpp | 2 +- core/src/AccessControlRule.h | 2 +- core/src/AuthenticationCredentials.h | 2 +- core/src/AuthenticationManager.cpp | 2 +- core/src/AuthenticationManager.h | 2 +- core/src/AuthenticationPluginInterface.cpp | 2 +- core/src/AuthenticationPluginInterface.h | 2 +- core/src/BuiltinFeatures.cpp | 2 +- core/src/BuiltinFeatures.h | 2 +- core/src/CommandLineIO.cpp | 2 +- core/src/CommandLineIO.h | 2 +- core/src/CommandLinePluginInterface.h | 2 +- core/src/Computer.cpp | 2 +- core/src/Computer.h | 2 +- core/src/ComputerControlInterface.cpp | 2 +- core/src/ComputerControlInterface.h | 2 +- core/src/ComputerListModel.cpp | 2 +- core/src/ComputerListModel.h | 2 +- core/src/Configuration/JsonStore.cpp | 2 +- core/src/Configuration/JsonStore.h | 2 +- core/src/Configuration/LocalStore.cpp | 2 +- core/src/Configuration/LocalStore.h | 2 +- core/src/Configuration/Object.cpp | 2 +- core/src/Configuration/Object.h | 2 +- core/src/Configuration/Password.cpp | 2 +- core/src/Configuration/Password.h | 2 +- core/src/Configuration/Property.cpp | 2 +- core/src/Configuration/Property.h | 2 +- core/src/Configuration/Proxy.cpp | 2 +- core/src/Configuration/Proxy.h | 2 +- core/src/Configuration/Store.h | 2 +- core/src/Configuration/UiMapping.cpp | 2 +- core/src/Configuration/UiMapping.h | 2 +- core/src/ConfigurationManager.cpp | 2 +- core/src/ConfigurationManager.h | 2 +- core/src/ConfigurationPage.cpp | 2 +- core/src/ConfigurationPage.h | 2 +- core/src/ConfigurationPagePluginInterface.h | 2 +- core/src/CryptoCore.cpp | 2 +- core/src/CryptoCore.h | 2 +- core/src/DesktopAccessDialog.cpp | 2 +- core/src/DesktopAccessDialog.h | 2 +- core/src/EnumHelper.h | 2 +- core/src/Feature.h | 2 +- core/src/FeatureManager.cpp | 2 +- core/src/FeatureManager.h | 2 +- core/src/FeatureMessage.cpp | 2 +- core/src/FeatureMessage.h | 2 +- core/src/FeatureProviderInterface.h | 2 +- core/src/FeatureWorkerManager.cpp | 2 +- core/src/FeatureWorkerManager.h | 2 +- core/src/FileSystemBrowser.cpp | 2 +- core/src/FileSystemBrowser.h | 2 +- core/src/Filesystem.cpp | 2 +- core/src/Filesystem.h | 2 +- core/src/HashList.h | 2 +- core/src/HostAddress.cpp | 2 +- core/src/HostAddress.h | 2 +- core/src/KeyboardShortcutTrapper.h | 2 +- core/src/LockWidget.cpp | 2 +- core/src/LockWidget.h | 2 +- core/src/Lockable.h | 2 +- core/src/LockingPointer.h | 2 +- core/src/Logger.cpp | 2 +- core/src/Logger.h | 2 +- core/src/MessageContext.h | 2 +- core/src/MonitoringMode.cpp | 2 +- core/src/MonitoringMode.h | 2 +- core/src/NestedNetworkObjectDirectory.cpp | 2 +- core/src/NestedNetworkObjectDirectory.h | 2 +- core/src/NetworkObject.cpp | 2 +- core/src/NetworkObject.h | 2 +- core/src/NetworkObjectDirectory.cpp | 2 +- core/src/NetworkObjectDirectory.h | 2 +- core/src/NetworkObjectDirectoryManager.cpp | 2 +- core/src/NetworkObjectDirectoryManager.h | 2 +- core/src/NetworkObjectDirectoryPluginInterface.h | 2 +- core/src/NetworkObjectModel.h | 2 +- core/src/ObjectManager.h | 2 +- core/src/PlatformCoreFunctions.h | 2 +- core/src/PlatformFilesystemFunctions.h | 2 +- core/src/PlatformInputDeviceFunctions.h | 2 +- core/src/PlatformNetworkFunctions.h | 2 +- core/src/PlatformPluginInterface.h | 2 +- core/src/PlatformPluginManager.cpp | 2 +- core/src/PlatformPluginManager.h | 2 +- core/src/PlatformServiceFunctions.h | 2 +- core/src/PlatformSessionFunctions.h | 2 +- core/src/PlatformUserFunctions.h | 2 +- core/src/Plugin.h | 2 +- core/src/PluginInterface.h | 2 +- core/src/PluginManager.cpp | 2 +- core/src/PluginManager.h | 2 +- core/src/ProcessHelper.cpp | 2 +- core/src/ProcessHelper.h | 2 +- core/src/QmlCore.cpp | 2 +- core/src/QmlCore.h | 2 +- core/src/QtCompat.h | 2 +- core/src/RfbClientCallback.h | 2 +- core/src/Screenshot.cpp | 2 +- core/src/Screenshot.h | 2 +- core/src/ServiceControl.cpp | 2 +- core/src/ServiceControl.h | 2 +- core/src/SocketDevice.h | 2 +- core/src/SystemTrayIcon.cpp | 2 +- core/src/SystemTrayIcon.h | 2 +- core/src/ToolButton.cpp | 2 +- core/src/ToolButton.h | 2 +- core/src/TranslationLoader.cpp | 2 +- core/src/TranslationLoader.h | 2 +- core/src/UserGroupsBackendInterface.h | 2 +- core/src/UserGroupsBackendManager.cpp | 2 +- core/src/UserGroupsBackendManager.h | 2 +- core/src/VariantArrayMessage.cpp | 2 +- core/src/VariantArrayMessage.h | 2 +- core/src/VariantStream.cpp | 2 +- core/src/VariantStream.h | 2 +- core/src/VeyonConfiguration.cpp | 2 +- core/src/VeyonConfiguration.h | 2 +- core/src/VeyonConfigurationProperties.h | 2 +- core/src/VeyonConnection.cpp | 2 +- core/src/VeyonConnection.h | 2 +- core/src/VeyonCore.cpp | 2 +- core/src/VeyonCore.h | 2 +- core/src/VeyonMasterInterface.h | 2 +- core/src/VeyonServerInterface.h | 2 +- core/src/VeyonServiceControl.cpp | 2 +- core/src/VeyonServiceControl.h | 2 +- core/src/VeyonWorkerInterface.h | 2 +- core/src/VncClientProtocol.cpp | 2 +- core/src/VncClientProtocol.h | 2 +- core/src/VncConnection.cpp | 2 +- core/src/VncConnection.h | 2 +- core/src/VncConnectionConfiguration.h | 2 +- core/src/VncEvents.cpp | 2 +- core/src/VncEvents.h | 2 +- core/src/VncFeatureMessageEvent.cpp | 2 +- core/src/VncFeatureMessageEvent.h | 2 +- core/src/VncServerClient.h | 2 +- core/src/VncServerPluginInterface.h | 2 +- core/src/VncServerProtocol.cpp | 2 +- core/src/VncServerProtocol.h | 2 +- core/src/VncView.cpp | 2 +- core/src/VncView.h | 2 +- core/src/VncViewItem.cpp | 2 +- core/src/VncViewItem.h | 2 +- core/src/VncViewWidget.cpp | 2 +- core/src/VncViewWidget.h | 2 +- master/src/CheckableItemProxyModel.cpp | 2 +- master/src/CheckableItemProxyModel.h | 2 +- master/src/ComputerControlListModel.cpp | 2 +- master/src/ComputerControlListModel.h | 2 +- master/src/ComputerImageProvider.cpp | 2 +- master/src/ComputerImageProvider.h | 2 +- master/src/ComputerManager.cpp | 2 +- master/src/ComputerManager.h | 2 +- master/src/ComputerMonitoringItem.cpp | 2 +- master/src/ComputerMonitoringItem.h | 2 +- master/src/ComputerMonitoringModel.cpp | 2 +- master/src/ComputerMonitoringModel.h | 2 +- master/src/ComputerMonitoringView.cpp | 2 +- master/src/ComputerMonitoringView.h | 2 +- master/src/ComputerMonitoringWidget.cpp | 2 +- master/src/ComputerMonitoringWidget.h | 2 +- master/src/ComputerSelectModel.cpp | 2 +- master/src/ComputerSelectModel.h | 2 +- master/src/ComputerSelectPanel.cpp | 2 +- master/src/ComputerSelectPanel.h | 2 +- master/src/ComputerZoomWidget.cpp | 2 +- master/src/ComputerZoomWidget.h | 2 +- master/src/DocumentationFigureCreator.cpp | 2 +- master/src/DocumentationFigureCreator.h | 2 +- master/src/FeatureListModel.cpp | 2 +- master/src/FeatureListModel.h | 2 +- master/src/FlexibleListView.cpp | 2 +- master/src/FlexibleListView.h | 2 +- master/src/LocationDialog.cpp | 2 +- master/src/LocationDialog.h | 2 +- master/src/MainToolBar.cpp | 2 +- master/src/MainToolBar.h | 2 +- master/src/MainWindow.cpp | 2 +- master/src/MainWindow.h | 2 +- master/src/NetworkObjectFilterProxyModel.cpp | 2 +- master/src/NetworkObjectFilterProxyModel.h | 2 +- master/src/NetworkObjectOverlayDataModel.cpp | 2 +- master/src/NetworkObjectOverlayDataModel.h | 2 +- master/src/NetworkObjectTreeModel.cpp | 2 +- master/src/NetworkObjectTreeModel.h | 2 +- master/src/ScreenshotManagementPanel.cpp | 2 +- master/src/ScreenshotManagementPanel.h | 2 +- master/src/SlideshowModel.cpp | 2 +- master/src/SlideshowModel.h | 2 +- master/src/SlideshowPanel.cpp | 2 +- master/src/SlideshowPanel.h | 2 +- master/src/SpotlightModel.cpp | 2 +- master/src/SpotlightModel.h | 2 +- master/src/SpotlightPanel.cpp | 2 +- master/src/SpotlightPanel.h | 2 +- master/src/UserConfig.cpp | 2 +- master/src/UserConfig.h | 2 +- master/src/VeyonMaster.cpp | 2 +- master/src/VeyonMaster.h | 2 +- master/src/main.cpp | 2 +- master/veyon-master.rc.in | 2 +- nsis/veyon.nsi.in | 2 +- plugins/authkeys/AuthKeysConfiguration.h | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.cpp | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.h | 2 +- plugins/authkeys/AuthKeysManager.cpp | 2 +- plugins/authkeys/AuthKeysManager.h | 2 +- plugins/authkeys/AuthKeysPlugin.cpp | 2 +- plugins/authkeys/AuthKeysPlugin.h | 2 +- plugins/authkeys/AuthKeysTableModel.cpp | 2 +- plugins/authkeys/AuthKeysTableModel.h | 2 +- plugins/authlogon/AuthLogonDialog.cpp | 2 +- plugins/authlogon/AuthLogonDialog.h | 2 +- plugins/authlogon/AuthLogonPlugin.cpp | 2 +- plugins/authlogon/AuthLogonPlugin.h | 2 +- plugins/authsimple/AuthSimpleConfiguration.h | 2 +- plugins/authsimple/AuthSimpleDialog.cpp | 2 +- plugins/authsimple/AuthSimpleDialog.h | 2 +- plugins/authsimple/AuthSimplePlugin.cpp | 2 +- plugins/authsimple/AuthSimplePlugin.h | 2 +- plugins/builtindirectory/BuiltinDirectory.cpp | 2 +- plugins/builtindirectory/BuiltinDirectory.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfiguration.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.h | 2 +- plugins/demo/DemoAuthentication.cpp | 2 +- plugins/demo/DemoAuthentication.h | 2 +- plugins/demo/DemoClient.cpp | 2 +- plugins/demo/DemoClient.h | 2 +- plugins/demo/DemoConfiguration.h | 2 +- plugins/demo/DemoConfigurationPage.cpp | 2 +- plugins/demo/DemoConfigurationPage.h | 2 +- plugins/demo/DemoFeaturePlugin.cpp | 2 +- plugins/demo/DemoFeaturePlugin.h | 2 +- plugins/demo/DemoServer.cpp | 2 +- plugins/demo/DemoServer.h | 2 +- plugins/demo/DemoServerConnection.cpp | 2 +- plugins/demo/DemoServerConnection.h | 2 +- plugins/demo/DemoServerProtocol.cpp | 2 +- plugins/demo/DemoServerProtocol.h | 2 +- plugins/desktopservices/DesktopServiceObject.cpp | 2 +- plugins/desktopservices/DesktopServiceObject.h | 2 +- plugins/desktopservices/DesktopServicesConfiguration.h | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.cpp | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.h | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.cpp | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.h | 2 +- plugins/desktopservices/OpenWebsiteDialog.cpp | 2 +- plugins/desktopservices/OpenWebsiteDialog.h | 2 +- plugins/desktopservices/StartAppDialog.cpp | 2 +- plugins/desktopservices/StartAppDialog.h | 2 +- plugins/filetransfer/FileReadThread.cpp | 2 +- plugins/filetransfer/FileReadThread.h | 2 +- plugins/filetransfer/FileTransferConfiguration.h | 2 +- plugins/filetransfer/FileTransferConfigurationPage.cpp | 2 +- plugins/filetransfer/FileTransferConfigurationPage.h | 2 +- plugins/filetransfer/FileTransferController.cpp | 2 +- plugins/filetransfer/FileTransferController.h | 2 +- plugins/filetransfer/FileTransferDialog.cpp | 2 +- plugins/filetransfer/FileTransferDialog.h | 2 +- plugins/filetransfer/FileTransferListModel.cpp | 2 +- plugins/filetransfer/FileTransferListModel.h | 2 +- plugins/filetransfer/FileTransferPlugin.cpp | 2 +- plugins/filetransfer/FileTransferPlugin.h | 2 +- plugins/filetransfer/FileTransferUserConfiguration.h | 2 +- plugins/ldap/AuthLdapConfiguration.h | 2 +- plugins/ldap/AuthLdapConfigurationWidget.cpp | 2 +- plugins/ldap/AuthLdapConfigurationWidget.h | 2 +- plugins/ldap/AuthLdapCore.cpp | 2 +- plugins/ldap/AuthLdapCore.h | 2 +- plugins/ldap/AuthLdapDialog.cpp | 2 +- plugins/ldap/AuthLdapDialog.h | 2 +- plugins/ldap/LdapPlugin.cpp | 2 +- plugins/ldap/LdapPlugin.h | 2 +- plugins/ldap/common/LdapBrowseDialog.cpp | 2 +- plugins/ldap/common/LdapBrowseDialog.h | 2 +- plugins/ldap/common/LdapBrowseModel.cpp | 2 +- plugins/ldap/common/LdapBrowseModel.h | 2 +- plugins/ldap/common/LdapClient.cpp | 2 +- plugins/ldap/common/LdapClient.h | 2 +- plugins/ldap/common/LdapCommon.h | 2 +- plugins/ldap/common/LdapConfiguration.cpp | 2 +- plugins/ldap/common/LdapConfiguration.h | 2 +- plugins/ldap/common/LdapConfigurationPage.cpp | 2 +- plugins/ldap/common/LdapConfigurationPage.h | 2 +- plugins/ldap/common/LdapConfigurationTest.cpp | 2 +- plugins/ldap/common/LdapConfigurationTest.h | 2 +- plugins/ldap/common/LdapDirectory.cpp | 2 +- plugins/ldap/common/LdapDirectory.h | 2 +- plugins/ldap/common/LdapNetworkObjectDirectory.cpp | 2 +- plugins/ldap/common/LdapNetworkObjectDirectory.h | 2 +- .../ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp | 2 +- .../ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h | 2 +- plugins/ldap/kldap/kldap_core_export.h | 2 +- plugins/ldap/kldap/kldap_export.h | 2 +- plugins/ldap/kldap/klocalizedstring.h | 2 +- plugins/ldap/kldap/ldap_core_debug.h | 2 +- plugins/platform/common/LogonHelper.cpp | 2 +- plugins/platform/common/LogonHelper.h | 2 +- plugins/platform/common/PersistentLogonCredentials.cpp | 2 +- plugins/platform/common/PersistentLogonCredentials.h | 2 +- plugins/platform/common/PlatformSessionManager.cpp | 2 +- plugins/platform/common/PlatformSessionManager.h | 2 +- plugins/platform/common/ServiceDataManager.cpp | 2 +- plugins/platform/common/ServiceDataManager.h | 2 +- plugins/platform/linux/LinuxCoreFunctions.cpp | 2 +- plugins/platform/linux/LinuxCoreFunctions.h | 2 +- plugins/platform/linux/LinuxDesktopIntegration.h | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.cpp | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.h | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.cpp | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.h | 2 +- plugins/platform/linux/LinuxKeyboardInput.cpp | 2 +- plugins/platform/linux/LinuxKeyboardInput.h | 2 +- plugins/platform/linux/LinuxKeyboardShortcutTrapper.h | 2 +- plugins/platform/linux/LinuxNetworkFunctions.cpp | 2 +- plugins/platform/linux/LinuxNetworkFunctions.h | 2 +- plugins/platform/linux/LinuxPlatformConfiguration.h | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.cpp | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.h | 2 +- plugins/platform/linux/LinuxPlatformPlugin.cpp | 2 +- plugins/platform/linux/LinuxPlatformPlugin.h | 2 +- plugins/platform/linux/LinuxServerProcess.cpp | 2 +- plugins/platform/linux/LinuxServerProcess.h | 2 +- plugins/platform/linux/LinuxServiceCore.cpp | 2 +- plugins/platform/linux/LinuxServiceCore.h | 2 +- plugins/platform/linux/LinuxServiceFunctions.cpp | 2 +- plugins/platform/linux/LinuxServiceFunctions.h | 2 +- plugins/platform/linux/LinuxSessionFunctions.cpp | 2 +- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- plugins/platform/linux/LinuxUserFunctions.cpp | 2 +- plugins/platform/linux/LinuxUserFunctions.h | 2 +- plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp | 2 +- plugins/platform/windows/DesktopInputController.cpp | 2 +- plugins/platform/windows/DesktopInputController.h | 2 +- plugins/platform/windows/SasEventListener.cpp | 2 +- plugins/platform/windows/SasEventListener.h | 2 +- plugins/platform/windows/WindowsCoreFunctions.cpp | 2 +- plugins/platform/windows/WindowsCoreFunctions.h | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.cpp | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.h | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.cpp | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.h | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.h | 2 +- plugins/platform/windows/WindowsNetworkFunctions.cpp | 2 +- plugins/platform/windows/WindowsNetworkFunctions.h | 2 +- plugins/platform/windows/WindowsPlatformConfiguration.h | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.cpp | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.h | 2 +- plugins/platform/windows/WindowsPlatformPlugin.cpp | 2 +- plugins/platform/windows/WindowsPlatformPlugin.h | 2 +- plugins/platform/windows/WindowsServiceControl.cpp | 2 +- plugins/platform/windows/WindowsServiceControl.h | 2 +- plugins/platform/windows/WindowsServiceCore.cpp | 2 +- plugins/platform/windows/WindowsServiceCore.h | 2 +- plugins/platform/windows/WindowsServiceFunctions.cpp | 2 +- plugins/platform/windows/WindowsServiceFunctions.h | 2 +- plugins/platform/windows/WindowsSessionFunctions.cpp | 2 +- plugins/platform/windows/WindowsSessionFunctions.h | 2 +- plugins/platform/windows/WindowsUserFunctions.cpp | 2 +- plugins/platform/windows/WindowsUserFunctions.h | 2 +- plugins/platform/windows/WtsSessionManager.cpp | 2 +- plugins/platform/windows/WtsSessionManager.h | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.cpp | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.h | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.cpp | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.h | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.h | 2 +- plugins/remoteaccess/RemoteAccessPage.cpp | 2 +- plugins/remoteaccess/RemoteAccessPage.h | 2 +- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- plugins/remoteaccess/RemoteAccessWidget.h | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.cpp | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.cpp | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotListModel.cpp | 2 +- plugins/screenshot/ScreenshotListModel.h | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.cpp | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.h | 2 +- plugins/testing/TestingCommandLinePlugin.cpp | 2 +- plugins/testing/TestingCommandLinePlugin.h | 2 +- plugins/textmessage/TextMessageDialog.cpp | 2 +- plugins/textmessage/TextMessageDialog.h | 2 +- plugins/textmessage/TextMessageFeaturePlugin.cpp | 2 +- plugins/textmessage/TextMessageFeaturePlugin.h | 2 +- plugins/usersessioncontrol/UserLoginDialog.cpp | 2 +- plugins/usersessioncontrol/UserLoginDialog.h | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.cpp | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.h | 2 +- plugins/vncserver/external/ExternalVncServer.cpp | 2 +- plugins/vncserver/external/ExternalVncServer.h | 2 +- plugins/vncserver/external/ExternalVncServerConfiguration.h | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.cpp | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.h | 2 +- plugins/vncserver/headless/HeadlessVncConfiguration.h | 2 +- plugins/vncserver/headless/HeadlessVncServer.cpp | 2 +- plugins/vncserver/headless/HeadlessVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h | 2 +- plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h | 2 +- project.yml | 2 +- server/src/ComputerControlClient.cpp | 2 +- server/src/ComputerControlClient.h | 2 +- server/src/ComputerControlServer.cpp | 2 +- server/src/ComputerControlServer.h | 2 +- server/src/ServerAccessControlManager.cpp | 2 +- server/src/ServerAccessControlManager.h | 2 +- server/src/ServerAuthenticationManager.cpp | 2 +- server/src/ServerAuthenticationManager.h | 2 +- server/src/TlsServer.cpp | 2 +- server/src/TlsServer.h | 2 +- server/src/VeyonServerProtocol.cpp | 2 +- server/src/VeyonServerProtocol.h | 2 +- server/src/VncProxyConnection.cpp | 2 +- server/src/VncProxyConnection.h | 2 +- server/src/VncProxyConnectionFactory.h | 2 +- server/src/VncProxyServer.cpp | 2 +- server/src/VncProxyServer.h | 2 +- server/src/VncServer.cpp | 2 +- server/src/VncServer.h | 2 +- server/src/main.cpp | 2 +- server/veyon-server.rc.in | 2 +- service/src/main.cpp | 2 +- service/veyon-service.rc.in | 2 +- worker/src/FeatureWorkerManagerConnection.cpp | 2 +- worker/src/FeatureWorkerManagerConnection.h | 2 +- worker/src/VeyonWorker.cpp | 2 +- worker/src/VeyonWorker.h | 2 +- worker/src/main.cpp | 2 +- worker/veyon-worker.rc.in | 2 +- 499 files changed, 499 insertions(+), 499 deletions(-) diff --git a/README.md b/README.md index 110ea1600..13d0a2807 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The following features are available in Veyon: ## License -Copyright (c) 2004-2023 Tobias Junghans / Veyon Solutions. +Copyright (c) 2004-2024 Tobias Junghans / Veyon Solutions. See the file COPYING for the GNU GENERAL PUBLIC LICENSE. diff --git a/cli/src/ConfigCommands.cpp b/cli/src/ConfigCommands.cpp index 365cc6813..6846a7a10 100644 --- a/cli/src/ConfigCommands.cpp +++ b/cli/src/ConfigCommands.cpp @@ -1,7 +1,7 @@ /* * ConfigCommands.cpp - implementation of ConfigCommands class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ConfigCommands.h b/cli/src/ConfigCommands.h index 66b2ae782..8411da6f9 100644 --- a/cli/src/ConfigCommands.h +++ b/cli/src/ConfigCommands.h @@ -1,7 +1,7 @@ /* * ConfigCommands.h - declaration of ConfigCommands class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index 971bfeac0..cc9e48eeb 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -1,7 +1,7 @@ /* * FeatureCommands.cpp - implementation of FeatureCommands class * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/FeatureCommands.h b/cli/src/FeatureCommands.h index 52a8a77f9..72fd007fb 100644 --- a/cli/src/FeatureCommands.h +++ b/cli/src/FeatureCommands.h @@ -1,7 +1,7 @@ /* * FeatureCommands.h - declaration of FeatureCommands class * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginCommands.cpp b/cli/src/PluginCommands.cpp index 0cf8f1c6c..02783f2d3 100644 --- a/cli/src/PluginCommands.cpp +++ b/cli/src/PluginCommands.cpp @@ -1,7 +1,7 @@ /* * PluginsCommands.cpp - implementation of PluginsCommands class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginCommands.h b/cli/src/PluginCommands.h index d83565ce9..502c08220 100644 --- a/cli/src/PluginCommands.h +++ b/cli/src/PluginCommands.h @@ -1,7 +1,7 @@ /* * PluginsCommands.h - declaration of PluginsCommands class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ServiceControlCommands.cpp b/cli/src/ServiceControlCommands.cpp index 566462294..9dc1eed25 100644 --- a/cli/src/ServiceControlCommands.cpp +++ b/cli/src/ServiceControlCommands.cpp @@ -1,7 +1,7 @@ /* * ServiceControlCommands.cpp - implementation of ServiceControlCommands class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ServiceControlCommands.h b/cli/src/ServiceControlCommands.h index acf778e8c..7674667b7 100644 --- a/cli/src/ServiceControlCommands.h +++ b/cli/src/ServiceControlCommands.h @@ -1,7 +1,7 @@ /* * ServiceControlCommands.h - declaration of ServiceControlCommands class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ShellCommands.cpp b/cli/src/ShellCommands.cpp index 1ddd7e33c..ccda1b92b 100644 --- a/cli/src/ShellCommands.cpp +++ b/cli/src/ShellCommands.cpp @@ -1,7 +1,7 @@ /* * ShellCommands.cpp - implementation of ShellCommands class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ShellCommands.h b/cli/src/ShellCommands.h index 8e06824d4..afd6bc015 100644 --- a/cli/src/ShellCommands.h +++ b/cli/src/ShellCommands.h @@ -1,7 +1,7 @@ /* * ShellCommands.h - declaration of ShellCommands class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/main.cpp b/cli/src/main.cpp index 7fc2a69b5..8a6faa0e0 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon CLI * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/veyon-cli.rc.in b/cli/veyon-cli.rc.in index c3f3448a5..f93cd56ec 100644 --- a/cli/veyon-cli.rc.in +++ b/cli/veyon-cli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-cli.exe\0" END END diff --git a/cli/veyon-wcli.rc.in b/cli/veyon-wcli.rc.in index 0fd740042..2afbe15c5 100644 --- a/cli/veyon-wcli.rc.in +++ b/cli/veyon-wcli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (non-console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-wcli.exe\0" END END diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index e5b1f9161..09f11ef3e 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -1,4 +1,4 @@ -# BuildVeyonApplication.cmake - Copyright (c) 2019-2023 Tobias Junghans +# BuildVeyonApplication.cmake - Copyright (c) 2019-2024 Tobias Junghans # # description: build Veyon application # usage: build_veyon_application( ) diff --git a/cmake/modules/BuildVeyonFuzzer.cmake b/cmake/modules/BuildVeyonFuzzer.cmake index 6c91ffb5d..4864a8e78 100644 --- a/cmake/modules/BuildVeyonFuzzer.cmake +++ b/cmake/modules/BuildVeyonFuzzer.cmake @@ -1,4 +1,4 @@ -# BuildVeyonFuzzer.cmake - Copyright (c) 2021-2023 Tobias Junghans +# BuildVeyonFuzzer.cmake - Copyright (c) 2021-2024 Tobias Junghans # # description: build fuzzer test for Veyon component # usage: build_veyon_fuzzer( ) diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index 7630255a5..a19b5dd9c 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -1,4 +1,4 @@ -# BuildVeyonPlugin.cmake - Copyright (c) 2017-2023 Tobias Junghans +# BuildVeyonPlugin.cmake - Copyright (c) 2017-2024 Tobias Junghans # # description: build Veyon plugin # usage: build_veyon_plugin( ) diff --git a/cmake/modules/CreateTranslations.cmake b/cmake/modules/CreateTranslations.cmake index df3e3b33e..03b5d6477 100644 --- a/cmake/modules/CreateTranslations.cmake +++ b/cmake/modules/CreateTranslations.cmake @@ -1,4 +1,4 @@ -# CreateTranslations.cmake - Copyright (c) 2020-2023 Tobias Junghans +# CreateTranslations.cmake - Copyright (c) 2020-2024 Tobias Junghans # # description: create Qt translation files # usage: create_translations( ) diff --git a/cmake/modules/FindLibVNCClient.cmake b/cmake/modules/FindLibVNCClient.cmake index 809031bb5..61d6921b7 100644 --- a/cmake/modules/FindLibVNCClient.cmake +++ b/cmake/modules/FindLibVNCClient.cmake @@ -23,7 +23,7 @@ # The LibVNCClient library #============================================================================= -# SPDX-FileCopyrightText: 2020-2023 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2024 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/cmake/modules/FindLibVNCServer.cmake b/cmake/modules/FindLibVNCServer.cmake index 687ddcac3..a11edc634 100644 --- a/cmake/modules/FindLibVNCServer.cmake +++ b/cmake/modules/FindLibVNCServer.cmake @@ -23,7 +23,7 @@ # The LibVNCServer library #============================================================================= -# SPDX-FileCopyrightText: 2020-2023 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2024 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/cmake/modules/ImportQtTranslations.cmake b/cmake/modules/ImportQtTranslations.cmake index ff41be9db..c7ade28f8 100644 --- a/cmake/modules/ImportQtTranslations.cmake +++ b/cmake/modules/ImportQtTranslations.cmake @@ -1,4 +1,4 @@ -# ImportQtTranslations.cmake - Copyright (c) 2020-2023 Tobias Junghans +# ImportQtTranslations.cmake - Copyright (c) 2020-2024 Tobias Junghans # # description: import translation files of Qt into build directory # usage: import_qt_translations() with QT_TRANSLATIONS_DIR set diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index 0349c3623..9fa8909f2 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -1,7 +1,7 @@ /* * AccessControlPage.cpp - implementation of the access control page * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlPage.h b/configurator/src/AccessControlPage.h index 0452f67b9..0f42edf3b 100644 --- a/configurator/src/AccessControlPage.h +++ b/configurator/src/AccessControlPage.h @@ -1,7 +1,7 @@ /* * AccessControlPage.h - header for the AccessControlPage class * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index 4bf8217be..418ed699b 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.cpp - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.h b/configurator/src/AccessControlRuleEditDialog.h index cc7aa56bd..d1f9ba2ec 100644 --- a/configurator/src/AccessControlRuleEditDialog.h +++ b/configurator/src/AccessControlRuleEditDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.h - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.cpp b/configurator/src/AccessControlRuleListModel.cpp index 2646dae0d..4ee08167b 100644 --- a/configurator/src/AccessControlRuleListModel.cpp +++ b/configurator/src/AccessControlRuleListModel.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.cpp - data model for access control rules * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.h b/configurator/src/AccessControlRuleListModel.h index e16bec83f..3fb93feae 100644 --- a/configurator/src/AccessControlRuleListModel.h +++ b/configurator/src/AccessControlRuleListModel.h @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.h - data model for access control rules * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index 692c12e37..2a7651a62 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.cpp - dialog for testing access control rules * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.h b/configurator/src/AccessControlRulesTestDialog.h index bf3d85b0d..028cf4027 100644 --- a/configurator/src/AccessControlRulesTestDialog.h +++ b/configurator/src/AccessControlRulesTestDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.h - dialog for testing access control rules * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.cpp b/configurator/src/AuthenticationPage.cpp index 22ece0701..fb055e100 100644 --- a/configurator/src/AuthenticationPage.cpp +++ b/configurator/src/AuthenticationPage.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPage.cpp - implementation of the AuthenticationPage class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.h b/configurator/src/AuthenticationPage.h index f0352f1fc..771700547 100644 --- a/configurator/src/AuthenticationPage.h +++ b/configurator/src/AuthenticationPage.h @@ -1,7 +1,7 @@ /* * AuthenticationPage.h - header for the AuthenticationPage class * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.cpp b/configurator/src/AuthenticationPageTab.cpp index 074b00fb7..30d5fa83c 100644 --- a/configurator/src/AuthenticationPageTab.cpp +++ b/configurator/src/AuthenticationPageTab.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.cpp - implementation of the AuthenticationPageTab class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.h b/configurator/src/AuthenticationPageTab.h index d942e35d8..30af7863f 100644 --- a/configurator/src/AuthenticationPageTab.h +++ b/configurator/src/AuthenticationPageTab.h @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.h - header for the AuthenticationPageTab class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index 097b946e9..8069cd00e 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.cpp - configuration page with general settings * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.h b/configurator/src/GeneralConfigurationPage.h index 6af46b8ba..7b82dcabe 100644 --- a/configurator/src/GeneralConfigurationPage.h +++ b/configurator/src/GeneralConfigurationPage.h @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.h - configuration page with general settings * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index 4172a16b4..3861e7fa1 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.h b/configurator/src/MainWindow.h index 683bd018a..e74ae2a76 100644 --- a/configurator/src/MainWindow.h +++ b/configurator/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of the Veyon Configurator * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index 6690ae1a5..90e28580b 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.cpp - page for configuring master application * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.h b/configurator/src/MasterConfigurationPage.h index 3a258d1a3..614d3c552 100644 --- a/configurator/src/MasterConfigurationPage.h +++ b/configurator/src/MasterConfigurationPage.h @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.h - header for the MasterConfigurationPage class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp index 174e5549a..777671b05 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPage.cpp - implementation of the NetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.h b/configurator/src/NetworkObjectDirectoryConfigurationPage.h index 3c58078e3..a0407d913 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.h +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPage.h - header for the NetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp index 051abc3b1..c6ffa3975 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPageTab.cpp - implementation of the NetworkObjectDirectoryConfigurationPageTab class * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h index 0d322a81a..255e7f505 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPageTab.h - header for the NetworkObjectDirectoryConfigurationPageTab class * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index a37a3c909..c75b4e599 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.h b/configurator/src/ServiceConfigurationPage.h index 4a8bb3385..362c47f6c 100644 --- a/configurator/src/ServiceConfigurationPage.h +++ b/configurator/src/ServiceConfigurationPage.h @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.h - header for the ServiceConfigurationPage class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/main.cpp b/configurator/src/main.cpp index 6717e1030..9e5cf6a5d 100644 --- a/configurator/src/main.cpp +++ b/configurator/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Configurator * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/veyon-configurator.rc.in b/configurator/veyon-configurator.rc.in index 95196cfa6..f97922194 100644 --- a/configurator/veyon-configurator.rc.in +++ b/configurator/veyon-configurator.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Configurator\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-configurator.exe\0" END END diff --git a/core/src/AboutDialog.cpp b/core/src/AboutDialog.cpp index db183396e..37168165b 100644 --- a/core/src/AboutDialog.cpp +++ b/core/src/AboutDialog.cpp @@ -1,7 +1,7 @@ /* * AboutDialog.cpp - implementation of AboutDialog * - * Copyright (c) 2011-2023 Tobias Junghans + * Copyright (c) 2011-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.h b/core/src/AboutDialog.h index 93fea3d74..8f7fc4fea 100644 --- a/core/src/AboutDialog.h +++ b/core/src/AboutDialog.h @@ -1,7 +1,7 @@ /* * AboutDialog.h - declaration of AboutDialog class * - * Copyright (c) 2011-2023 Tobias Junghans + * Copyright (c) 2011-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.ui b/core/src/AboutDialog.ui index 22c72eb53..9e093f142 100644 --- a/core/src/AboutDialog.ui +++ b/core/src/AboutDialog.ui @@ -149,7 +149,7 @@ - Copyright © 2004-2023 Tobias Junghans / Veyon Solutions + Copyright © 2004-2024 Tobias Junghans / Veyon Solutions diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index e47f67500..87d0ae755 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -1,7 +1,7 @@ /* * AccessControlProvider.cpp - implementation of the AccessControlProvider class * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index 021bec200..f66de0109 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -1,7 +1,7 @@ /* * AccessControlProvider.h - declaration of class AccessControlProvider * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.cpp b/core/src/AccessControlRule.cpp index c25561558..2b6cba2fc 100644 --- a/core/src/AccessControlRule.cpp +++ b/core/src/AccessControlRule.cpp @@ -1,7 +1,7 @@ /* * AccessControlRule.cpp - implementation of the AccessControlRule class * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index 4b613212a..1851aae2b 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -1,7 +1,7 @@ /* * AccessControlRule.h - declaration of class AccessControlRule * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationCredentials.h b/core/src/AuthenticationCredentials.h index e27312768..6b469f1f3 100644 --- a/core/src/AuthenticationCredentials.h +++ b/core/src/AuthenticationCredentials.h @@ -1,7 +1,7 @@ /* * AuthenticationCredentials.h - class holding credentials for authentication * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.cpp b/core/src/AuthenticationManager.cpp index f0dd5d7cf..644abff06 100644 --- a/core/src/AuthenticationManager.cpp +++ b/core/src/AuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * AuthenticationManager.cpp - implementation of AuthenticationManager * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.h b/core/src/AuthenticationManager.h index 8cb1e7a28..ef019f235 100644 --- a/core/src/AuthenticationManager.h +++ b/core/src/AuthenticationManager.h @@ -1,7 +1,7 @@ /* * AuthenticationManager.h - header file for AuthenticationManager * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.cpp b/core/src/AuthenticationPluginInterface.cpp index 223c26d89..5f64f440f 100644 --- a/core/src/AuthenticationPluginInterface.cpp +++ b/core/src/AuthenticationPluginInterface.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.cpp - interface class for authentication plugins * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.h b/core/src/AuthenticationPluginInterface.h index ecd07e3a7..fbea2c8ab 100644 --- a/core/src/AuthenticationPluginInterface.h +++ b/core/src/AuthenticationPluginInterface.h @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.h - interface class for authentication plugins * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.cpp b/core/src/BuiltinFeatures.cpp index 02413ceb8..1337089cc 100644 --- a/core/src/BuiltinFeatures.cpp +++ b/core/src/BuiltinFeatures.cpp @@ -1,7 +1,7 @@ /* * BuiltinFeatures.cpp - implementation of BuiltinFeatures class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.h b/core/src/BuiltinFeatures.h index 68d30fd71..8ea4b780e 100644 --- a/core/src/BuiltinFeatures.h +++ b/core/src/BuiltinFeatures.h @@ -1,7 +1,7 @@ /* * BuiltinFeatures.h - declaration of BuiltinFeatures class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.cpp b/core/src/CommandLineIO.cpp index e211f1d16..31c7759bf 100644 --- a/core/src/CommandLineIO.cpp +++ b/core/src/CommandLineIO.cpp @@ -1,7 +1,7 @@ /* * CommandLineIO.cpp - text input/output for command line plugins * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.h b/core/src/CommandLineIO.h index b3505353a..50ca58fbd 100644 --- a/core/src/CommandLineIO.h +++ b/core/src/CommandLineIO.h @@ -1,7 +1,7 @@ /* * CommandLineIO.h - text input/output for command line plugins * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLinePluginInterface.h b/core/src/CommandLinePluginInterface.h index cb114202d..86364afea 100644 --- a/core/src/CommandLinePluginInterface.h +++ b/core/src/CommandLinePluginInterface.h @@ -1,7 +1,7 @@ /* * CommandLinePluginInterface.h - interface class for command line plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.cpp b/core/src/Computer.cpp index dac1dd5dd..6cac3cb8c 100644 --- a/core/src/Computer.cpp +++ b/core/src/Computer.cpp @@ -1,7 +1,7 @@ /* * Computer.cpp - represents a computer and provides control methods and data * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.h b/core/src/Computer.h index 070474760..763f30850 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -1,7 +1,7 @@ /* * Computer.h - represents a computer and provides control methods and data * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 96a55f6b8..d5be2c09e 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -1,7 +1,7 @@ /* * ComputerControlInterface.cpp - interface class for controlling a computer * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 2beab50e9..39270bf9a 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -1,7 +1,7 @@ /* * ComputerControlInterface.h - interface class for controlling a computer * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.cpp b/core/src/ComputerListModel.cpp index fb2115873..5649c021a 100644 --- a/core/src/ComputerListModel.cpp +++ b/core/src/ComputerListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerListModel.cpp - data model base class for computer objects * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index 2dd506311..7934c6bab 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -1,7 +1,7 @@ /* * ComputerListModel.h - data model base class for computer objects * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.cpp b/core/src/Configuration/JsonStore.cpp index 3bc02fb20..7a0c34571 100644 --- a/core/src/Configuration/JsonStore.cpp +++ b/core/src/Configuration/JsonStore.cpp @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.cpp - implementation of JsonStore * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.h b/core/src/Configuration/JsonStore.h index 496d34d27..c3981d771 100644 --- a/core/src/Configuration/JsonStore.h +++ b/core/src/Configuration/JsonStore.h @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.h - JsonStore class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index 49a37b8bd..f59aceead 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -1,7 +1,7 @@ /* * ConfigurationLocalStore.cpp - implementation of LocalStore * - * Copyright (c) 2009-2023 Tobias Junghans + * Copyright (c) 2009-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.h b/core/src/Configuration/LocalStore.h index 3adb9b933..97db8cca0 100644 --- a/core/src/Configuration/LocalStore.h +++ b/core/src/Configuration/LocalStore.h @@ -1,7 +1,7 @@ /* * Configuration/LocalStore.h - LocalStore class * - * Copyright (c) 2009-2023 Tobias Junghans + * Copyright (c) 2009-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.cpp b/core/src/Configuration/Object.cpp index 645b6eb39..22157d13c 100644 --- a/core/src/Configuration/Object.cpp +++ b/core/src/Configuration/Object.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2023 Tobias Junghans + * Copyright (c) 2009-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.h b/core/src/Configuration/Object.h index 8bc29689e..1952b3668 100644 --- a/core/src/Configuration/Object.h +++ b/core/src/Configuration/Object.h @@ -1,7 +1,7 @@ /* * Configuration/Object.h - ConfigurationObject class * - * Copyright (c) 2009-2023 Tobias Junghans + * Copyright (c) 2009-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.cpp b/core/src/Configuration/Password.cpp index 980dc5dac..f31f991c5 100644 --- a/core/src/Configuration/Password.cpp +++ b/core/src/Configuration/Password.cpp @@ -1,7 +1,7 @@ /* * Password.cpp - implementation of Configuration::Password * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.h b/core/src/Configuration/Password.h index 3bd33d9df..d2138973f 100644 --- a/core/src/Configuration/Password.h +++ b/core/src/Configuration/Password.h @@ -1,7 +1,7 @@ /* * Configuration/Password.h - Configuration::Password class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index d81de4733..ce2d789e3 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2023 Tobias Junghans + * Copyright (c) 2009-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.h b/core/src/Configuration/Property.h index d41113f21..c9b3bb6ad 100644 --- a/core/src/Configuration/Property.h +++ b/core/src/Configuration/Property.h @@ -1,7 +1,7 @@ /* * Configuration/Property.h - Configuration::Property class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.cpp b/core/src/Configuration/Proxy.cpp index 92a7f1048..7878fb453 100644 --- a/core/src/Configuration/Proxy.cpp +++ b/core/src/Configuration/Proxy.cpp @@ -1,7 +1,7 @@ /* * Proxy.cpp - implementation of Configuration::Proxy * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.h b/core/src/Configuration/Proxy.h index 2d543e377..c7e2dfb01 100644 --- a/core/src/Configuration/Proxy.h +++ b/core/src/Configuration/Proxy.h @@ -1,7 +1,7 @@ /* * Configuration/Proxy.h - ConfigurationProxy class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Store.h b/core/src/Configuration/Store.h index 6abcdeec3..72eb02f94 100644 --- a/core/src/Configuration/Store.h +++ b/core/src/Configuration/Store.h @@ -1,7 +1,7 @@ /* * Configuration/Store.h - ConfigurationStore class * - * Copyright (c) 2009-2023 Tobias Junghans + * Copyright (c) 2009-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.cpp b/core/src/Configuration/UiMapping.cpp index 7126865dc..9304cb72b 100644 --- a/core/src/Configuration/UiMapping.cpp +++ b/core/src/Configuration/UiMapping.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2023 Tobias Junghans + * Copyright (c) 2009-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.h b/core/src/Configuration/UiMapping.h index 34ac26027..8d4f85763 100644 --- a/core/src/Configuration/UiMapping.h +++ b/core/src/Configuration/UiMapping.h @@ -1,7 +1,7 @@ /* * Configuration/UiMapping.h - helper macros and functions for connecting config with UI * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.cpp b/core/src/ConfigurationManager.cpp index 509e09981..4171389e1 100644 --- a/core/src/ConfigurationManager.cpp +++ b/core/src/ConfigurationManager.cpp @@ -1,7 +1,7 @@ /* * ConfigurationManager.cpp - class for managing Veyon's configuration * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.h b/core/src/ConfigurationManager.h index ce97d6ecf..b88a03350 100644 --- a/core/src/ConfigurationManager.h +++ b/core/src/ConfigurationManager.h @@ -1,7 +1,7 @@ /* * ConfigurationManager.h - class for managing Veyon's configuration * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.cpp b/core/src/ConfigurationPage.cpp index 7866881fa..2b74415ff 100644 --- a/core/src/ConfigurationPage.cpp +++ b/core/src/ConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ConfigurationPage.cpp - implementation of configuration page base class * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.h b/core/src/ConfigurationPage.h index 44b5e4e61..1e6977f62 100644 --- a/core/src/ConfigurationPage.h +++ b/core/src/ConfigurationPage.h @@ -1,7 +1,7 @@ /* * ConfigurationPage.h - base class for all configuration pages * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPagePluginInterface.h b/core/src/ConfigurationPagePluginInterface.h index 641bdd606..48fbce45a 100644 --- a/core/src/ConfigurationPagePluginInterface.h +++ b/core/src/ConfigurationPagePluginInterface.h @@ -1,7 +1,7 @@ /* * ConfigurationPagePluginInterface.h - interface class for configuration pages * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index 89b81d61b..f0281254f 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -1,7 +1,7 @@ /* * CryptoCore.cpp - core functions for crypto features * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.h b/core/src/CryptoCore.h index dc9f8f532..bc872b3fc 100644 --- a/core/src/CryptoCore.h +++ b/core/src/CryptoCore.h @@ -1,7 +1,7 @@ /* * CryptoCore.h - core functions for crypto features * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index b6643c5b4..442a9a05d 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.cpp - implementation of DesktopAccessDialog class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.h b/core/src/DesktopAccessDialog.h index d47686f3f..04911f4ac 100644 --- a/core/src/DesktopAccessDialog.h +++ b/core/src/DesktopAccessDialog.h @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.h - declaration of DesktopAccessDialog class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/EnumHelper.h b/core/src/EnumHelper.h index 5dd9ce387..ef5261ec9 100644 --- a/core/src/EnumHelper.h +++ b/core/src/EnumHelper.h @@ -1,7 +1,7 @@ /* * EnumHelper.h - helper functions for enumerations * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Feature.h b/core/src/Feature.h index b2f918f37..547688cc9 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -1,7 +1,7 @@ /* * Feature.h - declaration of the Feature class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 82c8b129d..3d1ae9d31 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -1,7 +1,7 @@ /* * FeatureManager.cpp - implementation of the FeatureManager class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index ac39753ad..4eadfe3d4 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -1,7 +1,7 @@ /* * FeatureManager.h - header for the FeatureManager class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.cpp b/core/src/FeatureMessage.cpp index e8f5426a7..b6d60b76b 100644 --- a/core/src/FeatureMessage.cpp +++ b/core/src/FeatureMessage.cpp @@ -1,7 +1,7 @@ /* * FeatureMessage.cpp - implementation of a message encapsulation class for features * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.h b/core/src/FeatureMessage.h index 9ab4389aa..2eeb99135 100644 --- a/core/src/FeatureMessage.h +++ b/core/src/FeatureMessage.h @@ -1,7 +1,7 @@ /* * FeatureMessage.h - header for a message encapsulation class for features * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index c856f0141..36f00f807 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -1,7 +1,7 @@ /* * FeatureProviderInterface.h - interface class for feature plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index 0ca07a840..bbd2d62e8 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.cpp - class for managing feature worker instances * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.h b/core/src/FeatureWorkerManager.h index a5f6770e0..a12cf1366 100644 --- a/core/src/FeatureWorkerManager.h +++ b/core/src/FeatureWorkerManager.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.h - class for managing feature worker instances * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.cpp b/core/src/FileSystemBrowser.cpp index 8bc2702f6..7a69ad7cf 100644 --- a/core/src/FileSystemBrowser.cpp +++ b/core/src/FileSystemBrowser.cpp @@ -1,7 +1,7 @@ /* * FileSystemBrowser.cpp - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.h b/core/src/FileSystemBrowser.h index 5545729f7..fd42be1cb 100644 --- a/core/src/FileSystemBrowser.h +++ b/core/src/FileSystemBrowser.h @@ -1,7 +1,7 @@ /* * FileSystemBrowser.h - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index 3d29eebb1..b2cdea375 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -1,7 +1,7 @@ /* * Filesystem.cpp - filesystem related query and manipulation functions * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.h b/core/src/Filesystem.h index 911c9be26..7ee64e2db 100644 --- a/core/src/Filesystem.h +++ b/core/src/Filesystem.h @@ -1,7 +1,7 @@ /* * Filesystem.h - filesystem related query and manipulation functions * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HashList.h b/core/src/HashList.h index 546732275..c84d6dd70 100644 --- a/core/src/HashList.h +++ b/core/src/HashList.h @@ -1,7 +1,7 @@ /* * HashList.h - extended QHash acting like a list * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index 7f8b419bc..90e92125e 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -1,7 +1,7 @@ /* * HostAddress.cpp - implementation of HostAddress class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.h b/core/src/HostAddress.h index f4ce85b01..70a068c09 100644 --- a/core/src/HostAddress.h +++ b/core/src/HostAddress.h @@ -1,7 +1,7 @@ /* * HostAddress.h - header for HostAddress class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/KeyboardShortcutTrapper.h b/core/src/KeyboardShortcutTrapper.h index a89f2d915..8e913b9eb 100644 --- a/core/src/KeyboardShortcutTrapper.h +++ b/core/src/KeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * KeyboardShortcutTrapper.h - class for trapping system-wide keyboard shortcuts * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index 8d3a4809e..40923554d 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -1,7 +1,7 @@ /* * LockWidget.cpp - widget for locking a client * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.h b/core/src/LockWidget.h index 574767944..2c2d0fed5 100644 --- a/core/src/LockWidget.h +++ b/core/src/LockWidget.h @@ -1,7 +1,7 @@ /* * LockWidget.h - widget for locking a client * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Lockable.h b/core/src/Lockable.h index f7ef9e0a2..d825eca1f 100644 --- a/core/src/Lockable.h +++ b/core/src/Lockable.h @@ -1,7 +1,7 @@ /* * Lockable.h - header file for Lockable * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockingPointer.h b/core/src/LockingPointer.h index 36e2f5459..a335fdc11 100644 --- a/core/src/LockingPointer.h +++ b/core/src/LockingPointer.h @@ -1,7 +1,7 @@ /* * LockingPointer.h - smart pointer for lockables * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.cpp b/core/src/Logger.cpp index 9c4f95846..68c897d59 100644 --- a/core/src/Logger.cpp +++ b/core/src/Logger.cpp @@ -1,7 +1,7 @@ /* * Logger.cpp - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.h b/core/src/Logger.h index a58d3a0c0..515b1da41 100644 --- a/core/src/Logger.h +++ b/core/src/Logger.h @@ -1,7 +1,7 @@ /* * Logger.h - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MessageContext.h b/core/src/MessageContext.h index e785a7063..52bcfadfd 100644 --- a/core/src/MessageContext.h +++ b/core/src/MessageContext.h @@ -1,7 +1,7 @@ /* * MessageContext.h - header for transporting context for message I/O * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 9bf8345f1..670bd0801 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -1,7 +1,7 @@ /* * MonitoringMode.cpp - implementation of MonitoringMode class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index b1eadbbf0..b14bfb67a 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -1,7 +1,7 @@ /* * MonitoringMode.h - header for the MonitoringMode class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NestedNetworkObjectDirectory.cpp b/core/src/NestedNetworkObjectDirectory.cpp index f8649f843..98717d831 100644 --- a/core/src/NestedNetworkObjectDirectory.cpp +++ b/core/src/NestedNetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * NestedNetworkObjectDirectory.cpp - implementation of NestedNetworkObjectDirectory * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NestedNetworkObjectDirectory.h b/core/src/NestedNetworkObjectDirectory.h index 1850e6ecd..356f04604 100644 --- a/core/src/NestedNetworkObjectDirectory.h +++ b/core/src/NestedNetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * NestedNetworkObjectDirectory.cpp - header file for NestedNetworkObjectDirectory * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.cpp b/core/src/NetworkObject.cpp index eb78aeced..ee50e1e09 100644 --- a/core/src/NetworkObject.cpp +++ b/core/src/NetworkObject.cpp @@ -1,7 +1,7 @@ /* * NetworkObject.cpp - data class representing a network object * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index 8a4a2e5a4..dfe6c7dd8 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -1,7 +1,7 @@ /* * NetworkObject.h - data class representing a network object * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index 4b69b5219..23985c94b 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.cpp - base class for network object directory implementations * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 5be2898a0..0e8c0dedd 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.h - base class for network object directory implementations * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.cpp b/core/src/NetworkObjectDirectoryManager.cpp index 83a9731fd..bb43bd741 100644 --- a/core/src/NetworkObjectDirectoryManager.cpp +++ b/core/src/NetworkObjectDirectoryManager.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.cpp - implementation of NetworkObjectDirectoryManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.h b/core/src/NetworkObjectDirectoryManager.h index 7994dc199..06bb43d4c 100644 --- a/core/src/NetworkObjectDirectoryManager.h +++ b/core/src/NetworkObjectDirectoryManager.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.h - header file for NetworkObjectDirectoryManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryPluginInterface.h b/core/src/NetworkObjectDirectoryPluginInterface.h index 108814b6b..2953de416 100644 --- a/core/src/NetworkObjectDirectoryPluginInterface.h +++ b/core/src/NetworkObjectDirectoryPluginInterface.h @@ -2,7 +2,7 @@ * NetworkObjectDirectoryPluginInterface.h - plugin interface for network * object directory implementations * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectModel.h b/core/src/NetworkObjectModel.h index 01465eaf4..add30d442 100644 --- a/core/src/NetworkObjectModel.h +++ b/core/src/NetworkObjectModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectModel.h - base class for data models providing grouped network objects * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ObjectManager.h b/core/src/ObjectManager.h index da8c626cd..9432a77a9 100644 --- a/core/src/ObjectManager.h +++ b/core/src/ObjectManager.h @@ -1,7 +1,7 @@ /* * ObjectManager.h - header file for ObjectManager * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformCoreFunctions.h b/core/src/PlatformCoreFunctions.h index df80ecf1d..d66fbb9d9 100644 --- a/core/src/PlatformCoreFunctions.h +++ b/core/src/PlatformCoreFunctions.h @@ -1,7 +1,7 @@ /* * PlatformCoreFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformFilesystemFunctions.h b/core/src/PlatformFilesystemFunctions.h index 174a7ce9b..c95d1ce84 100644 --- a/core/src/PlatformFilesystemFunctions.h +++ b/core/src/PlatformFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * PlatformFilesystemFunctions.h - interface class for platform filesystem * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformInputDeviceFunctions.h b/core/src/PlatformInputDeviceFunctions.h index 74707f38f..034ad5c9d 100644 --- a/core/src/PlatformInputDeviceFunctions.h +++ b/core/src/PlatformInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformInputDeviceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformNetworkFunctions.h b/core/src/PlatformNetworkFunctions.h index 314d237f4..d37c8826e 100644 --- a/core/src/PlatformNetworkFunctions.h +++ b/core/src/PlatformNetworkFunctions.h @@ -1,7 +1,7 @@ /* * PlatformNetworkFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginInterface.h b/core/src/PlatformPluginInterface.h index 4549f2a82..08333c12e 100644 --- a/core/src/PlatformPluginInterface.h +++ b/core/src/PlatformPluginInterface.h @@ -1,7 +1,7 @@ /* * PlatformPluginInterface.h - interface class for platform plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.cpp b/core/src/PlatformPluginManager.cpp index 5f4395228..421a7ca3f 100644 --- a/core/src/PlatformPluginManager.cpp +++ b/core/src/PlatformPluginManager.cpp @@ -1,7 +1,7 @@ /* * PlatformPluginManager.cpp - implementation of PlatformPluginManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.h b/core/src/PlatformPluginManager.h index 089396132..833e53801 100644 --- a/core/src/PlatformPluginManager.h +++ b/core/src/PlatformPluginManager.h @@ -1,7 +1,7 @@ /* * PlatformPluginManager.h - header file for PlatformPluginManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformServiceFunctions.h b/core/src/PlatformServiceFunctions.h index d1b06dc90..4665c5c46 100644 --- a/core/src/PlatformServiceFunctions.h +++ b/core/src/PlatformServiceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformServiceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index ecf18ca02..986ed0459 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -1,7 +1,7 @@ /* * PlatformSessionsFunctions.h - interface class for platform session functions * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformUserFunctions.h b/core/src/PlatformUserFunctions.h index e99483b06..f182859da 100644 --- a/core/src/PlatformUserFunctions.h +++ b/core/src/PlatformUserFunctions.h @@ -1,7 +1,7 @@ /* * PlatformUserFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Plugin.h b/core/src/Plugin.h index 1d7ba6cf2..0079f9570 100644 --- a/core/src/Plugin.h +++ b/core/src/Plugin.h @@ -1,7 +1,7 @@ /* * Plugin.h - generic abstraction of a plugin * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginInterface.h b/core/src/PluginInterface.h index aa8826c8b..882368031 100644 --- a/core/src/PluginInterface.h +++ b/core/src/PluginInterface.h @@ -1,7 +1,7 @@ /* * PluginInterface.h - interface class for plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index 2f70bae5a..2b10e0594 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -1,7 +1,7 @@ /* * PluginManager.cpp - implementation of the PluginManager class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.h b/core/src/PluginManager.h index 78c76d323..7ee71f623 100644 --- a/core/src/PluginManager.h +++ b/core/src/PluginManager.h @@ -1,7 +1,7 @@ /* * PluginManager.h - header for the PluginManager class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.cpp b/core/src/ProcessHelper.cpp index 4a1250f20..f15015e0d 100644 --- a/core/src/ProcessHelper.cpp +++ b/core/src/ProcessHelper.cpp @@ -1,7 +1,7 @@ /* * ProcessHelper.cpp - implementation of ProcessHelper * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.h b/core/src/ProcessHelper.h index 75d6b4bc8..600431e15 100644 --- a/core/src/ProcessHelper.h +++ b/core/src/ProcessHelper.h @@ -1,7 +1,7 @@ /* * ProcessHelper.h - header file for ProcessHelper * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.cpp b/core/src/QmlCore.cpp index de5a204fc..e1ba9f71d 100644 --- a/core/src/QmlCore.cpp +++ b/core/src/QmlCore.cpp @@ -1,7 +1,7 @@ /* * QmlCore.cpp - QML-related core functions * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.h b/core/src/QmlCore.h index e69bc0c15..bf80f4afd 100644 --- a/core/src/QmlCore.h +++ b/core/src/QmlCore.h @@ -1,7 +1,7 @@ /* * QmlCore.h - QML-related core functions * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QtCompat.h b/core/src/QtCompat.h index 099cc3aee..0b5f0d2dd 100644 --- a/core/src/QtCompat.h +++ b/core/src/QtCompat.h @@ -1,7 +1,7 @@ /* * QtCompat.h - functions and templates for compatibility with older Qt versions * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/RfbClientCallback.h b/core/src/RfbClientCallback.h index 6e7a4f6a8..6ec22c110 100644 --- a/core/src/RfbClientCallback.h +++ b/core/src/RfbClientCallback.h @@ -1,7 +1,7 @@ /* * RfbClientCallback.h - wrapper for using member functions as libvncclient callbacks * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index 44149fba9..a04d5c3e2 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -1,7 +1,7 @@ /* * Screenshot.cpp - class representing a screenshot * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.h b/core/src/Screenshot.h index f5c7c76fe..b8bd64ad4 100644 --- a/core/src/Screenshot.h +++ b/core/src/Screenshot.h @@ -1,7 +1,7 @@ /* * Screenshot.h - class representing a screenshot * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.cpp b/core/src/ServiceControl.cpp index 3cebd7d20..6d8930646 100644 --- a/core/src/ServiceControl.cpp +++ b/core/src/ServiceControl.cpp @@ -1,7 +1,7 @@ /* * ServiceControl.cpp - class for controlling veyon service * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.h b/core/src/ServiceControl.h index 65b645616..b310a4e18 100644 --- a/core/src/ServiceControl.h +++ b/core/src/ServiceControl.h @@ -1,7 +1,7 @@ /* * ServiceControl.h - header for the ServiceControl class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SocketDevice.h b/core/src/SocketDevice.h index ab647f76f..f9487ddf4 100644 --- a/core/src/SocketDevice.h +++ b/core/src/SocketDevice.h @@ -1,7 +1,7 @@ /* * SocketDevice.h - SocketDevice abstraction * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index 10e485b05..c72819dac 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -1,7 +1,7 @@ /* * SystemTrayIcon.cpp - implementation of SystemTrayIcon class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.h b/core/src/SystemTrayIcon.h index 5d888bab0..8d02a4af9 100644 --- a/core/src/SystemTrayIcon.h +++ b/core/src/SystemTrayIcon.h @@ -1,7 +1,7 @@ /* * SystemTrayIcon.h - declaration of SystemTrayIcon class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.cpp b/core/src/ToolButton.cpp index 3fb880482..13fdd76ec 100644 --- a/core/src/ToolButton.cpp +++ b/core/src/ToolButton.cpp @@ -1,7 +1,7 @@ /* * ToolButton.cpp - implementation of Veyon-tool-button * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.h b/core/src/ToolButton.h index 9856a0fcd..932a28a71 100644 --- a/core/src/ToolButton.h +++ b/core/src/ToolButton.h @@ -1,7 +1,7 @@ /* * ToolButton.h - declaration of class ToolButton * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.cpp b/core/src/TranslationLoader.cpp index d64b06744..819fa8991 100644 --- a/core/src/TranslationLoader.cpp +++ b/core/src/TranslationLoader.cpp @@ -1,7 +1,7 @@ /* * TranslationLoader.cpp - implementation of TranslationLoader class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.h b/core/src/TranslationLoader.h index ac1a0a377..1f080404e 100644 --- a/core/src/TranslationLoader.h +++ b/core/src/TranslationLoader.h @@ -1,7 +1,7 @@ /* * TranslationLoader.h - declaration of TranslationLoader class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendInterface.h b/core/src/UserGroupsBackendInterface.h index d6de8c5a7..f6ba7f692 100644 --- a/core/src/UserGroupsBackendInterface.h +++ b/core/src/UserGroupsBackendInterface.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendInterface.h - interface for a UserGroupsBackend * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.cpp b/core/src/UserGroupsBackendManager.cpp index e04bbdd81..279d9be2f 100644 --- a/core/src/UserGroupsBackendManager.cpp +++ b/core/src/UserGroupsBackendManager.cpp @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.cpp - implementation of UserGroupsBackendManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.h b/core/src/UserGroupsBackendManager.h index 52bdeb01f..ac6333bc1 100644 --- a/core/src/UserGroupsBackendManager.h +++ b/core/src/UserGroupsBackendManager.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.h - header file for UserGroupsBackendManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.cpp b/core/src/VariantArrayMessage.cpp index 5204479cf..122397b86 100644 --- a/core/src/VariantArrayMessage.cpp +++ b/core/src/VariantArrayMessage.cpp @@ -1,7 +1,7 @@ /* * VariantArrayMessage.cpp - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.h b/core/src/VariantArrayMessage.h index 302929e20..ab17b12c2 100644 --- a/core/src/VariantArrayMessage.h +++ b/core/src/VariantArrayMessage.h @@ -1,7 +1,7 @@ /* * VariantArrayMessage.h - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index 062c5cb40..e0d94f191 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -1,7 +1,7 @@ /* * VariantStream.cpp - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.h b/core/src/VariantStream.h index 25709b37e..41940a8d3 100644 --- a/core/src/VariantStream.h +++ b/core/src/VariantStream.h @@ -1,7 +1,7 @@ /* * VariantStream.h - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index 0d260932c..175ae7f82 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -2,7 +2,7 @@ * VeyonConfiguration.cpp - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.h b/core/src/VeyonConfiguration.h index 814307961..42cfdc8e1 100644 --- a/core/src/VeyonConfiguration.h +++ b/core/src/VeyonConfiguration.h @@ -2,7 +2,7 @@ * VeyonConfiguration.h - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 623eaa5c7..9fb2fd733 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -2,7 +2,7 @@ * VeyonConfigurationProperties.h - definition of every configuration property * stored in global veyon configuration * - * Copyright (c) 2016-2023 Tobias Junghans + * Copyright (c) 2016-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 4b9872331..c49d7b629 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -1,7 +1,7 @@ /* * VeyonConnection.cpp - implementation of VeyonConnection * - * Copyright (c) 2008-2023 Tobias Junghans + * Copyright (c) 2008-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index df7ea72be..f86887f58 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -1,7 +1,7 @@ /* * VeyonConnection.h - declaration of class VeyonConnection * - * Copyright (c) 2008-2023 Tobias Junghans + * Copyright (c) 2008-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index c7100079f..48e2dcef9 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -1,7 +1,7 @@ /* * VeyonCore.cpp - implementation of Veyon Core * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index a7430cf0d..d74bd040e 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -1,7 +1,7 @@ /* * VeyonCore.h - declaration of VeyonCore class + basic headers * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonMasterInterface.h b/core/src/VeyonMasterInterface.h index 49e801bc2..2457d5ea2 100644 --- a/core/src/VeyonMasterInterface.h +++ b/core/src/VeyonMasterInterface.h @@ -1,7 +1,7 @@ /* * VeyonMasterInterface.h - interface class for VeyonMaster * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index bfe2068df..f2fc99bd2 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -1,7 +1,7 @@ /* * VeyonServerInterface.h - interface class for VeyonServer * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.cpp b/core/src/VeyonServiceControl.cpp index dc989d945..2be30c887 100644 --- a/core/src/VeyonServiceControl.cpp +++ b/core/src/VeyonServiceControl.cpp @@ -1,7 +1,7 @@ /* * VeyonServiceControl.cpp - class for controlling Veyon service * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.h b/core/src/VeyonServiceControl.h index 20c227e04..bb835e41c 100644 --- a/core/src/VeyonServiceControl.h +++ b/core/src/VeyonServiceControl.h @@ -1,7 +1,7 @@ /* * VeyonServiceControl.h - class for controlling the Veyon service * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonWorkerInterface.h b/core/src/VeyonWorkerInterface.h index eb6756de2..eff95fcb8 100644 --- a/core/src/VeyonWorkerInterface.h +++ b/core/src/VeyonWorkerInterface.h @@ -1,7 +1,7 @@ /* * VeyonWorkerInterface.h - interface class for VeyonWorker * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index ce612518f..c6f9a7041 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -1,7 +1,7 @@ /* * VncClientProtocol.cpp - implementation of the VncClientProtocol class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index 9088b236c..87bea6ce7 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -1,7 +1,7 @@ /* * VncClientProtocol.h - header file for the VncClientProtocol class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index f84423eef..b4fc3316c 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -1,7 +1,7 @@ /* * VncConnection.cpp - implementation of VncConnection class * - * Copyright (c) 2008-2023 Tobias Junghans + * Copyright (c) 2008-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 59fc5a443..35c908f6c 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -1,7 +1,7 @@ /* * VncConnection.h - declaration of VncConnection class * - * Copyright (c) 2008-2023 Tobias Junghans + * Copyright (c) 2008-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnectionConfiguration.h b/core/src/VncConnectionConfiguration.h index 7a321433a..3db958b60 100644 --- a/core/src/VncConnectionConfiguration.h +++ b/core/src/VncConnectionConfiguration.h @@ -1,7 +1,7 @@ /* * VncConnectionConfiguration.h - declaration of VncConnectionConfiguration * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.cpp b/core/src/VncEvents.cpp index 5b80d48ab..b369b24dc 100644 --- a/core/src/VncEvents.cpp +++ b/core/src/VncEvents.cpp @@ -1,7 +1,7 @@ /* * VncEvents.cpp - implementation of VNC event classes * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.h b/core/src/VncEvents.h index c699d086a..cfc1e2518 100644 --- a/core/src/VncEvents.h +++ b/core/src/VncEvents.h @@ -1,7 +1,7 @@ /* * VncEvent.h - declaration of VncEvent and subclasses * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.cpp b/core/src/VncFeatureMessageEvent.cpp index 50b3da2e0..7039d9f54 100644 --- a/core/src/VncFeatureMessageEvent.cpp +++ b/core/src/VncFeatureMessageEvent.cpp @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.cpp - implementation of FeatureMessageEvent * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.h b/core/src/VncFeatureMessageEvent.h index 11234da72..f894e2237 100644 --- a/core/src/VncFeatureMessageEvent.h +++ b/core/src/VncFeatureMessageEvent.h @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.h - declaration of class FeatureMessageEvent * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerClient.h b/core/src/VncServerClient.h index 69d85a002..e882edbde 100644 --- a/core/src/VncServerClient.h +++ b/core/src/VncServerClient.h @@ -1,7 +1,7 @@ /* * VncServerClient.h - header file for the VncServerClient class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerPluginInterface.h b/core/src/VncServerPluginInterface.h index f5f40ff97..4c7d04041 100644 --- a/core/src/VncServerPluginInterface.h +++ b/core/src/VncServerPluginInterface.h @@ -1,7 +1,7 @@ /* * VncServerPluginInterface.h - abstract interface class for VNC server plugins * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index a015de18f..01a3d5e46 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VncServerProtocol.cpp - implementation of the VncServerProtocol class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.h b/core/src/VncServerProtocol.h index 75d412306..710787ff8 100644 --- a/core/src/VncServerProtocol.h +++ b/core/src/VncServerProtocol.h @@ -1,7 +1,7 @@ /* * VncServerProtocol.h - header file for the VncServerProtocol class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index a5579e93b..e94a7e730 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -1,7 +1,7 @@ /* * VncView.cpp - abstract base for all VNC views * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.h b/core/src/VncView.h index a61d8bf2f..fb3176b98 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -1,7 +1,7 @@ /* * VncView.h - abstract base for all VNC views * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index 90d628fc2..8ea0258d4 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -1,7 +1,7 @@ /* * VncViewItem.cpp - QtQuick VNC view item * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.h b/core/src/VncViewItem.h index f047b5533..a8a50bfa2 100644 --- a/core/src/VncViewItem.h +++ b/core/src/VncViewItem.h @@ -1,7 +1,7 @@ /* * VncViewItem.h - QtQuick VNC view item * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index 1f593579b..e7795581c 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -1,7 +1,7 @@ /* * VncViewWidget.cpp - VNC viewer widget * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index c4405f3ba..4f5186056 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -1,7 +1,7 @@ /* * VncViewWidget.h - VNC viewer widget * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.cpp b/master/src/CheckableItemProxyModel.cpp index a6aa87f00..dd73bbd48 100644 --- a/master/src/CheckableItemProxyModel.cpp +++ b/master/src/CheckableItemProxyModel.cpp @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.cpp - proxy model for overlaying checked property * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.h b/master/src/CheckableItemProxyModel.h index f81a9a1e7..5470d17fb 100644 --- a/master/src/CheckableItemProxyModel.h +++ b/master/src/CheckableItemProxyModel.h @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.h - proxy model for overlaying checked property * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 80d722e67..4f6741c47 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerControlListModel.cpp - data model for computer control objects * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index ea65f8626..edcb1b746 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -1,7 +1,7 @@ /* * ComputerControlListModel.h - data model for computer control objects * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerImageProvider.cpp b/master/src/ComputerImageProvider.cpp index 0af506a59..919eb0145 100644 --- a/master/src/ComputerImageProvider.cpp +++ b/master/src/ComputerImageProvider.cpp @@ -1,7 +1,7 @@ /* * ComputerImageProvider.cpp - data model for computer control objects * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerImageProvider.h b/master/src/ComputerImageProvider.h index c66c8512e..a63db2fb2 100644 --- a/master/src/ComputerImageProvider.h +++ b/master/src/ComputerImageProvider.h @@ -1,7 +1,7 @@ /* * ComputerImageProvider.h - image provider for computers * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index b71355b1d..a92545d47 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -1,7 +1,7 @@ /* * ComputerManager.cpp - maintains and provides a computer object list * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index d7a8c02de..c19072475 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -1,7 +1,7 @@ /* * ComputerManager.h - maintains and provides a computer object list * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.cpp b/master/src/ComputerMonitoringItem.cpp index 3dfaa3336..017fa9d58 100644 --- a/master/src/ComputerMonitoringItem.cpp +++ b/master/src/ComputerMonitoringItem.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.h b/master/src/ComputerMonitoringItem.h index 97757bc8e..963c280b4 100644 --- a/master/src/ComputerMonitoringItem.h +++ b/master/src/ComputerMonitoringItem.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.cpp b/master/src/ComputerMonitoringModel.cpp index 3a52a9369..ef6d39c60 100644 --- a/master/src/ComputerMonitoringModel.cpp +++ b/master/src/ComputerMonitoringModel.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringModel.cpp - implementation of ComputerMonitoringModel * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.h b/master/src/ComputerMonitoringModel.h index 3a423708e..ec8a0aeb2 100644 --- a/master/src/ComputerMonitoringModel.h +++ b/master/src/ComputerMonitoringModel.h @@ -1,7 +1,7 @@ /* * ComputerSortFilterProxyModel.h - header file for ComputerSortFilterProxyModel * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 2d9c4a37d..58deb22ac 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.h b/master/src/ComputerMonitoringView.h index ea72e2863..a7f35db7d 100644 --- a/master/src/ComputerMonitoringView.h +++ b/master/src/ComputerMonitoringView.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 53fd8c12d..785f1010c 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.h b/master/src/ComputerMonitoringWidget.h index 080972ffa..515a5f415 100644 --- a/master/src/ComputerMonitoringWidget.h +++ b/master/src/ComputerMonitoringWidget.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.cpp b/master/src/ComputerSelectModel.cpp index 6735e9c29..1430fbfe2 100644 --- a/master/src/ComputerSelectModel.cpp +++ b/master/src/ComputerSelectModel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectModel.cpp - data model for computer selection * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.h b/master/src/ComputerSelectModel.h index d7973d2b2..e2cb61515 100644 --- a/master/src/ComputerSelectModel.h +++ b/master/src/ComputerSelectModel.h @@ -1,7 +1,7 @@ /* * ComputerSelectListModel.h - data model for computer selection * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.cpp b/master/src/ComputerSelectPanel.cpp index 0cd6456fa..44e55a947 100644 --- a/master/src/ComputerSelectPanel.cpp +++ b/master/src/ComputerSelectPanel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.cpp - provides a view for a network object tree * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.h b/master/src/ComputerSelectPanel.h index e3cff5d60..679291303 100644 --- a/master/src/ComputerSelectPanel.h +++ b/master/src/ComputerSelectPanel.h @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.h - provides a view for a network object tree * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 99a18be9b..4388a675f 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.cpp - fullscreen preview widget * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index e057008b8..7acfd4eb0 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.h - fullscreen preview widget * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index 2c84e39e2..3ab25b901 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.cpp - helper for creating documentation figures * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index 23dbe2450..405396448 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.h - helper for creating documentation figures * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.cpp b/master/src/FeatureListModel.cpp index 112690144..b927dcd8b 100644 --- a/master/src/FeatureListModel.cpp +++ b/master/src/FeatureListModel.cpp @@ -1,7 +1,7 @@ /* * FeatureListModel.cpp - data model for features * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.h b/master/src/FeatureListModel.h index fc0565719..1dce4f7de 100644 --- a/master/src/FeatureListModel.h +++ b/master/src/FeatureListModel.h @@ -1,7 +1,7 @@ /* * FeatureListListModel.h - data model for features * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.cpp b/master/src/FlexibleListView.cpp index a5b6b72ab..e39343da6 100644 --- a/master/src/FlexibleListView.cpp +++ b/master/src/FlexibleListView.cpp @@ -1,7 +1,7 @@ /* * FlexibleListView.cpp - list view with flexible icon positions * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.h b/master/src/FlexibleListView.h index ac901e687..782b728c0 100644 --- a/master/src/FlexibleListView.h +++ b/master/src/FlexibleListView.h @@ -1,7 +1,7 @@ /* * FlexibleListView.h - list view with flexible icon positions * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.cpp b/master/src/LocationDialog.cpp index 44ec05c36..a0f2d43e1 100644 --- a/master/src/LocationDialog.cpp +++ b/master/src/LocationDialog.cpp @@ -1,7 +1,7 @@ /* * LocationDialog.cpp - header file for LocationDialog * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.h b/master/src/LocationDialog.h index 6d1915d13..eb9cf9143 100644 --- a/master/src/LocationDialog.h +++ b/master/src/LocationDialog.h @@ -1,7 +1,7 @@ /* * LocationDialog.h - header file for LocationDialog * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.cpp b/master/src/MainToolBar.cpp index 6be689b86..7f7949cd5 100644 --- a/master/src/MainToolBar.cpp +++ b/master/src/MainToolBar.cpp @@ -1,7 +1,7 @@ /* * MainToolBar.cpp - MainToolBar for MainWindow * - * Copyright (c) 2007-2023 Tobias Junghans + * Copyright (c) 2007-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.h b/master/src/MainToolBar.h index ae95c6a04..ac1c021f5 100644 --- a/master/src/MainToolBar.h +++ b/master/src/MainToolBar.h @@ -1,7 +1,7 @@ /* * MainToolBar.h - MainToolBar for MainWindow * - * Copyright (c) 2007-2023 Tobias Junghans + * Copyright (c) 2007-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 462e561e9..849c1d71a 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2004-2023 Tobias Junghans + * Copyright (c) 2004-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.h b/master/src/MainWindow.h index 2df50c213..aa549b176 100644 --- a/master/src/MainWindow.h +++ b/master/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of Veyon Master Application * - * Copyright (c) 2004-2023 Tobias Junghans + * Copyright (c) 2004-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index b9224dc80..82c5ee8c7 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.cpp - implementation of NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.h b/master/src/NetworkObjectFilterProxyModel.h index cf18c7ff9..10377d9cf 100644 --- a/master/src/NetworkObjectFilterProxyModel.h +++ b/master/src/NetworkObjectFilterProxyModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.h - header file for NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.cpp b/master/src/NetworkObjectOverlayDataModel.cpp index 0bb0d027b..c57a3c660 100644 --- a/master/src/NetworkObjectOverlayDataModel.cpp +++ b/master/src/NetworkObjectOverlayDataModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.cpp - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.h b/master/src/NetworkObjectOverlayDataModel.h index fa5cd0174..efb0a638d 100644 --- a/master/src/NetworkObjectOverlayDataModel.h +++ b/master/src/NetworkObjectOverlayDataModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.h - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.cpp b/master/src/NetworkObjectTreeModel.cpp index 53fc72357..5aeb1b4c8 100644 --- a/master/src/NetworkObjectTreeModel.cpp +++ b/master/src/NetworkObjectTreeModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.cpp - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.h b/master/src/NetworkObjectTreeModel.h index fd59aa9e8..9eaf542d5 100644 --- a/master/src/NetworkObjectTreeModel.h +++ b/master/src/NetworkObjectTreeModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.h - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.cpp b/master/src/ScreenshotManagementPanel.cpp index b3ddc2913..0fc6eb0fe 100644 --- a/master/src/ScreenshotManagementPanel.cpp +++ b/master/src/ScreenshotManagementPanel.cpp @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.cpp - implementation of screenshot management view * - * Copyright (c) 2004-2023 Tobias Junghans + * Copyright (c) 2004-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.h b/master/src/ScreenshotManagementPanel.h index 8e0a930cb..b281d86e6 100644 --- a/master/src/ScreenshotManagementPanel.h +++ b/master/src/ScreenshotManagementPanel.h @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.h - declaration of screenshot management view * - * Copyright (c) 2004-2023 Tobias Junghans + * Copyright (c) 2004-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.cpp b/master/src/SlideshowModel.cpp index c30e7e93b..40d56d885 100644 --- a/master/src/SlideshowModel.cpp +++ b/master/src/SlideshowModel.cpp @@ -1,7 +1,7 @@ /* * SlideshowModel.cpp - implementation of SlideshowModel * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.h b/master/src/SlideshowModel.h index ff37cac8b..ee52c4147 100644 --- a/master/src/SlideshowModel.h +++ b/master/src/SlideshowModel.h @@ -1,7 +1,7 @@ /* * SlideshowModel.h - header file for SlideshowModel * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index 7ad418792..c2d2bcb48 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -1,7 +1,7 @@ /* * SlideshowPanel.cpp - implementation of SlideshowPanel * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.h b/master/src/SlideshowPanel.h index f17d5e77e..dfee58050 100644 --- a/master/src/SlideshowPanel.h +++ b/master/src/SlideshowPanel.h @@ -1,7 +1,7 @@ /* * SlideshowPanel.h - declaration of SlideshowPanel * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.cpp b/master/src/SpotlightModel.cpp index de87ccd1a..a2434c6b7 100644 --- a/master/src/SpotlightModel.cpp +++ b/master/src/SpotlightModel.cpp @@ -1,7 +1,7 @@ /* * SpotlightModel.cpp - implementation of SpotlightModel * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.h b/master/src/SpotlightModel.h index d4ecdda61..9b677fe30 100644 --- a/master/src/SpotlightModel.h +++ b/master/src/SpotlightModel.h @@ -1,7 +1,7 @@ /* * SpotlightModel.h - header file for SpotlightModel * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index 79c25beba..ce21336d3 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -1,7 +1,7 @@ /* * SpotlightPanel.cpp - implementation of SpotlightPanel * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index 20cf7a734..95b2564d2 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -1,7 +1,7 @@ /* * SpotlightPanel.h - declaration of SpotlightPanel * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index 6c04385cc..d3efc983b 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -2,7 +2,7 @@ * UserConfig.cpp - Configuration object storing personal settings * for the Veyon Master Application * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index d13fb4ccd..72af01f7c 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -1,7 +1,7 @@ /* * UserConfig.h - UserConfig class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 4bda31fc8..f5f59204a 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -1,7 +1,7 @@ /* * VeyonMaster.cpp - management of application-global instances * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index 14a336e24..bbcf3a302 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -1,7 +1,7 @@ /* * VeyonMaster.h - global instances * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/main.cpp b/master/src/main.cpp index 5a55db43b..69bdbb97c 100644 --- a/master/src/main.cpp +++ b/master/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - startup routine for Veyon Master Application * - * Copyright (c) 2004-2023 Tobias Junghans + * Copyright (c) 2004-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/veyon-master.rc.in b/master/veyon-master.rc.in index 54e541416..82be95423 100644 --- a/master/veyon-master.rc.in +++ b/master/veyon-master.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Master\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-master.exe\0" END END diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index eb6b0fe51..6be8b3be6 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -2,7 +2,7 @@ !define COMP_NAME "Veyon Solutions" !define WEB_SITE "https://veyon.io" !define VERSION "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@.@VERSION_BUILD@" -!define COPYRIGHT "2004-2023 Veyon Solutions / Tobias Junghans" +!define COPYRIGHT "2004-2024 Veyon Solutions / Tobias Junghans" !define DESCRIPTION "Veyon Installer" !define LICENSE_TXT "COPYING" !define INSTALLER_NAME "veyon-${VERSION}-@VEYON_WINDOWS_ARCH@-setup.exe" diff --git a/plugins/authkeys/AuthKeysConfiguration.h b/plugins/authkeys/AuthKeysConfiguration.h index 98b0b7117..c1f6e2662 100644 --- a/plugins/authkeys/AuthKeysConfiguration.h +++ b/plugins/authkeys/AuthKeysConfiguration.h @@ -1,7 +1,7 @@ /* * AuthKeysConfiguration.h - configuration values for AuthKeys plugin * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.cpp b/plugins/authkeys/AuthKeysConfigurationWidget.cpp index 2b928a00e..2af015701 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.cpp +++ b/plugins/authkeys/AuthKeysConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.cpp - implementation of the authentication configuration page * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.h b/plugins/authkeys/AuthKeysConfigurationWidget.h index 369154e82..d529cb635 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.h +++ b/plugins/authkeys/AuthKeysConfigurationWidget.h @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.h - header for the AuthKeysConfigurationDialog class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index 2cbe9e808..20d69a138 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -1,7 +1,7 @@ /* * AuthKeysManager.cpp - implementation of AuthKeysManager class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.h b/plugins/authkeys/AuthKeysManager.h index d18dd86d8..ac1fbc0fe 100644 --- a/plugins/authkeys/AuthKeysManager.h +++ b/plugins/authkeys/AuthKeysManager.h @@ -1,7 +1,7 @@ /* * AuthKeysManager.h - declaration of AuthKeysManager class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index 42ec94b77..68e88824f 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.cpp - implementation of AuthKeysPlugin class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index 6e827072a..2436ec805 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.h - declaration of AuthKeysPlugin class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.cpp b/plugins/authkeys/AuthKeysTableModel.cpp index 61d950e8f..65e8e49ac 100644 --- a/plugins/authkeys/AuthKeysTableModel.cpp +++ b/plugins/authkeys/AuthKeysTableModel.cpp @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.cpp - implementation of AuthKeysTableModel class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.h b/plugins/authkeys/AuthKeysTableModel.h index 3ee28105a..137110327 100644 --- a/plugins/authkeys/AuthKeysTableModel.h +++ b/plugins/authkeys/AuthKeysTableModel.h @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.h - declaration of AuthKeysTableModel class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.cpp b/plugins/authlogon/AuthLogonDialog.cpp index 32e64ce17..032e175ad 100644 --- a/plugins/authlogon/AuthLogonDialog.cpp +++ b/plugins/authlogon/AuthLogonDialog.cpp @@ -1,7 +1,7 @@ /* * AuthLogonDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.h b/plugins/authlogon/AuthLogonDialog.h index bd960f05e..3ed9702ad 100644 --- a/plugins/authlogon/AuthLogonDialog.h +++ b/plugins/authlogon/AuthLogonDialog.h @@ -1,7 +1,7 @@ /* * AuthLogonDialog.h - declaration of password dialog * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index a2d23bcc4..54ec3ce17 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.cpp - implementation of AuthLogonPlugin class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h index dd1cb2ef5..d7f713aee 100644 --- a/plugins/authlogon/AuthLogonPlugin.h +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.h - declaration of AuthLogonPlugin class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleConfiguration.h b/plugins/authsimple/AuthSimpleConfiguration.h index 609399075..e7dbf50db 100644 --- a/plugins/authsimple/AuthSimpleConfiguration.h +++ b/plugins/authsimple/AuthSimpleConfiguration.h @@ -1,7 +1,7 @@ /* * AuthSimpleConfiguration.h - configuration values for AuthSimple plugin * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.cpp b/plugins/authsimple/AuthSimpleDialog.cpp index fccf1e2a2..7e06d1576 100644 --- a/plugins/authsimple/AuthSimpleDialog.cpp +++ b/plugins/authsimple/AuthSimpleDialog.cpp @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.h b/plugins/authsimple/AuthSimpleDialog.h index a1d0fa1a2..c6fc697e8 100644 --- a/plugins/authsimple/AuthSimpleDialog.h +++ b/plugins/authsimple/AuthSimpleDialog.h @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.h - declaration of password dialog * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp index b7a33dd4c..1073912c2 100644 --- a/plugins/authsimple/AuthSimplePlugin.cpp +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.cpp - implementation of AuthSimplePlugin class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.h b/plugins/authsimple/AuthSimplePlugin.h index e8b8988de..e15b17a9e 100644 --- a/plugins/authsimple/AuthSimplePlugin.h +++ b/plugins/authsimple/AuthSimplePlugin.h @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.h - declaration of AuthSimplePlugin class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.cpp b/plugins/builtindirectory/BuiltinDirectory.cpp index 265d8b666..46653dc15 100644 --- a/plugins/builtindirectory/BuiltinDirectory.cpp +++ b/plugins/builtindirectory/BuiltinDirectory.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectory.cpp - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.h b/plugins/builtindirectory/BuiltinDirectory.h index 7164f8e2d..fc7cce7cc 100644 --- a/plugins/builtindirectory/BuiltinDirectory.h +++ b/plugins/builtindirectory/BuiltinDirectory.h @@ -1,7 +1,7 @@ /* * BuiltinDirectory.h - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h index a80b79480..c59bfa6d0 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfiguration.h - configuration values for BuiltinDirectory plugin * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp index 79e0f962c..349c45cae 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.cpp - implementation of BuiltinDirectoryConfigurationPage * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h index 17d0e19f0..edddd129c 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.h - header for the BuiltinDirectoryConfigurationPage class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index cebf888b7..785cd5f4b 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.cpp - implementation of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.h b/plugins/builtindirectory/BuiltinDirectoryPlugin.h index 99bd40842..a059e91e9 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.h +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.h - declaration of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.cpp b/plugins/demo/DemoAuthentication.cpp index 7cc4a5a84..36057e680 100644 --- a/plugins/demo/DemoAuthentication.cpp +++ b/plugins/demo/DemoAuthentication.cpp @@ -1,7 +1,7 @@ /* * DemoAuthentication.cpp - implementation of DemoAuthentication class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index 63d1c0531..744a28bf6 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -1,7 +1,7 @@ /* * DemoAuthentication.h - declaration of DemoAuthentication class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index ba1e6fd18..32d8a8f6e 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -1,7 +1,7 @@ /* * DemoClient.cpp - client widget for demo mode * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.h b/plugins/demo/DemoClient.h index 9cfbdcd5c..e0225c458 100644 --- a/plugins/demo/DemoClient.h +++ b/plugins/demo/DemoClient.h @@ -1,7 +1,7 @@ /* * DemoClient.h - client for demo server * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfiguration.h b/plugins/demo/DemoConfiguration.h index 6d0debe0d..930f0ecf6 100644 --- a/plugins/demo/DemoConfiguration.h +++ b/plugins/demo/DemoConfiguration.h @@ -1,7 +1,7 @@ /* * DemoConfiguration.h - configuration values for Demo plugin * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.cpp b/plugins/demo/DemoConfigurationPage.cpp index d430eedb0..a5e39f58f 100644 --- a/plugins/demo/DemoConfigurationPage.cpp +++ b/plugins/demo/DemoConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.cpp - implementation of DemoConfigurationPage * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.h b/plugins/demo/DemoConfigurationPage.h index e76672dd9..38b0a7cbd 100644 --- a/plugins/demo/DemoConfigurationPage.h +++ b/plugins/demo/DemoConfigurationPage.h @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.h - header for the DemoConfigurationPage class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index c1d8dbdab..6987102a0 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.cpp - implementation of DemoFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 8eed9c588..2ba844d49 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.h - declaration of DemoFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index f6d6ceb11..80672b02b 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index b70d2ab63..be00df5a1 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -2,7 +2,7 @@ * DemoServer.h - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 40f7dd642..4570cca58 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.h b/plugins/demo/DemoServerConnection.h index 748cedf6f..74a52f4f1 100644 --- a/plugins/demo/DemoServerConnection.h +++ b/plugins/demo/DemoServerConnection.h @@ -1,7 +1,7 @@ /* * DemoServerConnection.h - header file for DemoServerConnection class * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.cpp b/plugins/demo/DemoServerProtocol.cpp index 20cec3880..dee037f95 100644 --- a/plugins/demo/DemoServerProtocol.cpp +++ b/plugins/demo/DemoServerProtocol.cpp @@ -1,7 +1,7 @@ /* * DemoServerProtocol.cpp - implementation of DemoServerProtocol class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.h b/plugins/demo/DemoServerProtocol.h index b264b2487..2c54b6d6f 100644 --- a/plugins/demo/DemoServerProtocol.h +++ b/plugins/demo/DemoServerProtocol.h @@ -1,7 +1,7 @@ /* * DemoServerProtocol.h - header file for DemoServerProtocol class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.cpp b/plugins/desktopservices/DesktopServiceObject.cpp index f8eadb21f..98a861ad9 100644 --- a/plugins/desktopservices/DesktopServiceObject.cpp +++ b/plugins/desktopservices/DesktopServiceObject.cpp @@ -1,7 +1,7 @@ /* * DesktopServiceObject.cpp - data class representing a desktop service object * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.h b/plugins/desktopservices/DesktopServiceObject.h index 945d8665d..67281f0d4 100644 --- a/plugins/desktopservices/DesktopServiceObject.h +++ b/plugins/desktopservices/DesktopServiceObject.h @@ -1,7 +1,7 @@ /* * DesktopServiceObject.h - data class representing a desktop service object * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfiguration.h b/plugins/desktopservices/DesktopServicesConfiguration.h index 746e8de40..09d98f262 100644 --- a/plugins/desktopservices/DesktopServicesConfiguration.h +++ b/plugins/desktopservices/DesktopServicesConfiguration.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfiguration.h - configuration values for DesktopServices * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp index d884bd368..bd690becc 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.cpp - implementation of the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.h b/plugins/desktopservices/DesktopServicesConfigurationPage.h index 933b4b3cb..3b261c2af 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.h +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.h - header for the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index 3a5bc2d28..7ccccd458 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.cpp - implementation of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index 46bc97c7c..5d2e7392d 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.h - declaration of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.cpp b/plugins/desktopservices/OpenWebsiteDialog.cpp index 5512b36dd..6ec68126c 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.cpp +++ b/plugins/desktopservices/OpenWebsiteDialog.cpp @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.cpp - implementation of OpenWebsiteDialog * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.h b/plugins/desktopservices/OpenWebsiteDialog.h index a0ebfb3a3..2e81a5844 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.h +++ b/plugins/desktopservices/OpenWebsiteDialog.h @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.h - declaration of class OpenWebsiteDialog * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/desktopservices/StartAppDialog.cpp b/plugins/desktopservices/StartAppDialog.cpp index 6eaf28a77..53cfa3aa5 100644 --- a/plugins/desktopservices/StartAppDialog.cpp +++ b/plugins/desktopservices/StartAppDialog.cpp @@ -1,7 +1,7 @@ /* * StartAppDialog.cpp - implementation of StartAppDialog * - * Copyright (c) 2004-2023 Tobias Junghans + * Copyright (c) 2004-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/StartAppDialog.h b/plugins/desktopservices/StartAppDialog.h index b355e3b6b..fafe0ea56 100644 --- a/plugins/desktopservices/StartAppDialog.h +++ b/plugins/desktopservices/StartAppDialog.h @@ -1,7 +1,7 @@ /* * StartAppDialog.h - declaration of class StartAppDialog * - * Copyright (c) 2004-2023 Tobias Junghans + * Copyright (c) 2004-2024 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileReadThread.cpp b/plugins/filetransfer/FileReadThread.cpp index 2f7526cc6..273115369 100644 --- a/plugins/filetransfer/FileReadThread.cpp +++ b/plugins/filetransfer/FileReadThread.cpp @@ -1,7 +1,7 @@ /* * FileReadThread.cpp - implementation of FileReadThread class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileReadThread.h b/plugins/filetransfer/FileReadThread.h index d89eb945b..9134af84f 100644 --- a/plugins/filetransfer/FileReadThread.h +++ b/plugins/filetransfer/FileReadThread.h @@ -1,7 +1,7 @@ /* * FileReadThread.h - declaration of FileReadThread class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfiguration.h b/plugins/filetransfer/FileTransferConfiguration.h index 2b7ecd3e4..81d04ea6f 100644 --- a/plugins/filetransfer/FileTransferConfiguration.h +++ b/plugins/filetransfer/FileTransferConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferConfiguration.h - configuration values for FileTransfer plugin * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.cpp b/plugins/filetransfer/FileTransferConfigurationPage.cpp index c086a5aa6..e69974b5b 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.cpp +++ b/plugins/filetransfer/FileTransferConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.cpp - implementation of FileTransferConfigurationPage * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.h b/plugins/filetransfer/FileTransferConfigurationPage.h index 707055167..6409f1962 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.h +++ b/plugins/filetransfer/FileTransferConfigurationPage.h @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.h - header for the FileTransferConfigurationPage class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.cpp b/plugins/filetransfer/FileTransferController.cpp index 6a6deeaa9..673dbe827 100644 --- a/plugins/filetransfer/FileTransferController.cpp +++ b/plugins/filetransfer/FileTransferController.cpp @@ -1,7 +1,7 @@ /* * FileTransferController.cpp - implementation of FileTransferController class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.h b/plugins/filetransfer/FileTransferController.h index e1e5551c6..7b9e9edc4 100644 --- a/plugins/filetransfer/FileTransferController.h +++ b/plugins/filetransfer/FileTransferController.h @@ -1,7 +1,7 @@ /* * FileTransferController.h - declaration of FileTransferController class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.cpp b/plugins/filetransfer/FileTransferDialog.cpp index 5aa635196..4cc9c9d14 100644 --- a/plugins/filetransfer/FileTransferDialog.cpp +++ b/plugins/filetransfer/FileTransferDialog.cpp @@ -1,7 +1,7 @@ /* * FileTransferDialog.cpp - implementation of FileTransferDialog * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.h b/plugins/filetransfer/FileTransferDialog.h index 91cc2589b..bf8bbc0ca 100644 --- a/plugins/filetransfer/FileTransferDialog.h +++ b/plugins/filetransfer/FileTransferDialog.h @@ -1,7 +1,7 @@ /* * FileTransferDialog.h - declaration of class FileTransferDialog * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileTransferListModel.cpp b/plugins/filetransfer/FileTransferListModel.cpp index dcfd1c2eb..579442358 100644 --- a/plugins/filetransfer/FileTransferListModel.cpp +++ b/plugins/filetransfer/FileTransferListModel.cpp @@ -1,7 +1,7 @@ /* * FileTransferListModel.cpp - implementation of FileTransferListModel class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferListModel.h b/plugins/filetransfer/FileTransferListModel.h index be35387f0..945d9c675 100644 --- a/plugins/filetransfer/FileTransferListModel.h +++ b/plugins/filetransfer/FileTransferListModel.h @@ -1,7 +1,7 @@ /* * FileTransferListModel.h - declaration of FileTransferListModel class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.cpp b/plugins/filetransfer/FileTransferPlugin.cpp index d54c85349..c8bdab984 100644 --- a/plugins/filetransfer/FileTransferPlugin.cpp +++ b/plugins/filetransfer/FileTransferPlugin.cpp @@ -1,7 +1,7 @@ /* * FileTransferPlugin.cpp - implementation of FileTransferPlugin class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.h b/plugins/filetransfer/FileTransferPlugin.h index 3c50d415b..40cf40162 100644 --- a/plugins/filetransfer/FileTransferPlugin.h +++ b/plugins/filetransfer/FileTransferPlugin.h @@ -1,7 +1,7 @@ /* * FileTransferPlugin.h - declaration of FileTransferPlugin class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferUserConfiguration.h b/plugins/filetransfer/FileTransferUserConfiguration.h index d35f71a44..a49135aa3 100644 --- a/plugins/filetransfer/FileTransferUserConfiguration.h +++ b/plugins/filetransfer/FileTransferUserConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferUserConfiguration.h - user config values for file transfer * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapConfiguration.h b/plugins/ldap/AuthLdapConfiguration.h index d2a41d1a4..bd13bd828 100644 --- a/plugins/ldap/AuthLdapConfiguration.h +++ b/plugins/ldap/AuthLdapConfiguration.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapConfigurationWidget.cpp b/plugins/ldap/AuthLdapConfigurationWidget.cpp index efa8e8f32..f5bfbe02c 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.cpp +++ b/plugins/ldap/AuthLdapConfigurationWidget.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapConfigurationWidget.h b/plugins/ldap/AuthLdapConfigurationWidget.h index bd58ba606..aca7b9fa8 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.h +++ b/plugins/ldap/AuthLdapConfigurationWidget.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapCore.cpp b/plugins/ldap/AuthLdapCore.cpp index 776346245..f6d150fc1 100644 --- a/plugins/ldap/AuthLdapCore.cpp +++ b/plugins/ldap/AuthLdapCore.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapCore.h b/plugins/ldap/AuthLdapCore.h index aa639592d..f7b01abdd 100644 --- a/plugins/ldap/AuthLdapCore.h +++ b/plugins/ldap/AuthLdapCore.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapDialog.cpp b/plugins/ldap/AuthLdapDialog.cpp index c6b631603..e582061e9 100644 --- a/plugins/ldap/AuthLdapDialog.cpp +++ b/plugins/ldap/AuthLdapDialog.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapDialog.h b/plugins/ldap/AuthLdapDialog.h index 5971ac59d..3890d2609 100644 --- a/plugins/ldap/AuthLdapDialog.h +++ b/plugins/ldap/AuthLdapDialog.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/LdapPlugin.cpp b/plugins/ldap/LdapPlugin.cpp index 9a74f3754..954e22a29 100644 --- a/plugins/ldap/LdapPlugin.cpp +++ b/plugins/ldap/LdapPlugin.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/LdapPlugin.h b/plugins/ldap/LdapPlugin.h index 66c17ba91..18f780a89 100644 --- a/plugins/ldap/LdapPlugin.h +++ b/plugins/ldap/LdapPlugin.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapBrowseDialog.cpp b/plugins/ldap/common/LdapBrowseDialog.cpp index 0e0e34dc1..522986293 100644 --- a/plugins/ldap/common/LdapBrowseDialog.cpp +++ b/plugins/ldap/common/LdapBrowseDialog.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapBrowseDialog.h b/plugins/ldap/common/LdapBrowseDialog.h index 4f959f111..42e90400c 100644 --- a/plugins/ldap/common/LdapBrowseDialog.h +++ b/plugins/ldap/common/LdapBrowseDialog.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapBrowseModel.cpp b/plugins/ldap/common/LdapBrowseModel.cpp index 839a7b28a..2ca3ac66e 100644 --- a/plugins/ldap/common/LdapBrowseModel.cpp +++ b/plugins/ldap/common/LdapBrowseModel.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapBrowseModel.h b/plugins/ldap/common/LdapBrowseModel.h index e7ae38b6d..a7c03c772 100644 --- a/plugins/ldap/common/LdapBrowseModel.h +++ b/plugins/ldap/common/LdapBrowseModel.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapClient.cpp b/plugins/ldap/common/LdapClient.cpp index 51393a372..a6425184d 100644 --- a/plugins/ldap/common/LdapClient.cpp +++ b/plugins/ldap/common/LdapClient.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index bb892c671..0840be080 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapCommon.h b/plugins/ldap/common/LdapCommon.h index 85f90c75d..151bd8a45 100644 --- a/plugins/ldap/common/LdapCommon.h +++ b/plugins/ldap/common/LdapCommon.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfiguration.cpp b/plugins/ldap/common/LdapConfiguration.cpp index 0fdad69ca..b14c154bb 100644 --- a/plugins/ldap/common/LdapConfiguration.cpp +++ b/plugins/ldap/common/LdapConfiguration.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index 5bf2c224d..09c07e5cf 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfigurationPage.cpp b/plugins/ldap/common/LdapConfigurationPage.cpp index 1ce8d0dab..563c51a55 100644 --- a/plugins/ldap/common/LdapConfigurationPage.cpp +++ b/plugins/ldap/common/LdapConfigurationPage.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfigurationPage.h b/plugins/ldap/common/LdapConfigurationPage.h index f774e1460..887bbe16f 100644 --- a/plugins/ldap/common/LdapConfigurationPage.h +++ b/plugins/ldap/common/LdapConfigurationPage.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfigurationTest.cpp b/plugins/ldap/common/LdapConfigurationTest.cpp index 9e8d72066..67cc811b2 100644 --- a/plugins/ldap/common/LdapConfigurationTest.cpp +++ b/plugins/ldap/common/LdapConfigurationTest.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfigurationTest.h b/plugins/ldap/common/LdapConfigurationTest.h index 6a19b4a84..bcb13a085 100644 --- a/plugins/ldap/common/LdapConfigurationTest.h +++ b/plugins/ldap/common/LdapConfigurationTest.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index 7067e4d79..1e8798db6 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapDirectory.h b/plugins/ldap/common/LdapDirectory.h index ab3913a6b..03640533a 100644 --- a/plugins/ldap/common/LdapDirectory.h +++ b/plugins/ldap/common/LdapDirectory.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index 414edbff5..b34b0af3d 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.h b/plugins/ldap/common/LdapNetworkObjectDirectory.h index ea1bc2137..c0f05b9ce 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp index e8cc7765b..d1b8c0b24 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h index eb2a76d23..3135f1bc6 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/kldap_core_export.h b/plugins/ldap/kldap/kldap_core_export.h index 1990aecb0..775fe2089 100644 --- a/plugins/ldap/kldap/kldap_core_export.h +++ b/plugins/ldap/kldap/kldap_core_export.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/kldap_export.h b/plugins/ldap/kldap/kldap_export.h index bf90f9509..04d225d09 100644 --- a/plugins/ldap/kldap/kldap_export.h +++ b/plugins/ldap/kldap/kldap_export.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/klocalizedstring.h b/plugins/ldap/kldap/klocalizedstring.h index 10798ac50..22e946ae4 100644 --- a/plugins/ldap/kldap/klocalizedstring.h +++ b/plugins/ldap/kldap/klocalizedstring.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/ldap_core_debug.h b/plugins/ldap/kldap/ldap_core_debug.h index e8f1077bf..3b8964f63 100644 --- a/plugins/ldap/kldap/ldap_core_debug.h +++ b/plugins/ldap/kldap/ldap_core_debug.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2023 Tobias Junghans +// Copyright (c) 2019-2024 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/platform/common/LogonHelper.cpp b/plugins/platform/common/LogonHelper.cpp index 760731a02..e592dec1f 100644 --- a/plugins/platform/common/LogonHelper.cpp +++ b/plugins/platform/common/LogonHelper.cpp @@ -1,7 +1,7 @@ /* * LogonHelper.cpp - implementation of LogonHelper class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/LogonHelper.h b/plugins/platform/common/LogonHelper.h index ee5e74c9c..35867f07d 100644 --- a/plugins/platform/common/LogonHelper.h +++ b/plugins/platform/common/LogonHelper.h @@ -1,7 +1,7 @@ /* * LogonHelper.h - declaration of LogonHelper class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.cpp b/plugins/platform/common/PersistentLogonCredentials.cpp index 6e18a1567..a811ce9b0 100644 --- a/plugins/platform/common/PersistentLogonCredentials.cpp +++ b/plugins/platform/common/PersistentLogonCredentials.cpp @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.cpp - implementation of PersistentLogonCredentials class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.h b/plugins/platform/common/PersistentLogonCredentials.h index 4f7d6acb1..b37099d82 100644 --- a/plugins/platform/common/PersistentLogonCredentials.h +++ b/plugins/platform/common/PersistentLogonCredentials.h @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.h - declaration of PersistentLogonCredentials class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index 7d4ab6f3c..3727eabbf 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -1,7 +1,7 @@ /* * PlatformSessionManager.cpp - implementation of PlatformSessionManager class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.h b/plugins/platform/common/PlatformSessionManager.h index 6af7d87ba..67a2f5b09 100644 --- a/plugins/platform/common/PlatformSessionManager.h +++ b/plugins/platform/common/PlatformSessionManager.h @@ -1,7 +1,7 @@ /* * PlatformSessionManager.h - declaration of PlatformSessionManager class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.cpp b/plugins/platform/common/ServiceDataManager.cpp index 90d65f660..3bf0c19ba 100644 --- a/plugins/platform/common/ServiceDataManager.cpp +++ b/plugins/platform/common/ServiceDataManager.cpp @@ -1,7 +1,7 @@ /* * ServiceDataManager.cpp - implementation of ServiceDataManager class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.h b/plugins/platform/common/ServiceDataManager.h index 95f228d1d..22afe41f5 100644 --- a/plugins/platform/common/ServiceDataManager.h +++ b/plugins/platform/common/ServiceDataManager.h @@ -1,7 +1,7 @@ /* * ServiceDataManager.h - header file for ServiceDataManager class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 60824d4b8..76462f07a 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.cpp - implementation of LinuxCoreFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index 08d8e308f..b878dfe90 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.h - declaration of LinuxCoreFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxDesktopIntegration.h b/plugins/platform/linux/LinuxDesktopIntegration.h index b2ab5f204..e606fc854 100644 --- a/plugins/platform/linux/LinuxDesktopIntegration.h +++ b/plugins/platform/linux/LinuxDesktopIntegration.h @@ -1,7 +1,7 @@ /* * LinuxDesktopIntegration.h - declaration of LinuxDesktopIntegration class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.cpp b/plugins/platform/linux/LinuxFilesystemFunctions.cpp index fc7dd5485..8ed79d5ca 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.cpp +++ b/plugins/platform/linux/LinuxFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.cpp - implementation of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.h b/plugins/platform/linux/LinuxFilesystemFunctions.h index 5fc1a1767..2bcae6c36 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.h +++ b/plugins/platform/linux/LinuxFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.h - declaration of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp index 485dca4be..93d0438c8 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.cpp - implementation of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.h b/plugins/platform/linux/LinuxInputDeviceFunctions.h index 6236cf15b..99d919df1 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.h +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.h - declaration of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.cpp b/plugins/platform/linux/LinuxKeyboardInput.cpp index a8937d76d..db1e0ab67 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.cpp +++ b/plugins/platform/linux/LinuxKeyboardInput.cpp @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.cpp - implementation of LinuxKeyboardInput class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.h b/plugins/platform/linux/LinuxKeyboardInput.h index 6f3ae3a27..c503ac1e8 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.h +++ b/plugins/platform/linux/LinuxKeyboardInput.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.h - declaration of LinuxKeyboardInput class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h index c64e0c0cc..d74b5b142 100644 --- a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h +++ b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardShortcutTrapper.h - dummy KeyboardShortcutTrapper implementation * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.cpp b/plugins/platform/linux/LinuxNetworkFunctions.cpp index f249af8f9..b2db3699d 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.cpp +++ b/plugins/platform/linux/LinuxNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.cpp - implementation of LinuxNetworkFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.h b/plugins/platform/linux/LinuxNetworkFunctions.h index 47cd2f623..8efd3b824 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.h +++ b/plugins/platform/linux/LinuxNetworkFunctions.h @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.h - declaration of LinuxNetworkFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfiguration.h b/plugins/platform/linux/LinuxPlatformConfiguration.h index 70f82d88e..ae3eb14d8 100644 --- a/plugins/platform/linux/LinuxPlatformConfiguration.h +++ b/plugins/platform/linux/LinuxPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfiguration.h - configuration values for LinuxPlatform plugin * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp index 7cd5520b5..5afdf07ab 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.h b/plugins/platform/linux/LinuxPlatformConfigurationPage.h index c8900aca5..d5909f23b 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.h +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.h - header for the LinuxPlatformConfigurationPage class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.cpp b/plugins/platform/linux/LinuxPlatformPlugin.cpp index ddeaeefa2..bfe9bb672 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.cpp +++ b/plugins/platform/linux/LinuxPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.cpp - implementation of LinuxPlatformPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.h b/plugins/platform/linux/LinuxPlatformPlugin.h index 3c0456872..92095a070 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.h +++ b/plugins/platform/linux/LinuxPlatformPlugin.h @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.h - declaration of LinuxPlatformPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index 39f5592e1..0df95c535 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServerProcess class * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServerProcess.h b/plugins/platform/linux/LinuxServerProcess.h index b25e60b0a..07c1a7fd7 100644 --- a/plugins/platform/linux/LinuxServerProcess.h +++ b/plugins/platform/linux/LinuxServerProcess.h @@ -1,7 +1,7 @@ /* * LinuxServerProcess.h - declaration of LinuxServerProcess class * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 3084d05a3..a0cb77196 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index 3d7cb83b3..dbacbab89 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -1,7 +1,7 @@ /* * LinuxServiceCore.h - declaration of LinuxServiceCore class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.cpp b/plugins/platform/linux/LinuxServiceFunctions.cpp index 3ad5dc4d6..ff580c5ec 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.cpp +++ b/plugins/platform/linux/LinuxServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.h b/plugins/platform/linux/LinuxServiceFunctions.h index 92460e978..0ca47f163 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.h +++ b/plugins/platform/linux/LinuxServiceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.h - declaration of LinuxServiceFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 3c5d69769..2b3dd937f 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.cpp - implementation of LinuxSessionFunctions class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index dcdffba11..c582df4d9 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.h - declaration of LinuxSessionFunctions class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index a857988f0..8a65a1146 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.cpp - implementation of LinuxUserFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index b4ef2f482..995126a3f 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.h - declaration of LinuxUserFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp index 95cf6f90a..c7ed921d6 100644 --- a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp +++ b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp @@ -1,7 +1,7 @@ /* * VeyonAuthHelper.cpp - main file for Veyon Authentication Helper * - * Copyright (c) 2010-2023 Tobias Junghans + * Copyright (c) 2010-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.cpp b/plugins/platform/windows/DesktopInputController.cpp index 5d264b15a..5a20ed0e9 100644 --- a/plugins/platform/windows/DesktopInputController.cpp +++ b/plugins/platform/windows/DesktopInputController.cpp @@ -1,7 +1,7 @@ /* * DesktopInputController.cpp - implementation of DesktopInputController class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.h b/plugins/platform/windows/DesktopInputController.h index 0e454feec..af9a1c06b 100644 --- a/plugins/platform/windows/DesktopInputController.h +++ b/plugins/platform/windows/DesktopInputController.h @@ -1,7 +1,7 @@ /* * DesktopInputController.h - declaration of DesktopInputController class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.cpp b/plugins/platform/windows/SasEventListener.cpp index 4d72d39a4..a63150375 100644 --- a/plugins/platform/windows/SasEventListener.cpp +++ b/plugins/platform/windows/SasEventListener.cpp @@ -1,7 +1,7 @@ /* * SasEventListener.cpp - implementation of SasEventListener class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.h b/plugins/platform/windows/SasEventListener.h index cd6160e3e..dd59d6367 100644 --- a/plugins/platform/windows/SasEventListener.h +++ b/plugins/platform/windows/SasEventListener.h @@ -1,7 +1,7 @@ /* * SasEventListener.h - header file for SasEventListener class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index be6b924b3..8530d6296 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.cpp - implementation of WindowsCoreFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index 3edc8a307..a589f7e34 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.h - declaration of WindowsCoreFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.cpp b/plugins/platform/windows/WindowsFilesystemFunctions.cpp index 8c380d114..8e2ea06cd 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.cpp +++ b/plugins/platform/windows/WindowsFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.cpp - implementation of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.h b/plugins/platform/windows/WindowsFilesystemFunctions.h index 89bb2d230..d59905f78 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.h +++ b/plugins/platform/windows/WindowsFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.h - declaration of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp index 71a7f263f..1672c861c 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.cpp - implementation of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.h b/plugins/platform/windows/WindowsInputDeviceFunctions.h index 9f097456a..0e3d41523 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.h +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.h - declaration of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp index 2ead91bfc..c21abb5ff 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h index 2246dcbed..d644129cd 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.cpp b/plugins/platform/windows/WindowsNetworkFunctions.cpp index c71c59000..80393230e 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.cpp +++ b/plugins/platform/windows/WindowsNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.cpp - implementation of WindowsNetworkFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.h b/plugins/platform/windows/WindowsNetworkFunctions.h index a76140fb2..76d8c4024 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.h +++ b/plugins/platform/windows/WindowsNetworkFunctions.h @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.h - declaration of WindowsNetworkFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfiguration.h b/plugins/platform/windows/WindowsPlatformConfiguration.h index 9ac5f427a..a2d9d7cf6 100644 --- a/plugins/platform/windows/WindowsPlatformConfiguration.h +++ b/plugins/platform/windows/WindowsPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfiguration.h - configuration values for WindowsPlatform plugin * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp index 0baf473ba..759501b51 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.h b/plugins/platform/windows/WindowsPlatformConfigurationPage.h index d8edacd9b..42c0b1fb5 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.h +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.h - header for the WindowsPlatformConfigurationPage class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.cpp b/plugins/platform/windows/WindowsPlatformPlugin.cpp index 756bf3c7f..6e0ac41ab 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.cpp +++ b/plugins/platform/windows/WindowsPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.cpp - implementation of WindowsPlatformPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.h b/plugins/platform/windows/WindowsPlatformPlugin.h index 667d23b51..6c2925a35 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.h +++ b/plugins/platform/windows/WindowsPlatformPlugin.h @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.h - declaration of WindowsPlatformPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 7eefe9ea8..4ff9e0600 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceControl.h - class for managing a Windows service * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.h b/plugins/platform/windows/WindowsServiceControl.h index 4f6d55b5e..9b332dc40 100644 --- a/plugins/platform/windows/WindowsServiceControl.h +++ b/plugins/platform/windows/WindowsServiceControl.h @@ -1,7 +1,7 @@ /* * WindowsService.h - class for managing a Windows service * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index 4505ffc43..0b9cc32ea 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceCore.cpp - implementation of WindowsServiceCore class * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.h b/plugins/platform/windows/WindowsServiceCore.h index 10c2fbd1d..37a40314e 100644 --- a/plugins/platform/windows/WindowsServiceCore.h +++ b/plugins/platform/windows/WindowsServiceCore.h @@ -1,7 +1,7 @@ /* * WindowsServiceCore.h - header file for WindowsServiceCore class * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.cpp b/plugins/platform/windows/WindowsServiceFunctions.cpp index 1b56d27de..0fc756032 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.cpp +++ b/plugins/platform/windows/WindowsServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.cpp - implementation of WindowsServiceFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.h b/plugins/platform/windows/WindowsServiceFunctions.h index d33c7bdf0..1da6e7249 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.h +++ b/plugins/platform/windows/WindowsServiceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.h - declaration of WindowsServiceFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 462aa9b31..de1949878 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.cpp - implementation of WindowsSessionFunctions class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index 5b0497e03..e8f96905d 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.h - declaration of WindowsSessionFunctions class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 03e502d5f..0a69f1932 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.cpp - implementation of WindowsUserFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index 6f201cf7f..cbffdc9bf 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.h - declaration of WindowsUserFunctions class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index a275378c2..160e9658c 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -1,7 +1,7 @@ /* * WtsSessionManager.cpp - implementation of WtsSessionManager class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index fc23aea67..4f12e4b84 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -1,7 +1,7 @@ /* * WtsSessionManager.h - header file for WtsSessionManager class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 4190cf85e..627eeb603 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.cpp - implementation of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.h b/plugins/powercontrol/PowerControlFeaturePlugin.h index c797d35b2..c5757d665 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.h +++ b/plugins/powercontrol/PowerControlFeaturePlugin.h @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.h - declaration of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.cpp b/plugins/powercontrol/PowerDownTimeInputDialog.cpp index d544ea96c..856218dba 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.cpp +++ b/plugins/powercontrol/PowerDownTimeInputDialog.cpp @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - implementation of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.h b/plugins/powercontrol/PowerDownTimeInputDialog.h index 54610a147..2550248b2 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.h +++ b/plugins/powercontrol/PowerDownTimeInputDialog.h @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - declaration of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index e2e38b2c7..8cad061e9 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.cpp - implementation of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index 131fc8112..400b4cbe3 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.h - declaration of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.cpp b/plugins/remoteaccess/RemoteAccessPage.cpp index 1af2cdedd..4861d9da1 100644 --- a/plugins/remoteaccess/RemoteAccessPage.cpp +++ b/plugins/remoteaccess/RemoteAccessPage.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.h b/plugins/remoteaccess/RemoteAccessPage.h index df14f357b..d7df133f3 100644 --- a/plugins/remoteaccess/RemoteAccessPage.h +++ b/plugins/remoteaccess/RemoteAccessPage.h @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 0aa0904b9..a5399b5f0 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.cpp - widget containing a VNC-view and controls for it * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index c3dc2a9c4..97ba060ff 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.h - widget containing a VNC view and controls for it * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.cpp b/plugins/screenlock/ScreenLockFeaturePlugin.cpp index c565db72c..92ae8ae15 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.cpp +++ b/plugins/screenlock/ScreenLockFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.cpp - implementation of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.h b/plugins/screenlock/ScreenLockFeaturePlugin.h index 7271c2946..cf1e1b86f 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.h +++ b/plugins/screenlock/ScreenLockFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.h - declaration of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.cpp b/plugins/screenshot/ScreenshotFeaturePlugin.cpp index 0542b2abc..c99e28916 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.cpp +++ b/plugins/screenshot/ScreenshotFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.cpp - implementation of ScreenshotFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.h b/plugins/screenshot/ScreenshotFeaturePlugin.h index 0daf5d975..b458e5d99 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.h +++ b/plugins/screenshot/ScreenshotFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.h - declaration of ScreenshotFeature class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotListModel.cpp b/plugins/screenshot/ScreenshotListModel.cpp index e98a82b8f..bcbb33b3e 100644 --- a/plugins/screenshot/ScreenshotListModel.cpp +++ b/plugins/screenshot/ScreenshotListModel.cpp @@ -1,7 +1,7 @@ /* * ScreenshotListModel.cpp - implementation of ScreenshotListModel * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotListModel.h b/plugins/screenshot/ScreenshotListModel.h index 16b937e37..57bb2a574 100644 --- a/plugins/screenshot/ScreenshotListModel.h +++ b/plugins/screenshot/ScreenshotListModel.h @@ -1,7 +1,7 @@ /* * ScreenshotListModel.h - declaration of ScreenshotListModel * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp index 15cb513fe..8d80d7265 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.cpp - implementation of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.h b/plugins/systemusergroups/SystemUserGroupsPlugin.h index fc334e765..9fc2d06cf 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.h +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.h @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.h - declaration of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.cpp b/plugins/testing/TestingCommandLinePlugin.cpp index a86dda2aa..91ab9f5d2 100644 --- a/plugins/testing/TestingCommandLinePlugin.cpp +++ b/plugins/testing/TestingCommandLinePlugin.cpp @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.cpp - implementation of TestingCommandLinePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.h b/plugins/testing/TestingCommandLinePlugin.h index f8f945e8a..1b3cd1ac7 100644 --- a/plugins/testing/TestingCommandLinePlugin.h +++ b/plugins/testing/TestingCommandLinePlugin.h @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.h - declaration of TestingCommandLinePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.cpp b/plugins/textmessage/TextMessageDialog.cpp index cc7d67779..98a540d51 100644 --- a/plugins/textmessage/TextMessageDialog.cpp +++ b/plugins/textmessage/TextMessageDialog.cpp @@ -1,7 +1,7 @@ /* * TextMessageDialog.cpp - implementation of text message dialog class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.h b/plugins/textmessage/TextMessageDialog.h index ad52fabb7..7890ab6cb 100644 --- a/plugins/textmessage/TextMessageDialog.h +++ b/plugins/textmessage/TextMessageDialog.h @@ -1,7 +1,7 @@ /* * TextMessageDialog.h - declaration of text message dialog class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.cpp b/plugins/textmessage/TextMessageFeaturePlugin.cpp index 9b1bc3c85..e3e4f42bd 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.cpp +++ b/plugins/textmessage/TextMessageFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.cpp - implementation of TextMessageFeaturePlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.h b/plugins/textmessage/TextMessageFeaturePlugin.h index ece971e3e..9076f832e 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.h +++ b/plugins/textmessage/TextMessageFeaturePlugin.h @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.h - declaration of TextMessageFeature class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.cpp b/plugins/usersessioncontrol/UserLoginDialog.cpp index 427b21347..5a4282d17 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.cpp +++ b/plugins/usersessioncontrol/UserLoginDialog.cpp @@ -1,7 +1,7 @@ /* * UserLoginDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.h b/plugins/usersessioncontrol/UserLoginDialog.h index a06efa726..2bde64f51 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.h +++ b/plugins/usersessioncontrol/UserLoginDialog.h @@ -1,7 +1,7 @@ /* * UserLoginDialog.h - dialog for querying logon credentials * - * Copyright (c) 2019-2023 Tobias Junghans + * Copyright (c) 2019-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp index c613c2734..2cb639173 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.cpp - implementation of UserSessionControlPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.h b/plugins/usersessioncontrol/UserSessionControlPlugin.h index 6530ec617..d3a86bf78 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.h +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.h @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.h - declaration of UserSessionControlPlugin class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.cpp b/plugins/vncserver/external/ExternalVncServer.cpp index 8e7a7e775..6bd5709d0 100644 --- a/plugins/vncserver/external/ExternalVncServer.cpp +++ b/plugins/vncserver/external/ExternalVncServer.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServer.cpp - implementation of ExternalVncServer class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.h b/plugins/vncserver/external/ExternalVncServer.h index 49959f2a0..71f1a04e6 100644 --- a/plugins/vncserver/external/ExternalVncServer.h +++ b/plugins/vncserver/external/ExternalVncServer.h @@ -1,7 +1,7 @@ /* * ExternalVncServer.h - declaration of ExternalVncServer class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfiguration.h b/plugins/vncserver/external/ExternalVncServerConfiguration.h index e7a250d65..350c6ca38 100644 --- a/plugins/vncserver/external/ExternalVncServerConfiguration.h +++ b/plugins/vncserver/external/ExternalVncServerConfiguration.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfiguration.h - configuration values for external VNC server * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp index 5b039777f..4060f7a8b 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - implementation of the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h index 5a8612489..5d74beb18 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - header for the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncConfiguration.h b/plugins/vncserver/headless/HeadlessVncConfiguration.h index acdd71dc3..d54211585 100644 --- a/plugins/vncserver/headless/HeadlessVncConfiguration.h +++ b/plugins/vncserver/headless/HeadlessVncConfiguration.h @@ -1,7 +1,7 @@ /* * HeadlessVncConfiguration.h - headless VNC server specific configuration values * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp index 894ce2eee..32f449996 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.cpp +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -1,7 +1,7 @@ /* * HeadlessVncServer.cpp - implementation of HeadlessVncServer class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.h b/plugins/vncserver/headless/HeadlessVncServer.h index 10928673f..4816bf1ff 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.h +++ b/plugins/vncserver/headless/HeadlessVncServer.h @@ -1,7 +1,7 @@ /* * HeadlessVncServer.h - declaration of HeadlessVncServer class * - * Copyright (c) 2020-2023 Tobias Junghans + * Copyright (c) 2020-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp index 626a033fe..f66dd53ec 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.cpp - implementation of BuiltinUltraVncServer class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h index a99e35cdd..330736dac 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.h - declaration of BuiltinUltraVncServer class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp index 2a5e0a0b2..4507d8cc0 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp @@ -1,7 +1,7 @@ /* * LogoffEventFilter.cpp - implementation of LogoffEventFilter class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h index f20c8c815..81635d8ac 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h @@ -1,7 +1,7 @@ /* * LogoffEventFilter.h - declaration of LogoffEventFilter class * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h index b43eca462..3d9b7712e 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h @@ -1,7 +1,7 @@ /* * UltraVncConfiguration.h - UltraVNC-specific configuration values * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp index 271532853..062638da0 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - implementation of the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h index 3ad1114b8..665dd113e 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - header for the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index c5c30a6fd..49b7cf177 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.cpp - implementation of BuiltinX11VncServer class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h index 05146ef9d..897897c97 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.h - declaration of BuiltinX11VncServer class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h index 4ec30f802..e75ce6039 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h @@ -1,7 +1,7 @@ /* * X11VncConfiguration.h - x11vnc-specific configuration values * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp index dde1a990d..a6176f1b4 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - implementation of the X11VncConfigurationWidget class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h index 5b641bd07..b1c84751f 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - header for the X11VncConfigurationWidget class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/project.yml b/project.yml index 96786f6dd..553f9cbd5 100644 --- a/project.yml +++ b/project.yml @@ -1,7 +1,7 @@ project: name: Veyon version: 4.99.0 - copyright: 2004-2022 + copyright: 2004-2024 author: Tobias Junghans contact: Tobias Junghans contributors: diff --git a/server/src/ComputerControlClient.cpp b/server/src/ComputerControlClient.cpp index c556b8ffe..5c526bd7f 100644 --- a/server/src/ComputerControlClient.cpp +++ b/server/src/ComputerControlClient.cpp @@ -1,7 +1,7 @@ /* * ComputerControlClient.cpp - implementation of the ComputerControlClient class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlClient.h b/server/src/ComputerControlClient.h index 044962ea7..912058e82 100644 --- a/server/src/ComputerControlClient.h +++ b/server/src/ComputerControlClient.h @@ -1,7 +1,7 @@ /* * ComputerControlClient.h - header file for the ComputerControlClient class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 63164e6ea..0cee1dcb6 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -1,7 +1,7 @@ /* * ComputerControlServer.cpp - implementation of ComputerControlServer * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index d1ddfaa6f..c1b0cd2d2 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -1,7 +1,7 @@ /* * ComputerControlServer.h - header file for ComputerControlServer * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index 23764b6b3..b41837e6a 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.cpp - implementation of ServerAccessControlManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.h b/server/src/ServerAccessControlManager.h index 9f06eec1d..e682b1da5 100644 --- a/server/src/ServerAccessControlManager.h +++ b/server/src/ServerAccessControlManager.h @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.h - header file for ServerAccessControlManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.cpp b/server/src/ServerAuthenticationManager.cpp index 5899a5b9d..ae332ca0d 100644 --- a/server/src/ServerAuthenticationManager.cpp +++ b/server/src/ServerAuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.cpp - implementation of ServerAuthenticationManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.h b/server/src/ServerAuthenticationManager.h index 1389c051c..3350af4fa 100644 --- a/server/src/ServerAuthenticationManager.h +++ b/server/src/ServerAuthenticationManager.h @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.h - header file for ServerAuthenticationManager * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/TlsServer.cpp b/server/src/TlsServer.cpp index 1f11a4d53..d8268412f 100644 --- a/server/src/TlsServer.cpp +++ b/server/src/TlsServer.cpp @@ -1,7 +1,7 @@ /* * TlsServer.cpp - header file for TlsServer * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/TlsServer.h b/server/src/TlsServer.h index c135a5878..abd9655e1 100644 --- a/server/src/TlsServer.h +++ b/server/src/TlsServer.h @@ -1,7 +1,7 @@ /* * TlsServer.h - header file for TlsServer * - * Copyright (c) 2021-2023 Tobias Junghans + * Copyright (c) 2021-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.cpp b/server/src/VeyonServerProtocol.cpp index 1f9d2f4c1..98fa41412 100644 --- a/server/src/VeyonServerProtocol.cpp +++ b/server/src/VeyonServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.cpp - implementation of the VeyonServerProtocol class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.h b/server/src/VeyonServerProtocol.h index af2100595..0e2d06665 100644 --- a/server/src/VeyonServerProtocol.h +++ b/server/src/VeyonServerProtocol.h @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.h - header file for the VeyonServerProtocol class * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.cpp b/server/src/VncProxyConnection.cpp index e3c83f743..bdbe806ab 100644 --- a/server/src/VncProxyConnection.cpp +++ b/server/src/VncProxyConnection.cpp @@ -1,7 +1,7 @@ /* * VncProxyConnection.cpp - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.h b/server/src/VncProxyConnection.h index 7f2820de1..4e29203b5 100644 --- a/server/src/VncProxyConnection.h +++ b/server/src/VncProxyConnection.h @@ -1,7 +1,7 @@ /* * VncProxyConnection.h - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnectionFactory.h b/server/src/VncProxyConnectionFactory.h index 9b986afe9..8ec88fb04 100644 --- a/server/src/VncProxyConnectionFactory.h +++ b/server/src/VncProxyConnectionFactory.h @@ -1,7 +1,7 @@ /* * VncProxyConnectionFactory.h - abstract factory class for VncProxyConnectionFactory objects * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.cpp b/server/src/VncProxyServer.cpp index 871de767b..cfad10c12 100644 --- a/server/src/VncProxyServer.cpp +++ b/server/src/VncProxyServer.cpp @@ -1,7 +1,7 @@ /* * VncProxyServer.cpp - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.h b/server/src/VncProxyServer.h index a8790c052..f8ebdb0b9 100644 --- a/server/src/VncProxyServer.h +++ b/server/src/VncProxyServer.h @@ -1,7 +1,7 @@ /* * VncProxyServer.h - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.cpp b/server/src/VncServer.cpp index fcd591eae..299a7ac44 100644 --- a/server/src/VncServer.cpp +++ b/server/src/VncServer.cpp @@ -2,7 +2,7 @@ * VncServer.cpp - implementation of VncServer, a VNC-server- * abstraction for platform independent VNC-server-usage * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.h b/server/src/VncServer.h index 02c46a719..8c321e8c4 100644 --- a/server/src/VncServer.h +++ b/server/src/VncServer.h @@ -2,7 +2,7 @@ * VncServer.h - class VncServer, a VNC server abstraction for * platform-independent VNC server usage * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/main.cpp b/server/src/main.cpp index 8e9358d8e..3e24d0799 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Server * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/veyon-server.rc.in b/server/veyon-server.rc.in index 6b7ef1536..1b6561d7e 100644 --- a/server/veyon-server.rc.in +++ b/server/veyon-server.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Server\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-server.exe\0" END END diff --git a/service/src/main.cpp b/service/src/main.cpp index 492a16197..4cadd56e3 100644 --- a/service/src/main.cpp +++ b/service/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Service * - * Copyright (c) 2006-2023 Tobias Junghans + * Copyright (c) 2006-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/service/veyon-service.rc.in b/service/veyon-service.rc.in index 776c78377..af2fd732a 100644 --- a/service/veyon-service.rc.in +++ b/service/veyon-service.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Service\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-service.exe\0" END END diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index d7953ac18..14d4cb79d 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.cpp - class which handles communication between service and feature * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/FeatureWorkerManagerConnection.h b/worker/src/FeatureWorkerManagerConnection.h index 961f7bdae..363a37e3b 100644 --- a/worker/src/FeatureWorkerManagerConnection.h +++ b/worker/src/FeatureWorkerManagerConnection.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.h - class which handles communication between worker manager and worker * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.cpp b/worker/src/VeyonWorker.cpp index 4f4a8a33e..2ef4d1c8b 100644 --- a/worker/src/VeyonWorker.cpp +++ b/worker/src/VeyonWorker.cpp @@ -1,7 +1,7 @@ /* * VeyonWorker.cpp - basic implementation of Veyon Worker * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.h b/worker/src/VeyonWorker.h index 15f4474eb..97bafac44 100644 --- a/worker/src/VeyonWorker.h +++ b/worker/src/VeyonWorker.h @@ -1,7 +1,7 @@ /* * VeyonWorker.h - basic implementation of Veyon Worker * - * Copyright (c) 2018-2023 Tobias Junghans + * Copyright (c) 2018-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/main.cpp b/worker/src/main.cpp index 302f7ee11..459d76f02 100644 --- a/worker/src/main.cpp +++ b/worker/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Feature Worker * - * Copyright (c) 2017-2023 Tobias Junghans + * Copyright (c) 2017-2024 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/veyon-worker.rc.in b/worker/veyon-worker.rc.in index 41b811b99..fd426abf5 100644 --- a/worker/veyon-worker.rc.in +++ b/worker/veyon-worker.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2023 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-worker.exe\0" END END From 4d4ec6ee9e39ffbe68bb76661712137ee95e1fc0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 23 Feb 2024 13:24:55 +0100 Subject: [PATCH 1571/1765] BuiltinDirectoryPlugin: fix misleading delimiters in help string Even though you have to use a format string corresponding to the actual format of your CSV file, in most cases semi-colon is used as delimiter (like in the other examples as well) so be consistent here. Closes #939. --- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 785cd5f4b..2e7f86ad1 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -115,7 +115,7 @@ CommandLinePluginInterface::RunResult BuiltinDirectoryPlugin::handle_help( const formatArgument(), QStringLiteral("\"%name%;%host%;%mac%\"") } }, { tr( "Import CSV file with location name in first column" ), { QStringLiteral("computers-with-rooms.csv"), - formatArgument(), QStringLiteral("\"%location%,%name%,%mac%\"") } }, + formatArgument(), QStringLiteral("\"%location%;%name%;%mac%\"") } }, { tr( "Import text file with with key/value pairs using regular expressions" ), { QStringLiteral("hostlist.txt"), locationArgument(), exampleRoom(), From f14a8b56c5b266f72df39a7fbd01ebc8ad92f914 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 6 Mar 2024 13:46:08 +0100 Subject: [PATCH 1572/1765] LinuxUserFunctions: skip DBus calls from CLI --- plugins/platform/linux/LinuxUserFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 8a65a1146..4bf6b8b65 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -243,7 +243,7 @@ QString LinuxUserFunctions::currentUser() { QString username; - if (m_systemBus.isConnected()) + if (VeyonCore::component() != VeyonCore::Component::CLI && m_systemBus.isConnected()) { const auto sessionPath = LinuxSessionFunctions::currentSessionPath(true); if (sessionPath.isEmpty() == false) From 8e76268b7df93fb0619b9255f744979a5cf3d8e4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 6 Mar 2024 17:02:58 +0100 Subject: [PATCH 1573/1765] BuiltinX11VncServer: fix build with VEYON_X11VNC_EXTERNAL --- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index 49b7cf177..c8cb383f5 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -73,11 +73,13 @@ bool BuiltinX11VncServer::runServer( int serverPort, const Password& password ) cmdline.append( extraArguments.split( QLatin1Char(' ') ) ); } +#ifndef VEYON_X11VNC_EXTERNAL if( hasWorkingXShm() == false ) { vDebug() << "X shared memory extension not available - passing -noshm to x11vnc"; cmdline.append( QStringLiteral("-noshm") ); } +#endif const auto systemEnv = QProcessEnvironment::systemEnvironment(); From 0033dc9d9330ead466f72edb53cae8b816eca0ed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 6 Mar 2024 17:03:28 +0100 Subject: [PATCH 1574/1765] BuiltinX11VncServer: add public CMake option --- plugins/vncserver/x11vnc-builtin/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt index bee13d933..155ee80d9 100644 --- a/plugins/vncserver/x11vnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/x11vnc-builtin/CMakeLists.txt @@ -1,5 +1,7 @@ include(BuildVeyonPlugin) +option(VEYON_X11VNC_EXTERNAL "Build with external x11vnc server" OFF) + if(NOT VEYON_X11VNC_EXTERNAL) get_property(HAVE_LIBVNCCLIENT GLOBAL PROPERTY HAVE_LIBVNCCLIENT) From da235ee22182608e9903ac124f9a9d756ad91bfc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 13 Mar 2024 09:59:10 +0100 Subject: [PATCH 1575/1765] LinuxServiceCore: restart server if crashed --- plugins/platform/linux/LinuxServiceCore.cpp | 9 +++++++++ plugins/platform/linux/LinuxServiceCore.h | 1 + 2 files changed, 10 insertions(+) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index a0cb77196..6f86e87e0 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -306,4 +306,13 @@ void LinuxServiceCore::checkSessionState( const QString& sessionPath ) vDebug() << "Stopping server for currently closing session" << sessionPath; stopServer( sessionPath ); } + else + { + // restart server if crashed + const auto serverProcess = m_serverProcesses.value(sessionPath); + if (serverProcess && serverProcess->state() == QProcess::NotRunning) + { + QTimer::singleShot(ServerRestartInterval, serverProcess, [serverProcess]() { serverProcess->start(); }); + } + } } diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index dbacbab89..db386a720 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -49,6 +49,7 @@ private Q_SLOTS: static constexpr auto LoginManagerReconnectInterval = 3000; static constexpr auto SessionEnvironmentProbingInterval = 1000; static constexpr auto SessionStateProbingInterval = 1000; + static constexpr auto ServerRestartInterval = 5000; void connectToLoginManager(); void startServers(); From 3e58b2c7ba1af8823fd281ffb7d0e627f46715c4 Mon Sep 17 00:00:00 2001 From: daizhengwen Date: Wed, 8 May 2024 16:42:51 +0800 Subject: [PATCH 1576/1765] veyonconfig.h.in: If WITH_TESTS is OFF, then VEYON_WITH_TESTS is not defined --- core/src/veyonconfig.h.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/veyonconfig.h.in b/core/src/veyonconfig.h.in index b8dd9f583..83b96dce1 100644 --- a/core/src/veyonconfig.h.in +++ b/core/src/veyonconfig.h.in @@ -8,4 +8,4 @@ #define VEYON_EXECUTABLE_SUFFIX "@CMAKE_EXECUTABLE_SUFFIX@" #define VEYON_SHARED_LIBRARY_SUFFIX "@CMAKE_SHARED_LIBRARY_SUFFIX@" #define CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@" -#define VEYON_WITH_TESTS "@WITH_TESTS@" +#cmakedefine VEYON_WITH_TESTS "@WITH_TESTS@" From 501838eb16c04d154e2a9ffd53f0d0f4bf7a62f6 Mon Sep 17 00:00:00 2001 From: daizhengwen Date: Wed, 8 May 2024 17:07:53 +0800 Subject: [PATCH 1577/1765] CMakeLists.txt: After WITH_TESTS is defined, define VEYON_WITH_TESTS variable of the same name --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c44807d7c..5e384504a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,6 +244,7 @@ if(WITH_TESTS) else() find_package(Qt5Test REQUIRED) endif() + set(VEYON_WITH_TESTS ON) else() set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_CXX_VISIBILITY_PRESET hidden) From 5413599c835f802002c6a060dcfb4ac23d75ffa2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 09:28:37 +0200 Subject: [PATCH 1578/1765] CI: replace Ubuntu 23.10 with Ubuntu 24.04 --- .ci/{linux.ubuntu.mantic => linux.ubuntu.24.04}/Dockerfile | 2 +- .ci/{linux.ubuntu.mantic => linux.ubuntu.24.04}/script.sh | 2 +- .gitlab-ci.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename .ci/{linux.ubuntu.mantic => linux.ubuntu.24.04}/Dockerfile (96%) rename .ci/{linux.ubuntu.mantic => linux.ubuntu.24.04}/script.sh (93%) diff --git a/.ci/linux.ubuntu.mantic/Dockerfile b/.ci/linux.ubuntu.24.04/Dockerfile similarity index 96% rename from .ci/linux.ubuntu.mantic/Dockerfile rename to .ci/linux.ubuntu.24.04/Dockerfile index bb06adaef..6b00fb81b 100644 --- a/.ci/linux.ubuntu.mantic/Dockerfile +++ b/.ci/linux.ubuntu.24.04/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:mantic +FROM ubuntu:noble MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.ubuntu.mantic/script.sh b/.ci/linux.ubuntu.24.04/script.sh similarity index 93% rename from .ci/linux.ubuntu.mantic/script.sh rename to .ci/linux.ubuntu.24.04/script.sh index 20f76df9e..77a410bdd 100755 --- a/.ci/linux.ubuntu.mantic/script.sh +++ b/.ci/linux.ubuntu.24.04/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=ubuntu.mantic" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=ubuntu.24.04" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f3fb7185..2201b51a8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,7 +21,7 @@ build-linux: - opensuse.tumbleweed - ubuntu.focal - ubuntu.jammy - - ubuntu.mantic + - ubuntu.24.04 artifacts: paths: [ "veyon*" ] expire_in: 1 day From 904c746080b295b12744f2ee1c67776daaa9abd4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 09:29:05 +0200 Subject: [PATCH 1579/1765] CI: replace Fedora 38 with Fedora 40 Fedora 38 is EOL as of 2024-05-14. Closes #951. --- .ci/{linux.fedora.38 => linux.fedora.40}/Dockerfile | 4 ++-- .ci/{linux.fedora.38 => linux.fedora.40}/script.sh | 2 +- .gitlab-ci.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename .ci/{linux.fedora.38 => linux.fedora.40}/Dockerfile (93%) rename .ci/{linux.fedora.38 => linux.fedora.40}/script.sh (95%) diff --git a/.ci/linux.fedora.38/Dockerfile b/.ci/linux.fedora.40/Dockerfile similarity index 93% rename from .ci/linux.fedora.38/Dockerfile rename to .ci/linux.fedora.40/Dockerfile index 9da97070a..8fbf6170e 100644 --- a/.ci/linux.fedora.38/Dockerfile +++ b/.ci/linux.fedora.40/Dockerfile @@ -1,8 +1,8 @@ -FROM fedora:38 +FROM fedora:40 MAINTAINER Tobias Junghans RUN \ - dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-38.noarch.rpm && \ + dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-40.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel qt6-qtwebengine-devel \ diff --git a/.ci/linux.fedora.38/script.sh b/.ci/linux.fedora.40/script.sh similarity index 95% rename from .ci/linux.fedora.38/script.sh rename to .ci/linux.fedora.40/script.sh index 9d18880ab..afc3acaa2 100755 --- a/.ci/linux.fedora.38/script.sh +++ b/.ci/linux.fedora.40/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=fedora.38" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=fedora.40" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2201b51a8..5e8a7f6f0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,8 +14,8 @@ build-linux: - debian.buster - debian.bullseye - debian.bookworm - - fedora.38 - fedora.39 + - fedora.40 - opensuse.15.4 - opensuse.15.5 - opensuse.tumbleweed From 42db3bb5c6b4501e10f2af521a423283176cd1ea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 09:29:46 +0200 Subject: [PATCH 1580/1765] GHA: bump to Fedora 40 and Ubuntu 24.04 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4549a2a04..b8efa127d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,9 +6,9 @@ jobs: matrix: dist: - debian.bookworm - - fedora.39 + - fedora.40 - opensuse.tumbleweed - - ubuntu.focal + - ubuntu.24.04 runs-on: ubuntu-latest container: veyon/ci.linux.${{matrix.dist}} steps: From e5ae7d8947e9b22a9a83b5e9281cf1aacb19cca2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 09:42:58 +0200 Subject: [PATCH 1581/1765] CI: Fedora 40: build with WITH_PCH=OFF PCH + Unity builds are broken in CMake 3.28.2 (https://gitlab.kitware.com/cmake/cmake/-/issues/25650) --- .ci/linux.fedora.40/script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/linux.fedora.40/script.sh b/.ci/linux.fedora.40/script.sh index afc3acaa2..c862ab77e 100755 --- a/.ci/linux.fedora.40/script.sh +++ b/.ci/linux.fedora.40/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=fedora.40" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DWITH_PCH=OFF -DCPACK_DIST=fedora.40" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 From e50aa88544a81941b095bb73efa10700a13420a3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 09:48:38 +0200 Subject: [PATCH 1582/1765] GHA: migrate to checkout@v4 action --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b8efa127d..ba69b43f5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest container: veyon/ci.linux.${{matrix.dist}} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 with: submodules: true - run: .ci/linux.${{matrix.dist}}/script.sh $GITHUB_WORKSPACE /tmp From 52c933a30bff81646e86af726f87de9c24f04d95 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 09:55:41 +0200 Subject: [PATCH 1583/1765] CI: Fedora 40: disable template-id-cdtor warning --- .ci/linux.fedora.40/script.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/linux.fedora.40/script.sh b/.ci/linux.fedora.40/script.sh index c862ab77e..17e1d5071 100755 --- a/.ci/linux.fedora.40/script.sh +++ b/.ci/linux.fedora.40/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DWITH_PCH=OFF -DCPACK_DIST=fedora.40" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DWITH_PCH=OFF -DCPACK_DIST=fedora.40 -DCMAKE_CXX_FLAGS=-Wno-template-id-cdtor" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 From 3b6b350ba48306aaa26474746e1a60ddc02bc097 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 10:27:37 +0200 Subject: [PATCH 1584/1765] CI: Ubuntu 24: add missing build dependency --- .ci/linux.ubuntu.24.04/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/linux.ubuntu.24.04/Dockerfile b/.ci/linux.ubuntu.24.04/Dockerfile index 6b00fb81b..41eca8841 100644 --- a/.ci/linux.ubuntu.24.04/Dockerfile +++ b/.ci/linux.ubuntu.24.04/Dockerfile @@ -6,7 +6,7 @@ RUN \ apt-get install --no-install-recommends -y \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ - qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-declarative-dev qt6-httpserver-dev qt6-webengine-dev \ + qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-declarative-dev qt6-httpserver-dev qt6-websockets-dev qt6-webengine-dev \ xorg-dev \ libfakekey-dev \ libvncserver-dev \ From 0eda21aa1f62b7a004ba5bc15e1ed04a28bd4e4a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 10:29:41 +0200 Subject: [PATCH 1585/1765] CI: drop Debian Buster It's near EOL and the backports required for CMake already are available in the Debian archive only. --- .ci/linux.debian.buster/Dockerfile | 26 -------------------------- .ci/linux.debian.buster/script.sh | 8 -------- .gitlab-ci.yml | 1 - 3 files changed, 35 deletions(-) delete mode 100644 .ci/linux.debian.buster/Dockerfile delete mode 100755 .ci/linux.debian.buster/script.sh diff --git a/.ci/linux.debian.buster/Dockerfile b/.ci/linux.debian.buster/Dockerfile deleted file mode 100644 index bdedc6eff..000000000 --- a/.ci/linux.debian.buster/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM debian:buster -MAINTAINER Tobias Junghans - -RUN \ - echo "deb http://deb.debian.org/debian buster-backports main" >> /etc/apt/sources.list && \ - apt-get update && \ - apt-get install --no-install-recommends -y \ - dpkg-dev \ - ca-certificates git binutils gcc g++ ninja-build cmake/buster-backports file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ - xorg-dev \ - libfakekey-dev \ - libjpeg-dev \ - zlib1g-dev \ - libssl-dev \ - libpam0g-dev \ - libprocps-dev \ - libldap2-dev \ - libsasl2-dev \ - libpng-dev \ - liblzo2-dev \ - libqca-qt5-2-dev libqca-qt5-2-plugins \ - libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \ - && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.debian.buster/script.sh b/.ci/linux.debian.buster/script.sh deleted file mode 100755 index 9d7ca36c9..000000000 --- a/.ci/linux.debian.buster/script.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.buster" - -$1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5e8a7f6f0..7d06526d2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,7 +11,6 @@ build-linux: matrix: - DISTRO: - centos.7.9 - - debian.buster - debian.bullseye - debian.bookworm - fedora.39 From 14ebc4821ae72ee4984c8e988722fcad5f298681 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 10:31:42 +0200 Subject: [PATCH 1586/1765] CI: replace Debian/Ubuntu release names with version numbers --- .../Dockerfile | 2 +- .ci/{linux.ubuntu.focal => linux.debian.11}/script.sh | 2 +- .../Dockerfile | 2 +- .../script.sh | 2 +- .../Dockerfile | 0 .../script.sh | 2 +- .../Dockerfile | 0 .../script.sh | 2 +- .github/workflows/build.yml | 2 +- .gitlab-ci.yml | 10 +++++----- 10 files changed, 12 insertions(+), 12 deletions(-) rename .ci/{linux.debian.bullseye => linux.debian.11}/Dockerfile (96%) rename .ci/{linux.ubuntu.focal => linux.debian.11}/script.sh (62%) rename .ci/{linux.debian.bookworm => linux.debian.12}/Dockerfile (96%) rename .ci/{linux.debian.bookworm => linux.debian.12}/script.sh (89%) rename .ci/{linux.ubuntu.focal => linux.ubuntu.20.04}/Dockerfile (100%) rename .ci/{linux.ubuntu.jammy => linux.ubuntu.20.04}/script.sh (62%) rename .ci/{linux.ubuntu.jammy => linux.ubuntu.22.04}/Dockerfile (100%) rename .ci/{linux.debian.bullseye => linux.ubuntu.22.04}/script.sh (60%) diff --git a/.ci/linux.debian.bullseye/Dockerfile b/.ci/linux.debian.11/Dockerfile similarity index 96% rename from .ci/linux.debian.bullseye/Dockerfile rename to .ci/linux.debian.11/Dockerfile index afe0d7462..05fd2aa23 100644 --- a/.ci/linux.debian.bullseye/Dockerfile +++ b/.ci/linux.debian.11/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bullseye +FROM debian:bullseye-slim MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.ubuntu.focal/script.sh b/.ci/linux.debian.11/script.sh similarity index 62% rename from .ci/linux.ubuntu.focal/script.sh rename to .ci/linux.debian.11/script.sh index 779458595..c6df59ab3 100755 --- a/.ci/linux.ubuntu.focal/script.sh +++ b/.ci/linux.debian.11/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.focal" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.11" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/linux.debian.bookworm/Dockerfile b/.ci/linux.debian.12/Dockerfile similarity index 96% rename from .ci/linux.debian.bookworm/Dockerfile rename to .ci/linux.debian.12/Dockerfile index 8767dd192..535dddcc6 100644 --- a/.ci/linux.debian.bookworm/Dockerfile +++ b/.ci/linux.debian.12/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bookworm +FROM debian:bookworm-slim MAINTAINER Tobias Junghans RUN \ diff --git a/.ci/linux.debian.bookworm/script.sh b/.ci/linux.debian.12/script.sh similarity index 89% rename from .ci/linux.debian.bookworm/script.sh rename to .ci/linux.debian.12/script.sh index 6feb839a6..acceeaa98 100755 --- a/.ci/linux.debian.bookworm/script.sh +++ b/.ci/linux.debian.12/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.bookworm" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.12" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/linux.ubuntu.focal/Dockerfile b/.ci/linux.ubuntu.20.04/Dockerfile similarity index 100% rename from .ci/linux.ubuntu.focal/Dockerfile rename to .ci/linux.ubuntu.20.04/Dockerfile diff --git a/.ci/linux.ubuntu.jammy/script.sh b/.ci/linux.ubuntu.20.04/script.sh similarity index 62% rename from .ci/linux.ubuntu.jammy/script.sh rename to .ci/linux.ubuntu.20.04/script.sh index 6850cf366..8efa29261 100755 --- a/.ci/linux.ubuntu.jammy/script.sh +++ b/.ci/linux.ubuntu.20.04/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.jammy" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.20.04" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/linux.ubuntu.jammy/Dockerfile b/.ci/linux.ubuntu.22.04/Dockerfile similarity index 100% rename from .ci/linux.ubuntu.jammy/Dockerfile rename to .ci/linux.ubuntu.22.04/Dockerfile diff --git a/.ci/linux.debian.bullseye/script.sh b/.ci/linux.ubuntu.22.04/script.sh similarity index 60% rename from .ci/linux.debian.bullseye/script.sh rename to .ci/linux.ubuntu.22.04/script.sh index c8daee8f4..8a102caca 100755 --- a/.ci/linux.debian.bullseye/script.sh +++ b/.ci/linux.ubuntu.22.04/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.bullseye" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.22.04" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ba69b43f5..28abbdf58 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,7 +5,7 @@ jobs: strategy: matrix: dist: - - debian.bookworm + - debian.12 - fedora.40 - opensuse.tumbleweed - ubuntu.24.04 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7d06526d2..fd61e579d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,15 +11,15 @@ build-linux: matrix: - DISTRO: - centos.7.9 - - debian.bullseye - - debian.bookworm + - debian.11 + - debian.12 - fedora.39 - fedora.40 - opensuse.15.4 - opensuse.15.5 - opensuse.tumbleweed - - ubuntu.focal - - ubuntu.jammy + - ubuntu.20.04 + - ubuntu.22.04 - ubuntu.24.04 artifacts: paths: [ "veyon*" ] @@ -39,7 +39,7 @@ build-windows: collect-artifacts: stage: collect - image: veyon/ci.linux.debian.bookworm:latest + image: veyon/ci.linux.debian.12:latest dependencies: [ build-linux ] only: [ tags ] script: From 9c4f42ac97577531c2c716108b0b1e19346001e1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 10:35:50 +0200 Subject: [PATCH 1587/1765] CI: drop openSUSE 15.4 It's EOL since 2023-12-07. --- .ci/linux.opensuse.15.4/Dockerfile | 19 ------------------- .ci/linux.opensuse.15.4/script.sh | 8 -------- .gitlab-ci.yml | 1 - 3 files changed, 28 deletions(-) delete mode 100644 .ci/linux.opensuse.15.4/Dockerfile delete mode 100755 .ci/linux.opensuse.15.4/script.sh diff --git a/.ci/linux.opensuse.15.4/Dockerfile b/.ci/linux.opensuse.15.4/Dockerfile deleted file mode 100644 index 3b349906b..000000000 --- a/.ci/linux.opensuse.15.4/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM opensuse/leap:15.4 -MAINTAINER Tobias Junghans - -RUN \ - zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ - libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel libqt5-qtwebengine-devel \ - libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ - libfakekey-devel \ - libjpeg8-devel \ - zlib-devel \ - libpng16-devel libpng16-compat-devel \ - libopenssl-devel \ - procps-devel \ - pam-devel lzo-devel \ - libqca-qt5-devel libqca-qt5-plugins \ - libavcodec-devel libavformat-devel libavutil-devel libswscale-devel \ - cyrus-sasl-devel \ - openldap2-devel - diff --git a/.ci/linux.opensuse.15.4/script.sh b/.ci/linux.opensuse.15.4/script.sh deleted file mode 100755 index 9cb0e7bf1..000000000 --- a/.ci/linux.opensuse.15.4/script.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=opensuse.15.4" - -$1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fd61e579d..4404672dc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,6 @@ build-linux: - debian.12 - fedora.39 - fedora.40 - - opensuse.15.4 - opensuse.15.5 - opensuse.tumbleweed - ubuntu.20.04 From 9a05bf33f8e7fe001b86d04aa3f7ccbae2238042 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 10:37:24 +0200 Subject: [PATCH 1588/1765] CI: don't install Qt WebEngine/WebKit Since the WebTabs add-on is EOL we don't need it any longer. --- .ci/linux.centos.7.9/Dockerfile | 2 +- .ci/linux.debian.11/Dockerfile | 2 +- .ci/linux.debian.12/Dockerfile | 2 +- .ci/linux.fedora.39/Dockerfile | 2 +- .ci/linux.fedora.40/Dockerfile | 2 +- .ci/linux.opensuse.15.5/Dockerfile | 2 +- .ci/linux.opensuse.tumbleweed/Dockerfile | 2 +- .ci/linux.ubuntu.20.04/Dockerfile | 2 +- .ci/linux.ubuntu.22.04/Dockerfile | 2 +- .ci/linux.ubuntu.24.04/Dockerfile | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.ci/linux.centos.7.9/Dockerfile b/.ci/linux.centos.7.9/Dockerfile index 7ae0ca8e3..b867a0e4b 100644 --- a/.ci/linux.centos.7.9/Dockerfile +++ b/.ci/linux.centos.7.9/Dockerfile @@ -6,7 +6,7 @@ RUN \ yum install -y https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm && \ yum install -y centos-release-scl && \ yum install -y git devtoolset-7 ninja-build cmake3 rpm-build fakeroot \ - qt5-qtbase-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel qt5-qtwebkit-devel \ + qt5-qtbase-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libjpeg-turbo-devel \ zlib-devel \ diff --git a/.ci/linux.debian.11/Dockerfile b/.ci/linux.debian.11/Dockerfile index 05fd2aa23..4855dd14f 100644 --- a/.ci/linux.debian.11/Dockerfile +++ b/.ci/linux.debian.11/Dockerfile @@ -6,7 +6,7 @@ RUN \ apt-get install --no-install-recommends -y \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev \ xorg-dev \ libfakekey-dev \ libpng-dev libjpeg-dev zlib1g-dev liblzo2-dev \ diff --git a/.ci/linux.debian.12/Dockerfile b/.ci/linux.debian.12/Dockerfile index 535dddcc6..ed258318d 100644 --- a/.ci/linux.debian.12/Dockerfile +++ b/.ci/linux.debian.12/Dockerfile @@ -6,7 +6,7 @@ RUN \ apt-get install --no-install-recommends -y \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev \ xorg-dev \ libfakekey-dev \ libpng-dev libjpeg-dev zlib1g-dev liblzo2-dev \ diff --git a/.ci/linux.fedora.39/Dockerfile b/.ci/linux.fedora.39/Dockerfile index e8a081d3f..e9396ff9d 100644 --- a/.ci/linux.fedora.39/Dockerfile +++ b/.ci/linux.fedora.39/Dockerfile @@ -5,7 +5,7 @@ RUN \ dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-39.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ - qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel qt6-qtwebengine-devel \ + qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ diff --git a/.ci/linux.fedora.40/Dockerfile b/.ci/linux.fedora.40/Dockerfile index 8fbf6170e..e0965b679 100644 --- a/.ci/linux.fedora.40/Dockerfile +++ b/.ci/linux.fedora.40/Dockerfile @@ -5,7 +5,7 @@ RUN \ dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-40.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ - qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel qt6-qtwebengine-devel \ + qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ diff --git a/.ci/linux.opensuse.15.5/Dockerfile b/.ci/linux.opensuse.15.5/Dockerfile index cbf7657f9..44ae40846 100644 --- a/.ci/linux.opensuse.15.5/Dockerfile +++ b/.ci/linux.opensuse.15.5/Dockerfile @@ -3,7 +3,7 @@ MAINTAINER Tobias Junghans RUN \ zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ - libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel libqt5-qtwebengine-devel \ + libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg8-devel \ diff --git a/.ci/linux.opensuse.tumbleweed/Dockerfile b/.ci/linux.opensuse.tumbleweed/Dockerfile index 2c7ff3c51..fa3613b4c 100644 --- a/.ci/linux.opensuse.tumbleweed/Dockerfile +++ b/.ci/linux.opensuse.tumbleweed/Dockerfile @@ -3,7 +3,7 @@ MAINTAINER Tobias Junghans RUN \ zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ - qt6-widgets-devel qt6-qt5compat-devel qt6-concurrent-devel qt6-linguist-devel qt6-tools-devel qt6-quickcontrols2-devel qt6-webenginewidgets-devel qt6-httpserver-devel \ + qt6-widgets-devel qt6-qt5compat-devel qt6-concurrent-devel qt6-linguist-devel qt6-tools-devel qt6-quickcontrols2-devel qt6-httpserver-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libfakekey-devel \ libjpeg8-devel \ diff --git a/.ci/linux.ubuntu.20.04/Dockerfile b/.ci/linux.ubuntu.20.04/Dockerfile index f906624fb..206eeb0d3 100644 --- a/.ci/linux.ubuntu.20.04/Dockerfile +++ b/.ci/linux.ubuntu.20.04/Dockerfile @@ -6,7 +6,7 @@ RUN \ DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev \ xorg-dev \ libfakekey-dev \ libjpeg-dev \ diff --git a/.ci/linux.ubuntu.22.04/Dockerfile b/.ci/linux.ubuntu.22.04/Dockerfile index c514853a3..6ff60f768 100644 --- a/.ci/linux.ubuntu.22.04/Dockerfile +++ b/.ci/linux.ubuntu.22.04/Dockerfile @@ -6,7 +6,7 @@ RUN \ DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev qtwebengine5-dev \ + qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qttools5-dev qttools5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev \ xorg-dev \ libfakekey-dev \ libvncserver-dev \ diff --git a/.ci/linux.ubuntu.24.04/Dockerfile b/.ci/linux.ubuntu.24.04/Dockerfile index 41eca8841..6b1c2ac06 100644 --- a/.ci/linux.ubuntu.24.04/Dockerfile +++ b/.ci/linux.ubuntu.24.04/Dockerfile @@ -6,7 +6,7 @@ RUN \ apt-get install --no-install-recommends -y \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ - qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-declarative-dev qt6-httpserver-dev qt6-websockets-dev qt6-webengine-dev \ + qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-declarative-dev qt6-httpserver-dev qt6-websockets-dev \ xorg-dev \ libfakekey-dev \ libvncserver-dev \ From 77fd457f27f3e679134d26056cd1185db972cd91 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 14 May 2024 10:39:08 +0200 Subject: [PATCH 1589/1765] CI: drop unused SAST image Rely on GHA CodeQL instead. --- .ci/linux.sast/Dockerfile | 10 ---------- .ci/linux.sast/script.sh | 8 -------- 2 files changed, 18 deletions(-) delete mode 100755 .ci/linux.sast/Dockerfile delete mode 100755 .ci/linux.sast/script.sh diff --git a/.ci/linux.sast/Dockerfile b/.ci/linux.sast/Dockerfile deleted file mode 100755 index 89c52064f..000000000 --- a/.ci/linux.sast/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM debian:bullseye -MAINTAINER Tobias Junghans - -RUN \ - apt-get update && \ - apt-get install -y \ - flawfinder \ - && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* diff --git a/.ci/linux.sast/script.sh b/.ci/linux.sast/script.sh deleted file mode 100755 index 3b4328a1a..000000000 --- a/.ci/linux.sast/script.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -cd $1 - -flawfinder -Q -c core plugins master server service configurator cli worker - From 2677d97aac5942821b5500ea689e61591c435eaa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 May 2024 10:36:27 +0200 Subject: [PATCH 1590/1765] BuiltinDirectoryPlugin: include location in export help string --- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 2e7f86ad1..9c552ef4d 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -144,6 +144,7 @@ CommandLinePluginInterface::RunResult BuiltinDirectoryPlugin::handle_help( const formatArgument(), QStringLiteral("\"%type%;%name%;%host%;%mac%\"") } }, { tr( "Export all computers in a specific location to a CSV file" ), { QStringLiteral("computers.csv"), + locationArgument(), exampleRoom(), formatArgument(), QStringLiteral("\"%name%;%host%;%mac%\"") } } } ); From 9d3885f042b534952b350283d49b6ed9ab5f1b8e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 May 2024 10:36:47 +0200 Subject: [PATCH 1591/1765] BuiltinDirectoryPlugin: show error if location to export is not found --- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 9c552ef4d..0aa06d7ab 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -647,6 +647,11 @@ bool BuiltinDirectoryPlugin::exportFile( QFile& outputFile, const QString& forma if( location.isEmpty() == false ) { locationObject = objectManager.findByName( location ); + if (locationObject.isValid() == false) + { + error(tr("Location \"%1\" not found." ).arg(location)); + return false; + } } QStringList lines; From 1c667f98b3662a1f6fe26bb27acef61a8d10fd33 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 May 2024 10:37:12 +0200 Subject: [PATCH 1592/1765] BuiltinDirectoryPlugin: only export host objects --- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 0aa06d7ab..f06fd74e7 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -660,6 +660,10 @@ bool BuiltinDirectoryPlugin::exportFile( QFile& outputFile, const QString& forma for( auto it = networkObjects.constBegin(), end = networkObjects.constEnd(); it != end; ++it ) { const NetworkObject networkObject{it->toObject()}; + if (networkObject.type() != NetworkObject::Type::Host) + { + continue; + } auto currentLocation = location; From 876c3b0d02f17b48fd957ef78a07d91378b6359f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 29 May 2024 10:37:35 +0200 Subject: [PATCH 1593/1765] BuiltinDirectoryPlugin: use QLatin1Char for joining lines --- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index f06fd74e7..83130eefc 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -685,7 +685,7 @@ bool BuiltinDirectoryPlugin::exportFile( QFile& outputFile, const QString& forma // append empty string to generate final newline at end of file lines += QString(); - outputFile.write( lines.join( QStringLiteral("\n") ).toUtf8() ); + outputFile.write(lines.join(QLatin1Char('\n')).toUtf8()); return true; } From f31bff78edebed85cecf16d90ee4e3fa10305fc3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 12 Jul 2024 16:01:56 +0200 Subject: [PATCH 1594/1765] CMake: only define FORTIFY_SOURCE if not passed via CFLAGS/CXXFLAGS --- CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5e384504a..c79fae010 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,8 +25,6 @@ endif() if(VEYON_DEBUG) add_definitions(-DVEYON_DEBUG) -else() - add_definitions(-D_FORTIFY_SOURCE=2) endif() set(CMAKE_EXPORT_COMPILE_COMMANDS 1) @@ -237,6 +235,10 @@ endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-strong ${CFLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong -fno-exceptions ${CXXFLAGS}") +if(NOT VEYON_DEBUG AND NOT CMAKE_C_FLAGS MATCHES "FORTIFY_SOURCE" AND NOT CMAKE_CXX_FLAGS MATCHES "FORTIFY_SOURCE") + add_definitions(-D_FORTIFY_SOURCE=2) +endif() + if(WITH_TESTS) enable_testing(TRUE) if(WITH_QT6) From bd6e0e50a200f3bb04078661e999a1a072abe5b7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Jul 2024 13:57:47 +0200 Subject: [PATCH 1595/1765] VeyonCore: add application version Version_4_9 (cherry picked from commit 6ee6a4b25b28c626870b6bf4de37a72fa421c3ca) --- core/src/VeyonCore.h | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index d74bd040e..7858cd44d 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -81,6 +81,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject Version_4_6, Version_4_7, Version_4_8, + Version_4_9, Version_5_0, }; Q_ENUM(ApplicationVersion) From 55e5e4ffd889889e6f2cf77dfe3273c5ebd41df2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Jul 2024 14:03:23 +0200 Subject: [PATCH 1596/1765] Centralize user groups backend configuration This decouples user groups backend configuration from access control configuration. This improves usability and allows selecting non-system groups (e.g. from Entra ID) in the AuthKeysConfigurationPage when setting an access group for a key file. (cherry picked from commit 947afb910df3e75f1a9607a0725d4128d1240e7e) --- configurator/src/AccessControlPage.cpp | 23 ++-------- configurator/src/AccessControlPage.ui | 45 +++++-------------- configurator/src/GeneralConfigurationPage.cpp | 31 ++++++++++++- configurator/src/GeneralConfigurationPage.ui | 27 +++++++++++ core/src/AccessControlProvider.cpp | 19 ++++---- core/src/AccessControlProvider.h | 2 +- core/src/UserGroupsBackendManager.cpp | 12 ++--- core/src/UserGroupsBackendManager.h | 9 +--- core/src/VeyonConfiguration.cpp | 6 +++ core/src/VeyonConfigurationProperties.h | 9 +++- .../authkeys/AuthKeysConfigurationWidget.cpp | 4 +- 11 files changed, 107 insertions(+), 80 deletions(-) diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index 9fa8909f2..046984df4 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -44,21 +44,6 @@ AccessControlPage::AccessControlPage( QWidget* parent ) : { ui->setupUi(this); - if( VeyonCore::userGroupsBackendManager().accessControlBackend() == nullptr ) - { - QMessageBox::critical( this, - tr( "Missing user groups backend" ), - tr( "No default user groups plugin was found. " - "Please check your installation!" ) ); - qFatal( "AccessControlPage: missing default user groups backend" ); - } - - const auto backends = VeyonCore::userGroupsBackendManager().availableBackends(); - for( auto it = backends.constBegin(), end = backends.constEnd(); it != end; ++it ) - { - ui->accessControlUserGroupsBackend->addItem( it.value(), it.key() ); - } - ui->accessControlRulesView->setModel( &m_accessControlRulesModel ); updateAccessGroupsLists(); @@ -95,8 +80,6 @@ void AccessControlPage::connectWidgetsToProperties() void AccessControlPage::applyConfiguration() { - VeyonCore::userGroupsBackendManager().reloadConfiguration(); - resetWidgets(); } @@ -142,8 +125,10 @@ void AccessControlPage::updateAccessGroupsLists() ui->allGroupsList->clear(); ui->accessGroupsList->clear(); - const auto backend = VeyonCore::userGroupsBackendManager().accessControlBackend(); - const auto groups = backend->userGroups( VeyonCore::config().domainGroupsForAccessControlEnabled() ); + VeyonCore::userGroupsBackendManager().reloadConfiguration(); + + const auto backend = VeyonCore::userGroupsBackendManager().configuredBackend(); + const auto groups = backend->userGroups(VeyonCore::config().useDomainUserGroups()); for( const auto& group : groups ) { diff --git a/configurator/src/AccessControlPage.ui b/configurator/src/AccessControlPage.ui index c88cd0e18..f3df86097 100644 --- a/configurator/src/AccessControlPage.ui +++ b/configurator/src/AccessControlPage.ui @@ -18,31 +18,17 @@ Computer access control - - + + - Restrict access to members of specific user groups + Process access control rules accessControlModeGroup - - - - - - User groups backend: - - - - - - - - - + false @@ -56,17 +42,7 @@ - - - - Process access control rules - - - accessControlModeGroup - - - - + false @@ -80,7 +56,7 @@ - + Grant access to every authenticated user (default) @@ -93,11 +69,14 @@ - - + + - Enable usage of domain groups + Restrict access to members of specific user groups + + accessControlModeGroup + diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index 8069cd00e..b8ddb57e8 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -25,15 +25,17 @@ #include #include +#include "AuthenticationCredentials.h" #include "Configuration/UiMapping.h" #include "GeneralConfigurationPage.h" #include "Filesystem.h" #include "FileSystemBrowser.h" #include "PlatformFilesystemFunctions.h" -#include "PlatformUserFunctions.h" +#include "PluginManager.h" #include "VeyonServiceControl.h" #include "VeyonCore.h" #include "VeyonConfiguration.h" +#include "UserGroupsBackendManager.h" #include "ui_GeneralConfigurationPage.h" @@ -80,6 +82,30 @@ GeneralConfigurationPage::GeneralConfigurationPage( QWidget* parent ) : ui->uiLanguage->addItems( languages ); + const auto backends = VeyonCore::userGroupsBackendManager().availableBackends(); + if (backends.count() <= 0) + { + QMessageBox::critical(this, + tr("Missing user groups backend"), + tr("No user groups plugin was found. Please check your installation!")); + qFatal("GeneralConfigurationPage: missing user groups backend"); + } + + for (auto it = backends.constBegin(), end = backends.constEnd(); it != end; ++it) + { + ui->userGroupsBackend->addItem(it.value(), it.key()); + } + + connect( ui->userGroupsBackend, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { + const auto selectedBackend = ui->userGroupsBackend->currentData().toUuid(); + + ui->useDomainUserGroups->setEnabled(VeyonCore::pluginManager().find( + [&selectedBackend](const PluginInterface* plugin) { + return plugin->uid() == selectedBackend && + plugin->flags().testFlag(Plugin::ProvidesDefaultImplementation); + }) != nullptr); + }); + connect( ui->openLogFileDirectory, &QPushButton::clicked, this, &GeneralConfigurationPage::openLogFileDirectory ); connect( ui->clearLogFiles, &QPushButton::clicked, this, &GeneralConfigurationPage::clearLogFiles ); } @@ -97,6 +123,7 @@ void GeneralConfigurationPage::resetWidgets() { FOREACH_VEYON_UI_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); FOREACH_VEYON_LOGGING_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); + FOREACH_VEYON_USER_GROUPS_BACKEND_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); FOREACH_VEYON_TLS_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); } @@ -106,6 +133,7 @@ void GeneralConfigurationPage::connectWidgetsToProperties() { FOREACH_VEYON_UI_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); FOREACH_VEYON_LOGGING_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); + FOREACH_VEYON_USER_GROUPS_BACKEND_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); FOREACH_VEYON_TLS_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); } @@ -113,6 +141,7 @@ void GeneralConfigurationPage::connectWidgetsToProperties() void GeneralConfigurationPage::applyConfiguration() { + VeyonCore::userGroupsBackendManager().reloadConfiguration(); } diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index 607249d3c..7d006c835 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -71,6 +71,32 @@ + + + + User groups + + + + + + Backend: + + + + + + + + + + Include user groups from domain + + + + + + @@ -367,6 +393,7 @@ applicationName uiLanguage uiStyle + userGroupsBackend logFileDirectory openLogFileDirectory logLevel diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 87d0ae755..99c9bb6ee 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -38,9 +38,10 @@ AccessControlProvider::AccessControlProvider() : - m_userGroupsBackend( VeyonCore::userGroupsBackendManager().accessControlBackend() ), - m_networkObjectDirectory( VeyonCore::networkObjectDirectoryManager().configuredDirectory() ), - m_queryDomainGroups( VeyonCore::config().domainGroupsForAccessControlEnabled() ) + m_accessControlRules(), + m_userGroupsBackend(VeyonCore::userGroupsBackendManager().configuredBackend()), + m_networkObjectDirectory(VeyonCore::networkObjectDirectoryManager().configuredDirectory()), + m_useDomainUserGroups(VeyonCore::config().useDomainUserGroups()) { const QJsonArray accessControlRules = VeyonCore::config().accessControlRules(); @@ -56,7 +57,7 @@ AccessControlProvider::AccessControlProvider() : QStringList AccessControlProvider::userGroups() const { - auto userGroupList = m_userGroupsBackend->userGroups( m_queryDomainGroups ); + auto userGroupList = m_userGroupsBackend->userGroups(m_useDomainUserGroups); std::sort( userGroupList.begin(), userGroupList.end() ); @@ -167,7 +168,7 @@ bool AccessControlProvider::processAuthorizedGroups( const QString& accessingUse { vDebug() << "processing for user" << accessingUser; - const auto groupsOfAccessingUser = m_userGroupsBackend->groupsOfUser( accessingUser, m_queryDomainGroups ); + const auto groupsOfAccessingUser = m_userGroupsBackend->groupsOfUser( accessingUser, m_useDomainUserGroups ); const auto authorizedUserGroups = VeyonCore::config().authorizedUserGroups(); vDebug() << groupsOfAccessingUser << authorizedUserGroups; @@ -257,10 +258,10 @@ bool AccessControlProvider::isMemberOfUserGroup( const QString &user, if( groupNameRX.isValid() ) { - return m_userGroupsBackend->groupsOfUser( user, m_queryDomainGroups ).indexOf( groupNameRX ) >= 0; + return m_userGroupsBackend->groupsOfUser( user, m_useDomainUserGroups ).indexOf( groupNameRX ) >= 0; } - return m_userGroupsBackend->groupsOfUser( user, m_queryDomainGroups ).contains( groupName ); + return m_userGroupsBackend->groupsOfUser( user, m_useDomainUserGroups ).contains( groupName ); } @@ -274,8 +275,8 @@ bool AccessControlProvider::isLocatedAt( const QString &computer, const QString bool AccessControlProvider::haveGroupsInCommon( const QString &userOne, const QString &userTwo ) const { - const auto userOneGroups = m_userGroupsBackend->groupsOfUser( userOne, m_queryDomainGroups ); - const auto userTwoGroups = m_userGroupsBackend->groupsOfUser( userTwo, m_queryDomainGroups ); + const auto userOneGroups = m_userGroupsBackend->groupsOfUser( userOne, m_useDomainUserGroups ); + const auto userTwoGroups = m_userGroupsBackend->groupsOfUser( userTwo, m_useDomainUserGroups ); #if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) const auto userOneGroupSet = QSet{ userOneGroups.begin(), userOneGroups.end() }; diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index f66de0109..d08e2674a 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -85,6 +85,6 @@ class VEYON_CORE_EXPORT AccessControlProvider QList m_accessControlRules{}; UserGroupsBackendInterface* m_userGroupsBackend; NetworkObjectDirectory* m_networkObjectDirectory; - bool m_queryDomainGroups; + bool m_useDomainUserGroups; } ; diff --git a/core/src/UserGroupsBackendManager.cpp b/core/src/UserGroupsBackendManager.cpp index 279d9be2f..2f05c9b8d 100644 --- a/core/src/UserGroupsBackendManager.cpp +++ b/core/src/UserGroupsBackendManager.cpp @@ -70,24 +70,24 @@ QMap UserGroupsBackendManager::availableBackends() -UserGroupsBackendInterface* UserGroupsBackendManager::accessControlBackend() +UserGroupsBackendInterface* UserGroupsBackendManager::configuredBackend() { - if( m_accessControlBackend == nullptr ) + if (m_configuredBackend == nullptr) { reloadConfiguration(); } - return m_accessControlBackend; + return m_configuredBackend; } void UserGroupsBackendManager::reloadConfiguration() { - m_accessControlBackend = m_backends.value( VeyonCore::config().accessControlUserGroupsBackend() ); + m_configuredBackend = m_backends.value(VeyonCore::config().userGroupsBackend()); - if( m_accessControlBackend == nullptr ) + if( m_configuredBackend == nullptr ) { - m_accessControlBackend = m_defaultBackend; + m_configuredBackend = m_defaultBackend; } } diff --git a/core/src/UserGroupsBackendManager.h b/core/src/UserGroupsBackendManager.h index ac6333bc1..0b50195c0 100644 --- a/core/src/UserGroupsBackendManager.h +++ b/core/src/UserGroupsBackendManager.h @@ -41,18 +41,13 @@ class VEYON_CORE_EXPORT UserGroupsBackendManager : public QObject QMap availableBackends(); - UserGroupsBackendInterface* defaultBackend() const - { - return m_defaultBackend; - } - - UserGroupsBackendInterface* accessControlBackend(); + UserGroupsBackendInterface* configuredBackend(); void reloadConfiguration(); private: Backends m_backends{}; UserGroupsBackendInterface* m_defaultBackend{nullptr}; - UserGroupsBackendInterface* m_accessControlBackend{nullptr}; + UserGroupsBackendInterface* m_configuredBackend{nullptr}; }; diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index 175ae7f82..02b96b7c9 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -76,4 +76,10 @@ void VeyonConfiguration::upgrade() { setApplicationVersion(VeyonCore::ApplicationVersion::Version_4_8); } + else if (applicationVersion() < VeyonCore::ApplicationVersion::Version_4_9) + { + setUserGroupsBackend(legacyAccessControlUserGroupsBackend()); + setUseDomainUserGroups(legacyDomainGroupsForAccessControlEnabled()); + setApplicationVersion(VeyonCore::ApplicationVersion::Version_4_9); + } } diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 9fb2fd733..a34d978b2 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -73,6 +73,10 @@ OP( VeyonConfiguration, VeyonCore::config(), QStringList, enabledNetworkObjectDirectoryPlugins, setEnabledNetworkObjectDirectoryPlugins, "EnabledPlugins", "NetworkObjectDirectory", QStringList(), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, networkObjectDirectoryUpdateInterval, setNetworkObjectDirectoryUpdateInterval, "UpdateInterval", "NetworkObjectDirectory", NetworkObjectDirectory::DefaultUpdateInterval, Configuration::Property::Flag::Standard ) \ +#define FOREACH_VEYON_USER_GROUPS_BACKEND_CONFIG_PROPERTY(OP) \ + OP( VeyonConfiguration, VeyonCore::config(), QUuid, userGroupsBackend, setUserGroupsBackend, "Backend", "UserGroups", QUuid(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, useDomainUserGroups, setUseDomainUserGroups, "UseDomainUserGroups", "UserGroups", false, Configuration::Property::Flag::Standard ) \ + #define FOREACH_VEYON_FEATURES_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QStringList, disabledFeatures, setDisabledFeatures, "DisabledFeatures", "Features", QStringList(), Configuration::Property::Flag::Standard ) \ @@ -137,14 +141,14 @@ OP( VeyonConfiguration, VeyonCore::config(), QStringList, enabledAuthenticationPlugins, setEnabledAuthenticationPlugins, "EnabledPlugins", "Authentication", QStringList(), Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_ACCESS_CONTROL_CONFIG_PROPERTY(OP) \ - OP( VeyonConfiguration, VeyonCore::config(), QUuid, accessControlUserGroupsBackend, setAccessControlUserGroupsBackend, "UserGroupsBackend", "AccessControl", QUuid(), Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), bool, domainGroupsForAccessControlEnabled, setDomainGroupsForAccessControlEnabled, "DomainGroupsEnabled", "AccessControl", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, isAccessRestrictedToUserGroups, setAccessRestrictedToUserGroups, "AccessRestrictedToUserGroups", "AccessControl", false , Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, isAccessControlRulesProcessingEnabled, setAccessControlRulesProcessingEnabled, "AccessControlRulesProcessingEnabled", "AccessControl", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QStringList, authorizedUserGroups, setAuthorizedUserGroups, "AuthorizedUserGroups", "AccessControl", QStringList(), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QJsonArray, accessControlRules, setAccessControlRules, "AccessControlRules", "AccessControl", QJsonArray(), Configuration::Property::Flag::Standard ) \ #define FOREACH_VEYON_LEGACY_CONFIG_PROPERTY(OP) \ + OP( VeyonConfiguration, VeyonCore::config(), QUuid, legacyAccessControlUserGroupsBackend, setLegacyAccessControlUserGroupsBackend, "UserGroupsBackend", "AccessControl", QUuid(), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, legacyDomainGroupsForAccessControlEnabled, setLegacyDomainGroupsForAccessControlEnabled, "DomainGroupsEnabled", "AccessControl", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, legacyAutoAdjustGridSize, setLegacyAutoAdjustGridSize, "AutoAdjustGridSize", "Master", false, Configuration::Property::Flag::Legacy ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, legacyOpenComputerManagementAtStart, setLegacyOpenComputerManagementAtStart, "OpenComputerManagementAtStart", "Master", false, Configuration::Property::Flag::Legacy ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, legacyAutoSwitchToCurrentRoom, setLegacyAutoSwitchToCurrentRoom, "AutoSwitchToCurrentRoom", "Master", false, Configuration::Property::Flag::Legacy ) \ @@ -166,6 +170,7 @@ FOREACH_VEYON_LOGGING_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_TLS_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(OP)\ + FOREACH_VEYON_USER_GROUPS_BACKEND_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_FEATURES_CONFIG_PROPERTY(OP)\ FOREACH_VEYON_VNC_SERVER_CONFIG_PROPERTY(OP) \ FOREACH_VEYON_NETWORK_CONFIG_PROPERTY(OP) \ diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.cpp b/plugins/authkeys/AuthKeysConfigurationWidget.cpp index 2af015701..76acddac2 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.cpp +++ b/plugins/authkeys/AuthKeysConfigurationWidget.cpp @@ -30,7 +30,7 @@ #include "AuthKeysConfigurationWidget.h" #include "AuthKeysManager.h" #include "FileSystemBrowser.h" -#include "PlatformUserFunctions.h" +#include "UserGroupsBackendManager.h" #include "VeyonConfiguration.h" #include "Configuration/UiMapping.h" @@ -208,7 +208,7 @@ void AuthKeysConfigurationWidget::setAccessGroup() if( key.isEmpty() == false ) { - const auto userGroups = VeyonCore::platform().userFunctions().userGroups( VeyonCore::config().domainGroupsForAccessControlEnabled() ); + const auto userGroups = VeyonCore::userGroupsBackendManager().configuredBackend()->userGroups(VeyonCore::config().useDomainUserGroups()); const auto currentGroup = m_manager.accessGroup( key ); bool ok = false; From e9259f81258a8ebad9f9b18ec6db85ca78659290 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Jul 2024 14:28:54 +0200 Subject: [PATCH 1597/1765] CMake: default to Qt 6 --- .ci/linux.centos.7.9/script.sh | 2 +- .ci/linux.debian.11/script.sh | 2 +- .ci/linux.debian.12/script.sh | 2 +- .ci/linux.fedora.39/script.sh | 2 +- .ci/linux.fedora.40/script.sh | 2 +- .ci/linux.opensuse.15.5/script.sh | 2 +- .ci/linux.opensuse.tumbleweed/script.sh | 2 +- .ci/linux.ubuntu.20.04/script.sh | 2 +- .ci/linux.ubuntu.22.04/script.sh | 2 +- .ci/linux.ubuntu.24.04/script.sh | 2 +- .ci/windows/build.sh | 1 - CMakeLists.txt | 2 +- 12 files changed, 11 insertions(+), 12 deletions(-) diff --git a/.ci/linux.centos.7.9/script.sh b/.ci/linux.centos.7.9/script.sh index 759e37c78..5aba99b69 100755 --- a/.ci/linux.centos.7.9/script.sh +++ b/.ci/linux.centos.7.9/script.sh @@ -4,7 +4,7 @@ source scl_source enable devtoolset-7 set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=centos.7.9" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=centos.7.9" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.debian.11/script.sh b/.ci/linux.debian.11/script.sh index c6df59ab3..f4f313a6c 100755 --- a/.ci/linux.debian.11/script.sh +++ b/.ci/linux.debian.11/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.11" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=debian.11" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/linux.debian.12/script.sh b/.ci/linux.debian.12/script.sh index acceeaa98..75d84adc9 100755 --- a/.ci/linux.debian.12/script.sh +++ b/.ci/linux.debian.12/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=debian.12" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=debian.12" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/linux.fedora.39/script.sh b/.ci/linux.fedora.39/script.sh index 42b4c5119..d6331da02 100755 --- a/.ci/linux.fedora.39/script.sh +++ b/.ci/linux.fedora.39/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=fedora.39" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.39" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.fedora.40/script.sh b/.ci/linux.fedora.40/script.sh index 17e1d5071..aa6dab734 100755 --- a/.ci/linux.fedora.40/script.sh +++ b/.ci/linux.fedora.40/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DWITH_PCH=OFF -DCPACK_DIST=fedora.40 -DCMAKE_CXX_FLAGS=-Wno-template-id-cdtor" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_PCH=OFF -DCPACK_DIST=fedora.40 -DCMAKE_CXX_FLAGS=-Wno-template-id-cdtor" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.opensuse.15.5/script.sh b/.ci/linux.opensuse.15.5/script.sh index 9d4696e3b..c1a30a512 100755 --- a/.ci/linux.opensuse.15.5/script.sh +++ b/.ci/linux.opensuse.15.5/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=opensuse.15.5" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=opensuse.15.5" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.opensuse.tumbleweed/script.sh b/.ci/linux.opensuse.tumbleweed/script.sh index 08e09df6c..ee8f471a8 100755 --- a/.ci/linux.opensuse.tumbleweed/script.sh +++ b/.ci/linux.opensuse.tumbleweed/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=opensuse.tumbleweed" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=opensuse.tumbleweed" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.ubuntu.20.04/script.sh b/.ci/linux.ubuntu.20.04/script.sh index 8efa29261..4c14dc4a8 100755 --- a/.ci/linux.ubuntu.20.04/script.sh +++ b/.ci/linux.ubuntu.20.04/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.20.04" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=ubuntu.20.04" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/linux.ubuntu.22.04/script.sh b/.ci/linux.ubuntu.22.04/script.sh index 8a102caca..ec867b7de 100755 --- a/.ci/linux.ubuntu.22.04/script.sh +++ b/.ci/linux.ubuntu.22.04/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.22.04" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=ubuntu.22.04" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/linux.ubuntu.24.04/script.sh b/.ci/linux.ubuntu.24.04/script.sh index 77a410bdd..d6025bef0 100755 --- a/.ci/linux.ubuntu.24.04/script.sh +++ b/.ci/linux.ubuntu.24.04/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=ON -DCPACK_DIST=ubuntu.24.04" +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=ubuntu.24.04" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-deb.sh $1 $2 diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh index b130d31f2..326f7229e 100755 --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -14,7 +14,6 @@ cd $BUILDDIR PREFIX=/usr/$1-w64-mingw32 $PREFIX/bin/qt-cmake $BASEDIR \ -G Ninja \ - -DWITH_QT6=ON \ -DQT_TRANSLATIONS_DIR=$PREFIX/translations \ $CMAKE_FLAGS diff --git a/CMakeLists.txt b/CMakeLists.txt index c79fae010..b36a20e73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -166,7 +166,7 @@ endif() # find required Qt modules -option(WITH_QT6 "Build for Qt 6" OFF) +option(WITH_QT6 "Build for Qt 6" ON) if(WITH_QT6) set(QT_MAJOR_VERSION 6) find_package(Qt6 COMPONENTS From 4d306e2ea727dfb89bf688667a940f7c834d1e94 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 26 Jul 2024 14:42:51 +0200 Subject: [PATCH 1598/1765] CI: disable Qt 6 for CodeQL --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c7fffe687..bacb155d2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -53,7 +53,7 @@ jobs: run: | mkdir -p $GITHUB_WORKSPACE/build cd $GITHUB_WORKSPACE/build - cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_LTO=OFF -DWITH_TRANSLATIONS=OFF .. + cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_QT6=OFF -DWITH_LTO=OFF -DWITH_TRANSLATIONS=OFF .. ninja - name: Perform CodeQL Analysis From 38f8b4fb3925286e2c901b9ff82e875bbdea203c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 2 Aug 2024 14:32:06 +0200 Subject: [PATCH 1599/1765] CI: install qt6-l10n-tools on Ubuntu 24.04 --- .ci/linux.ubuntu.24.04/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/linux.ubuntu.24.04/Dockerfile b/.ci/linux.ubuntu.24.04/Dockerfile index 6b1c2ac06..c6c0b81c9 100644 --- a/.ci/linux.ubuntu.24.04/Dockerfile +++ b/.ci/linux.ubuntu.24.04/Dockerfile @@ -6,7 +6,7 @@ RUN \ apt-get install --no-install-recommends -y \ dpkg-dev \ ca-certificates git binutils gcc g++ ninja-build cmake file fakeroot bzip2 \ - qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-declarative-dev qt6-httpserver-dev qt6-websockets-dev \ + qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-tools-dev qt6-declarative-dev qt6-httpserver-dev qt6-websockets-dev \ xorg-dev \ libfakekey-dev \ libvncserver-dev \ From f499f3916264a5e6508ef7d45e0602b5aafac076 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 6 Sep 2024 09:49:22 +0200 Subject: [PATCH 1600/1765] AuthKeysConfigurationPage: only prompt for key name if empty Also emphasize that the key name has to match on all computers. --- plugins/authkeys/AuthKeysConfigurationWidget.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.cpp b/plugins/authkeys/AuthKeysConfigurationWidget.cpp index 76acddac2..6a5d4dd20 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.cpp +++ b/plugins/authkeys/AuthKeysConfigurationWidget.cpp @@ -152,10 +152,14 @@ void AuthKeysConfigurationWidget::importKey() return; } - const auto keyName = QInputDialog::getText( this, tr( "Authentication key name" ), - tr( "Please enter the name of the user group or role for which to import the authentication key:"), - QLineEdit::Normal, - AuthKeysManager::keyNameFromExportedKeyFile( inputFile ) ); + auto keyName = AuthKeysManager::keyNameFromExportedKeyFile(inputFile); + if (keyName.isEmpty()) + { + keyName = QInputDialog::getText(this, tr("Authentication key name"), + tr("Please enter the name of the user group or role for which to import the authentication key.\n\nMake sure that the names of the keys belonging to each other are identical on all computers."), + QLineEdit::Normal); + } + if( keyName.isEmpty() ) { return; From 10e9b421f4947760747db54cdb5d726c158f82aa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 6 Sep 2024 11:19:55 +0200 Subject: [PATCH 1601/1765] VeyonMasterInterface: add computerControlListModelAboutToReset() signal --- core/src/VeyonMasterInterface.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/VeyonMasterInterface.h b/core/src/VeyonMasterInterface.h index 2457d5ea2..1b509579f 100644 --- a/core/src/VeyonMasterInterface.h +++ b/core/src/VeyonMasterInterface.h @@ -57,4 +57,7 @@ class VEYON_CORE_EXPORT VeyonMasterInterface : public QObject virtual ComputerControlInterfaceList selectedComputerControlInterfaces() const = 0; virtual ComputerControlInterfaceList filteredComputerControlInterfaces() const = 0; +Q_SIGNALS: + void computerControlListModelAboutToReset(); + }; From 9fe0b131e2f9b1b71d0eb0f2eb69369c7e9b7948 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 6 Sep 2024 11:20:39 +0200 Subject: [PATCH 1602/1765] VeyonMaster: drop unused headers --- master/src/VeyonMaster.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index f5f59204a..8413076a4 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -39,9 +39,7 @@ #include "PluginManager.h" #include "UserConfig.h" #include "VeyonConfiguration.h" -#include "VeyonConnection.h" #include "VeyonMaster.h" -#include "VncConnection.h" VeyonMaster::VeyonMaster( QObject* parent ) : From 62b29c6db6f3f4d9e9030737bedd8110138295c1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 6 Sep 2024 11:20:50 +0200 Subject: [PATCH 1603/1765] VeyonMaster: emit computerControlListModelAboutToReset() signal --- master/src/VeyonMaster.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 8413076a4..c0cf897d2 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -59,6 +59,9 @@ VeyonMaster::VeyonMaster( QObject* parent ) : this ), m_currentMode( VeyonCore::builtinFeatures().monitoringMode().feature().uid() ) { + connect(m_computerControlListModel, &ComputerControlListModel::modelAboutToBeReset, + this, &VeyonMaster::computerControlListModelAboutToReset); + if( VeyonCore::config().enforceSelectedModeForClients() ) { connect( m_computerControlListModel, &ComputerControlListModel::activeFeaturesChanged, From 21df7420473c084f9061a95eb3ecf5ad96cac72e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 6 Sep 2024 11:21:52 +0200 Subject: [PATCH 1604/1765] GeneralConfigurationPage: adjust layout --- configurator/src/GeneralConfigurationPage.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index 7d006c835..fa8ee3f55 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -76,7 +76,7 @@ User groups - + From d3357a96315e314025991910b09f7f9e28bd77dc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 6 Sep 2024 14:23:50 +0200 Subject: [PATCH 1605/1765] CI: add openSUSE 15.6 --- .ci/linux.opensuse.15.6/Dockerfile | 19 +++++++++++++++++++ .ci/linux.opensuse.15.6/script.sh | 8 ++++++++ .gitlab-ci.yml | 1 + 3 files changed, 28 insertions(+) create mode 100644 .ci/linux.opensuse.15.6/Dockerfile create mode 100755 .ci/linux.opensuse.15.6/script.sh diff --git a/.ci/linux.opensuse.15.6/Dockerfile b/.ci/linux.opensuse.15.6/Dockerfile new file mode 100644 index 000000000..39ceb644d --- /dev/null +++ b/.ci/linux.opensuse.15.6/Dockerfile @@ -0,0 +1,19 @@ +FROM opensuse/leap:15.6 +MAINTAINER Tobias Junghans + +RUN \ + zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ + libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel \ + libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ + libfakekey-devel \ + libjpeg8-devel \ + zlib-devel \ + libpng16-devel libpng16-compat-devel \ + libopenssl-devel \ + procps-devel \ + pam-devel lzo-devel \ + libqca-qt5-devel libqca-qt5-plugins \ + libavcodec-devel libavformat-devel libavutil-devel libswscale-devel \ + cyrus-sasl-devel \ + openldap2-devel + diff --git a/.ci/linux.opensuse.15.6/script.sh b/.ci/linux.opensuse.15.6/script.sh new file mode 100755 index 000000000..db0f888f0 --- /dev/null +++ b/.ci/linux.opensuse.15.6/script.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=opensuse.15.6" + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4404672dc..0c576ba85 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,6 +16,7 @@ build-linux: - fedora.39 - fedora.40 - opensuse.15.5 + - opensuse.15.6 - opensuse.tumbleweed - ubuntu.20.04 - ubuntu.22.04 From 60cd6867a3d99e6b6e4c8c9c353cd8762f483159 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 12 Sep 2024 08:42:32 +0200 Subject: [PATCH 1606/1765] Configurator: add German translation to PolicyKit file --- configurator/data/io.veyon.veyon-configurator.policy.in | 1 + 1 file changed, 1 insertion(+) diff --git a/configurator/data/io.veyon.veyon-configurator.policy.in b/configurator/data/io.veyon.veyon-configurator.policy.in index 90aeaf953..8c2b144f9 100644 --- a/configurator/data/io.veyon.veyon-configurator.policy.in +++ b/configurator/data/io.veyon.veyon-configurator.policy.in @@ -7,6 +7,7 @@ Veyon Configurator Authentication is required to run the Veyon Configurator + Für die Ausführung des Veyon Configurators ist eine Authentifizierung erforderlich veyon-configurator auth_admin_keep From d9a04606da386313fde920a893c95a11e80b89f0 Mon Sep 17 00:00:00 2001 From: Ajrat Makhmutov Date: Fri, 20 Sep 2024 08:18:00 +0300 Subject: [PATCH 1607/1765] Configurator: add Russian translation to PolicyKit file --- configurator/data/io.veyon.veyon-configurator.policy.in | 1 + 1 file changed, 1 insertion(+) diff --git a/configurator/data/io.veyon.veyon-configurator.policy.in b/configurator/data/io.veyon.veyon-configurator.policy.in index 8c2b144f9..666777343 100644 --- a/configurator/data/io.veyon.veyon-configurator.policy.in +++ b/configurator/data/io.veyon.veyon-configurator.policy.in @@ -8,6 +8,7 @@ Veyon Configurator Authentication is required to run the Veyon Configurator Für die Ausführung des Veyon Configurators ist eine Authentifizierung erforderlich + Для запуска Veyon Configurator необходимо выполнить аутентификацию veyon-configurator auth_admin_keep From 5d3d7890f2d8000d59fbb61fd27343ae9d348f74 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 18 Sep 2024 08:55:47 +0200 Subject: [PATCH 1608/1765] VncConnection: lock mutex during client initialization --- core/src/VncConnection.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index b4fc3316c..e332bd032 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -408,6 +408,7 @@ void VncConnection::establishConnection() while( isControlFlagSet( ControlFlag::TerminateThread ) == false && state() != State::Connected ) // try to connect as long as the server allows { + m_globalMutex.lock(); m_client = rfbGetClient( RfbBitsPerSample, RfbSamplesPerPixel, RfbBytesPerPixel ); m_client->canHandleNewFBSize = true; m_client->MallocFrameBuffer = RfbClientCallback::wrap<&VncConnection::initFrameBuffer>; @@ -424,6 +425,8 @@ void VncConnection::establishConnection() m_client->connectTimeout = m_connectTimeout / 1000; m_client->readTimeout = m_readTimeout / 1000; + m_globalMutex.unlock(); + setClientData( VncConnectionTag, this ); Q_EMIT connectionPrepared(); From 0c3395db01649241c8ab06de03ad0d9f73b1e323 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 27 Sep 2024 12:37:52 +0200 Subject: [PATCH 1609/1765] NetworkObjectFilterProxyModel: reset model in setEmptyGroupsExcluded() --- master/src/NetworkObjectFilterProxyModel.cpp | 9 +++++++++ master/src/NetworkObjectFilterProxyModel.h | 5 +---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 82c5ee8c7..f35ea51b7 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -58,6 +58,15 @@ void NetworkObjectFilterProxyModel::setComputerExcludeFilter( const QStringList& +void NetworkObjectFilterProxyModel::setEmptyGroupsExcluded(bool enabled) +{ + beginResetModel(); + m_excludeEmptyGroups = enabled; + endResetModel(); +} + + + bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { const auto rowIndex = sourceModel()->index(sourceRow, 0, sourceParent); diff --git a/master/src/NetworkObjectFilterProxyModel.h b/master/src/NetworkObjectFilterProxyModel.h index 10377d9cf..b927aa36a 100644 --- a/master/src/NetworkObjectFilterProxyModel.h +++ b/master/src/NetworkObjectFilterProxyModel.h @@ -34,10 +34,7 @@ class NetworkObjectFilterProxyModel : public QSortFilterProxyModel void setGroupFilter( const QStringList& groupList ); void setComputerExcludeFilter( const QStringList& computerExcludeList ); - void setEmptyGroupsExcluded( bool enabled ) - { - m_excludeEmptyGroups = enabled; - } + void setEmptyGroupsExcluded(bool enabled); protected: bool filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const override; From 2c957090119df3eda0d909c1e6e677b1b496d231 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 27 Sep 2024 12:38:12 +0200 Subject: [PATCH 1610/1765] NetworkObjectFilterProxyModel: use NetworkObject::isContainer() --- master/src/NetworkObjectFilterProxyModel.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index f35ea51b7..8b6bd454d 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -83,7 +83,7 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QMode return m_computerExcludeList.contains( hostAddress, Qt::CaseInsensitive ) == false; } - else if(NetworkObject::isContainer(objectType)) + else if (NetworkObject::isContainer(objectType)) { if (sourceModel()->canFetchMore(rowIndex)) { @@ -107,12 +107,9 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QMode const auto objectType = NetworkObject::Type(sourceModel()->data(sourceModel()->index(i, 0, rowIndex), NetworkObjectModel::TypeRole).toInt()); - if (objectType == NetworkObject::Type::Location || objectType == NetworkObject::Type::DesktopGroup) + if (NetworkObject::isContainer(objectType) && filterAcceptsRow(i, rowIndex)) { - if (filterAcceptsRow(i, rowIndex)) - { - return true; - } + return true; } } From 5c76ace0a053789a0595d169b57f4bc196da0551 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 27 Sep 2024 13:13:35 +0200 Subject: [PATCH 1611/1765] NetworkObjectFilterProxyModel: add setComputersExcluded() --- master/src/NetworkObjectFilterProxyModel.cpp | 13 +++++++++++++ master/src/NetworkObjectFilterProxyModel.h | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 8b6bd454d..ee4037c1b 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -66,6 +66,14 @@ void NetworkObjectFilterProxyModel::setEmptyGroupsExcluded(bool enabled) } +void NetworkObjectFilterProxyModel::setComputersExcluded(bool enabled) +{ + beginResetModel(); + m_excludeComputers = enabled; + endResetModel(); +} + + bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { @@ -74,6 +82,11 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QMode if (objectType == NetworkObject::Type::Host) { + if (m_excludeComputers) + { + return false; + } + if( m_computerExcludeList.isEmpty() ) { return true; diff --git a/master/src/NetworkObjectFilterProxyModel.h b/master/src/NetworkObjectFilterProxyModel.h index b927aa36a..b0c82a62d 100644 --- a/master/src/NetworkObjectFilterProxyModel.h +++ b/master/src/NetworkObjectFilterProxyModel.h @@ -35,6 +35,7 @@ class NetworkObjectFilterProxyModel : public QSortFilterProxyModel void setGroupFilter( const QStringList& groupList ); void setComputerExcludeFilter( const QStringList& computerExcludeList ); void setEmptyGroupsExcluded(bool enabled); + void setComputersExcluded(bool enabled); protected: bool filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const override; @@ -42,6 +43,7 @@ class NetworkObjectFilterProxyModel : public QSortFilterProxyModel private: QStringList m_groupList{}; QStringList m_computerExcludeList{}; - bool m_excludeEmptyGroups{false}; + bool m_excludeEmptyGroups = false; + bool m_excludeComputers = false; }; From 9c0490ee44318181ef0e41228b05f3ac68e2184a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 27 Sep 2024 13:38:50 +0200 Subject: [PATCH 1612/1765] ComputerSelectPanel: add option to always expand all locations --- configurator/src/MasterConfigurationPage.ui | 8 ++++++ core/src/VeyonConfigurationProperties.h | 1 + master/src/ComputerSelectPanel.cpp | 31 +++++++++++++++++++++ master/src/ComputerSelectPanel.h | 3 ++ 4 files changed, 43 insertions(+) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index c2897acc6..ebf7ca0d4 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -426,6 +426,13 @@ + + + + Always expand all locations + + + @@ -594,6 +601,7 @@ hideOwnSession hideEmptyLocations hideComputerFilter + expandLocations enforceSelectedModeForClients confirmUnsafeActions showFeatureWindowsOnSameScreen diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index a34d978b2..f502880f9 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -127,6 +127,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, autoSelectCurrentLocation, setAutoSelectCurrentLocation, "AutoSelectCurrentLocation", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, showCurrentLocationOnly, setShowCurrentLocationOnly, "ShowCurrentLocationOnly", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, allowAddingHiddenLocations, setAllowAddingHiddenLocations, "AllowAddingHiddenLocations", "Master", false, Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), bool, expandLocations, setExpandLocations, "ExpandLocations", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, hideLocalComputer, setHideLocalComputer, "HideLocalComputer", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, hideOwnSession, setHideOwnSession, "HideOwnSession", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, hideEmptyLocations, setHideEmptyLocations, "HideEmptyLocations", "Master", false, Configuration::Property::Flag::Standard ) \ diff --git a/master/src/ComputerSelectPanel.cpp b/master/src/ComputerSelectPanel.cpp index 44e55a947..cc5c1c676 100644 --- a/master/src/ComputerSelectPanel.cpp +++ b/master/src/ComputerSelectPanel.cpp @@ -60,6 +60,13 @@ ComputerSelectPanel::ComputerSelectPanel( ComputerManager& computerManager, Comp connect( ui->filterLineEdit, &QLineEdit::textChanged, this, &ComputerSelectPanel::updateFilter ); + + if (VeyonCore::config().expandLocations()) + { + connect(m_model, &QAbstractItemModel::modelReset, + this, &ComputerSelectPanel::fetchAndExpandAll); + fetchAndExpandAll(); + } } @@ -168,3 +175,27 @@ void ComputerSelectPanel::updateFilter() ui->treeView->expandAll(); } } + + + +void ComputerSelectPanel::fetchAndExpandAll() +{ + fetchAll(m_model->index(0, 0)); + QTimer::singleShot(0, this, [this]{ui->treeView->expandAll();}); +} + + + +void ComputerSelectPanel::fetchAll(const QModelIndex& index) +{ + if (m_model->canFetchMore(index)) + { + m_model->fetchMore(index); + } + + const auto rowCount = m_model->rowCount(index); + for (int i = 0; i < rowCount; ++i) + { + fetchAll(m_model->index(i, 0, index)); + } +} diff --git a/master/src/ComputerSelectPanel.h b/master/src/ComputerSelectPanel.h index 679291303..35f9cfb90 100644 --- a/master/src/ComputerSelectPanel.h +++ b/master/src/ComputerSelectPanel.h @@ -50,6 +50,9 @@ private Q_SLOTS: void updateFilter(); private: + void fetchAndExpandAll(); + void fetchAll(const QModelIndex& index); + Ui::ComputerSelectPanel *ui; ComputerManager& m_computerManager; ComputerSelectModel* m_model; From 914a00c9fe004cdc55f9ac803a45dc863c34a06b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 27 Sep 2024 15:46:41 +0200 Subject: [PATCH 1613/1765] NetworkObjectFilterProxyModel: support filtering nested locations --- master/src/NetworkObjectFilterProxyModel.cpp | 47 +++++++++++++++----- master/src/NetworkObjectFilterProxyModel.h | 7 ++- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index ee4037c1b..45c8cd734 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -77,8 +77,26 @@ void NetworkObjectFilterProxyModel::setComputersExcluded(bool enabled) bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { - const auto rowIndex = sourceModel()->index(sourceRow, 0, sourceParent); - const auto objectType = NetworkObject::Type(sourceModel()->data(rowIndex, NetworkObjectModel::TypeRole).toInt()); + const auto index = sourceModel()->index(sourceRow, 0, sourceParent); + const auto objectType = NetworkObject::Type(sourceModel()->data(index, NetworkObjectModel::TypeRole).toInt()); + if (filterAcceptsRowRecursive(index, 0)) + { + return true; + } + + if (NetworkObject::isContainer(objectType)) + { + return parentContainerAccepted(index); + } + + return false; +} + + + +bool NetworkObjectFilterProxyModel::filterAcceptsRowRecursive(const QModelIndex& index, int depth) const +{ + const auto objectType = NetworkObject::Type(sourceModel()->data(index, NetworkObjectModel::TypeRole).toInt()); if (objectType == NetworkObject::Type::Host) { @@ -92,18 +110,18 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QMode return true; } - const auto hostAddress = sourceModel()->data(rowIndex, NetworkObjectModel::HostAddressRole).toString(); + const auto hostAddress = sourceModel()->data(index, NetworkObjectModel::HostAddressRole).toString(); return m_computerExcludeList.contains( hostAddress, Qt::CaseInsensitive ) == false; } else if (NetworkObject::isContainer(objectType)) { - if (sourceModel()->canFetchMore(rowIndex)) + if (sourceModel()->canFetchMore(index)) { - sourceModel()->fetchMore(rowIndex); + sourceModel()->fetchMore(index); } - const auto rows = sourceModel()->rowCount(rowIndex); + const auto rows = sourceModel()->rowCount(index); if (m_excludeEmptyGroups && rows == 0) { @@ -117,17 +135,26 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QMode for (int i = 0; i < rows; ++i) { - const auto objectType = NetworkObject::Type(sourceModel()->data(sourceModel()->index(i, 0, rowIndex), - NetworkObjectModel::TypeRole).toInt()); + const auto rowIndex = sourceModel()->index(i, 0, index); + const auto objectType = NetworkObject::Type(sourceModel()->data(rowIndex, NetworkObjectModel::TypeRole).toInt()); - if (NetworkObject::isContainer(objectType) && filterAcceptsRow(i, rowIndex)) + if (NetworkObject::isContainer(objectType) && filterAcceptsRowRecursive(rowIndex, depth+1)) { return true; } } - return m_groupList.contains(sourceModel()->data(rowIndex).toString()); + return m_groupList.contains(sourceModel()->data(index).toString()); } return true; } + + + +bool NetworkObjectFilterProxyModel::parentContainerAccepted(const QModelIndex& index) const +{ + return index.isValid() && + (m_groupList.contains(sourceModel()->data(index).toString()) || + parentContainerAccepted(sourceModel()->parent(index))); +} diff --git a/master/src/NetworkObjectFilterProxyModel.h b/master/src/NetworkObjectFilterProxyModel.h index b0c82a62d..ed8655a4b 100644 --- a/master/src/NetworkObjectFilterProxyModel.h +++ b/master/src/NetworkObjectFilterProxyModel.h @@ -41,8 +41,11 @@ class NetworkObjectFilterProxyModel : public QSortFilterProxyModel bool filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const override; private: - QStringList m_groupList{}; - QStringList m_computerExcludeList{}; + bool filterAcceptsRowRecursive(const QModelIndex& index, int depth) const; + bool parentContainerAccepted(const QModelIndex& index) const; + + QStringList m_groupList; + QStringList m_computerExcludeList; bool m_excludeEmptyGroups = false; bool m_excludeComputers = false; From 35850f10b87f92213ec9b8c3c529e8c629855594 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 18 Oct 2024 13:51:19 +0200 Subject: [PATCH 1614/1765] LocationDialog: use tree model to show locations in nested hierarchies --- master/src/LocationDialog.cpp | 23 +++++++++++------- master/src/LocationDialog.h | 6 +++-- master/src/LocationDialog.ui | 45 +++++++---------------------------- 3 files changed, 28 insertions(+), 46 deletions(-) diff --git a/master/src/LocationDialog.cpp b/master/src/LocationDialog.cpp index a0f2d43e1..413de61b5 100644 --- a/master/src/LocationDialog.cpp +++ b/master/src/LocationDialog.cpp @@ -27,20 +27,25 @@ #include "ui_LocationDialog.h" LocationDialog::LocationDialog( QAbstractItemModel* locationListModel, QWidget* parent ) : - QDialog( parent ), - ui( new Ui::LocationDialog ), - m_sortFilterProxyModel( this ) + QDialog(parent), + ui(new Ui::LocationDialog) { ui->setupUi( this ); - m_sortFilterProxyModel.setSourceModel( locationListModel ); + m_networkObjectFilterProxyModel.setSourceModel(locationListModel); + m_networkObjectFilterProxyModel.setComputersExcluded(true); + + m_sortFilterProxyModel.setSourceModel(&m_networkObjectFilterProxyModel); +#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) + m_sortFilterProxyModel.setRecursiveFilteringEnabled(true); +#endif m_sortFilterProxyModel.setFilterCaseSensitivity( Qt::CaseInsensitive ); m_sortFilterProxyModel.sort( 0 ); - ui->listView->setModel( &m_sortFilterProxyModel ); + ui->treeView->setModel(&m_sortFilterProxyModel); - connect( ui->listView->selectionModel(), &QItemSelectionModel::currentChanged, - this, &LocationDialog::updateSelection ); + connect (ui->treeView->selectionModel(), &QItemSelectionModel::currentChanged, + this, &LocationDialog::updateSelection); updateSearchFilter(); } @@ -56,13 +61,15 @@ LocationDialog::~LocationDialog() void LocationDialog::updateSearchFilter() { + ui->treeView->expandAll(); + #if QT_VERSION >= QT_VERSION_CHECK(5, 15, 1) m_sortFilterProxyModel.setFilterRegularExpression( ui->filterLineEdit->text() ); #else m_sortFilterProxyModel.setFilterRegExp( ui->filterLineEdit->text() ); #endif - ui->listView->selectionModel()->setCurrentIndex( m_sortFilterProxyModel.index( 0, 0 ), + ui->treeView->selectionModel()->setCurrentIndex( m_sortFilterProxyModel.index( 0, 0 ), QItemSelectionModel::ClearAndSelect ); } diff --git a/master/src/LocationDialog.h b/master/src/LocationDialog.h index eb9cf9143..2ae39db29 100644 --- a/master/src/LocationDialog.h +++ b/master/src/LocationDialog.h @@ -25,7 +25,8 @@ #pragma once #include -#include + +#include "NetworkObjectFilterProxyModel.h" namespace Ui { class LocationDialog; @@ -50,6 +51,7 @@ private Q_SLOTS: private: Ui::LocationDialog *ui; - QSortFilterProxyModel m_sortFilterProxyModel; + QSortFilterProxyModel m_sortFilterProxyModel{this}; + NetworkObjectFilterProxyModel m_networkObjectFilterProxyModel{this}; QString m_selectedLocation; }; diff --git a/master/src/LocationDialog.ui b/master/src/LocationDialog.ui index 18a4fd8af..e20f25168 100644 --- a/master/src/LocationDialog.ui +++ b/master/src/LocationDialog.ui @@ -2,14 +2,6 @@ LocationDialog - - - 0 - 0 - 640 - 480 - - 640 @@ -27,23 +19,20 @@ - - - - QAbstractScrollArea::AdjustToContents - - - QListView::Adjust - - - - Qt::Horizontal + Qt::Orientation::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + + + QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents @@ -115,22 +104,6 @@ - - listView - activated(QModelIndex) - LocationDialog - accept() - - - 312 - 134 - - - 396 - 143 - - - updateSearchFilter() From 3d6c8ead4543bb4778233412154d2a8b39b08d48 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 18 Oct 2024 13:51:31 +0200 Subject: [PATCH 1615/1765] LocationDialog: accept location when activated ...e.g. when double clicked. --- master/src/LocationDialog.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/master/src/LocationDialog.cpp b/master/src/LocationDialog.cpp index 413de61b5..b5093e406 100644 --- a/master/src/LocationDialog.cpp +++ b/master/src/LocationDialog.cpp @@ -46,6 +46,8 @@ LocationDialog::LocationDialog( QAbstractItemModel* locationListModel, QWidget* connect (ui->treeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &LocationDialog::updateSelection); + connect (ui->treeView, &QTreeView::activated, + this, &LocationDialog::accept); updateSearchFilter(); } From ca661cf5bd761a31894f98997c3db592cd283112 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 22 Oct 2024 08:52:04 +0200 Subject: [PATCH 1616/1765] WindowsUserFunctions: extend LogonUserW() calls --- .../platform/windows/WindowsUserFunctions.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 0a69f1932..671b5b703 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -265,13 +265,17 @@ bool WindowsUserFunctions::authenticate( const QString& username, const Password if( WindowsPlatformConfiguration( &VeyonCore::config() ).disableSSPIBasedUserAuthentication() ) { - HANDLE token = nullptr; - result = LogonUserW( userWide.data(), domainWide.data(), passwordWide.data(), - LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &token ); - vDebug() << "LogonUserW()" << result << GetLastError(); - if( token ) + for (auto logonProvider: {LOGON32_PROVIDER_DEFAULT, LOGON32_PROVIDER_WINNT50, LOGON32_PROVIDER_WINNT40}) { - CloseHandle( token ); + HANDLE token = nullptr; + result = LogonUserW(userWide.data(), domain.isEmpty() ? nullptr : domainWide.data(), passwordWide.data(), + LOGON32_LOGON_NETWORK, logonProvider, &token); + vDebug() << "LogonUserW()" << logonProvider << result << GetLastError(); + if (token) + { + CloseHandle(token); + break; + } } } else From af20902bbbec880aeec80921539efb42da0773dd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 22 Oct 2024 08:58:15 +0200 Subject: [PATCH 1617/1765] WindowsUserFunctions: improve error logging --- plugins/platform/windows/WindowsUserFunctions.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 671b5b703..2a28fb8ec 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -270,7 +270,8 @@ bool WindowsUserFunctions::authenticate( const QString& username, const Password HANDLE token = nullptr; result = LogonUserW(userWide.data(), domain.isEmpty() ? nullptr : domainWide.data(), passwordWide.data(), LOGON32_LOGON_NETWORK, logonProvider, &token); - vDebug() << "LogonUserW()" << logonProvider << result << GetLastError(); + const auto error = GetLastError(); + vDebug() << "LogonUserW()" << logonProvider << result << error; if (token) { CloseHandle(token); @@ -281,7 +282,8 @@ bool WindowsUserFunctions::authenticate( const QString& username, const Password else { result = SSPLogonUser( domainWide.data(), userWide.data(), passwordWide.data() ); - vDebug() << "SSPLogonUser()" << result << GetLastError(); + const auto error = GetLastError(); + vDebug() << "SSPLogonUser()" << result << error; } return result; From c57292ddd4409895fc11a53f26356e9beb62a28f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Oct 2024 14:32:36 +0200 Subject: [PATCH 1618/1765] NetworkObjectFilterProxyModel: only accept computers if parent is accepted --- master/src/NetworkObjectFilterProxyModel.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 45c8cd734..3e7d50654 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -105,6 +105,13 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRowRecursive(const QModelIndex& return false; } + const auto parentAccepted = m_groupList.isEmpty() || + parentContainerAccepted(sourceModel()->parent(index)); + if (parentAccepted == false) + { + return false; + } + if( m_computerExcludeList.isEmpty() ) { return true; From eeb0b58db7adb1799b65ead434008174612adff0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Oct 2024 14:34:14 +0200 Subject: [PATCH 1619/1765] NetworkObjectFilterProxyModel: drop unused depth parameter It has been introduced during development of 914a00c9fe004cdc55f9ac803a4 but eventually is not required any longer. --- master/src/NetworkObjectFilterProxyModel.cpp | 6 +++--- master/src/NetworkObjectFilterProxyModel.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 3e7d50654..98517cbaf 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -79,7 +79,7 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QMode { const auto index = sourceModel()->index(sourceRow, 0, sourceParent); const auto objectType = NetworkObject::Type(sourceModel()->data(index, NetworkObjectModel::TypeRole).toInt()); - if (filterAcceptsRowRecursive(index, 0)) + if (filterAcceptsRowRecursive(index)) { return true; } @@ -94,7 +94,7 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QMode -bool NetworkObjectFilterProxyModel::filterAcceptsRowRecursive(const QModelIndex& index, int depth) const +bool NetworkObjectFilterProxyModel::filterAcceptsRowRecursive(const QModelIndex& index) const { const auto objectType = NetworkObject::Type(sourceModel()->data(index, NetworkObjectModel::TypeRole).toInt()); @@ -145,7 +145,7 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRowRecursive(const QModelIndex& const auto rowIndex = sourceModel()->index(i, 0, index); const auto objectType = NetworkObject::Type(sourceModel()->data(rowIndex, NetworkObjectModel::TypeRole).toInt()); - if (NetworkObject::isContainer(objectType) && filterAcceptsRowRecursive(rowIndex, depth+1)) + if (NetworkObject::isContainer(objectType) && filterAcceptsRowRecursive(rowIndex)) { return true; } diff --git a/master/src/NetworkObjectFilterProxyModel.h b/master/src/NetworkObjectFilterProxyModel.h index ed8655a4b..9f14cfeed 100644 --- a/master/src/NetworkObjectFilterProxyModel.h +++ b/master/src/NetworkObjectFilterProxyModel.h @@ -41,7 +41,7 @@ class NetworkObjectFilterProxyModel : public QSortFilterProxyModel bool filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const override; private: - bool filterAcceptsRowRecursive(const QModelIndex& index, int depth) const; + bool filterAcceptsRowRecursive(const QModelIndex& index) const; bool parentContainerAccepted(const QModelIndex& index) const; QStringList m_groupList; From 26f01648d981242bda564da438c40c94a78d7305 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 24 Oct 2024 14:56:58 +0200 Subject: [PATCH 1620/1765] ComputerManager: fix getComputersAtLocation() for nested hierarchies Include sub-locations when called for a non-leaf location. --- master/src/ComputerManager.cpp | 14 ++++++-------- master/src/ComputerManager.h | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index a92545d47..3001dd93d 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -381,12 +381,10 @@ QString ComputerManager::findLocationOfComputer(const QStringList& hostNames, co -ComputerList ComputerManager::getComputersAtLocation(const QString& locationName, const QModelIndex& parent) const +ComputerList ComputerManager::getComputersAtLocation(const QString& locationName, const QModelIndex& parent, bool parentMatches) const { QAbstractItemModel* model = computerTreeModel(); - const bool parentMatches = model->data(parent, NetworkObjectModel::NameRole).toString() == locationName; - int rows = model->rowCount( parent ); ComputerList computers; @@ -396,13 +394,13 @@ ComputerList ComputerManager::getComputersAtLocation(const QString& locationName { const auto entryIndex = model->index(i, 0, parent); const auto objectType = NetworkObject::Type(model->data(entryIndex, NetworkObjectModel::TypeRole).toInt()); - + const auto objectName = model->data(entryIndex, NetworkObjectModel::NameRole).toString(); if( NetworkObject::isContainer(objectType) ) { - if (model->data(entryIndex, NetworkObjectModel::NameRole).toString() == locationName || - hasSubLocations(entryIndex)) + const auto currentLocationMatches = objectName == locationName; + if (parentMatches || currentLocationMatches || hasSubLocations(entryIndex)) { - computers += getComputersAtLocation( locationName, entryIndex ); + computers += getComputersAtLocation(locationName, entryIndex, parentMatches || currentLocationMatches); } } else if( objectType == NetworkObject::Type::Host ) @@ -410,7 +408,7 @@ ComputerList ComputerManager::getComputersAtLocation(const QString& locationName if (parentMatches) { computers += Computer(model->data(entryIndex, NetworkObjectModel::UidRole).toUuid(), - model->data(entryIndex, NetworkObjectModel::NameRole).toString(), + objectName, model->data(entryIndex, NetworkObjectModel::HostAddressRole).toString(), model->data(entryIndex, NetworkObjectModel::MacAddressRole).toString()); } diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index c19072475..109c50241 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -75,7 +75,7 @@ class ComputerManager : public QObject QString findLocationOfComputer(const QStringList& hostNames, const QList& hostAddresses, const QModelIndex& parent) const; - ComputerList getComputersAtLocation(const QString& locationName, const QModelIndex& parent = {}) const; + ComputerList getComputersAtLocation(const QString& locationName, const QModelIndex& parent = {}, bool parentMatches = false) const; bool hasSubLocations(const QModelIndex& index) const; QModelIndex findNetworkObject(NetworkObject::Uid networkObjectUid, const QModelIndex& parent = {}) const; From 662ee617cc550ab7a275043d9d937acb143d0c86 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 25 Oct 2024 14:20:43 +0200 Subject: [PATCH 1621/1765] Modernize code to build with Qt 6.8 --- cli/src/ConfigCommands.cpp | 12 ++++---- cli/src/FeatureCommands.cpp | 2 +- configurator/src/MainWindow.cpp | 2 +- configurator/src/MasterConfigurationPage.cpp | 2 +- ...etworkObjectDirectoryConfigurationPage.cpp | 6 ++-- configurator/src/ServiceConfigurationPage.cpp | 2 +- core/src/AccessControlProvider.cpp | 4 +-- core/src/AuthenticationManager.cpp | 2 +- core/src/Configuration/JsonStore.cpp | 12 +++++--- core/src/Configuration/LocalStore.cpp | 12 +++++--- core/src/Configuration/Object.cpp | 18 +++++------ core/src/FeatureManager.cpp | 20 ++++++------- core/src/NestedNetworkObjectDirectory.cpp | 4 +-- core/src/NetworkObjectDirectoryManager.cpp | 2 +- core/src/PlatformPluginManager.cpp | 2 +- core/src/PluginManager.cpp | 8 ++--- core/src/PluginManager.h | 2 +- core/src/UserGroupsBackendManager.cpp | 2 +- core/src/VeyonCore.cpp | 4 +++ core/src/VncClientProtocol.cpp | 2 +- core/src/VncView.cpp | 6 +++- master/src/CheckableItemProxyModel.cpp | 6 ++-- master/src/ComputerControlListModel.cpp | 2 +- master/src/ComputerManager.cpp | 10 +++---- master/src/ComputerMonitoringItem.cpp | 2 +- master/src/ComputerMonitoringWidget.cpp | 11 +++++-- master/src/FlexibleListView.cpp | 4 +-- master/src/MainWindow.cpp | 30 ++++++++++++------- master/src/SpotlightModel.cpp | 2 +- master/src/VeyonMaster.cpp | 4 +-- .../BuiltinDirectoryPlugin.cpp | 4 +-- plugins/demo/DemoFeaturePlugin.cpp | 2 +- plugins/demo/DemoServer.cpp | 2 +- .../DesktopServicesFeaturePlugin.cpp | 4 +-- .../filetransfer/FileTransferController.cpp | 2 +- plugins/ldap/LdapPlugin.cpp | 2 +- plugins/ldap/common/LdapBrowseModel.cpp | 4 +-- .../common/LdapNetworkObjectDirectory.cpp | 6 ++-- plugins/platform/linux/LinuxServiceCore.cpp | 2 +- server/src/ServerAccessControlManager.cpp | 4 +-- server/src/VncProxyServer.cpp | 2 +- server/src/VncServer.cpp | 2 +- 42 files changed, 132 insertions(+), 101 deletions(-) diff --git a/cli/src/ConfigCommands.cpp b/cli/src/ConfigCommands.cpp index 6846a7a10..0cbb8128a 100644 --- a/cli/src/ConfigCommands.cpp +++ b/cli/src/ConfigCommands.cpp @@ -329,16 +329,16 @@ CommandLinePluginInterface::RunResult ConfigCommands::applyConfiguration() QString ConfigCommands::printableConfigurationValue( const QVariant& value ) { - if( value.type() == QVariant::String || - value.type() == QVariant::Uuid || - value.type() == QVariant::UInt || - value.type() == QVariant::Int || - value.type() == QVariant::Bool ) + if (value.userType() == QMetaType::QString || + value.userType() == QMetaType::QUuid || + value.userType() == QMetaType::UInt || + value.userType() == QMetaType::Int || + value.userType() == QMetaType::Bool) { return value.toString(); } - if( value.type() == QVariant::StringList ) + if (value.userType() == QMetaType::QStringList) { return value.toStringList().join( QLatin1Char(';') ); } diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index cc9e48eeb..9159046ad 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -148,7 +148,7 @@ CommandLinePluginInterface::RunResult FeatureCommands::handle_list( const QStrin Q_UNUSED(arguments) FeatureManager featureManager; - for( const auto& feature : qAsConst(featureManager.features()) ) + for( const auto& feature : std::as_const(featureManager.features()) ) { print( feature.name() ); } diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index 3861e7fa1..f2af9160c 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -374,7 +374,7 @@ bool MainWindow::applyConfiguration() void MainWindow::loadConfigurationPagePlugins() { - for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) + for( auto pluginObject : std::as_const( VeyonCore::pluginManager().pluginObjects() ) ) { auto pluginInterface = qobject_cast( pluginObject ); auto configurationPagePluginInterface = qobject_cast( pluginObject ); diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index 90e28580b..e1519ea58 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -160,7 +160,7 @@ void MasterConfigurationPage::updateFeatureLists() ui->allFeaturesListWidget->clear(); ui->disabledFeaturesListWidget->clear(); - for( const auto& feature : qAsConst( VeyonCore::featureManager().features() ) ) + for( const auto& feature : std::as_const( VeyonCore::featureManager().features() ) ) { if( feature.testFlag( Feature::Flag::Master ) == false || feature.testFlag( Feature::Flag::Meta ) || diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp index 777671b05..c77f91ea9 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp @@ -55,7 +55,7 @@ void NetworkObjectDirectoryConfigurationPage::resetWidgets() { FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); - for( const auto* tab : qAsConst(m_tabs) ) + for( const auto* tab : std::as_const(m_tabs) ) { tab->content()->resetWidgets(); tab->enabledCheckBox()->setChecked( VeyonCore::networkObjectDirectoryManager().isEnabled( tab->plugin() ) ); @@ -69,7 +69,7 @@ void NetworkObjectDirectoryConfigurationPage::connectWidgetsToProperties() { FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(CONNECT_WIDGET_TO_PROPERTY); - for( const auto* tab : qAsConst(m_tabs) ) + for( const auto* tab : std::as_const(m_tabs) ) { const auto plugin = tab->plugin(); const auto checkBox = tab->enabledCheckBox(); @@ -84,7 +84,7 @@ void NetworkObjectDirectoryConfigurationPage::connectWidgetsToProperties() void NetworkObjectDirectoryConfigurationPage::applyConfiguration() { - for( const auto* tab : qAsConst(m_tabs) ) + for( const auto* tab : std::as_const(m_tabs) ) { tab->content()->applyConfiguration(); } diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index c75b4e599..c4d1260c1 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -154,7 +154,7 @@ void ServiceConfigurationPage::updateVncServerPluginConfigurationWidget() void ServiceConfigurationPage::populateVncServerPluginComboBox() { - for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) + for( auto pluginObject : std::as_const( VeyonCore::pluginManager().pluginObjects() ) ) { auto pluginInterface = qobject_cast( pluginObject ); auto vncServerPluginInterface = qobject_cast( pluginObject ); diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 99c9bb6ee..de89ecb57 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -195,7 +195,7 @@ AccessControlRule::Action AccessControlProvider::processAccessControlRules( cons { vDebug() << "processing rules for" << accessingUser << accessingComputer << localUser << localComputer << connectedUsers << authMethodUid; - for( const auto& rule : qAsConst( m_accessControlRules ) ) + for( const auto& rule : std::as_const( m_accessControlRules ) ) { // rule disabled? if( rule.action() == AccessControlRule::Action::None ) @@ -228,7 +228,7 @@ bool AccessControlProvider::isAccessToLocalComputerDenied() const return false; } - for( const auto& rule : qAsConst( m_accessControlRules ) ) + for( const auto& rule : std::as_const( m_accessControlRules ) ) { if( matchConditions( rule, {}, {}, VeyonCore::platform().userFunctions().currentUser(), HostAddress::localFQDN(), {}, {} ) ) diff --git a/core/src/AuthenticationManager.cpp b/core/src/AuthenticationManager.cpp index 644abff06..2642f25d4 100644 --- a/core/src/AuthenticationManager.cpp +++ b/core/src/AuthenticationManager.cpp @@ -33,7 +33,7 @@ AuthenticationManager::AuthenticationManager( QObject* parent ) : { LegacyAuthType::KeyFile, Plugin::Uid{QStringLiteral("0c69b301-81b4-42d6-8fae-128cdd113314")} } } ) { - for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) + for( auto pluginObject : std::as_const( VeyonCore::pluginManager().pluginObjects() ) ) { auto pluginInterface = qobject_cast( pluginObject ); auto authenticationPluginInterface = qobject_cast( pluginObject ); diff --git a/core/src/Configuration/JsonStore.cpp b/core/src/Configuration/JsonStore.cpp index 7a0c34571..e43b17099 100644 --- a/core/src/Configuration/JsonStore.cpp +++ b/core/src/Configuration/JsonStore.cpp @@ -98,23 +98,27 @@ static QJsonObject saveJsonTree( const Object::DataMap& dataMap ) for( auto it = dataMap.begin(); it != dataMap.end(); ++it ) { - if( it.value().type() == QVariant::Map ) + if (it.value().userType() == QMetaType::QVariantMap) { jsonData[it.key()] = saveJsonTree( it.value().toMap() ); } - else if( static_cast( it.value().type() ) == QMetaType::QJsonArray ) + else if (it.value().userType() == QMetaType::QJsonArray) { QJsonObject jsonObj; jsonObj[QStringLiteral("JsonStoreArray")] = it.value().toJsonArray(); jsonData[it.key()] = jsonObj; } - else if( static_cast( it.value().type() ) == QMetaType::QJsonObject ) + else if (it.value().userType() == QMetaType::QJsonObject ) { QJsonObject jsonObj; jsonObj[QStringLiteral("JsonStoreObject")] = it.value().toJsonObject(); jsonData[it.key()] = jsonObj; } - else if( QMetaType( it.value().userType() ).flags().testFlag( QMetaType::IsEnumeration ) ) +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + else if (it.value().metaType().flags().testFlag(QMetaType::IsEnumeration) ) +#else + else if (QMetaType(it.value().userType()).flags().testFlag(QMetaType::IsEnumeration) ) +#endif { jsonData[it.key()] = QJsonValue( it.value().toInt() ); } diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index f59aceead..02c7ac310 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -127,21 +127,25 @@ static void saveSettingsTree( const Object::DataMap &dataMap, QSettings *s ) { for( auto it = dataMap.begin(); it != dataMap.end(); ++it ) { - if( it.value().type() == QVariant::Map ) + if (it.value().userType() == QMetaType::QVariantMap) { s->beginGroup( it.key() ); saveSettingsTree( it.value().toMap(), s ); s->endGroup(); } - else if( static_cast( it.value().type() ) == QMetaType::QJsonArray ) + else if (it.value().userType() == QMetaType::QJsonArray) { s->setValue( it.key(), serializeJsonValue( it.value().toJsonArray() ) ); } - else if( static_cast( it.value().type() ) == QMetaType::QJsonObject ) + else if (it.value().userType() == QMetaType::QJsonObject) { s->setValue( it.key(), serializeJsonValue( it.value().toJsonObject() ) ); } - else if( QMetaType( it.value().userType() ).flags().testFlag( QMetaType::IsEnumeration ) ) +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + else if (it.value().metaType().flags().testFlag(QMetaType::IsEnumeration)) +#else + else if( QMetaType(it.value().userType()).flags().testFlag(QMetaType::IsEnumeration)) +#endif { s->setValue( it.key(), it.value().toInt() ); } diff --git a/core/src/Configuration/Object.cpp b/core/src/Configuration/Object.cpp index 22157d13c..e072f1c47 100644 --- a/core/src/Configuration/Object.cpp +++ b/core/src/Configuration/Object.cpp @@ -97,7 +97,7 @@ static Object::DataMap operator+( Object::DataMap dst, Object::DataMap src ) { for( auto it = src.begin(), end = src.end(); it != end; ++it ) { - if( it.value().type() == QVariant::Map && dst.contains( it.key() ) ) + if (it.value().userType() == QMetaType::QVariantMap && dst.contains(it.key())) { dst[it.key()] = dst[it.key()].toMap() + it.value().toMap(); } @@ -136,8 +136,8 @@ bool Object::hasValue( const QString& key, const QString& parentKey ) const for( const auto& level : subLevels ) { - if( currentMap.contains( level ) && - currentMap[level].type() == QVariant::Map ) + if (currentMap.contains(level) && + currentMap[level].userType() == QMetaType::QVariantMap) { currentMap = currentMap[level].toMap(); } @@ -173,8 +173,8 @@ QVariant Object::value( const QString& key, const QString& parentKey, const QVar DataMap currentMap = m_data; for( const auto& level : subLevels ) { - if( currentMap.contains( level ) && - currentMap[level].type() == QVariant::Map ) + if (currentMap.contains(level) && + currentMap[level].userType() == QMetaType::QVariantMap) { currentMap = currentMap[level].toMap(); } @@ -203,7 +203,7 @@ static Object::DataMap setValueRecursive( Object::DataMap data, if( subLevels.isEmpty() ) { // search for key in toplevel data map - if( !data.contains( key ) || data[key].type() != QVariant::Map ) + if( !data.contains( key ) || data[key].userType() != QMetaType::QVariantMap) { data[key] = value; } @@ -218,7 +218,7 @@ static Object::DataMap setValueRecursive( Object::DataMap data, const QString level = subLevels.takeFirst(); if( data.contains( level ) ) { - if( data[level].type() != QVariant::Map ) + if( data[level].userType() != QMetaType::QVariantMap) { vWarning() << "parent key points doesn't point to a data map!"; return data; @@ -270,7 +270,7 @@ static Object::DataMap removeValueRecursive( Object::DataMap data, } const QString level = subLevels.takeFirst(); - if( data.contains( level ) && data[level].type() == QVariant::Map ) + if (data.contains(level) && data[level].userType() != QMetaType::QVariantMap) { data[level] = removeValueRecursive( data[level].toMap(), subLevels, key ); } @@ -302,7 +302,7 @@ static void addSubObjectRecursive( const Object::DataMap& dataMap, { for( auto it = dataMap.begin(), end = dataMap.end(); it != end; ++it ) { - if( it.value().type() == QVariant::Map ) + if (it.value().userType() != QMetaType::QVariantMap) { auto newParentKey = it.key(); if( parentKey.isEmpty() == false ) diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 3d1ae9d31..6a5d6e847 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -41,7 +41,7 @@ FeatureManager::FeatureManager( QObject* parent ) : qRegisterMetaType(); qRegisterMetaType(); - for( const auto& pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) + for( const auto& pluginObject : std::as_const( VeyonCore::pluginManager().pluginObjects() ) ) { auto featurePluginInterface = qobject_cast( pluginObject ); @@ -152,7 +152,7 @@ void FeatureManager::controlFeature( Feature::Uid featureUid, const QVariantMap& arguments, const ComputerControlInterfaceList& computerControlInterfaces ) const { - for( auto featureInterface : qAsConst( m_featurePluginInterfaces ) ) + for( auto featureInterface : std::as_const( m_featurePluginInterfaces ) ) { featureInterface->controlFeature( featureUid, operation, arguments, computerControlInterfaces ); } @@ -166,7 +166,7 @@ void FeatureManager::startFeature( VeyonMasterInterface& master, { vDebug() << computerControlInterfaces << feature.name(); - for( auto featureInterface : qAsConst( m_featurePluginInterfaces ) ) + for( auto featureInterface : std::as_const( m_featurePluginInterfaces ) ) { featureInterface->startFeature( master, feature, computerControlInterfaces ); } @@ -188,7 +188,7 @@ void FeatureManager::stopFeature( VeyonMasterInterface& master, { vDebug() << computerControlInterfaces << feature.name(); - for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) + for( const auto& featureInterface : std::as_const( m_featurePluginInterfaces ) ) { featureInterface->stopFeature( master, feature, computerControlInterfaces ); } @@ -209,7 +209,7 @@ void FeatureManager::handleFeatureMessage(ComputerControlInterface::Pointer comp { vDebug() << computerControlInterface << message; - for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) + for( const auto& featureInterface : std::as_const( m_featurePluginInterfaces ) ) { featureInterface->handleFeatureMessage(computerControlInterface, message); } @@ -229,7 +229,7 @@ void FeatureManager::handleFeatureMessage(VeyonServerInterface& server, return; } - for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) + for( const auto& featureInterface : std::as_const( m_featurePluginInterfaces ) ) { featureInterface->handleFeatureMessage(server, messageContext, message); } @@ -248,7 +248,7 @@ void FeatureManager::handleFeatureMessageFromWorker(VeyonServerInterface& server return; } - for (const auto& featureInterface : qAsConst(m_featurePluginInterfaces)) + for (const auto& featureInterface : std::as_const(m_featurePluginInterfaces)) { featureInterface->handleFeatureMessageFromWorker(server, message); } @@ -261,7 +261,7 @@ void FeatureManager::handleFeatureMessage(VeyonWorkerInterface& worker, const Fe { vDebug() << "[WORKER]" << message; - for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) + for( const auto& featureInterface : std::as_const( m_featurePluginInterfaces ) ) { featureInterface->handleFeatureMessage(worker, message); } @@ -273,7 +273,7 @@ void FeatureManager::sendAsyncFeatureMessages(VeyonServerInterface& server, const MessageContext& messageContext) const { - for (const auto& featureInterface : qAsConst(m_featurePluginInterfaces)) + for (const auto& featureInterface : std::as_const(m_featurePluginInterfaces)) { featureInterface->sendAsyncFeatureMessages(server, messageContext); } @@ -285,7 +285,7 @@ FeatureUidList FeatureManager::activeFeatures( VeyonServerInterface& server ) co { FeatureUidList features; - for( const auto& featureInterface : qAsConst( m_featurePluginInterfaces ) ) + for( const auto& featureInterface : std::as_const( m_featurePluginInterfaces ) ) { for( const auto& feature : featureInterface->featureList() ) { diff --git a/core/src/NestedNetworkObjectDirectory.cpp b/core/src/NestedNetworkObjectDirectory.cpp index 98717d831..ddee1ac74 100644 --- a/core/src/NestedNetworkObjectDirectory.cpp +++ b/core/src/NestedNetworkObjectDirectory.cpp @@ -44,7 +44,7 @@ NetworkObjectList NestedNetworkObjectDirectory::queryObjects( NetworkObject::Typ { NetworkObjectList objects; - for( auto* subDirectory : qAsConst(m_subDirectories) ) + for( auto* subDirectory : std::as_const(m_subDirectories) ) { objects += subDirectory->queryObjects( type, property, value ); } @@ -71,7 +71,7 @@ void NestedNetworkObjectDirectory::update() QStringList subDirectoryNames; subDirectoryNames.reserve( m_subDirectories.count() ); - for( auto* subDirectory : qAsConst(m_subDirectories) ) + for( auto* subDirectory : std::as_const(m_subDirectories) ) { subDirectoryNames.append( subDirectory->name() ); NetworkObject subDirectoryObject{this, NetworkObject::Type::SubDirectory, subDirectory->name(), {}, diff --git a/core/src/NetworkObjectDirectoryManager.cpp b/core/src/NetworkObjectDirectoryManager.cpp index bb43bd741..c0407392c 100644 --- a/core/src/NetworkObjectDirectoryManager.cpp +++ b/core/src/NetworkObjectDirectoryManager.cpp @@ -32,7 +32,7 @@ NetworkObjectDirectoryManager::NetworkObjectDirectoryManager( QObject* parent ) : QObject( parent ) { - for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) + for( auto pluginObject : std::as_const( VeyonCore::pluginManager().pluginObjects() ) ) { auto pluginInterface = qobject_cast( pluginObject ); auto directoryPluginInterface = qobject_cast( pluginObject ); diff --git a/core/src/PlatformPluginManager.cpp b/core/src/PlatformPluginManager.cpp index 421a7ca3f..10940b2cb 100644 --- a/core/src/PlatformPluginManager.cpp +++ b/core/src/PlatformPluginManager.cpp @@ -30,7 +30,7 @@ PlatformPluginManager::PlatformPluginManager( PluginManager& pluginManager, QObj QObject( parent ), m_platformPlugin( nullptr ) { - for( auto pluginObject : qAsConst( pluginManager.pluginObjects() ) ) + for( auto pluginObject : std::as_const( pluginManager.pluginObjects() ) ) { auto pluginInterface = qobject_cast( pluginObject ); auto platformPluginInterface = qobject_cast( pluginObject ); diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index 2b10e0594..7c7cad0a0 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -46,7 +46,7 @@ PluginManager::~PluginManager() { vDebug(); - for( auto pluginLoader : qAsConst(m_pluginLoaders) ) + for( auto pluginLoader : std::as_const(m_pluginLoaders) ) { pluginLoader->unload(); } @@ -75,7 +75,7 @@ void PluginManager::upgradePlugins() { auto versions = VeyonCore::config().pluginVersions(); - for( auto pluginInterface : qAsConst( m_pluginInterfaces ) ) + for( auto pluginInterface : std::as_const( m_pluginInterfaces ) ) { const auto pluginUid = pluginInterface->uid().toString(); auto previousPluginVersion = QVersionNumber::fromString( versions.value( pluginUid ).toString() ); @@ -118,7 +118,7 @@ PluginUidList PluginManager::pluginUids() const pluginUidList.reserve( m_pluginInterfaces.size() ); - for( auto pluginInterface : qAsConst( m_pluginInterfaces ) ) + for( auto pluginInterface : std::as_const( m_pluginInterfaces ) ) { pluginUidList += pluginInterface->uid(); } @@ -175,7 +175,7 @@ void PluginManager::initPluginSearchPath() void PluginManager::loadPlugins( const QString& nameFilter ) { QFileInfoList plugins; - for (const auto& pluginSearchPath : qAsConst(m_pluginSearchPaths)) + for (const auto& pluginSearchPath : std::as_const(m_pluginSearchPaths)) { plugins.append(QDir(pluginSearchPath).entryInfoList({nameFilter})); } diff --git a/core/src/PluginManager.h b/core/src/PluginManager.h index 7ee71f623..0a8c5fcb3 100644 --- a/core/src/PluginManager.h +++ b/core/src/PluginManager.h @@ -59,7 +59,7 @@ class VEYON_CORE_EXPORT PluginManager : public QObject template InterfaceType* find( const std::function& filter = []() { return true; } ) { - for( auto object : qAsConst(m_pluginObjects) ) + for( auto object : std::as_const(m_pluginObjects) ) { auto pluginInterface = qobject_cast( object ); if( pluginInterface && filter( qobject_cast( object ) ) ) diff --git a/core/src/UserGroupsBackendManager.cpp b/core/src/UserGroupsBackendManager.cpp index 2f05c9b8d..e0458a9c8 100644 --- a/core/src/UserGroupsBackendManager.cpp +++ b/core/src/UserGroupsBackendManager.cpp @@ -30,7 +30,7 @@ UserGroupsBackendManager::UserGroupsBackendManager( QObject* parent ) : QObject( parent ) { - for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) + for( auto pluginObject : std::as_const( VeyonCore::pluginManager().pluginObjects() ) ) { auto pluginInterface = qobject_cast( pluginObject ); auto userGroupsBackendInterface = qobject_cast( pluginObject ); diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 48e2dcef9..e0314fb33 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -190,7 +190,11 @@ QString VeyonCore::translationsDirectory() QString VeyonCore::qtTranslationsDirectory() { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const auto path = QLibraryInfo::path(QLibraryInfo::TranslationsPath); +#else const auto path = QLibraryInfo::location(QLibraryInfo::TranslationsPath); +#endif if( QDir{path}.exists() ) { return path; diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index c6f9a7041..8d169d7ff 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -278,7 +278,7 @@ bool VncClientProtocol::receiveSecurityTypes() } const auto securityTypeList = m_socket->read( securityTypeCount ); - if( securityTypeList.count() != securityTypeCount ) + if( securityTypeList.size() != securityTypeCount ) { vCritical() << "could not read security types!"; m_socket->close(); diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index e94a7e730..dc789d83b 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -370,7 +370,11 @@ void VncView::hoverEventHandler( QHoverEvent* event ) { if( event && m_viewOnly == false ) { - const auto pos = mapToFramebuffer( event->pos() ); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + const auto pos = mapToFramebuffer(event->position().toPoint()); +#else + const auto pos = mapToFramebuffer(event->pos()); +#endif m_connection->mouseEvent( pos.x(), pos.y(), m_buttonMask ); } } diff --git a/master/src/CheckableItemProxyModel.cpp b/master/src/CheckableItemProxyModel.cpp index dd73bbd48..39314d543 100644 --- a/master/src/CheckableItemProxyModel.cpp +++ b/master/src/CheckableItemProxyModel.cpp @@ -96,7 +96,7 @@ bool CheckableItemProxyModel::setData( const QModelIndex& index, const QVariant& const auto uuid = indexToUuid( index ); const auto checkState = value.value(); - if( qAsConst(m_checkStates)[uuid] != checkState ) + if( std::as_const(m_checkStates)[uuid] != checkState ) { m_checkStates[uuid] = checkState; Q_EMIT dataChanged( index, index, { Qt::CheckStateRole } ); @@ -211,7 +211,7 @@ bool CheckableItemProxyModel::setChildData( const QModelIndex& index, Qt::CheckS const auto childIndex = this->index( i, 0, index ); const auto childUuid = indexToUuid( childIndex ); - if( qAsConst(m_checkStates)[childUuid] != checkState ) + if( std::as_const(m_checkStates)[childUuid] != checkState ) { m_checkStates[childUuid] = checkState; modified = true; @@ -254,7 +254,7 @@ void CheckableItemProxyModel::setParentData( const QModelIndex& index, Qt::Check const auto uuid = indexToUuid( index ); - if( qAsConst(m_checkStates)[uuid] != checkState ) + if( std::as_const(m_checkStates)[uuid] != checkState ) { m_checkStates[uuid] = checkState; Q_EMIT dataChanged( index, index, { Qt::CheckStateRole } ); diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 4f6741c47..30522df85 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -145,7 +145,7 @@ bool ComputerControlListModel::setData( const QModelIndex& index, const QVariant vCritical() << "index out of range!"; } - const auto computerControl = qAsConst(m_computerControlInterfaces)[index.row()]; + const auto computerControl = std::as_const(m_computerControlInterfaces)[index.row()]; switch( role ) { diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 3001dd93d..21da09586 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -195,12 +195,12 @@ void ComputerManager::checkChangedData( const QModelIndex& topLeft, const QModel void ComputerManager::initLocations() { - for( const auto& hostName : qAsConst( m_localHostNames ) ) + for( const auto& hostName : std::as_const( m_localHostNames ) ) { vDebug() << "initializing locations for hostname" << hostName; } - for( const auto& address : qAsConst( m_localHostAddresses ) ) + for( const auto& address : std::as_const( m_localHostAddresses ) ) { vDebug() << "initializing locations for host address" << address.toString(); } @@ -254,7 +254,7 @@ void ComputerManager::initNetworkObjectLayer() localHostNames.append( m_localHostNames ); - for( const auto& address : qAsConst( m_localHostAddresses ) ) + for( const auto& address : std::as_const( m_localHostAddresses ) ) { localHostNames.append( address.toString() ); // clazy:exclude=reserve-candidates } @@ -267,7 +267,7 @@ void ComputerManager::initNetworkObjectLayer() const auto sessionServerPort = QString::number( VeyonCore::config().veyonServerPort() + VeyonCore::sessionId() ); - for( const auto& localHostName : qAsConst(localHostNames) ) + for( const auto& localHostName : std::as_const(localHostNames) ) { ownSessionNames.append( QStringLiteral("%1:%2").arg( localHostName, sessionServerPort ) ); } @@ -297,7 +297,7 @@ void ComputerManager::initComputerTreeModel() QJsonArray checkedNetworkObjects; if( VeyonCore::config().autoSelectCurrentLocation() ) { - for( const auto& location : qAsConst( m_currentLocations ) ) + for( const auto& location : std::as_const( m_currentLocations ) ) { const auto computersAtLocation = getComputersAtLocation( location ); for( const auto& computer : computersAtLocation ) diff --git a/master/src/ComputerMonitoringItem.cpp b/master/src/ComputerMonitoringItem.cpp index 017fa9d58..f85d89b6d 100644 --- a/master/src/ComputerMonitoringItem.cpp +++ b/master/src/ComputerMonitoringItem.cpp @@ -163,7 +163,7 @@ QVariantList ComputerMonitoringItem::selectedObjects() const QVariantList objects; // clazy:exclude=inefficient-qlist objects.reserve(m_selectedObjects.size()); - for( const auto& object : qAsConst(m_selectedObjects) ) + for( const auto& object : std::as_const(m_selectedObjects) ) { objects.append( object ); } diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 785f1010c..81ed9b826 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -250,8 +250,15 @@ void ComputerMonitoringWidget::addSubFeaturesToMenu( const Feature& parentFeatur for( const auto& subFeature : subFeatures ) { - menu->addAction( QIcon( subFeature.iconUrl() ), subFeature.displayName(), m_featureMenu, - [=]() { runFeature( subFeature ); }, subFeature.shortcut() ); + menu->addAction(QIcon(subFeature.iconUrl()), subFeature.displayName(), +#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0) + subFeature.shortcut(), +#endif + this, [=]() { runFeature( subFeature ); } +#if QT_VERSION < QT_VERSION_CHECK(6, 3, 0) + , subFeature.shortcut() +#endif + ); } } diff --git a/master/src/FlexibleListView.cpp b/master/src/FlexibleListView.cpp index e39343da6..b2eba6a45 100644 --- a/master/src/FlexibleListView.cpp +++ b/master/src/FlexibleListView.cpp @@ -82,7 +82,7 @@ void FlexibleListView::alignToGrid() { m_positions[uid] = QPointF( qMax( 0, qRound( m_positions[uid].x() ) ), qMax( 0, qRound( m_positions[uid].y() ) ) ); - setPositionForIndex( toItemPosition( qAsConst(m_positions)[uid] ), index ); + setPositionForIndex( toItemPosition( std::as_const(m_positions)[uid] ), index ); } } } @@ -188,7 +188,7 @@ void FlexibleListView::restorePositions() if( uid.isNull() == false && m_positions.contains( uid ) ) { - setPositionForIndex( toItemPosition( qAsConst(m_positions)[uid] ), index ); + setPositionForIndex( toItemPosition( std::as_const(m_positions)[uid] ), index ); } } } diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 849c1d71a..dd2a26438 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -490,19 +490,27 @@ void MainWindow::addSubFeaturesToToolButton( QToolButton* button, const Feature& for( const auto& subFeature : subFeatures ) { - auto action = menu->addAction( QIcon( subFeature.iconUrl() ), subFeature.displayName(), this, - [=]() { - m_master.runFeature( subFeature ); - if( parentFeatureIsMode ) + auto action = menu->addAction(QIcon(subFeature.iconUrl()), subFeature.displayName(), +#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0) + subFeature.shortcut(), +#endif + this, [=]() + { + m_master.runFeature( subFeature ); + if( parentFeatureIsMode ) + { + if( subFeature.testFlag( Feature::Flag::Option ) == false ) { - if( subFeature.testFlag( Feature::Flag::Option ) == false ) - { - button->setChecked( true ); - } - reloadSubFeatures(); + button->setChecked( true ); } - }, - subFeature.shortcut() ); + reloadSubFeatures(); + } + } +#if QT_VERSION < QT_VERSION_CHECK(6, 3, 0) + , subFeature.shortcut() +#endif + ); + action->setToolTip( subFeature.description() ); action->setObjectName( subFeature.uid().toString() ); diff --git a/master/src/SpotlightModel.cpp b/master/src/SpotlightModel.cpp index a2434c6b7..c85b93d6a 100644 --- a/master/src/SpotlightModel.cpp +++ b/master/src/SpotlightModel.cpp @@ -46,7 +46,7 @@ void SpotlightModel::setUpdateInRealtime( bool enabled ) { m_updateInRealtime = enabled; - for( const auto& controlInterface : qAsConst(m_controlInterfaces) ) + for( const auto& controlInterface : std::as_const(m_controlInterfaces) ) { controlInterface->setUpdateMode( m_updateInRealtime ? ComputerControlInterface::UpdateMode::Live diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index c0cf897d2..04ff4c66f 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -122,7 +122,7 @@ FeatureList VeyonMaster::allFeatures() const { FeatureList featureList; - for( const auto& feature : qAsConst( features() ) ) + for( const auto& feature : std::as_const( features() ) ) { featureList.append(feature); // clazy:exclude=reserve-candidates const auto modeSubFeatures = subFeatures( feature.uid() ); @@ -361,7 +361,7 @@ FeatureList VeyonMaster::featureList() const const auto addFeatures = [&]( const std::function& extraFilter ) { - for(const auto& pluginUid : qAsConst(pluginUids)) + for(const auto& pluginUid : std::as_const(pluginUids)) { for( const auto& feature : VeyonCore::featureManager().features( pluginUid ) ) { diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 83130eefc..3322e772b 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -619,7 +619,7 @@ bool BuiltinDirectoryPlugin::importFile( QFile& inputFile, parentLocationUid = parentLocation.uid(); } - for( const NetworkObject& networkObject : qAsConst(it.value()) ) + for( const NetworkObject& networkObject : std::as_const(it.value()) ) { objectManager.update( NetworkObject( nullptr, networkObject.type(), @@ -720,7 +720,7 @@ NetworkObject BuiltinDirectoryPlugin::toNetworkObject( const QString& line, cons } QString rxString = regExWithPlaceholders; - for( const auto& var : qAsConst(placeholders) ) + for( const auto& var : std::as_const(placeholders) ) { rxString.replace( QStringLiteral("%1:").arg( var ), QString() ); } diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 6987102a0..ef76f9d15 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -508,7 +508,7 @@ void DemoFeaturePlugin::updateFeatures() m_demoFeature.uid(), tr("All screens"), {}, {}, {} } ); int index = 1; - for( auto screen : qAsConst(m_screens) ) + for( auto screen : std::as_const(m_screens) ) { const auto name = QStringLiteral( "DemoScreen%1" ).arg( index ); const auto screenName = VeyonCore::screenName(*screen, index); diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 80672b02b..3f7783ad3 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -297,7 +297,7 @@ qint64 DemoServer::framebufferUpdateMessageQueueSize() const { qint64 size = 0; - for( const auto& message : qAsConst( m_framebufferUpdateMessages ) ) + for( const auto& message : std::as_const( m_framebufferUpdateMessages ) ) { size += message.size(); } diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index 7ccccd458..bc0c61319 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -492,7 +492,7 @@ void DesktopServicesFeaturePlugin::updatePredefinedApplicationFeatures() { m_predefinedAppsFeatures.reserve( m_predefinedApps.size()+1 ); - for( const auto& app : qAsConst(m_predefinedApps) ) + for( const auto& app : std::as_const(m_predefinedApps) ) { const auto appObject = DesktopServiceObject( app.toObject() ); m_predefinedAppsFeatures.append( Feature( m_startAppFeature.name(), Feature::Flag::Action | Feature::Flag::Master, @@ -521,7 +521,7 @@ void DesktopServicesFeaturePlugin::updatePredefinedWebsiteFeatures() { m_predefinedWebsitesFeatures.reserve( m_predefinedWebsites.size()+1 ); - for( const auto& website : qAsConst(m_predefinedWebsites) ) + for( const auto& website : std::as_const(m_predefinedWebsites) ) { const auto websiteObject = DesktopServiceObject( website.toObject() ); m_predefinedWebsitesFeatures.append( Feature( m_openWebsiteFeature.name(), Feature::Flag::Action | Feature::Flag::Master, diff --git a/plugins/filetransfer/FileTransferController.cpp b/plugins/filetransfer/FileTransferController.cpp index 673dbe827..068604251 100644 --- a/plugins/filetransfer/FileTransferController.cpp +++ b/plugins/filetransfer/FileTransferController.cpp @@ -257,7 +257,7 @@ void FileTransferController::updateProgress() bool FileTransferController::allQueuesEmpty() { - for( const auto& controlInterface : qAsConst(m_interfaces) ) + for( const auto& controlInterface : std::as_const(m_interfaces) ) { if( controlInterface->isMessageQueueEmpty() == false ) { diff --git a/plugins/ldap/LdapPlugin.cpp b/plugins/ldap/LdapPlugin.cpp index 954e22a29..7536c3949 100644 --- a/plugins/ldap/LdapPlugin.cpp +++ b/plugins/ldap/LdapPlugin.cpp @@ -375,7 +375,7 @@ CommandLinePluginInterface::RunResult LdapPlugin::handle_query( const QStringLis return InvalidArguments; } - for( const auto& result : qAsConst( results ) ) + for( const auto& result : std::as_const( results ) ) { printf( "%s\n", qUtf8Printable( result ) ); } diff --git a/plugins/ldap/common/LdapBrowseModel.cpp b/plugins/ldap/common/LdapBrowseModel.cpp index 2ca3ac66e..cf4070aca 100644 --- a/plugins/ldap/common/LdapBrowseModel.cpp +++ b/plugins/ldap/common/LdapBrowseModel.cpp @@ -373,12 +373,12 @@ void LdapBrowseModel::populateNode( const QModelIndex& parent ) { beginInsertRows( parent, 0, itemCount - 1 ); - for( const auto& dn : qAsConst(dns) ) + for( const auto& dn : std::as_const(dns) ) { node->appendChild( new Node( Node::DN, dn, node ) ); } - for( const auto& attribute : qAsConst(attributes) ) + for( const auto& attribute : std::as_const(attributes) ) { node->appendChild( new Node( Node::Attribute, attribute, node ) ); } diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index b34b0af3d..72eafb7b7 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -53,7 +53,7 @@ void LdapNetworkObjectDirectory::update() { const auto locations = m_ldapDirectory.computerLocations(); - for( const auto& location : qAsConst( locations ) ) + for( const auto& location : std::as_const( locations ) ) { const NetworkObject locationObject{this, NetworkObject::Type::Location, location}; @@ -72,7 +72,7 @@ void LdapNetworkObjectDirectory::updateLocation( const NetworkObject& locationOb { const auto computers = m_ldapDirectory.computerLocationEntries( locationObject.name() ); - for( const auto& computer : qAsConst( computers ) ) + for( const auto& computer : std::as_const( computers ) ) { const auto hostObject = computerToObject( this, &m_ldapDirectory, computer ); if( hostObject.type() == NetworkObject::Type::Host ) @@ -154,7 +154,7 @@ NetworkObjectList LdapNetworkObjectDirectory::queryHosts( NetworkObject::Propert NetworkObjectList hostObjects; hostObjects.reserve( computers.size() ); - for( const auto& computer : qAsConst(computers) ) + for( const auto& computer : std::as_const(computers) ) { const auto hostObject = computerToObject( this, &m_ldapDirectory, computer ); if( hostObject.isValid() ) diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 6f86e87e0..5a34d5cec 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -277,7 +277,7 @@ void LinuxServiceCore::stopServer( const QString& sessionPath ) vInfo() << "stopping server for removed session" << sessionPath; - auto serverProcess = qAsConst(m_serverProcesses)[sessionPath]; + auto serverProcess = std::as_const(m_serverProcesses)[sessionPath]; serverProcess->disconnect(this); serverProcess->stop(); serverProcess->deleteLater(); diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index b41837e6a..624e338cb 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -77,7 +77,7 @@ void ServerAccessControlManager::removeClient( VncServerClient* client ) const VncServerClientList previousClients = m_clients; m_clients.clear(); - for( auto prevClient : qAsConst( previousClients ) ) + for( auto prevClient : std::as_const( previousClients ) ) { prevClient->setAccessControlState( VncServerClient::AccessControlState::Init ); addClient( prevClient ); @@ -147,7 +147,7 @@ VncServerClient::AccessControlState ServerAccessControlManager::confirmDesktopAc // did we save a previous choice because user chose "always" or "never"? if( m_desktopAccessChoices.contains( hostUserPair ) ) { - if( qAsConst(m_desktopAccessChoices)[hostUserPair] == DesktopAccessDialog::ChoiceAlways ) + if( std::as_const(m_desktopAccessChoices)[hostUserPair] == DesktopAccessDialog::ChoiceAlways ) { return VncServerClient::AccessControlState::Successful; } diff --git a/server/src/VncProxyServer.cpp b/server/src/VncProxyServer.cpp index cfad10c12..52a113e73 100644 --- a/server/src/VncProxyServer.cpp +++ b/server/src/VncProxyServer.cpp @@ -74,7 +74,7 @@ bool VncProxyServer::start( int vncServerPort, const Password& vncServerPassword void VncProxyServer::stop() { - for( auto connection : qAsConst( m_connections ) ) + for( auto connection : std::as_const( m_connections ) ) { delete connection; } diff --git a/server/src/VncServer.cpp b/server/src/VncServer.cpp index 299a7ac44..e42f08f2b 100644 --- a/server/src/VncServer.cpp +++ b/server/src/VncServer.cpp @@ -45,7 +45,7 @@ VncServer::VncServer( QObject* parent ) : VncServerPluginInterfaceList defaultVncServerPlugins; - for( auto pluginObject : qAsConst( VeyonCore::pluginManager().pluginObjects() ) ) + for( auto pluginObject : std::as_const( VeyonCore::pluginManager().pluginObjects() ) ) { auto pluginInterface = qobject_cast( pluginObject ); auto vncServerPluginInterface = qobject_cast( pluginObject ); From b8a4ceb4c62b4c92b55603bcf1546f0dcd0ba3f6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 25 Oct 2024 14:23:40 +0200 Subject: [PATCH 1622/1765] AccessControlPage: always clean up authorized groups Remove orphaned groups which are not provided by the current user groups backend. --- configurator/src/AccessControlPage.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index 046984df4..39f4f020d 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -64,6 +64,24 @@ void AccessControlPage::resetWidgets() FOREACH_VEYON_ACCESS_CONTROL_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); m_accessGroups = VeyonCore::config().authorizedUserGroups(); + auto cleanedUpAccessGroups = m_accessGroups; + + const auto availableGroups = VeyonCore::userGroupsBackendManager().configuredBackend()-> + userGroups(VeyonCore::config().useDomainUserGroups()); + + const auto accessGroupNotAvailable = [&availableGroups](const QString& group) { + return availableGroups.contains(group) == false; + }; +#if QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) + cleanedUpAccessGroups.removeIf(accessGroupNotAvailable); +#else + cleanedUpAccessGroups.erase(std::remove_if(cleanedUpAccessGroups.begin(), cleanedUpAccessGroups.end(), accessGroupNotAvailable)); +#endif + if (m_accessGroups != cleanedUpAccessGroups) + { + m_accessGroups = cleanedUpAccessGroups; + VeyonCore::config().setAuthorizedUserGroups(m_accessGroups); + } updateAccessGroupsLists(); updateAccessControlRules(); @@ -127,8 +145,8 @@ void AccessControlPage::updateAccessGroupsLists() VeyonCore::userGroupsBackendManager().reloadConfiguration(); - const auto backend = VeyonCore::userGroupsBackendManager().configuredBackend(); - const auto groups = backend->userGroups(VeyonCore::config().useDomainUserGroups()); + const auto groups = VeyonCore::userGroupsBackendManager().configuredBackend()-> + userGroups(VeyonCore::config().useDomainUserGroups()); for( const auto& group : groups ) { From 2427795e376e52c27b7dcd3bc7c0c62c335be373 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Oct 2024 12:38:25 +0100 Subject: [PATCH 1623/1765] ToolButton: fix alt text not being shown when checked Until 7fd652d5cfa17a2f46bb00838bdd1a6c9ee30866 the alt text was drawn if checked. Now we have to change the text when the button is toggled. --- core/src/ToolButton.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/ToolButton.cpp b/core/src/ToolButton.cpp index 13fdd76ec..8ce9d05ee 100644 --- a/core/src/ToolButton.cpp +++ b/core/src/ToolButton.cpp @@ -49,6 +49,13 @@ ToolButton::ToolButton( const QIcon& icon, setText(label); setAutoRaise(true); setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextUnderIcon); + + if (m_altLabel.length() > 0) + { + connect (this, &ToolButton::toggled, this, [this](bool checked) { + setText(checked ? m_altLabel : m_label); + }); + } } From f7cefae6db3cc5d0fd5fec31c6e4a3afa92a6a17 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 30 Oct 2024 14:36:34 +0100 Subject: [PATCH 1624/1765] VeyonMaster: sort plugin UUIDs lexicographically Qt 6.8 has new comparison operator implementations (introduced with qt/qtbase@bcfa650ced140daaeb606b69a9b27ffc960da564) which makes regular sorting of a QUuid container via std::sort() return a different order. Therefore use a lambda to sort lexicographically explicitly. This fixes the wrong ordered feature buttons in the main tool bar when running with Qt 6.8. --- master/src/VeyonMaster.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 04ff4c66f..b9389f950 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -357,7 +357,9 @@ FeatureList VeyonMaster::featureList() const const auto disabledFeatures = VeyonCore::config().disabledFeatures(); auto pluginUids = VeyonCore::pluginManager().pluginUids(); - std::sort( pluginUids.begin(), pluginUids.end() ); + std::sort(pluginUids.begin(), pluginUids.end(), [](const Plugin::Uid a, const Plugin::Uid b) { + return a.toString() < b.toString(); + }); const auto addFeatures = [&]( const std::function& extraFilter ) { From 85b353b34ba9125fd0d1a208bdf1832b906885ea Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 6 Nov 2024 16:03:03 +0100 Subject: [PATCH 1625/1765] NetworkObjectDirectory: optimize propagation of changed objects Aggregate object changes and propagate them after timeout of 100 ms. This significantly improves performance of initial population of the directory, especially when used in conjunction with NetworkObjectTreeModel and NetworkObjectFilterProxyModel which cause cascades of rowCount()/parent()/fetchMore() calls. With very large nested directories this can lead to extreme recursion depths leading to OOM crashes. --- core/src/NetworkObjectDirectory.cpp | 45 ++++++++++++++++++++++++----- core/src/NetworkObjectDirectory.h | 11 +++++-- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index 23985c94b..71fb95c4e 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -24,18 +24,22 @@ #include -#include "VeyonConfiguration.h" -#include "VeyonCore.h" #include "NetworkObjectDirectory.h" NetworkObjectDirectory::NetworkObjectDirectory( const QString& name, QObject* parent ) : QObject( parent ), m_name( name ), - m_updateTimer( new QTimer( this ) ) + m_updateTimer(new QTimer(this)), + m_propagateChangedObjectsTimer(new QTimer(this)) { connect( m_updateTimer, &QTimer::timeout, this, &NetworkObjectDirectory::update ); + connect(m_propagateChangedObjectsTimer, &QTimer::timeout, + this, &NetworkObjectDirectory::propagateChildObjectChanges); + m_propagateChangedObjectsTimer->setInterval(ObjectChangePropagationTimeout); + m_propagateChangedObjectsTimer->setSingleShot(true); + // insert root item m_objects[rootId()] = {}; } @@ -372,14 +376,39 @@ void NetworkObjectDirectory::setObjectPopulated( const NetworkObject& networkObj -void NetworkObjectDirectory::propagateChildObjectChange(NetworkObject::ModelId objectId) +void NetworkObjectDirectory::propagateChildObjectChange(NetworkObject::ModelId objectId, int depth) { if (objectId != 0) { - const auto parentObjectId = parentId(objectId); - const auto childIndex = index(parentObjectId, objectId); - Q_EMIT objectChanged(parentObjectId, childIndex); + if (m_changedObjectIds.contains(objectId)) + { + m_changedObjectIds.removeAll(objectId); + } + + m_changedObjectIds.append(objectId); + + propagateChildObjectChange(parentId(objectId), depth+1); + + if (depth == 0) + { + m_propagateChangedObjectsTimer->stop(); + m_propagateChangedObjectsTimer->start(); + } + } +} + - propagateChildObjectChange(parentObjectId); + +void NetworkObjectDirectory::propagateChildObjectChanges() +{ + for (auto it = m_changedObjectIds.constBegin(), end = m_changedObjectIds.constEnd(); + it != end; ++it) + { + const auto parentObjectId = parentId(*it); + const auto childIndex = index(parentObjectId, *it); + + Q_EMIT objectChanged(parentObjectId, childIndex); } + + m_changedObjectIds.clear(); } diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 0e8c0dedd..7f36bd53c 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -80,21 +80,26 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject void removeObjects( const NetworkObject& parent, const NetworkObjectFilter& removeObjectFilter ); void replaceObjects( const NetworkObjectList& objects, const NetworkObject& parent ); void setObjectPopulated( const NetworkObject& networkObject ); - void propagateChildObjectChange(NetworkObject::ModelId objectId); + void propagateChildObjectChange(NetworkObject::ModelId objectId, int depth = 0); + void propagateChildObjectChanges(); private: + static constexpr auto ObjectChangePropagationTimeout = 100; + const QString m_name; - QTimer* m_updateTimer{nullptr}; + QTimer* m_updateTimer = nullptr; + QTimer* m_propagateChangedObjectsTimer = nullptr; QHash m_objects{}; NetworkObject m_invalidObject{this, NetworkObject::Type::None}; NetworkObject m_rootObject{this, NetworkObject::Type::Root}; NetworkObjectList m_defaultObjectList{}; + QList m_changedObjectIds; Q_SIGNALS: void objectsAboutToBeInserted(NetworkObject::ModelId parentId, int index, int count); void objectsInserted(); void objectsAboutToBeRemoved(NetworkObject::ModelId parentId, int index, int count); void objectsRemoved(); - void objectChanged(NetworkObject::ModelId parentId, int index ); + void objectChanged(NetworkObject::ModelId parentId, int index); }; From fbecca0bf3ad0dd627f46a8ce893ea5f440b0596 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 12 Nov 2024 09:24:14 +0100 Subject: [PATCH 1626/1765] 3rdparty: ultravnc: update submodule --- 3rdparty/ultravnc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index 7f3f925ed..e58859db7 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit 7f3f925ed5fef1b1eb9cf28436fb7a8bab130c4f +Subproject commit e58859db74aaaae89a239e3da621a0493eaac3f4 From 1d419d4a520d1e55725d788eba8237924f5b068a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 28 Nov 2024 11:40:56 +0100 Subject: [PATCH 1627/1765] WindowsUserFunctions: use char16_t* overload of QString::fromUtf16() --- plugins/platform/windows/WindowsUserFunctions.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index 2a28fb8ec..ff263f5af 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -314,7 +314,7 @@ QString WindowsUserFunctions::domainController( const QString& domainName ) const auto dsResult = DsGetDcName( nullptr, domainNamePointer, nullptr, nullptr, DS_DIRECTORY_SERVICE_REQUIRED, &dcInfo ); if( dsResult == ERROR_SUCCESS ) { - const auto dcName = QString::fromUtf16( reinterpret_cast( dcInfo->DomainControllerName ) ). + const auto dcName = QString::fromUtf16(reinterpret_cast(dcInfo->DomainControllerName)). replace( QLatin1Char('\\'), QString() ); NetApiBufferFree( dcInfo ); @@ -328,7 +328,7 @@ QString WindowsUserFunctions::domainController( const QString& domainName ) const auto netResult = NetGetDCName( nullptr, domainNamePointer, &outBuffer ); if( netResult == NERR_Success ) { - const auto dcName = QString::fromUtf16( reinterpret_cast( outBuffer ) ); + const auto dcName = QString::fromUtf16(reinterpret_cast(outBuffer)); NetApiBufferFree( outBuffer ); @@ -361,7 +361,7 @@ QStringList WindowsUserFunctions::domainUserGroups() for( DWORD i = 0; i < entriesRead; ++i ) { - groupList += QString::fromUtf16( reinterpret_cast( groupInfos[i].grpi0_name ) ); + groupList += QString::fromUtf16(reinterpret_cast(groupInfos[i].grpi0_name)); } if( entriesRead < totalEntries ) @@ -405,7 +405,7 @@ QStringList WindowsUserFunctions::domainGroupsOfUser( const QString& username ) for( DWORD i = 0; i < entriesRead; ++i ) { - groupList += QString::fromUtf16( reinterpret_cast( groupUsersInfo[i].grui0_name ) ); + groupList += QString::fromUtf16(reinterpret_cast(groupUsersInfo[i].grui0_name)); } if( entriesRead < totalEntries ) @@ -445,7 +445,7 @@ QStringList WindowsUserFunctions::localUserGroups() for( DWORD i = 0; i < entriesRead; ++i ) { - groupList += QString::fromUtf16( reinterpret_cast( groupInfos[i].lgrpi0_name ) ); + groupList += QString::fromUtf16(reinterpret_cast(groupInfos[i].lgrpi0_name)); } if( entriesRead < totalEntries ) @@ -485,7 +485,7 @@ QStringList WindowsUserFunctions::localGroupsOfUser( const QString& username ) for( DWORD i = 0; i < entriesRead; ++i ) { - groupList += QString::fromUtf16( reinterpret_cast( localGroupUsersInfo[i].lgrui0_name ) ); + groupList += QString::fromUtf16(reinterpret_cast(localGroupUsersInfo[i].lgrui0_name)); } if( entriesRead < totalEntries ) From 39da09fdc869490a76c3d8b186447f1f41e71464 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 28 Nov 2024 12:05:17 +0100 Subject: [PATCH 1628/1765] CI: replace Fedora 39 with Fedora 41 Fedora 39 is EOL as of 2024-11-26. --- .ci/linux.fedora.39/script.sh | 8 -------- .ci/{linux.fedora.39 => linux.fedora.41}/Dockerfile | 4 ++-- .ci/linux.fedora.41/script.sh | 8 ++++++++ .github/workflows/build.yml | 2 +- .gitlab-ci.yml | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) delete mode 100755 .ci/linux.fedora.39/script.sh rename .ci/{linux.fedora.39 => linux.fedora.41}/Dockerfile (93%) create mode 100755 .ci/linux.fedora.41/script.sh diff --git a/.ci/linux.fedora.39/script.sh b/.ci/linux.fedora.39/script.sh deleted file mode 100755 index d6331da02..000000000 --- a/.ci/linux.fedora.39/script.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=fedora.39" - -$1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.fedora.39/Dockerfile b/.ci/linux.fedora.41/Dockerfile similarity index 93% rename from .ci/linux.fedora.39/Dockerfile rename to .ci/linux.fedora.41/Dockerfile index e9396ff9d..2ce6b7562 100644 --- a/.ci/linux.fedora.39/Dockerfile +++ b/.ci/linux.fedora.41/Dockerfile @@ -1,8 +1,8 @@ -FROM fedora:39 +FROM fedora:41 MAINTAINER Tobias Junghans RUN \ - dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-39.noarch.rpm && \ + dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-41.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel \ diff --git a/.ci/linux.fedora.41/script.sh b/.ci/linux.fedora.41/script.sh new file mode 100755 index 000000000..b913dc3ee --- /dev/null +++ b/.ci/linux.fedora.41/script.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_PCH=OFF -DCPACK_DIST=fedora.41 -DCMAKE_CXX_FLAGS=-Wno-template-id-cdtor" + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 28abbdf58..386c3bf82 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ jobs: matrix: dist: - debian.12 - - fedora.40 + - fedora.41 - opensuse.tumbleweed - ubuntu.24.04 runs-on: ubuntu-latest diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c576ba85..88ef08f33 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,8 +13,8 @@ build-linux: - centos.7.9 - debian.11 - debian.12 - - fedora.39 - fedora.40 + - fedora.41 - opensuse.15.5 - opensuse.15.6 - opensuse.tumbleweed From 170c567129e32778c8b309a06318fe9a956ebf0f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Dec 2024 09:11:22 +0100 Subject: [PATCH 1629/1765] KExtraColumnsProxyModel: trivial fix for crash in buddy() when sourceModel isn't set yet (cherry picked from commit 1cc1330 @ KDE/kitemmodels) --- master/src/KExtraColumnsProxyModel.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/master/src/KExtraColumnsProxyModel.cpp b/master/src/KExtraColumnsProxyModel.cpp index cb2a58e2d..f3e8bb48f 100644 --- a/master/src/KExtraColumnsProxyModel.cpp +++ b/master/src/KExtraColumnsProxyModel.cpp @@ -121,9 +121,11 @@ QModelIndex KExtraColumnsProxyModel::mapToSource(const QModelIndex &proxyIndex) QModelIndex KExtraColumnsProxyModel::buddy(const QModelIndex &proxyIndex) const { - const int column = proxyIndex.column(); - if (column >= sourceModel()->columnCount()) { - return proxyIndex; + if (sourceModel()) { + const int column = proxyIndex.column(); + if (column >= sourceModel()->columnCount()) { + return proxyIndex; + } } return QIdentityProxyModel::buddy(proxyIndex); } From 8f5b2ad4c88d2cc96ab96aba13fb34fb711cc731 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 11 Dec 2024 09:13:37 +0100 Subject: [PATCH 1630/1765] KExtraColumnsProxyModel: port to Qt 6.8's QIdentityProxyModel::setHandleSourceLayoutChanges This fixes the handling of persistent model indexes and therefore some crashes, very likely. It also fixes warnings from QObject::disconnect about _q_sourceLayoutChanged not found. (cherry picked from 1a5e6e8 @ KDE/kitemmodels) --- master/src/KExtraColumnsProxyModel.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/master/src/KExtraColumnsProxyModel.cpp b/master/src/KExtraColumnsProxyModel.cpp index f3e8bb48f..0d879641f 100644 --- a/master/src/KExtraColumnsProxyModel.cpp +++ b/master/src/KExtraColumnsProxyModel.cpp @@ -36,6 +36,11 @@ KExtraColumnsProxyModel::KExtraColumnsProxyModel(QObject *parent) : QIdentityProxyModel(parent) , d_ptr(new KExtraColumnsProxyModelPrivate(this)) { + // The handling of persistent model indexes assumes mapToSource can be called for any index + // This breaks for the extra column, so we'll have to do it ourselves +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + setHandleSourceLayoutChanges(false); +#endif } KExtraColumnsProxyModel::~KExtraColumnsProxyModel() @@ -88,6 +93,7 @@ void KExtraColumnsProxyModel::setSourceModel(QAbstractItemModel *model) if (model) { // The handling of persistent model indexes assumes mapToSource can be called for any index // This breaks for the extra column, so we'll have to do it ourselves +#if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) disconnect(model, SIGNAL(layoutAboutToBeChanged(QList, QAbstractItemModel::LayoutChangeHint)), this, @@ -96,6 +102,7 @@ void KExtraColumnsProxyModel::setSourceModel(QAbstractItemModel *model) SIGNAL(layoutChanged(QList, QAbstractItemModel::LayoutChangeHint)), this, SLOT(_q_sourceLayoutChanged(QList, QAbstractItemModel::LayoutChangeHint))); +#endif connect(model, SIGNAL(layoutAboutToBeChanged(QList, QAbstractItemModel::LayoutChangeHint)), this, From 45538f6c79de0f7ab3bb837f490b54a68ac6f3f5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Jan 2025 12:35:29 +0100 Subject: [PATCH 1631/1765] LinuxCoreFunctions: adopt libproc2 4.0.5 API change The PIDS_VAL() macro no longer takes the (unused) info argument so drop it and use a wrapper macro for libproc2 < 4.0.5. Closes #998. --- plugins/platform/linux/CMakeLists.txt | 10 ++++++++++ plugins/platform/linux/LinuxCoreFunctions.cpp | 12 ++++++------ plugins/platform/linux/LinuxCoreFunctions.h | 6 +++++- plugins/platform/linux/LinuxServerProcess.cpp | 5 ++--- plugins/platform/linux/LinuxSessionFunctions.cpp | 5 ++--- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index 64f295bd7..d6469262b 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -5,6 +5,16 @@ find_package(PkgConfig QUIET) pkg_check_modules(procps libproc2) if(procps_FOUND) add_definitions(-DHAVE_LIBPROC2) + check_cxx_source_compiles("#include + int main() + { + pids_stack* stack = nullptr; + (void) PIDS_VAL(0, s_int, stack); + } + " LIBPROC2_PIDS_VAL_NEW_API) + if (NOT LIBPROC2_PIDS_VAL_NEW_API) + add_definitions(-DLIBPROC2_PIDS_VAL_OLD_API) + endif() else() pkg_check_modules(procps libprocps) if(procps_FOUND) diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index 76462f07a..f9665f52b 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -486,7 +486,7 @@ void LinuxCoreFunctions::forEachChildProcess( const std::function closeproc( proc ); } #elif defined(HAVE_LIBPROC2) -void LinuxCoreFunctions::forEachChildProcess(const std::function& visitor, +void LinuxCoreFunctions::forEachChildProcess(const std::function& visitor, int parentPid, const std::vector& items, bool visitParent) { QProcessEnvironment sessionEnv; @@ -508,18 +508,18 @@ void LinuxCoreFunctions::forEachChildProcess(const std::function +#ifdef LIBPROC2_PIDS_VAL_OLD_API +#undef PIDS_VAL +#define PIDS_VAL(relative_enum, type, stack) stack->head[relative_enum].result.type +#endif #else struct proc_t; #endif @@ -86,7 +90,7 @@ class LinuxCoreFunctions : public PlatformCoreFunctions static void restartDisplayManagers(); #ifdef HAVE_LIBPROC2 - static void forEachChildProcess(const std::function& visitor, + static void forEachChildProcess(const std::function& visitor, int parentPid, const std::vector& items, bool visitParent); #else static void forEachChildProcess( const std::function& visitor, diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index 0df95c535..c9f335576 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -99,10 +99,9 @@ void LinuxServerProcess::stop() }, pid, 0, true ); #elif defined(HAVE_LIBPROC2) - LinuxCoreFunctions::forEachChildProcess([=](const pids_stack* stack, const pids_info* info) + LinuxCoreFunctions::forEachChildProcess([=](const pids_stack* stack) { - Q_UNUSED(info) - const pid_t tid = PIDS_VAL(0, s_int, stack, info); + const pid_t tid = PIDS_VAL(0, s_int, stack); if (tid > 0 && ::kill(tid, sig) < 0 && errno != ESRCH) { vCritical() << "kill() failed with" << errno; diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 2b3dd937f..1608b274a 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -383,11 +383,10 @@ QProcessEnvironment LinuxSessionFunctions::getSessionEnvironment( int sessionLea }, sessionLeaderPid, PROC_FILLENV, true ); #elif defined(HAVE_LIBPROC2) - LinuxCoreFunctions::forEachChildProcess([&sessionEnv](const pids_stack* stack, const pids_info* info) + LinuxCoreFunctions::forEachChildProcess([&sessionEnv](const pids_stack* stack) { - Q_UNUSED(info) static constexpr auto EnvironItemIndex = 2; - const auto environ = PIDS_VAL(EnvironItemIndex, strv, stack, info); + const auto environ = PIDS_VAL(EnvironItemIndex, strv, stack); if (environ != nullptr) { From f7ba1feb78831a274c382167dd36e0d6ed2865f3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 10 Jan 2025 12:52:31 +0100 Subject: [PATCH 1632/1765] GHA: CodeQL: update build dependencies --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index bacb155d2..2a040d8e0 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -36,18 +36,18 @@ jobs: sudo apt-get update && sudo apt-get install --no-install-recommends -y cmake ninja-build - qtbase5-dev qtbase5-private-dev qtbase5-dev-tools qtdeclarative5-dev qtquickcontrols2-5-dev + qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-tools-dev qt6-declarative-dev qt6-httpserver-dev qt6-websockets-dev \ xorg-dev libfakekey-dev libjpeg-dev zlib1g-dev libssl-dev libpam0g-dev - libprocps-dev + libproc2-dev libldap2-dev libsasl2-dev libpng-dev liblzo2-dev - libqca-qt5-2-dev libqca-qt5-2-plugins + libqca-qt6-dev libqca-qt6-plugins - name: Build run: | From 18d6d6aa3741eac7ad080e55529b3082a612b521 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 11:01:28 +0100 Subject: [PATCH 1633/1765] CMake: fix missing include for check_cxx_source_compiles() --- plugins/platform/linux/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/platform/linux/CMakeLists.txt b/plugins/platform/linux/CMakeLists.txt index d6469262b..89c9074a2 100644 --- a/plugins/platform/linux/CMakeLists.txt +++ b/plugins/platform/linux/CMakeLists.txt @@ -5,6 +5,7 @@ find_package(PkgConfig QUIET) pkg_check_modules(procps libproc2) if(procps_FOUND) add_definitions(-DHAVE_LIBPROC2) + include(CheckCXXSourceCompiles) check_cxx_source_compiles("#include int main() { From 5907dbb86815f0f1edef0beba41bc68c2ad5ea55 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Jan 2025 09:07:21 +0100 Subject: [PATCH 1634/1765] AccessControlPage: fix groups cleanup with Qt 5 The 2nd argument for QList::erase() was missing when used in conjunction with std::erase_if(). Closes #996. --- configurator/src/AccessControlPage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index 39f4f020d..419fab4d1 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -75,7 +75,7 @@ void AccessControlPage::resetWidgets() #if QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) cleanedUpAccessGroups.removeIf(accessGroupNotAvailable); #else - cleanedUpAccessGroups.erase(std::remove_if(cleanedUpAccessGroups.begin(), cleanedUpAccessGroups.end(), accessGroupNotAvailable)); + cleanedUpAccessGroups.erase(std::remove_if(cleanedUpAccessGroups.begin(), cleanedUpAccessGroups.end(), accessGroupNotAvailable), cleanedUpAccessGroups.end()); #endif if (m_accessGroups != cleanedUpAccessGroups) { From 895b43feff16b01bb0cc51c381488c971ea3d39f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Jan 2025 09:15:35 +0100 Subject: [PATCH 1635/1765] GHA: CodeQL: update versions and fix package installation --- .github/workflows/codeql-analysis.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 2a040d8e0..0d734066d 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,7 +9,7 @@ on: jobs: analyze: name: Analyze - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: actions: read contents: read @@ -22,12 +22,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: submodules: true - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} @@ -36,7 +36,7 @@ jobs: sudo apt-get update && sudo apt-get install --no-install-recommends -y cmake ninja-build - qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-tools-dev qt6-declarative-dev qt6-httpserver-dev qt6-websockets-dev \ + qt6-base-dev qt6-5compat-dev qt6-l10n-tools qt6-tools-dev qt6-declarative-dev qt6-httpserver-dev qt6-websockets-dev xorg-dev libfakekey-dev libjpeg-dev @@ -53,8 +53,8 @@ jobs: run: | mkdir -p $GITHUB_WORKSPACE/build cd $GITHUB_WORKSPACE/build - cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_QT6=OFF -DWITH_LTO=OFF -DWITH_TRANSLATIONS=OFF .. + cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -DWITH_QT6=ON -DWITH_LTO=OFF -DWITH_TRANSLATIONS=OFF .. ninja - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 From 8c4cd8df12a0f5c62d6987a1dec786cb84afbf25 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Jan 2025 10:10:26 +0100 Subject: [PATCH 1636/1765] 3rdparty: kldap: update submodule --- 3rdparty/kldap | 2 +- plugins/ldap/kldap/KLdapIntegration.cpp | 2 ++ plugins/ldap/kldap/ldap_core_debug.h | 2 +- plugins/ldap/kldap/ldap_debug.h | 11 ++++++++++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/3rdparty/kldap b/3rdparty/kldap index 27bf9afbf..ee428f08e 160000 --- a/3rdparty/kldap +++ b/3rdparty/kldap @@ -1 +1 @@ -Subproject commit 27bf9afbf5fb0bc587e7d707c3ea10845dcfdf34 +Subproject commit ee428f08e48b1b666313b2051d744fcd91799c79 diff --git a/plugins/ldap/kldap/KLdapIntegration.cpp b/plugins/ldap/kldap/KLdapIntegration.cpp index f59e507c5..25a46842f 100644 --- a/plugins/ldap/kldap/KLdapIntegration.cpp +++ b/plugins/ldap/kldap/KLdapIntegration.cpp @@ -3,5 +3,7 @@ // SPDX-License-Identifier: LGPL-2.0-or-later #include "ldap_core_debug.h" +#include "ldap_debug.h" +Q_LOGGING_CATEGORY(LDAP_CORE_LOG, "KLDAP"); Q_LOGGING_CATEGORY(LDAP_LOG, "KLDAP"); diff --git a/plugins/ldap/kldap/ldap_core_debug.h b/plugins/ldap/kldap/ldap_core_debug.h index 3b8964f63..c3aea7c38 100644 --- a/plugins/ldap/kldap/ldap_core_debug.h +++ b/plugins/ldap/kldap/ldap_core_debug.h @@ -7,5 +7,5 @@ #include #include -Q_DECLARE_LOGGING_CATEGORY(LDAP_LOG); +Q_DECLARE_LOGGING_CATEGORY(LDAP_CORE_LOG); diff --git a/plugins/ldap/kldap/ldap_debug.h b/plugins/ldap/kldap/ldap_debug.h index f43c42119..442f7aa7a 100644 --- a/plugins/ldap/kldap/ldap_debug.h +++ b/plugins/ldap/kldap/ldap_debug.h @@ -1 +1,10 @@ -#include "ldap_core_debug.h" +// Copyright (c) 2019-2024 Tobias Junghans +// This file is part of Veyon - https://veyon.io +// SPDX-License-Identifier: LGPL-2.0-or-later + +#pragma once + +#include +#include + +Q_DECLARE_LOGGING_CATEGORY(LDAP_LOG); From 78c5cc339995d7a5573afee8962dc1cfe3b6c654 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 12:08:42 +0100 Subject: [PATCH 1637/1765] Configuration: Store: refactor enumerations --- cli/src/ConfigCommands.cpp | 4 ++-- configurator/src/MainWindow.cpp | 4 ++-- core/src/Configuration/JsonStore.cpp | 12 +++++------ core/src/Configuration/JsonStore.h | 2 +- core/src/Configuration/LocalStore.cpp | 4 ++-- core/src/Configuration/Object.cpp | 6 +++--- core/src/Configuration/Store.h | 29 +++++++++++++-------------- core/src/ConfigurationManager.cpp | 4 ++-- core/src/VeyonConfiguration.cpp | 4 ++-- master/src/UserConfig.cpp | 16 +++++++-------- master/src/UserConfig.h | 2 +- master/src/VeyonMaster.cpp | 2 +- 12 files changed, 44 insertions(+), 45 deletions(-) diff --git a/cli/src/ConfigCommands.cpp b/cli/src/ConfigCommands.cpp index 0cbb8128a..e140b9b5f 100644 --- a/cli/src/ConfigCommands.cpp +++ b/cli/src/ConfigCommands.cpp @@ -113,7 +113,7 @@ CommandLinePluginInterface::RunResult ConfigCommands::handle_import( const QStri return operationError( tr( "Configuration file is not readable!" ) ); } - Configuration::JsonStore xs( Configuration::JsonStore::System, fileName ); + Configuration::JsonStore xs(Configuration::Store::Scope::System, fileName); // merge configuration VeyonCore::config() += VeyonConfiguration( &xs ); @@ -144,7 +144,7 @@ CommandLinePluginInterface::RunResult ConfigCommands::handle_export( const QStri } // write current configuration to output file - Configuration::JsonStore( Configuration::JsonStore::System, fileName ).flush( &VeyonCore::config() ); + Configuration::JsonStore(Configuration::Store::Scope::System, fileName).flush( &VeyonCore::config() ); return Successful; } diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index f2af9160c..14c1d7459 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -209,7 +209,7 @@ void MainWindow::loadSettingsFromFile() if( !fileName.isEmpty() ) { // write current configuration to output file - Configuration::JsonStore( Configuration::JsonStore::System, fileName ).load( &VeyonCore::config() ); + Configuration::JsonStore(Configuration::JsonStore::Scope::System, fileName).load(&VeyonCore::config()); reset( true ); configurationChanged(); // give user a chance to apply possible changes } @@ -232,7 +232,7 @@ void MainWindow::saveSettingsToFile() bool configChangedPrevious = m_configChanged; // write current configuration to output file - Configuration::JsonStore( Configuration::JsonStore::System, fileName ).flush( &VeyonCore::config() ); + Configuration::JsonStore(Configuration::JsonStore::Scope::System, fileName).flush(&VeyonCore::config()); m_configChanged = configChangedPrevious; ui->buttonBox->setEnabled( m_configChanged ); diff --git a/core/src/Configuration/JsonStore.cpp b/core/src/Configuration/JsonStore.cpp index e43b17099..a1bdcadd4 100644 --- a/core/src/Configuration/JsonStore.cpp +++ b/core/src/Configuration/JsonStore.cpp @@ -37,8 +37,8 @@ namespace Configuration { -JsonStore::JsonStore( Scope scope, const QString &file ) : - Store( Store::JsonFile, scope ), +JsonStore::JsonStore(Scope scope, const QString &file) : + Store(Store::Backend::JsonFile, scope), m_file( file ) { } @@ -170,18 +170,18 @@ void JsonStore::clear() QString JsonStore::configurationFilePath() const { - if( m_file.isEmpty() == false ) + if (m_file.isEmpty() == false) { return m_file; } QString base; - switch( scope() ) + switch (scope()) { - case User: + case Scope::User: base = VeyonCore::config().userConfigurationDirectory(); break; - case System: + case Scope::System: base = VeyonCore::platform().filesystemFunctions().globalAppDataPath(); break; } diff --git a/core/src/Configuration/JsonStore.h b/core/src/Configuration/JsonStore.h index c3981d771..bb75d5b0e 100644 --- a/core/src/Configuration/JsonStore.h +++ b/core/src/Configuration/JsonStore.h @@ -34,7 +34,7 @@ namespace Configuration class VEYON_CORE_EXPORT JsonStore : public Store { public: - explicit JsonStore( Scope scope, const QString & file = {} ); + explicit JsonStore(Scope scope, const QString & file = {}); void load( Object *obj ) override; void flush( const Object *obj ) override; diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index 02c7ac310..9c6ab0b62 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -37,7 +37,7 @@ namespace Configuration { LocalStore::LocalStore( Scope scope ) : - Store( Store::LocalBackend, scope ) + Store(Store::Backend::Local, scope) { } @@ -199,7 +199,7 @@ QSettings *LocalStore::createSettingsObject() const #else QSettings::NativeFormat, #endif - scope() == System ? QSettings::SystemScope : QSettings::UserScope, + scope() == Scope::System ? QSettings::SystemScope : QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()); } diff --git a/core/src/Configuration/Object.cpp b/core/src/Configuration/Object.cpp index e072f1c47..f6aab92cc 100644 --- a/core/src/Configuration/Object.cpp +++ b/core/src/Configuration/Object.cpp @@ -331,9 +331,9 @@ Store* Object::createStore( Store::Backend backend, Store::Scope scope ) { switch( backend ) { - case Store::LocalBackend: return new LocalStore( scope ); - case Store::JsonFile: return new JsonStore( scope ); - case Store::NoBackend: + case Store::Backend::Local: return new LocalStore(scope); + case Store::Backend::JsonFile: return new JsonStore(scope); + case Store::Backend::None: break; default: vCritical() << "invalid store" << backend << "selected"; diff --git a/core/src/Configuration/Store.h b/core/src/Configuration/Store.h index 72eb02f94..755f21ce3 100644 --- a/core/src/Configuration/Store.h +++ b/core/src/Configuration/Store.h @@ -39,26 +39,25 @@ class Object; class Store { + Q_GADGET public: - enum Backends + enum class Backend { - LocalBackend, // registry or similiar + Local, // registry or similar JsonFile, - NoBackend - } ; - using Backend = Backends; + None + }; + Q_ENUM(Backend) - enum Scopes + enum class Scope { User, // for current user System, // system-wide (service settings etc.) - } ; - using Scope = Scopes; + }; - - Store( Backend backend, Scope scope ) : - m_backend( backend ), - m_scope( scope ) + Store(Backend backend, Scope scope) : + m_backend(backend), + m_scope(scope) { } @@ -76,10 +75,10 @@ class Store QString configurationNameFromScope() const { - switch( scope() ) + switch (scope()) { - case User: return QStringLiteral( "UserConfig" ); - case System: return QStringLiteral( "SystemConfig" ); + case Scope::User: return QStringLiteral("UserConfig"); + case Scope::System: return QStringLiteral("SystemConfig"); } return {}; diff --git a/core/src/ConfigurationManager.cpp b/core/src/ConfigurationManager.cpp index 4171389e1..bd88217bb 100644 --- a/core/src/ConfigurationManager.cpp +++ b/core/src/ConfigurationManager.cpp @@ -43,7 +43,7 @@ ConfigurationManager::ConfigurationManager( QObject* parent ) : bool ConfigurationManager::clearConfiguration() { - Configuration::LocalStore( Configuration::LocalStore::System ).clear(); + Configuration::LocalStore(Configuration::LocalStore::Scope::System).clear(); return true; } @@ -99,7 +99,7 @@ bool ConfigurationManager::applyConfiguration() bool ConfigurationManager::saveConfiguration() { // write global configuration - Configuration::LocalStore localStore( Configuration::LocalStore::System ); + Configuration::LocalStore localStore(Configuration::LocalStore::Scope::System); if( localStore.isWritable() == false ) { m_errorString = tr( "Configuration is not writable. Please check your permissions!" ); diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index 02b96b7c9..a27d7315d 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -32,8 +32,8 @@ VeyonConfiguration::VeyonConfiguration() : - Configuration::Object( Configuration::Store::LocalBackend, - Configuration::Store::System ) + Configuration::Object(Configuration::Store::Backend::Local, + Configuration::Store::Scope::System) { } diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index d3efc983b..5830e3c03 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -29,15 +29,15 @@ #include "UserConfig.h" -UserConfig::UserConfig( Configuration::Store::Backend backend ) : - Configuration::Object( backend, Configuration::Store::User, QStringLiteral("VeyonMaster") ) +UserConfig::UserConfig() : + Configuration::Object(Configuration::Store::Backend::JsonFile, Configuration::Store::Scope::User, QStringLiteral("VeyonMaster")) { - if( isStoreWritable() == false ) + if (isStoreWritable() == false) { - QMessageBox::information( nullptr, - tr( "No write access" ), - tr( "Could not save your personal settings! " - "Please check the user configuration " - "file path using the %1 Configurator." ).arg( VeyonCore::applicationName() ) ); + QMessageBox::information(nullptr, + tr("No write access"), + tr("Could not save your personal settings! " + "Please check the user configuration " + "file path using the %1 Configurator.").arg(VeyonCore::applicationName())); } } diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index 72af01f7c..19fd710fa 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -39,7 +39,7 @@ class UserConfig : public Configuration::Object { Q_OBJECT public: - explicit UserConfig( Configuration::Store::Backend backend ); + UserConfig(); #define FOREACH_PERSONAL_CONFIG_PROPERTY(OP) \ OP( UserConfig, VeyonMaster::userConfig(), QJsonArray, checkedNetworkObjects, setCheckedNetworkObjects, "CheckedNetworkObjects", "UI", QJsonArray(), Configuration::Property::Flag::Standard ) \ diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index b9389f950..354b485d2 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -44,7 +44,7 @@ VeyonMaster::VeyonMaster( QObject* parent ) : VeyonMasterInterface( parent ), - m_userConfig( new UserConfig( Configuration::Store::JsonFile ) ), + m_userConfig(new UserConfig), m_features( featureList() ), m_featureListModel( new FeatureListModel( this ) ), m_computerManager( new ComputerManager( *m_userConfig, this ) ), From e180f6d748426ee4d6a5d9f649ae6687656af03b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 12:09:20 +0100 Subject: [PATCH 1638/1765] Configuration: improve header includes --- core/src/Configuration/JsonStore.h | 1 + core/src/Configuration/LocalStore.h | 1 + core/src/Configuration/Store.h | 2 -- core/src/ConfigurationManager.cpp | 1 - 4 files changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/Configuration/JsonStore.h b/core/src/Configuration/JsonStore.h index bb75d5b0e..9078e0735 100644 --- a/core/src/Configuration/JsonStore.h +++ b/core/src/Configuration/JsonStore.h @@ -25,6 +25,7 @@ #pragma once #include "Configuration/Store.h" +#include "VeyonCore.h" namespace Configuration { diff --git a/core/src/Configuration/LocalStore.h b/core/src/Configuration/LocalStore.h index 97db8cca0..50ff28557 100644 --- a/core/src/Configuration/LocalStore.h +++ b/core/src/Configuration/LocalStore.h @@ -25,6 +25,7 @@ #pragma once #include "Configuration/Store.h" +#include "VeyonCore.h" class QSettings; diff --git a/core/src/Configuration/Store.h b/core/src/Configuration/Store.h index 755f21ce3..a0ef67d8b 100644 --- a/core/src/Configuration/Store.h +++ b/core/src/Configuration/Store.h @@ -28,8 +28,6 @@ #include #include -#include "VeyonCore.h" - namespace Configuration { diff --git a/core/src/ConfigurationManager.cpp b/core/src/ConfigurationManager.cpp index bd88217bb..9306a3b76 100644 --- a/core/src/ConfigurationManager.cpp +++ b/core/src/ConfigurationManager.cpp @@ -26,7 +26,6 @@ #include "ConfigurationManager.h" #include "Filesystem.h" #include "PlatformCoreFunctions.h" -#include "PlatformInputDeviceFunctions.h" #include "PlatformNetworkFunctions.h" #include "VeyonConfiguration.h" #include "VeyonServiceControl.h" From 454a1791e97080b3ad7f1be4763266b65e57c01f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 12:41:04 +0100 Subject: [PATCH 1639/1765] VeyonConfigurationProperties: add configurationTemplatesDirectory property --- core/src/VeyonConfigurationProperties.h | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index f502880f9..747981185 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -108,6 +108,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, localConnectOnly, setLocalConnectOnly, "LocalConnectOnly", "Network", false, Configuration::Property::Flag::Advanced ) \ #define FOREACH_VEYON_DIRECTORIES_CONFIG_PROPERTY(OP) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, configurationTemplatesDirectory, setConfigurationTemplatesDirectory, "ConfigurationTemplates", "Directories", QDir::toNativeSeparators(QStringLiteral("%GLOBALAPPDATA%/Config/Templates")), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QString, userConfigurationDirectory, setUserConfigurationDirectory, "UserConfiguration", "Directories", QDir::toNativeSeparators( QStringLiteral( "%APPDATA%/Config" ) ), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QString, screenshotDirectory, setScreenshotDirectory, "Screenshots", "Directories", QDir::toNativeSeparators( QStringLiteral( "%APPDATA%/Screenshots" ) ), Configuration::Property::Flag::Standard ) \ From 9b0e6c43cea010cb1ebfc5fb0783c8e6f7043d43 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 12:42:07 +0100 Subject: [PATCH 1640/1765] VeyonMaster, UserConfig: move config access check --- master/src/UserConfig.cpp | 15 ++------------- master/src/UserConfig.h | 3 ++- master/src/VeyonMaster.cpp | 11 ++++++++++- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index 5830e3c03..9e05b8448 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -23,21 +23,10 @@ * */ -#include - -#include "VeyonCore.h" #include "UserConfig.h" -UserConfig::UserConfig() : - Configuration::Object(Configuration::Store::Backend::JsonFile, Configuration::Store::Scope::User, QStringLiteral("VeyonMaster")) +UserConfig::UserConfig(const QString& storeName) : + Configuration::Object(Configuration::Store::Backend::JsonFile, Configuration::Store::Scope::User, storeName) { - if (isStoreWritable() == false) - { - QMessageBox::information(nullptr, - tr("No write access"), - tr("Could not save your personal settings! " - "Please check the user configuration " - "file path using the %1 Configurator.").arg(VeyonCore::applicationName())); - } } diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index 19fd710fa..70c2f897e 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -39,7 +39,8 @@ class UserConfig : public Configuration::Object { Q_OBJECT public: - UserConfig(); + UserConfig(const QString& storeName); + explicit UserConfig(Configuration::Store* store); #define FOREACH_PERSONAL_CONFIG_PROPERTY(OP) \ OP( UserConfig, VeyonMaster::userConfig(), QJsonArray, checkedNetworkObjects, setCheckedNetworkObjects, "CheckedNetworkObjects", "UI", QJsonArray(), Configuration::Property::Flag::Standard ) \ diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index 354b485d2..aa46f8404 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include "BuiltinFeatures.h" #include "ComputerControlListModel.h" @@ -44,7 +45,7 @@ VeyonMaster::VeyonMaster( QObject* parent ) : VeyonMasterInterface( parent ), - m_userConfig(new UserConfig), + m_userConfig(new UserConfig(QStringLiteral("VeyonMaster"))), m_features( featureList() ), m_featureListModel( new FeatureListModel( this ) ), m_computerManager( new ComputerManager( *m_userConfig, this ) ), @@ -59,6 +60,14 @@ VeyonMaster::VeyonMaster( QObject* parent ) : this ), m_currentMode( VeyonCore::builtinFeatures().monitoringMode().feature().uid() ) { + if (m_userConfig->isStoreWritable() == false) + { + QMessageBox::information(nullptr, + tr("No write access"), + tr("Could not save your personal settings! Please check the user configuration " + "file path using the %1 Configurator.").arg(VeyonCore::applicationName())); + } + connect(m_computerControlListModel, &ComputerControlListModel::modelAboutToBeReset, this, &VeyonMaster::computerControlListModelAboutToReset); From 86cce11a20ccd3960e39a05eb98a6822a694899d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 12:46:30 +0100 Subject: [PATCH 1641/1765] Master: UserConfig: load template if available --- master/src/UserConfig.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index 9e05b8448..ab94ddd51 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -23,10 +23,28 @@ * */ +#include "Configuration/JsonStore.h" +#include "Filesystem.h" #include "UserConfig.h" +#include "VeyonConfiguration.h" UserConfig::UserConfig(const QString& storeName) : Configuration::Object(Configuration::Store::Backend::JsonFile, Configuration::Store::Scope::User, storeName) +{ + const auto templateFileName = VeyonCore::filesystem().expandPath(VeyonCore::config().configurationTemplatesDirectory()) + + QDir::separator() + storeName + QStringLiteral(".json"); + if (QFileInfo(templateFileName).isReadable()) + { + Configuration::JsonStore jsonStore(Configuration::Store::Scope::System, templateFileName); + *this += UserConfig(&jsonStore); + reloadFromStore(); + } +} + + + +UserConfig::UserConfig(Configuration::Store* store) : + Configuration::Object(store) { } From c344debcbe04dee61ca4454015f4c5d25ae4ef96 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 12:51:31 +0100 Subject: [PATCH 1642/1765] PlatformSessionFunctions: don't include PlatformPluginInterface.h --- core/src/PlatformSessionFunctions.h | 2 +- plugins/demo/DemoFeaturePlugin.cpp | 1 + server/src/ComputerControlServer.cpp | 1 + server/src/VncServer.cpp | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 986ed0459..64f800be4 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -24,7 +24,7 @@ #pragma once -#include "PlatformPluginInterface.h" +#include "VeyonCore.h" // clazy:excludeall=copyable-polymorphic diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index ef76f9d15..fdf586878 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -34,6 +34,7 @@ #include "FeatureWorkerManager.h" #include "HostAddress.h" #include "Logger.h" +#include "PlatformPluginInterface.h" #include "PlatformSessionFunctions.h" #include "VeyonConfiguration.h" #include "VeyonMasterInterface.h" diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 0cee1dcb6..75782aa84 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -31,6 +31,7 @@ #include "FeatureManager.h" #include "FeatureMessage.h" #include "HostAddress.h" +#include "PlatformPluginInterface.h" #include "VeyonConfiguration.h" #include "SystemTrayIcon.h" diff --git a/server/src/VncServer.cpp b/server/src/VncServer.cpp index e42f08f2b..0ad856da6 100644 --- a/server/src/VncServer.cpp +++ b/server/src/VncServer.cpp @@ -28,6 +28,7 @@ #include "AuthenticationCredentials.h" #include "CryptoCore.h" #include "VeyonConfiguration.h" +#include "PlatformPluginInterface.h" #include "PlatformSessionFunctions.h" #include "PluginManager.h" #include "VncServer.h" From 30207a43b4671d76ebe47345837c1deae6218e7e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 12:56:28 +0100 Subject: [PATCH 1643/1765] MasterConfigurationPage: add config templates directory field --- configurator/src/MasterConfigurationPage.cpp | 20 ++++++++-- configurator/src/MasterConfigurationPage.h | 1 + configurator/src/MasterConfigurationPage.ui | 40 +++++++++++++++----- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index e1519ea58..e3866a2ab 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -41,11 +41,16 @@ MasterConfigurationPage::MasterConfigurationPage( QWidget* parent ) : { ui->setupUi(this); - connect( ui->openUserConfigurationDirectory, &QPushButton::clicked, - this, &MasterConfigurationPage::openUserConfigurationDirectory ); + Configuration::UiMapping::setFlags(ui->advancedSettingsGroupBox, Configuration::Property::Flag::Advanced); - connect( ui->openScreenshotDirectory, &QPushButton::clicked, - this, &MasterConfigurationPage::openScreenshotDirectory ); + connect(ui->openUserConfigurationDirectory, &QPushButton::clicked, + this, &MasterConfigurationPage::openUserConfigurationDirectory); + + connect(ui->openScreenshotDirectory, &QPushButton::clicked, + this, &MasterConfigurationPage::openScreenshotDirectory); + + connect(ui->openConfigurationTemplatesDirectory, &QPushButton::clicked, + this, &MasterConfigurationPage::openConfigurationTemplatesDirectory); populateFeatureComboBox(); } @@ -133,6 +138,13 @@ void MasterConfigurationPage::openScreenshotDirectory() +void MasterConfigurationPage::openConfigurationTemplatesDirectory() +{ + FileSystemBrowser(FileSystemBrowser::ExistingDirectory).exec(ui->configurationTemplatesDirectory); +} + + + void MasterConfigurationPage::populateFeatureComboBox() { ui->computerDoubleClickFeature->addItem( QIcon(), tr( "" ), QUuid() ); diff --git a/configurator/src/MasterConfigurationPage.h b/configurator/src/MasterConfigurationPage.h index 614d3c552..8a589cd1b 100644 --- a/configurator/src/MasterConfigurationPage.h +++ b/configurator/src/MasterConfigurationPage.h @@ -48,6 +48,7 @@ private Q_SLOTS: private: void openUserConfigurationDirectory(); void openScreenshotDirectory(); + void openConfigurationTemplatesDirectory(); void populateFeatureComboBox(); void updateFeatureLists(); diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index ebf7ca0d4..2dced32e1 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -31,6 +31,27 @@ 10 + + + + + + + Screenshots + + + + + + + + :/core/document-open.png:/core/document-open.png + + + + + + @@ -46,21 +67,18 @@ - - - - - + + - Screenshots + Configuration templates - - + + - - + + :/core/document-open.png:/core/document-open.png @@ -579,8 +597,10 @@ tabWidget userConfigurationDirectory screenshotDirectory + configurationTemplatesDirectory openUserConfigurationDirectory openScreenshotDirectory + openConfigurationTemplatesDirectory computerMonitoringImageQuality remoteAccessImageQuality computerMonitoringUpdateInterval From 2233cdae94bfa2f4454ed55506c388a71c53a2ad Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 14:16:32 +0100 Subject: [PATCH 1644/1765] MonitoringMode: add support for querying session meta data --- configurator/src/ServiceConfigurationPage.cpp | 3 +- configurator/src/ServiceConfigurationPage.ui | 142 +++++++++++++----- core/src/MonitoringMode.cpp | 25 ++- core/src/MonitoringMode.h | 5 + core/src/PlatformSessionFunctions.h | 15 +- core/src/VeyonConfiguration.h | 1 - core/src/VeyonConfigurationProperties.h | 4 + 7 files changed, 152 insertions(+), 43 deletions(-) diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index c4d1260c1..c5a515bed 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -43,8 +43,9 @@ ServiceConfigurationPage::ServiceConfigurationPage( QWidget* parent ) : { ui->setupUi(this); - Configuration::UiMapping::setFlags( ui->networkPortNumbersGroupBox, Configuration::Property::Flag::Advanced ); + Configuration::UiMapping::setFlags(ui->networkPortNumbersGroupBox, Configuration::Property::Flag::Advanced); Configuration::UiMapping::setFlags(ui->miscSettingsGroupBox, Configuration::Property::Flag::Advanced); + Configuration::UiMapping::setFlags(ui->sessionMetaDataGroupBox, Configuration::Property::Flag::Advanced); updateServiceControl(); populateVncServerPluginComboBox(); diff --git a/configurator/src/ServiceConfigurationPage.ui b/configurator/src/ServiceConfigurationPage.ui index afefeec2b..8a7bf1633 100644 --- a/configurator/src/ServiceConfigurationPage.ui +++ b/configurator/src/ServiceConfigurationPage.ui @@ -70,7 +70,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -179,7 +179,7 @@ Typically this is required to support terminal servers. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -200,13 +200,24 @@ Typically this is required to support terminal servers. Network port numbers - - - - 1024 + + + + Demo server - - 65535 + + + + + + Internal VNC server + + + + + + + Veyon server @@ -220,8 +231,8 @@ Typically this is required to support terminal servers. - - + + 1024 @@ -230,17 +241,23 @@ Typically this is required to support terminal servers. - - - - Veyon server + + + + 1024 + + + 65535 - - - - Internal VNC server + + + + 1024 + + + 65535 @@ -251,23 +268,6 @@ Typically this is required to support terminal servers. - - - - Demo server - - - - - - - 1024 - - - 65535 - - - @@ -331,10 +331,77 @@ Typically this is required to support terminal servers. + + + + Session metadata + + + + + + Content + + + + + + + + 0 + 0 + + + + + None + + + + + Value of an environment variable + + + + + Value of a registry key + + + + + + + + Environment variable name: + + + + + + + + + + Registry key name: + + + + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + + + + + - Qt::Vertical + Qt::Orientation::Vertical @@ -365,6 +432,9 @@ Typically this is required to support terminal servers. localConnectOnly clipboardSynchronizationDisabled vncServerPlugin + sessionMetaDataContent + sessionMetaDataEnvironmentVariable + sessionMetaDataRegistryKey diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 670bd0801..9df4d424c 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -63,7 +63,10 @@ MonitoringMode::MonitoringMode( QObject* parent ) : Feature::Uid("d5bbc486-7bc5-4c36-a9a8-1566c8b0091a"), Feature::Uid(), tr("Query properties of remotely available screens"), {}, {} ), m_features({ m_monitoringModeFeature, m_queryApplicationVersionFeature, m_queryActiveFeatures, - m_queryUserInfoFeature, m_querySessionInfoFeature, m_queryScreensFeature}) + m_queryUserInfoFeature, m_querySessionInfoFeature, m_queryScreensFeature}), + m_sessionMetaDataContent(VeyonCore::config().sessionMetaDataContent()), + m_sessionMetaDataEnvironmentVariable(VeyonCore::config().sessionMetaDataEnvironmentVariable()), + m_sessionMetaDataRegistryKey(VeyonCore::config().sessionMetaDataRegistryKey()) { if(VeyonCore::component() == VeyonCore::Component::Server) { @@ -187,7 +190,8 @@ bool MonitoringMode::handleFeatureMessage( ComputerControlInterface::Pointer com message.argument(Argument::SessionUptime).toInt(), message.argument(Argument::SessionClientAddress).toString(), message.argument(Argument::SessionClientName).toString(), - message.argument(Argument::SessionHostName).toString() + message.argument(Argument::SessionHostName).toString(), + message.argument(Argument::SessionMetaData).toString(), }); return true; @@ -350,6 +354,7 @@ bool MonitoringMode::sendSessionInfo(VeyonServerInterface& server, const Message message.addArgument(Argument::SessionClientAddress, m_sessionInfo.clientAddress); message.addArgument(Argument::SessionClientName, m_sessionInfo.clientName); message.addArgument(Argument::SessionHostName, m_sessionInfo.hostName); + message.addArgument(Argument::SessionMetaData, m_sessionInfo.metaData); m_sessionInfoLock.unlock(); return server.sendFeatureMessageReply(messageContext,message); @@ -418,12 +423,26 @@ void MonitoringMode::updateUserData() void MonitoringMode::updateSessionInfo() { (void) QtConcurrent::run([=]() { + QString sessionMetaData; + switch (m_sessionMetaDataContent) + { + case PlatformSessionFunctions::SessionMetaDataContent::EnvironmentVariable: + sessionMetaData = VeyonCore::platform().sessionFunctions().currentSessionEnvironmentVariables().value(m_sessionMetaDataEnvironmentVariable); + break; + case PlatformSessionFunctions::SessionMetaDataContent::RegistryKey: + sessionMetaData = VeyonCore::platform().sessionFunctions().querySettingsValueInCurrentSession(m_sessionMetaDataRegistryKey).toString(); + break; + case PlatformSessionFunctions::SessionMetaDataContent::None: + break; + } + const PlatformSessionFunctions::SessionInfo currentSessionInfo{ VeyonCore::sessionId(), VeyonCore::platform().sessionFunctions().currentSessionUptime(), VeyonCore::platform().sessionFunctions().currentSessionClientAddress(), VeyonCore::platform().sessionFunctions().currentSessionClientName(), - VeyonCore::platform().sessionFunctions().currentSessionHostName() + VeyonCore::platform().sessionFunctions().currentSessionHostName(), + sessionMetaData }; m_sessionInfoLock.lockForWrite(); diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index b14bfb67a..0aac93f05 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -46,6 +46,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac SessionHostName, SessionClientAddress, SessionClientName, + SessionMetaData, ActiveFeaturesList = 0 // for compatibility after migration from FeatureControl }; Q_ENUM(Argument) @@ -187,6 +188,10 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac QVariantList m_screenInfoList; int m_screenInfoListVersion{0}; + PlatformSessionFunctions::SessionMetaDataContent m_sessionMetaDataContent; + QString m_sessionMetaDataEnvironmentVariable; + QString m_sessionMetaDataRegistryKey; + QReadWriteLock m_sessionInfoLock; PlatformSessionFunctions::SessionInfo m_sessionInfo{}; QAtomicInt m_sessionInfoVersion = 0; diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 64f800be4..98357ddfb 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -28,8 +28,9 @@ // clazy:excludeall=copyable-polymorphic -class PlatformSessionFunctions +class VEYON_CORE_EXPORT PlatformSessionFunctions { + Q_GADGET public: using SessionId = int; using SessionUptime = int; @@ -41,13 +42,15 @@ class PlatformSessionFunctions QString clientAddress; QString clientName; QString hostName; + QString metaData; bool operator==(const SessionInfo& other) const { return other.id == id && other.uptime == uptime && other.clientAddress == clientAddress && other.clientName == clientName && - other.hostName == hostName; + other.hostName == hostName && + other.metaData == metaData; } bool operator!=(const SessionInfo& other) const { @@ -59,6 +62,14 @@ class PlatformSessionFunctions static constexpr SessionId InvalidSessionId = -1; static constexpr SessionUptime InvalidSessionUptime = -1; + enum class SessionMetaDataContent + { + None, + EnvironmentVariable, + RegistryKey, + }; + Q_ENUM(SessionMetaDataContent) + virtual ~PlatformSessionFunctions() = default; virtual SessionId currentSessionId() = 0; diff --git a/core/src/VeyonConfiguration.h b/core/src/VeyonConfiguration.h index 42cfdc8e1..5da94d8d5 100644 --- a/core/src/VeyonConfiguration.h +++ b/core/src/VeyonConfiguration.h @@ -25,7 +25,6 @@ #pragma once -#include "VeyonCore.h" #include "Configuration/Object.h" #include "Configuration/Property.h" diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 747981185..62c43dbce 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -33,6 +33,7 @@ #include "ComputerListModel.h" #include "Logger.h" #include "NetworkObjectDirectory.h" +#include "PlatformSessionFunctions.h" #include "VncConnectionConfiguration.h" #define FOREACH_VEYON_CORE_CONFIG_PROPERTIES(OP) \ @@ -68,6 +69,9 @@ OP( VeyonConfiguration, VeyonCore::config(), int, maximumSessionCount, setMaximumSessionCount, "MaximumSessionCount", "Service", 100, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, autostartService, setServiceAutostart, "Autostart", "Service", true, Configuration::Property::Flag::Advanced ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, clipboardSynchronizationDisabled, setClipboardSynchronizationDisabled, "ClipboardSynchronizationDisabled", "Service", false, Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), PlatformSessionFunctions::SessionMetaDataContent, sessionMetaDataContent, setSessionMetaDataContent, "SessionMetaDataContent", "Service", QVariant::fromValue(PlatformSessionFunctions::SessionMetaDataContent::None), Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, sessionMetaDataEnvironmentVariable, setSessionMetaDataEnvironmentVariable, "SessionMetaDataEnvironmentVariable", "Service", QString(), Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), QString, sessionMetaDataRegistryKey, setSessionMetaDataRegistryKey, "SessionMetaDataRegistryKey", "Service", QString(), Configuration::Property::Flag::Advanced ) \ #define FOREACH_VEYON_NETWORK_OBJECT_DIRECTORY_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QStringList, enabledNetworkObjectDirectoryPlugins, setEnabledNetworkObjectDirectoryPlugins, "EnabledPlugins", "NetworkObjectDirectory", QStringList(), Configuration::Property::Flag::Standard ) \ From 78b3c0de68cad3af70bd534ae52167cb6bfb26fd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 14:20:51 +0100 Subject: [PATCH 1645/1765] NetworkObjectOverlayDataModel: add support for overlay data Implement setData() and data() such that an internal data map is written and read. --- master/src/NetworkObjectOverlayDataModel.cpp | 78 ++++++++++++++++++-- master/src/NetworkObjectOverlayDataModel.h | 18 +++-- 2 files changed, 85 insertions(+), 11 deletions(-) diff --git a/master/src/NetworkObjectOverlayDataModel.cpp b/master/src/NetworkObjectOverlayDataModel.cpp index c57a3c660..4345a6943 100644 --- a/master/src/NetworkObjectOverlayDataModel.cpp +++ b/master/src/NetworkObjectOverlayDataModel.cpp @@ -48,6 +48,53 @@ NetworkObjectOverlayDataModel::NetworkObjectOverlayDataModel(const QStringList& +QVariant NetworkObjectOverlayDataModel::data(const QModelIndex& index, int role) const +{ + if (index.column() > 0) + { + return KExtraColumnsProxyModel::data(index, role); + } + + const auto networkObjectUid = lookupNetworkObjectId(index); + if (m_overlayData.contains(networkObjectUid)) + { + const auto& overlayData = std::as_const(m_overlayData)[networkObjectUid]; + if (overlayData.contains(role)) + { + return std::as_const(overlayData)[role]; + } + } + + return KExtraColumnsProxyModel::data(index, role); +} + + + +bool NetworkObjectOverlayDataModel::setData(const QModelIndex& index, const QVariant& value, int role) +{ + if (index.column() > 0) + { + return KExtraColumnsProxyModel::setData(index, value, role); + } + + const auto networkObjectUid = lookupNetworkObjectId(index); + if (networkObjectUid.isNull()) + { + return false; + } + + auto& overlayData = m_overlayData[networkObjectUid]; // clazy:exclude=detaching-member + if (overlayData.value(role) != value) + { + overlayData[role] = value; + Q_EMIT dataChanged(index, index, {role}); + } + + return true; +} + + + QVariant NetworkObjectOverlayDataModel::extraColumnData(const QModelIndex &parent, int row, int extraColumn, int role) const { if (role != m_overlayDataRole) @@ -55,11 +102,11 @@ QVariant NetworkObjectOverlayDataModel::extraColumnData(const QModelIndex &paren return {}; } - NetworkObject::Uid networkObjectUid = data( index( row, 0, parent ), NetworkObjectModel::UidRole ).toUuid(); + const auto networkObjectUid = lookupNetworkObjectId(parent, row); - if( networkObjectUid.isNull() == false && m_overlayData.contains( networkObjectUid ) ) + if( networkObjectUid.isNull() == false && m_extraColumnsData.contains( networkObjectUid ) ) { - return m_overlayData[networkObjectUid].value(extraColumn); + return m_extraColumnsData[networkObjectUid].value(extraColumn); } return {}; @@ -74,8 +121,8 @@ bool NetworkObjectOverlayDataModel::setExtraColumnData( const QModelIndex &paren return false; } - const auto networkObjectUid = KExtraColumnsProxyModel::data( index( row, 0, parent ), NetworkObjectModel::UidRole ).toUuid(); - auto& rowData = m_overlayData[networkObjectUid]; // clazy:exclude=detaching-member + const auto networkObjectUid = lookupNetworkObjectId(parent, row); + auto& rowData = m_extraColumnsData[networkObjectUid]; // clazy:exclude=detaching-member if (extraColumn >= rowData.count() || rowData[extraColumn] != data) @@ -86,9 +133,28 @@ bool NetworkObjectOverlayDataModel::setExtraColumnData( const QModelIndex &paren std::fill_n(std::back_inserter(rowData), extraColumn + 1 - rowData.size(), QVariant{}); #endif rowData[extraColumn] = data; - m_overlayData[networkObjectUid] = rowData; + m_extraColumnsData[networkObjectUid] = rowData; extraColumnDataChanged( parent, row, extraColumn, { m_overlayDataRole } ); } return true; } + + + +NetworkObject::Uid NetworkObjectOverlayDataModel::lookupNetworkObjectId(const QModelIndex& index) const +{ + if (index.isValid() == false) + { + return {}; + } + + return KExtraColumnsProxyModel::data(index, NetworkObjectModel::UidRole).toUuid(); +} + + + +NetworkObject::Uid NetworkObjectOverlayDataModel::lookupNetworkObjectId(const QModelIndex& parent, int row) const +{ + return lookupNetworkObjectId(index(row, 0, parent)); +} diff --git a/master/src/NetworkObjectOverlayDataModel.h b/master/src/NetworkObjectOverlayDataModel.h index efb0a638d..1d8b89636 100644 --- a/master/src/NetworkObjectOverlayDataModel.h +++ b/master/src/NetworkObjectOverlayDataModel.h @@ -31,16 +31,24 @@ class NetworkObjectOverlayDataModel : public KExtraColumnsProxyModel { Q_OBJECT public: - explicit NetworkObjectOverlayDataModel( const QStringList& overlayDataHeaders, - QObject *parent = nullptr ); + explicit NetworkObjectOverlayDataModel(const QStringList& overlayDataHeaders, + QObject *parent = nullptr); - QVariant extraColumnData( const QModelIndex &parent, int row, int extraColumn, int role ) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - bool setExtraColumnData( const QModelIndex &parent, int row, int extraColumn, const QVariant &data, int role ) override; + bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::DisplayRole) override; + + QVariant extraColumnData(const QModelIndex& parent, int row, int extraColumn, int role = Qt::DisplayRole) const override; + + bool setExtraColumnData(const QModelIndex& parent, int row, int extraColumn, const QVariant& data, int role = Qt::DisplayRole) override; private: + NetworkObject::Uid lookupNetworkObjectId(const QModelIndex& index) const; + NetworkObject::Uid lookupNetworkObjectId(const QModelIndex& parent, int row) const; + int m_overlayDataRole; - QHash> m_overlayData; + QHash> m_overlayData; + QHash> m_extraColumnsData; }; From 36587ece13c3265d5eae1f850e279044806c44b5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 16:31:58 +0100 Subject: [PATCH 1646/1765] Configuration: pass source DataMap as const ref --- core/src/Configuration/Object.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/Configuration/Object.cpp b/core/src/Configuration/Object.cpp index f6aab92cc..1059d9818 100644 --- a/core/src/Configuration/Object.cpp +++ b/core/src/Configuration/Object.cpp @@ -93,7 +93,7 @@ Object& Object::operator=( const Object& ref ) // allow easy merging of two data maps - source is dominant over destination -static Object::DataMap operator+( Object::DataMap dst, Object::DataMap src ) +static Object::DataMap operator+(Object::DataMap dst, const Object::DataMap& src) { for( auto it = src.begin(), end = src.end(); it != end; ++it ) { From b262af653b174d627edf0fd0270b66c2f33f3a7f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 14:22:47 +0100 Subject: [PATCH 1647/1765] Master: add support for alternative computer name sources Strings such as user name and various session information can be used as the displayed computer name. --- configurator/src/MasterConfigurationPage.ui | 69 +++++++++++++++++++-- core/src/NetworkObjectDirectory.h | 13 ++++ core/src/VeyonConfigurationProperties.h | 1 + master/src/ComputerManager.cpp | 54 ++++++++++++++-- master/src/ComputerManager.h | 3 + master/src/ComputerMonitoringWidget.cpp | 2 +- 6 files changed, 133 insertions(+), 9 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 2dced32e1..8857bbc2f 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -336,10 +336,70 @@ + + + + Advanced + + + + + + Computer name source + + + + + + + + Default + + + + + Host address + + + + + Session client address + + + + + Session client name + + + + + Session host name + + + + + Session metadata + + + + + Full name of user + + + + + User login name + + + + + + + - Qt::Vertical + Qt::Orientation::Vertical @@ -500,7 +560,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -541,7 +601,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -570,7 +630,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -611,6 +671,7 @@ computerMonitoringSortOrder computerMonitoringThumbnailSpacing modernUserInterface + computerNameSource accessControlForMasterEnabled autoSelectCurrentLocation autoAdjustMonitoringIconSize diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 7f36bd53c..05a0987a9 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -41,6 +41,19 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject MaximumUpdateInterval = 3600 }; + enum class ComputerNameSource + { + Default, + HostAddress, + SessionClientAddress, + SessionClientName, + SessionHostName, + SessionMetaData, + UserFullName, + UserLoginName, + }; + Q_ENUM(ComputerNameSource) + explicit NetworkObjectDirectory( const QString& name, QObject* parent ); const QString& name() const diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 62c43dbce..eef2cdac4 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -142,6 +142,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, autoOpenComputerSelectPanel, setAutoOpenComputerSelectPanel, "AutoOpenComputerSelectPanel", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, confirmUnsafeActions, setConfirmUnsafeActions, "ConfirmUnsafeActions", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, showFeatureWindowsOnSameScreen, setShowFeatureWindowsOnSameScreen, "ShowFeatureWindowsOnSameScreen", "Master", false, Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), NetworkObjectDirectory::ComputerNameSource, computerNameSource, setComputerNameSource, "ComputerNameSource", "Master", QVariant::fromValue(NetworkObjectDirectory::ComputerNameSource::Default), Configuration::Property::Flag::Advanced ) \ #define FOREACH_VEYON_AUTHENTICATION_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QStringList, enabledAuthenticationPlugins, setEnabledAuthenticationPlugins, "EnabledPlugins", "Authentication", QStringList(), Configuration::Property::Flag::Standard ) \ diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 21da09586..07a7ad0f6 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -50,7 +50,8 @@ ComputerManager::ComputerManager( UserConfig& config, QObject* parent ) : m_computerTreeModel( new CheckableItemProxyModel( NetworkObjectModel::UidRole, this ) ), m_networkObjectFilterProxyModel( new NetworkObjectFilterProxyModel( this ) ), m_localHostNames( QHostInfo::localHostName().toLower() ), - m_localHostAddresses( QHostInfo::fromName( QHostInfo::localHostName() ).addresses() ) + m_localHostAddresses(QHostInfo::fromName(QHostInfo::localHostName()).addresses()), + m_computerNameSource(VeyonCore::config().computerNameSource()) { if( m_networkObjectDirectory == nullptr ) { @@ -153,9 +154,26 @@ void ComputerManager::updateUser(const ComputerControlInterface::Pointer& contro { user = controlInterface->userLoginName(); } - m_networkObjectOverlayDataModel->setData( mapToUserNameModelIndex( networkObjectIndex ), - user, - Qt::DisplayRole ); + m_networkObjectOverlayDataModel->setData(mapToUserNameModelIndex(networkObjectIndex), user); + + QString computerName; + switch (m_computerNameSource) + { + case NetworkObjectDirectory::ComputerNameSource::UserFullName: + computerName = controlInterface->userFullName(); + break; + case NetworkObjectDirectory::ComputerNameSource::UserLoginName: + computerName = controlInterface->userLoginName(); + break; + default: + break; + } + + if (computerName.isEmpty() == false) + { + m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), + computerName); + } } } @@ -176,6 +194,34 @@ void ComputerManager::updateSessionInfo(const ComputerControlInterface::Pointer& m_networkObjectOverlayDataModel->setData(mapToSessionUptimeModelIndex(networkObjectIndex), uptimeString, Qt::DisplayRole); + QString computerName; + + switch (m_computerNameSource) + { + case NetworkObjectDirectory::ComputerNameSource::HostAddress: + computerName = controlInterface->computer().hostAddress(); + break; + case NetworkObjectDirectory::ComputerNameSource::SessionClientName: + computerName = controlInterface->sessionInfo().clientName; + break; + case NetworkObjectDirectory::ComputerNameSource::SessionClientAddress: + computerName = controlInterface->sessionInfo().clientAddress; + break; + case NetworkObjectDirectory::ComputerNameSource::SessionHostName: + computerName = controlInterface->sessionInfo().hostName; + break; + case NetworkObjectDirectory::ComputerNameSource::SessionMetaData: + computerName = controlInterface->sessionInfo().metaData; + break; + default: + break; + } + + if (computerName.isEmpty() == false) + { + m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), + computerName); + } } } diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index 109c50241..a23ed6ce0 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -26,6 +26,7 @@ #include "CheckableItemProxyModel.h" #include "ComputerControlInterface.h" +#include "NetworkObjectDirectory.h" class QHostAddress; class NetworkObjectDirectory; @@ -100,4 +101,6 @@ class ComputerManager : public QObject QStringList m_localHostNames; QList m_localHostAddresses; + NetworkObjectDirectory::ComputerNameSource m_computerNameSource; + }; diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 81ed9b826..d56771b23 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -28,8 +28,8 @@ #include #include "ComputerControlListModel.h" -#include "ComputerMonitoringWidget.h" #include "ComputerMonitoringModel.h" +#include "ComputerMonitoringWidget.h" #include "VeyonMaster.h" #include "FeatureManager.h" #include "VeyonConfiguration.h" From f026a36622c6f15339d36feef131363c7a293818 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 14:25:07 +0100 Subject: [PATCH 1648/1765] ComputerControlListModel: make content of UID role configurable --- configurator/src/MasterConfigurationPage.ui | 22 +++++++++++++++++++++ core/src/ComputerListModel.cpp | 1 + core/src/ComputerListModel.h | 12 +++++++++++ core/src/VeyonConfigurationProperties.h | 1 + master/src/ComputerControlListModel.cpp | 22 +++++++++++++++++---- master/src/ComputerControlListModel.h | 1 + 6 files changed, 55 insertions(+), 4 deletions(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 8857bbc2f..8f814ccfe 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -393,6 +393,27 @@ + + + + Computer UID role + + + + + + + + Default + + + + + Session meta data hash + + + + @@ -672,6 +693,7 @@ computerMonitoringThumbnailSpacing modernUserInterface computerNameSource + computerUidRoleContent accessControlForMasterEnabled autoSelectCurrentLocation autoAdjustMonitoringIconSize diff --git a/core/src/ComputerListModel.cpp b/core/src/ComputerListModel.cpp index 5649c021a..95d3c2965 100644 --- a/core/src/ComputerListModel.cpp +++ b/core/src/ComputerListModel.cpp @@ -29,6 +29,7 @@ ComputerListModel::ComputerListModel( QObject* parent ) : QAbstractListModel( parent ), m_displayRoleContent( VeyonCore::config().computerDisplayRoleContent() ), + m_uidRoleContent(VeyonCore::config().computerUidRoleContent()), m_sortOrder( VeyonCore::config().computerMonitoringSortOrder() ), m_aspectRatio( VeyonCore::config().computerMonitoringAspectRatio() ) { diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index 7934c6bab..8f1739b6a 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -49,6 +49,12 @@ class VEYON_CORE_EXPORT ComputerListModel : public QAbstractListModel }; Q_ENUM(DisplayRoleContent) + enum class UidRoleContent { + NetworkObjectUid, + SessionMetaDataHash, + }; + Q_ENUM(UidRoleContent) + enum class SortOrder { ComputerAndUserName, UserName, @@ -79,6 +85,11 @@ class VEYON_CORE_EXPORT ComputerListModel : public QAbstractListModel return m_displayRoleContent; } + UidRoleContent uidRoleContent() const + { + return m_uidRoleContent; + } + SortOrder sortOrder() const { return m_sortOrder; @@ -91,6 +102,7 @@ class VEYON_CORE_EXPORT ComputerListModel : public QAbstractListModel private: DisplayRoleContent m_displayRoleContent; + UidRoleContent m_uidRoleContent; SortOrder m_sortOrder; AspectRatio m_aspectRatio; diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index eef2cdac4..398e29287 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -123,6 +123,7 @@ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringUpdateInterval, setComputerMonitoringUpdateInterval, "ComputerMonitoringUpdateInterval", "Master", 1000, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), int, computerMonitoringThumbnailSpacing, setComputerMonitoringThumbnailSpacing, "ComputerMonitoringThumbnailSpacing", "Master", 5, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::DisplayRoleContent, computerDisplayRoleContent, setComputerDisplayRoleContent, "ComputerDisplayRoleContent", "Master", QVariant::fromValue(ComputerListModel::DisplayRoleContent::UserAndComputerName), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::UidRoleContent, computerUidRoleContent, setComputerUidRoleContent, "ComputerUidRoleContent", "Master", QVariant::fromValue(ComputerListModel::UidRoleContent::NetworkObjectUid), Configuration::Property::Flag::Advanced) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::SortOrder, computerMonitoringSortOrder, setComputerMonitoringSortOrder, "ComputerMonitoringSortOrder", "Master", QVariant::fromValue(ComputerListModel::SortOrder::ComputerAndUserName), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), ComputerListModel::AspectRatio, computerMonitoringAspectRatio, setComputerMonitoringAspectRatio, "ComputerMonitoringAspectRatio", "Master", QVariant::fromValue(ComputerListModel::AspectRatio::Auto), Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), QColor, computerMonitoringBackgroundColor, setComputerMonitoringBackgroundColor, "ComputerMonitoringBackgroundColor", "Master", QColor(Qt::white), Configuration::Property::Flag::Standard ) \ diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 30522df85..d12b69bb0 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -102,7 +102,7 @@ QVariant ComputerControlListModel::data( const QModelIndex& index, int role ) co return computerSortRole( computerControl ); case UidRole: - return computerControl->computer().networkObjectUid(); + return uidRoleData(computerControl); case StateRole: return QVariant::fromValue( computerControl->state() ); @@ -266,14 +266,11 @@ void ComputerControlListModel::reload() m_computerControlInterfaces.clear(); m_computerControlInterfaces.reserve( computerList.size() ); - int row = 0; - for( const auto& computer : computerList ) { const auto controlInterface = ComputerControlInterface::Pointer::create( computer ); m_computerControlInterfaces.append( controlInterface ); startComputerControlInterface( controlInterface.data() ); - ++row; } endResetModel(); @@ -340,6 +337,23 @@ QModelIndex ComputerControlListModel::interfaceIndex( ComputerControlInterface* +QVariant ComputerControlListModel::uidRoleData(const ComputerControlInterface::Pointer& controlInterface) const +{ + static const QUuid uidRoleNamespace(QStringLiteral("7480c1c0-2b9f-46f1-92a6-0978bbfcd191")); + + switch (uidRoleContent()) + { + case UidRoleContent::NetworkObjectUid: + return controlInterface->computer().networkObjectUid(); + case UidRoleContent::SessionMetaDataHash: + return QUuid::createUuidV5(uidRoleNamespace, controlInterface->sessionInfo().metaData); + } + + return {}; +} + + + void ComputerControlListModel::updateState( const QModelIndex& index ) { Q_EMIT dataChanged( index, index, { Qt::DisplayRole, Qt::DecorationRole, Qt::ToolTipRole, ImageIdRole, FramebufferRole } ); diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index edcb1b746..2c1fcfb14 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -78,6 +78,7 @@ class ComputerControlListModel : public ComputerListModel void update(); QModelIndex interfaceIndex( ComputerControlInterface* controlInterface ) const; + QVariant uidRoleData(const ComputerControlInterface::Pointer& controlInterface) const; void updateState( const QModelIndex& index ); void updateScreen( const QModelIndex& index ); From 5466161bc50292d063b5af4c53870ee4f7160bf5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 15 Jan 2025 15:59:32 +0100 Subject: [PATCH 1649/1765] MainWindow: add support for loading/saving computer positions Extend "Use custom computer positions" button by menu with actions to load or save computer positions from/to file easily. --- master/src/MainWindow.cpp | 69 +++++++++++++++++++++++++++++++++++---- master/src/MainWindow.h | 3 ++ master/src/MainWindow.ui | 20 +++++++----- 3 files changed, 77 insertions(+), 15 deletions(-) diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index dd2a26438..f723a08b3 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -23,6 +23,8 @@ */ #include +#include +#include #include #include #include @@ -75,7 +77,7 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : ui->statusBar->addWidget( ui->gridSizeSlider, 2 ); ui->statusBar->addWidget( ui->autoAdjustComputerIconSizeButton ); ui->statusBar->addWidget( ui->spacerLabel3 ); - ui->statusBar->addWidget( ui->useCustomComputerArrangementButton ); + ui->statusBar->addWidget( ui->useCustomComputerPositionsButton ); ui->statusBar->addWidget( ui->alignComputersButton ); ui->statusBar->addWidget( ui->spacerLabel4 ); ui->statusBar->addWidget( ui->aboutButton ); @@ -223,11 +225,20 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : } ); // initialize computer placement controls - ui->useCustomComputerArrangementButton->setChecked( m_master.userConfig().useCustomComputerPositions() ); - connect( ui->useCustomComputerArrangementButton, &QToolButton::toggled, - ui->computerMonitoringWidget, &ComputerMonitoringWidget::setUseCustomComputerPositions ); - connect( ui->alignComputersButton, &QToolButton::clicked, - ui->computerMonitoringWidget, &ComputerMonitoringWidget::alignComputers ); + auto customComputerPositionsControlMenu = new QMenu; + customComputerPositionsControlMenu->addAction(QIcon(QStringLiteral(":/core/document-open.png")), + tr("Load computer positions"), + this, &MainWindow::loadComputerPositions); + customComputerPositionsControlMenu->addAction(QIcon(QStringLiteral(":/core/document-save.png")), + tr("Save computer positions"), + this, &MainWindow::saveComputerPositions); + ui->useCustomComputerPositionsButton->setMenu(customComputerPositionsControlMenu); + + ui->useCustomComputerPositionsButton->setChecked(m_master.userConfig().useCustomComputerPositions()); + connect(ui->useCustomComputerPositionsButton, &QToolButton::toggled, + ui->computerMonitoringWidget, &ComputerMonitoringWidget::setUseCustomComputerPositions); + connect(ui->alignComputersButton, &QToolButton::clicked, + ui->computerMonitoringWidget, &ComputerMonitoringWidget::alignComputers); // connect spotlight panel visibility to spotlight panel button checked state connect( spotlightPanel, &SpotlightPanel::visibilityChanged, @@ -536,3 +547,49 @@ void MainWindow::updateModeButtonGroup() m_modeGroup->button( buttonId( monitoringMode ) )->setChecked( true ); } } + + + +void MainWindow::loadComputerPositions() +{ + if (const auto fileName = QFileDialog::getOpenFileName(this, tr("Load computer positions"), + QDir::homePath(), tr("JSON files (*.json)")); + !fileName.isEmpty()) + { + if (QFile file(fileName); file.open(QFile::ReadOnly)) + { + const auto& computerPositionsProperty = m_master.userConfig().computerPositionsProperty(); + const auto config = QJsonDocument::fromJson(file.readAll()).object(); + const auto uiConfig = config[computerPositionsProperty.parentKey()].toObject(); + const auto computerPositions = uiConfig[computerPositionsProperty.key()].toObject()[QStringLiteral("JsonStoreArray")].toArray(); + + ui->computerMonitoringWidget->loadPositions(computerPositions); + ui->computerMonitoringWidget->setUseCustomComputerPositions(true); + ui->computerMonitoringWidget->doItemsLayout(); + } + } +} + + + +void MainWindow::saveComputerPositions() +{ + if (const auto fileName = QFileDialog::getSaveFileName(this, tr("Save computer positions"), + QDir::homePath(), tr("JSON files (*.json)")); + !fileName.isEmpty()) + { + if (QFile file(fileName); file.open(QFile::WriteOnly | QFile::Truncate)) + { + const auto& computerPositionsProperty = m_master.userConfig().computerPositionsProperty(); + + // create structure identical to UserConfig so file with positions can be used as template for UserConfig + QJsonObject computerPositions; + computerPositions[QStringLiteral("JsonStoreArray")] = ui->computerMonitoringWidget->savePositions(); + QJsonObject uiConfig; + uiConfig[computerPositionsProperty.key()] = computerPositions; + QJsonObject config; + config[computerPositionsProperty.parentKey()] = uiConfig; + file.write(QJsonDocument(config).toJson()); + } + } +} diff --git a/master/src/MainWindow.h b/master/src/MainWindow.h index aa549b176..4ffc14000 100644 --- a/master/src/MainWindow.h +++ b/master/src/MainWindow.h @@ -82,6 +82,9 @@ private Q_SLOTS: void updateModeButtonGroup(); + void loadComputerPositions(); + void saveComputerPositions(); + Ui::MainWindow* ui; VeyonMaster& m_master; diff --git a/master/src/MainWindow.ui b/master/src/MainWindow.ui index e7418b4b1..8da76f00a 100644 --- a/master/src/MainWindow.ui +++ b/master/src/MainWindow.ui @@ -84,7 +84,7 @@ 150 - Qt::Horizontal + Qt::Orientation::Horizontal @@ -176,7 +176,7 @@ :/master/align-grid.png:/master/align-grid.png - + 1010 @@ -186,7 +186,9 @@ - Use custom computer arrangement + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. @@ -240,7 +242,7 @@ 0 - QLayout::SetMinimumSize + QLayout::SizeConstraint::SetMinimumSize 0 @@ -267,7 +269,7 @@ true - Qt::ToolButtonTextBesideIcon + Qt::ToolButtonStyle::ToolButtonTextBesideIcon buttonGroup @@ -287,7 +289,7 @@ true - Qt::ToolButtonTextBesideIcon + Qt::ToolButtonStyle::ToolButtonTextBesideIcon buttonGroup @@ -307,7 +309,7 @@ true - Qt::ToolButtonTextBesideIcon + Qt::ToolButtonStyle::ToolButtonTextBesideIcon @@ -324,7 +326,7 @@ true - Qt::ToolButtonTextBesideIcon + Qt::ToolButtonStyle::ToolButtonTextBesideIcon @@ -402,7 +404,7 @@ - useCustomComputerArrangementButton + useCustomComputerPositionsButton toggled(bool) alignComputersButton setEnabled(bool) From cee8626a804dbb2c520a5cd59eb18835beea5adb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 17 Jan 2025 14:39:06 +0100 Subject: [PATCH 1650/1765] ldap: always use kldap-qt-compat for Qt 5 --- plugins/ldap/common/LdapClient.h | 2 +- plugins/ldap/kldap/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index 0840be080..4452be63b 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -9,7 +9,7 @@ #include "LdapCommon.h" -#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) namespace KLDAP { class LdapConnection; class LdapOperation; diff --git a/plugins/ldap/kldap/CMakeLists.txt b/plugins/ldap/kldap/CMakeLists.txt index f2fa4f4d9..4527e06b0 100644 --- a/plugins/ldap/kldap/CMakeLists.txt +++ b/plugins/ldap/kldap/CMakeLists.txt @@ -17,7 +17,7 @@ CHECK_SYMBOL_EXISTS(ldap_extended_operation_s ldap.h HAVE_LDAP_EXTENDED_OPERATIO check_include_files(ldap.h HAVE_LDAP_H) set(LDAP_FOUND TRUE) -if(NOT WITH_QT6 AND Qt5Core_VERSION VERSION_LESS 5.14.0) +if(NOT WITH_QT6) set(kldap_SOURCE_DIR ${CMAKE_SOURCE_DIR}/3rdparty/kldap-qt-compat/src/core) configure_file(${kldap_SOURCE_DIR}/../kldap_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/kldap_config.h) else() From d63928ef019a27192eec48f80d32ff608abe62ab Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Jan 2025 17:41:44 +0100 Subject: [PATCH 1651/1765] Master: update splash for 2025 --- master/resources/splash.png | Bin 10768 -> 10841 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/master/resources/splash.png b/master/resources/splash.png index d9a9493ec8dc9bcef930079c70c60f8e1f549c8b..39938c0b96ee2253940f80b9824115792887a6ec 100644 GIT binary patch literal 10841 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 QS`kFg6*Uw}<;`FJ8=lPPjQ{`u From 5d9b9915a165fed1528984fdfea53bd82cc903c9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 22 Jan 2025 17:42:05 +0100 Subject: [PATCH 1652/1765] Update copyright --- README.md | 2 +- cli/src/ConfigCommands.cpp | 2 +- cli/src/ConfigCommands.h | 2 +- cli/src/FeatureCommands.cpp | 2 +- cli/src/FeatureCommands.h | 2 +- cli/src/PluginCommands.cpp | 2 +- cli/src/PluginCommands.h | 2 +- cli/src/ServiceControlCommands.cpp | 2 +- cli/src/ServiceControlCommands.h | 2 +- cli/src/ShellCommands.cpp | 2 +- cli/src/ShellCommands.h | 2 +- cli/src/main.cpp | 2 +- cli/veyon-cli.rc.in | 2 +- cli/veyon-wcli.rc.in | 2 +- cmake/modules/BuildVeyonApplication.cmake | 2 +- cmake/modules/BuildVeyonFuzzer.cmake | 2 +- cmake/modules/BuildVeyonPlugin.cmake | 2 +- cmake/modules/CreateTranslations.cmake | 2 +- cmake/modules/FindLibVNCClient.cmake | 2 +- cmake/modules/FindLibVNCServer.cmake | 2 +- cmake/modules/ImportQtTranslations.cmake | 2 +- configurator/src/AccessControlPage.cpp | 2 +- configurator/src/AccessControlPage.h | 2 +- configurator/src/AccessControlRuleEditDialog.cpp | 2 +- configurator/src/AccessControlRuleEditDialog.h | 2 +- configurator/src/AccessControlRuleListModel.cpp | 2 +- configurator/src/AccessControlRuleListModel.h | 2 +- configurator/src/AccessControlRulesTestDialog.cpp | 2 +- configurator/src/AccessControlRulesTestDialog.h | 2 +- configurator/src/AuthenticationPage.cpp | 2 +- configurator/src/AuthenticationPage.h | 2 +- configurator/src/AuthenticationPageTab.cpp | 2 +- configurator/src/AuthenticationPageTab.h | 2 +- configurator/src/GeneralConfigurationPage.cpp | 2 +- configurator/src/GeneralConfigurationPage.h | 2 +- configurator/src/MainWindow.cpp | 2 +- configurator/src/MainWindow.h | 2 +- configurator/src/MasterConfigurationPage.cpp | 2 +- configurator/src/MasterConfigurationPage.h | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPage.cpp | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPage.h | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp | 2 +- configurator/src/NetworkObjectDirectoryConfigurationPageTab.h | 2 +- configurator/src/ServiceConfigurationPage.cpp | 2 +- configurator/src/ServiceConfigurationPage.h | 2 +- configurator/src/main.cpp | 2 +- configurator/veyon-configurator.rc.in | 2 +- core/src/AboutDialog.cpp | 2 +- core/src/AboutDialog.h | 2 +- core/src/AboutDialog.ui | 2 +- core/src/AccessControlProvider.cpp | 2 +- core/src/AccessControlProvider.h | 2 +- core/src/AccessControlRule.cpp | 2 +- core/src/AccessControlRule.h | 2 +- core/src/AuthenticationCredentials.h | 2 +- core/src/AuthenticationManager.cpp | 2 +- core/src/AuthenticationManager.h | 2 +- core/src/AuthenticationPluginInterface.cpp | 2 +- core/src/AuthenticationPluginInterface.h | 2 +- core/src/BuiltinFeatures.cpp | 2 +- core/src/BuiltinFeatures.h | 2 +- core/src/CommandLineIO.cpp | 2 +- core/src/CommandLineIO.h | 2 +- core/src/CommandLinePluginInterface.h | 2 +- core/src/Computer.cpp | 2 +- core/src/Computer.h | 2 +- core/src/ComputerControlInterface.cpp | 2 +- core/src/ComputerControlInterface.h | 2 +- core/src/ComputerListModel.cpp | 2 +- core/src/ComputerListModel.h | 2 +- core/src/Configuration/JsonStore.cpp | 2 +- core/src/Configuration/JsonStore.h | 2 +- core/src/Configuration/LocalStore.cpp | 2 +- core/src/Configuration/LocalStore.h | 2 +- core/src/Configuration/Object.cpp | 2 +- core/src/Configuration/Object.h | 2 +- core/src/Configuration/Password.cpp | 2 +- core/src/Configuration/Password.h | 2 +- core/src/Configuration/Property.cpp | 2 +- core/src/Configuration/Property.h | 2 +- core/src/Configuration/Proxy.cpp | 2 +- core/src/Configuration/Proxy.h | 2 +- core/src/Configuration/Store.h | 2 +- core/src/Configuration/UiMapping.cpp | 2 +- core/src/Configuration/UiMapping.h | 2 +- core/src/ConfigurationManager.cpp | 2 +- core/src/ConfigurationManager.h | 2 +- core/src/ConfigurationPage.cpp | 2 +- core/src/ConfigurationPage.h | 2 +- core/src/ConfigurationPagePluginInterface.h | 2 +- core/src/CryptoCore.cpp | 2 +- core/src/CryptoCore.h | 2 +- core/src/DesktopAccessDialog.cpp | 2 +- core/src/DesktopAccessDialog.h | 2 +- core/src/EnumHelper.h | 2 +- core/src/Feature.h | 2 +- core/src/FeatureManager.cpp | 2 +- core/src/FeatureManager.h | 2 +- core/src/FeatureMessage.cpp | 2 +- core/src/FeatureMessage.h | 2 +- core/src/FeatureProviderInterface.h | 2 +- core/src/FeatureWorkerManager.cpp | 2 +- core/src/FeatureWorkerManager.h | 2 +- core/src/FileSystemBrowser.cpp | 2 +- core/src/FileSystemBrowser.h | 2 +- core/src/Filesystem.cpp | 2 +- core/src/Filesystem.h | 2 +- core/src/HashList.h | 2 +- core/src/HostAddress.cpp | 2 +- core/src/HostAddress.h | 2 +- core/src/KeyboardShortcutTrapper.h | 2 +- core/src/LockWidget.cpp | 2 +- core/src/LockWidget.h | 2 +- core/src/Lockable.h | 2 +- core/src/LockingPointer.h | 2 +- core/src/Logger.cpp | 2 +- core/src/Logger.h | 2 +- core/src/MessageContext.h | 2 +- core/src/MonitoringMode.cpp | 2 +- core/src/MonitoringMode.h | 2 +- core/src/NestedNetworkObjectDirectory.cpp | 2 +- core/src/NestedNetworkObjectDirectory.h | 2 +- core/src/NetworkObject.cpp | 2 +- core/src/NetworkObject.h | 2 +- core/src/NetworkObjectDirectory.cpp | 2 +- core/src/NetworkObjectDirectory.h | 2 +- core/src/NetworkObjectDirectoryManager.cpp | 2 +- core/src/NetworkObjectDirectoryManager.h | 2 +- core/src/NetworkObjectDirectoryPluginInterface.h | 2 +- core/src/NetworkObjectModel.h | 2 +- core/src/ObjectManager.h | 2 +- core/src/PlatformCoreFunctions.h | 2 +- core/src/PlatformFilesystemFunctions.h | 2 +- core/src/PlatformInputDeviceFunctions.h | 2 +- core/src/PlatformNetworkFunctions.h | 2 +- core/src/PlatformPluginInterface.h | 2 +- core/src/PlatformPluginManager.cpp | 2 +- core/src/PlatformPluginManager.h | 2 +- core/src/PlatformServiceFunctions.h | 2 +- core/src/PlatformSessionFunctions.h | 2 +- core/src/PlatformUserFunctions.h | 2 +- core/src/Plugin.h | 2 +- core/src/PluginInterface.h | 2 +- core/src/PluginManager.cpp | 2 +- core/src/PluginManager.h | 2 +- core/src/ProcessHelper.cpp | 2 +- core/src/ProcessHelper.h | 2 +- core/src/QmlCore.cpp | 2 +- core/src/QmlCore.h | 2 +- core/src/QtCompat.h | 2 +- core/src/RfbClientCallback.h | 2 +- core/src/Screenshot.cpp | 2 +- core/src/Screenshot.h | 2 +- core/src/ServiceControl.cpp | 2 +- core/src/ServiceControl.h | 2 +- core/src/SocketDevice.h | 2 +- core/src/SystemTrayIcon.cpp | 2 +- core/src/SystemTrayIcon.h | 2 +- core/src/ToolButton.cpp | 2 +- core/src/ToolButton.h | 2 +- core/src/TranslationLoader.cpp | 2 +- core/src/TranslationLoader.h | 2 +- core/src/UserGroupsBackendInterface.h | 2 +- core/src/UserGroupsBackendManager.cpp | 2 +- core/src/UserGroupsBackendManager.h | 2 +- core/src/VariantArrayMessage.cpp | 2 +- core/src/VariantArrayMessage.h | 2 +- core/src/VariantStream.cpp | 2 +- core/src/VariantStream.h | 2 +- core/src/VeyonConfiguration.cpp | 2 +- core/src/VeyonConfiguration.h | 2 +- core/src/VeyonConfigurationProperties.h | 2 +- core/src/VeyonConnection.cpp | 2 +- core/src/VeyonConnection.h | 2 +- core/src/VeyonCore.cpp | 2 +- core/src/VeyonCore.h | 2 +- core/src/VeyonMasterInterface.h | 2 +- core/src/VeyonServerInterface.h | 2 +- core/src/VeyonServiceControl.cpp | 2 +- core/src/VeyonServiceControl.h | 2 +- core/src/VeyonWorkerInterface.h | 2 +- core/src/VncClientProtocol.cpp | 2 +- core/src/VncClientProtocol.h | 2 +- core/src/VncConnection.cpp | 2 +- core/src/VncConnection.h | 2 +- core/src/VncConnectionConfiguration.h | 2 +- core/src/VncEvents.cpp | 2 +- core/src/VncEvents.h | 2 +- core/src/VncFeatureMessageEvent.cpp | 2 +- core/src/VncFeatureMessageEvent.h | 2 +- core/src/VncServerClient.h | 2 +- core/src/VncServerPluginInterface.h | 2 +- core/src/VncServerProtocol.cpp | 2 +- core/src/VncServerProtocol.h | 2 +- core/src/VncView.cpp | 2 +- core/src/VncView.h | 2 +- core/src/VncViewItem.cpp | 2 +- core/src/VncViewItem.h | 2 +- core/src/VncViewWidget.cpp | 2 +- core/src/VncViewWidget.h | 2 +- master/src/CheckableItemProxyModel.cpp | 2 +- master/src/CheckableItemProxyModel.h | 2 +- master/src/ComputerControlListModel.cpp | 2 +- master/src/ComputerControlListModel.h | 2 +- master/src/ComputerImageProvider.cpp | 2 +- master/src/ComputerImageProvider.h | 2 +- master/src/ComputerManager.cpp | 2 +- master/src/ComputerManager.h | 2 +- master/src/ComputerMonitoringItem.cpp | 2 +- master/src/ComputerMonitoringItem.h | 2 +- master/src/ComputerMonitoringModel.cpp | 2 +- master/src/ComputerMonitoringModel.h | 2 +- master/src/ComputerMonitoringView.cpp | 2 +- master/src/ComputerMonitoringView.h | 2 +- master/src/ComputerMonitoringWidget.cpp | 2 +- master/src/ComputerMonitoringWidget.h | 2 +- master/src/ComputerSelectModel.cpp | 2 +- master/src/ComputerSelectModel.h | 2 +- master/src/ComputerSelectPanel.cpp | 2 +- master/src/ComputerSelectPanel.h | 2 +- master/src/ComputerZoomWidget.cpp | 2 +- master/src/ComputerZoomWidget.h | 2 +- master/src/DocumentationFigureCreator.cpp | 2 +- master/src/DocumentationFigureCreator.h | 2 +- master/src/FeatureListModel.cpp | 2 +- master/src/FeatureListModel.h | 2 +- master/src/FlexibleListView.cpp | 2 +- master/src/FlexibleListView.h | 2 +- master/src/LocationDialog.cpp | 2 +- master/src/LocationDialog.h | 2 +- master/src/MainToolBar.cpp | 2 +- master/src/MainToolBar.h | 2 +- master/src/MainWindow.cpp | 2 +- master/src/MainWindow.h | 2 +- master/src/NetworkObjectFilterProxyModel.cpp | 2 +- master/src/NetworkObjectFilterProxyModel.h | 2 +- master/src/NetworkObjectOverlayDataModel.cpp | 2 +- master/src/NetworkObjectOverlayDataModel.h | 2 +- master/src/NetworkObjectTreeModel.cpp | 2 +- master/src/NetworkObjectTreeModel.h | 2 +- master/src/ScreenshotManagementPanel.cpp | 2 +- master/src/ScreenshotManagementPanel.h | 2 +- master/src/SlideshowModel.cpp | 2 +- master/src/SlideshowModel.h | 2 +- master/src/SlideshowPanel.cpp | 2 +- master/src/SlideshowPanel.h | 2 +- master/src/SpotlightModel.cpp | 2 +- master/src/SpotlightModel.h | 2 +- master/src/SpotlightPanel.cpp | 2 +- master/src/SpotlightPanel.h | 2 +- master/src/UserConfig.cpp | 2 +- master/src/UserConfig.h | 2 +- master/src/VeyonMaster.cpp | 2 +- master/src/VeyonMaster.h | 2 +- master/src/main.cpp | 2 +- master/veyon-master.rc.in | 2 +- nsis/veyon.nsi.in | 2 +- plugins/authkeys/AuthKeysConfiguration.h | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.cpp | 2 +- plugins/authkeys/AuthKeysConfigurationWidget.h | 2 +- plugins/authkeys/AuthKeysManager.cpp | 2 +- plugins/authkeys/AuthKeysManager.h | 2 +- plugins/authkeys/AuthKeysPlugin.cpp | 2 +- plugins/authkeys/AuthKeysPlugin.h | 2 +- plugins/authkeys/AuthKeysTableModel.cpp | 2 +- plugins/authkeys/AuthKeysTableModel.h | 2 +- plugins/authlogon/AuthLogonDialog.cpp | 2 +- plugins/authlogon/AuthLogonDialog.h | 2 +- plugins/authlogon/AuthLogonPlugin.cpp | 2 +- plugins/authlogon/AuthLogonPlugin.h | 2 +- plugins/authsimple/AuthSimpleConfiguration.h | 2 +- plugins/authsimple/AuthSimpleDialog.cpp | 2 +- plugins/authsimple/AuthSimpleDialog.h | 2 +- plugins/authsimple/AuthSimplePlugin.cpp | 2 +- plugins/authsimple/AuthSimplePlugin.h | 2 +- plugins/builtindirectory/BuiltinDirectory.cpp | 2 +- plugins/builtindirectory/BuiltinDirectory.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfiguration.h | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.cpp | 2 +- plugins/builtindirectory/BuiltinDirectoryPlugin.h | 2 +- plugins/demo/DemoAuthentication.cpp | 2 +- plugins/demo/DemoAuthentication.h | 2 +- plugins/demo/DemoClient.cpp | 2 +- plugins/demo/DemoClient.h | 2 +- plugins/demo/DemoConfiguration.h | 2 +- plugins/demo/DemoConfigurationPage.cpp | 2 +- plugins/demo/DemoConfigurationPage.h | 2 +- plugins/demo/DemoFeaturePlugin.cpp | 2 +- plugins/demo/DemoFeaturePlugin.h | 2 +- plugins/demo/DemoServer.cpp | 2 +- plugins/demo/DemoServer.h | 2 +- plugins/demo/DemoServerConnection.cpp | 2 +- plugins/demo/DemoServerConnection.h | 2 +- plugins/demo/DemoServerProtocol.cpp | 2 +- plugins/demo/DemoServerProtocol.h | 2 +- plugins/desktopservices/DesktopServiceObject.cpp | 2 +- plugins/desktopservices/DesktopServiceObject.h | 2 +- plugins/desktopservices/DesktopServicesConfiguration.h | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.cpp | 2 +- plugins/desktopservices/DesktopServicesConfigurationPage.h | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.cpp | 2 +- plugins/desktopservices/DesktopServicesFeaturePlugin.h | 2 +- plugins/desktopservices/OpenWebsiteDialog.cpp | 2 +- plugins/desktopservices/OpenWebsiteDialog.h | 2 +- plugins/desktopservices/StartAppDialog.cpp | 2 +- plugins/desktopservices/StartAppDialog.h | 2 +- plugins/filetransfer/FileReadThread.cpp | 2 +- plugins/filetransfer/FileReadThread.h | 2 +- plugins/filetransfer/FileTransferConfiguration.h | 2 +- plugins/filetransfer/FileTransferConfigurationPage.cpp | 2 +- plugins/filetransfer/FileTransferConfigurationPage.h | 2 +- plugins/filetransfer/FileTransferController.cpp | 2 +- plugins/filetransfer/FileTransferController.h | 2 +- plugins/filetransfer/FileTransferDialog.cpp | 2 +- plugins/filetransfer/FileTransferDialog.h | 2 +- plugins/filetransfer/FileTransferListModel.cpp | 2 +- plugins/filetransfer/FileTransferListModel.h | 2 +- plugins/filetransfer/FileTransferPlugin.cpp | 2 +- plugins/filetransfer/FileTransferPlugin.h | 2 +- plugins/filetransfer/FileTransferUserConfiguration.h | 2 +- plugins/ldap/AuthLdapConfiguration.h | 2 +- plugins/ldap/AuthLdapConfigurationWidget.cpp | 2 +- plugins/ldap/AuthLdapConfigurationWidget.h | 2 +- plugins/ldap/AuthLdapCore.cpp | 2 +- plugins/ldap/AuthLdapCore.h | 2 +- plugins/ldap/AuthLdapDialog.cpp | 2 +- plugins/ldap/AuthLdapDialog.h | 2 +- plugins/ldap/LdapPlugin.cpp | 2 +- plugins/ldap/LdapPlugin.h | 2 +- plugins/ldap/common/LdapBrowseDialog.cpp | 2 +- plugins/ldap/common/LdapBrowseDialog.h | 2 +- plugins/ldap/common/LdapBrowseModel.cpp | 2 +- plugins/ldap/common/LdapBrowseModel.h | 2 +- plugins/ldap/common/LdapClient.cpp | 2 +- plugins/ldap/common/LdapClient.h | 2 +- plugins/ldap/common/LdapCommon.h | 2 +- plugins/ldap/common/LdapConfiguration.cpp | 2 +- plugins/ldap/common/LdapConfiguration.h | 2 +- plugins/ldap/common/LdapConfigurationPage.cpp | 2 +- plugins/ldap/common/LdapConfigurationPage.h | 2 +- plugins/ldap/common/LdapConfigurationTest.cpp | 2 +- plugins/ldap/common/LdapConfigurationTest.h | 2 +- plugins/ldap/common/LdapDirectory.cpp | 2 +- plugins/ldap/common/LdapDirectory.h | 2 +- plugins/ldap/common/LdapNetworkObjectDirectory.cpp | 2 +- plugins/ldap/common/LdapNetworkObjectDirectory.h | 2 +- .../ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp | 2 +- .../ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h | 2 +- plugins/ldap/kldap/KLdapIntegration.cpp | 2 +- plugins/ldap/kldap/kldap_core_export.h | 2 +- plugins/ldap/kldap/kldap_export.h | 2 +- plugins/ldap/kldap/klocalizedstring.h | 2 +- plugins/ldap/kldap/ldap_core_debug.h | 2 +- plugins/ldap/kldap/ldap_debug.h | 2 +- plugins/platform/common/LogonHelper.cpp | 2 +- plugins/platform/common/LogonHelper.h | 2 +- plugins/platform/common/PersistentLogonCredentials.cpp | 2 +- plugins/platform/common/PersistentLogonCredentials.h | 2 +- plugins/platform/common/PlatformSessionManager.cpp | 2 +- plugins/platform/common/PlatformSessionManager.h | 2 +- plugins/platform/common/ServiceDataManager.cpp | 2 +- plugins/platform/common/ServiceDataManager.h | 2 +- plugins/platform/linux/LinuxCoreFunctions.cpp | 2 +- plugins/platform/linux/LinuxCoreFunctions.h | 2 +- plugins/platform/linux/LinuxDesktopIntegration.h | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.cpp | 2 +- plugins/platform/linux/LinuxFilesystemFunctions.h | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.cpp | 2 +- plugins/platform/linux/LinuxInputDeviceFunctions.h | 2 +- plugins/platform/linux/LinuxKeyboardInput.cpp | 2 +- plugins/platform/linux/LinuxKeyboardInput.h | 2 +- plugins/platform/linux/LinuxKeyboardShortcutTrapper.h | 2 +- plugins/platform/linux/LinuxNetworkFunctions.cpp | 2 +- plugins/platform/linux/LinuxNetworkFunctions.h | 2 +- plugins/platform/linux/LinuxPlatformConfiguration.h | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.cpp | 2 +- plugins/platform/linux/LinuxPlatformConfigurationPage.h | 2 +- plugins/platform/linux/LinuxPlatformPlugin.cpp | 2 +- plugins/platform/linux/LinuxPlatformPlugin.h | 2 +- plugins/platform/linux/LinuxServerProcess.cpp | 2 +- plugins/platform/linux/LinuxServerProcess.h | 2 +- plugins/platform/linux/LinuxServiceCore.cpp | 2 +- plugins/platform/linux/LinuxServiceCore.h | 2 +- plugins/platform/linux/LinuxServiceFunctions.cpp | 2 +- plugins/platform/linux/LinuxServiceFunctions.h | 2 +- plugins/platform/linux/LinuxSessionFunctions.cpp | 2 +- plugins/platform/linux/LinuxSessionFunctions.h | 2 +- plugins/platform/linux/LinuxUserFunctions.cpp | 2 +- plugins/platform/linux/LinuxUserFunctions.h | 2 +- plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp | 2 +- plugins/platform/windows/DesktopInputController.cpp | 2 +- plugins/platform/windows/DesktopInputController.h | 2 +- plugins/platform/windows/SasEventListener.cpp | 2 +- plugins/platform/windows/SasEventListener.h | 2 +- plugins/platform/windows/WindowsCoreFunctions.cpp | 2 +- plugins/platform/windows/WindowsCoreFunctions.h | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.cpp | 2 +- plugins/platform/windows/WindowsFilesystemFunctions.h | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.cpp | 2 +- plugins/platform/windows/WindowsInputDeviceFunctions.h | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp | 2 +- plugins/platform/windows/WindowsKeyboardShortcutTrapper.h | 2 +- plugins/platform/windows/WindowsNetworkFunctions.cpp | 2 +- plugins/platform/windows/WindowsNetworkFunctions.h | 2 +- plugins/platform/windows/WindowsPlatformConfiguration.h | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.cpp | 2 +- plugins/platform/windows/WindowsPlatformConfigurationPage.h | 2 +- plugins/platform/windows/WindowsPlatformPlugin.cpp | 2 +- plugins/platform/windows/WindowsPlatformPlugin.h | 2 +- plugins/platform/windows/WindowsServiceControl.cpp | 2 +- plugins/platform/windows/WindowsServiceControl.h | 2 +- plugins/platform/windows/WindowsServiceCore.cpp | 2 +- plugins/platform/windows/WindowsServiceCore.h | 2 +- plugins/platform/windows/WindowsServiceFunctions.cpp | 2 +- plugins/platform/windows/WindowsServiceFunctions.h | 2 +- plugins/platform/windows/WindowsSessionFunctions.cpp | 2 +- plugins/platform/windows/WindowsSessionFunctions.h | 2 +- plugins/platform/windows/WindowsUserFunctions.cpp | 2 +- plugins/platform/windows/WindowsUserFunctions.h | 2 +- plugins/platform/windows/WtsSessionManager.cpp | 2 +- plugins/platform/windows/WtsSessionManager.h | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.cpp | 2 +- plugins/powercontrol/PowerControlFeaturePlugin.h | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.cpp | 2 +- plugins/powercontrol/PowerDownTimeInputDialog.h | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.h | 2 +- plugins/remoteaccess/RemoteAccessPage.cpp | 2 +- plugins/remoteaccess/RemoteAccessPage.h | 2 +- plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- plugins/remoteaccess/RemoteAccessWidget.h | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.cpp | 2 +- plugins/screenlock/ScreenLockFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.cpp | 2 +- plugins/screenshot/ScreenshotFeaturePlugin.h | 2 +- plugins/screenshot/ScreenshotListModel.cpp | 2 +- plugins/screenshot/ScreenshotListModel.h | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.cpp | 2 +- plugins/systemusergroups/SystemUserGroupsPlugin.h | 2 +- plugins/testing/TestingCommandLinePlugin.cpp | 2 +- plugins/testing/TestingCommandLinePlugin.h | 2 +- plugins/textmessage/TextMessageDialog.cpp | 2 +- plugins/textmessage/TextMessageDialog.h | 2 +- plugins/textmessage/TextMessageFeaturePlugin.cpp | 2 +- plugins/textmessage/TextMessageFeaturePlugin.h | 2 +- plugins/usersessioncontrol/UserLoginDialog.cpp | 2 +- plugins/usersessioncontrol/UserLoginDialog.h | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.cpp | 2 +- plugins/usersessioncontrol/UserSessionControlPlugin.h | 2 +- plugins/vncserver/external/ExternalVncServer.cpp | 2 +- plugins/vncserver/external/ExternalVncServer.h | 2 +- plugins/vncserver/external/ExternalVncServerConfiguration.h | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.cpp | 2 +- .../vncserver/external/ExternalVncServerConfigurationWidget.h | 2 +- plugins/vncserver/headless/HeadlessVncConfiguration.h | 2 +- plugins/vncserver/headless/HeadlessVncServer.cpp | 2 +- plugins/vncserver/headless/HeadlessVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp | 2 +- plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp | 2 +- plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h | 2 +- plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp | 2 +- .../vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp | 2 +- plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp | 2 +- plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h | 2 +- project.yml | 2 +- server/src/ComputerControlClient.cpp | 2 +- server/src/ComputerControlClient.h | 2 +- server/src/ComputerControlServer.cpp | 2 +- server/src/ComputerControlServer.h | 2 +- server/src/ServerAccessControlManager.cpp | 2 +- server/src/ServerAccessControlManager.h | 2 +- server/src/ServerAuthenticationManager.cpp | 2 +- server/src/ServerAuthenticationManager.h | 2 +- server/src/TlsServer.cpp | 2 +- server/src/TlsServer.h | 2 +- server/src/VeyonServerProtocol.cpp | 2 +- server/src/VeyonServerProtocol.h | 2 +- server/src/VncProxyConnection.cpp | 2 +- server/src/VncProxyConnection.h | 2 +- server/src/VncProxyConnectionFactory.h | 2 +- server/src/VncProxyServer.cpp | 2 +- server/src/VncProxyServer.h | 2 +- server/src/VncServer.cpp | 2 +- server/src/VncServer.h | 2 +- server/src/main.cpp | 2 +- server/veyon-server.rc.in | 2 +- service/src/main.cpp | 2 +- service/veyon-service.rc.in | 2 +- worker/src/FeatureWorkerManagerConnection.cpp | 2 +- worker/src/FeatureWorkerManagerConnection.h | 2 +- worker/src/VeyonWorker.cpp | 2 +- worker/src/VeyonWorker.h | 2 +- worker/src/main.cpp | 2 +- worker/veyon-worker.rc.in | 2 +- 501 files changed, 501 insertions(+), 501 deletions(-) diff --git a/README.md b/README.md index 13d0a2807..21deab64e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ The following features are available in Veyon: ## License -Copyright (c) 2004-2024 Tobias Junghans / Veyon Solutions. +Copyright (c) 2004-2025 Tobias Junghans / Veyon Solutions. See the file COPYING for the GNU GENERAL PUBLIC LICENSE. diff --git a/cli/src/ConfigCommands.cpp b/cli/src/ConfigCommands.cpp index e140b9b5f..e013a7100 100644 --- a/cli/src/ConfigCommands.cpp +++ b/cli/src/ConfigCommands.cpp @@ -1,7 +1,7 @@ /* * ConfigCommands.cpp - implementation of ConfigCommands class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ConfigCommands.h b/cli/src/ConfigCommands.h index 8411da6f9..d9f6b61ff 100644 --- a/cli/src/ConfigCommands.h +++ b/cli/src/ConfigCommands.h @@ -1,7 +1,7 @@ /* * ConfigCommands.h - declaration of ConfigCommands class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index 9159046ad..7ea9a11c6 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -1,7 +1,7 @@ /* * FeatureCommands.cpp - implementation of FeatureCommands class * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/FeatureCommands.h b/cli/src/FeatureCommands.h index 72fd007fb..c0c0fe3a0 100644 --- a/cli/src/FeatureCommands.h +++ b/cli/src/FeatureCommands.h @@ -1,7 +1,7 @@ /* * FeatureCommands.h - declaration of FeatureCommands class * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginCommands.cpp b/cli/src/PluginCommands.cpp index 02783f2d3..a3ee3ac05 100644 --- a/cli/src/PluginCommands.cpp +++ b/cli/src/PluginCommands.cpp @@ -1,7 +1,7 @@ /* * PluginsCommands.cpp - implementation of PluginsCommands class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/PluginCommands.h b/cli/src/PluginCommands.h index 502c08220..1d8af8317 100644 --- a/cli/src/PluginCommands.h +++ b/cli/src/PluginCommands.h @@ -1,7 +1,7 @@ /* * PluginsCommands.h - declaration of PluginsCommands class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ServiceControlCommands.cpp b/cli/src/ServiceControlCommands.cpp index 9dc1eed25..9a4ad1ae9 100644 --- a/cli/src/ServiceControlCommands.cpp +++ b/cli/src/ServiceControlCommands.cpp @@ -1,7 +1,7 @@ /* * ServiceControlCommands.cpp - implementation of ServiceControlCommands class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ServiceControlCommands.h b/cli/src/ServiceControlCommands.h index 7674667b7..891186b53 100644 --- a/cli/src/ServiceControlCommands.h +++ b/cli/src/ServiceControlCommands.h @@ -1,7 +1,7 @@ /* * ServiceControlCommands.h - declaration of ServiceControlCommands class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ShellCommands.cpp b/cli/src/ShellCommands.cpp index ccda1b92b..962d915ab 100644 --- a/cli/src/ShellCommands.cpp +++ b/cli/src/ShellCommands.cpp @@ -1,7 +1,7 @@ /* * ShellCommands.cpp - implementation of ShellCommands class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/ShellCommands.h b/cli/src/ShellCommands.h index afd6bc015..63e0c06c6 100644 --- a/cli/src/ShellCommands.h +++ b/cli/src/ShellCommands.h @@ -1,7 +1,7 @@ /* * ShellCommands.h - declaration of ShellCommands class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/src/main.cpp b/cli/src/main.cpp index 8a6faa0e0..057430765 100644 --- a/cli/src/main.cpp +++ b/cli/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon CLI * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/cli/veyon-cli.rc.in b/cli/veyon-cli.rc.in index f93cd56ec..aaa5a5028 100644 --- a/cli/veyon-cli.rc.in +++ b/cli/veyon-cli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2025 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-cli.exe\0" END END diff --git a/cli/veyon-wcli.rc.in b/cli/veyon-wcli.rc.in index 2afbe15c5..5ba896b39 100644 --- a/cli/veyon-wcli.rc.in +++ b/cli/veyon-wcli.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Command Line Interface (non-console version)\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2025 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-wcli.exe\0" END END diff --git a/cmake/modules/BuildVeyonApplication.cmake b/cmake/modules/BuildVeyonApplication.cmake index 09f11ef3e..58bf1394d 100644 --- a/cmake/modules/BuildVeyonApplication.cmake +++ b/cmake/modules/BuildVeyonApplication.cmake @@ -1,4 +1,4 @@ -# BuildVeyonApplication.cmake - Copyright (c) 2019-2024 Tobias Junghans +# BuildVeyonApplication.cmake - Copyright (c) 2019-2025 Tobias Junghans # # description: build Veyon application # usage: build_veyon_application( ) diff --git a/cmake/modules/BuildVeyonFuzzer.cmake b/cmake/modules/BuildVeyonFuzzer.cmake index 4864a8e78..0cfb0f466 100644 --- a/cmake/modules/BuildVeyonFuzzer.cmake +++ b/cmake/modules/BuildVeyonFuzzer.cmake @@ -1,4 +1,4 @@ -# BuildVeyonFuzzer.cmake - Copyright (c) 2021-2024 Tobias Junghans +# BuildVeyonFuzzer.cmake - Copyright (c) 2021-2025 Tobias Junghans # # description: build fuzzer test for Veyon component # usage: build_veyon_fuzzer( ) diff --git a/cmake/modules/BuildVeyonPlugin.cmake b/cmake/modules/BuildVeyonPlugin.cmake index a19b5dd9c..a1db6aab7 100644 --- a/cmake/modules/BuildVeyonPlugin.cmake +++ b/cmake/modules/BuildVeyonPlugin.cmake @@ -1,4 +1,4 @@ -# BuildVeyonPlugin.cmake - Copyright (c) 2017-2024 Tobias Junghans +# BuildVeyonPlugin.cmake - Copyright (c) 2017-2025 Tobias Junghans # # description: build Veyon plugin # usage: build_veyon_plugin( ) diff --git a/cmake/modules/CreateTranslations.cmake b/cmake/modules/CreateTranslations.cmake index 03b5d6477..a525b64db 100644 --- a/cmake/modules/CreateTranslations.cmake +++ b/cmake/modules/CreateTranslations.cmake @@ -1,4 +1,4 @@ -# CreateTranslations.cmake - Copyright (c) 2020-2024 Tobias Junghans +# CreateTranslations.cmake - Copyright (c) 2020-2025 Tobias Junghans # # description: create Qt translation files # usage: create_translations( ) diff --git a/cmake/modules/FindLibVNCClient.cmake b/cmake/modules/FindLibVNCClient.cmake index 61d6921b7..0e976f44a 100644 --- a/cmake/modules/FindLibVNCClient.cmake +++ b/cmake/modules/FindLibVNCClient.cmake @@ -23,7 +23,7 @@ # The LibVNCClient library #============================================================================= -# SPDX-FileCopyrightText: 2020-2024 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2025 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/cmake/modules/FindLibVNCServer.cmake b/cmake/modules/FindLibVNCServer.cmake index a11edc634..2900bdb91 100644 --- a/cmake/modules/FindLibVNCServer.cmake +++ b/cmake/modules/FindLibVNCServer.cmake @@ -23,7 +23,7 @@ # The LibVNCServer library #============================================================================= -# SPDX-FileCopyrightText: 2020-2024 Tobias Junghans +# SPDX-FileCopyrightText: 2020-2025 Tobias Junghans # # SPDX-License-Identifier: BSD-3-Clause #============================================================================= diff --git a/cmake/modules/ImportQtTranslations.cmake b/cmake/modules/ImportQtTranslations.cmake index c7ade28f8..d189efb2b 100644 --- a/cmake/modules/ImportQtTranslations.cmake +++ b/cmake/modules/ImportQtTranslations.cmake @@ -1,4 +1,4 @@ -# ImportQtTranslations.cmake - Copyright (c) 2020-2024 Tobias Junghans +# ImportQtTranslations.cmake - Copyright (c) 2020-2025 Tobias Junghans # # description: import translation files of Qt into build directory # usage: import_qt_translations() with QT_TRANSLATIONS_DIR set diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index 419fab4d1..55e74381b 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -1,7 +1,7 @@ /* * AccessControlPage.cpp - implementation of the access control page * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlPage.h b/configurator/src/AccessControlPage.h index 0f42edf3b..2b42c11cb 100644 --- a/configurator/src/AccessControlPage.h +++ b/configurator/src/AccessControlPage.h @@ -1,7 +1,7 @@ /* * AccessControlPage.h - header for the AccessControlPage class * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index 418ed699b..15580096d 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.cpp - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleEditDialog.h b/configurator/src/AccessControlRuleEditDialog.h index d1f9ba2ec..86fbe55ce 100644 --- a/configurator/src/AccessControlRuleEditDialog.h +++ b/configurator/src/AccessControlRuleEditDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRuleEditDialog.h - dialog for editing an AccessControlRule * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.cpp b/configurator/src/AccessControlRuleListModel.cpp index 4ee08167b..3c23d0fe3 100644 --- a/configurator/src/AccessControlRuleListModel.cpp +++ b/configurator/src/AccessControlRuleListModel.cpp @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.cpp - data model for access control rules * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRuleListModel.h b/configurator/src/AccessControlRuleListModel.h index 3fb93feae..70eca6d47 100644 --- a/configurator/src/AccessControlRuleListModel.h +++ b/configurator/src/AccessControlRuleListModel.h @@ -1,7 +1,7 @@ /* * AccessControlRuleListModel.h - data model for access control rules * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index 2a7651a62..fb99c0617 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.cpp - dialog for testing access control rules * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AccessControlRulesTestDialog.h b/configurator/src/AccessControlRulesTestDialog.h index 028cf4027..04ac2edc7 100644 --- a/configurator/src/AccessControlRulesTestDialog.h +++ b/configurator/src/AccessControlRulesTestDialog.h @@ -1,7 +1,7 @@ /* * AccessControlRulesTestDialog.h - dialog for testing access control rules * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.cpp b/configurator/src/AuthenticationPage.cpp index fb055e100..cbc2cfef2 100644 --- a/configurator/src/AuthenticationPage.cpp +++ b/configurator/src/AuthenticationPage.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPage.cpp - implementation of the AuthenticationPage class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPage.h b/configurator/src/AuthenticationPage.h index 771700547..47a3ee66a 100644 --- a/configurator/src/AuthenticationPage.h +++ b/configurator/src/AuthenticationPage.h @@ -1,7 +1,7 @@ /* * AuthenticationPage.h - header for the AuthenticationPage class * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.cpp b/configurator/src/AuthenticationPageTab.cpp index 30d5fa83c..3c619ac96 100644 --- a/configurator/src/AuthenticationPageTab.cpp +++ b/configurator/src/AuthenticationPageTab.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.cpp - implementation of the AuthenticationPageTab class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/AuthenticationPageTab.h b/configurator/src/AuthenticationPageTab.h index 30af7863f..7205ebeca 100644 --- a/configurator/src/AuthenticationPageTab.h +++ b/configurator/src/AuthenticationPageTab.h @@ -1,7 +1,7 @@ /* * AuthenticationPageTab.h - header for the AuthenticationPageTab class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index b8ddb57e8..1fd223863 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.cpp - configuration page with general settings * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/GeneralConfigurationPage.h b/configurator/src/GeneralConfigurationPage.h index 7b82dcabe..93c3dd302 100644 --- a/configurator/src/GeneralConfigurationPage.h +++ b/configurator/src/GeneralConfigurationPage.h @@ -1,7 +1,7 @@ /* * GeneralConfigurationPage.h - configuration page with general settings * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index 14c1d7459..785e84839 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MainWindow.h b/configurator/src/MainWindow.h index e74ae2a76..16efc3443 100644 --- a/configurator/src/MainWindow.h +++ b/configurator/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of the Veyon Configurator * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index e3866a2ab..ee14d07c9 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.cpp - page for configuring master application * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/MasterConfigurationPage.h b/configurator/src/MasterConfigurationPage.h index 8a589cd1b..a4f2693da 100644 --- a/configurator/src/MasterConfigurationPage.h +++ b/configurator/src/MasterConfigurationPage.h @@ -1,7 +1,7 @@ /* * MasterConfigurationPage.h - header for the MasterConfigurationPage class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp index c77f91ea9..5f596deb1 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPage.cpp - implementation of the NetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPage.h b/configurator/src/NetworkObjectDirectoryConfigurationPage.h index a0407d913..a594873a6 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPage.h +++ b/configurator/src/NetworkObjectDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPage.h - header for the NetworkObjectDirectoryConfigurationPage class * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp index c6ffa3975..a5563310e 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPageTab.cpp - implementation of the NetworkObjectDirectoryConfigurationPageTab class * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h index 255e7f505..9531741a1 100644 --- a/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h +++ b/configurator/src/NetworkObjectDirectoryConfigurationPageTab.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryConfigurationPageTab.h - header for the NetworkObjectDirectoryConfigurationPageTab class * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index c5a515bed..73fc8de79 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/ServiceConfigurationPage.h b/configurator/src/ServiceConfigurationPage.h index 362c47f6c..841593b4a 100644 --- a/configurator/src/ServiceConfigurationPage.h +++ b/configurator/src/ServiceConfigurationPage.h @@ -1,7 +1,7 @@ /* * ServiceConfigurationPage.h - header for the ServiceConfigurationPage class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/src/main.cpp b/configurator/src/main.cpp index 9e5cf6a5d..f8a8ee663 100644 --- a/configurator/src/main.cpp +++ b/configurator/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Configurator * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/configurator/veyon-configurator.rc.in b/configurator/veyon-configurator.rc.in index f97922194..4128cdaed 100644 --- a/configurator/veyon-configurator.rc.in +++ b/configurator/veyon-configurator.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Configurator\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2025 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-configurator.exe\0" END END diff --git a/core/src/AboutDialog.cpp b/core/src/AboutDialog.cpp index 37168165b..0753a61cb 100644 --- a/core/src/AboutDialog.cpp +++ b/core/src/AboutDialog.cpp @@ -1,7 +1,7 @@ /* * AboutDialog.cpp - implementation of AboutDialog * - * Copyright (c) 2011-2024 Tobias Junghans + * Copyright (c) 2011-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.h b/core/src/AboutDialog.h index 8f7fc4fea..a9e028e0a 100644 --- a/core/src/AboutDialog.h +++ b/core/src/AboutDialog.h @@ -1,7 +1,7 @@ /* * AboutDialog.h - declaration of AboutDialog class * - * Copyright (c) 2011-2024 Tobias Junghans + * Copyright (c) 2011-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AboutDialog.ui b/core/src/AboutDialog.ui index 9e093f142..ce37d49d4 100644 --- a/core/src/AboutDialog.ui +++ b/core/src/AboutDialog.ui @@ -149,7 +149,7 @@ - Copyright © 2004-2024 Tobias Junghans / Veyon Solutions + Copyright © 2004-2025 Tobias Junghans / Veyon Solutions diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index de89ecb57..895aa66db 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -1,7 +1,7 @@ /* * AccessControlProvider.cpp - implementation of the AccessControlProvider class * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index d08e2674a..c2f207941 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -1,7 +1,7 @@ /* * AccessControlProvider.h - declaration of class AccessControlProvider * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.cpp b/core/src/AccessControlRule.cpp index 2b6cba2fc..e5ec27f42 100644 --- a/core/src/AccessControlRule.cpp +++ b/core/src/AccessControlRule.cpp @@ -1,7 +1,7 @@ /* * AccessControlRule.cpp - implementation of the AccessControlRule class * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index 1851aae2b..063e7b8a8 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -1,7 +1,7 @@ /* * AccessControlRule.h - declaration of class AccessControlRule * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationCredentials.h b/core/src/AuthenticationCredentials.h index 6b469f1f3..b497cc7ec 100644 --- a/core/src/AuthenticationCredentials.h +++ b/core/src/AuthenticationCredentials.h @@ -1,7 +1,7 @@ /* * AuthenticationCredentials.h - class holding credentials for authentication * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.cpp b/core/src/AuthenticationManager.cpp index 2642f25d4..9b943fca7 100644 --- a/core/src/AuthenticationManager.cpp +++ b/core/src/AuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * AuthenticationManager.cpp - implementation of AuthenticationManager * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationManager.h b/core/src/AuthenticationManager.h index ef019f235..8f431052e 100644 --- a/core/src/AuthenticationManager.h +++ b/core/src/AuthenticationManager.h @@ -1,7 +1,7 @@ /* * AuthenticationManager.h - header file for AuthenticationManager * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.cpp b/core/src/AuthenticationPluginInterface.cpp index 5f64f440f..117206b2f 100644 --- a/core/src/AuthenticationPluginInterface.cpp +++ b/core/src/AuthenticationPluginInterface.cpp @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.cpp - interface class for authentication plugins * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/AuthenticationPluginInterface.h b/core/src/AuthenticationPluginInterface.h index fbea2c8ab..4a8c51dc5 100644 --- a/core/src/AuthenticationPluginInterface.h +++ b/core/src/AuthenticationPluginInterface.h @@ -1,7 +1,7 @@ /* * AuthenticationPluginInterface.h - interface class for authentication plugins * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.cpp b/core/src/BuiltinFeatures.cpp index 1337089cc..7ef3b7914 100644 --- a/core/src/BuiltinFeatures.cpp +++ b/core/src/BuiltinFeatures.cpp @@ -1,7 +1,7 @@ /* * BuiltinFeatures.cpp - implementation of BuiltinFeatures class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/BuiltinFeatures.h b/core/src/BuiltinFeatures.h index 8ea4b780e..3cc7dec6a 100644 --- a/core/src/BuiltinFeatures.h +++ b/core/src/BuiltinFeatures.h @@ -1,7 +1,7 @@ /* * BuiltinFeatures.h - declaration of BuiltinFeatures class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.cpp b/core/src/CommandLineIO.cpp index 31c7759bf..a5bf9178a 100644 --- a/core/src/CommandLineIO.cpp +++ b/core/src/CommandLineIO.cpp @@ -1,7 +1,7 @@ /* * CommandLineIO.cpp - text input/output for command line plugins * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLineIO.h b/core/src/CommandLineIO.h index 50ca58fbd..77963d591 100644 --- a/core/src/CommandLineIO.h +++ b/core/src/CommandLineIO.h @@ -1,7 +1,7 @@ /* * CommandLineIO.h - text input/output for command line plugins * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CommandLinePluginInterface.h b/core/src/CommandLinePluginInterface.h index 86364afea..a1dd972e7 100644 --- a/core/src/CommandLinePluginInterface.h +++ b/core/src/CommandLinePluginInterface.h @@ -1,7 +1,7 @@ /* * CommandLinePluginInterface.h - interface class for command line plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.cpp b/core/src/Computer.cpp index 6cac3cb8c..c170c4e05 100644 --- a/core/src/Computer.cpp +++ b/core/src/Computer.cpp @@ -1,7 +1,7 @@ /* * Computer.cpp - represents a computer and provides control methods and data * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Computer.h b/core/src/Computer.h index 763f30850..f393e0c68 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -1,7 +1,7 @@ /* * Computer.h - represents a computer and provides control methods and data * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index d5be2c09e..b1dfbda24 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -1,7 +1,7 @@ /* * ComputerControlInterface.cpp - interface class for controlling a computer * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 39270bf9a..3fc7dff5a 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -1,7 +1,7 @@ /* * ComputerControlInterface.h - interface class for controlling a computer * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.cpp b/core/src/ComputerListModel.cpp index 95d3c2965..f6feab1be 100644 --- a/core/src/ComputerListModel.cpp +++ b/core/src/ComputerListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerListModel.cpp - data model base class for computer objects * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index 8f1739b6a..734b4c18e 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -1,7 +1,7 @@ /* * ComputerListModel.h - data model base class for computer objects * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.cpp b/core/src/Configuration/JsonStore.cpp index a1bdcadd4..2da8824e5 100644 --- a/core/src/Configuration/JsonStore.cpp +++ b/core/src/Configuration/JsonStore.cpp @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.cpp - implementation of JsonStore * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/JsonStore.h b/core/src/Configuration/JsonStore.h index 9078e0735..f5bbbf9bb 100644 --- a/core/src/Configuration/JsonStore.h +++ b/core/src/Configuration/JsonStore.h @@ -1,7 +1,7 @@ /* * Configuration/JsonStore.h - JsonStore class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.cpp b/core/src/Configuration/LocalStore.cpp index 9c6ab0b62..48add5055 100644 --- a/core/src/Configuration/LocalStore.cpp +++ b/core/src/Configuration/LocalStore.cpp @@ -1,7 +1,7 @@ /* * ConfigurationLocalStore.cpp - implementation of LocalStore * - * Copyright (c) 2009-2024 Tobias Junghans + * Copyright (c) 2009-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/LocalStore.h b/core/src/Configuration/LocalStore.h index 50ff28557..8abd64614 100644 --- a/core/src/Configuration/LocalStore.h +++ b/core/src/Configuration/LocalStore.h @@ -1,7 +1,7 @@ /* * Configuration/LocalStore.h - LocalStore class * - * Copyright (c) 2009-2024 Tobias Junghans + * Copyright (c) 2009-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.cpp b/core/src/Configuration/Object.cpp index 1059d9818..e37586121 100644 --- a/core/src/Configuration/Object.cpp +++ b/core/src/Configuration/Object.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2024 Tobias Junghans + * Copyright (c) 2009-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Object.h b/core/src/Configuration/Object.h index 1952b3668..b09e7deab 100644 --- a/core/src/Configuration/Object.h +++ b/core/src/Configuration/Object.h @@ -1,7 +1,7 @@ /* * Configuration/Object.h - ConfigurationObject class * - * Copyright (c) 2009-2024 Tobias Junghans + * Copyright (c) 2009-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.cpp b/core/src/Configuration/Password.cpp index f31f991c5..5df56acd3 100644 --- a/core/src/Configuration/Password.cpp +++ b/core/src/Configuration/Password.cpp @@ -1,7 +1,7 @@ /* * Password.cpp - implementation of Configuration::Password * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Password.h b/core/src/Configuration/Password.h index d2138973f..9d09a134d 100644 --- a/core/src/Configuration/Password.h +++ b/core/src/Configuration/Password.h @@ -1,7 +1,7 @@ /* * Configuration/Password.h - Configuration::Password class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index ce2d789e3..e7f3d18c5 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2024 Tobias Junghans + * Copyright (c) 2009-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Property.h b/core/src/Configuration/Property.h index c9b3bb6ad..0b9f33bf0 100644 --- a/core/src/Configuration/Property.h +++ b/core/src/Configuration/Property.h @@ -1,7 +1,7 @@ /* * Configuration/Property.h - Configuration::Property class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.cpp b/core/src/Configuration/Proxy.cpp index 7878fb453..d39659f63 100644 --- a/core/src/Configuration/Proxy.cpp +++ b/core/src/Configuration/Proxy.cpp @@ -1,7 +1,7 @@ /* * Proxy.cpp - implementation of Configuration::Proxy * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Proxy.h b/core/src/Configuration/Proxy.h index c7e2dfb01..4c2d2682d 100644 --- a/core/src/Configuration/Proxy.h +++ b/core/src/Configuration/Proxy.h @@ -1,7 +1,7 @@ /* * Configuration/Proxy.h - ConfigurationProxy class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/Store.h b/core/src/Configuration/Store.h index a0ef67d8b..994e9a504 100644 --- a/core/src/Configuration/Store.h +++ b/core/src/Configuration/Store.h @@ -1,7 +1,7 @@ /* * Configuration/Store.h - ConfigurationStore class * - * Copyright (c) 2009-2024 Tobias Junghans + * Copyright (c) 2009-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.cpp b/core/src/Configuration/UiMapping.cpp index 9304cb72b..b89ae6d7e 100644 --- a/core/src/Configuration/UiMapping.cpp +++ b/core/src/Configuration/UiMapping.cpp @@ -1,7 +1,7 @@ /* * ConfigurationObject.cpp - implementation of ConfigurationObject * - * Copyright (c) 2009-2024 Tobias Junghans + * Copyright (c) 2009-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Configuration/UiMapping.h b/core/src/Configuration/UiMapping.h index 8d4f85763..94e2e1e37 100644 --- a/core/src/Configuration/UiMapping.h +++ b/core/src/Configuration/UiMapping.h @@ -1,7 +1,7 @@ /* * Configuration/UiMapping.h - helper macros and functions for connecting config with UI * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.cpp b/core/src/ConfigurationManager.cpp index 9306a3b76..b40dd9179 100644 --- a/core/src/ConfigurationManager.cpp +++ b/core/src/ConfigurationManager.cpp @@ -1,7 +1,7 @@ /* * ConfigurationManager.cpp - class for managing Veyon's configuration * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationManager.h b/core/src/ConfigurationManager.h index b88a03350..ae9377863 100644 --- a/core/src/ConfigurationManager.h +++ b/core/src/ConfigurationManager.h @@ -1,7 +1,7 @@ /* * ConfigurationManager.h - class for managing Veyon's configuration * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.cpp b/core/src/ConfigurationPage.cpp index 2b74415ff..0d8ef0a81 100644 --- a/core/src/ConfigurationPage.cpp +++ b/core/src/ConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * ConfigurationPage.cpp - implementation of configuration page base class * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPage.h b/core/src/ConfigurationPage.h index 1e6977f62..beead8013 100644 --- a/core/src/ConfigurationPage.h +++ b/core/src/ConfigurationPage.h @@ -1,7 +1,7 @@ /* * ConfigurationPage.h - base class for all configuration pages * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ConfigurationPagePluginInterface.h b/core/src/ConfigurationPagePluginInterface.h index 48fbce45a..9336d8ab0 100644 --- a/core/src/ConfigurationPagePluginInterface.h +++ b/core/src/ConfigurationPagePluginInterface.h @@ -1,7 +1,7 @@ /* * ConfigurationPagePluginInterface.h - interface class for configuration pages * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.cpp b/core/src/CryptoCore.cpp index f0281254f..7e9173848 100644 --- a/core/src/CryptoCore.cpp +++ b/core/src/CryptoCore.cpp @@ -1,7 +1,7 @@ /* * CryptoCore.cpp - core functions for crypto features * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/CryptoCore.h b/core/src/CryptoCore.h index bc872b3fc..cd0d8aaf0 100644 --- a/core/src/CryptoCore.h +++ b/core/src/CryptoCore.h @@ -1,7 +1,7 @@ /* * CryptoCore.h - core functions for crypto features * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.cpp b/core/src/DesktopAccessDialog.cpp index 442a9a05d..3d3c09ae8 100644 --- a/core/src/DesktopAccessDialog.cpp +++ b/core/src/DesktopAccessDialog.cpp @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.cpp - implementation of DesktopAccessDialog class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/DesktopAccessDialog.h b/core/src/DesktopAccessDialog.h index 04911f4ac..19012cc5f 100644 --- a/core/src/DesktopAccessDialog.h +++ b/core/src/DesktopAccessDialog.h @@ -1,7 +1,7 @@ /* * DesktopAccessDialog.h - declaration of DesktopAccessDialog class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/EnumHelper.h b/core/src/EnumHelper.h index ef5261ec9..06f027adf 100644 --- a/core/src/EnumHelper.h +++ b/core/src/EnumHelper.h @@ -1,7 +1,7 @@ /* * EnumHelper.h - helper functions for enumerations * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Feature.h b/core/src/Feature.h index 547688cc9..f84388443 100644 --- a/core/src/Feature.h +++ b/core/src/Feature.h @@ -1,7 +1,7 @@ /* * Feature.h - declaration of the Feature class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.cpp b/core/src/FeatureManager.cpp index 6a5d6e847..cd696656b 100644 --- a/core/src/FeatureManager.cpp +++ b/core/src/FeatureManager.cpp @@ -1,7 +1,7 @@ /* * FeatureManager.cpp - implementation of the FeatureManager class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureManager.h b/core/src/FeatureManager.h index 4eadfe3d4..cf65acdba 100644 --- a/core/src/FeatureManager.h +++ b/core/src/FeatureManager.h @@ -1,7 +1,7 @@ /* * FeatureManager.h - header for the FeatureManager class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.cpp b/core/src/FeatureMessage.cpp index b6d60b76b..462f82214 100644 --- a/core/src/FeatureMessage.cpp +++ b/core/src/FeatureMessage.cpp @@ -1,7 +1,7 @@ /* * FeatureMessage.cpp - implementation of a message encapsulation class for features * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureMessage.h b/core/src/FeatureMessage.h index 2eeb99135..5451dcfe3 100644 --- a/core/src/FeatureMessage.h +++ b/core/src/FeatureMessage.h @@ -1,7 +1,7 @@ /* * FeatureMessage.h - header for a message encapsulation class for features * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureProviderInterface.h b/core/src/FeatureProviderInterface.h index 36f00f807..a5c2da98f 100644 --- a/core/src/FeatureProviderInterface.h +++ b/core/src/FeatureProviderInterface.h @@ -1,7 +1,7 @@ /* * FeatureProviderInterface.h - interface class for feature plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index bbd2d62e8..ef551f4ab 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.cpp - class for managing feature worker instances * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FeatureWorkerManager.h b/core/src/FeatureWorkerManager.h index a12cf1366..509ef3650 100644 --- a/core/src/FeatureWorkerManager.h +++ b/core/src/FeatureWorkerManager.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManager.h - class for managing feature worker instances * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.cpp b/core/src/FileSystemBrowser.cpp index 7a69ad7cf..3c4f9f8d1 100644 --- a/core/src/FileSystemBrowser.cpp +++ b/core/src/FileSystemBrowser.cpp @@ -1,7 +1,7 @@ /* * FileSystemBrowser.cpp - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/FileSystemBrowser.h b/core/src/FileSystemBrowser.h index fd42be1cb..8117f437e 100644 --- a/core/src/FileSystemBrowser.h +++ b/core/src/FileSystemBrowser.h @@ -1,7 +1,7 @@ /* * FileSystemBrowser.h - a wrapper class for easily browsing the file system * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.cpp b/core/src/Filesystem.cpp index b2cdea375..096acf0e9 100644 --- a/core/src/Filesystem.cpp +++ b/core/src/Filesystem.cpp @@ -1,7 +1,7 @@ /* * Filesystem.cpp - filesystem related query and manipulation functions * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Filesystem.h b/core/src/Filesystem.h index 7ee64e2db..1c8c8742c 100644 --- a/core/src/Filesystem.h +++ b/core/src/Filesystem.h @@ -1,7 +1,7 @@ /* * Filesystem.h - filesystem related query and manipulation functions * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HashList.h b/core/src/HashList.h index c84d6dd70..b1a6aa35c 100644 --- a/core/src/HashList.h +++ b/core/src/HashList.h @@ -1,7 +1,7 @@ /* * HashList.h - extended QHash acting like a list * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.cpp b/core/src/HostAddress.cpp index 90e92125e..e969c3e24 100644 --- a/core/src/HostAddress.cpp +++ b/core/src/HostAddress.cpp @@ -1,7 +1,7 @@ /* * HostAddress.cpp - implementation of HostAddress class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/HostAddress.h b/core/src/HostAddress.h index 70a068c09..372927c29 100644 --- a/core/src/HostAddress.h +++ b/core/src/HostAddress.h @@ -1,7 +1,7 @@ /* * HostAddress.h - header for HostAddress class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/KeyboardShortcutTrapper.h b/core/src/KeyboardShortcutTrapper.h index 8e913b9eb..fd8403426 100644 --- a/core/src/KeyboardShortcutTrapper.h +++ b/core/src/KeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * KeyboardShortcutTrapper.h - class for trapping system-wide keyboard shortcuts * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.cpp b/core/src/LockWidget.cpp index 40923554d..405958fe7 100644 --- a/core/src/LockWidget.cpp +++ b/core/src/LockWidget.cpp @@ -1,7 +1,7 @@ /* * LockWidget.cpp - widget for locking a client * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockWidget.h b/core/src/LockWidget.h index 2c2d0fed5..dee359d0d 100644 --- a/core/src/LockWidget.h +++ b/core/src/LockWidget.h @@ -1,7 +1,7 @@ /* * LockWidget.h - widget for locking a client * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Lockable.h b/core/src/Lockable.h index d825eca1f..7f478e0e5 100644 --- a/core/src/Lockable.h +++ b/core/src/Lockable.h @@ -1,7 +1,7 @@ /* * Lockable.h - header file for Lockable * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/LockingPointer.h b/core/src/LockingPointer.h index a335fdc11..30955a13a 100644 --- a/core/src/LockingPointer.h +++ b/core/src/LockingPointer.h @@ -1,7 +1,7 @@ /* * LockingPointer.h - smart pointer for lockables * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.cpp b/core/src/Logger.cpp index 68c897d59..ef3607ea4 100644 --- a/core/src/Logger.cpp +++ b/core/src/Logger.cpp @@ -1,7 +1,7 @@ /* * Logger.cpp - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Logger.h b/core/src/Logger.h index 515b1da41..9c5b46281 100644 --- a/core/src/Logger.h +++ b/core/src/Logger.h @@ -1,7 +1,7 @@ /* * Logger.h - a global clas for easily logging messages to log files * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MessageContext.h b/core/src/MessageContext.h index 52bcfadfd..85f3fe6ff 100644 --- a/core/src/MessageContext.h +++ b/core/src/MessageContext.h @@ -1,7 +1,7 @@ /* * MessageContext.h - header for transporting context for message I/O * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 9df4d424c..4797501ef 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -1,7 +1,7 @@ /* * MonitoringMode.cpp - implementation of MonitoringMode class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 0aac93f05..975726021 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -1,7 +1,7 @@ /* * MonitoringMode.h - header for the MonitoringMode class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NestedNetworkObjectDirectory.cpp b/core/src/NestedNetworkObjectDirectory.cpp index ddee1ac74..8559b0411 100644 --- a/core/src/NestedNetworkObjectDirectory.cpp +++ b/core/src/NestedNetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * NestedNetworkObjectDirectory.cpp - implementation of NestedNetworkObjectDirectory * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NestedNetworkObjectDirectory.h b/core/src/NestedNetworkObjectDirectory.h index 356f04604..112cd1cdd 100644 --- a/core/src/NestedNetworkObjectDirectory.h +++ b/core/src/NestedNetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * NestedNetworkObjectDirectory.cpp - header file for NestedNetworkObjectDirectory * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.cpp b/core/src/NetworkObject.cpp index ee50e1e09..5ee584290 100644 --- a/core/src/NetworkObject.cpp +++ b/core/src/NetworkObject.cpp @@ -1,7 +1,7 @@ /* * NetworkObject.cpp - data class representing a network object * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index dfe6c7dd8..166b98d88 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -1,7 +1,7 @@ /* * NetworkObject.h - data class representing a network object * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.cpp b/core/src/NetworkObjectDirectory.cpp index 71fb95c4e..be2c43a53 100644 --- a/core/src/NetworkObjectDirectory.cpp +++ b/core/src/NetworkObjectDirectory.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.cpp - base class for network object directory implementations * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 05a0987a9..3d468786d 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectory.h - base class for network object directory implementations * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.cpp b/core/src/NetworkObjectDirectoryManager.cpp index c0407392c..e38439a1f 100644 --- a/core/src/NetworkObjectDirectoryManager.cpp +++ b/core/src/NetworkObjectDirectoryManager.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.cpp - implementation of NetworkObjectDirectoryManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryManager.h b/core/src/NetworkObjectDirectoryManager.h index 06bb43d4c..d356979e4 100644 --- a/core/src/NetworkObjectDirectoryManager.h +++ b/core/src/NetworkObjectDirectoryManager.h @@ -1,7 +1,7 @@ /* * NetworkObjectDirectoryManager.h - header file for NetworkObjectDirectoryManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectDirectoryPluginInterface.h b/core/src/NetworkObjectDirectoryPluginInterface.h index 2953de416..846f8c301 100644 --- a/core/src/NetworkObjectDirectoryPluginInterface.h +++ b/core/src/NetworkObjectDirectoryPluginInterface.h @@ -2,7 +2,7 @@ * NetworkObjectDirectoryPluginInterface.h - plugin interface for network * object directory implementations * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/NetworkObjectModel.h b/core/src/NetworkObjectModel.h index add30d442..cf34d3a7c 100644 --- a/core/src/NetworkObjectModel.h +++ b/core/src/NetworkObjectModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectModel.h - base class for data models providing grouped network objects * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ObjectManager.h b/core/src/ObjectManager.h index 9432a77a9..2389911ac 100644 --- a/core/src/ObjectManager.h +++ b/core/src/ObjectManager.h @@ -1,7 +1,7 @@ /* * ObjectManager.h - header file for ObjectManager * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformCoreFunctions.h b/core/src/PlatformCoreFunctions.h index d66fbb9d9..94ab9c266 100644 --- a/core/src/PlatformCoreFunctions.h +++ b/core/src/PlatformCoreFunctions.h @@ -1,7 +1,7 @@ /* * PlatformCoreFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformFilesystemFunctions.h b/core/src/PlatformFilesystemFunctions.h index c95d1ce84..7dd38744f 100644 --- a/core/src/PlatformFilesystemFunctions.h +++ b/core/src/PlatformFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * PlatformFilesystemFunctions.h - interface class for platform filesystem * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformInputDeviceFunctions.h b/core/src/PlatformInputDeviceFunctions.h index 034ad5c9d..ef67eb68d 100644 --- a/core/src/PlatformInputDeviceFunctions.h +++ b/core/src/PlatformInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformInputDeviceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformNetworkFunctions.h b/core/src/PlatformNetworkFunctions.h index d37c8826e..da2dce008 100644 --- a/core/src/PlatformNetworkFunctions.h +++ b/core/src/PlatformNetworkFunctions.h @@ -1,7 +1,7 @@ /* * PlatformNetworkFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginInterface.h b/core/src/PlatformPluginInterface.h index 08333c12e..9886ca5c0 100644 --- a/core/src/PlatformPluginInterface.h +++ b/core/src/PlatformPluginInterface.h @@ -1,7 +1,7 @@ /* * PlatformPluginInterface.h - interface class for platform plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.cpp b/core/src/PlatformPluginManager.cpp index 10940b2cb..22861e820 100644 --- a/core/src/PlatformPluginManager.cpp +++ b/core/src/PlatformPluginManager.cpp @@ -1,7 +1,7 @@ /* * PlatformPluginManager.cpp - implementation of PlatformPluginManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformPluginManager.h b/core/src/PlatformPluginManager.h index 833e53801..40cf54f26 100644 --- a/core/src/PlatformPluginManager.h +++ b/core/src/PlatformPluginManager.h @@ -1,7 +1,7 @@ /* * PlatformPluginManager.h - header file for PlatformPluginManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformServiceFunctions.h b/core/src/PlatformServiceFunctions.h index 4665c5c46..592631a2e 100644 --- a/core/src/PlatformServiceFunctions.h +++ b/core/src/PlatformServiceFunctions.h @@ -1,7 +1,7 @@ /* * PlatformServiceFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 98357ddfb..840a64e73 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -1,7 +1,7 @@ /* * PlatformSessionsFunctions.h - interface class for platform session functions * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PlatformUserFunctions.h b/core/src/PlatformUserFunctions.h index f182859da..63e2f5a6b 100644 --- a/core/src/PlatformUserFunctions.h +++ b/core/src/PlatformUserFunctions.h @@ -1,7 +1,7 @@ /* * PlatformUserFunctions.h - interface class for platform plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Plugin.h b/core/src/Plugin.h index 0079f9570..bb797ac2b 100644 --- a/core/src/Plugin.h +++ b/core/src/Plugin.h @@ -1,7 +1,7 @@ /* * Plugin.h - generic abstraction of a plugin * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginInterface.h b/core/src/PluginInterface.h index 882368031..5de8060c1 100644 --- a/core/src/PluginInterface.h +++ b/core/src/PluginInterface.h @@ -1,7 +1,7 @@ /* * PluginInterface.h - interface class for plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.cpp b/core/src/PluginManager.cpp index 7c7cad0a0..94e0463a0 100644 --- a/core/src/PluginManager.cpp +++ b/core/src/PluginManager.cpp @@ -1,7 +1,7 @@ /* * PluginManager.cpp - implementation of the PluginManager class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/PluginManager.h b/core/src/PluginManager.h index 0a8c5fcb3..40907abb4 100644 --- a/core/src/PluginManager.h +++ b/core/src/PluginManager.h @@ -1,7 +1,7 @@ /* * PluginManager.h - header for the PluginManager class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.cpp b/core/src/ProcessHelper.cpp index f15015e0d..ac1dd8d91 100644 --- a/core/src/ProcessHelper.cpp +++ b/core/src/ProcessHelper.cpp @@ -1,7 +1,7 @@ /* * ProcessHelper.cpp - implementation of ProcessHelper * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ProcessHelper.h b/core/src/ProcessHelper.h index 600431e15..2553b57d5 100644 --- a/core/src/ProcessHelper.h +++ b/core/src/ProcessHelper.h @@ -1,7 +1,7 @@ /* * ProcessHelper.h - header file for ProcessHelper * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.cpp b/core/src/QmlCore.cpp index e1ba9f71d..69f8a6c28 100644 --- a/core/src/QmlCore.cpp +++ b/core/src/QmlCore.cpp @@ -1,7 +1,7 @@ /* * QmlCore.cpp - QML-related core functions * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QmlCore.h b/core/src/QmlCore.h index bf80f4afd..fceb752fc 100644 --- a/core/src/QmlCore.h +++ b/core/src/QmlCore.h @@ -1,7 +1,7 @@ /* * QmlCore.h - QML-related core functions * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/QtCompat.h b/core/src/QtCompat.h index 0b5f0d2dd..e56cb8494 100644 --- a/core/src/QtCompat.h +++ b/core/src/QtCompat.h @@ -1,7 +1,7 @@ /* * QtCompat.h - functions and templates for compatibility with older Qt versions * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/RfbClientCallback.h b/core/src/RfbClientCallback.h index 6ec22c110..4680295cc 100644 --- a/core/src/RfbClientCallback.h +++ b/core/src/RfbClientCallback.h @@ -1,7 +1,7 @@ /* * RfbClientCallback.h - wrapper for using member functions as libvncclient callbacks * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index a04d5c3e2..48f976abf 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -1,7 +1,7 @@ /* * Screenshot.cpp - class representing a screenshot * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/Screenshot.h b/core/src/Screenshot.h index b8bd64ad4..fdea5b310 100644 --- a/core/src/Screenshot.h +++ b/core/src/Screenshot.h @@ -1,7 +1,7 @@ /* * Screenshot.h - class representing a screenshot * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.cpp b/core/src/ServiceControl.cpp index 6d8930646..0b255c25c 100644 --- a/core/src/ServiceControl.cpp +++ b/core/src/ServiceControl.cpp @@ -1,7 +1,7 @@ /* * ServiceControl.cpp - class for controlling veyon service * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ServiceControl.h b/core/src/ServiceControl.h index b310a4e18..b8aaa5c62 100644 --- a/core/src/ServiceControl.h +++ b/core/src/ServiceControl.h @@ -1,7 +1,7 @@ /* * ServiceControl.h - header for the ServiceControl class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SocketDevice.h b/core/src/SocketDevice.h index f9487ddf4..253b903a6 100644 --- a/core/src/SocketDevice.h +++ b/core/src/SocketDevice.h @@ -1,7 +1,7 @@ /* * SocketDevice.h - SocketDevice abstraction * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.cpp b/core/src/SystemTrayIcon.cpp index c72819dac..cbaa6c601 100644 --- a/core/src/SystemTrayIcon.cpp +++ b/core/src/SystemTrayIcon.cpp @@ -1,7 +1,7 @@ /* * SystemTrayIcon.cpp - implementation of SystemTrayIcon class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/SystemTrayIcon.h b/core/src/SystemTrayIcon.h index 8d02a4af9..add6027de 100644 --- a/core/src/SystemTrayIcon.h +++ b/core/src/SystemTrayIcon.h @@ -1,7 +1,7 @@ /* * SystemTrayIcon.h - declaration of SystemTrayIcon class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.cpp b/core/src/ToolButton.cpp index 8ce9d05ee..c8c5aba2e 100644 --- a/core/src/ToolButton.cpp +++ b/core/src/ToolButton.cpp @@ -1,7 +1,7 @@ /* * ToolButton.cpp - implementation of Veyon-tool-button * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/ToolButton.h b/core/src/ToolButton.h index 932a28a71..0dc29b59b 100644 --- a/core/src/ToolButton.h +++ b/core/src/ToolButton.h @@ -1,7 +1,7 @@ /* * ToolButton.h - declaration of class ToolButton * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.cpp b/core/src/TranslationLoader.cpp index 819fa8991..51262502f 100644 --- a/core/src/TranslationLoader.cpp +++ b/core/src/TranslationLoader.cpp @@ -1,7 +1,7 @@ /* * TranslationLoader.cpp - implementation of TranslationLoader class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/TranslationLoader.h b/core/src/TranslationLoader.h index 1f080404e..97d81eb5b 100644 --- a/core/src/TranslationLoader.h +++ b/core/src/TranslationLoader.h @@ -1,7 +1,7 @@ /* * TranslationLoader.h - declaration of TranslationLoader class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendInterface.h b/core/src/UserGroupsBackendInterface.h index f6ba7f692..fbb961fbb 100644 --- a/core/src/UserGroupsBackendInterface.h +++ b/core/src/UserGroupsBackendInterface.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendInterface.h - interface for a UserGroupsBackend * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.cpp b/core/src/UserGroupsBackendManager.cpp index e0458a9c8..b0f90d092 100644 --- a/core/src/UserGroupsBackendManager.cpp +++ b/core/src/UserGroupsBackendManager.cpp @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.cpp - implementation of UserGroupsBackendManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/UserGroupsBackendManager.h b/core/src/UserGroupsBackendManager.h index 0b50195c0..b2185f045 100644 --- a/core/src/UserGroupsBackendManager.h +++ b/core/src/UserGroupsBackendManager.h @@ -1,7 +1,7 @@ /* * UserGroupsBackendManager.h - header file for UserGroupsBackendManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.cpp b/core/src/VariantArrayMessage.cpp index 122397b86..d52b9e86d 100644 --- a/core/src/VariantArrayMessage.cpp +++ b/core/src/VariantArrayMessage.cpp @@ -1,7 +1,7 @@ /* * VariantArrayMessage.cpp - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantArrayMessage.h b/core/src/VariantArrayMessage.h index ab17b12c2..257fb0e99 100644 --- a/core/src/VariantArrayMessage.h +++ b/core/src/VariantArrayMessage.h @@ -1,7 +1,7 @@ /* * VariantArrayMessage.h - class for sending/receiving a variant array as message * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index e0d94f191..3f39895dd 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -1,7 +1,7 @@ /* * VariantStream.cpp - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VariantStream.h b/core/src/VariantStream.h index 41940a8d3..c8a3132fa 100644 --- a/core/src/VariantStream.h +++ b/core/src/VariantStream.h @@ -1,7 +1,7 @@ /* * VariantStream.h - read/write QVariant objects to/from QIODevice * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.cpp b/core/src/VeyonConfiguration.cpp index a27d7315d..0bda60748 100644 --- a/core/src/VeyonConfiguration.cpp +++ b/core/src/VeyonConfiguration.cpp @@ -2,7 +2,7 @@ * VeyonConfiguration.cpp - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfiguration.h b/core/src/VeyonConfiguration.h index 5da94d8d5..23d22093f 100644 --- a/core/src/VeyonConfiguration.h +++ b/core/src/VeyonConfiguration.h @@ -2,7 +2,7 @@ * VeyonConfiguration.h - a Configuration object storing system wide * configuration values * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 398e29287..d1ab2612e 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -2,7 +2,7 @@ * VeyonConfigurationProperties.h - definition of every configuration property * stored in global veyon configuration * - * Copyright (c) 2016-2024 Tobias Junghans + * Copyright (c) 2016-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index c49d7b629..666b34dd5 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -1,7 +1,7 @@ /* * VeyonConnection.cpp - implementation of VeyonConnection * - * Copyright (c) 2008-2024 Tobias Junghans + * Copyright (c) 2008-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index f86887f58..f90e13764 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -1,7 +1,7 @@ /* * VeyonConnection.h - declaration of class VeyonConnection * - * Copyright (c) 2008-2024 Tobias Junghans + * Copyright (c) 2008-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index e0314fb33..3f365f9a3 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -1,7 +1,7 @@ /* * VeyonCore.cpp - implementation of Veyon Core * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 7858cd44d..89253d780 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -1,7 +1,7 @@ /* * VeyonCore.h - declaration of VeyonCore class + basic headers * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonMasterInterface.h b/core/src/VeyonMasterInterface.h index 1b509579f..cce2e45a5 100644 --- a/core/src/VeyonMasterInterface.h +++ b/core/src/VeyonMasterInterface.h @@ -1,7 +1,7 @@ /* * VeyonMasterInterface.h - interface class for VeyonMaster * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServerInterface.h b/core/src/VeyonServerInterface.h index f2fc99bd2..4d5c2212a 100644 --- a/core/src/VeyonServerInterface.h +++ b/core/src/VeyonServerInterface.h @@ -1,7 +1,7 @@ /* * VeyonServerInterface.h - interface class for VeyonServer * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.cpp b/core/src/VeyonServiceControl.cpp index 2be30c887..9e205ce19 100644 --- a/core/src/VeyonServiceControl.cpp +++ b/core/src/VeyonServiceControl.cpp @@ -1,7 +1,7 @@ /* * VeyonServiceControl.cpp - class for controlling Veyon service * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonServiceControl.h b/core/src/VeyonServiceControl.h index bb835e41c..0aaf141eb 100644 --- a/core/src/VeyonServiceControl.h +++ b/core/src/VeyonServiceControl.h @@ -1,7 +1,7 @@ /* * VeyonServiceControl.h - class for controlling the Veyon service * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VeyonWorkerInterface.h b/core/src/VeyonWorkerInterface.h index eff95fcb8..f5ae21d3f 100644 --- a/core/src/VeyonWorkerInterface.h +++ b/core/src/VeyonWorkerInterface.h @@ -1,7 +1,7 @@ /* * VeyonWorkerInterface.h - interface class for VeyonWorker * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 8d169d7ff..23d242070 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -1,7 +1,7 @@ /* * VncClientProtocol.cpp - implementation of the VncClientProtocol class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index 87bea6ce7..7c036c7f5 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -1,7 +1,7 @@ /* * VncClientProtocol.h - header file for the VncClientProtocol class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index e332bd032..5b3f8df5b 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -1,7 +1,7 @@ /* * VncConnection.cpp - implementation of VncConnection class * - * Copyright (c) 2008-2024 Tobias Junghans + * Copyright (c) 2008-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 35c908f6c..b2422a47c 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -1,7 +1,7 @@ /* * VncConnection.h - declaration of VncConnection class * - * Copyright (c) 2008-2024 Tobias Junghans + * Copyright (c) 2008-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncConnectionConfiguration.h b/core/src/VncConnectionConfiguration.h index 3db958b60..c8bf8b025 100644 --- a/core/src/VncConnectionConfiguration.h +++ b/core/src/VncConnectionConfiguration.h @@ -1,7 +1,7 @@ /* * VncConnectionConfiguration.h - declaration of VncConnectionConfiguration * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.cpp b/core/src/VncEvents.cpp index b369b24dc..ffc981e50 100644 --- a/core/src/VncEvents.cpp +++ b/core/src/VncEvents.cpp @@ -1,7 +1,7 @@ /* * VncEvents.cpp - implementation of VNC event classes * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncEvents.h b/core/src/VncEvents.h index cfc1e2518..1177459f1 100644 --- a/core/src/VncEvents.h +++ b/core/src/VncEvents.h @@ -1,7 +1,7 @@ /* * VncEvent.h - declaration of VncEvent and subclasses * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.cpp b/core/src/VncFeatureMessageEvent.cpp index 7039d9f54..c090c3b9d 100644 --- a/core/src/VncFeatureMessageEvent.cpp +++ b/core/src/VncFeatureMessageEvent.cpp @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.cpp - implementation of FeatureMessageEvent * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncFeatureMessageEvent.h b/core/src/VncFeatureMessageEvent.h index f894e2237..6e64c7ca3 100644 --- a/core/src/VncFeatureMessageEvent.h +++ b/core/src/VncFeatureMessageEvent.h @@ -1,7 +1,7 @@ /* * FeatureMessageEvent.h - declaration of class FeatureMessageEvent * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerClient.h b/core/src/VncServerClient.h index e882edbde..6c20f8d17 100644 --- a/core/src/VncServerClient.h +++ b/core/src/VncServerClient.h @@ -1,7 +1,7 @@ /* * VncServerClient.h - header file for the VncServerClient class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerPluginInterface.h b/core/src/VncServerPluginInterface.h index 4c7d04041..a9d5cad49 100644 --- a/core/src/VncServerPluginInterface.h +++ b/core/src/VncServerPluginInterface.h @@ -1,7 +1,7 @@ /* * VncServerPluginInterface.h - abstract interface class for VNC server plugins * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index 01a3d5e46..14e2edd58 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VncServerProtocol.cpp - implementation of the VncServerProtocol class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncServerProtocol.h b/core/src/VncServerProtocol.h index 710787ff8..34f5f5e1c 100644 --- a/core/src/VncServerProtocol.h +++ b/core/src/VncServerProtocol.h @@ -1,7 +1,7 @@ /* * VncServerProtocol.h - header file for the VncServerProtocol class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.cpp b/core/src/VncView.cpp index dc789d83b..23cc79b0e 100644 --- a/core/src/VncView.cpp +++ b/core/src/VncView.cpp @@ -1,7 +1,7 @@ /* * VncView.cpp - abstract base for all VNC views * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncView.h b/core/src/VncView.h index fb3176b98..6c67fb783 100644 --- a/core/src/VncView.h +++ b/core/src/VncView.h @@ -1,7 +1,7 @@ /* * VncView.h - abstract base for all VNC views * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.cpp b/core/src/VncViewItem.cpp index 8ea0258d4..03283bd1b 100644 --- a/core/src/VncViewItem.cpp +++ b/core/src/VncViewItem.cpp @@ -1,7 +1,7 @@ /* * VncViewItem.cpp - QtQuick VNC view item * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewItem.h b/core/src/VncViewItem.h index a8a50bfa2..1be12d9b8 100644 --- a/core/src/VncViewItem.h +++ b/core/src/VncViewItem.h @@ -1,7 +1,7 @@ /* * VncViewItem.h - QtQuick VNC view item * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.cpp b/core/src/VncViewWidget.cpp index e7795581c..4908e8d17 100644 --- a/core/src/VncViewWidget.cpp +++ b/core/src/VncViewWidget.cpp @@ -1,7 +1,7 @@ /* * VncViewWidget.cpp - VNC viewer widget * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/core/src/VncViewWidget.h b/core/src/VncViewWidget.h index 4f5186056..f94060277 100644 --- a/core/src/VncViewWidget.h +++ b/core/src/VncViewWidget.h @@ -1,7 +1,7 @@ /* * VncViewWidget.h - VNC viewer widget * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.cpp b/master/src/CheckableItemProxyModel.cpp index 39314d543..86d55be59 100644 --- a/master/src/CheckableItemProxyModel.cpp +++ b/master/src/CheckableItemProxyModel.cpp @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.cpp - proxy model for overlaying checked property * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/CheckableItemProxyModel.h b/master/src/CheckableItemProxyModel.h index 5470d17fb..998fc6728 100644 --- a/master/src/CheckableItemProxyModel.h +++ b/master/src/CheckableItemProxyModel.h @@ -1,7 +1,7 @@ /* * CheckableItemProxyModel.h - proxy model for overlaying checked property * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index d12b69bb0..68ae8868f 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -1,7 +1,7 @@ /* * ComputerControlListModel.cpp - data model for computer control objects * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 2c1fcfb14..b5d45d214 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -1,7 +1,7 @@ /* * ComputerControlListModel.h - data model for computer control objects * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerImageProvider.cpp b/master/src/ComputerImageProvider.cpp index 919eb0145..9f22a3138 100644 --- a/master/src/ComputerImageProvider.cpp +++ b/master/src/ComputerImageProvider.cpp @@ -1,7 +1,7 @@ /* * ComputerImageProvider.cpp - data model for computer control objects * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerImageProvider.h b/master/src/ComputerImageProvider.h index a63db2fb2..7d44e463e 100644 --- a/master/src/ComputerImageProvider.h +++ b/master/src/ComputerImageProvider.h @@ -1,7 +1,7 @@ /* * ComputerImageProvider.h - image provider for computers * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 07a7ad0f6..491381653 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -1,7 +1,7 @@ /* * ComputerManager.cpp - maintains and provides a computer object list * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index a23ed6ce0..bf0a67d9e 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -1,7 +1,7 @@ /* * ComputerManager.h - maintains and provides a computer object list * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.cpp b/master/src/ComputerMonitoringItem.cpp index f85d89b6d..1c7b782d6 100644 --- a/master/src/ComputerMonitoringItem.cpp +++ b/master/src/ComputerMonitoringItem.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringItem.h b/master/src/ComputerMonitoringItem.h index 963c280b4..0f8f41cf8 100644 --- a/master/src/ComputerMonitoringItem.h +++ b/master/src/ComputerMonitoringItem.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringItem.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.cpp b/master/src/ComputerMonitoringModel.cpp index ef6d39c60..8b2adc576 100644 --- a/master/src/ComputerMonitoringModel.cpp +++ b/master/src/ComputerMonitoringModel.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringModel.cpp - implementation of ComputerMonitoringModel * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringModel.h b/master/src/ComputerMonitoringModel.h index ec8a0aeb2..f420073a7 100644 --- a/master/src/ComputerMonitoringModel.h +++ b/master/src/ComputerMonitoringModel.h @@ -1,7 +1,7 @@ /* * ComputerSortFilterProxyModel.h - header file for ComputerSortFilterProxyModel * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.cpp b/master/src/ComputerMonitoringView.cpp index 58deb22ac..141bc812f 100644 --- a/master/src/ComputerMonitoringView.cpp +++ b/master/src/ComputerMonitoringView.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringView.h b/master/src/ComputerMonitoringView.h index a7f35db7d..e32984410 100644 --- a/master/src/ComputerMonitoringView.h +++ b/master/src/ComputerMonitoringView.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringView.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index d56771b23..e5243168b 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.cpp - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerMonitoringWidget.h b/master/src/ComputerMonitoringWidget.h index 515a5f415..b9cca4c24 100644 --- a/master/src/ComputerMonitoringWidget.h +++ b/master/src/ComputerMonitoringWidget.h @@ -1,7 +1,7 @@ /* * ComputerMonitoringWidget.h - provides a view with computer monitor thumbnails * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.cpp b/master/src/ComputerSelectModel.cpp index 1430fbfe2..1f5263e00 100644 --- a/master/src/ComputerSelectModel.cpp +++ b/master/src/ComputerSelectModel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectModel.cpp - data model for computer selection * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectModel.h b/master/src/ComputerSelectModel.h index e2cb61515..7a7614c0d 100644 --- a/master/src/ComputerSelectModel.h +++ b/master/src/ComputerSelectModel.h @@ -1,7 +1,7 @@ /* * ComputerSelectListModel.h - data model for computer selection * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.cpp b/master/src/ComputerSelectPanel.cpp index cc5c1c676..d94f727aa 100644 --- a/master/src/ComputerSelectPanel.cpp +++ b/master/src/ComputerSelectPanel.cpp @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.cpp - provides a view for a network object tree * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerSelectPanel.h b/master/src/ComputerSelectPanel.h index 35f9cfb90..473e8e73f 100644 --- a/master/src/ComputerSelectPanel.h +++ b/master/src/ComputerSelectPanel.h @@ -1,7 +1,7 @@ /* * ComputerSelectPanel.h - provides a view for a network object tree * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 4388a675f..cbd98ece8 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.cpp - fullscreen preview widget * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ComputerZoomWidget.h b/master/src/ComputerZoomWidget.h index 7acfd4eb0..80698932c 100644 --- a/master/src/ComputerZoomWidget.h +++ b/master/src/ComputerZoomWidget.h @@ -1,7 +1,7 @@ /* * ComputerZoomWidget.h - fullscreen preview widget * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.cpp b/master/src/DocumentationFigureCreator.cpp index 3ab25b901..32d578475 100644 --- a/master/src/DocumentationFigureCreator.cpp +++ b/master/src/DocumentationFigureCreator.cpp @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.cpp - helper for creating documentation figures * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/DocumentationFigureCreator.h b/master/src/DocumentationFigureCreator.h index 405396448..10cff68d1 100644 --- a/master/src/DocumentationFigureCreator.h +++ b/master/src/DocumentationFigureCreator.h @@ -1,7 +1,7 @@ /* * DocumentationFigureCreator.h - helper for creating documentation figures * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.cpp b/master/src/FeatureListModel.cpp index b927dcd8b..985fdcfe5 100644 --- a/master/src/FeatureListModel.cpp +++ b/master/src/FeatureListModel.cpp @@ -1,7 +1,7 @@ /* * FeatureListModel.cpp - data model for features * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FeatureListModel.h b/master/src/FeatureListModel.h index 1dce4f7de..0c48a4b4d 100644 --- a/master/src/FeatureListModel.h +++ b/master/src/FeatureListModel.h @@ -1,7 +1,7 @@ /* * FeatureListListModel.h - data model for features * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.cpp b/master/src/FlexibleListView.cpp index b2eba6a45..856582574 100644 --- a/master/src/FlexibleListView.cpp +++ b/master/src/FlexibleListView.cpp @@ -1,7 +1,7 @@ /* * FlexibleListView.cpp - list view with flexible icon positions * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/FlexibleListView.h b/master/src/FlexibleListView.h index 782b728c0..0f508ee85 100644 --- a/master/src/FlexibleListView.h +++ b/master/src/FlexibleListView.h @@ -1,7 +1,7 @@ /* * FlexibleListView.h - list view with flexible icon positions * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.cpp b/master/src/LocationDialog.cpp index b5093e406..f3102e925 100644 --- a/master/src/LocationDialog.cpp +++ b/master/src/LocationDialog.cpp @@ -1,7 +1,7 @@ /* * LocationDialog.cpp - header file for LocationDialog * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/LocationDialog.h b/master/src/LocationDialog.h index 2ae39db29..9309329a4 100644 --- a/master/src/LocationDialog.h +++ b/master/src/LocationDialog.h @@ -1,7 +1,7 @@ /* * LocationDialog.h - header file for LocationDialog * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.cpp b/master/src/MainToolBar.cpp index 7f7949cd5..2451ffe54 100644 --- a/master/src/MainToolBar.cpp +++ b/master/src/MainToolBar.cpp @@ -1,7 +1,7 @@ /* * MainToolBar.cpp - MainToolBar for MainWindow * - * Copyright (c) 2007-2024 Tobias Junghans + * Copyright (c) 2007-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainToolBar.h b/master/src/MainToolBar.h index ac1c021f5..b10e67f6b 100644 --- a/master/src/MainToolBar.h +++ b/master/src/MainToolBar.h @@ -1,7 +1,7 @@ /* * MainToolBar.h - MainToolBar for MainWindow * - * Copyright (c) 2007-2024 Tobias Junghans + * Copyright (c) 2007-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index f723a08b3..f0c1c24f2 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -1,7 +1,7 @@ /* * MainWindow.cpp - implementation of MainWindow class * - * Copyright (c) 2004-2024 Tobias Junghans + * Copyright (c) 2004-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/MainWindow.h b/master/src/MainWindow.h index 4ffc14000..3a61b23d1 100644 --- a/master/src/MainWindow.h +++ b/master/src/MainWindow.h @@ -1,7 +1,7 @@ /* * MainWindow.h - main window of Veyon Master Application * - * Copyright (c) 2004-2024 Tobias Junghans + * Copyright (c) 2004-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 98517cbaf..7af0e6aba 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.cpp - implementation of NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectFilterProxyModel.h b/master/src/NetworkObjectFilterProxyModel.h index 9f14cfeed..e585ba94c 100644 --- a/master/src/NetworkObjectFilterProxyModel.h +++ b/master/src/NetworkObjectFilterProxyModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectFilterProxyModel.h - header file for NetworkObjectFilterProxyModel * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.cpp b/master/src/NetworkObjectOverlayDataModel.cpp index 4345a6943..7e8f96432 100644 --- a/master/src/NetworkObjectOverlayDataModel.cpp +++ b/master/src/NetworkObjectOverlayDataModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.cpp - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectOverlayDataModel.h b/master/src/NetworkObjectOverlayDataModel.h index 1d8b89636..d8460ef7c 100644 --- a/master/src/NetworkObjectOverlayDataModel.h +++ b/master/src/NetworkObjectOverlayDataModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectOverlayDataModel.h - overlay model for NetworkObjectModel to provide extra data * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.cpp b/master/src/NetworkObjectTreeModel.cpp index 5aeb1b4c8..1b9ab3f0f 100644 --- a/master/src/NetworkObjectTreeModel.cpp +++ b/master/src/NetworkObjectTreeModel.cpp @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.cpp - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/NetworkObjectTreeModel.h b/master/src/NetworkObjectTreeModel.h index 9eaf542d5..0462f50c7 100644 --- a/master/src/NetworkObjectTreeModel.h +++ b/master/src/NetworkObjectTreeModel.h @@ -1,7 +1,7 @@ /* * NetworkObjectTreeModel.h - data model returning hierarchically grouped network objects * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.cpp b/master/src/ScreenshotManagementPanel.cpp index 0fc6eb0fe..6e3aa90f6 100644 --- a/master/src/ScreenshotManagementPanel.cpp +++ b/master/src/ScreenshotManagementPanel.cpp @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.cpp - implementation of screenshot management view * - * Copyright (c) 2004-2024 Tobias Junghans + * Copyright (c) 2004-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/ScreenshotManagementPanel.h b/master/src/ScreenshotManagementPanel.h index b281d86e6..9f1e8c0a7 100644 --- a/master/src/ScreenshotManagementPanel.h +++ b/master/src/ScreenshotManagementPanel.h @@ -1,7 +1,7 @@ /* * ScreenshotManagementPanel.h - declaration of screenshot management view * - * Copyright (c) 2004-2024 Tobias Junghans + * Copyright (c) 2004-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.cpp b/master/src/SlideshowModel.cpp index 40d56d885..ba0f83e0d 100644 --- a/master/src/SlideshowModel.cpp +++ b/master/src/SlideshowModel.cpp @@ -1,7 +1,7 @@ /* * SlideshowModel.cpp - implementation of SlideshowModel * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowModel.h b/master/src/SlideshowModel.h index ee52c4147..0e68f26a8 100644 --- a/master/src/SlideshowModel.h +++ b/master/src/SlideshowModel.h @@ -1,7 +1,7 @@ /* * SlideshowModel.h - header file for SlideshowModel * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index c2d2bcb48..bc5b1e0d4 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -1,7 +1,7 @@ /* * SlideshowPanel.cpp - implementation of SlideshowPanel * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SlideshowPanel.h b/master/src/SlideshowPanel.h index dfee58050..54a0d8bce 100644 --- a/master/src/SlideshowPanel.h +++ b/master/src/SlideshowPanel.h @@ -1,7 +1,7 @@ /* * SlideshowPanel.h - declaration of SlideshowPanel * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.cpp b/master/src/SpotlightModel.cpp index c85b93d6a..a0501adcb 100644 --- a/master/src/SpotlightModel.cpp +++ b/master/src/SpotlightModel.cpp @@ -1,7 +1,7 @@ /* * SpotlightModel.cpp - implementation of SpotlightModel * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightModel.h b/master/src/SpotlightModel.h index 9b677fe30..ca354f83d 100644 --- a/master/src/SpotlightModel.h +++ b/master/src/SpotlightModel.h @@ -1,7 +1,7 @@ /* * SpotlightModel.h - header file for SpotlightModel * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index ce21336d3..83ee542f9 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -1,7 +1,7 @@ /* * SpotlightPanel.cpp - implementation of SpotlightPanel * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/SpotlightPanel.h b/master/src/SpotlightPanel.h index 95b2564d2..9f9393838 100644 --- a/master/src/SpotlightPanel.h +++ b/master/src/SpotlightPanel.h @@ -1,7 +1,7 @@ /* * SpotlightPanel.h - declaration of SpotlightPanel * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index ab94ddd51..7246be79b 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -2,7 +2,7 @@ * UserConfig.cpp - Configuration object storing personal settings * for the Veyon Master Application * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/UserConfig.h b/master/src/UserConfig.h index 70c2f897e..851d12e55 100644 --- a/master/src/UserConfig.h +++ b/master/src/UserConfig.h @@ -1,7 +1,7 @@ /* * UserConfig.h - UserConfig class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.cpp b/master/src/VeyonMaster.cpp index aa46f8404..58ba8d99f 100644 --- a/master/src/VeyonMaster.cpp +++ b/master/src/VeyonMaster.cpp @@ -1,7 +1,7 @@ /* * VeyonMaster.cpp - management of application-global instances * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/VeyonMaster.h b/master/src/VeyonMaster.h index bbcf3a302..62f5bdeac 100644 --- a/master/src/VeyonMaster.h +++ b/master/src/VeyonMaster.h @@ -1,7 +1,7 @@ /* * VeyonMaster.h - global instances * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/src/main.cpp b/master/src/main.cpp index 69bdbb97c..2b83dcb6d 100644 --- a/master/src/main.cpp +++ b/master/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - startup routine for Veyon Master Application * - * Copyright (c) 2004-2024 Tobias Junghans + * Copyright (c) 2004-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/master/veyon-master.rc.in b/master/veyon-master.rc.in index 82be95423..ef6c5733f 100644 --- a/master/veyon-master.rc.in +++ b/master/veyon-master.rc.in @@ -21,7 +21,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Master\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2025 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-master.exe\0" END END diff --git a/nsis/veyon.nsi.in b/nsis/veyon.nsi.in index 6be8b3be6..3bbeb84a2 100644 --- a/nsis/veyon.nsi.in +++ b/nsis/veyon.nsi.in @@ -2,7 +2,7 @@ !define COMP_NAME "Veyon Solutions" !define WEB_SITE "https://veyon.io" !define VERSION "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_PATCH@.@VERSION_BUILD@" -!define COPYRIGHT "2004-2024 Veyon Solutions / Tobias Junghans" +!define COPYRIGHT "2004-2025 Veyon Solutions / Tobias Junghans" !define DESCRIPTION "Veyon Installer" !define LICENSE_TXT "COPYING" !define INSTALLER_NAME "veyon-${VERSION}-@VEYON_WINDOWS_ARCH@-setup.exe" diff --git a/plugins/authkeys/AuthKeysConfiguration.h b/plugins/authkeys/AuthKeysConfiguration.h index c1f6e2662..bd2ff3229 100644 --- a/plugins/authkeys/AuthKeysConfiguration.h +++ b/plugins/authkeys/AuthKeysConfiguration.h @@ -1,7 +1,7 @@ /* * AuthKeysConfiguration.h - configuration values for AuthKeys plugin * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.cpp b/plugins/authkeys/AuthKeysConfigurationWidget.cpp index 6a5d4dd20..7e2ff8da9 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.cpp +++ b/plugins/authkeys/AuthKeysConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.cpp - implementation of the authentication configuration page * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.h b/plugins/authkeys/AuthKeysConfigurationWidget.h index d529cb635..c76c15c6e 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.h +++ b/plugins/authkeys/AuthKeysConfigurationWidget.h @@ -1,7 +1,7 @@ /* * AuthKeysConfigurationWidget.h - header for the AuthKeysConfigurationDialog class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.cpp b/plugins/authkeys/AuthKeysManager.cpp index 20d69a138..a6877b4b3 100644 --- a/plugins/authkeys/AuthKeysManager.cpp +++ b/plugins/authkeys/AuthKeysManager.cpp @@ -1,7 +1,7 @@ /* * AuthKeysManager.cpp - implementation of AuthKeysManager class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysManager.h b/plugins/authkeys/AuthKeysManager.h index ac1fbc0fe..7cfa51d43 100644 --- a/plugins/authkeys/AuthKeysManager.h +++ b/plugins/authkeys/AuthKeysManager.h @@ -1,7 +1,7 @@ /* * AuthKeysManager.h - declaration of AuthKeysManager class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.cpp b/plugins/authkeys/AuthKeysPlugin.cpp index 68e88824f..d42dcab8f 100644 --- a/plugins/authkeys/AuthKeysPlugin.cpp +++ b/plugins/authkeys/AuthKeysPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.cpp - implementation of AuthKeysPlugin class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysPlugin.h b/plugins/authkeys/AuthKeysPlugin.h index 2436ec805..ab9023607 100644 --- a/plugins/authkeys/AuthKeysPlugin.h +++ b/plugins/authkeys/AuthKeysPlugin.h @@ -1,7 +1,7 @@ /* * AuthKeysPlugin.h - declaration of AuthKeysPlugin class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.cpp b/plugins/authkeys/AuthKeysTableModel.cpp index 65e8e49ac..bf1e9a540 100644 --- a/plugins/authkeys/AuthKeysTableModel.cpp +++ b/plugins/authkeys/AuthKeysTableModel.cpp @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.cpp - implementation of AuthKeysTableModel class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authkeys/AuthKeysTableModel.h b/plugins/authkeys/AuthKeysTableModel.h index 137110327..14af56d5f 100644 --- a/plugins/authkeys/AuthKeysTableModel.h +++ b/plugins/authkeys/AuthKeysTableModel.h @@ -1,7 +1,7 @@ /* * AuthKeysTableModel.h - declaration of AuthKeysTableModel class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.cpp b/plugins/authlogon/AuthLogonDialog.cpp index 032e175ad..8d0245526 100644 --- a/plugins/authlogon/AuthLogonDialog.cpp +++ b/plugins/authlogon/AuthLogonDialog.cpp @@ -1,7 +1,7 @@ /* * AuthLogonDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonDialog.h b/plugins/authlogon/AuthLogonDialog.h index 3ed9702ad..41346e5e3 100644 --- a/plugins/authlogon/AuthLogonDialog.h +++ b/plugins/authlogon/AuthLogonDialog.h @@ -1,7 +1,7 @@ /* * AuthLogonDialog.h - declaration of password dialog * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.cpp b/plugins/authlogon/AuthLogonPlugin.cpp index 54ec3ce17..ebfa84d99 100644 --- a/plugins/authlogon/AuthLogonPlugin.cpp +++ b/plugins/authlogon/AuthLogonPlugin.cpp @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.cpp - implementation of AuthLogonPlugin class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authlogon/AuthLogonPlugin.h b/plugins/authlogon/AuthLogonPlugin.h index d7f713aee..ede00257e 100644 --- a/plugins/authlogon/AuthLogonPlugin.h +++ b/plugins/authlogon/AuthLogonPlugin.h @@ -1,7 +1,7 @@ /* * AuthLogonPlugin.h - declaration of AuthLogonPlugin class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleConfiguration.h b/plugins/authsimple/AuthSimpleConfiguration.h index e7dbf50db..c97d0c0a4 100644 --- a/plugins/authsimple/AuthSimpleConfiguration.h +++ b/plugins/authsimple/AuthSimpleConfiguration.h @@ -1,7 +1,7 @@ /* * AuthSimpleConfiguration.h - configuration values for AuthSimple plugin * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.cpp b/plugins/authsimple/AuthSimpleDialog.cpp index 7e06d1576..c1057a274 100644 --- a/plugins/authsimple/AuthSimpleDialog.cpp +++ b/plugins/authsimple/AuthSimpleDialog.cpp @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimpleDialog.h b/plugins/authsimple/AuthSimpleDialog.h index c6fc697e8..8eb3345d4 100644 --- a/plugins/authsimple/AuthSimpleDialog.h +++ b/plugins/authsimple/AuthSimpleDialog.h @@ -1,7 +1,7 @@ /* * AuthSimpleDialog.h - declaration of password dialog * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.cpp b/plugins/authsimple/AuthSimplePlugin.cpp index 1073912c2..27730650b 100644 --- a/plugins/authsimple/AuthSimplePlugin.cpp +++ b/plugins/authsimple/AuthSimplePlugin.cpp @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.cpp - implementation of AuthSimplePlugin class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/authsimple/AuthSimplePlugin.h b/plugins/authsimple/AuthSimplePlugin.h index e15b17a9e..528f77d2d 100644 --- a/plugins/authsimple/AuthSimplePlugin.h +++ b/plugins/authsimple/AuthSimplePlugin.h @@ -1,7 +1,7 @@ /* * AuthSimplePlugin.h - declaration of AuthSimplePlugin class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.cpp b/plugins/builtindirectory/BuiltinDirectory.cpp index 46653dc15..3f74134d2 100644 --- a/plugins/builtindirectory/BuiltinDirectory.cpp +++ b/plugins/builtindirectory/BuiltinDirectory.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectory.cpp - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectory.h b/plugins/builtindirectory/BuiltinDirectory.h index fc7cce7cc..e2c9f0943 100644 --- a/plugins/builtindirectory/BuiltinDirectory.h +++ b/plugins/builtindirectory/BuiltinDirectory.h @@ -1,7 +1,7 @@ /* * BuiltinDirectory.h - NetworkObjects from VeyonConfiguration * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h index c59bfa6d0..ddb93d87f 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfiguration.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfiguration.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfiguration.h - configuration values for BuiltinDirectory plugin * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp index 349c45cae..0673ab1ce 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.cpp - implementation of BuiltinDirectoryConfigurationPage * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h index edddd129c..3e1176527 100644 --- a/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h +++ b/plugins/builtindirectory/BuiltinDirectoryConfigurationPage.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryConfigurationPage.h - header for the BuiltinDirectoryConfigurationPage class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp index 3322e772b..dfe70247e 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.cpp @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.cpp - implementation of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/builtindirectory/BuiltinDirectoryPlugin.h b/plugins/builtindirectory/BuiltinDirectoryPlugin.h index a059e91e9..9a4d82065 100644 --- a/plugins/builtindirectory/BuiltinDirectoryPlugin.h +++ b/plugins/builtindirectory/BuiltinDirectoryPlugin.h @@ -1,7 +1,7 @@ /* * BuiltinDirectoryPlugin.h - declaration of BuiltinDirectoryPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.cpp b/plugins/demo/DemoAuthentication.cpp index 36057e680..213c1f2ce 100644 --- a/plugins/demo/DemoAuthentication.cpp +++ b/plugins/demo/DemoAuthentication.cpp @@ -1,7 +1,7 @@ /* * DemoAuthentication.cpp - implementation of DemoAuthentication class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoAuthentication.h b/plugins/demo/DemoAuthentication.h index 744a28bf6..34d6cabe5 100644 --- a/plugins/demo/DemoAuthentication.h +++ b/plugins/demo/DemoAuthentication.h @@ -1,7 +1,7 @@ /* * DemoAuthentication.h - declaration of DemoAuthentication class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.cpp b/plugins/demo/DemoClient.cpp index 32d8a8f6e..5aa9c9247 100644 --- a/plugins/demo/DemoClient.cpp +++ b/plugins/demo/DemoClient.cpp @@ -1,7 +1,7 @@ /* * DemoClient.cpp - client widget for demo mode * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoClient.h b/plugins/demo/DemoClient.h index e0225c458..d46a5ff9c 100644 --- a/plugins/demo/DemoClient.h +++ b/plugins/demo/DemoClient.h @@ -1,7 +1,7 @@ /* * DemoClient.h - client for demo server * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfiguration.h b/plugins/demo/DemoConfiguration.h index 930f0ecf6..4d3b8bbc8 100644 --- a/plugins/demo/DemoConfiguration.h +++ b/plugins/demo/DemoConfiguration.h @@ -1,7 +1,7 @@ /* * DemoConfiguration.h - configuration values for Demo plugin * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.cpp b/plugins/demo/DemoConfigurationPage.cpp index a5e39f58f..76cc20226 100644 --- a/plugins/demo/DemoConfigurationPage.cpp +++ b/plugins/demo/DemoConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.cpp - implementation of DemoConfigurationPage * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoConfigurationPage.h b/plugins/demo/DemoConfigurationPage.h index 38b0a7cbd..d9d0fa062 100644 --- a/plugins/demo/DemoConfigurationPage.h +++ b/plugins/demo/DemoConfigurationPage.h @@ -1,7 +1,7 @@ /* * DemoConfigurationPage.h - header for the DemoConfigurationPage class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index fdf586878..6566af8c3 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.cpp - implementation of DemoFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoFeaturePlugin.h b/plugins/demo/DemoFeaturePlugin.h index 2ba844d49..fac6497ba 100644 --- a/plugins/demo/DemoFeaturePlugin.h +++ b/plugins/demo/DemoFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DemoFeaturePlugin.h - declaration of DemoFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 3f7783ad3..27b0f8b97 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServer.h b/plugins/demo/DemoServer.h index be00df5a1..16071e0bb 100644 --- a/plugins/demo/DemoServer.h +++ b/plugins/demo/DemoServer.h @@ -2,7 +2,7 @@ * DemoServer.h - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.cpp b/plugins/demo/DemoServerConnection.cpp index 4570cca58..041ab3cf8 100644 --- a/plugins/demo/DemoServerConnection.cpp +++ b/plugins/demo/DemoServerConnection.cpp @@ -2,7 +2,7 @@ * DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized * for lot of clients accessing server in read-only-mode) * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerConnection.h b/plugins/demo/DemoServerConnection.h index 74a52f4f1..58bdc32ea 100644 --- a/plugins/demo/DemoServerConnection.h +++ b/plugins/demo/DemoServerConnection.h @@ -1,7 +1,7 @@ /* * DemoServerConnection.h - header file for DemoServerConnection class * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.cpp b/plugins/demo/DemoServerProtocol.cpp index dee037f95..e89b465b6 100644 --- a/plugins/demo/DemoServerProtocol.cpp +++ b/plugins/demo/DemoServerProtocol.cpp @@ -1,7 +1,7 @@ /* * DemoServerProtocol.cpp - implementation of DemoServerProtocol class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/demo/DemoServerProtocol.h b/plugins/demo/DemoServerProtocol.h index 2c54b6d6f..9bf01eff8 100644 --- a/plugins/demo/DemoServerProtocol.h +++ b/plugins/demo/DemoServerProtocol.h @@ -1,7 +1,7 @@ /* * DemoServerProtocol.h - header file for DemoServerProtocol class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.cpp b/plugins/desktopservices/DesktopServiceObject.cpp index 98a861ad9..5b67335b0 100644 --- a/plugins/desktopservices/DesktopServiceObject.cpp +++ b/plugins/desktopservices/DesktopServiceObject.cpp @@ -1,7 +1,7 @@ /* * DesktopServiceObject.cpp - data class representing a desktop service object * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServiceObject.h b/plugins/desktopservices/DesktopServiceObject.h index 67281f0d4..888bbf013 100644 --- a/plugins/desktopservices/DesktopServiceObject.h +++ b/plugins/desktopservices/DesktopServiceObject.h @@ -1,7 +1,7 @@ /* * DesktopServiceObject.h - data class representing a desktop service object * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfiguration.h b/plugins/desktopservices/DesktopServicesConfiguration.h index 09d98f262..47db3a4bd 100644 --- a/plugins/desktopservices/DesktopServicesConfiguration.h +++ b/plugins/desktopservices/DesktopServicesConfiguration.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfiguration.h - configuration values for DesktopServices * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp index bd690becc..5611bb68f 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.cpp +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.cpp - implementation of the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesConfigurationPage.h b/plugins/desktopservices/DesktopServicesConfigurationPage.h index 3b261c2af..5894116fb 100644 --- a/plugins/desktopservices/DesktopServicesConfigurationPage.h +++ b/plugins/desktopservices/DesktopServicesConfigurationPage.h @@ -1,7 +1,7 @@ /* * DesktopServicesConfigurationPage.h - header for the DesktopServicesConfigurationPage class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index bc0c61319..b0631604f 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.cpp - implementation of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index 5d2e7392d..05bdca85f 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -1,7 +1,7 @@ /* * DesktopServicesFeaturePlugin.h - declaration of DesktopServicesFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.cpp b/plugins/desktopservices/OpenWebsiteDialog.cpp index 6ec68126c..6b3b30382 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.cpp +++ b/plugins/desktopservices/OpenWebsiteDialog.cpp @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.cpp - implementation of OpenWebsiteDialog * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/OpenWebsiteDialog.h b/plugins/desktopservices/OpenWebsiteDialog.h index 2e81a5844..ce607c0f2 100644 --- a/plugins/desktopservices/OpenWebsiteDialog.h +++ b/plugins/desktopservices/OpenWebsiteDialog.h @@ -1,7 +1,7 @@ /* * OpenWebsiteDialog.h - declaration of class OpenWebsiteDialog * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/desktopservices/StartAppDialog.cpp b/plugins/desktopservices/StartAppDialog.cpp index 53cfa3aa5..67499718f 100644 --- a/plugins/desktopservices/StartAppDialog.cpp +++ b/plugins/desktopservices/StartAppDialog.cpp @@ -1,7 +1,7 @@ /* * StartAppDialog.cpp - implementation of StartAppDialog * - * Copyright (c) 2004-2024 Tobias Junghans + * Copyright (c) 2004-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/desktopservices/StartAppDialog.h b/plugins/desktopservices/StartAppDialog.h index fafe0ea56..4def30246 100644 --- a/plugins/desktopservices/StartAppDialog.h +++ b/plugins/desktopservices/StartAppDialog.h @@ -1,7 +1,7 @@ /* * StartAppDialog.h - declaration of class StartAppDialog * - * Copyright (c) 2004-2024 Tobias Junghans + * Copyright (c) 2004-2025 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileReadThread.cpp b/plugins/filetransfer/FileReadThread.cpp index 273115369..b46d868b2 100644 --- a/plugins/filetransfer/FileReadThread.cpp +++ b/plugins/filetransfer/FileReadThread.cpp @@ -1,7 +1,7 @@ /* * FileReadThread.cpp - implementation of FileReadThread class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileReadThread.h b/plugins/filetransfer/FileReadThread.h index 9134af84f..34172235c 100644 --- a/plugins/filetransfer/FileReadThread.h +++ b/plugins/filetransfer/FileReadThread.h @@ -1,7 +1,7 @@ /* * FileReadThread.h - declaration of FileReadThread class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfiguration.h b/plugins/filetransfer/FileTransferConfiguration.h index 81d04ea6f..430977bc7 100644 --- a/plugins/filetransfer/FileTransferConfiguration.h +++ b/plugins/filetransfer/FileTransferConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferConfiguration.h - configuration values for FileTransfer plugin * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.cpp b/plugins/filetransfer/FileTransferConfigurationPage.cpp index e69974b5b..2faab7d7d 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.cpp +++ b/plugins/filetransfer/FileTransferConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.cpp - implementation of FileTransferConfigurationPage * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferConfigurationPage.h b/plugins/filetransfer/FileTransferConfigurationPage.h index 6409f1962..1b30426f7 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.h +++ b/plugins/filetransfer/FileTransferConfigurationPage.h @@ -1,7 +1,7 @@ /* * FileTransferConfigurationPage.h - header for the FileTransferConfigurationPage class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.cpp b/plugins/filetransfer/FileTransferController.cpp index 068604251..bfc804b10 100644 --- a/plugins/filetransfer/FileTransferController.cpp +++ b/plugins/filetransfer/FileTransferController.cpp @@ -1,7 +1,7 @@ /* * FileTransferController.cpp - implementation of FileTransferController class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferController.h b/plugins/filetransfer/FileTransferController.h index 7b9e9edc4..4181c4130 100644 --- a/plugins/filetransfer/FileTransferController.h +++ b/plugins/filetransfer/FileTransferController.h @@ -1,7 +1,7 @@ /* * FileTransferController.h - declaration of FileTransferController class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.cpp b/plugins/filetransfer/FileTransferDialog.cpp index 4cc9c9d14..c8d47acf4 100644 --- a/plugins/filetransfer/FileTransferDialog.cpp +++ b/plugins/filetransfer/FileTransferDialog.cpp @@ -1,7 +1,7 @@ /* * FileTransferDialog.cpp - implementation of FileTransferDialog * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferDialog.h b/plugins/filetransfer/FileTransferDialog.h index bf8bbc0ca..ff9b4b168 100644 --- a/plugins/filetransfer/FileTransferDialog.h +++ b/plugins/filetransfer/FileTransferDialog.h @@ -1,7 +1,7 @@ /* * FileTransferDialog.h - declaration of class FileTransferDialog * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public diff --git a/plugins/filetransfer/FileTransferListModel.cpp b/plugins/filetransfer/FileTransferListModel.cpp index 579442358..94a5000af 100644 --- a/plugins/filetransfer/FileTransferListModel.cpp +++ b/plugins/filetransfer/FileTransferListModel.cpp @@ -1,7 +1,7 @@ /* * FileTransferListModel.cpp - implementation of FileTransferListModel class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferListModel.h b/plugins/filetransfer/FileTransferListModel.h index 945d9c675..a25b16b7c 100644 --- a/plugins/filetransfer/FileTransferListModel.h +++ b/plugins/filetransfer/FileTransferListModel.h @@ -1,7 +1,7 @@ /* * FileTransferListModel.h - declaration of FileTransferListModel class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.cpp b/plugins/filetransfer/FileTransferPlugin.cpp index c8bdab984..b163242b1 100644 --- a/plugins/filetransfer/FileTransferPlugin.cpp +++ b/plugins/filetransfer/FileTransferPlugin.cpp @@ -1,7 +1,7 @@ /* * FileTransferPlugin.cpp - implementation of FileTransferPlugin class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferPlugin.h b/plugins/filetransfer/FileTransferPlugin.h index 40cf40162..3e3ab1e94 100644 --- a/plugins/filetransfer/FileTransferPlugin.h +++ b/plugins/filetransfer/FileTransferPlugin.h @@ -1,7 +1,7 @@ /* * FileTransferPlugin.h - declaration of FileTransferPlugin class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/filetransfer/FileTransferUserConfiguration.h b/plugins/filetransfer/FileTransferUserConfiguration.h index a49135aa3..8ca1de001 100644 --- a/plugins/filetransfer/FileTransferUserConfiguration.h +++ b/plugins/filetransfer/FileTransferUserConfiguration.h @@ -1,7 +1,7 @@ /* * FileTransferUserConfiguration.h - user config values for file transfer * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/ldap/AuthLdapConfiguration.h b/plugins/ldap/AuthLdapConfiguration.h index bd13bd828..d400858d4 100644 --- a/plugins/ldap/AuthLdapConfiguration.h +++ b/plugins/ldap/AuthLdapConfiguration.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapConfigurationWidget.cpp b/plugins/ldap/AuthLdapConfigurationWidget.cpp index f5bfbe02c..4a377d746 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.cpp +++ b/plugins/ldap/AuthLdapConfigurationWidget.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapConfigurationWidget.h b/plugins/ldap/AuthLdapConfigurationWidget.h index aca7b9fa8..913b38faf 100644 --- a/plugins/ldap/AuthLdapConfigurationWidget.h +++ b/plugins/ldap/AuthLdapConfigurationWidget.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapCore.cpp b/plugins/ldap/AuthLdapCore.cpp index f6d150fc1..7ee50de18 100644 --- a/plugins/ldap/AuthLdapCore.cpp +++ b/plugins/ldap/AuthLdapCore.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapCore.h b/plugins/ldap/AuthLdapCore.h index f7b01abdd..b441aea1d 100644 --- a/plugins/ldap/AuthLdapCore.h +++ b/plugins/ldap/AuthLdapCore.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapDialog.cpp b/plugins/ldap/AuthLdapDialog.cpp index e582061e9..f9b9e6e09 100644 --- a/plugins/ldap/AuthLdapDialog.cpp +++ b/plugins/ldap/AuthLdapDialog.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/AuthLdapDialog.h b/plugins/ldap/AuthLdapDialog.h index 3890d2609..4b936035e 100644 --- a/plugins/ldap/AuthLdapDialog.h +++ b/plugins/ldap/AuthLdapDialog.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/LdapPlugin.cpp b/plugins/ldap/LdapPlugin.cpp index 7536c3949..ab36a693b 100644 --- a/plugins/ldap/LdapPlugin.cpp +++ b/plugins/ldap/LdapPlugin.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/LdapPlugin.h b/plugins/ldap/LdapPlugin.h index 18f780a89..5d47e2141 100644 --- a/plugins/ldap/LdapPlugin.h +++ b/plugins/ldap/LdapPlugin.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapBrowseDialog.cpp b/plugins/ldap/common/LdapBrowseDialog.cpp index 522986293..dae5bfdea 100644 --- a/plugins/ldap/common/LdapBrowseDialog.cpp +++ b/plugins/ldap/common/LdapBrowseDialog.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapBrowseDialog.h b/plugins/ldap/common/LdapBrowseDialog.h index 42e90400c..3b0648f33 100644 --- a/plugins/ldap/common/LdapBrowseDialog.h +++ b/plugins/ldap/common/LdapBrowseDialog.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapBrowseModel.cpp b/plugins/ldap/common/LdapBrowseModel.cpp index cf4070aca..96c643433 100644 --- a/plugins/ldap/common/LdapBrowseModel.cpp +++ b/plugins/ldap/common/LdapBrowseModel.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapBrowseModel.h b/plugins/ldap/common/LdapBrowseModel.h index a7c03c772..2f6fa0615 100644 --- a/plugins/ldap/common/LdapBrowseModel.h +++ b/plugins/ldap/common/LdapBrowseModel.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapClient.cpp b/plugins/ldap/common/LdapClient.cpp index a6425184d..5d535139c 100644 --- a/plugins/ldap/common/LdapClient.cpp +++ b/plugins/ldap/common/LdapClient.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapClient.h b/plugins/ldap/common/LdapClient.h index 4452be63b..a06d0ab80 100644 --- a/plugins/ldap/common/LdapClient.h +++ b/plugins/ldap/common/LdapClient.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapCommon.h b/plugins/ldap/common/LdapCommon.h index 151bd8a45..65949459a 100644 --- a/plugins/ldap/common/LdapCommon.h +++ b/plugins/ldap/common/LdapCommon.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfiguration.cpp b/plugins/ldap/common/LdapConfiguration.cpp index b14c154bb..3a204263f 100644 --- a/plugins/ldap/common/LdapConfiguration.cpp +++ b/plugins/ldap/common/LdapConfiguration.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index 09c07e5cf..d6131e230 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfigurationPage.cpp b/plugins/ldap/common/LdapConfigurationPage.cpp index 563c51a55..0d01d2bf1 100644 --- a/plugins/ldap/common/LdapConfigurationPage.cpp +++ b/plugins/ldap/common/LdapConfigurationPage.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfigurationPage.h b/plugins/ldap/common/LdapConfigurationPage.h index 887bbe16f..ab2c77fe6 100644 --- a/plugins/ldap/common/LdapConfigurationPage.h +++ b/plugins/ldap/common/LdapConfigurationPage.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfigurationTest.cpp b/plugins/ldap/common/LdapConfigurationTest.cpp index 67cc811b2..d51241e5b 100644 --- a/plugins/ldap/common/LdapConfigurationTest.cpp +++ b/plugins/ldap/common/LdapConfigurationTest.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapConfigurationTest.h b/plugins/ldap/common/LdapConfigurationTest.h index bcb13a085..dea63a1f2 100644 --- a/plugins/ldap/common/LdapConfigurationTest.h +++ b/plugins/ldap/common/LdapConfigurationTest.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index 1e8798db6..245bedc24 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapDirectory.h b/plugins/ldap/common/LdapDirectory.h index 03640533a..2462fa6d2 100644 --- a/plugins/ldap/common/LdapDirectory.h +++ b/plugins/ldap/common/LdapDirectory.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index 72eafb7b7..86dffdb30 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.h b/plugins/ldap/common/LdapNetworkObjectDirectory.h index c0f05b9ce..8e90ebde5 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp index d1b8c0b24..1bbd7ee73 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h index 3135f1bc6..224cd7f84 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectoryConfigurationPage.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/KLdapIntegration.cpp b/plugins/ldap/kldap/KLdapIntegration.cpp index 25a46842f..f0afdbfd0 100644 --- a/plugins/ldap/kldap/KLdapIntegration.cpp +++ b/plugins/ldap/kldap/KLdapIntegration.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2016-2024 Tobias Junghans +// Copyright (c) 2016-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/kldap_core_export.h b/plugins/ldap/kldap/kldap_core_export.h index 775fe2089..2754058d8 100644 --- a/plugins/ldap/kldap/kldap_core_export.h +++ b/plugins/ldap/kldap/kldap_core_export.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/kldap_export.h b/plugins/ldap/kldap/kldap_export.h index 04d225d09..1f27b1a70 100644 --- a/plugins/ldap/kldap/kldap_export.h +++ b/plugins/ldap/kldap/kldap_export.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/klocalizedstring.h b/plugins/ldap/kldap/klocalizedstring.h index 22e946ae4..e0ca23143 100644 --- a/plugins/ldap/kldap/klocalizedstring.h +++ b/plugins/ldap/kldap/klocalizedstring.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/ldap_core_debug.h b/plugins/ldap/kldap/ldap_core_debug.h index c3aea7c38..9d7a93c6c 100644 --- a/plugins/ldap/kldap/ldap_core_debug.h +++ b/plugins/ldap/kldap/ldap_core_debug.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/ldap/kldap/ldap_debug.h b/plugins/ldap/kldap/ldap_debug.h index 442f7aa7a..83d17c201 100644 --- a/plugins/ldap/kldap/ldap_debug.h +++ b/plugins/ldap/kldap/ldap_debug.h @@ -1,4 +1,4 @@ -// Copyright (c) 2019-2024 Tobias Junghans +// Copyright (c) 2019-2025 Tobias Junghans // This file is part of Veyon - https://veyon.io // SPDX-License-Identifier: LGPL-2.0-or-later diff --git a/plugins/platform/common/LogonHelper.cpp b/plugins/platform/common/LogonHelper.cpp index e592dec1f..639e9e2b2 100644 --- a/plugins/platform/common/LogonHelper.cpp +++ b/plugins/platform/common/LogonHelper.cpp @@ -1,7 +1,7 @@ /* * LogonHelper.cpp - implementation of LogonHelper class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/LogonHelper.h b/plugins/platform/common/LogonHelper.h index 35867f07d..c8a5add34 100644 --- a/plugins/platform/common/LogonHelper.h +++ b/plugins/platform/common/LogonHelper.h @@ -1,7 +1,7 @@ /* * LogonHelper.h - declaration of LogonHelper class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.cpp b/plugins/platform/common/PersistentLogonCredentials.cpp index a811ce9b0..1894a45fa 100644 --- a/plugins/platform/common/PersistentLogonCredentials.cpp +++ b/plugins/platform/common/PersistentLogonCredentials.cpp @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.cpp - implementation of PersistentLogonCredentials class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PersistentLogonCredentials.h b/plugins/platform/common/PersistentLogonCredentials.h index b37099d82..f2198d2b0 100644 --- a/plugins/platform/common/PersistentLogonCredentials.h +++ b/plugins/platform/common/PersistentLogonCredentials.h @@ -1,7 +1,7 @@ /* * PersistentLogonCredentials.h - declaration of PersistentLogonCredentials class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.cpp b/plugins/platform/common/PlatformSessionManager.cpp index 3727eabbf..b7ce11b17 100644 --- a/plugins/platform/common/PlatformSessionManager.cpp +++ b/plugins/platform/common/PlatformSessionManager.cpp @@ -1,7 +1,7 @@ /* * PlatformSessionManager.cpp - implementation of PlatformSessionManager class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/PlatformSessionManager.h b/plugins/platform/common/PlatformSessionManager.h index 67a2f5b09..dd7db10fc 100644 --- a/plugins/platform/common/PlatformSessionManager.h +++ b/plugins/platform/common/PlatformSessionManager.h @@ -1,7 +1,7 @@ /* * PlatformSessionManager.h - declaration of PlatformSessionManager class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.cpp b/plugins/platform/common/ServiceDataManager.cpp index 3bf0c19ba..07a74c230 100644 --- a/plugins/platform/common/ServiceDataManager.cpp +++ b/plugins/platform/common/ServiceDataManager.cpp @@ -1,7 +1,7 @@ /* * ServiceDataManager.cpp - implementation of ServiceDataManager class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/common/ServiceDataManager.h b/plugins/platform/common/ServiceDataManager.h index 22afe41f5..474a23d28 100644 --- a/plugins/platform/common/ServiceDataManager.h +++ b/plugins/platform/common/ServiceDataManager.h @@ -1,7 +1,7 @@ /* * ServiceDataManager.h - header file for ServiceDataManager class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.cpp b/plugins/platform/linux/LinuxCoreFunctions.cpp index f9665f52b..651849946 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.cpp +++ b/plugins/platform/linux/LinuxCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.cpp - implementation of LinuxCoreFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxCoreFunctions.h b/plugins/platform/linux/LinuxCoreFunctions.h index 72f219bad..a7d79341c 100644 --- a/plugins/platform/linux/LinuxCoreFunctions.h +++ b/plugins/platform/linux/LinuxCoreFunctions.h @@ -1,7 +1,7 @@ /* * LinuxCoreFunctions.h - declaration of LinuxCoreFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxDesktopIntegration.h b/plugins/platform/linux/LinuxDesktopIntegration.h index e606fc854..7cadb2c31 100644 --- a/plugins/platform/linux/LinuxDesktopIntegration.h +++ b/plugins/platform/linux/LinuxDesktopIntegration.h @@ -1,7 +1,7 @@ /* * LinuxDesktopIntegration.h - declaration of LinuxDesktopIntegration class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.cpp b/plugins/platform/linux/LinuxFilesystemFunctions.cpp index 8ed79d5ca..4d02938fa 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.cpp +++ b/plugins/platform/linux/LinuxFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.cpp - implementation of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxFilesystemFunctions.h b/plugins/platform/linux/LinuxFilesystemFunctions.h index 2bcae6c36..2cb424187 100644 --- a/plugins/platform/linux/LinuxFilesystemFunctions.h +++ b/plugins/platform/linux/LinuxFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * LinuxFilesystemFunctions.h - declaration of LinuxFilesystemFunctions class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp index 93d0438c8..95e32adb0 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.cpp +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.cpp - implementation of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxInputDeviceFunctions.h b/plugins/platform/linux/LinuxInputDeviceFunctions.h index 99d919df1..cae3a5553 100644 --- a/plugins/platform/linux/LinuxInputDeviceFunctions.h +++ b/plugins/platform/linux/LinuxInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxInputDeviceFunctions.h - declaration of LinuxInputDeviceFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.cpp b/plugins/platform/linux/LinuxKeyboardInput.cpp index db1e0ab67..6c89737d6 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.cpp +++ b/plugins/platform/linux/LinuxKeyboardInput.cpp @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.cpp - implementation of LinuxKeyboardInput class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardInput.h b/plugins/platform/linux/LinuxKeyboardInput.h index c503ac1e8..5936c5681 100644 --- a/plugins/platform/linux/LinuxKeyboardInput.h +++ b/plugins/platform/linux/LinuxKeyboardInput.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardInput.h - declaration of LinuxKeyboardInput class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h index d74b5b142..f0a05720f 100644 --- a/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h +++ b/plugins/platform/linux/LinuxKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * LinuxKeyboardShortcutTrapper.h - dummy KeyboardShortcutTrapper implementation * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.cpp b/plugins/platform/linux/LinuxNetworkFunctions.cpp index b2db3699d..98f5f3b3a 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.cpp +++ b/plugins/platform/linux/LinuxNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.cpp - implementation of LinuxNetworkFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxNetworkFunctions.h b/plugins/platform/linux/LinuxNetworkFunctions.h index 8efd3b824..73f9750e9 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.h +++ b/plugins/platform/linux/LinuxNetworkFunctions.h @@ -1,7 +1,7 @@ /* * LinuxNetworkFunctions.h - declaration of LinuxNetworkFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfiguration.h b/plugins/platform/linux/LinuxPlatformConfiguration.h index ae3eb14d8..1ab49d95c 100644 --- a/plugins/platform/linux/LinuxPlatformConfiguration.h +++ b/plugins/platform/linux/LinuxPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfiguration.h - configuration values for LinuxPlatform plugin * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp index 5afdf07ab..87daa345e 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformConfigurationPage.h b/plugins/platform/linux/LinuxPlatformConfigurationPage.h index d5909f23b..f6f6df1a7 100644 --- a/plugins/platform/linux/LinuxPlatformConfigurationPage.h +++ b/plugins/platform/linux/LinuxPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * LinuxPlatformConfigurationPage.h - header for the LinuxPlatformConfigurationPage class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.cpp b/plugins/platform/linux/LinuxPlatformPlugin.cpp index bfe9bb672..e85c228e3 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.cpp +++ b/plugins/platform/linux/LinuxPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.cpp - implementation of LinuxPlatformPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxPlatformPlugin.h b/plugins/platform/linux/LinuxPlatformPlugin.h index 92095a070..14b6daf84 100644 --- a/plugins/platform/linux/LinuxPlatformPlugin.h +++ b/plugins/platform/linux/LinuxPlatformPlugin.h @@ -1,7 +1,7 @@ /* * LinuxPlatformPlugin.h - declaration of LinuxPlatformPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServerProcess.cpp b/plugins/platform/linux/LinuxServerProcess.cpp index c9f335576..bc4030f69 100644 --- a/plugins/platform/linux/LinuxServerProcess.cpp +++ b/plugins/platform/linux/LinuxServerProcess.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServerProcess class * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServerProcess.h b/plugins/platform/linux/LinuxServerProcess.h index 07c1a7fd7..d7070cc3d 100644 --- a/plugins/platform/linux/LinuxServerProcess.h +++ b/plugins/platform/linux/LinuxServerProcess.h @@ -1,7 +1,7 @@ /* * LinuxServerProcess.h - declaration of LinuxServerProcess class * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.cpp b/plugins/platform/linux/LinuxServiceCore.cpp index 5a34d5cec..83985441a 100644 --- a/plugins/platform/linux/LinuxServiceCore.cpp +++ b/plugins/platform/linux/LinuxServiceCore.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceCore.h b/plugins/platform/linux/LinuxServiceCore.h index db386a720..4c0939c66 100644 --- a/plugins/platform/linux/LinuxServiceCore.h +++ b/plugins/platform/linux/LinuxServiceCore.h @@ -1,7 +1,7 @@ /* * LinuxServiceCore.h - declaration of LinuxServiceCore class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.cpp b/plugins/platform/linux/LinuxServiceFunctions.cpp index ff580c5ec..b60a8f347 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.cpp +++ b/plugins/platform/linux/LinuxServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.cpp - implementation of LinuxServiceFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxServiceFunctions.h b/plugins/platform/linux/LinuxServiceFunctions.h index 0ca47f163..ada1eda94 100644 --- a/plugins/platform/linux/LinuxServiceFunctions.h +++ b/plugins/platform/linux/LinuxServiceFunctions.h @@ -1,7 +1,7 @@ /* * LinuxServiceFunctions.h - declaration of LinuxServiceFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.cpp b/plugins/platform/linux/LinuxSessionFunctions.cpp index 1608b274a..ec40ccd9a 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.cpp +++ b/plugins/platform/linux/LinuxSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.cpp - implementation of LinuxSessionFunctions class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxSessionFunctions.h b/plugins/platform/linux/LinuxSessionFunctions.h index c582df4d9..7567ed8a4 100644 --- a/plugins/platform/linux/LinuxSessionFunctions.h +++ b/plugins/platform/linux/LinuxSessionFunctions.h @@ -1,7 +1,7 @@ /* * LinuxSessionFunctions.h - declaration of LinuxSessionFunctions class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.cpp b/plugins/platform/linux/LinuxUserFunctions.cpp index 4bf6b8b65..39f94ea19 100644 --- a/plugins/platform/linux/LinuxUserFunctions.cpp +++ b/plugins/platform/linux/LinuxUserFunctions.cpp @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.cpp - implementation of LinuxUserFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/LinuxUserFunctions.h b/plugins/platform/linux/LinuxUserFunctions.h index 995126a3f..a23dd09b5 100644 --- a/plugins/platform/linux/LinuxUserFunctions.h +++ b/plugins/platform/linux/LinuxUserFunctions.h @@ -1,7 +1,7 @@ /* * LinuxUserFunctions.h - declaration of LinuxUserFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp index c7ed921d6..f8f75abed 100644 --- a/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp +++ b/plugins/platform/linux/auth-helper/VeyonAuthHelper.cpp @@ -1,7 +1,7 @@ /* * VeyonAuthHelper.cpp - main file for Veyon Authentication Helper * - * Copyright (c) 2010-2024 Tobias Junghans + * Copyright (c) 2010-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.cpp b/plugins/platform/windows/DesktopInputController.cpp index 5a20ed0e9..22a59a777 100644 --- a/plugins/platform/windows/DesktopInputController.cpp +++ b/plugins/platform/windows/DesktopInputController.cpp @@ -1,7 +1,7 @@ /* * DesktopInputController.cpp - implementation of DesktopInputController class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/DesktopInputController.h b/plugins/platform/windows/DesktopInputController.h index af9a1c06b..0b002bdc5 100644 --- a/plugins/platform/windows/DesktopInputController.h +++ b/plugins/platform/windows/DesktopInputController.h @@ -1,7 +1,7 @@ /* * DesktopInputController.h - declaration of DesktopInputController class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.cpp b/plugins/platform/windows/SasEventListener.cpp index a63150375..f7f264a66 100644 --- a/plugins/platform/windows/SasEventListener.cpp +++ b/plugins/platform/windows/SasEventListener.cpp @@ -1,7 +1,7 @@ /* * SasEventListener.cpp - implementation of SasEventListener class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/SasEventListener.h b/plugins/platform/windows/SasEventListener.h index dd59d6367..cf1b0c43d 100644 --- a/plugins/platform/windows/SasEventListener.h +++ b/plugins/platform/windows/SasEventListener.h @@ -1,7 +1,7 @@ /* * SasEventListener.h - header file for SasEventListener class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index 8530d6296..a0a132abd 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.cpp - implementation of WindowsCoreFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsCoreFunctions.h b/plugins/platform/windows/WindowsCoreFunctions.h index a589f7e34..d81b2805c 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.h +++ b/plugins/platform/windows/WindowsCoreFunctions.h @@ -1,7 +1,7 @@ /* * WindowsCoreFunctions.h - declaration of WindowsCoreFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.cpp b/plugins/platform/windows/WindowsFilesystemFunctions.cpp index 8e2ea06cd..6678019ce 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.cpp +++ b/plugins/platform/windows/WindowsFilesystemFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.cpp - implementation of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsFilesystemFunctions.h b/plugins/platform/windows/WindowsFilesystemFunctions.h index d59905f78..54815e7a3 100644 --- a/plugins/platform/windows/WindowsFilesystemFunctions.h +++ b/plugins/platform/windows/WindowsFilesystemFunctions.h @@ -1,7 +1,7 @@ /* * WindowsFilesystemFunctions.h - declaration of WindowsFilesystemFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp index 1672c861c..a7f6b2d4c 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.cpp +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.cpp - implementation of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsInputDeviceFunctions.h b/plugins/platform/windows/WindowsInputDeviceFunctions.h index 0e3d41523..734ace705 100644 --- a/plugins/platform/windows/WindowsInputDeviceFunctions.h +++ b/plugins/platform/windows/WindowsInputDeviceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsInputDeviceFunctions.h - declaration of WindowsInputDeviceFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp index c21abb5ff..14d20e4b6 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.cpp @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h index d644129cd..2cc003c83 100644 --- a/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h +++ b/plugins/platform/windows/WindowsKeyboardShortcutTrapper.h @@ -1,7 +1,7 @@ /* * WindowsKeyboardShortcutTrapper.cpp - class for trapping shortcuts on Windows * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.cpp b/plugins/platform/windows/WindowsNetworkFunctions.cpp index 80393230e..218aab410 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.cpp +++ b/plugins/platform/windows/WindowsNetworkFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.cpp - implementation of WindowsNetworkFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsNetworkFunctions.h b/plugins/platform/windows/WindowsNetworkFunctions.h index 76d8c4024..99a4cdb0c 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.h +++ b/plugins/platform/windows/WindowsNetworkFunctions.h @@ -1,7 +1,7 @@ /* * WindowsNetworkFunctions.h - declaration of WindowsNetworkFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfiguration.h b/plugins/platform/windows/WindowsPlatformConfiguration.h index a2d9d7cf6..c01ad98f7 100644 --- a/plugins/platform/windows/WindowsPlatformConfiguration.h +++ b/plugins/platform/windows/WindowsPlatformConfiguration.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfiguration.h - configuration values for WindowsPlatform plugin * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp index 759501b51..4ed9e640b 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.cpp - page for configuring service application * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.h b/plugins/platform/windows/WindowsPlatformConfigurationPage.h index 42c0b1fb5..facddc021 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.h +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.h @@ -1,7 +1,7 @@ /* * WindowsPlatformConfigurationPage.h - header for the WindowsPlatformConfigurationPage class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.cpp b/plugins/platform/windows/WindowsPlatformPlugin.cpp index 6e0ac41ab..809f7e898 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.cpp +++ b/plugins/platform/windows/WindowsPlatformPlugin.cpp @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.cpp - implementation of WindowsPlatformPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsPlatformPlugin.h b/plugins/platform/windows/WindowsPlatformPlugin.h index 6c2925a35..89b4ccad3 100644 --- a/plugins/platform/windows/WindowsPlatformPlugin.h +++ b/plugins/platform/windows/WindowsPlatformPlugin.h @@ -1,7 +1,7 @@ /* * WindowsPlatformPlugin.h - declaration of WindowsPlatformPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 4ff9e0600..6224b74c1 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceControl.h - class for managing a Windows service * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceControl.h b/plugins/platform/windows/WindowsServiceControl.h index 9b332dc40..30400f108 100644 --- a/plugins/platform/windows/WindowsServiceControl.h +++ b/plugins/platform/windows/WindowsServiceControl.h @@ -1,7 +1,7 @@ /* * WindowsService.h - class for managing a Windows service * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.cpp b/plugins/platform/windows/WindowsServiceCore.cpp index 0b9cc32ea..9fe3e95a9 100644 --- a/plugins/platform/windows/WindowsServiceCore.cpp +++ b/plugins/platform/windows/WindowsServiceCore.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceCore.cpp - implementation of WindowsServiceCore class * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceCore.h b/plugins/platform/windows/WindowsServiceCore.h index 37a40314e..06989570f 100644 --- a/plugins/platform/windows/WindowsServiceCore.h +++ b/plugins/platform/windows/WindowsServiceCore.h @@ -1,7 +1,7 @@ /* * WindowsServiceCore.h - header file for WindowsServiceCore class * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.cpp b/plugins/platform/windows/WindowsServiceFunctions.cpp index 0fc756032..c3fe4c9be 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.cpp +++ b/plugins/platform/windows/WindowsServiceFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.cpp - implementation of WindowsServiceFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsServiceFunctions.h b/plugins/platform/windows/WindowsServiceFunctions.h index 1da6e7249..2d8f5b715 100644 --- a/plugins/platform/windows/WindowsServiceFunctions.h +++ b/plugins/platform/windows/WindowsServiceFunctions.h @@ -1,7 +1,7 @@ /* * WindowsServiceFunctions.h - declaration of WindowsServiceFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index de1949878..a8590e7d5 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.cpp - implementation of WindowsSessionFunctions class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index e8f96905d..d596da2ce 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -1,7 +1,7 @@ /* * WindowsSessionFunctions.h - declaration of WindowsSessionFunctions class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.cpp b/plugins/platform/windows/WindowsUserFunctions.cpp index ff263f5af..7aae0c2ad 100644 --- a/plugins/platform/windows/WindowsUserFunctions.cpp +++ b/plugins/platform/windows/WindowsUserFunctions.cpp @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.cpp - implementation of WindowsUserFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WindowsUserFunctions.h b/plugins/platform/windows/WindowsUserFunctions.h index cbffdc9bf..0f53b8754 100644 --- a/plugins/platform/windows/WindowsUserFunctions.h +++ b/plugins/platform/windows/WindowsUserFunctions.h @@ -1,7 +1,7 @@ /* * WindowsUserFunctions.h - declaration of WindowsUserFunctions class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 160e9658c..9457c30ce 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -1,7 +1,7 @@ /* * WtsSessionManager.cpp - implementation of WtsSessionManager class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/platform/windows/WtsSessionManager.h b/plugins/platform/windows/WtsSessionManager.h index 4f12e4b84..165ee06f8 100644 --- a/plugins/platform/windows/WtsSessionManager.h +++ b/plugins/platform/windows/WtsSessionManager.h @@ -1,7 +1,7 @@ /* * WtsSessionManager.h - header file for WtsSessionManager class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.cpp b/plugins/powercontrol/PowerControlFeaturePlugin.cpp index 627eeb603..58594dd99 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.cpp +++ b/plugins/powercontrol/PowerControlFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.cpp - implementation of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerControlFeaturePlugin.h b/plugins/powercontrol/PowerControlFeaturePlugin.h index c5757d665..37d4cc9fc 100644 --- a/plugins/powercontrol/PowerControlFeaturePlugin.h +++ b/plugins/powercontrol/PowerControlFeaturePlugin.h @@ -1,7 +1,7 @@ /* * PowerControlFeaturePlugin.h - declaration of PowerControlFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.cpp b/plugins/powercontrol/PowerDownTimeInputDialog.cpp index 856218dba..ecc13bf91 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.cpp +++ b/plugins/powercontrol/PowerDownTimeInputDialog.cpp @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - implementation of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/powercontrol/PowerDownTimeInputDialog.h b/plugins/powercontrol/PowerDownTimeInputDialog.h index 2550248b2..cbda224c2 100644 --- a/plugins/powercontrol/PowerDownTimeInputDialog.h +++ b/plugins/powercontrol/PowerDownTimeInputDialog.h @@ -1,7 +1,7 @@ /* * PowerDownTimeInputDialog.h - declaration of PowerDownTimeInputDialog class * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 8cad061e9..40f65158f 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.cpp - implementation of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h index 400b4cbe3..b34873ccf 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.h +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.h @@ -1,7 +1,7 @@ /* * RemoteAccessFeaturePlugin.h - declaration of RemoteAccessFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.cpp b/plugins/remoteaccess/RemoteAccessPage.cpp index 4861d9da1..a3697a2f5 100644 --- a/plugins/remoteaccess/RemoteAccessPage.cpp +++ b/plugins/remoteaccess/RemoteAccessPage.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessPage.h b/plugins/remoteaccess/RemoteAccessPage.h index d7df133f3..1a1ee2fb4 100644 --- a/plugins/remoteaccess/RemoteAccessPage.h +++ b/plugins/remoteaccess/RemoteAccessPage.h @@ -1,7 +1,7 @@ /* * RemoteAccessPage.h - logic for RemoteAccessPage * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index a5399b5f0..79b551c61 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.cpp - widget containing a VNC-view and controls for it * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/remoteaccess/RemoteAccessWidget.h b/plugins/remoteaccess/RemoteAccessWidget.h index 97ba060ff..03618e8e0 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.h +++ b/plugins/remoteaccess/RemoteAccessWidget.h @@ -1,7 +1,7 @@ /* * RemoteAccessWidget.h - widget containing a VNC view and controls for it * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.cpp b/plugins/screenlock/ScreenLockFeaturePlugin.cpp index 92ae8ae15..c45c959f4 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.cpp +++ b/plugins/screenlock/ScreenLockFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.cpp - implementation of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenlock/ScreenLockFeaturePlugin.h b/plugins/screenlock/ScreenLockFeaturePlugin.h index cf1e1b86f..f3387931b 100644 --- a/plugins/screenlock/ScreenLockFeaturePlugin.h +++ b/plugins/screenlock/ScreenLockFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenLockFeaturePlugin.h - declaration of ScreenLockFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.cpp b/plugins/screenshot/ScreenshotFeaturePlugin.cpp index c99e28916..1dcaf3a3f 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.cpp +++ b/plugins/screenshot/ScreenshotFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.cpp - implementation of ScreenshotFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotFeaturePlugin.h b/plugins/screenshot/ScreenshotFeaturePlugin.h index b458e5d99..b28400aad 100644 --- a/plugins/screenshot/ScreenshotFeaturePlugin.h +++ b/plugins/screenshot/ScreenshotFeaturePlugin.h @@ -1,7 +1,7 @@ /* * ScreenshotFeaturePlugin.h - declaration of ScreenshotFeature class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotListModel.cpp b/plugins/screenshot/ScreenshotListModel.cpp index bcbb33b3e..0c01f1794 100644 --- a/plugins/screenshot/ScreenshotListModel.cpp +++ b/plugins/screenshot/ScreenshotListModel.cpp @@ -1,7 +1,7 @@ /* * ScreenshotListModel.cpp - implementation of ScreenshotListModel * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/screenshot/ScreenshotListModel.h b/plugins/screenshot/ScreenshotListModel.h index 57bb2a574..8e3e9e332 100644 --- a/plugins/screenshot/ScreenshotListModel.h +++ b/plugins/screenshot/ScreenshotListModel.h @@ -1,7 +1,7 @@ /* * ScreenshotListModel.h - declaration of ScreenshotListModel * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp index 8d80d7265..f965d2504 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.cpp +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.cpp @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.cpp - implementation of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/systemusergroups/SystemUserGroupsPlugin.h b/plugins/systemusergroups/SystemUserGroupsPlugin.h index 9fc2d06cf..b8912c5cc 100644 --- a/plugins/systemusergroups/SystemUserGroupsPlugin.h +++ b/plugins/systemusergroups/SystemUserGroupsPlugin.h @@ -1,7 +1,7 @@ /* * SystemUserGroupsPlugin.h - declaration of SystemUserGroupsPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.cpp b/plugins/testing/TestingCommandLinePlugin.cpp index 91ab9f5d2..ee67b6abe 100644 --- a/plugins/testing/TestingCommandLinePlugin.cpp +++ b/plugins/testing/TestingCommandLinePlugin.cpp @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.cpp - implementation of TestingCommandLinePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/testing/TestingCommandLinePlugin.h b/plugins/testing/TestingCommandLinePlugin.h index 1b3cd1ac7..f265415b0 100644 --- a/plugins/testing/TestingCommandLinePlugin.h +++ b/plugins/testing/TestingCommandLinePlugin.h @@ -1,7 +1,7 @@ /* * TestingCommandLinePlugin.h - declaration of TestingCommandLinePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.cpp b/plugins/textmessage/TextMessageDialog.cpp index 98a540d51..1abe5333d 100644 --- a/plugins/textmessage/TextMessageDialog.cpp +++ b/plugins/textmessage/TextMessageDialog.cpp @@ -1,7 +1,7 @@ /* * TextMessageDialog.cpp - implementation of text message dialog class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageDialog.h b/plugins/textmessage/TextMessageDialog.h index 7890ab6cb..3fb507362 100644 --- a/plugins/textmessage/TextMessageDialog.h +++ b/plugins/textmessage/TextMessageDialog.h @@ -1,7 +1,7 @@ /* * TextMessageDialog.h - declaration of text message dialog class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.cpp b/plugins/textmessage/TextMessageFeaturePlugin.cpp index e3e4f42bd..59ecbf0a1 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.cpp +++ b/plugins/textmessage/TextMessageFeaturePlugin.cpp @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.cpp - implementation of TextMessageFeaturePlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/textmessage/TextMessageFeaturePlugin.h b/plugins/textmessage/TextMessageFeaturePlugin.h index 9076f832e..4d5da7086 100644 --- a/plugins/textmessage/TextMessageFeaturePlugin.h +++ b/plugins/textmessage/TextMessageFeaturePlugin.h @@ -1,7 +1,7 @@ /* * TextMessageFeaturePlugin.h - declaration of TextMessageFeature class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.cpp b/plugins/usersessioncontrol/UserLoginDialog.cpp index 5a4282d17..bde5a7123 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.cpp +++ b/plugins/usersessioncontrol/UserLoginDialog.cpp @@ -1,7 +1,7 @@ /* * UserLoginDialog.cpp - dialog for querying logon credentials * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserLoginDialog.h b/plugins/usersessioncontrol/UserLoginDialog.h index 2bde64f51..a3ca230f8 100644 --- a/plugins/usersessioncontrol/UserLoginDialog.h +++ b/plugins/usersessioncontrol/UserLoginDialog.h @@ -1,7 +1,7 @@ /* * UserLoginDialog.h - dialog for querying logon credentials * - * Copyright (c) 2019-2024 Tobias Junghans + * Copyright (c) 2019-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp index 2cb639173..65abc3a38 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.cpp +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.cpp @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.cpp - implementation of UserSessionControlPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/usersessioncontrol/UserSessionControlPlugin.h b/plugins/usersessioncontrol/UserSessionControlPlugin.h index d3a86bf78..681c06271 100644 --- a/plugins/usersessioncontrol/UserSessionControlPlugin.h +++ b/plugins/usersessioncontrol/UserSessionControlPlugin.h @@ -1,7 +1,7 @@ /* * UserSessionControlPlugin.h - declaration of UserSessionControlPlugin class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.cpp b/plugins/vncserver/external/ExternalVncServer.cpp index 6bd5709d0..6b515e0d8 100644 --- a/plugins/vncserver/external/ExternalVncServer.cpp +++ b/plugins/vncserver/external/ExternalVncServer.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServer.cpp - implementation of ExternalVncServer class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServer.h b/plugins/vncserver/external/ExternalVncServer.h index 71f1a04e6..024603fe9 100644 --- a/plugins/vncserver/external/ExternalVncServer.h +++ b/plugins/vncserver/external/ExternalVncServer.h @@ -1,7 +1,7 @@ /* * ExternalVncServer.h - declaration of ExternalVncServer class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfiguration.h b/plugins/vncserver/external/ExternalVncServerConfiguration.h index 350c6ca38..250544871 100644 --- a/plugins/vncserver/external/ExternalVncServerConfiguration.h +++ b/plugins/vncserver/external/ExternalVncServerConfiguration.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfiguration.h - configuration values for external VNC server * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp index 4060f7a8b..7027d0214 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - implementation of the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h index 5d74beb18..bdf0da7c1 100644 --- a/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h +++ b/plugins/vncserver/external/ExternalVncServerConfigurationWidget.h @@ -1,7 +1,7 @@ /* * ExternalVncServerConfigurationWidget.h - header for the ExternalVncServerConfigurationWidget class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncConfiguration.h b/plugins/vncserver/headless/HeadlessVncConfiguration.h index d54211585..1038c4d15 100644 --- a/plugins/vncserver/headless/HeadlessVncConfiguration.h +++ b/plugins/vncserver/headless/HeadlessVncConfiguration.h @@ -1,7 +1,7 @@ /* * HeadlessVncConfiguration.h - headless VNC server specific configuration values * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp index 32f449996..51ca50383 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.cpp +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -1,7 +1,7 @@ /* * HeadlessVncServer.cpp - implementation of HeadlessVncServer class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/headless/HeadlessVncServer.h b/plugins/vncserver/headless/HeadlessVncServer.h index 4816bf1ff..8c0b80811 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.h +++ b/plugins/vncserver/headless/HeadlessVncServer.h @@ -1,7 +1,7 @@ /* * HeadlessVncServer.h - declaration of HeadlessVncServer class * - * Copyright (c) 2020-2024 Tobias Junghans + * Copyright (c) 2020-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp index f66dd53ec..32e4810a8 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.cpp - implementation of BuiltinUltraVncServer class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h index 330736dac..09d956515 100644 --- a/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h +++ b/plugins/vncserver/ultravnc-builtin/BuiltinUltraVncServer.h @@ -1,7 +1,7 @@ /* * BuiltinUltraVncServer.h - declaration of BuiltinUltraVncServer class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp index 4507d8cc0..20f6fd5ad 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.cpp @@ -1,7 +1,7 @@ /* * LogoffEventFilter.cpp - implementation of LogoffEventFilter class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h index 81635d8ac..b5e8512c7 100644 --- a/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h +++ b/plugins/vncserver/ultravnc-builtin/LogoffEventFilter.h @@ -1,7 +1,7 @@ /* * LogoffEventFilter.h - declaration of LogoffEventFilter class * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h index 3d9b7712e..93791d23f 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfiguration.h @@ -1,7 +1,7 @@ /* * UltraVncConfiguration.h - UltraVNC-specific configuration values * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp index 062638da0..d0f191812 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - implementation of the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h index 665dd113e..2110b023b 100644 --- a/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h +++ b/plugins/vncserver/ultravnc-builtin/UltraVncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * UltraVncConfigurationWidget.h - header for the UltraVncConfigurationWidget class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp index c8cb383f5..c8e585024 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.cpp @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.cpp - implementation of BuiltinX11VncServer class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h index 897897c97..203824211 100644 --- a/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h +++ b/plugins/vncserver/x11vnc-builtin/BuiltinX11VncServer.h @@ -1,7 +1,7 @@ /* * BuiltinX11VncServer.h - declaration of BuiltinX11VncServer class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h index e75ce6039..e18423d6b 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfiguration.h @@ -1,7 +1,7 @@ /* * X11VncConfiguration.h - x11vnc-specific configuration values * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp index a6176f1b4..a308c6696 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.cpp @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - implementation of the X11VncConfigurationWidget class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h index b1c84751f..018ea7ed5 100644 --- a/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h +++ b/plugins/vncserver/x11vnc-builtin/X11VncConfigurationWidget.h @@ -1,7 +1,7 @@ /* * X11VncConfigurationWidget.h - header for the X11VncConfigurationWidget class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/project.yml b/project.yml index 553f9cbd5..68d40f2b8 100644 --- a/project.yml +++ b/project.yml @@ -1,7 +1,7 @@ project: name: Veyon version: 4.99.0 - copyright: 2004-2024 + copyright: 2004-2025 author: Tobias Junghans contact: Tobias Junghans contributors: diff --git a/server/src/ComputerControlClient.cpp b/server/src/ComputerControlClient.cpp index 5c526bd7f..92f2dae78 100644 --- a/server/src/ComputerControlClient.cpp +++ b/server/src/ComputerControlClient.cpp @@ -1,7 +1,7 @@ /* * ComputerControlClient.cpp - implementation of the ComputerControlClient class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlClient.h b/server/src/ComputerControlClient.h index 912058e82..c0d0469e7 100644 --- a/server/src/ComputerControlClient.h +++ b/server/src/ComputerControlClient.h @@ -1,7 +1,7 @@ /* * ComputerControlClient.h - header file for the ComputerControlClient class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 75782aa84..a2ad1c739 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -1,7 +1,7 @@ /* * ComputerControlServer.cpp - implementation of ComputerControlServer * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ComputerControlServer.h b/server/src/ComputerControlServer.h index c1b0cd2d2..74fcdfb66 100644 --- a/server/src/ComputerControlServer.h +++ b/server/src/ComputerControlServer.h @@ -1,7 +1,7 @@ /* * ComputerControlServer.h - header file for ComputerControlServer * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index 624e338cb..62721ec23 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.cpp - implementation of ServerAccessControlManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAccessControlManager.h b/server/src/ServerAccessControlManager.h index e682b1da5..a7e56d74d 100644 --- a/server/src/ServerAccessControlManager.h +++ b/server/src/ServerAccessControlManager.h @@ -1,7 +1,7 @@ /* * ServerAccessControlManager.h - header file for ServerAccessControlManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.cpp b/server/src/ServerAuthenticationManager.cpp index ae332ca0d..8f70b2613 100644 --- a/server/src/ServerAuthenticationManager.cpp +++ b/server/src/ServerAuthenticationManager.cpp @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.cpp - implementation of ServerAuthenticationManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/ServerAuthenticationManager.h b/server/src/ServerAuthenticationManager.h index 3350af4fa..0b757be90 100644 --- a/server/src/ServerAuthenticationManager.h +++ b/server/src/ServerAuthenticationManager.h @@ -1,7 +1,7 @@ /* * ServerAuthenticationManager.h - header file for ServerAuthenticationManager * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/TlsServer.cpp b/server/src/TlsServer.cpp index d8268412f..fe721a3ab 100644 --- a/server/src/TlsServer.cpp +++ b/server/src/TlsServer.cpp @@ -1,7 +1,7 @@ /* * TlsServer.cpp - header file for TlsServer * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/TlsServer.h b/server/src/TlsServer.h index abd9655e1..eb77b08c2 100644 --- a/server/src/TlsServer.h +++ b/server/src/TlsServer.h @@ -1,7 +1,7 @@ /* * TlsServer.h - header file for TlsServer * - * Copyright (c) 2021-2024 Tobias Junghans + * Copyright (c) 2021-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.cpp b/server/src/VeyonServerProtocol.cpp index 98fa41412..8c861610b 100644 --- a/server/src/VeyonServerProtocol.cpp +++ b/server/src/VeyonServerProtocol.cpp @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.cpp - implementation of the VeyonServerProtocol class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VeyonServerProtocol.h b/server/src/VeyonServerProtocol.h index 0e2d06665..57fb24954 100644 --- a/server/src/VeyonServerProtocol.h +++ b/server/src/VeyonServerProtocol.h @@ -1,7 +1,7 @@ /* * VeyonServerProtocol.h - header file for the VeyonServerProtocol class * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.cpp b/server/src/VncProxyConnection.cpp index bdbe806ab..4b325532d 100644 --- a/server/src/VncProxyConnection.cpp +++ b/server/src/VncProxyConnection.cpp @@ -1,7 +1,7 @@ /* * VncProxyConnection.cpp - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnection.h b/server/src/VncProxyConnection.h index 4e29203b5..a06e1370e 100644 --- a/server/src/VncProxyConnection.h +++ b/server/src/VncProxyConnection.h @@ -1,7 +1,7 @@ /* * VncProxyConnection.h - class representing a connection within VncProxyServer * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyConnectionFactory.h b/server/src/VncProxyConnectionFactory.h index 8ec88fb04..b036f3d9f 100644 --- a/server/src/VncProxyConnectionFactory.h +++ b/server/src/VncProxyConnectionFactory.h @@ -1,7 +1,7 @@ /* * VncProxyConnectionFactory.h - abstract factory class for VncProxyConnectionFactory objects * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.cpp b/server/src/VncProxyServer.cpp index 52a113e73..39a499aca 100644 --- a/server/src/VncProxyServer.cpp +++ b/server/src/VncProxyServer.cpp @@ -1,7 +1,7 @@ /* * VncProxyServer.cpp - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncProxyServer.h b/server/src/VncProxyServer.h index f8ebdb0b9..5693cb57e 100644 --- a/server/src/VncProxyServer.h +++ b/server/src/VncProxyServer.h @@ -1,7 +1,7 @@ /* * VncProxyServer.h - a VNC proxy implementation for intercepting VNC connections * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.cpp b/server/src/VncServer.cpp index 0ad856da6..a8dd36d52 100644 --- a/server/src/VncServer.cpp +++ b/server/src/VncServer.cpp @@ -2,7 +2,7 @@ * VncServer.cpp - implementation of VncServer, a VNC-server- * abstraction for platform independent VNC-server-usage * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/VncServer.h b/server/src/VncServer.h index 8c321e8c4..0f4d105ef 100644 --- a/server/src/VncServer.h +++ b/server/src/VncServer.h @@ -2,7 +2,7 @@ * VncServer.h - class VncServer, a VNC server abstraction for * platform-independent VNC server usage * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/src/main.cpp b/server/src/main.cpp index 3e24d0799..2349dbba1 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Server * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/server/veyon-server.rc.in b/server/veyon-server.rc.in index 1b6561d7e..4eaaaad3f 100644 --- a/server/veyon-server.rc.in +++ b/server/veyon-server.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Server\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2025 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-server.exe\0" END END diff --git a/service/src/main.cpp b/service/src/main.cpp index 4cadd56e3..f54999a59 100644 --- a/service/src/main.cpp +++ b/service/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Service * - * Copyright (c) 2006-2024 Tobias Junghans + * Copyright (c) 2006-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/service/veyon-service.rc.in b/service/veyon-service.rc.in index af2fd732a..fca598e4c 100644 --- a/service/veyon-service.rc.in +++ b/service/veyon-service.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon Service\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2025 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-service.exe\0" END END diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index 14d4cb79d..7b6a3b93b 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.cpp - class which handles communication between service and feature * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/FeatureWorkerManagerConnection.h b/worker/src/FeatureWorkerManagerConnection.h index 363a37e3b..ee66bbd80 100644 --- a/worker/src/FeatureWorkerManagerConnection.h +++ b/worker/src/FeatureWorkerManagerConnection.h @@ -1,7 +1,7 @@ /* * FeatureWorkerManagerConnection.h - class which handles communication between worker manager and worker * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.cpp b/worker/src/VeyonWorker.cpp index 2ef4d1c8b..408031904 100644 --- a/worker/src/VeyonWorker.cpp +++ b/worker/src/VeyonWorker.cpp @@ -1,7 +1,7 @@ /* * VeyonWorker.cpp - basic implementation of Veyon Worker * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/VeyonWorker.h b/worker/src/VeyonWorker.h index 97bafac44..719973aad 100644 --- a/worker/src/VeyonWorker.h +++ b/worker/src/VeyonWorker.h @@ -1,7 +1,7 @@ /* * VeyonWorker.h - basic implementation of Veyon Worker * - * Copyright (c) 2018-2024 Tobias Junghans + * Copyright (c) 2018-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/src/main.cpp b/worker/src/main.cpp index 459d76f02..08e96ad24 100644 --- a/worker/src/main.cpp +++ b/worker/src/main.cpp @@ -1,7 +1,7 @@ /* * main.cpp - main file for Veyon Feature Worker * - * Copyright (c) 2017-2024 Tobias Junghans + * Copyright (c) 2017-2025 Tobias Junghans * * This file is part of Veyon - https://veyon.io * diff --git a/worker/veyon-worker.rc.in b/worker/veyon-worker.rc.in index fd426abf5..b161c0aac 100644 --- a/worker/veyon-worker.rc.in +++ b/worker/veyon-worker.rc.in @@ -20,7 +20,7 @@ BEGIN VALUE "ProductVersion", "@VERSION_STRING@\0" VALUE "FileDescription", "Veyon\0" VALUE "FileVersion", "@VERSION_STRING@\0" - VALUE "LegalCopyright", "Copyright (c) 2017-2024 Veyon Solutions / Tobias Junghans\0" + VALUE "LegalCopyright", "Copyright (c) 2017-2025 Veyon Solutions / Tobias Junghans\0" VALUE "OriginalFilename", "veyon-worker.exe\0" END END From d891f4f9316c329c5f5c83650dfba1803fba864b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 10:49:12 +0100 Subject: [PATCH 1653/1765] UserConfig: fix QStringBuilder crash Closes #1007. --- master/src/UserConfig.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index 7246be79b..774f96994 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -32,8 +32,8 @@ UserConfig::UserConfig(const QString& storeName) : Configuration::Object(Configuration::Store::Backend::JsonFile, Configuration::Store::Scope::User, storeName) { - const auto templateFileName = VeyonCore::filesystem().expandPath(VeyonCore::config().configurationTemplatesDirectory()) + - QDir::separator() + storeName + QStringLiteral(".json"); + const QString templateFileName = VeyonCore::filesystem().expandPath(VeyonCore::config().configurationTemplatesDirectory()) + + QDir::separator() + storeName + QStringLiteral(".json"); if (QFileInfo(templateFileName).isReadable()) { Configuration::JsonStore jsonStore(Configuration::Store::Scope::System, templateFileName); From b4d8c516b6203cc0f15b7b43676484fd66604a6d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 10:50:41 +0100 Subject: [PATCH 1654/1765] ServiceConfigurationPage: fix tooltip --- configurator/src/ServiceConfigurationPage.ui | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/configurator/src/ServiceConfigurationPage.ui b/configurator/src/ServiceConfigurationPage.ui index 8a7bf1633..8c7015829 100644 --- a/configurator/src/ServiceConfigurationPage.ui +++ b/configurator/src/ServiceConfigurationPage.ui @@ -129,8 +129,7 @@ - Enabling this option will make the service launch a server process for every interactive session on a computer. -Typically this is required to support terminal servers. + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. Active session mode (single server instance for active local or remote session) From e61547c6ed0e3f50e52c1c97e1761ad420c38ec0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 11:23:00 +0100 Subject: [PATCH 1655/1765] AccessControlProvider: add matchList() Extended list matching via regular expression or value lookup. --- core/src/AccessControlProvider.cpp | 22 ++++++++++++++++++++++ core/src/AccessControlProvider.h | 1 + 2 files changed, 23 insertions(+) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 895aa66db..c3ff0dce2 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -515,3 +515,25 @@ QStringList AccessControlProvider::objectNames( const NetworkObjectList& objects return nameList; } + + + +bool AccessControlProvider::matchList(const QStringList& list, const QString& pattern) +{ + if (pattern.startsWith(QLatin1Char('/')) && pattern.endsWith(QLatin1Char('/')) && + pattern.length() > 2) + { + return list.indexOf(QRegularExpression(pattern.mid(1, pattern.length() - 2))) >= 0; + } + + if (pattern.endsWith(QLatin1Char('*'))) + { + const QRegularExpression rx(pattern); + if (rx.isValid()) + { + return list.indexOf(rx) >= 0; + } + } + + return list.contains(pattern); +} diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index c2f207941..578d31483 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -81,6 +81,7 @@ class VEYON_CORE_EXPORT AccessControlProvider Plugin::Uid authMethodUid ) const; static QStringList objectNames( const NetworkObjectList& objects ); + static bool matchList(const QStringList& list, const QString& pattern); QList m_accessControlRules{}; UserGroupsBackendInterface* m_userGroupsBackend; From c766777b81f16f6302b19a32c205dc5b38e8d44e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 11:24:57 +0100 Subject: [PATCH 1656/1765] AccessControlProvider: use matchList() for user group matching --- core/src/AccessControlProvider.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index c3ff0dce2..6ef5331ab 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -254,14 +254,7 @@ bool AccessControlProvider::isAccessToLocalComputerDenied() const bool AccessControlProvider::isMemberOfUserGroup( const QString &user, const QString &groupName ) const { - const QRegularExpression groupNameRX( groupName ); - - if( groupNameRX.isValid() ) - { - return m_userGroupsBackend->groupsOfUser( user, m_useDomainUserGroups ).indexOf( groupNameRX ) >= 0; - } - - return m_userGroupsBackend->groupsOfUser( user, m_useDomainUserGroups ).contains( groupName ); + return matchList(m_userGroupsBackend->groupsOfUser(user, m_useDomainUserGroups), groupName); } From d6dbaeb51f905a779eb2427656f926904419d58d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 11:25:12 +0100 Subject: [PATCH 1657/1765] AccessControlProvider: use matchList() for computer location matching --- core/src/AccessControlProvider.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 6ef5331ab..20dbe06e6 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -261,7 +261,7 @@ bool AccessControlProvider::isMemberOfUserGroup( const QString &user, bool AccessControlProvider::isLocatedAt( const QString &computer, const QString &locationName ) const { - return locationsOfComputer( computer ).contains( locationName ); + return matchList(locationsOfComputer(computer), locationName); } From 3d36ceec4f15b5fe8b888365514e132cd9d22c32 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 15:05:41 +0100 Subject: [PATCH 1658/1765] AccessControlRule: add condition ComputerAlreadyBeingAccessed --- core/src/AccessControlRule.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index 063e7b8a8..c1cf8abd1 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -58,7 +58,8 @@ class VEYON_CORE_EXPORT AccessControlRule NoUserLoggedInRemotely, AccessedUserLoggedInLocally, UserSession, - AuthenticationMethod + AuthenticationMethod, + ComputerAlreadyBeingAccessed, } ; Q_ENUM(Condition) From e1c83723fe31ed19c2314fef846deffd367d72de Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 15:06:38 +0100 Subject: [PATCH 1659/1765] AccessControlProvider: add support for condition ComputerAlreadyBeingAccessed --- core/src/AccessControlProvider.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 20dbe06e6..206413147 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -485,6 +485,16 @@ bool AccessControlProvider::matchConditions( const AccessControlRule &rule, } } + if (rule.isConditionEnabled(AccessControlRule::Condition::ComputerAlreadyBeingAccessed)) + { + condition = AccessControlRule::Condition::ComputerAlreadyBeingAccessed; + + if (!connectedUsers.isEmpty() == rule.isConditionInverted(condition)) + { + return false; + } + } + // do not match the rule if no conditions are set at all if( condition == AccessControlRule::Condition::None ) { From dab726a2b54298898b13ebf95798bd00f93eef96 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 15:07:31 +0100 Subject: [PATCH 1660/1765] AccessControlRuleEditDialog: add support for condition ComputerAlreadyBeingAccessed --- .../src/AccessControlRuleEditDialog.cpp | 3 ++ .../src/AccessControlRuleEditDialog.ui | 40 +++++++++++++++++++ .../src/AccessControlRulesTestDialog.cpp | 5 ++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/configurator/src/AccessControlRuleEditDialog.cpp b/configurator/src/AccessControlRuleEditDialog.cpp index 15580096d..9b1f43f4c 100644 --- a/configurator/src/AccessControlRuleEditDialog.cpp +++ b/configurator/src/AccessControlRuleEditDialog.cpp @@ -97,6 +97,7 @@ AccessControlRuleEditDialog::AccessControlRuleEditDialog(AccessControlRule &rule loadCondition ( ui->isNoUserLoggedInLocally, ui->invertIsNoUserLoggedInLocally, AccessControlRule::Condition::NoUserLoggedInLocally ); loadCondition ( ui->isNoUserLoggedInRemotely, ui->invertIsNoUserLoggedInRemotely, AccessControlRule::Condition::NoUserLoggedInRemotely ); loadCondition ( ui->isUserSession, ui->invertIsUserSession, AccessControlRule::Condition::UserSession ); + loadCondition(ui->computerAlreadyBeingAccessed, ui->invertComputerAlreadyBeingAccessed, AccessControlRule::Condition::ComputerAlreadyBeingAccessed); // load selected condition subjects ui->isMemberOfGroupSubject->setCurrentText( m_subjectNameMap.value( rule.subject( AccessControlRule::Condition::MemberOfGroup ) ) ); @@ -176,6 +177,8 @@ void AccessControlRuleEditDialog::accept() saveCondition( ui->isNoUserLoggedInRemotely, ui->invertIsNoUserLoggedInRemotely, AccessControlRule::Condition::NoUserLoggedInRemotely ); saveCondition( ui->isUserSession, ui->invertIsUserSession, AccessControlRule::Condition::UserSession ); + saveCondition(ui->computerAlreadyBeingAccessed, ui->invertComputerAlreadyBeingAccessed, AccessControlRule::Condition::ComputerAlreadyBeingAccessed); + // save action if( ui->actionAllowRadioButton->isChecked() ) { diff --git a/configurator/src/AccessControlRuleEditDialog.ui b/configurator/src/AccessControlRuleEditDialog.ui index cde43d4de..cd771c877 100644 --- a/configurator/src/AccessControlRuleEditDialog.ui +++ b/configurator/src/AccessControlRuleEditDialog.ui @@ -445,6 +445,30 @@ + + + + + + + + + false + + + + Local computer is already being accessed + + + + + Local computer is not yet being accessed + + + + + + @@ -890,6 +914,22 @@ + + computerAlreadyBeingAccessed + toggled(bool) + invertComputerAlreadyBeingAccessed + setEnabled(bool) + + + 28 + 585 + + + 334 + 585 + + + diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index fb99c0617..1328dd6a6 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -77,7 +77,10 @@ void AccessControlRulesTestDialog::accept() ui->accessingComputerLineEdit->text(), ui->localUserLineEdit->text(), ui->localComputerLineEdit->text(), - ui->connectedUsersLineEdit->text().split( QLatin1Char(',') ), + ui->connectedUsersLineEdit->text().isEmpty() ? + QStringList() + : + ui->connectedUsersLineEdit->text().split(QLatin1Char(',')), Plugin::Uid{ui->authenticationMethodsComboBox->currentData().toString()} ); QString resultText; From e27a3f6908b21b6a98dbbd17a5ac3c4427ec1a1b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 16:06:48 +0100 Subject: [PATCH 1661/1765] AccessControlProvider: introduce CheckResult Manage AccessControlRule through shared pointers and return CheckResult objects. This structure contains both the calculated access type as well as a pointer to the rule that led to the specific access type. --- .../src/AccessControlRulesTestDialog.cpp | 2 +- core/src/AccessControlProvider.cpp | 77 ++++++++++--------- core/src/AccessControlProvider.h | 19 +++-- core/src/AccessControlRule.cpp | 11 --- core/src/AccessControlRule.h | 4 +- master/src/MainWindow.cpp | 2 +- plugins/testing/TestingCommandLinePlugin.cpp | 14 ++-- server/src/ServerAccessControlManager.cpp | 12 +-- 8 files changed, 72 insertions(+), 69 deletions(-) diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index 1328dd6a6..87b6364ef 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -84,7 +84,7 @@ void AccessControlRulesTestDialog::accept() Plugin::Uid{ui->authenticationMethodsComboBox->currentData().toString()} ); QString resultText; - switch( result ) + switch (result ? result->action() : AccessControlRule::Action::None) { case AccessControlRule::Action::Allow: resultText = tr( "The access in the given scenario is allowed." ); diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 206413147..f0b59b5e9 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -47,9 +47,9 @@ AccessControlProvider::AccessControlProvider() : m_accessControlRules.reserve( accessControlRules.size() ); - for( const auto& accessControlRule : accessControlRules ) + for (const auto& accessControlRule : accessControlRules) { - m_accessControlRules.append( AccessControlRule( accessControlRule ) ); + m_accessControlRules.append(AccessControlRule::Pointer::create(accessControlRule)); } } @@ -119,33 +119,36 @@ QStringList AccessControlProvider::locationsOfComputer( const QString& computer -AccessControlProvider::Access AccessControlProvider::checkAccess( const QString& accessingUser, - const QString& accessingComputer, - const QStringList& connectedUsers, - Plugin::Uid authMethodUid ) +AccessControlProvider::CheckResult AccessControlProvider::checkAccess( const QString& accessingUser, + const QString& accessingComputer, + const QStringList& connectedUsers, + Plugin::Uid authMethodUid) { - if( VeyonCore::config().isAccessRestrictedToUserGroups() ) + if (VeyonCore::config().isAccessRestrictedToUserGroups()) { - if( processAuthorizedGroups( accessingUser ) ) + if (processAuthorizedGroups(accessingUser)) { - return Access::Allow; + return {Access::Allow}; } } - else if( VeyonCore::config().isAccessControlRulesProcessingEnabled() ) + else if (VeyonCore::config().isAccessControlRulesProcessingEnabled()) { - auto action = processAccessControlRules( accessingUser, - accessingComputer, - VeyonCore::platform().userFunctions().currentUser(), - HostAddress::localFQDN(), - connectedUsers, - authMethodUid ); - switch( action ) + const auto rule = processAccessControlRules(accessingUser, + accessingComputer, + VeyonCore::platform().userFunctions().currentUser(), + HostAddress::localFQDN(), + connectedUsers, + authMethodUid); + if (rule) { - case AccessControlRule::Action::Allow: - return Access::Allow; - case AccessControlRule::Action::AskForPermission: - return Access::ToBeConfirmed; - default: break; + switch(rule->action()) + { + case AccessControlRule::Action::Allow: + return {Access::Allow, rule}; + case AccessControlRule::Action::AskForPermission: + return {Access::ToBeConfirmed, rule}; + default: break; + } } } else @@ -153,13 +156,13 @@ AccessControlProvider::Access AccessControlProvider::checkAccess( const QString& vDebug() << "no access control method configured, allowing access."; // no access control method configured, therefore grant access - return Access::Allow; + return {Access::Allow}; } vDebug() << "configured access control method did not succeed, denying access."; // configured access control method did not succeed, therefore deny access - return Access::Deny; + return {Access::Deny}; } @@ -186,35 +189,35 @@ bool AccessControlProvider::processAuthorizedGroups( const QString& accessingUse -AccessControlRule::Action AccessControlProvider::processAccessControlRules( const QString& accessingUser, +AccessControlRule::Pointer AccessControlProvider::processAccessControlRules(const QString& accessingUser, const QString& accessingComputer, const QString& localUser, const QString& localComputer, const QStringList& connectedUsers, - Plugin::Uid authMethodUid ) + Plugin::Uid authMethodUid) { vDebug() << "processing rules for" << accessingUser << accessingComputer << localUser << localComputer << connectedUsers << authMethodUid; - for( const auto& rule : std::as_const( m_accessControlRules ) ) + for (const auto& rule : std::as_const(m_accessControlRules)) { // rule disabled? - if( rule.action() == AccessControlRule::Action::None ) + if (rule->action() == AccessControlRule::Action::None) { // then continue with next rule continue; } - if( rule.areConditionsIgnored() || - matchConditions( rule, accessingUser, accessingComputer, localUser, localComputer, connectedUsers, authMethodUid ) ) + if (rule->areConditionsIgnored() || + matchConditions(*rule, accessingUser, accessingComputer, localUser, localComputer, connectedUsers, authMethodUid)) { - vDebug() << "rule" << rule.name() << "matched with action" << rule.action(); - return rule.action(); + vDebug() << "rule" << rule->name() << "matched with action" << rule->action(); + return rule; } } vDebug() << "no matching rule, denying access"; - return AccessControlRule::Action::Deny; + return nullptr; } @@ -228,12 +231,12 @@ bool AccessControlProvider::isAccessToLocalComputerDenied() const return false; } - for( const auto& rule : std::as_const( m_accessControlRules ) ) + for (const auto& rule : std::as_const(m_accessControlRules)) { - if( matchConditions( rule, {}, {}, - VeyonCore::platform().userFunctions().currentUser(), HostAddress::localFQDN(), {}, {} ) ) + if (matchConditions(*rule, {}, {}, + VeyonCore::platform().userFunctions().currentUser(), HostAddress::localFQDN(), {}, {})) { - switch( rule.action() ) + switch (rule->action()) { case AccessControlRule::Action::Deny: return true; diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index 578d31483..01beaf9e6 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -40,23 +40,32 @@ class VEYON_CORE_EXPORT AccessControlProvider ToBeConfirmed, } ; + struct CheckResult { + Access access = Access::Deny; + AccessControlRule::Pointer matchedRule = nullptr; + QString details() const + { + return matchedRule ? matchedRule->description() : QString{}; + } + }; + AccessControlProvider(); QStringList userGroups() const; QStringList locations() const; QStringList locationsOfComputer( const QString& computer ) const; - Access checkAccess( const QString& accessingUser, const QString& accessingComputer, - const QStringList& connectedUsers, Plugin::Uid authMethodUid ); + CheckResult checkAccess(const QString& accessingUser, const QString& accessingComputer, + const QStringList& connectedUsers, Plugin::Uid authMethodUid); bool processAuthorizedGroups( const QString& accessingUser ); - AccessControlRule::Action processAccessControlRules( const QString& accessingUser, + AccessControlRule::Pointer processAccessControlRules(const QString& accessingUser, const QString& accessingComputer, const QString& localUser, const QString& localComputer, const QStringList& connectedUsers, - Plugin::Uid authMethodUid ); + Plugin::Uid authMethodUid); bool isAccessToLocalComputerDenied() const; @@ -83,7 +92,7 @@ class VEYON_CORE_EXPORT AccessControlProvider static QStringList objectNames( const NetworkObjectList& objects ); static bool matchList(const QStringList& list, const QString& pattern); - QList m_accessControlRules{}; + QList m_accessControlRules{}; UserGroupsBackendInterface* m_userGroupsBackend; NetworkObjectDirectory* m_networkObjectDirectory; bool m_useDomainUserGroups; diff --git a/core/src/AccessControlRule.cpp b/core/src/AccessControlRule.cpp index e5ec27f42..fd527a0fb 100644 --- a/core/src/AccessControlRule.cpp +++ b/core/src/AccessControlRule.cpp @@ -37,17 +37,6 @@ AccessControlRule::AccessControlRule() : -AccessControlRule::AccessControlRule(const AccessControlRule &other) : - m_name( other.name() ), - m_description( other.description() ), - m_action( other.action() ), - m_parameters( other.parameters() ), - m_ignoreConditions( other.areConditionsIgnored() ) -{ -} - - - AccessControlRule::AccessControlRule( const QJsonValue& jsonValue ) : m_name(), m_description(), diff --git a/core/src/AccessControlRule.h b/core/src/AccessControlRule.h index c1cf8abd1..52cf11ba4 100644 --- a/core/src/AccessControlRule.h +++ b/core/src/AccessControlRule.h @@ -87,10 +87,10 @@ class VEYON_CORE_EXPORT AccessControlRule using ConditionParameterMap = QMap; + using Pointer = QSharedPointer; AccessControlRule(); - AccessControlRule( const AccessControlRule& other ); - explicit AccessControlRule( const QJsonValue& jsonValue ); + explicit AccessControlRule(const QJsonValue& jsonValue); ~AccessControlRule() = default; diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index f0c1c24f2..a74b21c43 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -308,7 +308,7 @@ bool MainWindow::initAccessControl() QHostAddress( QHostAddress::LocalHost ).toString(), QStringList(), authMethodUid ); - if( accessControlResult == AccessControlProvider::Access::Deny ) + if (accessControlResult.access == AccessControlProvider::Access::Deny) { vWarning() << "user" << username << "is not allowed to access computers"; QMessageBox::critical( nullptr, tr( "Access denied" ), diff --git a/plugins/testing/TestingCommandLinePlugin.cpp b/plugins/testing/TestingCommandLinePlugin.cpp index ee67b6abe..e24791f97 100644 --- a/plugins/testing/TestingCommandLinePlugin.cpp +++ b/plugins/testing/TestingCommandLinePlugin.cpp @@ -58,8 +58,8 @@ QString TestingCommandLinePlugin::commandHelp( const QString& command ) const CommandLinePluginInterface::RunResult TestingCommandLinePlugin::handle_checkaccess( const QStringList& arguments ) { - switch( AccessControlProvider().checkAccess( arguments.value( 0 ), arguments.value( 1 ), { arguments.value( 2 ) }, - Plugin::Uid{ arguments.value(3) } ) ) + switch (AccessControlProvider().checkAccess(arguments.value(0), arguments.value(1), {arguments.value(2)}, + Plugin::Uid{arguments.value(3)}).access) { case AccessControlProvider::Access::Allow: printf( "[TEST]: CheckAccess: ALLOW\n" ); return Successful; case AccessControlProvider::Access::Deny: printf( "[TEST]: CheckAccess: DENY\n" ); return Successful; @@ -89,10 +89,12 @@ CommandLinePluginInterface::RunResult TestingCommandLinePlugin::handle_authorize CommandLinePluginInterface::RunResult TestingCommandLinePlugin::handle_accesscontrolrules( const QStringList& arguments ) { - switch( AccessControlProvider().processAccessControlRules( arguments.value( 0 ), arguments.value( 1 ), - arguments.value( 2 ), arguments.value( 3 ), - QStringList( arguments.value( 4 ) ), - Plugin::Uid{ arguments.value(5) } ) ) + AccessControlProvider provider; + const auto rule = provider.processAccessControlRules(arguments.value(0), arguments.value(1), + arguments.value(2), arguments.value(3), + QStringList(arguments.value(4)), + Plugin::Uid{arguments.value(5)}); + switch(rule ? rule->action() : AccessControlRule::Action::None) { case AccessControlRule::Action::Allow: printf( "[TEST]: AccessControlRules: ALLOW\n" ); return Successful; case AccessControlRule::Action::Deny: printf( "[TEST]: AccessControlRules: DENY\n" ); return Successful; diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index 62721ec23..7f6992583 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -113,13 +113,13 @@ void ServerAccessControlManager::performAccessControl( VncServerClient* client ) break; } - const auto accessResult = - AccessControlProvider().checkAccess( client->username(), - client->hostAddress(), - connectedUsers(), - client->authMethodUid() ); + AccessControlProvider accessControlProvider; + const auto checkResult = accessControlProvider.checkAccess(client->username(), + client->hostAddress(), + connectedUsers(), + client->authMethodUid()); - switch( accessResult ) + switch (checkResult.access) { case AccessControlProvider::Access::Allow: client->setAccessControlState( VncServerClient::AccessControlState::Successful ); From 96a7cf34f6f7ee1c231c80ae5e8a52788c342a97 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 16:10:03 +0100 Subject: [PATCH 1662/1765] VncServerProtocol: drop unused include --- core/src/VncServerProtocol.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index 14e2edd58..03f049fba 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -28,7 +28,6 @@ #include #include -#include "AuthenticationCredentials.h" #include "VariantArrayMessage.h" #include "VncServerClient.h" #include "VncServerProtocol.h" From 5059692405a3d44451df7d734c66665287688903 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Feb 2025 16:17:26 +0100 Subject: [PATCH 1663/1765] VncServerClient: add accessControlDetails property This property holds an indication of what led to the access control state. --- core/src/VncServerClient.h | 11 +++++++++++ server/src/ServerAccessControlManager.cpp | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/core/src/VncServerClient.h b/core/src/VncServerClient.h index 6c20f8d17..e8b5c5915 100644 --- a/core/src/VncServerClient.h +++ b/core/src/VncServerClient.h @@ -102,6 +102,16 @@ class VEYON_CORE_EXPORT VncServerClient : public QObject m_accessControlState = accessControlState; } + const QString& accessControlDetails() const + { + return m_accessControlDetails; + } + + void setAccessControlDetails(const QString& details) + { + m_accessControlDetails = details; + } + QElapsedTimer& accessControlTimer() { return m_accessControlTimer; @@ -161,6 +171,7 @@ public Q_SLOTS: AuthState m_authState; Plugin::Uid m_authMethodUid; AccessControlState m_accessControlState; + QString m_accessControlDetails; QElapsedTimer m_accessControlTimer; QString m_username; QString m_hostAddress; diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index 7f6992583..153809c3d 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -57,6 +57,7 @@ void ServerAccessControlManager::addClient( VncServerClient* client ) else { client->setAccessControlState( VncServerClient::AccessControlState::Failed ); + client->setAccessControlDetails(tr("Requested authentication method not available")); } if( client->accessControlState() == VncServerClient::AccessControlState::Successful ) @@ -119,6 +120,8 @@ void ServerAccessControlManager::performAccessControl( VncServerClient* client ) connectedUsers(), client->authMethodUid()); + client->setAccessControlDetails(checkResult.details()); + switch (checkResult.access) { case AccessControlProvider::Access::Allow: @@ -207,6 +210,7 @@ void ServerAccessControlManager::finishDesktopAccessConfirmation( VncServerClien else { client->setAccessControlState( VncServerClient::AccessControlState::Failed ); + client->setAccessControlDetails(tr("User did not confirm access.")); client->setProtocolState( VncServerProtocol::State::Close ); } } From 6e9eb06eca94cf551e257f226f87ac4504a7e9e3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Feb 2025 13:31:20 +0100 Subject: [PATCH 1664/1765] ComputerManager: add clearOverlayModelData() --- master/src/ComputerManager.cpp | 15 +++++++++++++++ master/src/ComputerManager.h | 1 + 2 files changed, 16 insertions(+) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 491381653..4a386b859 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -226,6 +226,21 @@ void ComputerManager::updateSessionInfo(const ComputerControlInterface::Pointer& } + +void ComputerManager::clearOverlayModelData(const ComputerControlInterface::Pointer& controlInterface) const +{ + const auto networkObjectIndex = findNetworkObject(controlInterface->computer().networkObjectUid()); + + if (networkObjectIndex.isValid()) + { + m_networkObjectOverlayDataModel->setData(mapToUserNameModelIndex(networkObjectIndex), {}); + m_networkObjectOverlayDataModel->setData(mapToSessionUptimeModelIndex(networkObjectIndex), {}); + m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), {}); + } +} + + + void ComputerManager::checkChangedData( const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector& roles ) { Q_UNUSED(topLeft) diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index bf0a67d9e..4a290885d 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -60,6 +60,7 @@ class ComputerManager : public QObject void updateUser(const ComputerControlInterface::Pointer& controlInterface) const; void updateSessionInfo(const ComputerControlInterface::Pointer& controlInterface) const; + void clearOverlayModelData(const ComputerControlInterface::Pointer& controlInterface) const; Q_SIGNALS: void computerSelectionReset(); From e3d54926d8de4a596a1144aba80f287dcd152d07 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Feb 2025 13:32:11 +0100 Subject: [PATCH 1665/1765] NetworkObjectOverlayDataModel: fall back to original data if overlay value is invalid --- master/src/NetworkObjectOverlayDataModel.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/master/src/NetworkObjectOverlayDataModel.cpp b/master/src/NetworkObjectOverlayDataModel.cpp index 7e8f96432..961f7f9c5 100644 --- a/master/src/NetworkObjectOverlayDataModel.cpp +++ b/master/src/NetworkObjectOverlayDataModel.cpp @@ -61,7 +61,11 @@ QVariant NetworkObjectOverlayDataModel::data(const QModelIndex& index, int role) const auto& overlayData = std::as_const(m_overlayData)[networkObjectUid]; if (overlayData.contains(role)) { - return std::as_const(overlayData)[role]; + const auto value = std::as_const(overlayData)[role]; + if (value.isValid()) + { + return value; + } } } From e648ad33561fa8fa991eb0c3329dd139b7f77f1f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Feb 2025 13:32:36 +0100 Subject: [PATCH 1666/1765] ComputerControlListModel: use ComputerManager::clearOverlayModelData() --- master/src/ComputerControlListModel.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 68ae8868f..dcd481865 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -434,10 +434,7 @@ void ComputerControlListModel::stopComputerControlInterface( const ComputerContr controlInterface->disconnect(this); controlInterface->disconnect( &m_master->computerManager() ); - controlInterface->setUserInformation({}, {}); - controlInterface->setSessionInfo({}); - - m_master->computerManager().updateUser( controlInterface ); + m_master->computerManager().clearOverlayModelData(controlInterface); } From 0d790dfe42c0d50407b89b44fb904ca8b042104c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Feb 2025 14:28:42 +0100 Subject: [PATCH 1667/1765] WindowsCoreFunctions: free resources in queryProcessEnvironmentVariables() --- plugins/platform/windows/WindowsCoreFunctions.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/platform/windows/WindowsCoreFunctions.cpp b/plugins/platform/windows/WindowsCoreFunctions.cpp index a0a132abd..d4d858d79 100644 --- a/plugins/platform/windows/WindowsCoreFunctions.cpp +++ b/plugins/platform/windows/WindowsCoreFunctions.cpp @@ -633,6 +633,10 @@ QStringList WindowsCoreFunctions::queryProcessEnvironmentVariables(DWORD process ++envPos; } + DestroyEnvironmentBlock(envBlock); + CloseHandle(processHandle); + CloseHandle(processToken); + return envVars; } From 257e722927d1d7bec9481cdafd792d7826c11077 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Feb 2025 14:29:10 +0100 Subject: [PATCH 1668/1765] WindowsSessionFunctions: fix querying from HKEY_CURRENT_USER Since HKEY_CURRENT_USER is not mapped to HKEY_USERS\\ when impersonating a user (except for RegOpenCurrentUser() is used, but we want to stick with the convenient QSettings API), adjust the key to read accordingly. --- plugins/platform/windows/WindowsSessionFunctions.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index a8590e7d5..89d2bbd94 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -138,13 +138,19 @@ QVariant WindowsSessionFunctions::querySettingsValueInCurrentSession(const QStri return {}; } + auto keyParts = key.split(QLatin1Char('\\')); + if (keyParts.constFirst() == QStringLiteral("HKEY_CURRENT_USER")) + { + keyParts[0] = WtsSessionManager::queryUserSid(sessionId); + keyParts.prepend(QStringLiteral("HKEY_USERS")); + } + if (ImpersonateLoggedOnUser(userToken) == false) { vCritical() << "could not impersonate session user"; return {}; } - const auto keyParts = key.split(QLatin1Char('\\')); const auto value = QSettings(keyParts.mid(0, keyParts.length()-1).join(QLatin1Char('\\')), QSettings::NativeFormat) .value(keyParts.constLast()); From 3d527eae66bc0b6f27fddd7be6fa41f3166634a4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 Feb 2025 15:12:04 +0100 Subject: [PATCH 1669/1765] Master: use fixed icon sizes Instead completely rely on Qt handling icon sizes based on the display's pixel density / UI scaling. --- master/src/MainToolBar.cpp | 2 +- master/src/MainWindow.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/master/src/MainToolBar.cpp b/master/src/MainToolBar.cpp index 2451ffe54..fd7c0458f 100644 --- a/master/src/MainToolBar.cpp +++ b/master/src/MainToolBar.cpp @@ -35,7 +35,7 @@ MainToolBar::MainToolBar( QWidget* parent ) : QToolBar( tr( "Configuration" ), parent ), m_mainWindow( dynamic_cast( parent ) ) { - setIconSize(QSize(48, 48) / qGuiApp->devicePixelRatio()); + setIconSize(QSize(32, 32)); ToolButton::setToolTipsDisabled( m_mainWindow->masterCore().userConfig().noToolTips() ); ToolButton::setIconOnlyMode( m_mainWindow, m_mainWindow->masterCore().userConfig().toolButtonIconOnlyMode() ); diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index a74b21c43..c326ad3c9 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -249,7 +249,7 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : const auto toolButtons = findChildren(); for(auto* btn : toolButtons) { - btn->setIconSize(QSize(32, 32) / qGuiApp->devicePixelRatio()); + btn->setIconSize(QSize(20, 20)); } // create the main toolbar From a64ebe2ea97c5b17f3694645055685972d8171b4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 Feb 2025 15:13:15 +0100 Subject: [PATCH 1670/1765] Master: add ComputerItemDelegate Indicate active features by overlaying the thumbnail with the corresponding feature icons. --- master/src/ComputerItemDelegate.cpp | 104 ++++++++++++++++++++++++ master/src/ComputerItemDelegate.h | 51 ++++++++++++ master/src/ComputerMonitoringWidget.cpp | 3 + 3 files changed, 158 insertions(+) create mode 100644 master/src/ComputerItemDelegate.cpp create mode 100644 master/src/ComputerItemDelegate.h diff --git a/master/src/ComputerItemDelegate.cpp b/master/src/ComputerItemDelegate.cpp new file mode 100644 index 000000000..58bc551ba --- /dev/null +++ b/master/src/ComputerItemDelegate.cpp @@ -0,0 +1,104 @@ +/* + * ComputerItemDelegate.cpp - implementation of ComputerItemDelegate + + * Copyright (c) 2025 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include + +#include "ComputerControlListModel.h" +#include "ComputerItemDelegate.h" +#include "FeatureManager.h" + + +ComputerItemDelegate::ComputerItemDelegate(QObject* parent) : + QStyledItemDelegate(parent) +{ + initFeaturePixmaps(); +} + + + +void ComputerItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + QStyledItemDelegate::paint(painter, option, index); + + if (index.isValid() && index.model()) + { + drawFeatureIcons(painter, index.model()->data(index, ComputerControlListModel::ControlInterfaceRole).value()); + } +} + + + +void ComputerItemDelegate::initFeaturePixmaps() +{ + for (const auto& feature : VeyonCore::featureManager().features() ) + { + if (feature.testFlag(Feature::Flag::Master) && !feature.iconUrl().isEmpty()) + { + m_featurePixmaps[feature.uid()] = QIcon(feature.iconUrl()).pixmap(QSize(OverlayIconSize, OverlayIconSize)); + } + } +} + + + +void ComputerItemDelegate::drawFeatureIcons(QPainter* painter, ComputerControlInterface::Pointer controlInterface) const +{ + if (painter && + controlInterface && + controlInterface->state() == ComputerControlInterface::State::Connected) + { + auto count = 0; + for (const auto& feature : controlInterface->activeFeatures()) + { + if (m_featurePixmaps.contains(feature)) + { + count++; + } + } + + if (count == 0) + { + return; + } + + painter->setRenderHint(QPainter::Antialiasing); + painter->setBrush(QColor(255, 255, 255, 192)); + painter->setPen(QColor(25, 140, 179)); + painter->drawRoundedRect(QRect(OverlayIconsPadding, OverlayIconsPadding, + count * (OverlayIconSize + OverlayIconSpacing), OverlayIconSize), + OverlayIconsRadius, OverlayIconsRadius); + + int x = OverlayIconsPadding; + + for (const auto& feature : controlInterface->activeFeatures()) + { + const auto it = m_featurePixmaps.find(feature); + if (it != m_featurePixmaps.constEnd()) + { + painter->drawPixmap(QPoint(x, OverlayIconsPadding), *it); + x += OverlayIconSize + OverlayIconSpacing; + } + } + } +} diff --git a/master/src/ComputerItemDelegate.h b/master/src/ComputerItemDelegate.h new file mode 100644 index 000000000..9ccc5e67e --- /dev/null +++ b/master/src/ComputerItemDelegate.h @@ -0,0 +1,51 @@ +/* + * ComputerItemDelegate.h - header file for ComputerItemDelegate + * + * Copyright (c) 2025 Tobias Junghans + * + * This file is part of Veyon - https://veyon.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#pragma once + +#include +#include + +#include "ComputerControlInterface.h" + +class ComputerItemDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + ComputerItemDelegate(QObject* parent = nullptr); + + virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; + +private: + void initFeaturePixmaps(); + void drawFeatureIcons(QPainter* painter, ComputerControlInterface::Pointer controlInterface) const; + + static constexpr int OverlayIconSize = 32; + static constexpr int OverlayIconSpacing = 4; + static constexpr int OverlayIconsPadding = 8; + static constexpr int OverlayIconsRadius = 6; + + QMap m_featurePixmaps; + +}; diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index e5243168b..050199417 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -28,6 +28,7 @@ #include #include "ComputerControlListModel.h" +#include "ComputerItemDelegate.h" #include "ComputerMonitoringModel.h" #include "ComputerMonitoringWidget.h" #include "VeyonMaster.h" @@ -55,6 +56,8 @@ ComputerMonitoringWidget::ComputerMonitoringWidget( QWidget *parent ) : setUniformItemSizes( true ); setSelectionRectVisible( true ); + setItemDelegate(new ComputerItemDelegate(this)); + setUidRole( ComputerControlListModel::UidRole ); connect( this, &QListView::doubleClicked, this, &ComputerMonitoringWidget::runDoubleClickFeature ); From e7ffb7576230cb46e7b17b7fcbb577887d9c30de Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 26 Feb 2025 14:04:48 +0100 Subject: [PATCH 1671/1765] ComputerControlListModel: fall back to network object UID If session meta data is not (yet) available, fall back to the normal network object UID so all items have distinct values in the UID role. --- master/src/ComputerControlListModel.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index dcd481865..74b84b1ab 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -346,6 +346,10 @@ QVariant ComputerControlListModel::uidRoleData(const ComputerControlInterface::P case UidRoleContent::NetworkObjectUid: return controlInterface->computer().networkObjectUid(); case UidRoleContent::SessionMetaDataHash: + if (controlInterface->sessionInfo().metaData.isEmpty()) + { + return controlInterface->computer().networkObjectUid(); + } return QUuid::createUuidV5(uidRoleNamespace, controlInterface->sessionInfo().metaData); } From ab4dd6f12325a2ea51eef1879b8348e653e2846d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 Feb 2025 14:59:12 +0100 Subject: [PATCH 1672/1765] AccessControlProvider: return matching rule if access denied --- core/src/AccessControlProvider.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index f0b59b5e9..ccdaaa65a 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -124,6 +124,7 @@ AccessControlProvider::CheckResult AccessControlProvider::checkAccess( const QSt const QStringList& connectedUsers, Plugin::Uid authMethodUid) { + CheckResult denyAccessCheckResult{Access::Deny}; if (VeyonCore::config().isAccessRestrictedToUserGroups()) { if (processAuthorizedGroups(accessingUser)) @@ -149,6 +150,7 @@ AccessControlProvider::CheckResult AccessControlProvider::checkAccess( const QSt return {Access::ToBeConfirmed, rule}; default: break; } + denyAccessCheckResult.matchedRule = rule; } } else @@ -162,7 +164,7 @@ AccessControlProvider::CheckResult AccessControlProvider::checkAccess( const QSt vDebug() << "configured access control method did not succeed, denying access."; // configured access control method did not succeed, therefore deny access - return {Access::Deny}; + return denyAccessCheckResult; } From b29a180ce50de44ea0e5ac59ae9cc382c55088e5 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 Feb 2025 15:00:50 +0100 Subject: [PATCH 1673/1765] ServerAccessControlManager: set access control details from matched rule --- core/src/AccessControlProvider.h | 4 ---- server/src/ServerAccessControlManager.cpp | 11 +++++++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index 01beaf9e6..7627161e5 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -43,10 +43,6 @@ class VEYON_CORE_EXPORT AccessControlProvider struct CheckResult { Access access = Access::Deny; AccessControlRule::Pointer matchedRule = nullptr; - QString details() const - { - return matchedRule ? matchedRule->description() : QString{}; - } }; AccessControlProvider(); diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index 153809c3d..fbfe80260 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -120,12 +120,14 @@ void ServerAccessControlManager::performAccessControl( VncServerClient* client ) connectedUsers(), client->authMethodUid()); - client->setAccessControlDetails(checkResult.details()); - switch (checkResult.access) { case AccessControlProvider::Access::Allow: client->setAccessControlState( VncServerClient::AccessControlState::Successful ); + if (checkResult.matchedRule) + { + client->setAccessControlDetails(tr("Access allowed by rule \"%1\"").arg(checkResult.matchedRule->name())); + } break; case AccessControlProvider::Access::ToBeConfirmed: @@ -135,6 +137,10 @@ void ServerAccessControlManager::performAccessControl( VncServerClient* client ) default: client->setAccessControlState( VncServerClient::AccessControlState::Failed ); client->setProtocolState( VncServerProtocol::State::Close ); + if (checkResult.matchedRule) + { + client->setAccessControlDetails(tr("Access denied by rule \"%1\"").arg(checkResult.matchedRule->name())); + } break; } @@ -205,6 +211,7 @@ void ServerAccessControlManager::finishDesktopAccessConfirmation( VncServerClien if( choice == DesktopAccessDialog::ChoiceYes || choice == DesktopAccessDialog::ChoiceAlways ) { client->setAccessControlState( VncServerClient::AccessControlState::Successful ); + client->setAccessControlDetails(tr("User confirmed access.")); m_clients.append( client ); } else From 95bd83ce35b863cc27b17e086d48ed366358fba4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 Feb 2025 15:02:11 +0100 Subject: [PATCH 1674/1765] AccessControlProvider: add accessControlMessageScheme() This pattern is going to be used to prefix access control messages encoded in the VNC desktop name. --- core/src/AccessControlProvider.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index 7627161e5..2fac64d3c 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -65,6 +65,11 @@ class VEYON_CORE_EXPORT AccessControlProvider bool isAccessToLocalComputerDenied() const; + static QByteArray accessControlMessageScheme() + { + return QByteArrayLiteral("vacm://"); + } + private: bool isMemberOfUserGroup( const QString& user, const QString& groupName ) const; bool isLocatedAt( const QString& computer, const QString& locationName ) const; From fcc4074978aeb36516ec706bbf9799a7009b2cc4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 Feb 2025 15:04:54 +0100 Subject: [PATCH 1675/1765] VncServerProtocol: send failed access control message Use a dummy VNC server init message and encode the message in the desktop name. --- core/src/VncServerProtocol.cpp | 21 +++++++++++++++++++++ core/src/VncServerProtocol.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index 03f049fba..00ca05749 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -28,6 +28,7 @@ #include #include +#include "AccessControlProvider.h" #include "VariantArrayMessage.h" #include "VncServerClient.h" #include "VncServerProtocol.h" @@ -296,8 +297,10 @@ bool VncServerProtocol::processAccessControl() break; default: + sendFailedAccessControlMessage(); vCritical() << "access control failed - closing connection"; m_socket->close(); + return true; break; } @@ -306,6 +309,24 @@ bool VncServerProtocol::processAccessControl() +void VncServerProtocol::sendFailedAccessControlMessage() +{ + auto name = client()->accessControlDetails().toUtf8(); + if (name.length() > 0) + { + name.prepend(AccessControlProvider::accessControlMessageScheme()); + + rfbServerInitMsg msg{}; + msg.format.bitsPerPixel = 255; + msg.nameLength = qToBigEndian(name.length()); + + m_socket->write(reinterpret_cast(&msg), sizeof(msg)); + m_socket->write(name); + } +} + + + bool VncServerProtocol::processFramebufferInit() { if( m_socket->bytesAvailable() >= sz_rfbClientInitMsg && diff --git a/core/src/VncServerProtocol.h b/core/src/VncServerProtocol.h index 34f5f5e1c..c76fd17df 100644 --- a/core/src/VncServerProtocol.h +++ b/core/src/VncServerProtocol.h @@ -95,6 +95,8 @@ class VEYON_CORE_EXPORT VncServerProtocol bool processAuthentication( VariantArrayMessage& message ); bool processAccessControl(); + void sendFailedAccessControlMessage(); + bool processFramebufferInit(); private: From 9be25e34003742125d6f4a02df19fd53769b73c8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 Feb 2025 15:06:19 +0100 Subject: [PATCH 1676/1765] VncConnection: add support for RfbLogMessageReader hook This allows intercepting log messages from the RFB client library. --- core/src/VncConnection.cpp | 9 +++++++++ core/src/VncConnection.h | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 5b3f8df5b..e77e64c0f 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -43,6 +43,8 @@ #include "VncEvents.h" +VncConnection::RfbLogMessageReader VncConnection::s_rfbLogMessageReader = [](const QByteArray&) { }; + VncConnection::VncConnection( QObject* parent ) : QThread( parent ), m_verifyServerCertificate( VeyonCore::config().tlsUseCertificateAuthority() ), @@ -100,6 +102,13 @@ void VncConnection::initLogging( bool debug ) +void VncConnection::registerRfbLogMessageReader(const RfbLogMessageReader& reader) +{ + s_rfbLogMessageReader = reader; +} + + + QImage VncConnection::image() { QReadLocker locker( &m_imgLock ); diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index b2422a47c..af57d890c 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -79,7 +79,10 @@ class VEYON_CORE_EXPORT VncConnection : public QThread explicit VncConnection( QObject *parent = nullptr ); + using RfbLogMessageReader = std::function; + static void initLogging( bool debug ); + static void registerRfbLogMessageReader(const RfbLogMessageReader& reader); QImage image(); @@ -174,6 +177,9 @@ class VEYON_CORE_EXPORT VncConnection : public QThread static constexpr int RfbBitsPerSample = 8; static constexpr int RfbSamplesPerPixel = 3; static constexpr int RfbBytesPerPixel = sizeof(RfbPixel); + static constexpr int RfbLogMessageMaxLength = 256; + + static RfbLogMessageReader s_rfbLogMessageReader; enum class ControlFlag { ScaledFramebufferNeedsUpdate = 0x01, @@ -187,6 +193,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread SkipFramebufferUpdates = 0x100 }; + using RfbLogMessage = std::array; + ~VncConnection() override; void establishConnection(); @@ -214,6 +222,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread static void rfbClientLogDebug( const char* format, ... ); static void rfbClientLogNone( const char* format, ... ); + static RfbLogMessage readRfbClientLogMessage(const char* format, va_list args); + static void framebufferCleanup( void* framebuffer ); rfbSocket openTlsSocket( const char* hostname, int port ); From ecdbe27688fcd7fd10bcb74b272a06f9367c1162 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 Feb 2025 15:08:38 +0100 Subject: [PATCH 1677/1765] VeyonConnection: read and process access control messages Use the new VncConnection API to install an interceptor to search for desktop name log messages containing access control messages. --- core/src/VeyonConnection.cpp | 40 ++++++++++++++++++++++++++++++++++++ core/src/VeyonConnection.h | 14 ++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 666b34dd5..15832c6f6 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -24,6 +24,7 @@ #include "rfb/rfbclient.h" +#include "AccessControlProvider.h" #include "AuthenticationManager.h" #include "PlatformUserFunctions.h" #include "SocketDevice.h" @@ -37,6 +38,9 @@ static rfbClientProtocolExtension* __veyonProtocolExt = nullptr; static constexpr std::array __veyonSecurityTypes = { VeyonCore::RfbSecurityTypeVeyon, 0 }; +VeyonConnection::Instances VeyonConnection::instances; + + rfbBool handleVeyonMessage( rfbClient* client, rfbServerToClientMsg* msg ) { auto connection = reinterpret_cast( VncConnection::clientData( client, VeyonConnection::VeyonConnectionTag ) ); @@ -62,8 +66,14 @@ VeyonConnection::VeyonConnection() __veyonProtocolExt->handleAuthentication = handleSecTypeVeyon; rfbClientRegisterExtension( __veyonProtocolExt ); + + VncConnection::registerRfbLogMessageReader(VeyonConnection::evalRfbClientLogMessage); } + instances.mutex.lock(); + instances.connections[m_vncConnection] = this; + instances.mutex.unlock(); + connect( m_vncConnection, &VncConnection::connectionPrepared, this, &VeyonConnection::registerConnection, Qt::DirectConnection ); connect( m_vncConnection, &VncConnection::destroyed, VeyonCore::instance(), [this]() { delete this; @@ -72,6 +82,15 @@ VeyonConnection::VeyonConnection() +VeyonConnection::~VeyonConnection() +{ + instances.mutex.lock(); + instances.connections.remove(m_vncConnection); + instances.mutex.unlock(); +} + + + void VeyonConnection::stopAndDeleteLater() { unregisterConnection(); @@ -255,3 +274,24 @@ void VeyonConnection::hookPrepareAuthentication( rfbClient* client ) connection->setServerReachable(); } } + + + +void VeyonConnection::evalRfbClientLogMessage(const QByteArray& message) +{ + static const QByteArray accessControlMessageMatchPattern = QByteArrayLiteral("Desktop name \"") + + AccessControlProvider::accessControlMessageScheme(); + + if (message.startsWith(accessControlMessageMatchPattern)) + { + QMutexLocker m(&instances.mutex); + const auto connection = instances.connections.value(QThread::currentThread()); + if (connection) + { + Q_EMIT connection->accessControlMessageReceived( + QString::fromUtf8( + message.mid(accessControlMessageMatchPattern.size(), + message.length() - accessControlMessageMatchPattern.size() - 2))); + } + } +} diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index f90e13764..f32537250 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -35,6 +35,11 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject { Q_OBJECT public: + using Instances = struct { + QMutex mutex; + QHash connections; + }; + VeyonConnection(); void stopAndDeleteLater(); @@ -62,10 +67,13 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject Q_SIGNALS: + void accessControlMessageReceived(const QString& message); void featureMessageReceived( const FeatureMessage& ); private: - ~VeyonConnection() override = default; + static Instances instances; + + ~VeyonConnection() override; void registerConnection(); void unregisterConnection(); @@ -74,6 +82,10 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject static int8_t handleSecTypeVeyon( rfbClient* client, uint32_t authScheme ); static void hookPrepareAuthentication( rfbClient* client ); + static void evalRfbClientLogMessage(const QByteArray& message); + VncConnection* m_vncConnection{new VncConnection}; + QString m_accessControlMessage; + } ; From 464c64528b26ff60ca3876a84eb630017aa44ac0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 Feb 2025 15:10:41 +0100 Subject: [PATCH 1678/1765] ComputerControlInterface: add support for access control messages --- core/src/ComputerControlInterface.cpp | 12 ++++++++++++ core/src/ComputerControlInterface.h | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index b1dfbda24..21addbb20 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -105,6 +105,7 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateScreens ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::stateChanged ); + connect(m_connection, &VeyonConnection::accessControlMessageReceived, this, &ComputerControlInterface::setAccessControlMessage); connect( m_connection, &VeyonConnection::featureMessageReceived, this, &ComputerControlInterface::handleFeatureMessage ); connect( m_connection, &VeyonConnection::featureMessageReceived, this, &ComputerControlInterface::resetWatchdog ); @@ -195,6 +196,17 @@ QImage ComputerControlInterface::framebuffer() const +void ComputerControlInterface::setAccessControlMessage(const QString& accessControlMessage) +{ + lock(); + m_accessControlMessage = accessControlMessage; + unlock(); + + Q_EMIT accessControlMessageChanged(); +} + + + void ComputerControlInterface::setServerVersion(VeyonCore::ApplicationVersion version) { m_serverVersionQueryTimer.stop(); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 3fc7dff5a..b4550d241 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -106,6 +106,13 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_timestamp; } + const QString& accessControlMessage() const + { + return m_accessControlMessage; + } + + void setAccessControlMessage(const QString& accessControlMessage); + VeyonCore::ApplicationVersion serverVersion() const { return m_serverVersion; @@ -236,6 +243,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab VeyonCore::ApplicationVersion m_serverVersion{VeyonCore::ApplicationVersion::Unknown}; QTimer m_serverVersionQueryTimer{this}; + QString m_accessControlMessage{}; QTimer m_statePollingTimer{this}; QStringList m_groups; @@ -243,6 +251,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QMap m_properties; Q_SIGNALS: + void accessControlMessageChanged(); void framebufferSizeChanged(); void framebufferUpdated( QRect rect ); void scaledFramebufferUpdated(); From 4c72767a294b82ef89381ac47db7ea44a0f801eb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 28 Feb 2025 15:12:00 +0100 Subject: [PATCH 1679/1765] ComputerControlListModel: supply access control message in tooltip --- master/src/ComputerControlListModel.cpp | 15 +++++++++++++++ master/src/ComputerControlListModel.h | 1 + 2 files changed, 16 insertions(+) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 74b84b1ab..d03e5b072 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -365,6 +365,13 @@ void ComputerControlListModel::updateState( const QModelIndex& index ) +void ComputerControlListModel::updateAccessControlMessage(const QModelIndex& index) +{ + Q_EMIT dataChanged(index, index, { Qt::ToolTipRole }); +} + + + void ComputerControlListModel::updateScreen( const QModelIndex& index ) { Q_EMIT dataChanged( index, index, { Qt::DecorationRole, ImageIdRole, FramebufferRole } ); @@ -427,6 +434,9 @@ void ComputerControlListModel::startComputerControlInterface( ComputerControlInt connect(controlInterface, &ComputerControlInterface::sessionInfoChanged, this, [=]() { updateSessionInfo(interfaceIndex(controlInterface)); }); + + connect(controlInterface, &ComputerControlInterface::accessControlMessageChanged, + this, [=] () { updateAccessControlMessage(interfaceIndex(controlInterface)); }); } @@ -578,6 +588,11 @@ QString ComputerControlListModel::computerStateDescription( const ComputerContro break; } + if (controlInterface->accessControlMessage().isEmpty() == false) + { + return controlInterface->accessControlMessage(); + } + return tr( "Disconnected" ); } diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index b5d45d214..d7675574f 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -81,6 +81,7 @@ class ComputerControlListModel : public ComputerListModel QVariant uidRoleData(const ComputerControlInterface::Pointer& controlInterface) const; void updateState( const QModelIndex& index ); + void updateAccessControlMessage(const QModelIndex& index); void updateScreen( const QModelIndex& index ); void updateActiveFeatures( const QModelIndex& index ); void updateUser( const QModelIndex& index ); From ac295d1ec497d488f5a2e675f4d416df5cae73ed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Mar 2025 10:41:36 +0100 Subject: [PATCH 1680/1765] PlatformSessionFunctions: add default initializer for uptime --- core/src/PlatformSessionFunctions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/PlatformSessionFunctions.h b/core/src/PlatformSessionFunctions.h index 840a64e73..35ac17e8d 100644 --- a/core/src/PlatformSessionFunctions.h +++ b/core/src/PlatformSessionFunctions.h @@ -38,7 +38,7 @@ class VEYON_CORE_EXPORT PlatformSessionFunctions struct SessionInfo { SessionId id = InvalidSessionId; - SessionUptime uptime; + SessionUptime uptime = 0; QString clientAddress; QString clientName; QString hostName; From 63eb16397297adad3af13f37d9f8bc5907ab53e8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Mar 2025 13:38:43 +0100 Subject: [PATCH 1681/1765] Master: remove unreferenced image files --- master/resources/master.qrc | 2 -- .../preferences-desktop-display-blue.png | Bin 1242 -> 0 bytes master/resources/preferences-desktop-display.png | Bin 1193 -> 0 bytes 3 files changed, 2 deletions(-) delete mode 100644 master/resources/preferences-desktop-display-blue.png delete mode 100644 master/resources/preferences-desktop-display.png diff --git a/master/resources/master.qrc b/master/resources/master.qrc index 81f60f9e8..ed1a11088 100644 --- a/master/resources/master.qrc +++ b/master/resources/master.qrc @@ -2,8 +2,6 @@ zoom-fit-best.png camera-photo.png - preferences-desktop-display.png - preferences-desktop-display-blue.png preferences-desktop-display-orange.png preferences-desktop-display-gray.png preferences-desktop-display-red.png diff --git a/master/resources/preferences-desktop-display-blue.png b/master/resources/preferences-desktop-display-blue.png deleted file mode 100644 index 5668baf1ac5fc9ebb0d3f322ca7e5fae96bb7b44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1242 zcmWmCdr%Wc9Ki8Qh!qeDY0;V7C6_}{Anzb=LS7I^ibRUhY8Ay+bktT9n4xuQ45)}; z1SzFJ5VftPfT&cVV6Eb7w2X)d8U>8u(P&$-kmQm}AVb%g&+ogtGyC7}u?%&pzc1_y zL6E;nnVbn$-MjJj0=1h@y1?R2y}d`qR-3`mXRmTYJ_N;Ny&DoumjX5rtw6E9 zU`_7!g2JtNIZ$C?A#dlN-T9wy-J8S9&D&vkD}o`2L}aYeDBfNEW`=fPhNhjN9h{-* ztZ9;O*pW&*a?*}e*^zJU z^lCf(JDgsF)4#{*wK%;Fr`O|j15R(i84V7`DF>s`!8q+;oN+MDIv77V7(Y4~KRMBJ zPV{Fd+T=ukaiYymw8e?G66kpXZ6nYN1oI-nyhJeD3FfaZ=4BW2ii_FdVs^Tizqzn3 z7uM~@uDY?`-PkqviZIrSF!qXYfD;zyak)aCt&5s9+@z5JvKWh$sQDGFk{k#zX*7u`7Y- zxJV!-J_?9Uh>jCQ$0x=B3F25l1W4jU;yBPmKpHQS#Dj`u35n7KPzfLxNn|2WX;LB} zOBMriKp_E=Qlvm~stiyl@8>sLo&* zd76H`(udMX)_=K~1QBZT{B%nIiS1Y6u1}LPbBsDA^txwx;G>U|u=mC+(4DT}z&u+0 z$&Kw6wK9ZypF)OnEKGX>|TUB~`gx>*yy`B|{osTu@NvcFmPK%A00DT1O)pwFhl|LT1_%dp$oet1QGZ-#BH;e>S60xhM|cka!WV&R?K zT^{`E*JgEv*B|BCXPgT@d(}x@e6tMAoajfQ>c`#a!IoDCWdCKfg{)!USYJ|ibId|0 z-iLa`o`*#9t&8J~59KVQDrxQ%Z>es{y|in>tX#b;XwVgd92{yMzP*iIy#q(Z^K@Kaf{)0!fq_7k%L6Zsofzn%{8g{DRZ#E~6*eR=Ta+59UUTFCYE(fKaB zr>9C~xpDo>Ub4E!CzcdyrbMS_J4DlX?-2?Abm^Ym>Yl#7zA1j|p+&`cJ`eYU{{^WO L>f{UZ?Bf3cB3=>D diff --git a/master/resources/preferences-desktop-display.png b/master/resources/preferences-desktop-display.png deleted file mode 100644 index af00f34349df5aaf2af2c8f7ef3c9bd673b49e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1193 zcmWmCX;4#F6bJAZA`;P1s#Z-p7O@qwhY&*`gybb8tQL@E3RPJKNwrRaVQp*6R#2+8 zjUVdBQY+(7+75LbwJwMq%Az1bgvJB`L!ihGB7u^Gyh{&ve&>Jgow;+r-1BWrR4CPz z?uua;H9Sle3%z8cC}hZG^FNq;w1;{Sk90UJaMM7%VRa+lvV}-VC-k z6L7p)fXiTV7%aeLumO+B;xgHQ$K(J$i_K$k0H4JLK5P!3%>_Pe9uRPNJ{(BCFPA6a zLiz}KKyZ)`d__J$=qCUN#lAq~F9d!82Z2~30{(%10a8CnkQfBY{DBn61EjJ5$RL1A zq;d(QOc5A_2SUn$QYu$SA@SfKpis$x5~$@MI0Of(Pz6wjDMP}m>KY#R_IK+3dD5qU z+HdI58+FfL^ce^H2Zr>6FP{&Yj4wxCm_`T9W5c84rhi|Jj89D2iK#VW%7Lcs#Izkv zJJ5`cn6aZ-8!=}k<{)io-b&2d(1MkC4Qv1{T8Tv)dSfG&Y=mV4ve?nGjaas$6+5wF zNB@B}w7Q0@z=3QIWOtx70y&6v0zt_#E83(Ffxq(8S;?-6g^la}RfBg^*hfSP(Ts=Q;3bR4>A#+n%~9 zQib?#&stJe$b$uEnfAsl+(fbx34H?3o?6ZU@k&!lSBW2YcUt?2#B8a2xNos$#3T9E z;t^_dGhtA&v=NSim!saarc3q4!=2jLgij;YiLYKewOpmGtcrTpZ;On&p|3@e_e&B> ze=Xn@{d5M){wA(4;$6#kH1v)(&F74RAF#A?_jrPYRPFkev(^>fb4joCcodv(90&Hnvn%zCY+KiJ+k z*6=oBn5x}l??= Date: Fri, 7 Mar 2025 13:48:40 +0100 Subject: [PATCH 1682/1765] PlatformNetworkFunctions: improve ping result detection and evaluation --- core/src/PlatformNetworkFunctions.h | 13 ++- .../platform/linux/LinuxNetworkFunctions.cpp | 16 ++- .../platform/linux/LinuxNetworkFunctions.h | 2 +- .../windows/WindowsNetworkFunctions.cpp | 97 +++++++++++++++---- .../windows/WindowsNetworkFunctions.h | 8 +- plugins/testing/TestingCommandLinePlugin.cpp | 2 +- 6 files changed, 104 insertions(+), 34 deletions(-) diff --git a/core/src/PlatformNetworkFunctions.h b/core/src/PlatformNetworkFunctions.h index da2dce008..b92f9531f 100644 --- a/core/src/PlatformNetworkFunctions.h +++ b/core/src/PlatformNetworkFunctions.h @@ -33,14 +33,19 @@ class PlatformNetworkFunctions public: using Socket = uintptr_t; - enum { - PingTimeout = 1000, - PingProcessTimeout = PingTimeout*2 + static constexpr int PingTimeout = 1000; + static constexpr int PingProcessTimeout = 5000; + + enum class PingResult { + Unknown, + ReplyReceived, + TimedOut, + NameResolutionFailed }; virtual ~PlatformNetworkFunctions() = default; - virtual bool ping( const QString& hostAddress ) = 0; + virtual PingResult ping(const QString& hostAddress) = 0; virtual bool configureFirewallException( const QString& applicationPath, const QString& description, bool enabled ) = 0; virtual bool configureSocketKeepalive( Socket socket, bool enabled, int idleTime, int interval, int probes ) = 0; diff --git a/plugins/platform/linux/LinuxNetworkFunctions.cpp b/plugins/platform/linux/LinuxNetworkFunctions.cpp index 98f5f3b3a..7e91da43c 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.cpp +++ b/plugins/platform/linux/LinuxNetworkFunctions.cpp @@ -29,13 +29,23 @@ #include "LinuxNetworkFunctions.h" -bool LinuxNetworkFunctions::ping( const QString& hostAddress ) +LinuxNetworkFunctions::PingResult LinuxNetworkFunctions::ping(const QString& hostAddress) { QProcess pingProcess; pingProcess.start( QStringLiteral("ping"), { QStringLiteral("-c"), QStringLiteral("1"), QStringLiteral("-w"), QString::number( PingTimeout / 1000 ), hostAddress } ); - pingProcess.waitForFinished( PingProcessTimeout ); + if (pingProcess.waitForFinished(PingProcessTimeout)) + { + switch (pingProcess.exitCode()) + { + case 0: return PingResult::ReplyReceived; + case 1: return PingResult::TimedOut; + case 2: return PingResult::NameResolutionFailed; + default: + break; + } + } - return pingProcess.exitCode() == 0; + return PingResult::Unknown; } diff --git a/plugins/platform/linux/LinuxNetworkFunctions.h b/plugins/platform/linux/LinuxNetworkFunctions.h index 73f9750e9..d0d41548a 100644 --- a/plugins/platform/linux/LinuxNetworkFunctions.h +++ b/plugins/platform/linux/LinuxNetworkFunctions.h @@ -31,7 +31,7 @@ class LinuxNetworkFunctions : public PlatformNetworkFunctions { public: - bool ping( const QString& hostAddress ) override; + PingResult ping(const QString& hostAddress) override; bool configureFirewallException( const QString& applicationPath, const QString& description, bool enabled ) override; bool configureSocketKeepalive( Socket socket, bool enabled, int idleTime, int interval, int probes ) override; diff --git a/plugins/platform/windows/WindowsNetworkFunctions.cpp b/plugins/platform/windows/WindowsNetworkFunctions.cpp index 218aab410..07b30b40f 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.cpp +++ b/plugins/platform/windows/WindowsNetworkFunctions.cpp @@ -224,24 +224,32 @@ WindowsNetworkFunctions::WindowsNetworkFunctions() : PlatformNetworkFunctions() -bool WindowsNetworkFunctions::ping( const QString& hostAddress ) +WindowsNetworkFunctions::PingResult WindowsNetworkFunctions::ping(const QString& hostAddress) { - bool result; + auto result = PingResult::Unknown; - const auto convertedAddress = HostAddress(hostAddress).tryConvert(HostAddress::Type::IpAddress); - const auto addressProtocol = QHostAddress(convertedAddress).protocol(); - - if( addressProtocol == QAbstractSocket::IPv4Protocol && pingIPv4Address(convertedAddress, &result) ) + const auto ipAddress = HostAddress(hostAddress).convert(HostAddress::Type::IpAddress); + if (ipAddress.isEmpty() == false) { - return result; + const auto addressProtocol = QHostAddress(ipAddress).protocol(); + + if (addressProtocol == QAbstractSocket::IPv4Protocol && pingIPv4Address(ipAddress, &result)) + { + return result; + } + + if (addressProtocol == QAbstractSocket::IPv6Protocol && pingIPv6Address(ipAddress, &result)) + { + return result; + } } - if( addressProtocol == QAbstractSocket::IPv6Protocol && pingIPv6Address(convertedAddress, &result) ) + if (pingViaUtility(hostAddress, &result)) { return result; } - return pingViaUtility(hostAddress); + return PingResult::Unknown; } @@ -328,14 +336,14 @@ bool WindowsNetworkFunctions::configureSocketKeepalive( Socket socket, bool enab -bool WindowsNetworkFunctions::pingIPv4Address( const QString& hostAddress, bool* result ) +bool WindowsNetworkFunctions::pingIPv4Address(const QString& hostAddress, PingResult* result) { if( result == nullptr ) { return false; } - *result = false; + *result = PingResult::Unknown; const IPAddr ipAddress = inet_addr(hostAddress.toLatin1().constData()); if( ipAddress == INADDR_NONE ) @@ -363,23 +371,29 @@ bool WindowsNetworkFunctions::pingIPv4Address( const QString& hostAddress, bool* if( success ) { - *result = true; + *result = PingResult::ReplyReceived; + return true; + } + + if (error == IP_REQ_TIMED_OUT) + { + *result = PingResult::TimedOut; return true; } - return error == IP_REQ_TIMED_OUT; + return false; } -bool WindowsNetworkFunctions::pingIPv6Address( const QString& hostAddress, bool* result ) +bool WindowsNetworkFunctions::pingIPv6Address(const QString& hostAddress, PingResult* result) { if( result == nullptr ) { return false; } - *result = false; + *result = PingResult::Unknown; SOCKADDR_IN6 icmp6LocalAddr{}; icmp6LocalAddr.sin6_addr = in6addr_any; @@ -446,20 +460,61 @@ bool WindowsNetworkFunctions::pingIPv6Address( const QString& hostAddress, bool* if( success ) { - *result = true; + *result = PingResult::ReplyReceived; return true; } - return error == IP_REQ_TIMED_OUT; + if (error == IP_REQ_TIMED_OUT) + { + *result = PingResult::TimedOut; + return true; + } + + return false; } -bool WindowsNetworkFunctions::pingViaUtility( const QString& hostAddress ) +bool WindowsNetworkFunctions::pingViaUtility(const QString& hostAddress, PingResult* result) { + if (result == nullptr) + { + return false; + } + + *result = PingResult::Unknown; + + const QStringList pingArguments = { + QStringLiteral("-n"), QStringLiteral("1"), + QStringLiteral("-w"), QString::number(PingTimeout), + hostAddress + }; + QProcess pingProcess; - pingProcess.start( QStringLiteral("ping"), { QStringLiteral("-n"), QStringLiteral("1"), QStringLiteral("-w"), QString::number( PingTimeout ), hostAddress } ); - pingProcess.waitForFinished( PingProcessTimeout ); + pingProcess.start(QStringLiteral("ping"), pingArguments); + if (pingProcess.waitForStarted(PingProcessTimeout)) + { + if (pingProcess.waitForFinished(PingProcessTimeout)) + { + if (QString::fromUtf8(pingProcess.readAll()).split(QLatin1Char('\n')).filter(QStringLiteral("=")).size() >= 2) + { + *result = PingResult::ReplyReceived; + } + else if (pingProcess.exitCode() == 1) + { + *result = PingResult::NameResolutionFailed; + } + else + { + *result = PingResult::TimedOut; + } + } + else + { + *result = PingResult::NameResolutionFailed; + } + return true; + } - return pingProcess.exitCode() == 0; + return false; } diff --git a/plugins/platform/windows/WindowsNetworkFunctions.h b/plugins/platform/windows/WindowsNetworkFunctions.h index 99a4cdb0c..d86144c40 100644 --- a/plugins/platform/windows/WindowsNetworkFunctions.h +++ b/plugins/platform/windows/WindowsNetworkFunctions.h @@ -35,7 +35,7 @@ class WindowsNetworkFunctions : public PlatformNetworkFunctions public: WindowsNetworkFunctions(); - bool ping( const QString& hostAddress ) override; + PingResult ping(const QString& hostAddress) override; bool configureFirewallException( const QString& applicationPath, const QString& description, bool enabled ) override; bool configureSocketKeepalive( Socket socket, bool enabled, int idleTime, int interval, int probes ) override; @@ -43,8 +43,8 @@ class WindowsNetworkFunctions : public PlatformNetworkFunctions static constexpr auto WindowsFirewallServiceError = HRESULT(0x800706D9); private: - bool pingIPv4Address( const QString& hostAddress, bool* result ); - bool pingIPv6Address( const QString& hostAddress, bool* result ); - bool pingViaUtility( const QString& hostAddress ); + bool pingIPv4Address(const QString& hostAddress, PingResult* result); + bool pingIPv6Address(const QString& hostAddress, PingResult* result); + bool pingViaUtility(const QString& hostAddress, PingResult* result); }; diff --git a/plugins/testing/TestingCommandLinePlugin.cpp b/plugins/testing/TestingCommandLinePlugin.cpp index e24791f97..481627d0e 100644 --- a/plugins/testing/TestingCommandLinePlugin.cpp +++ b/plugins/testing/TestingCommandLinePlugin.cpp @@ -133,5 +133,5 @@ CommandLinePluginInterface::RunResult TestingCommandLinePlugin::handle_ping( con return NotEnoughArguments; } - return VeyonCore::platform().networkFunctions().ping( arguments.first() ) ? Successful : Failed; + return VeyonCore::platform().networkFunctions().ping( arguments.first() ) == PlatformNetworkFunctions::PingResult::ReplyReceived ? Successful : Failed; } From 029d234fae3df8f5d1b01eff88944edac329cc30 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Mar 2025 13:49:19 +0100 Subject: [PATCH 1683/1765] VncConnection: add state HostNameResolutionFailed --- core/src/ComputerControlInterface.cpp | 1 + core/src/VncConnection.cpp | 19 +++++++++++++++---- core/src/VncConnection.h | 1 + 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 21addbb20..29af78062 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -475,6 +475,7 @@ void ComputerControlInterface::updateState() case VncConnection::State::Connecting: m_state = State::Connecting; break; case VncConnection::State::Connected: m_state = State::Connected; break; case VncConnection::State::HostOffline: m_state = State::HostOffline; break; + case VncConnection::State::HostNameResolutionFailed: m_state = State::HostNameResolutionFailed; break; case VncConnection::State::ServerNotRunning: m_state = State::ServerNotRunning; break; case VncConnection::State::AuthenticationFailed: m_state = State::AuthenticationFailed; break; default: m_state = VncConnection::State::Disconnected; break; diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index e77e64c0f..d40a8857e 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -486,15 +486,26 @@ void VncConnection::establishConnection() // guess reason why connection failed if( isControlFlagSet( ControlFlag::ServerReachable ) == false ) { - if( isControlFlagSet( ControlFlag::SkipHostPing ) || - VeyonCore::platform().networkFunctions().ping( m_host ) == false ) + if (isControlFlagSet(ControlFlag::SkipHostPing)) { - setState( State::HostOffline ); + setState(State::HostOffline); } else { - setState( State::ServerNotRunning ); + const auto pingResult = VeyonCore::platform().networkFunctions().ping(m_host); + switch (pingResult) + { + case PlatformNetworkFunctions::PingResult::ReplyReceived: + setState(State::ServerNotRunning); + break; + case PlatformNetworkFunctions::PingResult::NameResolutionFailed: + setState(State::HostNameResolutionFailed); + break; + default: + setState(State::HostOffline); + } } + } else if( m_framebufferState == FramebufferState::Invalid ) { diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index af57d890c..1250a11cd 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -70,6 +70,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread Disconnected, Connecting, HostOffline, + HostNameResolutionFailed, ServerNotRunning, AuthenticationFailed, ConnectionFailed, From 15afe51a75bbfebeb65e79daa393f31c6a1a05bf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 7 Mar 2025 13:49:34 +0100 Subject: [PATCH 1684/1765] ComputerControlListModel: handle ComputerControlInterface::State::HostNameResolutionFailed --- master/src/ComputerControlListModel.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index d03e5b072..624f2ac11 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -578,6 +578,9 @@ QString ComputerControlListModel::computerStateDescription( const ComputerContro case ComputerControlInterface::State::HostOffline: return tr( "Computer offline or switched off" ); + case ComputerControlInterface::State::HostNameResolutionFailed: + return tr("Hostname could not be resolved"); + case ComputerControlInterface::State::ServerNotRunning: return tr( "Veyon Server unreachable or not running" ); From 0cf1a94a084a52f65321c05c93e4a7c25c2a72cb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 09:10:03 +0100 Subject: [PATCH 1685/1765] Computer: rename name to displayName --- core/src/Computer.cpp | 4 ++-- core/src/Computer.h | 12 ++++++------ master/src/ComputerControlListModel.cpp | 14 +++++++------- master/src/ComputerManager.cpp | 2 +- master/src/ComputerZoomWidget.cpp | 4 ++-- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 4 ++-- plugins/remoteaccess/RemoteAccessPage.h | 2 +- plugins/remoteaccess/RemoteAccessWidget.cpp | 10 +++++----- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/core/src/Computer.cpp b/core/src/Computer.cpp index c170c4e05..6ea51173d 100644 --- a/core/src/Computer.cpp +++ b/core/src/Computer.cpp @@ -25,12 +25,12 @@ #include "Computer.h" Computer::Computer( NetworkObject::Uid networkObjectUid, - const QString& name, + const QString& displayName, const QString& hostAddress, const QString& macAddress, const QString& location ) : m_networkObjectUid( networkObjectUid ), - m_name( name ), + m_displayName(displayName), m_hostAddress( hostAddress ), m_macAddress( macAddress ), m_location( location ) diff --git a/core/src/Computer.h b/core/src/Computer.h index f393e0c68..4c9327a06 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -35,7 +35,7 @@ class VEYON_CORE_EXPORT Computer { public: explicit Computer( NetworkObject::Uid networkObjectUid = NetworkObject::Uid(), - const QString& name = {}, + const QString& displayName = {}, const QString& hostAddress = {}, const QString& macAddress = {}, const QString& location = {} ); @@ -55,14 +55,14 @@ class VEYON_CORE_EXPORT Computer return m_networkObjectUid; } - void setName( const QString& name ) + void setDisplayName(const QString& displayName) { - m_name = name; + m_displayName = displayName; } - QString name() const + const QString& displayName() const { - return m_name; + return m_displayName; } void setHostAddress( const QString& hostAddress ) @@ -97,7 +97,7 @@ class VEYON_CORE_EXPORT Computer private: NetworkObject::Uid m_networkObjectUid; - QString m_name; + QString m_displayName; QString m_hostAddress; QString m_macAddress; QString m_location; diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 624f2ac11..9064b80f2 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -491,7 +491,7 @@ QImage ComputerControlListModel::scaleAndAlignIcon( const QImage& icon, QSize si QString ComputerControlListModel::computerToolTipRole( const ComputerControlInterface::Pointer& controlInterface ) const { const QString state( computerStateDescription( controlInterface ) ); - const QString name( tr( "Name: %1" ).arg( controlInterface->computer().name() ) ); + const QString displayName(tr("Name: %1").arg(controlInterface->computer().displayName())); const QString location( tr( "Location: %1" ).arg( controlInterface->computer().location() ) ); const QString host( tr( "Host/IP address: %1" ).arg( controlInterface->computer().hostAddress().isEmpty() ? QStringLiteral("<%1>").arg( tr("invalid") ) @@ -501,10 +501,10 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte if( user.isEmpty() ) { - return QStringLiteral("%1
    %2
    %3
    %4
    %5").arg(state, name, location, host, features); + return QStringLiteral("%1
    %2
    %3
    %4
    %5").arg(state, displayName, location, host, features); } - return QStringLiteral("%1
    %2
    %3
    %4
    %5
    %6").arg(state, name, location, host, features, user); + return QStringLiteral("%1
    %2
    %3
    %4
    %5
    %6").arg(state, displayName, location, host, features, user); } @@ -526,12 +526,12 @@ QString ComputerControlListModel::computerDisplayRole( const ComputerControlInte return user; } - return QStringLiteral("%1 - %2").arg( user, controlInterface->computer().name() ); + return QStringLiteral("%1 - %2").arg(user, controlInterface->computer().displayName()); } if( displayRoleContent() != DisplayRoleContent::UserName ) { - return controlInterface->computer().name(); + return controlInterface->computer().displayName(); } return tr("[no user]"); @@ -544,11 +544,11 @@ QString ComputerControlListModel::computerSortRole( const ComputerControlInterfa switch( sortOrder() ) { case SortOrder::ComputerAndUserName: - return controlInterface->computer().location() + controlInterface->computer().name() + + return controlInterface->computer().location() + controlInterface->computer().displayName() + controlInterface->computer().hostAddress() + controlInterface->userLoginName(); case SortOrder::ComputerName: - return controlInterface->computer().location() + controlInterface->computer().name() + + return controlInterface->computer().location() + controlInterface->computer().displayName() + controlInterface->computer().hostAddress(); case SortOrder::UserName: diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 4a386b859..8b27af466 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -120,7 +120,7 @@ bool ComputerManager::saveComputerAndUsersList( const QString& fileName ) // fetch user const auto user = m_networkObjectOverlayDataModel->data( mapToUserNameModelIndex( networkObjectIndex ) ).toString(); // create new line with computer and user - lines += computer.name() + QLatin1Char(';') + computer.hostAddress() + QLatin1Char(';') + user; // clazy:exclude=reserve-candidates + lines += computer.displayName() + QLatin1Char(';') + computer.hostAddress() + QLatin1Char(';') + user; // clazy:exclude=reserve-candidates } } diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index cbd98ece8..6c581bdb7 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -139,13 +139,13 @@ void ComputerZoomWidget::updateComputerZoomWidgetTitle() if (username.isEmpty()) { - setWindowTitle( QStringLiteral( "%1 - %2" ).arg( m_vncView->computerControlInterface()->computer().name(), + setWindowTitle( QStringLiteral( "%1 - %2" ).arg( m_vncView->computerControlInterface()->computer().displayName(), VeyonCore::applicationName() ) ); } else { setWindowTitle( QStringLiteral( "%1 - %2 - %3" ).arg( username, - m_vncView->computerControlInterface()->computer().name(), + m_vncView->computerControlInterface()->computer().displayName(), VeyonCore::applicationName() ) ); } } diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index 40f65158f..b6a902346 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -135,7 +135,7 @@ bool RemoteAccessFeaturePlugin::startFeature( VeyonMasterInterface& master, cons Computer customComputer; customComputer.setHostAddress( hostName ); - customComputer.setName( hostName ); + customComputer.setDisplayName(hostName); createRemoteAccessWindow(ComputerControlInterface::Pointer::create(customComputer), viewOnly, &master); } @@ -342,7 +342,7 @@ bool RemoteAccessFeaturePlugin::remoteAccess( const QString& hostAddress, bool v } Computer remoteComputer; - remoteComputer.setName( hostAddress ); + remoteComputer.setDisplayName(hostAddress); remoteComputer.setHostAddress( hostAddress ); if( remoteControlEnabled() == false ) diff --git a/plugins/remoteaccess/RemoteAccessPage.h b/plugins/remoteaccess/RemoteAccessPage.h index 1a1ee2fb4..8eab5ea19 100644 --- a/plugins/remoteaccess/RemoteAccessPage.h +++ b/plugins/remoteaccess/RemoteAccessPage.h @@ -50,7 +50,7 @@ class RemoteAccessPage : public QObject QString computerName() const { - return m_computerControlInterface->computer().name(); + return m_computerControlInterface->computer().displayName(); } QQuickItem* view() const; diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 79b551c61..f65ac9e9f 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -503,13 +503,13 @@ void RemoteAccessWidget::updateRemoteAccessTitle() if (username.isEmpty() ) { - setWindowTitle( tr( "%1 - %2 Remote Access" ).arg( m_computerControlInterface->computer().name(), - VeyonCore::applicationName() ) ); + setWindowTitle(tr("%1 - %2 Remote Access").arg(m_computerControlInterface->computer().displayName(), + VeyonCore::applicationName())); } else { - setWindowTitle( tr( "%1 - %2 - %3 Remote Access" ).arg( username, - m_computerControlInterface->computer().name(), - VeyonCore::applicationName() ) ); + setWindowTitle(tr("%1 - %2 - %3 Remote Access").arg(username, + m_computerControlInterface->computer().displayName(), + VeyonCore::applicationName())); } } From ccc7269a0952581b7d43cfd2e8e5a1155c53dc57 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 09:15:26 +0100 Subject: [PATCH 1686/1765] Computer: rename hostAddress to hostName --- cli/src/FeatureCommands.cpp | 2 +- core/src/Computer.cpp | 4 ++-- core/src/Computer.h | 12 ++++++------ core/src/ComputerControlInterface.cpp | 8 ++++---- core/src/Screenshot.cpp | 4 ++-- master/src/ComputerControlListModel.cpp | 11 ++++++----- master/src/ComputerManager.cpp | 4 ++-- plugins/demo/DemoFeaturePlugin.cpp | 2 +- plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp | 4 ++-- 9 files changed, 26 insertions(+), 25 deletions(-) diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index 7ea9a11c6..6574118b2 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -270,7 +270,7 @@ CommandLinePluginInterface::RunResult FeatureCommands::controlComputer( FeatureP } Computer computer; - computer.setHostAddress( host ); + computer.setHostName(host); auto computerControlInterface = ComputerControlInterface::Pointer::create( computer ); computerControlInterface->start(); diff --git a/core/src/Computer.cpp b/core/src/Computer.cpp index 6ea51173d..e4d91605c 100644 --- a/core/src/Computer.cpp +++ b/core/src/Computer.cpp @@ -26,12 +26,12 @@ Computer::Computer( NetworkObject::Uid networkObjectUid, const QString& displayName, - const QString& hostAddress, + const QString& hostName, const QString& macAddress, const QString& location ) : m_networkObjectUid( networkObjectUid ), m_displayName(displayName), - m_hostAddress( hostAddress ), + m_hostName(hostName), m_macAddress( macAddress ), m_location( location ) { diff --git a/core/src/Computer.h b/core/src/Computer.h index 4c9327a06..b80ea7bc2 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -36,7 +36,7 @@ class VEYON_CORE_EXPORT Computer public: explicit Computer( NetworkObject::Uid networkObjectUid = NetworkObject::Uid(), const QString& displayName = {}, - const QString& hostAddress = {}, + const QString& hostName = {}, const QString& macAddress = {}, const QString& location = {} ); @@ -65,14 +65,14 @@ class VEYON_CORE_EXPORT Computer return m_displayName; } - void setHostAddress( const QString& hostAddress ) + void setHostName(const QString& hostName) { - m_hostAddress = hostAddress; + m_hostName = hostName; } - QString hostAddress() const + QString hostName() const { - return m_hostAddress; + return m_hostName; } void setMacAddress( const QString& macAddress ) @@ -98,7 +98,7 @@ class VEYON_CORE_EXPORT Computer private: NetworkObject::Uid m_networkObjectUid; QString m_displayName; - QString m_hostAddress; + QString m_hostName; QString m_macAddress; QString m_location; diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 29af78062..5955006dd 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -74,12 +74,12 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up m_scaledFramebufferSize = scaledFramebufferSize; - if( m_computer.hostAddress().isEmpty() == false ) + if (m_computer.hostName().isEmpty() == false) { m_connection = new VeyonConnection; auto vncConnection = m_connection->vncConnection(); - vncConnection->setHost( m_computer.hostAddress() ); + vncConnection->setHost(m_computer.hostName()); if( m_port > 0 ) { vncConnection->setPort( m_port ); @@ -596,7 +596,7 @@ QDebug operator<<(QDebug stream, ComputerControlInterface::Pointer computerContr { if (computerControlInterface.isNull() == false) { - stream << qUtf8Printable(computerControlInterface->computer().hostAddress()); + stream << qUtf8Printable(computerControlInterface->computer().hostName()); } return stream; } @@ -611,7 +611,7 @@ QDebug operator<<(QDebug stream, const ComputerControlInterfaceList& computerCon { if (computerControlInterface.isNull() == false) { - hostAddresses.append(computerControlInterface->computer().hostAddress()); + hostAddresses.append(computerControlInterface->computer().hostName()); } } diff --git a/core/src/Screenshot.cpp b/core/src/Screenshot.cpp index 48f976abf..bfd9be4db 100644 --- a/core/src/Screenshot.cpp +++ b/core/src/Screenshot.cpp @@ -73,7 +73,7 @@ void Screenshot::take( const ComputerControlInterface::Pointer& computerControlI } // construct filename - m_fileName = dir + QDir::separator() + constructFileName( userLogin, computerControlInterface->computer().hostAddress() ); + m_fileName = dir + QDir::separator() + constructFileName(userLogin, computerControlInterface->computer().hostName()); QFile outputFile( m_fileName ); if( VeyonCore::platform().filesystemFunctions().openFileSafely( @@ -98,7 +98,7 @@ void Screenshot::take( const ComputerControlInterface::Pointer& computerControlI user = QStringLiteral( "%1 (%2)" ).arg( userLogin, computerControlInterface->userFullName() ); } - const auto host = computerControlInterface->computer().hostAddress(); + const auto host = computerControlInterface->computer().hostName(); const auto date = QDate::currentDate().toString( Qt::ISODate ); const auto time = QTime::currentTime().toString( Qt::ISODate ); diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 9064b80f2..80272e5b1 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -493,9 +493,10 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte const QString state( computerStateDescription( controlInterface ) ); const QString displayName(tr("Name: %1").arg(controlInterface->computer().displayName())); const QString location( tr( "Location: %1" ).arg( controlInterface->computer().location() ) ); - const QString host( tr( "Host/IP address: %1" ).arg( controlInterface->computer().hostAddress().isEmpty() - ? QStringLiteral("<%1>").arg( tr("invalid") ) - : controlInterface->computer().hostAddress() ) ); + const QString host(tr("Host/IP address: %1").arg(controlInterface->computer().hostName().isEmpty() ? + QStringLiteral("<%1>").arg(tr("invalid")) + : + controlInterface->computer().hostName())); const QString user( userInformation( controlInterface ) ); const QString features( tr( "Active features: %1" ).arg( activeFeatures( controlInterface ) ) ); @@ -545,11 +546,11 @@ QString ComputerControlListModel::computerSortRole( const ComputerControlInterfa { case SortOrder::ComputerAndUserName: return controlInterface->computer().location() + controlInterface->computer().displayName() + - controlInterface->computer().hostAddress() + controlInterface->userLoginName(); + controlInterface->computer().hostName() + controlInterface->userLoginName(); case SortOrder::ComputerName: return controlInterface->computer().location() + controlInterface->computer().displayName() + - controlInterface->computer().hostAddress(); + controlInterface->computer().hostName(); case SortOrder::UserName: if( controlInterface->userFullName().isEmpty() == false ) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 8b27af466..984fa0610 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -120,7 +120,7 @@ bool ComputerManager::saveComputerAndUsersList( const QString& fileName ) // fetch user const auto user = m_networkObjectOverlayDataModel->data( mapToUserNameModelIndex( networkObjectIndex ) ).toString(); // create new line with computer and user - lines += computer.displayName() + QLatin1Char(';') + computer.hostAddress() + QLatin1Char(';') + user; // clazy:exclude=reserve-candidates + lines += computer.displayName() + QLatin1Char(';') + computer.hostName() + QLatin1Char(';') + user; // clazy:exclude=reserve-candidates } } @@ -199,7 +199,7 @@ void ComputerManager::updateSessionInfo(const ComputerControlInterface::Pointer& switch (m_computerNameSource) { case NetworkObjectDirectory::ComputerNameSource::HostAddress: - computerName = controlInterface->computer().hostAddress(); + computerName = controlInterface->computer().hostName(); break; case NetworkObjectDirectory::ComputerNameSource::SessionClientName: computerName = controlInterface->sessionInfo().clientName; diff --git a/plugins/demo/DemoFeaturePlugin.cpp b/plugins/demo/DemoFeaturePlugin.cpp index 6566af8c3..fc2b5b502 100644 --- a/plugins/demo/DemoFeaturePlugin.cpp +++ b/plugins/demo/DemoFeaturePlugin.cpp @@ -212,7 +212,7 @@ bool DemoFeaturePlugin::startFeature( VeyonMasterInterface& master, const Featur auto demoServerPort = VeyonCore::config().demoServerPort(); const auto& demoServerInterface = selectedComputerControlInterfaces.constFirst(); - const auto demoServerHost = demoServerInterface->computer().hostAddress(); + const auto demoServerHost = demoServerInterface->computer().hostName(); const auto primaryServerPort = HostAddress::parsePortNumber( demoServerHost ); if( primaryServerPort > 0 ) diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index b6a902346..dbabd1460 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -134,7 +134,7 @@ bool RemoteAccessFeaturePlugin::startFeature( VeyonMasterInterface& master, cons } Computer customComputer; - customComputer.setHostAddress( hostName ); + customComputer.setHostName(hostName); customComputer.setDisplayName(hostName); createRemoteAccessWindow(ComputerControlInterface::Pointer::create(customComputer), viewOnly, &master); @@ -343,7 +343,7 @@ bool RemoteAccessFeaturePlugin::remoteAccess( const QString& hostAddress, bool v Computer remoteComputer; remoteComputer.setDisplayName(hostAddress); - remoteComputer.setHostAddress( hostAddress ); + remoteComputer.setHostName(hostAddress); if( remoteControlEnabled() == false ) { From 5e9abdfb3832187739da310b7cba9239f00aa603 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 09:20:23 +0100 Subject: [PATCH 1687/1765] Computer: add hostAddress property This allows accessing the parsed host address alternatively to the hostname. --- cli/src/FeatureCommands.cpp | 2 +- core/src/Computer.cpp | 5 +++-- core/src/Computer.h | 16 +++++++++++----- .../remoteaccess/RemoteAccessFeaturePlugin.cpp | 16 ++++++++-------- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/cli/src/FeatureCommands.cpp b/cli/src/FeatureCommands.cpp index 6574118b2..0edd1ff56 100644 --- a/cli/src/FeatureCommands.cpp +++ b/cli/src/FeatureCommands.cpp @@ -270,7 +270,7 @@ CommandLinePluginInterface::RunResult FeatureCommands::controlComputer( FeatureP } Computer computer; - computer.setHostName(host); + computer.setHostAddress(host); auto computerControlInterface = ComputerControlInterface::Pointer::create( computer ); computerControlInterface->start(); diff --git a/core/src/Computer.cpp b/core/src/Computer.cpp index e4d91605c..2c1071808 100644 --- a/core/src/Computer.cpp +++ b/core/src/Computer.cpp @@ -26,12 +26,13 @@ Computer::Computer( NetworkObject::Uid networkObjectUid, const QString& displayName, - const QString& hostName, + const QString& hostAddress, const QString& macAddress, const QString& location ) : m_networkObjectUid( networkObjectUid ), m_displayName(displayName), - m_hostName(hostName), + m_hostName(hostAddress), + m_hostAddress(hostAddress), m_macAddress( macAddress ), m_location( location ) { diff --git a/core/src/Computer.h b/core/src/Computer.h index b80ea7bc2..63ed4edea 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -36,7 +36,7 @@ class VEYON_CORE_EXPORT Computer public: explicit Computer( NetworkObject::Uid networkObjectUid = NetworkObject::Uid(), const QString& displayName = {}, - const QString& hostName = {}, + const QString& hostAddress = {}, const QString& macAddress = {}, const QString& location = {} ); @@ -65,12 +65,18 @@ class VEYON_CORE_EXPORT Computer return m_displayName; } - void setHostName(const QString& hostName) + void setHostAddress(const QString& hostAddress) { - m_hostName = hostName; + m_hostName = hostAddress; + m_hostAddress = QHostAddress{hostAddress}; } - QString hostName() const + const QHostAddress& hostAddress() const + { + return m_hostAddress; + } + + const QString& hostName() const { return m_hostName; } @@ -99,9 +105,9 @@ class VEYON_CORE_EXPORT Computer NetworkObject::Uid m_networkObjectUid; QString m_displayName; QString m_hostName; + QHostAddress m_hostAddress; QString m_macAddress; QString m_location; - }; using ComputerList = QVector; diff --git a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp index dbabd1460..c0d93d0fa 100644 --- a/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp +++ b/plugins/remoteaccess/RemoteAccessFeaturePlugin.cpp @@ -124,18 +124,18 @@ bool RemoteAccessFeaturePlugin::startFeature( VeyonMasterInterface& master, cons } else { - const auto hostName = QInputDialog::getText( master.mainWindow(), - tr( "Remote access" ), - tr( "No computer has been selected so you can enter a hostname " - "or IP address of a computer for manual access:" ) ); - if( hostName.isEmpty() ) + const auto hostAddress = QInputDialog::getText(master.mainWindow(), + tr("Remote access"), + tr("No computer has been selected so you can enter a hostname " + "or IP address of a computer for manual access:")); + if (hostAddress.isEmpty()) { return false; } Computer customComputer; - customComputer.setHostName(hostName); - customComputer.setDisplayName(hostName); + customComputer.setHostAddress(hostAddress); + customComputer.setDisplayName(hostAddress); createRemoteAccessWindow(ComputerControlInterface::Pointer::create(customComputer), viewOnly, &master); } @@ -343,7 +343,7 @@ bool RemoteAccessFeaturePlugin::remoteAccess( const QString& hostAddress, bool v Computer remoteComputer; remoteComputer.setDisplayName(hostAddress); - remoteComputer.setHostName(hostAddress); + remoteComputer.setHostAddress(hostAddress); if( remoteControlEnabled() == false ) { From 25250209e4519a4331225f6aca88d156dad8d959 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 09:27:17 +0100 Subject: [PATCH 1688/1765] ComputerControlListModel: show hostname or IP address in tooltip --- master/src/ComputerControlListModel.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 80272e5b1..083ff1ac3 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -493,10 +493,14 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte const QString state( computerStateDescription( controlInterface ) ); const QString displayName(tr("Name: %1").arg(controlInterface->computer().displayName())); const QString location( tr( "Location: %1" ).arg( controlInterface->computer().location() ) ); - const QString host(tr("Host/IP address: %1").arg(controlInterface->computer().hostName().isEmpty() ? - QStringLiteral("<%1>").arg(tr("invalid")) - : - controlInterface->computer().hostName())); + const QString host = + controlInterface->computer().hostAddress().isNull() ? + tr("Hostname: %1").arg(controlInterface->computer().hostName().isEmpty() ? + QStringLiteral("<%1>").arg(tr("unknown")) + : + controlInterface->computer().hostName()) + : + tr("IP address: %1").arg(controlInterface->computer().hostAddress().toString()); const QString user( userInformation( controlInterface ) ); const QString features( tr( "Active features: %1" ).arg( activeFeatures( controlInterface ) ) ); From 04a6d3c7f5b0b53d6e08bca196c5f9980d092f0f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 14:16:19 +0100 Subject: [PATCH 1689/1765] VncClientProtocol: separate setting and sending pixel format and encodings This also introduces a setter for the pixel format used internally. --- core/src/VncClientProtocol.cpp | 55 +++++++++++++++++++++------------- core/src/VncClientProtocol.h | 8 +++-- plugins/demo/DemoServer.cpp | 37 ++++++++++++----------- 3 files changed, 61 insertions(+), 39 deletions(-) diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 23d242070..5245c51b4 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -114,24 +114,40 @@ bool VncClientProtocol::read() // Flawfinder: ignore -bool VncClientProtocol::setPixelFormat( rfbPixelFormat pixelFormat ) +void VncClientProtocol::setPixelFormat(rfbPixelFormat pixelFormat) +{ + m_pixelFormat = pixelFormat; +} + + + +void VncClientProtocol::setEncodings(const QVector& encodings) +{ + m_encodings = encodings; +} + + + +bool VncClientProtocol::sendPixelFormat() { rfbSetPixelFormatMsg spf{}; spf.type = rfbSetPixelFormat; - spf.format = pixelFormat; - spf.format.redMax = qFromBigEndian(pixelFormat.redMax); - spf.format.greenMax = qFromBigEndian(pixelFormat.greenMax); - spf.format.blueMax = qFromBigEndian(pixelFormat.blueMax); - - return m_socket->write( reinterpret_cast( &spf ), sz_rfbSetPixelFormatMsg ) == sz_rfbSetPixelFormatMsg; + spf.pad1 = 0; + spf.pad2 = 0; + spf.format = m_pixelFormat; + spf.format.redMax = qToBigEndian(spf.format.redMax); + spf.format.greenMax = qToBigEndian(spf.format.greenMax); + spf.format.blueMax = qToBigEndian(spf.format.blueMax); + + return m_socket->write(reinterpret_cast(&spf), sz_rfbSetPixelFormatMsg) == sz_rfbSetPixelFormatMsg; } -bool VncClientProtocol::setEncodings( const QVector& encodings ) +bool VncClientProtocol::sendEncodings() { - if( encodings.size() > MAX_ENCODINGS ) + if (m_encodings.size() > MAX_ENCODINGS) { return false; } @@ -141,18 +157,17 @@ bool VncClientProtocol::setEncodings( const QVector& encodings ) std::array encs{}; - for( auto encoding : encodings ) + for (const auto encoding : std::as_const(m_encodings)) { - encs.at(setEncodingsMsg.nEncodings++) = qFromBigEndian( encoding ); + encs.at(setEncodingsMsg.nEncodings++) = qToBigEndian( encoding ); } const auto len = setEncodingsMsg.nEncodings * 4; - setEncodingsMsg.nEncodings = qFromBigEndian(setEncodingsMsg.nEncodings); + setEncodingsMsg.nEncodings = qToBigEndian(setEncodingsMsg.nEncodings); - return m_socket->write( reinterpret_cast( &setEncodingsMsg ), sz_rfbSetEncodingsMsg) == - sz_rfbSetEncodingsMsg && - m_socket->write( reinterpret_cast( encs.data() ), len ) == len; + return m_socket->write(reinterpret_cast(&setEncodingsMsg), sz_rfbSetEncodingsMsg) == sz_rfbSetEncodingsMsg && + m_socket->write(reinterpret_cast(encs.data()), len) == len; } @@ -374,8 +389,8 @@ bool VncClientProtocol::receiveServerInitMessage() { rfbServerInitMsg message; - if( m_socket->bytesAvailable() >= sz_rfbServerInitMsg && - m_socket->peek( reinterpret_cast( &message ), sz_rfbServerInitMsg ) == sz_rfbServerInitMsg ) + if (m_socket->bytesAvailable() >= sz_rfbServerInitMsg && + m_socket->peek(reinterpret_cast(&message), sz_rfbServerInitMsg) == sz_rfbServerInitMsg) { const auto nameLength = qFromBigEndian( message.nameLength ); @@ -664,8 +679,8 @@ bool VncClientProtocol::handleRectEncodingCoRRE( QBuffer& buffer, uint bytesPerP bool VncClientProtocol::handleRectEncodingHextile( QBuffer& buffer, - const rfbFramebufferUpdateRectHeader rectHeader, - uint bytesPerPixel ) + const rfbFramebufferUpdateRectHeader rectHeader, + uint bytesPerPixel ) { const uint rx = rectHeader.r.x; const uint ry = rectHeader.r.y; @@ -845,7 +860,7 @@ bool VncClientProtocol::handleRectEncodingTight(QBuffer& buffer, if ((compCtl & rfbTightNoZlib) == rfbTightNoZlib) { - compCtl &= ~(rfbTightNoZlib); + compCtl &= ~(rfbTightNoZlib); } if (compCtl == rfbTightFill) diff --git a/core/src/VncClientProtocol.h b/core/src/VncClientProtocol.h index 7c036c7f5..a7d709788 100644 --- a/core/src/VncClientProtocol.h +++ b/core/src/VncClientProtocol.h @@ -75,8 +75,11 @@ class VEYON_CORE_EXPORT VncClientProtocol return m_framebufferHeight; } - bool setPixelFormat( rfbPixelFormat pixelFormat ); - bool setEncodings( const QVector& encodings ); + void setPixelFormat(rfbPixelFormat pixelFormat); + void setEncodings(const QVector& encodings); + + bool sendPixelFormat(); + bool sendEncodings(); void requestFramebufferUpdate( bool incremental ); @@ -145,6 +148,7 @@ class VEYON_CORE_EXPORT VncClientProtocol QByteArray m_serverInitMessage{}; rfbPixelFormat m_pixelFormat{}; + QVector m_encodings{}; quint16 m_framebufferWidth{0}; quint16 m_framebufferHeight{0}; diff --git a/plugins/demo/DemoServer.cpp b/plugins/demo/DemoServer.cpp index 27b0f8b97..dc1718f1a 100644 --- a/plugins/demo/DemoServer.cpp +++ b/plugins/demo/DemoServer.cpp @@ -344,7 +344,9 @@ bool DemoServer::setVncServerPixelFormat() format.pad1 = 0; format.pad2 = 0; - return m_vncClientProtocol->setPixelFormat( format ); + m_vncClientProtocol->setPixelFormat(format); + + return m_vncClientProtocol->sendPixelFormat(); } @@ -353,20 +355,21 @@ bool DemoServer::setVncServerEncodings(int quality) { m_quality = quality; - return m_vncClientProtocol-> - setEncodings( { - rfbEncodingTight, - rfbEncodingZYWRLE, - rfbEncodingZRLE, - rfbEncodingUltra, - rfbEncodingCopyRect, - rfbEncodingHextile, - rfbEncodingCoRRE, - rfbEncodingRRE, - rfbEncodingRaw, - rfbEncodingCompressLevel9, - rfbEncodingQualityLevel0 + quality, - rfbEncodingNewFBSize, - rfbEncodingLastRect - } ); + m_vncClientProtocol->setEncodings({ + rfbEncodingTight, + rfbEncodingZYWRLE, + rfbEncodingZRLE, + rfbEncodingUltra, + rfbEncodingCopyRect, + rfbEncodingHextile, + rfbEncodingCoRRE, + rfbEncodingRRE, + rfbEncodingRaw, + rfbEncodingCompressLevel9, + rfbEncodingQualityLevel0 + quality, + rfbEncodingNewFBSize, + rfbEncodingLastRect + }); + + return m_vncClientProtocol->sendEncodings(); } From 90c881bb1ad9f5304d4195cc2b7bf5db37024e73 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 14:17:55 +0100 Subject: [PATCH 1690/1765] VncProxyConnection: intercept and use pixel format requested by client Since the RFB rect handlers in VncClientProtocol rely on the pixel format, make sure to use the pixel format actually requested by the client and served by the server. Especially the tight encoding uses specific optimizations if a color depth of 24 with 32 bits per pixel have been negotiated (while server server side the color depth may be 32 and thus causes protocol errors). --- server/src/VncProxyConnection.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/server/src/VncProxyConnection.cpp b/server/src/VncProxyConnection.cpp index 4b325532d..cca7a3626 100644 --- a/server/src/VncProxyConnection.cpp +++ b/server/src/VncProxyConnection.cpp @@ -39,7 +39,6 @@ VncProxyConnection::VncProxyConnection( QTcpSocket* clientSocket, m_proxyClientSocket( clientSocket ), m_vncServerSocket( new QTcpSocket( this ) ), m_rfbClientToServerMessageSizes( { - { rfbSetPixelFormat, sz_rfbSetPixelFormatMsg }, { rfbFramebufferUpdateRequest, sz_rfbFramebufferUpdateRequestMsg }, { rfbKeyEvent, sz_rfbKeyEventMsg }, { rfbPointerEvent, sz_rfbPointerEventMsg }, @@ -222,6 +221,23 @@ bool VncProxyConnection::receiveClientMessage() } break; + case rfbSetPixelFormat: + if (socket->bytesAvailable() >= sz_rfbSetPixelFormatMsg) + { + rfbSetPixelFormatMsg setPixelFormatMessage; + if (socket->peek(reinterpret_cast(&setPixelFormatMessage), sz_rfbSetPixelFormatMsg) == sz_rfbSetPixelFormatMsg) + { + auto format = setPixelFormatMessage.format; + format.redMax = qFromBigEndian(format.redMax); + format.greenMax = qFromBigEndian(format.greenMax); + format.blueMax = qFromBigEndian(format.blueMax); + clientProtocol().setPixelFormat(format); + + return forwardDataToServer(sz_rfbSetPixelFormatMsg); + } + } + break; + default: if( m_rfbClientToServerMessageSizes.contains( messageType ) == false ) { From 3ed2313551c19b4b3da5fe9eb9ecd51e5616a489 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 14:27:50 +0100 Subject: [PATCH 1691/1765] VncClientProtocol: log unknown rect encoding in hex notation --- core/src/VncClientProtocol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index 5245c51b4..b49565c5a 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -633,7 +633,7 @@ bool VncClientProtocol::handleRect( QBuffer& buffer, rfbFramebufferUpdateRectHea return true; default: - vCritical() << "Unsupported rect encoding" << rectHeader.encoding; + vCritical() << "Unsupported rect encoding" << Qt::hex << rectHeader.encoding; m_socket->close(); break; } From ccdb8dca9e0296b0fdf725acd5e546f218eafe34 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 14:28:58 +0100 Subject: [PATCH 1692/1765] VncConnection: refactor framebuffer timeouts Distinguish between the need for incremental framebuffer updates and full framebuffer updates. If no framebuffer data has been received, request a full update after a shorter timeout. --- core/src/VeyonConfigurationProperties.h | 3 +- core/src/VncConnection.cpp | 39 ++++++++++++++++++++----- core/src/VncConnection.h | 9 ++++-- core/src/VncConnectionConfiguration.h | 3 +- 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index d1ab2612e..95ff45de8 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -50,7 +50,8 @@ OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionRetryInterval, setVncConnectionRetryInterval, "ConnectionRetryInterval", "VncConnection", VncConnectionConfiguration::DefaultConnectionRetryInterval, Configuration::Property::Flag::Hidden ) \ OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionMessageWaitTimeout, setVncConnectionMessageWaitTimeout, "MessageWaitTimeout", "VncConnection", VncConnectionConfiguration::DefaultMessageWaitTimeout, Configuration::Property::Flag::Hidden ) \ OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionFastFramebufferUpdateInterval, setVncConnectionFastFramebufferUpdateInterval, "FastFramebufferUpdateInterval", "VncConnection", VncConnectionConfiguration::DefaultFastFramebufferUpdateInterval, Configuration::Property::Flag::Hidden ) \ - OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionFramebufferUpdateWatchdogTimeout, setVncConnectionFramebufferUpdateWatchdogTimeout, "FramebufferUpdateWatchdogTimeout", "VncConnection", VncConnectionConfiguration::DefaultFramebufferUpdateWatchdogTimeout, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionInitialFramebufferUpdateTimeout, setVncConnectionInitialFramebufferUpdateTimeout, "InitialFramebufferUpdateTimeout", "VncConnection", VncConnectionConfiguration::DefaultInitialFramebufferUpdateTimeout, Configuration::Property::Flag::Hidden ) \ + OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionFramebufferUpdateTimeout, setVncConnectionFramebufferUpdateTimeout, "FramebufferUpdateTimeout", "VncConnection", VncConnectionConfiguration::DefaultFramebufferUpdateTimeout, Configuration::Property::Flag::Hidden ) \ OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionSocketKeepaliveIdleTime, setVncConnectionSocketKeepaliveIdleTime, "SocketKeepaliveIdleTime", "VncConnection", VncConnectionConfiguration::DefaultSocketKeepaliveIdleTime, Configuration::Property::Flag::Hidden ) \ OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionSocketKeepaliveInterval, setVncConnectionSocketKeepaliveInterval, "SocketKeepaliveInterval", "VncConnection", VncConnectionConfiguration::DefaultSocketKeepaliveInterval, Configuration::Property::Flag::Hidden ) \ OP( VeyonConfiguration, VeyonCore::config(), int, vncConnectionSocketKeepaliveCount, setVncConnectionSocketKeepaliveCount, "SocketKeepaliveCount", "VncConnection", VncConnectionConfiguration::DefaultSocketKeepaliveCount, Configuration::Property::Flag::Hidden ) \ diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index d40a8857e..076a8ee4d 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -58,7 +58,8 @@ VncConnection::VncConnection( QObject* parent ) : m_connectionRetryInterval = VeyonCore::config().vncConnectionRetryInterval(); m_messageWaitTimeout = VeyonCore::config().vncConnectionMessageWaitTimeout(); m_fastFramebufferUpdateInterval = VeyonCore::config().vncConnectionFastFramebufferUpdateInterval(); - m_framebufferUpdateWatchdogTimeout = VeyonCore::config().vncConnectionFramebufferUpdateWatchdogTimeout(); + m_initialFramebufferUpdateTimeout = VeyonCore::config().vncConnectionInitialFramebufferUpdateTimeout(); + m_framebufferUpdateTimeout = VeyonCore::config().vncConnectionFramebufferUpdateTimeout(); m_socketKeepaliveIdleTime = VeyonCore::config().vncConnectionSocketKeepaliveIdleTime(); m_socketKeepaliveInterval = VeyonCore::config().vncConnectionSocketKeepaliveInterval(); m_socketKeepaliveCount = VeyonCore::config().vncConnectionSocketKeepaliveCount(); @@ -473,7 +474,8 @@ void VncConnection::establishConnection() if( clientInitialized ) { - m_framebufferUpdateWatchdog.restart(); + m_fullFramebufferUpdateTimer.restart(); + m_incrementalFramebufferUpdateTimer.restart(); VeyonCore::platform().networkFunctions(). configureSocketKeepalive( static_cast( m_client->sock ), true, @@ -571,16 +573,16 @@ void VncConnection::handleConnection() break; } } - else if (m_framebufferUpdateWatchdog.elapsed() >= - qMax(2*m_framebufferUpdateInterval, m_framebufferUpdateWatchdogTimeout)) + else if (m_fullFramebufferUpdateTimer.elapsed() >= fullFramebufferUpdateTimeout()) { requestFrameufferUpdate(FramebufferUpdateType::Full); - m_framebufferUpdateWatchdog.restart(); + m_fullFramebufferUpdateTimer.restart(); } - else if (m_framebufferUpdateInterval > 0 && m_framebufferUpdateWatchdog.elapsed() > m_framebufferUpdateInterval) + else if (m_framebufferUpdateInterval > 0 && + m_incrementalFramebufferUpdateTimer.elapsed() > incrementalFramebufferUpdateTimeout()) { requestFrameufferUpdate(FramebufferUpdateType::Incremental); - m_framebufferUpdateWatchdog.restart(); + m_incrementalFramebufferUpdateTimer.restart(); } else if (isControlFlagSet(ControlFlag::TriggerFramebufferUpdate)) { @@ -713,7 +715,8 @@ void VncConnection::requestFrameufferUpdate(FramebufferUpdateType updateType) void VncConnection::finishFrameBufferUpdate() { - m_framebufferUpdateWatchdog.restart(); + m_incrementalFramebufferUpdateTimer.restart(); + m_fullFramebufferUpdateTimer.restart(); m_framebufferState = FramebufferState::Valid; setControlFlag( ControlFlag::ScaledFramebufferNeedsUpdate, true ); @@ -723,6 +726,26 @@ void VncConnection::finishFrameBufferUpdate() +int VncConnection::fullFramebufferUpdateTimeout() const +{ + return m_framebufferState == FramebufferState::Valid ? + m_framebufferUpdateTimeout + : + std::max(int(m_framebufferUpdateInterval), m_initialFramebufferUpdateTimeout); +} + + + +int VncConnection::incrementalFramebufferUpdateTimeout() const +{ + return m_framebufferState == FramebufferState::Valid ? + int(m_framebufferUpdateInterval) + : + std::min(int(m_framebufferUpdateInterval), m_initialFramebufferUpdateTimeout); +} + + + void VncConnection::updateEncodingSettingsFromQuality() { m_client->appData.encodingsString = m_quality == VncConnectionConfiguration::Quality::Highest ? diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 1250a11cd..47f535cd9 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -211,6 +211,9 @@ class VEYON_CORE_EXPORT VncConnection : public QThread void requestFrameufferUpdate(FramebufferUpdateType updateType); void finishFrameBufferUpdate(); + int fullFramebufferUpdateTimeout() const; + int incrementalFramebufferUpdateTimeout() const; + void updateEncodingSettingsFromQuality(); rfbBool updateCursorPosition( int x, int y ); @@ -239,7 +242,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread int m_connectionRetryInterval{VncConnectionConfiguration::DefaultConnectionRetryInterval}; int m_messageWaitTimeout{VncConnectionConfiguration::DefaultMessageWaitTimeout}; int m_fastFramebufferUpdateInterval{VncConnectionConfiguration::DefaultFastFramebufferUpdateInterval}; - int m_framebufferUpdateWatchdogTimeout{VncConnectionConfiguration::DefaultFramebufferUpdateWatchdogTimeout}; + int m_initialFramebufferUpdateTimeout{VncConnectionConfiguration::DefaultInitialFramebufferUpdateTimeout}; + int m_framebufferUpdateTimeout{VncConnectionConfiguration::DefaultFramebufferUpdateTimeout}; int m_socketKeepaliveIdleTime{VncConnectionConfiguration::DefaultSocketKeepaliveIdleTime}; int m_socketKeepaliveInterval{VncConnectionConfiguration::DefaultSocketKeepaliveInterval}; int m_socketKeepaliveCount{VncConnectionConfiguration::DefaultSocketKeepaliveCount}; @@ -265,7 +269,8 @@ class VEYON_CORE_EXPORT VncConnection : public QThread QMutex m_eventQueueMutex{}; QWaitCondition m_updateIntervalSleeper{}; QAtomicInt m_framebufferUpdateInterval{0}; - QElapsedTimer m_framebufferUpdateWatchdog{}; + QElapsedTimer m_fullFramebufferUpdateTimer{}; + QElapsedTimer m_incrementalFramebufferUpdateTimer{}; // queue for RFB and custom events QQueue m_eventQueue{}; diff --git a/core/src/VncConnectionConfiguration.h b/core/src/VncConnectionConfiguration.h index c8bf8b025..0a925c563 100644 --- a/core/src/VncConnectionConfiguration.h +++ b/core/src/VncConnectionConfiguration.h @@ -47,7 +47,8 @@ class VEYON_CORE_EXPORT VncConnectionConfiguration static constexpr int DefaultConnectionRetryInterval = 1000; static constexpr int DefaultMessageWaitTimeout = 500; static constexpr int DefaultFastFramebufferUpdateInterval = 100; - static constexpr int DefaultFramebufferUpdateWatchdogTimeout = 10000; + static constexpr int DefaultInitialFramebufferUpdateTimeout = 10000; + static constexpr int DefaultFramebufferUpdateTimeout = 60000; static constexpr int DefaultSocketKeepaliveIdleTime = 1000; static constexpr int DefaultSocketKeepaliveInterval = 500; static constexpr int DefaultSocketKeepaliveCount = 5; From 10be9582e6837256896afa93a41629d900541fcd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 14:40:29 +0100 Subject: [PATCH 1693/1765] VncProxyConnection: use QObject header --- server/src/VncProxyConnection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/VncProxyConnection.h b/server/src/VncProxyConnection.h index a06e1370e..6ab62feb0 100644 --- a/server/src/VncProxyConnection.h +++ b/server/src/VncProxyConnection.h @@ -24,7 +24,7 @@ #pragma once -#include "VeyonCore.h" +#include class QBuffer; class QTcpSocket; From 699c2e741c8f894bfbbb4febe03ea989e6a60cfe Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 15:16:13 +0100 Subject: [PATCH 1694/1765] ComputerControlListModel: refactor host icons Add icon for state host is online but framebuffer not available yet. Indicate DNS, service or access problems with dedicated symbols. --- master/resources/host-access-denied.png | Bin 0 -> 6924 bytes master/resources/host-dns-error.png | Bin 0 -> 12752 bytes master/resources/host-offline.png | Bin 0 -> 1178 bytes master/resources/host-online.png | Bin 0 -> 1186 bytes master/resources/host-service-error.png | Bin 0 -> 8784 bytes master/resources/master.qrc | 8 +++--- .../preferences-desktop-display-gray.png | Bin 1055 -> 0 bytes .../preferences-desktop-display-orange.png | Bin 1206 -> 0 bytes .../preferences-desktop-display-red.png | Bin 1239 -> 0 bytes master/src/ComputerControlListModel.cpp | 24 +++++++++++++----- master/src/ComputerControlListModel.h | 8 +++--- 11 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 master/resources/host-access-denied.png create mode 100644 master/resources/host-dns-error.png create mode 100644 master/resources/host-offline.png create mode 100644 master/resources/host-online.png create mode 100644 master/resources/host-service-error.png delete mode 100644 master/resources/preferences-desktop-display-gray.png delete mode 100644 master/resources/preferences-desktop-display-orange.png delete mode 100644 master/resources/preferences-desktop-display-red.png diff --git a/master/resources/host-access-denied.png b/master/resources/host-access-denied.png new file mode 100644 index 0000000000000000000000000000000000000000..bcddd3785522724304e52ec8b9d6961851954396 GIT binary patch literal 6924 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 literal 0 HcmV?d00001 diff --git a/master/resources/host-dns-error.png b/master/resources/host-dns-error.png new file mode 100644 index 0000000000000000000000000000000000000000..28e0a7197b4c59fb13c28e6ec961617c08fee478 GIT binary patch literal 12752 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 HQ$iB}LZ~1n literal 0 HcmV?d00001 diff --git a/master/resources/host-service-error.png b/master/resources/host-service-error.png new file mode 100644 index 0000000000000000000000000000000000000000..f76310cd8ce56b1bde40acbc56551db9b666d241 GIT binary patch literal 8784 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 literal 0 HcmV?d00001 diff --git a/master/resources/master.qrc b/master/resources/master.qrc index ed1a11088..bb032eff9 100644 --- a/master/resources/master.qrc +++ b/master/resources/master.qrc @@ -2,9 +2,11 @@ zoom-fit-best.png camera-photo.png - preferences-desktop-display-orange.png - preferences-desktop-display-gray.png - preferences-desktop-display-red.png + host-offline.png + host-online.png + host-dns-error.png + host-service-error.png + host-access-denied.png splash.png computers.png align-grid.png diff --git a/master/resources/preferences-desktop-display-gray.png b/master/resources/preferences-desktop-display-gray.png deleted file mode 100644 index ac58363e515a57abd78d7dde352888cb4b94e9b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1055 zcmWmCdrZ?u0KoBI3v3m}pc`bNh7?fS{@P!EErmYl^VdS56{yO?41q+gs2dwJP%W8? z6a>mkVZ)>w9SXw41er70*aiZb8x$gvLXk&#m6w}Lgt_qscV0gCy}RW8x?IUoO_ZlQ z$sK|qPqiu{4y<`^C&2~u-HeQ(0+{!C*i?$w<%Ep3nJ@!DVFX~&87LhASac@9W*{sE6JRq?AQ(Z}2q=rgM1z^2 z><|rK|OfCk+!XIiOT2BGrY3g+)b0#l^)Ylc}Vn zq_niOtgNiOyu6~K;_JG*Jx>R%14Df_`;)QX!9-DHG z&&*CZ=cnctrso%4F?p+cz1~(<1F9&x;rwy}W0#YeEy3qhfDp0}$l1CCd64e2KrY zk59%yP3oB&-&^6Fha)NYwS#=$R(x%*(!7!q1|28;9ymeD6Y$*>8Q}&FF4^cqfu`FLd59`t79ka-YHiyn3oJkMB z$cOJK=2aT<;Sbx~S|ybmB*HbH*Nx^&p>uaJtE;s*-UEIg?mn>>yxL@p9l;s`DD{c< zyr}(=u0eRBkxA~af9FqPr5BWY#kSZqntT2){oWYE@{GmHNqXRgzv&~> zi|AF`BlU%1ZFclrjy7n|T_y9|-B_~l{;vIUc$07*UGc@xmE<>;a%nENypuU(6p7Ym zQxCdSu)JSYCwumK_>pG^zB2!l_LHQ;Yk8fuswud6=F^2=p6Bm6Uu+am8{2m7|1sdQ zBk$lISjhTzqNnqRGQ#cdRZC{fdh&wzWBqP_HyKX6Vy;$fYTLKh-*}ySyroOLY~8js z-ja21ciB7GXk@BD+rBcl)$hByU00KSi_#)X;Sf`Wy*sT{2*K4D;O&}^d5?;XW3Rh< m3O%lNTn_rR#m)EtjOm8(C;NPQ>hFX91gVvph!(}k{Qm*0`>YQD diff --git a/master/resources/preferences-desktop-display-orange.png b/master/resources/preferences-desktop-display-orange.png deleted file mode 100644 index 2d1f1ea0741b984ba85e88d44aca3f36288136a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1206 zcmWmCc~DbF9Ki9%AqFuLf`Ecn@F4dEBq1b_5W*2kks@@&fdPu(H3d0pw6+1%D(Wbx z2!=!MtBw}5gBLAUDRo*QpdgpVaN5BshcM3DXGr^V=d<74o!S3(&qhUtlGnJd!7z-h z4pT+Ln)hjvtf0%rO9&RLY^6GeL?Vri?=-^E_HbBSHin54K23{_c_FaDHs%EH&e@fb zmZM3|O2sr94fjC$q3o38!>QbitbOHkGFJ?3AYgO(Y$(r*!xeC#d~Yrg z`0#+2kPo~?0^lR|0zzMJAd>h1v7Zq5N<|Wx$j@I4qyfG_2ILZ1fCTCf6n-+fA2c9P z>aUPOCfKhPxUYU>K}Oa{AJI; zkbZEae`xgi@YulU>%lR@(CarNhVfD3#H;Zs!{qdvsTsW31}|QXUnSvJZSj&dc!?ce zvKB8T;x4^$1dqUvp^dONBCJ5Y@$ss%JuOGkAKRL4a1ETW!G)N_aiF44dv8u>({ zfN1g}n!Jf7AEH@EG>eE9G11~{nUvZFZ)}kh9k~lr%nYYtn59&$3XC~A`tP3pgJTLx z#jmktd&q+PKHfiXrvxjfw6XGZK*II_M_@zDPCm7bpcnj>?) zREmQ`+lQi1ul%lF#qfBeHYI! zm8{h#hF;t^{OZL*`Mg-eHnrOs4B8A2r>8r#(z%5@%PqQ1KE-RJnc+XAyS@Ang!vA% z=5{vrH;$UWlm1**Y*pY=Fxxaycl^q%&BK|JZq%(ZI~8dK1R9cjGwk1fV`*Jqypfd` zZ@fDhBp~oX{(ncx91X*_O6O}g?C-W*>=g|Zbu1Klm}OTuiD?i2cwy8QPD#mWms@m& z?a6;99nUoVUN`oId1T_Pg}K^Lb}37;b8a$mB+fc2Mbj*9{CG2~AbC&joyE||*bLgu zD6?+fyrNGm3i&E7gLlsUnEb)=yJH>eB5vBH2xiajyU=O6r_}_Sw6inaO=sU#=~r@% z6_w9&S59svS?9Y`tWPK?yM_59AM*=ok)~qUp_8{ki2>flJ# JEoIV){{h@m1jGOU diff --git a/master/resources/preferences-desktop-display-red.png b/master/resources/preferences-desktop-display-red.png deleted file mode 100644 index c4db932c6f62e192c0fda0255a9de4188ae3d2e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1239 zcmWmCdrVVT9Ki8gP+kL-O_0`7M4-L5x4ms?fzn>u+ftCnL;`G%IR!Qm)G0{Wz!w%p zgZRRzF$@ioIGs~bw`>y$j|Jrog#xw~>_ZVJMu&q6Y>NAle9rfGPICS`=V)@$8ZQrq z2ZA78@o}0In7W1K<_w*-ot}f?tX0RSxw*NG*w@+M=$;>!u0@cDjSGuL*TupHp%=z{ zQJ9*yrLZWgAR8$vDk8S-+^+p5D?gjaE6AySO)?OK)|dQgS`1ufqg*zMvoXNqpg0Eu zJPsG|QH+Oj0UyNyfpPg54hW0~1YDfp@_>NL2SS`D!1+Lk6F|fxggmGqluwBGP@$Lr zB8dQmh6#Z z;mhvO4|cBLborrOepnYB>lzs9reoc7Za0J5!@zr1@_Gypdsp&$nf%@%V;_^~^C$HF z0zFHpAAZ!&685u1{Q;tZ1)&40fOx=YHmnjG0)fO}8W{|f46Y6vS{*(V6h35rJRB4; z94s9ku{;cxJ`9O8hRBR;AU8g?n%Hs^2au1@s7DsN8B>@srP=mmgsU9kQlmIfjoQa7 zPoG)G#`Ee1%HTz5g(*p?2sLinf*?*i<290;Kd}Y1jH1 z8d9usIxzDSM!W9m+VIRJ)3yHEUH^R2p_@YUZ!mRt()t5OSvu)@*UPnm*B8CsjQzei zZkNrljCRiZ{NI1pr+6N!OkA~@QK6l2qU~ngmUxREl-HHL^YlBt*ah7!=udUYFojf>Q* zgv0wJAC0wcZAqEGEo6ILOMUb4+1t~|e)*8dMFyz zlBV9h#P)LUj*}HHqP15Y`c31(%IaUU+eZD7OzpbXye2D|ZRhxsmXf$ikNZsJ9KYo3 z&Rq6$mWNBHJYhfAYx{pF!rUfp%ov=$Vt%pb-mM?TmfRO>9QCug*30)=o6-$Jt6yic zlYt)_@j-U@$W2elRi|>1hu$zX^mOj~qVL{WYCf-?#q8~@l3Nyr_tzygrU%V;jyX{$ z-q&0Fo^N=zthM;V+O`1nv&NO@)N|QQ4KF_&S|f41{&}`C=TKsXV(Cojo&8y+n4TwMq|RlH^JXJGYa0eyPi5GhHr?($0TX$)R_nW2P=N_p#T5? diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 083ff1ac3..baec5ef03 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -41,9 +41,11 @@ ComputerControlListModel::ComputerControlListModel( VeyonMaster* masterCore, QOb ComputerListModel( parent ), m_master( masterCore ), m_imageProvider( new ComputerImageProvider( this ) ), - m_iconDefault( QStringLiteral(":/master/preferences-desktop-display-gray.png") ), - m_iconConnectionProblem( QStringLiteral(":/master/preferences-desktop-display-red.png") ), - m_iconServerNotRunning( QStringLiteral(":/master/preferences-desktop-display-orange.png") ) + m_iconHostOffline(QStringLiteral(":/master/host-offline.png")), + m_iconHostOnline(QStringLiteral(":/master/host-online.png")), + m_iconHostNameReslutionFailed(QStringLiteral(":/master/host-dns-error.png")), + m_iconHostAccessDenied(QStringLiteral(":/master/host-access-denied.png")), + m_iconHostServiceError(QStringLiteral(":/master/host-service-error.png")) { #if defined(QT_TESTLIB_LIB) && QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) new QAbstractItemModelTester( this, QAbstractItemModelTester::FailureReportingMode::Warning, this ); @@ -239,20 +241,28 @@ QImage ComputerControlListModel::computerDecorationRole( const ComputerControlIn return image; } - return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledFramebufferSize() ); + return scaleAndAlignIcon(m_iconHostOnline, controlInterface->scaledFramebufferSize()); } + case ComputerControlInterface::State::HostNameResolutionFailed: + return scaleAndAlignIcon(m_iconHostNameReslutionFailed, controlInterface->scaledFramebufferSize()); + case ComputerControlInterface::State::ServerNotRunning: - return scaleAndAlignIcon( m_iconServerNotRunning, controlInterface->scaledFramebufferSize() ); + return scaleAndAlignIcon(m_iconHostServiceError, controlInterface->scaledFramebufferSize()); case ComputerControlInterface::State::AuthenticationFailed: - return scaleAndAlignIcon( m_iconConnectionProblem, controlInterface->scaledFramebufferSize() ); + return scaleAndAlignIcon(m_iconHostAccessDenied, controlInterface->scaledFramebufferSize()); default: break; } - return scaleAndAlignIcon( m_iconDefault, controlInterface->scaledFramebufferSize() ); + if (controlInterface->accessControlMessage().isEmpty() == false) + { + return scaleAndAlignIcon(m_iconHostAccessDenied, controlInterface->scaledFramebufferSize()); + } + + return scaleAndAlignIcon(m_iconHostOffline, controlInterface->scaledFramebufferSize()); } diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index d7675574f..912f28358 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -103,9 +103,11 @@ class ComputerControlListModel : public ComputerListModel VeyonMaster* m_master; ComputerImageProvider* m_imageProvider; - QImage m_iconDefault; - QImage m_iconConnectionProblem; - QImage m_iconServerNotRunning; + QImage m_iconHostOffline; + QImage m_iconHostOnline; + QImage m_iconHostNameReslutionFailed; + QImage m_iconHostAccessDenied; + QImage m_iconHostServiceError; QSize m_computerScreenSize{}; From 589d5df2f1794763b5fdaf36995cfa856cfe1143 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 15:53:18 +0100 Subject: [PATCH 1695/1765] AccessControlProvider: add Reason to CheckResult --- core/src/AccessControlProvider.cpp | 12 +++++++++--- core/src/AccessControlProvider.h | 11 +++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index ccdaaa65a..76215bcfc 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -129,8 +129,9 @@ AccessControlProvider::CheckResult AccessControlProvider::checkAccess( const QSt { if (processAuthorizedGroups(accessingUser)) { - return {Access::Allow}; + return {Access::Allow, Reason::UserInAuthorizedUserGroups}; } + denyAccessCheckResult.reason = Reason::UserNotInAuthorizedUserGroups; } else if (VeyonCore::config().isAccessControlRulesProcessingEnabled()) { @@ -145,13 +146,18 @@ AccessControlProvider::CheckResult AccessControlProvider::checkAccess( const QSt switch(rule->action()) { case AccessControlRule::Action::Allow: - return {Access::Allow, rule}; + return {Access::Allow, Reason::AccessControlRuleMatched}; case AccessControlRule::Action::AskForPermission: - return {Access::ToBeConfirmed, rule}; + return {Access::ToBeConfirmed}; default: break; } + denyAccessCheckResult.reason = Reason::AccessControlRuleMatched; denyAccessCheckResult.matchedRule = rule; } + else + { + denyAccessCheckResult.reason = Reason::NoAccessControlRuleMatched; + } } else { diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index 2fac64d3c..f0ac76b4f 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -40,8 +40,19 @@ class VEYON_CORE_EXPORT AccessControlProvider ToBeConfirmed, } ; + enum class Reason { + Unknown, + NoAccessControlRuleMatched, + AccessControlRuleMatched, + NotConfirmedByUser, + ConfirmedByUser, + UserNotInAuthorizedUserGroups, + UserInAuthorizedUserGroups, + }; + struct CheckResult { Access access = Access::Deny; + Reason reason = Reason::Unknown; AccessControlRule::Pointer matchedRule = nullptr; }; From ae453055b39106c5506a1f53a1d6ef5aac387acf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 15:53:44 +0100 Subject: [PATCH 1696/1765] ServerAccessControlManager: indicate if no access control rule matched --- server/src/ServerAccessControlManager.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index fbfe80260..cd863f3a7 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -137,10 +137,14 @@ void ServerAccessControlManager::performAccessControl( VncServerClient* client ) default: client->setAccessControlState( VncServerClient::AccessControlState::Failed ); client->setProtocolState( VncServerProtocol::State::Close ); - if (checkResult.matchedRule) + if (checkResult.reason == AccessControlProvider::Reason::AccessControlRuleMatched && checkResult.matchedRule) { client->setAccessControlDetails(tr("Access denied by rule \"%1\"").arg(checkResult.matchedRule->name())); } + else if (checkResult.reason == AccessControlProvider::Reason::NoAccessControlRuleMatched) + { + client->setAccessControlDetails(tr("No rule allowed access")); + } break; } From ea83521c0afe8b36bf33361a9c44c12008ac5465 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 15:54:09 +0100 Subject: [PATCH 1697/1765] ComputerControlListModel: scale icons smoothly Now that we do not only have rectangular shapes for the computer icons make sure to scale the icons smoothly. --- master/src/ComputerControlListModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index baec5ef03..34beb77f4 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -483,7 +483,7 @@ double ComputerControlListModel::averageAspectRatio() const QImage ComputerControlListModel::scaleAndAlignIcon( const QImage& icon, QSize size ) const { - const auto scaledIcon = icon.scaled( size.width(), size.height(), Qt::KeepAspectRatio ); + const auto scaledIcon = icon.scaled(size.width(), size.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation); QImage scaledAndAlignedIcon( size, QImage::Format_ARGB32 ); scaledAndAlignedIcon.fill( Qt::transparent ); From 5406659e7310220cbeec1896b8ab490b3eb630e2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 16:17:33 +0100 Subject: [PATCH 1698/1765] VncConnection: enforce minimum connection time Otherwise a connection will be retried immediately if a connection is established succesfully but is closed immediately by the access control mechanism. --- core/src/VncConnection.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 076a8ee4d..7e3e98320 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -393,9 +393,17 @@ void VncConnection::run() { while( isControlFlagSet( ControlFlag::TerminateThread ) == false ) { + QElapsedTimer connectionTimer; + connectionTimer.start(); + establishConnection(); handleConnection(); closeConnection(); + + const auto minimumConnectionTime = m_framebufferUpdateInterval > 0 ? + int(m_framebufferUpdateInterval) : + m_connectionRetryInterval; + QThread::msleep(std::max(0, minimumConnectionTime - connectionTimer.elapsed())); } if( isControlFlagSet( ControlFlag::DeleteAfterFinished ) ) From ede003643ea5d16546a77487efe6aae59ef1e3e4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 16:25:07 +0100 Subject: [PATCH 1699/1765] VncConnection: only trigger FB update after changing update interval if connected --- core/src/VncConnection.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index 7e3e98320..c5ec26c5f 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -289,12 +289,15 @@ void VncConnection::setFramebufferUpdateInterval( int interval ) { m_framebufferUpdateInterval = interval; - if (m_framebufferUpdateInterval <= 0) + if (state() == State::Connected) { - setControlFlag(ControlFlag::TriggerFramebufferUpdate, true); - } + if (m_framebufferUpdateInterval <= 0) + { + setControlFlag(ControlFlag::TriggerFramebufferUpdate, true); + } - m_updateIntervalSleeper.wakeAll(); + m_updateIntervalSleeper.wakeAll(); + } } From 8d2aaa825c301f30f237dba48ce65eb8b8ea8953 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 12 Mar 2025 16:30:53 +0100 Subject: [PATCH 1700/1765] Computer: add missing include --- core/src/Computer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/Computer.h b/core/src/Computer.h index 63ed4edea..2c3897493 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -24,7 +24,7 @@ #pragma once -#include +#include #include #include "NetworkObject.h" From b9b5418185c12f960527ba8328a12b5a7da97140 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 16:34:09 +0100 Subject: [PATCH 1701/1765] FeatureMessage: split send() into sendPlain() and sendAsRfbMessage() --- core/src/FeatureMessage.cpp | 23 ++++++++++++++++--- core/src/FeatureMessage.h | 3 ++- core/src/FeatureWorkerManager.cpp | 2 +- core/src/VncFeatureMessageEvent.cpp | 4 +--- server/src/ComputerControlServer.cpp | 7 ++---- worker/src/FeatureWorkerManagerConnection.cpp | 4 ++-- 6 files changed, 28 insertions(+), 15 deletions(-) diff --git a/core/src/FeatureMessage.cpp b/core/src/FeatureMessage.cpp index 462f82214..e57c4a9d2 100644 --- a/core/src/FeatureMessage.cpp +++ b/core/src/FeatureMessage.cpp @@ -27,11 +27,11 @@ #include "VariantArrayMessage.h" -bool FeatureMessage::send( QIODevice* ioDevice ) const +bool FeatureMessage::sendPlain(QIODevice* ioDevice) const { - if( ioDevice ) + if (ioDevice) { - VariantArrayMessage message( ioDevice ); + VariantArrayMessage message(ioDevice); message.write( m_featureUid ); message.write( m_command ); @@ -47,6 +47,23 @@ bool FeatureMessage::send( QIODevice* ioDevice ) const +bool FeatureMessage::sendAsRfbMessage(QIODevice* ioDevice) const +{ + if (ioDevice) + { + const char rfbMessageType = FeatureMessage::RfbMessageType; + ioDevice->write(&rfbMessageType, sizeof(rfbMessageType)); + + return sendPlain(ioDevice); + } + + vCritical() << "no IO device!"; + + return false; +} + + + bool FeatureMessage::isReadyForReceive( QIODevice* ioDevice ) { return ioDevice != nullptr && diff --git a/core/src/FeatureMessage.h b/core/src/FeatureMessage.h index 5451dcfe3..2e5321d31 100644 --- a/core/src/FeatureMessage.h +++ b/core/src/FeatureMessage.h @@ -106,7 +106,8 @@ class VEYON_CORE_EXPORT FeatureMessage return m_arguments[EnumHelper::toString(index)]; } - bool send( QIODevice* ioDevice ) const; + bool sendPlain(QIODevice* ioDevice) const; + bool sendAsRfbMessage(QIODevice* ioDevice) const; bool isReadyForReceive( QIODevice* ioDevice ); diff --git a/core/src/FeatureWorkerManager.cpp b/core/src/FeatureWorkerManager.cpp index ef551f4ab..ec84ff88d 100644 --- a/core/src/FeatureWorkerManager.cpp +++ b/core/src/FeatureWorkerManager.cpp @@ -343,7 +343,7 @@ void FeatureWorkerManager::sendPendingMessages() while( worker.socket && worker.pendingMessages.isEmpty() == false ) { - worker.pendingMessages.first().send( worker.socket ); + worker.pendingMessages.first().sendPlain(worker.socket); worker.pendingMessages.removeFirst(); } } diff --git a/core/src/VncFeatureMessageEvent.cpp b/core/src/VncFeatureMessageEvent.cpp index c090c3b9d..ee566b8ef 100644 --- a/core/src/VncFeatureMessageEvent.cpp +++ b/core/src/VncFeatureMessageEvent.cpp @@ -42,8 +42,6 @@ void VncFeatureMessageEvent::fire( rfbClient* client ) << m_featureMessage; SocketDevice socketDevice( VncConnection::libvncClientDispatcher, client ); - const char messageType = FeatureMessage::RfbMessageType; - socketDevice.write( &messageType, sizeof(messageType) ); - m_featureMessage.send( &socketDevice ); + m_featureMessage.sendAsRfbMessage(&socketDevice); } diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index a2ad1c739..527f81cc4 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -140,12 +140,9 @@ bool ComputerControlServer::sendFeatureMessageReply( const MessageContext& conte { vDebug() << reply; - if( context.ioDevice() ) + if (context.ioDevice()) { - char rfbMessageType = FeatureMessage::RfbMessageType; - context.ioDevice()->write( &rfbMessageType, sizeof(rfbMessageType) ); - - return reply.send( context.ioDevice() ); + return reply.sendAsRfbMessage(context.ioDevice()); } return false; diff --git a/worker/src/FeatureWorkerManagerConnection.cpp b/worker/src/FeatureWorkerManagerConnection.cpp index 7b6a3b93b..26cfa404c 100644 --- a/worker/src/FeatureWorkerManagerConnection.cpp +++ b/worker/src/FeatureWorkerManagerConnection.cpp @@ -62,7 +62,7 @@ bool FeatureWorkerManagerConnection::sendMessage( const FeatureMessage& message { vDebug() << message; - return message.send( &m_socket ); + return message.sendPlain(&m_socket); } @@ -86,7 +86,7 @@ void FeatureWorkerManagerConnection::sendInitMessage() m_connectTimer.stop(); - FeatureMessage( m_featureUid, FeatureMessage::InitCommand ).send( &m_socket ); + FeatureMessage(m_featureUid, FeatureMessage::InitCommand).sendPlain(&m_socket); } From ece2d970fba7a1e1867ae2a8e6358f3cb3c1048c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 16:40:26 +0100 Subject: [PATCH 1702/1765] Core: make AccessControlProvider a builtin feature --- core/src/AccessControlProvider.cpp | 5 ++- core/src/AccessControlProvider.h | 57 ++++++++++++++++++++++++++++-- core/src/BuiltinFeatures.cpp | 6 +++- core/src/BuiltinFeatures.h | 8 +++++ core/src/VeyonCore.cpp | 19 ++++++---- core/src/VeyonCore.h | 1 + 6 files changed, 85 insertions(+), 11 deletions(-) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 76215bcfc..6cc68c8c2 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -41,7 +41,10 @@ AccessControlProvider::AccessControlProvider() : m_accessControlRules(), m_userGroupsBackend(VeyonCore::userGroupsBackendManager().configuredBackend()), m_networkObjectDirectory(VeyonCore::networkObjectDirectoryManager().configuredDirectory()), - m_useDomainUserGroups(VeyonCore::config().useDomainUserGroups()) + m_useDomainUserGroups(VeyonCore::config().useDomainUserGroups()), + m_accessControlFeature(QLatin1String(staticMetaObject.className()), + Feature::Flag::Meta | Feature::Flag::Builtin, + Feature::Uid{QStringLiteral("1815941e-eaef-43ab-b9cd-5403dca3f749")}, {}, {}, {}, {}, {}) { const QJsonArray accessControlRules = VeyonCore::config().accessControlRules(); diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index f0ac76b4f..24af37b45 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -25,14 +25,17 @@ #pragma once #include "AccessControlRule.h" +#include "FeatureProviderInterface.h" #include "NetworkObject.h" #include "Plugin.h" class UserGroupsBackendInterface; class NetworkObjectDirectory; -class VEYON_CORE_EXPORT AccessControlProvider +class VEYON_CORE_EXPORT AccessControlProvider : public QObject, FeatureProviderInterface, PluginInterface { + Q_OBJECT + Q_INTERFACES(FeatureProviderInterface PluginInterface) public: enum class Access { Deny, @@ -76,9 +79,55 @@ class VEYON_CORE_EXPORT AccessControlProvider bool isAccessToLocalComputerDenied() const; - static QByteArray accessControlMessageScheme() + Plugin::Uid uid() const override { - return QByteArrayLiteral("vacm://"); + return Plugin::Uid{QStringLiteral("ef3f61f4-b7fa-41a1-ae09-74e022048617")}; + } + + QVersionNumber version() const override + { + return QVersionNumber(1, 0); + } + + QString name() const override + { + return QStringLiteral("AccessControlProvider"); + } + + QString description() const override + { + return tr( "Provider for access control features" ); + } + + QString vendor() const override + { + return QStringLiteral("Veyon Community"); + } + + QString copyright() const override + { + return QStringLiteral("Tobias Junghans"); + } + + const Feature& feature() const + { + return m_accessControlFeature; + } + + const FeatureList& featureList() const override + { + return m_features; + } + + bool controlFeature(Feature::Uid featureUid, Operation operation, const QVariantMap& arguments, + const ComputerControlInterfaceList& computerControlInterfaces) override + { + Q_UNUSED(featureUid) + Q_UNUSED(operation) + Q_UNUSED(arguments) + Q_UNUSED(computerControlInterfaces) + + return false; } private: @@ -109,4 +158,6 @@ class VEYON_CORE_EXPORT AccessControlProvider NetworkObjectDirectory* m_networkObjectDirectory; bool m_useDomainUserGroups; + Feature m_accessControlFeature; + FeatureList m_features{m_accessControlFeature}; } ; diff --git a/core/src/BuiltinFeatures.cpp b/core/src/BuiltinFeatures.cpp index 7ef3b7914..ef0acccca 100644 --- a/core/src/BuiltinFeatures.cpp +++ b/core/src/BuiltinFeatures.cpp @@ -22,6 +22,7 @@ * */ +#include "AccessControlProvider.h" #include "BuiltinFeatures.h" #include "MonitoringMode.h" #include "PluginManager.h" @@ -32,11 +33,13 @@ BuiltinFeatures::BuiltinFeatures() : m_systemTrayIcon( new SystemTrayIcon ), m_monitoringMode( new MonitoringMode ), - m_desktopAccessDialog( new DesktopAccessDialog ) + m_desktopAccessDialog( new DesktopAccessDialog ), + m_accessControlProvider(new AccessControlProvider) { VeyonCore::pluginManager().registerExtraPluginInterface( m_systemTrayIcon ); VeyonCore::pluginManager().registerExtraPluginInterface( m_monitoringMode ); VeyonCore::pluginManager().registerExtraPluginInterface( m_desktopAccessDialog ); + VeyonCore::pluginManager().registerExtraPluginInterface(m_accessControlProvider); } @@ -46,4 +49,5 @@ BuiltinFeatures::~BuiltinFeatures() delete m_systemTrayIcon; delete m_monitoringMode; delete m_desktopAccessDialog; + delete m_accessControlProvider; } diff --git a/core/src/BuiltinFeatures.h b/core/src/BuiltinFeatures.h index 3cc7dec6a..9058ce28d 100644 --- a/core/src/BuiltinFeatures.h +++ b/core/src/BuiltinFeatures.h @@ -26,6 +26,7 @@ #include "VeyonCore.h" +class AccessControlProvider; class DesktopAccessDialog; class MonitoringMode; class SystemTrayIcon; @@ -53,8 +54,15 @@ class VEYON_CORE_EXPORT BuiltinFeatures return *m_desktopAccessDialog; } + AccessControlProvider& accessControlProvider() + { + return *m_accessControlProvider; + } + private: SystemTrayIcon* m_systemTrayIcon; MonitoringMode* m_monitoringMode; DesktopAccessDialog* m_desktopAccessDialog; + AccessControlProvider* m_accessControlProvider; + }; diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 3f365f9a3..7cf34ec5b 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -108,6 +108,8 @@ VeyonCore::VeyonCore( QCoreApplication* application, Component component, const initManagers(); + initFeatures(); + initSystemInfo(); Q_EMIT initialized(); // clazy:exclude=incorrect-emit @@ -122,6 +124,9 @@ VeyonCore::~VeyonCore() delete m_featureManager; m_featureManager = nullptr; + delete m_builtinFeatures; + m_builtinFeatures = nullptr; + delete m_userGroupsBackendManager; m_userGroupsBackendManager = nullptr; @@ -131,9 +136,6 @@ VeyonCore::~VeyonCore() delete m_authenticationManager; m_authenticationManager = nullptr; - delete m_builtinFeatures; - m_builtinFeatures = nullptr; - delete m_logger; m_logger = nullptr; @@ -680,8 +682,6 @@ void VeyonCore::initPlugins() // load all other (non-platform) plugins m_pluginManager->loadPlugins(); m_pluginManager->upgradePlugins(); - - m_builtinFeatures = new BuiltinFeatures(); } @@ -689,13 +689,20 @@ void VeyonCore::initPlugins() void VeyonCore::initManagers() { m_authenticationManager = new AuthenticationManager( this ); - m_featureManager = new FeatureManager(this); m_userGroupsBackendManager = new UserGroupsBackendManager( this ); m_networkObjectDirectoryManager = new NetworkObjectDirectoryManager( this ); } +void VeyonCore::initFeatures() +{ + m_builtinFeatures = new BuiltinFeatures(); + m_featureManager = new FeatureManager(this); +} + + + void VeyonCore::initSystemInfo() { vDebug() << versionString() << HostAddress::localFQDN() diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 89253d780..59bf9b66b 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -218,6 +218,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject void initAuthenticationCredentials(); void initPlugins(); void initManagers(); + void initFeatures(); void initLocalComputerControlInterface(); void initSystemInfo(); void initTlsConfiguration(); From 92f40556a9ce908d95b88f4b9604d031db742889 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 16:45:27 +0100 Subject: [PATCH 1703/1765] VeyonConnection/CCI: exchange access control details via FeatureMessage This is a much cleaner approach than transporting the access control details via the RFB desktop name and intercepting log messages of libvncclient. --- core/src/AccessControlProvider.cpp | 22 +++++++++ core/src/AccessControlProvider.h | 11 +++++ core/src/ComputerControlInterface.cpp | 30 ++++++------- core/src/ComputerControlInterface.h | 10 ++--- core/src/VeyonConnection.cpp | 34 -------------- core/src/VeyonConnection.h | 5 --- core/src/VncConnection.h | 1 + core/src/VncServerProtocol.cpp | 54 ++++++++++++++--------- core/src/VncServerProtocol.h | 19 +++++--- master/src/ComputerControlListModel.cpp | 22 ++++----- master/src/ComputerControlListModel.h | 2 +- master/src/MainWindow.cpp | 10 ++--- server/src/ComputerControlServer.cpp | 2 +- server/src/ServerAccessControlManager.cpp | 22 +++++---- 14 files changed, 129 insertions(+), 115 deletions(-) diff --git a/core/src/AccessControlProvider.cpp b/core/src/AccessControlProvider.cpp index 6cc68c8c2..ce908f291 100644 --- a/core/src/AccessControlProvider.cpp +++ b/core/src/AccessControlProvider.cpp @@ -265,6 +265,28 @@ bool AccessControlProvider::isAccessToLocalComputerDenied() const +bool AccessControlProvider::handleFeatureMessage(ComputerControlInterface::Pointer computerControlInterface, const FeatureMessage& message) +{ + if (message.featureUid() == m_accessControlFeature.uid()) + { + computerControlInterface->setAccessControlFailed(message.argument(Argument::Details).toString()); + return true; + } + + return false; +} + + + +void AccessControlProvider::sendDetails(QIODevice* ioDevice, const QString& details) +{ + FeatureMessage{m_accessControlFeature.uid()}.addArgument( + AccessControlProvider::Argument::Details, details) + .sendAsRfbMessage(ioDevice); +} + + + bool AccessControlProvider::isMemberOfUserGroup( const QString &user, const QString &groupName ) const { diff --git a/core/src/AccessControlProvider.h b/core/src/AccessControlProvider.h index 24af37b45..9c40b520d 100644 --- a/core/src/AccessControlProvider.h +++ b/core/src/AccessControlProvider.h @@ -53,6 +53,12 @@ class VEYON_CORE_EXPORT AccessControlProvider : public QObject, FeatureProviderI UserInAuthorizedUserGroups, }; + enum class Argument + { + Details, + }; + Q_ENUM(Argument) + struct CheckResult { Access access = Access::Deny; Reason reason = Reason::Unknown; @@ -130,6 +136,11 @@ class VEYON_CORE_EXPORT AccessControlProvider : public QObject, FeatureProviderI return false; } + bool handleFeatureMessage(ComputerControlInterface::Pointer computerControlInterface, + const FeatureMessage& message) override; + + void sendDetails(QIODevice* ioDevice, const QString& details); + private: bool isMemberOfUserGroup( const QString& user, const QString& groupName ) const; bool isLocatedAt( const QString& computer, const QString& locationName ) const; diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 5955006dd..d408015c0 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -22,6 +22,7 @@ * */ +#include "AccessControlProvider.h" #include "BuiltinFeatures.h" #include "ComputerControlInterface.h" #include "Computer.h" @@ -105,7 +106,6 @@ void ComputerControlInterface::start( QSize scaledFramebufferSize, UpdateMode up connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::updateScreens ); connect( vncConnection, &VncConnection::stateChanged, this, &ComputerControlInterface::stateChanged ); - connect(m_connection, &VeyonConnection::accessControlMessageReceived, this, &ComputerControlInterface::setAccessControlMessage); connect( m_connection, &VeyonConnection::featureMessageReceived, this, &ComputerControlInterface::handleFeatureMessage ); connect( m_connection, &VeyonConnection::featureMessageReceived, this, &ComputerControlInterface::resetWatchdog ); @@ -196,13 +196,20 @@ QImage ComputerControlInterface::framebuffer() const -void ComputerControlInterface::setAccessControlMessage(const QString& accessControlMessage) +void ComputerControlInterface::setAccessControlFailed(const QString& details) { lock(); - m_accessControlMessage = accessControlMessage; + m_accessControlDetails = details; + m_state = State::AccessControlFailed; + + if (vncConnection()) + { + vncConnection()->stop(); + } unlock(); - Q_EMIT accessControlMessageChanged(); + Q_EMIT accessControlDetailsChanged(); + Q_EMIT stateChanged(); } @@ -441,7 +448,7 @@ void ComputerControlInterface::setQuality() void ComputerControlInterface::resetWatchdog() { - if( state() == State::Connected ) + if (state() == State::Connected || state() == State::AccessControlFailed) { m_pingTimer.start(); m_connectionWatchdogTimer.start(); @@ -467,18 +474,11 @@ void ComputerControlInterface::updateState() { lock(); - if( vncConnection() ) + if (vncConnection()) { - switch( vncConnection()->state() ) + if (!(m_state == State::AccessControlFailed && vncConnection()->state() == VncConnection::State::Disconnected)) { - case VncConnection::State::Disconnected: m_state = State::Disconnected; break; - case VncConnection::State::Connecting: m_state = State::Connecting; break; - case VncConnection::State::Connected: m_state = State::Connected; break; - case VncConnection::State::HostOffline: m_state = State::HostOffline; break; - case VncConnection::State::HostNameResolutionFailed: m_state = State::HostNameResolutionFailed; break; - case VncConnection::State::ServerNotRunning: m_state = State::ServerNotRunning; break; - case VncConnection::State::AuthenticationFailed: m_state = State::AuthenticationFailed; break; - default: m_state = VncConnection::State::Disconnected; break; + m_state = vncConnection()->state(); } } else diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index b4550d241..d766ea7f3 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -106,12 +106,12 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_timestamp; } - const QString& accessControlMessage() const + const QString& accessControlDetails() const { - return m_accessControlMessage; + return m_accessControlDetails; } - void setAccessControlMessage(const QString& accessControlMessage); + void setAccessControlFailed(const QString& details); VeyonCore::ApplicationVersion serverVersion() const { @@ -243,7 +243,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab VeyonCore::ApplicationVersion m_serverVersion{VeyonCore::ApplicationVersion::Unknown}; QTimer m_serverVersionQueryTimer{this}; - QString m_accessControlMessage{}; + QString m_accessControlDetails{}; QTimer m_statePollingTimer{this}; QStringList m_groups; @@ -251,7 +251,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab QMap m_properties; Q_SIGNALS: - void accessControlMessageChanged(); + void accessControlDetailsChanged(); void framebufferSizeChanged(); void framebufferUpdated( QRect rect ); void scaledFramebufferUpdated(); diff --git a/core/src/VeyonConnection.cpp b/core/src/VeyonConnection.cpp index 15832c6f6..6db1aa893 100644 --- a/core/src/VeyonConnection.cpp +++ b/core/src/VeyonConnection.cpp @@ -24,7 +24,6 @@ #include "rfb/rfbclient.h" -#include "AccessControlProvider.h" #include "AuthenticationManager.h" #include "PlatformUserFunctions.h" #include "SocketDevice.h" @@ -38,9 +37,6 @@ static rfbClientProtocolExtension* __veyonProtocolExt = nullptr; static constexpr std::array __veyonSecurityTypes = { VeyonCore::RfbSecurityTypeVeyon, 0 }; -VeyonConnection::Instances VeyonConnection::instances; - - rfbBool handleVeyonMessage( rfbClient* client, rfbServerToClientMsg* msg ) { auto connection = reinterpret_cast( VncConnection::clientData( client, VeyonConnection::VeyonConnectionTag ) ); @@ -66,14 +62,8 @@ VeyonConnection::VeyonConnection() __veyonProtocolExt->handleAuthentication = handleSecTypeVeyon; rfbClientRegisterExtension( __veyonProtocolExt ); - - VncConnection::registerRfbLogMessageReader(VeyonConnection::evalRfbClientLogMessage); } - instances.mutex.lock(); - instances.connections[m_vncConnection] = this; - instances.mutex.unlock(); - connect( m_vncConnection, &VncConnection::connectionPrepared, this, &VeyonConnection::registerConnection, Qt::DirectConnection ); connect( m_vncConnection, &VncConnection::destroyed, VeyonCore::instance(), [this]() { delete this; @@ -84,9 +74,6 @@ VeyonConnection::VeyonConnection() VeyonConnection::~VeyonConnection() { - instances.mutex.lock(); - instances.connections.remove(m_vncConnection); - instances.mutex.unlock(); } @@ -274,24 +261,3 @@ void VeyonConnection::hookPrepareAuthentication( rfbClient* client ) connection->setServerReachable(); } } - - - -void VeyonConnection::evalRfbClientLogMessage(const QByteArray& message) -{ - static const QByteArray accessControlMessageMatchPattern = QByteArrayLiteral("Desktop name \"") + - AccessControlProvider::accessControlMessageScheme(); - - if (message.startsWith(accessControlMessageMatchPattern)) - { - QMutexLocker m(&instances.mutex); - const auto connection = instances.connections.value(QThread::currentThread()); - if (connection) - { - Q_EMIT connection->accessControlMessageReceived( - QString::fromUtf8( - message.mid(accessControlMessageMatchPattern.size(), - message.length() - accessControlMessageMatchPattern.size() - 2))); - } - } -} diff --git a/core/src/VeyonConnection.h b/core/src/VeyonConnection.h index f32537250..d71eaaadd 100644 --- a/core/src/VeyonConnection.h +++ b/core/src/VeyonConnection.h @@ -67,12 +67,9 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject Q_SIGNALS: - void accessControlMessageReceived(const QString& message); void featureMessageReceived( const FeatureMessage& ); private: - static Instances instances; - ~VeyonConnection() override; void registerConnection(); @@ -82,8 +79,6 @@ class VEYON_CORE_EXPORT VeyonConnection : public QObject static int8_t handleSecTypeVeyon( rfbClient* client, uint32_t authScheme ); static void hookPrepareAuthentication( rfbClient* client ); - static void evalRfbClientLogMessage(const QByteArray& message); - VncConnection* m_vncConnection{new VncConnection}; QString m_accessControlMessage; diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 47f535cd9..5a55cebee 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -73,6 +73,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread HostNameResolutionFailed, ServerNotRunning, AuthenticationFailed, + AccessControlFailed, ConnectionFailed, Connected } ; diff --git a/core/src/VncServerProtocol.cpp b/core/src/VncServerProtocol.cpp index 00ca05749..7800a6ea4 100644 --- a/core/src/VncServerProtocol.cpp +++ b/core/src/VncServerProtocol.cpp @@ -29,23 +29,19 @@ #include #include "AccessControlProvider.h" +#include "BuiltinFeatures.h" #include "VariantArrayMessage.h" #include "VncServerClient.h" #include "VncServerProtocol.h" -VncServerProtocol::VncServerProtocol( QIODevice* socket, - VncServerClient* client ) : +VncServerProtocol::VncServerProtocol(QTcpSocket* socket, VncServerClient* client) : m_socket( socket ), m_client( client ), m_serverInitMessage() { - auto qtcpSocket = qobject_cast(socket); - if (qtcpSocket) - { - m_client->setHostAddress(qtcpSocket->peerAddress().toString()); - } + m_client->setHostAddress(m_socket->peerAddress().toString()); m_client->setAccessControlState( VncServerClient::AccessControlState::Init ); } @@ -101,6 +97,17 @@ bool VncServerProtocol::read() m_socket->close(); break; + case State::Closing: + if (m_socket->isOpen()) + { + m_socket->readAll(); + } + else + { + setState(State::Close); + } + return false; + default: break; } @@ -297,11 +304,11 @@ bool VncServerProtocol::processAccessControl() break; default: - sendFailedAccessControlMessage(); vCritical() << "access control failed - closing connection"; - m_socket->close(); + m_socket->read(sz_rfbClientInitMsg); + sendEmptyServerInitMessage(); + sendFailedAccessControlDetails(); return true; - break; } return false; @@ -309,20 +316,25 @@ bool VncServerProtocol::processAccessControl() -void VncServerProtocol::sendFailedAccessControlMessage() +void VncServerProtocol::sendFailedAccessControlDetails() { - auto name = client()->accessControlDetails().toUtf8(); - if (name.length() > 0) - { - name.prepend(AccessControlProvider::accessControlMessageScheme()); + VeyonCore::builtinFeatures().accessControlProvider().sendDetails(m_socket, client()->accessControlDetails()); - rfbServerInitMsg msg{}; - msg.format.bitsPerPixel = 255; - msg.nameLength = qToBigEndian(name.length()); + QObject::connect (&m_accessControlDetailsSendTimer, &QTimer::timeout, m_socket, [this]() { + VeyonCore::builtinFeatures().accessControlProvider().sendDetails(m_socket, client()->accessControlDetails()); + }); + QTimer::singleShot(AccessControlCloseDelay, m_socket, &QAbstractSocket::close); + m_accessControlDetailsSendTimer.start(AccessControlDetailsSendInterval); - m_socket->write(reinterpret_cast(&msg), sizeof(msg)); - m_socket->write(name); - } + setState(State::Closing); +} + + + +void VncServerProtocol::sendEmptyServerInitMessage() +{ + rfbServerInitMsg message{}; + m_socket->write(reinterpret_cast(&message), sizeof(message)); } diff --git a/core/src/VncServerProtocol.h b/core/src/VncServerProtocol.h index c76fd17df..926f42cc7 100644 --- a/core/src/VncServerProtocol.h +++ b/core/src/VncServerProtocol.h @@ -27,7 +27,7 @@ #include "VeyonCore.h" #include "Plugin.h" -class QIODevice; +class QTcpSocket; class VariantArrayMessage; class VncServerClient; @@ -50,11 +50,11 @@ class VEYON_CORE_EXPORT VncServerProtocol FramebufferInit, Running, Close, + Closing, StateCount } ; - VncServerProtocol( QIODevice* socket, - VncServerClient* client ); + VncServerProtocol(QTcpSocket* socket, VncServerClient* client); virtual ~VncServerProtocol() = default; State state() const; @@ -72,7 +72,7 @@ class VEYON_CORE_EXPORT VncServerProtocol virtual void processAuthenticationMessage( VariantArrayMessage& message ) = 0; virtual void performAccessControl() = 0; - QIODevice* socket() + QTcpSocket* socket() { return m_socket; } @@ -95,14 +95,21 @@ class VEYON_CORE_EXPORT VncServerProtocol bool processAuthentication( VariantArrayMessage& message ); bool processAccessControl(); - void sendFailedAccessControlMessage(); + void sendFailedAccessControlDetails(); + + void sendEmptyServerInitMessage(); bool processFramebufferInit(); private: - QIODevice* m_socket; + static constexpr auto AccessControlCloseDelay = 10000; + static constexpr auto AccessControlDetailsSendInterval = 100; + + QTcpSocket* m_socket; VncServerClient* m_client; QByteArray m_serverInitMessage; + QTimer m_accessControlDetailsSendTimer; + } ; diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 34beb77f4..833424a73 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -253,15 +253,13 @@ QImage ComputerControlListModel::computerDecorationRole( const ComputerControlIn case ComputerControlInterface::State::AuthenticationFailed: return scaleAndAlignIcon(m_iconHostAccessDenied, controlInterface->scaledFramebufferSize()); + case ComputerControlInterface::State::AccessControlFailed: + return scaleAndAlignIcon(m_iconHostAccessDenied, controlInterface->scaledFramebufferSize()); + default: break; } - if (controlInterface->accessControlMessage().isEmpty() == false) - { - return scaleAndAlignIcon(m_iconHostAccessDenied, controlInterface->scaledFramebufferSize()); - } - return scaleAndAlignIcon(m_iconHostOffline, controlInterface->scaledFramebufferSize()); } @@ -375,7 +373,7 @@ void ComputerControlListModel::updateState( const QModelIndex& index ) -void ComputerControlListModel::updateAccessControlMessage(const QModelIndex& index) +void ComputerControlListModel::updateAccessControlDetails(const QModelIndex& index) { Q_EMIT dataChanged(index, index, { Qt::ToolTipRole }); } @@ -445,8 +443,8 @@ void ComputerControlListModel::startComputerControlInterface( ComputerControlInt connect(controlInterface, &ComputerControlInterface::sessionInfoChanged, this, [=]() { updateSessionInfo(interfaceIndex(controlInterface)); }); - connect(controlInterface, &ComputerControlInterface::accessControlMessageChanged, - this, [=] () { updateAccessControlMessage(interfaceIndex(controlInterface)); }); + connect(controlInterface, &ComputerControlInterface::accessControlDetailsChanged, + this, [=] () { updateAccessControlDetails(interfaceIndex(controlInterface)); }); } @@ -602,15 +600,13 @@ QString ComputerControlListModel::computerStateDescription( const ComputerContro case ComputerControlInterface::State::AuthenticationFailed: return tr( "Authentication failed or access denied" ); + case ComputerControlInterface::State::AccessControlFailed: + return controlInterface->accessControlDetails(); + default: break; } - if (controlInterface->accessControlMessage().isEmpty() == false) - { - return controlInterface->accessControlMessage(); - } - return tr( "Disconnected" ); } diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 912f28358..2188e8589 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -81,7 +81,7 @@ class ComputerControlListModel : public ComputerListModel QVariant uidRoleData(const ComputerControlInterface::Pointer& controlInterface) const; void updateState( const QModelIndex& index ); - void updateAccessControlMessage(const QModelIndex& index); + void updateAccessControlDetails(const QModelIndex& index); void updateScreen( const QModelIndex& index ); void updateActiveFeatures( const QModelIndex& index ); void updateUser( const QModelIndex& index ); diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index c326ad3c9..541e16d37 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -303,11 +303,11 @@ bool MainWindow::initAccessControl() { const auto username = VeyonCore::authenticationManager().initializedPlugin()->accessControlUser(); const auto authMethodUid = VeyonCore::authenticationManager().toUid( VeyonCore::authenticationManager().initializedPlugin() ); - const auto accessControlResult = - AccessControlProvider().checkAccess( username, - QHostAddress( QHostAddress::LocalHost ).toString(), - QStringList(), - authMethodUid ); + const auto accessControlResult = VeyonCore::builtinFeatures().accessControlProvider() + .checkAccess( username, + QHostAddress( QHostAddress::LocalHost ).toString(), + QStringList(), + authMethodUid ); if (accessControlResult.access == AccessControlProvider::Access::Deny) { vWarning() << "user" << username << "is not allowed to access computers"; diff --git a/server/src/ComputerControlServer.cpp b/server/src/ComputerControlServer.cpp index 527f81cc4..da6b72d6c 100644 --- a/server/src/ComputerControlServer.cpp +++ b/server/src/ComputerControlServer.cpp @@ -41,7 +41,7 @@ ComputerControlServer::ComputerControlServer( QObject* parent ) : m_featureWorkerManager( *this ), m_serverAuthenticationManager( this ), m_serverAccessControlManager( m_featureWorkerManager, VeyonCore::builtinFeatures().desktopAccessDialog(), this ), - m_vncProxyServer( VeyonCore::config().localConnectOnly() || AccessControlProvider().isAccessToLocalComputerDenied() ? + m_vncProxyServer( VeyonCore::config().localConnectOnly() || VeyonCore::builtinFeatures().accessControlProvider().isAccessToLocalComputerDenied() ? QHostAddress::LocalHost : QHostAddress::Any, VeyonCore::config().veyonServerPort() + VeyonCore::sessionId(), this, diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index cd863f3a7..b00f43017 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -22,11 +22,11 @@ * */ +#include "BuiltinFeatures.h" #include "ServerAccessControlManager.h" #include "AccessControlProvider.h" #include "AuthenticationManager.h" #include "DesktopAccessDialog.h" -#include "VeyonConfiguration.h" ServerAccessControlManager::ServerAccessControlManager( FeatureWorkerManager& featureWorkerManager, @@ -114,11 +114,11 @@ void ServerAccessControlManager::performAccessControl( VncServerClient* client ) break; } - AccessControlProvider accessControlProvider; - const auto checkResult = accessControlProvider.checkAccess(client->username(), - client->hostAddress(), - connectedUsers(), - client->authMethodUid()); + const auto checkResult = VeyonCore::builtinFeatures().accessControlProvider() + .checkAccess(client->username(), + client->hostAddress(), + connectedUsers(), + client->authMethodUid()); switch (checkResult.access) { @@ -145,6 +145,10 @@ void ServerAccessControlManager::performAccessControl( VncServerClient* client ) { client->setAccessControlDetails(tr("No rule allowed access")); } + else if (checkResult.reason == AccessControlProvider::Reason::UserNotInAuthorizedUserGroups) + { + client->setAccessControlDetails(tr("Accessing user not member of an authorized user group")); + } break; } @@ -165,6 +169,7 @@ VncServerClient::AccessControlState ServerAccessControlManager::confirmDesktopAc return VncServerClient::AccessControlState::Successful; } + client->setAccessControlDetails(tr("User did not confirm access")); return VncServerClient::AccessControlState::Failed; } @@ -215,14 +220,13 @@ void ServerAccessControlManager::finishDesktopAccessConfirmation( VncServerClien if( choice == DesktopAccessDialog::ChoiceYes || choice == DesktopAccessDialog::ChoiceAlways ) { client->setAccessControlState( VncServerClient::AccessControlState::Successful ); - client->setAccessControlDetails(tr("User confirmed access.")); + client->setAccessControlDetails(tr("User confirmed access")); m_clients.append( client ); } else { client->setAccessControlState( VncServerClient::AccessControlState::Failed ); - client->setAccessControlDetails(tr("User did not confirm access.")); - client->setProtocolState( VncServerProtocol::State::Close ); + client->setAccessControlDetails(tr("User did not confirm access")); } } From 0dc9f8e82ea7822b4dc10f0f3baf754145517bfa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 17:01:47 +0100 Subject: [PATCH 1704/1765] Revert "VncConnection: add support for RfbLogMessageReader hook" This reverts commit 9be25e34003742125d6f4a02df19fd53769b73c8. --- core/src/VncConnection.cpp | 9 --------- core/src/VncConnection.h | 10 ---------- 2 files changed, 19 deletions(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index c5ec26c5f..d15eb005f 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -43,8 +43,6 @@ #include "VncEvents.h" -VncConnection::RfbLogMessageReader VncConnection::s_rfbLogMessageReader = [](const QByteArray&) { }; - VncConnection::VncConnection( QObject* parent ) : QThread( parent ), m_verifyServerCertificate( VeyonCore::config().tlsUseCertificateAuthority() ), @@ -103,13 +101,6 @@ void VncConnection::initLogging( bool debug ) -void VncConnection::registerRfbLogMessageReader(const RfbLogMessageReader& reader) -{ - s_rfbLogMessageReader = reader; -} - - - QImage VncConnection::image() { QReadLocker locker( &m_imgLock ); diff --git a/core/src/VncConnection.h b/core/src/VncConnection.h index 5a55cebee..7eb84a4d1 100644 --- a/core/src/VncConnection.h +++ b/core/src/VncConnection.h @@ -81,10 +81,7 @@ class VEYON_CORE_EXPORT VncConnection : public QThread explicit VncConnection( QObject *parent = nullptr ); - using RfbLogMessageReader = std::function; - static void initLogging( bool debug ); - static void registerRfbLogMessageReader(const RfbLogMessageReader& reader); QImage image(); @@ -179,9 +176,6 @@ class VEYON_CORE_EXPORT VncConnection : public QThread static constexpr int RfbBitsPerSample = 8; static constexpr int RfbSamplesPerPixel = 3; static constexpr int RfbBytesPerPixel = sizeof(RfbPixel); - static constexpr int RfbLogMessageMaxLength = 256; - - static RfbLogMessageReader s_rfbLogMessageReader; enum class ControlFlag { ScaledFramebufferNeedsUpdate = 0x01, @@ -195,8 +189,6 @@ class VEYON_CORE_EXPORT VncConnection : public QThread SkipFramebufferUpdates = 0x100 }; - using RfbLogMessage = std::array; - ~VncConnection() override; void establishConnection(); @@ -227,8 +219,6 @@ class VEYON_CORE_EXPORT VncConnection : public QThread static void rfbClientLogDebug( const char* format, ... ); static void rfbClientLogNone( const char* format, ... ); - static RfbLogMessage readRfbClientLogMessage(const char* format, va_list args); - static void framebufferCleanup( void* framebuffer ); rfbSocket openTlsSocket( const char* hostname, int port ); From 528e6d6cb675c2fdf67b3e940a83cad9998ee8e1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 16:47:22 +0100 Subject: [PATCH 1705/1765] VeyonCore: drop unused includes --- core/src/VeyonCore.h | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 59bf9b66b..6251e391b 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -26,7 +26,6 @@ #include #include -#include #include #include From 173f5abb0a02d49e1ed0b89d956781564b5385a3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 16:47:37 +0100 Subject: [PATCH 1706/1765] VncConnection: restart thread if already terminated --- core/src/VncConnection.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index d15eb005f..d6e60ada0 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -111,7 +111,15 @@ QImage VncConnection::image() void VncConnection::restart() { - setControlFlag( ControlFlag::RestartConnection, true ); + if (isRunning()) + { + setControlFlag(ControlFlag::RestartConnection, true); + } + else + { + setControlFlag(ControlFlag::TerminateThread, false); + start(); + } } From bdd3dbb493ecc650dd707b44fbe1c9f3ca438e57 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 16:48:02 +0100 Subject: [PATCH 1707/1765] VncConnection: don't scale null images --- core/src/VncConnection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/VncConnection.cpp b/core/src/VncConnection.cpp index d6e60ada0..f75f5290b 100644 --- a/core/src/VncConnection.cpp +++ b/core/src/VncConnection.cpp @@ -316,7 +316,7 @@ void VncConnection::rescaleFramebuffer() QReadLocker locker( &m_imgLock ); - if( m_image.size().isValid() == false ) + if (m_image.isNull() || m_image.size().isValid() == false) { return; } From 39fe35ea2268ccb38a531f4daba2b20d7a38d006 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 16:48:16 +0100 Subject: [PATCH 1708/1765] ComputerControlListModel: fix typo --- master/src/ComputerControlListModel.cpp | 4 ++-- master/src/ComputerControlListModel.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 833424a73..8680f470d 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -43,7 +43,7 @@ ComputerControlListModel::ComputerControlListModel( VeyonMaster* masterCore, QOb m_imageProvider( new ComputerImageProvider( this ) ), m_iconHostOffline(QStringLiteral(":/master/host-offline.png")), m_iconHostOnline(QStringLiteral(":/master/host-online.png")), - m_iconHostNameReslutionFailed(QStringLiteral(":/master/host-dns-error.png")), + m_iconHostNameResolutionFailed(QStringLiteral(":/master/host-dns-error.png")), m_iconHostAccessDenied(QStringLiteral(":/master/host-access-denied.png")), m_iconHostServiceError(QStringLiteral(":/master/host-service-error.png")) { @@ -245,7 +245,7 @@ QImage ComputerControlListModel::computerDecorationRole( const ComputerControlIn } case ComputerControlInterface::State::HostNameResolutionFailed: - return scaleAndAlignIcon(m_iconHostNameReslutionFailed, controlInterface->scaledFramebufferSize()); + return scaleAndAlignIcon(m_iconHostNameResolutionFailed, controlInterface->scaledFramebufferSize()); case ComputerControlInterface::State::ServerNotRunning: return scaleAndAlignIcon(m_iconHostServiceError, controlInterface->scaledFramebufferSize()); diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 2188e8589..9f0253ae6 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -105,7 +105,7 @@ class ComputerControlListModel : public ComputerListModel ComputerImageProvider* m_imageProvider; QImage m_iconHostOffline; QImage m_iconHostOnline; - QImage m_iconHostNameReslutionFailed; + QImage m_iconHostNameResolutionFailed; QImage m_iconHostAccessDenied; QImage m_iconHostServiceError; From 380d527f2a5b38c473f475176561e7feabc6d041 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 16:48:35 +0100 Subject: [PATCH 1709/1765] ComputerControlListModel: indicate connected state only after framebuffer is available --- master/src/ComputerControlListModel.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 8680f470d..9451102a0 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -583,7 +583,11 @@ QString ComputerControlListModel::computerStateDescription( const ComputerContro switch( controlInterface->state() ) { case ComputerControlInterface::State::Connected: - return tr( "Online and connected" ); + if (controlInterface->hasValidFramebuffer()) + { + return tr("Online and connected"); + } + [[fallthrough]]; case ComputerControlInterface::State::Connecting: return tr( "Establishing connection" ); From 61206f0b00829d9983659ec9cb6b532ffe03d6d2 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 14 Mar 2025 17:11:45 +0100 Subject: [PATCH 1710/1765] VncServerProtocol: add missing include --- core/src/VncServerProtocol.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/VncServerProtocol.h b/core/src/VncServerProtocol.h index 926f42cc7..271459d7a 100644 --- a/core/src/VncServerProtocol.h +++ b/core/src/VncServerProtocol.h @@ -24,6 +24,8 @@ #pragma once +#include + #include "VeyonCore.h" #include "Plugin.h" From 7a7edfd21f870b1cef0d53e43a39589cfe2584c4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 08:49:16 +0100 Subject: [PATCH 1711/1765] ComputerControlListModel: improve user/features info in tooltip --- master/src/ComputerControlListModel.cpp | 50 +++++++++++-------------- master/src/ComputerControlListModel.h | 2 +- 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 9451102a0..b3cf082a9 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -509,12 +509,12 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte controlInterface->computer().hostName()) : tr("IP address: %1").arg(controlInterface->computer().hostAddress().toString()); - const QString user( userInformation( controlInterface ) ); - const QString features( tr( "Active features: %1" ).arg( activeFeatures( controlInterface ) ) ); + const QString user(userInformation(controlInterface)); + const QString features = activeFeaturesInformation(controlInterface); - if( user.isEmpty() ) + if (controlInterface->state() != ComputerControlInterface::State::Connected) { - return QStringLiteral("%1
    %2
    %3
    %4
    %5").arg(state, displayName, location, host, features); + return QStringLiteral("%1
    %2
    %3
    %4").arg(state, displayName, location, host); } return QStringLiteral("%1
    %2
    %3
    %4
    %5
    %6").arg(state, displayName, location, host, features, user); @@ -618,47 +618,41 @@ QString ComputerControlListModel::computerStateDescription( const ComputerContro QString ComputerControlListModel::userInformation(const ComputerControlInterface::Pointer& controlInterface) { - if( controlInterface->state() == ComputerControlInterface::State::Connected ) + if (controlInterface->userLoginName().isEmpty()) { - if( controlInterface->userLoginName().isEmpty() ) - { - return tr( "No user logged on" ); - } - - auto user = controlInterface->userLoginName(); - if( controlInterface->userFullName().isEmpty() == false ) - { - user = QStringLiteral("%1 (%2)").arg(controlInterface->userFullName(), user); - } + return tr("No user logged on"); + } - return tr( "Logged on user: %1" ).arg( user ); + auto user = controlInterface->userLoginName(); + if (controlInterface->userFullName().isEmpty() == false) + { + user = QStringLiteral("%1 (%2)").arg(controlInterface->userFullName(), user); } - return {}; + return tr("Logged on user: %1").arg(user); } -QString ComputerControlListModel::activeFeatures( const ComputerControlInterface::Pointer& controlInterface ) const +QString ComputerControlListModel::activeFeaturesInformation(const ComputerControlInterface::Pointer& controlInterface) { QStringList featureNames; - featureNames.reserve( controlInterface->activeFeatures().size() ); + featureNames.reserve(controlInterface->activeFeatures().size()); - for( const auto& feature : VeyonCore::featureManager().features() ) + for (const auto& feature : VeyonCore::featureManager().features()) { - if( feature.testFlag( Feature::Flag::Master ) && - controlInterface->activeFeatures().contains( feature.uid() ) ) + if (feature.testFlag(Feature::Flag::Master) && + feature.displayName().isEmpty() == false && + controlInterface->activeFeatures().contains(feature.uid())) { - featureNames.append( feature.displayName() ); + featureNames.append(feature.displayName()); } } - featureNames.removeAll( {} ); - - if( featureNames.isEmpty() ) + if (featureNames.isEmpty()) { - return tr("[none]"); + return tr("No features active"); } - return featureNames.join( QStringLiteral(", ") ); + return tr("Active features: %1").arg(featureNames.join(QStringLiteral(", "))); } diff --git a/master/src/ComputerControlListModel.h b/master/src/ComputerControlListModel.h index 9f0253ae6..7bbb3acd8 100644 --- a/master/src/ComputerControlListModel.h +++ b/master/src/ComputerControlListModel.h @@ -98,7 +98,7 @@ class ComputerControlListModel : public ComputerListModel QString computerSortRole( const ComputerControlInterface::Pointer& controlInterface ) const; static QString computerStateDescription( const ComputerControlInterface::Pointer& controlInterface ); static QString userInformation(const ComputerControlInterface::Pointer& controlInterface); - QString activeFeatures( const ComputerControlInterface::Pointer& controlInterface ) const; + static QString activeFeaturesInformation(const ComputerControlInterface::Pointer& controlInterface); VeyonMaster* m_master; From 89ad77d548e8b51ff53603b2affe11623137899e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 08:51:38 +0100 Subject: [PATCH 1712/1765] ServerAccessControlManager: indicate denied access more explicitly --- server/src/ServerAccessControlManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index b00f43017..232ba4740 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -169,7 +169,7 @@ VncServerClient::AccessControlState ServerAccessControlManager::confirmDesktopAc return VncServerClient::AccessControlState::Successful; } - client->setAccessControlDetails(tr("User did not confirm access")); + client->setAccessControlDetails(tr("User has denied access")); return VncServerClient::AccessControlState::Failed; } From f7ac3e753f1a9281e8f40bb7b37e78d2351603aa Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 09:30:10 +0100 Subject: [PATCH 1713/1765] AccessControlPage: check first radio button if no access control mechanisms are enabled --- configurator/src/AccessControlPage.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configurator/src/AccessControlPage.cpp b/configurator/src/AccessControlPage.cpp index 55e74381b..8088977ee 100644 --- a/configurator/src/AccessControlPage.cpp +++ b/configurator/src/AccessControlPage.cpp @@ -63,6 +63,12 @@ void AccessControlPage::resetWidgets() { FOREACH_VEYON_ACCESS_CONTROL_CONFIG_PROPERTY(INIT_WIDGET_FROM_PROPERTY); + if (VeyonCore::config().isAccessControlRulesProcessingEnabled() == false && + VeyonCore::config().isAccessRestrictedToUserGroups() == false) + { + ui->skipAccessControl->setChecked(true); + } + m_accessGroups = VeyonCore::config().authorizedUserGroups(); auto cleanedUpAccessGroups = m_accessGroups; From c8d44d1f2ce981781a4c6f8164867dc7a0d6b0ca Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 09:31:16 +0100 Subject: [PATCH 1714/1765] Configurator: improve error handling when applying config Continue with updating config pages and UI controls if config has been saved successfully and only parts of the config failed to apply. --- configurator/src/MainWindow.cpp | 41 ++++++++++++++++----------------- configurator/src/MainWindow.h | 1 - 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/configurator/src/MainWindow.cpp b/configurator/src/MainWindow.cpp index 785e84839..abbd61853 100644 --- a/configurator/src/MainWindow.cpp +++ b/configurator/src/MainWindow.cpp @@ -134,8 +134,23 @@ void MainWindow::reset( bool onlyUI ) void MainWindow::apply() { - if( applyConfiguration() ) + const auto showError = [this](const ConfigurationManager& configurationManager) { + vCritical() << configurationManager.errorString().toUtf8().constData(); + + QMessageBox::critical(this, + tr("%1 Configurator").arg(VeyonCore::applicationName()), + configurationManager.errorString()); + + }; + + ConfigurationManager configurationManager; + if (configurationManager.saveConfiguration()) { + if (configurationManager.applyConfiguration() == false) + { + showError(configurationManager); + } + const auto pages = findChildren(); for( auto page : pages ) { @@ -145,6 +160,10 @@ void MainWindow::apply() ui->buttonBox->setEnabled( false ); m_configChanged = false; } + else + { + showError(configurationManager); + } } @@ -352,26 +371,6 @@ void MainWindow::switchToAdvancedView() -bool MainWindow::applyConfiguration() -{ - ConfigurationManager configurationManager; - - if( configurationManager.saveConfiguration() == false || - configurationManager.applyConfiguration() == false ) - { - vCritical() << configurationManager.errorString().toUtf8().constData(); - - QMessageBox::critical( nullptr, - tr( "%1 Configurator" ).arg( VeyonCore::applicationName() ), - configurationManager.errorString() ); - return false; - } - - return true; -} - - - void MainWindow::loadConfigurationPagePlugins() { for( auto pluginObject : std::as_const( VeyonCore::pluginManager().pluginObjects() ) ) diff --git a/configurator/src/MainWindow.h b/configurator/src/MainWindow.h index 16efc3443..a0a505e57 100644 --- a/configurator/src/MainWindow.h +++ b/configurator/src/MainWindow.h @@ -66,7 +66,6 @@ private Q_SLOTS: void switchToStandardView(); void switchToAdvancedView(); - bool applyConfiguration(); void loadConfigurationPagePlugins(); Ui::MainWindow *ui; From 366a532f3751a262843a13d9e11de7ce29ac4711 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 11:08:35 +0100 Subject: [PATCH 1715/1765] FileSystemBrowser: pass parent widget to file dialogs --- configurator/src/GeneralConfigurationPage.cpp | 9 ++++----- configurator/src/MasterConfigurationPage.cpp | 6 +++--- configurator/src/ServiceConfigurationPage.cpp | 1 - core/src/FileSystemBrowser.cpp | 8 +++----- core/src/FileSystemBrowser.h | 4 +++- plugins/authkeys/AuthKeysConfigurationWidget.cpp | 6 ++---- plugins/filetransfer/FileTransferConfigurationPage.cpp | 4 ++-- 7 files changed, 17 insertions(+), 21 deletions(-) diff --git a/configurator/src/GeneralConfigurationPage.cpp b/configurator/src/GeneralConfigurationPage.cpp index 1fd223863..0dbe32db0 100644 --- a/configurator/src/GeneralConfigurationPage.cpp +++ b/configurator/src/GeneralConfigurationPage.cpp @@ -49,15 +49,15 @@ GeneralConfigurationPage::GeneralConfigurationPage( QWidget* parent ) : Configuration::UiMapping::setFlags( ui->tlsConfigGroupBox, Configuration::Property::Flag::Advanced ); connect( ui->browseTlsCaCertificateFile, &QAbstractButton::clicked, this, [this]() { - FileSystemBrowser( FileSystemBrowser::ExistingFile ).exec( ui->tlsCaCertificateFile ); + FileSystemBrowser(FileSystemBrowser::ExistingFile, this).exec(ui->tlsCaCertificateFile); } ); connect( ui->browseTlsHostCertificateFile, &QAbstractButton::clicked, this, [this]() { - FileSystemBrowser( FileSystemBrowser::ExistingFile ).exec( ui->tlsHostCertificateFile ); + FileSystemBrowser(FileSystemBrowser::ExistingFile, this).exec(ui->tlsHostCertificateFile); } ); connect( ui->browseTlsHostPrivateKeyFile, &QAbstractButton::clicked, this, [this]() { - FileSystemBrowser( FileSystemBrowser::ExistingFile ).exec( ui->tlsHostPrivateKeyFile ); + FileSystemBrowser(FileSystemBrowser::ExistingFile, this).exec(ui->tlsHostPrivateKeyFile); } ); // retrieve list of builtin translations and populate language combobox @@ -150,8 +150,7 @@ void GeneralConfigurationPage::applyConfiguration() void GeneralConfigurationPage::openLogFileDirectory() { - FileSystemBrowser( FileSystemBrowser::ExistingDirectory ). - exec( ui->logFileDirectory ); + FileSystemBrowser(FileSystemBrowser::ExistingDirectory, this).exec(ui->logFileDirectory); } diff --git a/configurator/src/MasterConfigurationPage.cpp b/configurator/src/MasterConfigurationPage.cpp index ee14d07c9..c3b302f99 100644 --- a/configurator/src/MasterConfigurationPage.cpp +++ b/configurator/src/MasterConfigurationPage.cpp @@ -126,21 +126,21 @@ void MasterConfigurationPage::disableFeature() void MasterConfigurationPage::openUserConfigurationDirectory() { - FileSystemBrowser(FileSystemBrowser::ExistingDirectory).exec(ui->userConfigurationDirectory); + FileSystemBrowser(FileSystemBrowser::ExistingDirectory, this).exec(ui->userConfigurationDirectory); } void MasterConfigurationPage::openScreenshotDirectory() { - FileSystemBrowser( FileSystemBrowser::ExistingDirectory ).exec( ui->screenshotDirectory ); + FileSystemBrowser(FileSystemBrowser::ExistingDirectory, this).exec(ui->screenshotDirectory); } void MasterConfigurationPage::openConfigurationTemplatesDirectory() { - FileSystemBrowser(FileSystemBrowser::ExistingDirectory).exec(ui->configurationTemplatesDirectory); + FileSystemBrowser(FileSystemBrowser::ExistingDirectory, this).exec(ui->configurationTemplatesDirectory); } diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index 73fc8de79..1a049e022 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -25,7 +25,6 @@ #include #include -#include "FileSystemBrowser.h" #include "VeyonConfiguration.h" #include "PluginManager.h" #include "ServiceConfigurationPage.h" diff --git a/core/src/FileSystemBrowser.cpp b/core/src/FileSystemBrowser.cpp index 3c4f9f8d1..bf128440f 100644 --- a/core/src/FileSystemBrowser.cpp +++ b/core/src/FileSystemBrowser.cpp @@ -66,18 +66,16 @@ QString FileSystemBrowser::exec( const QString &path, switch( m_browseMode ) { case ExistingDirectory: - chosenPath = QFileDialog::getExistingDirectory( nullptr, title, + chosenPath = QFileDialog::getExistingDirectory(m_parent, title, browsePath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks ); break; case ExistingFile: - chosenPath = QFileDialog::getOpenFileName( nullptr, title, - browsePath, filter ); + chosenPath = QFileDialog::getOpenFileName(m_parent, title, browsePath, filter); break; case SaveFile: - chosenPath = QFileDialog::getSaveFileName( nullptr, title, - browsePath, filter ); + chosenPath = QFileDialog::getSaveFileName(m_parent, title, browsePath, filter); break; default: break; diff --git a/core/src/FileSystemBrowser.h b/core/src/FileSystemBrowser.h index 8117f437e..28a359df7 100644 --- a/core/src/FileSystemBrowser.h +++ b/core/src/FileSystemBrowser.h @@ -40,7 +40,8 @@ class VEYON_CORE_EXPORT FileSystemBrowser } ; using BrowseMode = BrowseModes; - explicit FileSystemBrowser( BrowseMode m ) : + explicit FileSystemBrowser(BrowseMode m, QWidget* parent) : + m_parent(parent), m_browseMode( m ), m_expandPath( true ), m_shrinkPath( true ) @@ -64,6 +65,7 @@ class VEYON_CORE_EXPORT FileSystemBrowser private: + QWidget* m_parent; BrowseMode m_browseMode; bool m_expandPath; bool m_shrinkPath; diff --git a/plugins/authkeys/AuthKeysConfigurationWidget.cpp b/plugins/authkeys/AuthKeysConfigurationWidget.cpp index 7e2ff8da9..a61ec63d5 100644 --- a/plugins/authkeys/AuthKeysConfigurationWidget.cpp +++ b/plugins/authkeys/AuthKeysConfigurationWidget.cpp @@ -83,16 +83,14 @@ AuthKeysConfigurationWidget::~AuthKeysConfigurationWidget() void AuthKeysConfigurationWidget::openPublicKeyBaseDir() { - FileSystemBrowser( FileSystemBrowser::ExistingDirectory ). - exec( ui->publicKeyBaseDir ); + FileSystemBrowser(FileSystemBrowser::ExistingDirectory, this).exec(ui->publicKeyBaseDir); } void AuthKeysConfigurationWidget::openPrivateKeyBaseDir() { - FileSystemBrowser( FileSystemBrowser::ExistingDirectory ). - exec( ui->privateKeyBaseDir ); + FileSystemBrowser(FileSystemBrowser::ExistingDirectory, this).exec(ui->privateKeyBaseDir); } diff --git a/plugins/filetransfer/FileTransferConfigurationPage.cpp b/plugins/filetransfer/FileTransferConfigurationPage.cpp index 2faab7d7d..4fca328ea 100644 --- a/plugins/filetransfer/FileTransferConfigurationPage.cpp +++ b/plugins/filetransfer/FileTransferConfigurationPage.cpp @@ -75,12 +75,12 @@ void FileTransferConfigurationPage::applyConfiguration() void FileTransferConfigurationPage::browseDefaultSourceDirectory() { - FileSystemBrowser( FileSystemBrowser::ExistingDirectory ).exec( ui->fileTransferDefaultSourceDirectory ); + FileSystemBrowser(FileSystemBrowser::ExistingDirectory, this).exec(ui->fileTransferDefaultSourceDirectory); } void FileTransferConfigurationPage::browseDestinationDirectory() { - FileSystemBrowser( FileSystemBrowser::ExistingDirectory ).exec( ui->fileTransferDestinationDirectory ); + FileSystemBrowser(FileSystemBrowser::ExistingDirectory, this).exec(ui->fileTransferDestinationDirectory); } From 8e06f15d54ea311d4c19d4b1e895245e95df1f36 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 12:48:56 +0100 Subject: [PATCH 1716/1765] CI: drop CentOS support and build RHEL 8/9 packages via RockyLinux --- .ci/linux.centos.7.9/script.sh | 10 --------- .../Dockerfile | 12 +++++------ .ci/linux.rhel.8/script.sh | 8 +++++++ .ci/linux.rhel.9/Dockerfile | 21 +++++++++++++++++++ .ci/linux.rhel.9/script.sh | 8 +++++++ .gitlab-ci.yml | 3 ++- 6 files changed, 44 insertions(+), 18 deletions(-) delete mode 100755 .ci/linux.centos.7.9/script.sh rename .ci/{linux.centos.7.9 => linux.rhel.8}/Dockerfile (57%) create mode 100755 .ci/linux.rhel.8/script.sh create mode 100644 .ci/linux.rhel.9/Dockerfile create mode 100755 .ci/linux.rhel.9/script.sh diff --git a/.ci/linux.centos.7.9/script.sh b/.ci/linux.centos.7.9/script.sh deleted file mode 100755 index 5aba99b69..000000000 --- a/.ci/linux.centos.7.9/script.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -source scl_source enable devtoolset-7 - -set -e - -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=centos.7.9" - -$1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.centos.7.9/Dockerfile b/.ci/linux.rhel.8/Dockerfile similarity index 57% rename from .ci/linux.centos.7.9/Dockerfile rename to .ci/linux.rhel.8/Dockerfile index b867a0e4b..e33f6ae0e 100644 --- a/.ci/linux.centos.7.9/Dockerfile +++ b/.ci/linux.rhel.8/Dockerfile @@ -1,11 +1,10 @@ -FROM centos:7.9.2009 +FROM rockylinux:8 MAINTAINER Tobias Junghans RUN \ - yum --enablerepo=extras install -y epel-release && \ - yum install -y https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm && \ - yum install -y centos-release-scl && \ - yum install -y git devtoolset-7 ninja-build cmake3 rpm-build fakeroot \ + dnf -y --enablerepo=extras install epel-release && \ + dnf -y install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm && \ + dnf -y --enablerepo=devel install git ninja-build cmake rpm-build fakeroot \ qt5-qtbase-devel qt5-qtbase qt5-linguist qt5-qttools qt5-qtquickcontrols2-devel \ libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ libjpeg-turbo-devel \ @@ -18,5 +17,4 @@ RUN \ qca-qt5-devel qca-qt5-ossl \ ffmpeg-devel \ cyrus-sasl-devel \ - openldap-devel && \ - ln -s /usr/bin/cmake3 /usr/bin/cmake + openldap-devel diff --git a/.ci/linux.rhel.8/script.sh b/.ci/linux.rhel.8/script.sh new file mode 100755 index 000000000..b2516359e --- /dev/null +++ b/.ci/linux.rhel.8/script.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=rhel.8" + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.ci/linux.rhel.9/Dockerfile b/.ci/linux.rhel.9/Dockerfile new file mode 100644 index 000000000..e57afa426 --- /dev/null +++ b/.ci/linux.rhel.9/Dockerfile @@ -0,0 +1,21 @@ +FROM rockylinux:9 +MAINTAINER Tobias Junghans + +RUN \ + dnf -y --enablerepo=extras install epel-release && \ + dnf -y install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-9.noarch.rpm && \ + dnf -y --enablerepo=devel install \ + git ninja-build cmake rpm-build fakeroot \ + qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel \ + libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ + libfakekey-devel \ + libjpeg-turbo-devel zlib-devel libpng-devel lzo-devel \ + libvncserver-devel \ + openssl-devel \ + pam-devel \ + procps-devel \ + lzo-devel \ + qca-qt6-devel qca-qt6-ossl \ + ffmpeg-devel \ + cyrus-sasl-devel \ + openldap-devel diff --git a/.ci/linux.rhel.9/script.sh b/.ci/linux.rhel.9/script.sh new file mode 100755 index 000000000..0f9884c1d --- /dev/null +++ b/.ci/linux.rhel.9/script.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e + +export CMAKE_FLAGS="$CMAKE_FLAGS -DCPACK_DIST=rhel.9" + +$1/.ci/common/linux-build.sh $@ +$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 88ef08f33..e08e3cd71 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -10,7 +10,6 @@ build-linux: parallel: matrix: - DISTRO: - - centos.7.9 - debian.11 - debian.12 - fedora.40 @@ -18,6 +17,8 @@ build-linux: - opensuse.15.5 - opensuse.15.6 - opensuse.tumbleweed + - rhel.8 + - rhel.9 - ubuntu.20.04 - ubuntu.22.04 - ubuntu.24.04 From 7f697c40d29998499e80bc59c170213a69ed7cdf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 12:51:32 +0100 Subject: [PATCH 1717/1765] VncClientProtocol: add Qt < 5.14 compat code --- core/src/VncClientProtocol.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/VncClientProtocol.cpp b/core/src/VncClientProtocol.cpp index b49565c5a..0ba5e43a8 100644 --- a/core/src/VncClientProtocol.cpp +++ b/core/src/VncClientProtocol.cpp @@ -633,7 +633,11 @@ bool VncClientProtocol::handleRect( QBuffer& buffer, rfbFramebufferUpdateRectHea return true; default: - vCritical() << "Unsupported rect encoding" << Qt::hex << rectHeader.encoding; + vCritical() << "Unsupported rect encoding" << +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + Qt::hex << +#endif + rectHeader.encoding; m_socket->close(); break; } From 33cc6cc8feabcd991e3328e5dfb8ca899645d477 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 10:40:23 +0100 Subject: [PATCH 1718/1765] Core: add Toast Implementation based on https://github.com/niklashenning/qt-toast/ with various code cleanups, modernizations and simplifications. --- core/resources/core.qrc | 5 + core/resources/toast-close.png | Bin 0 -> 1897 bytes core/resources/toast-error.png | Bin 0 -> 1925 bytes core/resources/toast-information.png | Bin 0 -> 2917 bytes core/resources/toast-success.png | Bin 0 -> 1856 bytes core/resources/toast-warning.png | Bin 0 -> 4398 bytes core/src/Toast.cpp | 2014 ++++++++++++++++++++++++++ core/src/Toast.h | 319 ++++ 8 files changed, 2338 insertions(+) create mode 100644 core/resources/toast-close.png create mode 100644 core/resources/toast-error.png create mode 100644 core/resources/toast-information.png create mode 100644 core/resources/toast-success.png create mode 100644 core/resources/toast-warning.png create mode 100644 core/src/Toast.cpp create mode 100644 core/src/Toast.h diff --git a/core/resources/core.qrc b/core/resources/core.qrc index 756dcb02e..33fef9a85 100644 --- a/core/resources/core.qrc +++ b/core/resources/core.qrc @@ -27,5 +27,10 @@ media-playback-start.png media-playback-stop.png media-record.png + toast-close.png + toast-error.png + toast-information.png + toast-success.png + toast-warning.png
    diff --git a/core/resources/toast-close.png b/core/resources/toast-close.png new file mode 100644 index 0000000000000000000000000000000000000000..e0a167888d4cc11976ebc572464df709984389c7 GIT binary patch literal 1897 zcmeHH`BxH%7RE4BO3lg^(aO@PXEBbrA-+NjMN2UktiZHXqLPW+$PLuQG%8Jt33cvk-B~T+E!()amVR$C;*`K z;RjS&NX3E5fqfTTyd0Fx|HuDcK*g9=t5ki$JkXv16`<-?wQcGepzS*}wG0kfSX!TU za&~b=U%>cXy%vBc+zKN8dYg17Bs46Xd^aL8DmsQjjg5=Hmq1HOPRp%sXng;nr%&|H zfOv3dcvLbzH9a#sH!ojUTw4C_^sP7^0N5JpjI{TP_)^QH1av#?>=`%CH7zPFornd2SoeIpIm>%5}!zQ*;OHadFn&?V0ba{5Ib-dIC^ zTX-d;o>Vuy{{>HFb!_<}}$F=gb^Zi-REH1Xainya*nk<%l5?C8Nw&h}K z;xIl${KH5rit@RPzDNdW8QDIpuh)-{tt)-%TDmfQ(W|)~zMwyDhta41DI9FfAY&jR zZ!`GL66U`X!;q5c79R)Ik{b_kPlsT3lIB+U71VU1_){I*_I`M;=C>)J5o-PV_cz;; zQ@C_$Z5&2*t@D-0(8JAgVwI9lPI)yuf!lovb)ICMu$%^qxnINTrG?YrYg1oza{aX_ zymP=lR`B;?Wnd}VUJ>|(jrbmZi1ZTAXX%#GJq;_*KXzHs9WTIn=ryug#n8kZBo zef=nj#DV&gn*aiUS(A?lK}(gj5_F)l?o1i zTelya1bH-WP|(KHYBiMGn!@%R&R*k`w2^aJ_B`jzid0BZt2-;1ql3+U*(mIiV{E{A z_>#p|)ghbTIA&Nh=fJU@bq=uVIEH1%XA@>ElkvD?drra`9#?QPg>$pAP1}fMz6`{4 z?Y*C!=MKw4^VTo%g(j74sd(lej=c5b5+VjGLFo`q^gt0HSapahf(=@xDeP?4ngTkZ zh+p{GYVVA4lCP`C8U*c? z?Vr)Gjt{oVU|24R%nFYbgOY-w4t)+i1$6qp!=54I7q&X`tTu>nh-iT$tt9qz6!x%P z5lV0W6`z}wO&l)$MMelJE{{U=NlhLpgm#5TY<6K6IIO7n&JcNL=1Wbl*)7sY#w0iBET@elX3=RMW{F&!Q*Za0cqvOw%MxkwOkf)yK3=yRI8kOGMPVf zD!R`ruJVyWrnZ{#v<82cT6K?p#hBmM%bJ9MXE{<6(2dKY4zM7M)CB2><~seAZ^jaz(lmSWimp~&CBg>7&%8u zER;be79VHH8R4s3*C^g8vKaPeH|{7&gECTBi}w|;Fd0Yl2B6~vR5SC}4><1`@XMZ% zz^^#(Q6g@Dtw%72S3Iao0ueayikqwkVH=u=ePWY^D%mw^9`<<>I(7obMQ~FYyHFz{up#dbFJMPb62anXC8y1D?P+>i_@% literal 0 HcmV?d00001 diff --git a/core/resources/toast-error.png b/core/resources/toast-error.png new file mode 100644 index 0000000000000000000000000000000000000000..4c939933f43d886d6cec4eb200c8b4a90c456b63 GIT binary patch literal 1925 zcmV;02YUF4P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02@$DR7C&)00000 z00000000000000000000000000F+VUAOHXW2y{|TQve`9V1J*#-(C_VDF6Tl-$_J4 zRCwC8Tse0eHxOR%Sg}+jhD6C1H!St694sYAv02J_vBQ!soX1jRWP3}Q61n@cV~gS9 zT+9qGi_SEu!Cc=Q7$D0C>xZ)!mp3<;FMm4C+F0WJk5yH#&wst-CUEw;vRC?;3^qcE-r zYtt?d&nrS!JsO1wop*|=Wg24T{VSh8zPq`3_x>M04I0GH-M{cf!*B887tbE+H`fXNL$u9Sba)+J^lU>2o0{JzGSH%JPVR!>0FZjHpao`9MQ~ z9o?F)sd#)xbUGa0L!tvp{rguDaRtJ`p!YFuUsUggQ*3l$?9fXIuOs+ZLgJaECWus zRpBaQz^w|UjIHGzC?ZI>ifwssBrt?{uKVq6Ltpr>u2yGK{ z&}QdOk}4}0bPBbJ1!%KVyF^qa)guUmdqwRL(^p;FA3T7(m&)@3A+K-svIMHTCu;?C z;QeUbleNi2s8$%%zSl+Mnqz|vf$J6LHHjVq%1t&TuBnvQ?%l_vX*wH7CbYfhaI`Sl zKr*3e-~^R^Xl!7+_6k7;sAN-k4l9B7o~TV#;!3bF{cyN;IEkx=BA4Fo~MDZt7Q9K3Rd+wwiH5-p0erz?1yZ{xqag&ip(77M1 zen`+Q^xWyl2H5_2wz(c?9DPsjG=_{;ZxD4r<2Y>DOaTA?47QOA4S;q)8n}T!^EK{H zwJ=_W+mBC(&pbA}H*7Kxl*HxlsLx!3+8H>y4}Y1i=C~O)eQ>5?MUxANY%sK;==^$DgvB!22JPQ9 zzXxEyTCj`4n*$@>*FT2NMRUT-8t!0;OT;BWipRop5ng}D#C+l;?xs%6b^bjuigoFa z5|E!b8B$3^M0+BQsK(-`^=B?f4_$o7A{Sa#*ID!$qU0^gVKaVJ&+2mIC_GWo*)MAc!%J+$>7bseo{(mnhO00000 LNkvXXu0mjfn-+zj literal 0 HcmV?d00001 diff --git a/core/resources/toast-information.png b/core/resources/toast-information.png new file mode 100644 index 0000000000000000000000000000000000000000..054da26a5af2850822c65f207900f7bedf643c1e GIT binary patch literal 2917 zcmeH}`8N~{7srPzV{C)5HZ-0vLmtE^!Z5>Qdo#=!WGY)IyHF-uV+=9E6d`1v$gVK< zeNCar9?8}uvg9G6SAWO*-gEB#obS2kp7Xu;ryFO5HQ@(IfdBviznQ5K{)F9s5_syQ z?vWzwPrw$4H^BfZhM=qy!EqC9fd&AolX!nQbDn4(e^dKF06?JgPqK+3%*iJMyH=M8 z|C}`cAOC9?5UL;JJ=ytr5FTp{U}HbU!O6wV!^_7nAP5$Mh>A%_NFA>L4KT(gW|mesYl4j(@#?kf4o)tv?jD}rzJC6<1MUWsLc$~N zM^d7wF%M$n6B6mkDXC90GP9m#=M+9KeoF_2Ao~;gNUmN5{q| zr>18<&VO3?ytuTy@`d$v?fd4|_Rf!g_x67t93CAHom)C_3^Xw_LK8^S>(ADLA)1i( zn=_Oer#x~6M`>+yiXD$K3{i~!hhXGo1>wY5ow8BBpp*|}w^7TdP;_a)nIoMeE5yes zR|SoRi^;plGojd5JA>g%LvNSn5S>y~u({%mtnC-WByjm!NrpQ@QG(H--?qTI zp-ka6#{knb5A$68VN-x!G(ihSEhTOUahRYayR~S$S2s9-loo z)V>TW#3P&~-05uqp{XHUgDlb!7zy2V_^TLw7Id~!X&|gEt(UD7&u6hQz{UOo&#pBV}(8#G+1cQ%}0Pik7i&5G&lYdD0Kn` z(t*lpixarIbBp?G?ZiS%2Ltx)@lIvVO(icPY{eiuZuxY3y=0{fw7BKyLke)AG}`;z zAjWk>&-Sqow~)`RnEopJ*iF99nn2#rQi0V#xiypIk-1tVqovt(nHDWr!;CzaQX@)T z6l4aKhb=s_M4i^E@)~@J^^eZKTa|cqcg%zdg|>#>ab5b#I3uWQF-_J>sS2=2%=UQw zIN0*q8R^WDgS`nI8O09Ydqi$|r}D<#YUXg_T;{j=GY*PPIIGh*z}4Nd)wU+R+l`qf z7w&dW*S#FkW~McG45C^b^ye8ZyhWXjQ^uJ#Rh0CjS!Oj)sUu2T#2(U4iIs`iN!x!| z&g zx*YtABUTJ~+nE%5i1%`%wm5_Q}r{` zsr|snx+z)A{!BGoR^7PzR^GlGb>=@pvuiK(f!#)IGE{}6xF;_=qDBh6s~+DZfispQ zO}48~=vHL9!6S$X%*A8~U=}TT-s5zos2g;76=|7E9HVGc=%8`bh)hZV^u+Usr$Enn z5E8h)D4aF?R~0NBm5_7;as?dY$L;@+ofpHBJpoVWkKJ?V2K9Ij*~{Pcg$;A)u#^F^ zb_{C4AieDkT;d}3HjMhyN6IkAA11t^;qpZUWb|H7km7$R&WTZ2c9&~LsKIXKZv~J> zd&%@TXPL;hxa)B_Qw@gnl+YmIu!)MSlAJ99=WN?+$g5!04r^_k{$d=c{(eFm63qEG zhy=_IVM$+uY=T*LRDnT}?EXM!TsUAKudPM>zzAT!R&z=UL;Pr+S`{s(1iv9J^AV=Z z`!^uoWw-iZDzQ8!Oj6xb$9wA$wo<2-U+|G@(<+)+JGD+0TY6d- zQGaRS;M?Yb2i^AXZ>N;u(HS%P3uoI;9|g)vJ{Gtq>H47#zt=kd9lO)lx*=SsF8@p) znJOMgLxlwMU9VSH4_NLTSyQ=qsFBJWr7}C-P(%^ znx?HI>SXM0h0VBPVCKuR1wQ38SRg{LJ66rBM%P6>2oh%u&lLjrxSS6PM${1!PkxA+ zbkyX;!ZK;(dPdfOuA#MNu-a*LfXAp62Ix1FG9-KGI*RU#?5eVyw8{}AEn znv8z872P|VlW_1}j+~=z?eA#u6OcM+$`G9dC*kRcr0r)_5hK5?Zrfqu z`JIHgu7Tgx-KnFwSi0OXVIy%@@!3qCo)fWP9}0cZvMTiYYvJ8}TgntOb%n*>g#*0@ z$H%ZPz%BqtY*N);%!V!Z literal 0 HcmV?d00001 diff --git a/core/resources/toast-success.png b/core/resources/toast-success.png new file mode 100644 index 0000000000000000000000000000000000000000..f84f25ce265a220d95f38c2d33dc10d164f3995f GIT binary patch literal 1856 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 literal 0 HcmV?d00001 diff --git a/core/src/Toast.cpp b/core/src/Toast.cpp new file mode 100644 index 000000000..d8c127def --- /dev/null +++ b/core/src/Toast.cpp @@ -0,0 +1,2014 @@ +/* + * File based on https://github.com/niklashenning/qt-toast/blob/master/src/Toast.cpp + * + * MIT License + + * Copyright (c) 2024 Niklas Henning + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Toast.h" +#include "VeyonCore.h" + +// Static +int Toast::s_maximumOnScreen = 3; +int Toast::s_spacing = 10; +int Toast::s_offsetX = 20; +int Toast::s_offsetY = 45; +bool Toast::s_alwaysOnMainScreen = false; +QScreen* Toast::s_fixedScreen = nullptr; +Toast::Position Toast::s_position = Toast::Position::BottomRight; +std::deque Toast::s_currentlyShown = std::deque(); +std::deque Toast::s_queue = std::deque(); + +// Static constants +const int Toast::sc_updatePositionDuration = 200; +const int Toast::sc_durationBarUpdateInterval = 5; +const int Toast::sc_dropShadowSize = 5; +const QColor Toast::sc_successAccentColor = QColor("#3E9141"); +const QColor Toast::sc_warningAccentColor = QColor("#E8B849"); +const QColor Toast::sc_errorAccentColor = QColor("#BA2626"); +const QColor Toast::sc_informationAccentColor = QColor("#007FFF"); +const QColor Toast::sc_defaultAccentColor = QColor("#5C5C5C"); +const QColor Toast::sc_defaultBackgroundColor = QColor("#E7F4F9"); +const QColor Toast::sc_defaultTitleColor = QColor("#000000"); +const QColor Toast::sc_defaultTextColor = QColor("#5C5C5C"); +const QColor Toast::sc_defaultIconSeparatorColor = QColor("#D9D9D9"); +const QColor Toast::sc_defaultCloseButtonIconColor = QColor("#000000"); +const QColor Toast::sc_defaultBackgroundColorDark = QColor("#292929"); +const QColor Toast::sc_defaultTitleColorDark = QColor("#FFFFFF"); +const QColor Toast::sc_defaultTextColorDark = QColor("#D0D0D0"); +const QColor Toast::sc_defaultIconSeparatorColorDark = QColor("#585858"); +const QColor Toast::sc_defaultCloseButtonIconColorDark = QColor("#C9C9C9"); + + +Toast::Toast(QWidget* parent) + : QDialog(parent) +{ + // Init attributes + m_duration = 5000; + m_showDurationBar = true; + m_icon = getIconFromEnum(Icon::Information); + m_showIcon = false; + m_iconSize = QSize(18, 18); + m_showIconSeparator = true; + m_iconSeparatorWidth = 2; + m_closeButtonIcon = getIconFromEnum(Icon::Close); + m_showCloseButton = true; + m_closeButtonIconSize = QSize(10, 10); + m_closeButtonSize = QSize(24, 24); + m_closeButtonAlignment = ButtonAlignment::Top; + m_fadeInDuration = 250; + m_fadeOutDuration = 250; + m_resetDurationOnHover = true; + m_stayOnTop = true; + m_borderRadius = 0; + m_backgroundColor = sc_defaultBackgroundColor; + m_titleColor = sc_defaultTitleColor; + m_textColor = sc_defaultTextColor; + m_iconColor = sc_defaultAccentColor; + m_iconSeparatorColor = sc_defaultIconSeparatorColor; + m_closeButtonIconColor = sc_defaultCloseButtonIconColor; + m_durationBarColor = sc_defaultAccentColor; + m_titleFont = font(); + m_titleFont.setBold(true); + m_textFont = font(); + m_margins = QMargins(20, 18, 10, 18); + m_iconMargins = QMargins(0, 0, 15, 0); + m_iconSectionMargins = QMargins(0, 0, 15, 0); + m_textSectionMargins = QMargins(0, 0, 15, 0); + m_closeButtonMargins = QMargins(0, -8, 0, -8); + m_textSectionSpacing = 8; + + m_elapsedTime = 0; + m_fadingOut = false; + m_used = false; + m_parent = parent; + + // Window settings + setAttribute(Qt::WidgetAttribute::WA_TranslucentBackground); + setFocusPolicy(Qt::FocusPolicy::NoFocus); + + // Notification widget (QLabel because QWidget has weird behaviour with stylesheets) + m_notification = new QLabel(this); + + // Drop shadow (has to be drawn manually since only one graphics effect can be applied) + m_dropShadowLayer1 = new QWidget(this); + m_dropShadowLayer2 = new QWidget(this); + m_dropShadowLayer3 = new QWidget(this); + m_dropShadowLayer4 = new QWidget(this); + m_dropShadowLayer5 = new QWidget(this); + m_dropShadowLayer1->setObjectName(QStringLiteral("toast-drop-shadow-layer-1")); + m_dropShadowLayer2->setObjectName(QStringLiteral("toast-drop-shadow-layer-2")); + m_dropShadowLayer3->setObjectName(QStringLiteral("toast-drop-shadow-layer-3")); + m_dropShadowLayer4->setObjectName(QStringLiteral("toast-drop-shadow-layer-4")); + m_dropShadowLayer5->setObjectName(QStringLiteral("toast-drop-shadow-layer-5")); + + // Opacity effect for fading animations + m_opacityEffect = new QGraphicsOpacityEffect(); + m_opacityEffect->setOpacity(1); + setGraphicsEffect(m_opacityEffect); + + // Close button + m_closeButton = new QPushButton(m_notification); + m_closeButton->setCursor(Qt::CursorShape::PointingHandCursor); + m_closeButton->setObjectName(QStringLiteral("toast-close-button")); + connect(m_closeButton, &QPushButton::clicked, this, &Toast::hide); + + // Text and title labels + m_titleLabel = new QLabel(m_notification); + m_textLabel = new QLabel(m_notification); + + // Icon (QPushButton instead of QLabel to get better icon quality) + m_iconWidget = new QPushButton(m_notification); + m_iconWidget->setObjectName(QStringLiteral("toast-icon-widget")); + + // Icon separator + m_iconSeparator = new QWidget(m_notification); + m_iconSeparator->setFixedWidth(2); + + // Duration bar container (used to make border radius possible on 4 px high widget) + m_durationBarContainer = new QWidget(m_notification); + m_durationBarContainer->setFixedHeight(4); + m_durationBarContainer->setStyleSheet(QStringLiteral("background: transparent;")); + + // Duration bar + m_durationBar = new QWidget(m_durationBarContainer); + m_durationBar->setFixedHeight(20); + m_durationBar->move(0, -16); + + // Duration bar chunk + m_durationBarChunk = new QWidget(m_durationBarContainer); + m_durationBarChunk->setFixedHeight(20); + m_durationBarChunk->move(0, -16); + + // Set defaults + setIcon(m_icon); + setIconSize(m_iconSize); + setIconColor(m_iconColor); + setIconSeparatorWidth(m_iconSeparatorWidth); + setCloseButtonIcon(m_closeButtonIcon); + setCloseButtonIconSize(m_closeButtonIconSize); + setCloseButtonSize(m_closeButtonSize); + setCloseButtonAlignment(m_closeButtonAlignment); + setStayOnTop(m_stayOnTop); + setBackgroundColor(m_backgroundColor); + setTitleColor(m_titleColor); + setTextColor(m_textColor); + setBorderRadius(m_borderRadius); + setIconSeparatorColor(m_iconSeparatorColor); + setCloseButtonIconColor(m_closeButtonIconColor); + setDurationBarColor(m_durationBarColor); + setTitleFont(m_titleFont); + setTextFont(m_textFont); + + // Timer for hiding the notification after set duration + m_durationTimer = new QTimer(this); + m_durationTimer->setSingleShot(true); + connect(m_durationTimer, &QTimer::timeout, this, &Toast::fadeOut); + + // Timer for updating the duration bar + m_durationBarTimer = new QTimer(this); + connect(m_durationBarTimer, &QTimer::timeout, this, &Toast::updateDurationBar); + + // Apply stylesheet + setStyleSheet(QStringLiteral( + "#toast-drop-shadow-layer-1 { background: rgba(0, 0, 0, 3); border-radius: 8px; }" + "#toast-drop-shadow-layer-2 { background: rgba(0, 0, 0, 5); border-radius: 8px; }" + "#toast-drop-shadow-layer-3 { background: rgba(0, 0, 0, 6); border-radius: 8px; }" + "#toast-drop-shadow-layer-4 { background: rgba(0, 0, 0, 9); border-radius: 8px; }" + "#toast-drop-shadow-layer-5 { background: rgba(0, 0, 0, 10); border-radius: 8px; }" + "#toast-close-button { background: transparent; }" + "#toast-icon-widget { background: transparent; }" + )); +} + +Toast::~Toast() +{ +} + +int Toast::getMaximumOnScreen() +{ + return s_maximumOnScreen; +} + +int Toast::getSpacing() +{ + return s_spacing; +} + +QPoint Toast::getOffset() +{ + return QPoint(s_offsetX, s_offsetY); +} + +int Toast::getOffsetX() +{ + return s_offsetX; +} + +int Toast::getOffsetY() +{ + return s_offsetY; +} + +bool Toast::isAlwaysOnMainScreen() +{ + return s_alwaysOnMainScreen; +} + +QScreen* Toast::getFixedScreen() +{ + return s_fixedScreen; +} + +Toast::Position Toast::getPosition() +{ + return s_position; +} + +int Toast::getCount() +{ + return s_currentlyShown.size() + s_queue.size(); +} + +int Toast::getVisibleCount() +{ + return s_currentlyShown.size(); +} + +int Toast::getQueuedCount() +{ + return s_queue.size(); +} + +int Toast::getDuration() +{ + return m_duration; +} + +bool Toast::isShowDurationBar() +{ + return m_showDurationBar; +} + +QString Toast::getTitle() +{ + return m_title; +} + +QString Toast::getText() +{ + return m_text; +} + +QPixmap Toast::getIcon() +{ + return m_icon; +} + +bool Toast::isShowIcon() +{ + return m_showIcon; +} + +QSize Toast::getIconSize() +{ + return m_iconSize; +} + +bool Toast::isShowIconSeparator() +{ + return m_showIconSeparator; +} + +int Toast::getIconSeparatorWidth() +{ + return m_iconSeparatorWidth; +} + +QPixmap Toast::getCloseButtonIcon() +{ + return m_closeButtonIcon; +} + +bool Toast::isShowCloseButton() +{ + return m_showCloseButton; +} + +QSize Toast::getCloseButtonIconSize() +{ + return m_closeButtonIconSize; +} + +int Toast::getCloseButtonWidth() +{ + return m_closeButtonSize.width(); +} + +int Toast::getCloseButtonHeight() +{ + return m_closeButtonSize.height(); +} + +QSize Toast::getCloseButtonSize() +{ + return m_closeButtonSize; +} + +Toast::ButtonAlignment Toast::getCloseButtonAlignment() +{ + return m_closeButtonAlignment; +} + +int Toast::getFadeInDuration() +{ + return m_fadeInDuration; +} + +int Toast::getFadeOutDuration() +{ + return m_fadeOutDuration; +} + +bool Toast::isResetDurationOnHover() +{ + return m_resetDurationOnHover; +} + +bool Toast::isStayOnTop() +{ + return m_stayOnTop; +} + +int Toast::getBorderRadius() +{ + return m_borderRadius; +} + +QColor Toast::getBackgroundColor() +{ + return m_backgroundColor; +} + +QColor Toast::getTitleColor() +{ + return m_titleColor; +} + +QColor Toast::getTextColor() +{ + return m_textColor; +} + +QColor Toast::getIconColor() +{ + return m_iconColor; +} + +QColor Toast::getIconSeparatorColor() +{ + return m_iconSeparatorColor; +} + +QColor Toast::getCloseButtonIconColor() +{ + return m_closeButtonIconColor; +} + +QColor Toast::getDurationBarColor() +{ + return m_durationBarColor; +} + +QFont Toast::getTitleFont() +{ + return m_titleFont; +} + +QFont Toast::getTextFont() +{ + return m_textFont; +} + +QMargins Toast::getMargins() +{ + return m_margins; +} + +QMargins Toast::getIconMargins() +{ + return m_iconMargins; +} + +QMargins Toast::getIconSectionMargins() +{ + return m_iconSectionMargins; +} + +QMargins Toast::getTextSectionMargins() +{ + return m_textSectionMargins; +} + +QMargins Toast::getCloseButtonMargins() +{ + return m_closeButtonMargins; +} + +int Toast::getTextSectionSpacing() +{ + return m_textSectionSpacing; +} + +void Toast::setMaximumOnScreen(int maximum) +{ + int freedSpaces = maximum - s_maximumOnScreen; + s_maximumOnScreen = maximum; + + if (freedSpaces > 0) + { + for (int i = 0; i < freedSpaces; i++) + { + showNextInQueue(); + } + } +} + +void Toast::setSpacing(int spacing) +{ + s_spacing = spacing; + updateCurrentlyShowingPositionY(); +} + +void Toast::setOffset(int x, int y) +{ + s_offsetX = x; + s_offsetY = y; + updateCurrentlyShowingPositionXY(); +} + +void Toast::setOffsetX(int offsetX) +{ + s_offsetX = offsetX; + updateCurrentlyShowingPositionX(); +} + +void Toast::setOffsetY(int offsetY) +{ + s_offsetY = offsetY; + updateCurrentlyShowingPositionY(); +} + +void Toast::setAlwaysOnMainScreen(bool enabled) +{ + s_alwaysOnMainScreen = enabled; + updateCurrentlyShowingPositionXY(); +} + +void Toast::setFixedScreen(QScreen* screen) +{ + s_fixedScreen = screen; + updateCurrentlyShowingPositionXY(); +} + +void Toast::setPosition(Position position) +{ + s_position = position; + updateCurrentlyShowingPositionXY(); +} + +void Toast::reset() +{ + // Reset static attributes + s_maximumOnScreen = 3; + s_spacing = 10; + s_offsetX = 20; + s_offsetY = 45; + s_alwaysOnMainScreen = false; + s_fixedScreen = nullptr; + s_position = Position::BottomRight; + + // Hide currently showing toasts and clear queue + for (Toast* toast : s_currentlyShown) + { + toast->setVisible(false); + toast->deleteLater(); + } + + s_currentlyShown.clear(); + s_queue.clear(); +} + +void Toast::setDuration(int duration) +{ + if (m_used) + { + return; + } + m_duration = duration; +} + +void Toast::setShowDurationBar(bool enabled) +{ + if (m_used) + { + return; + } + m_showDurationBar = enabled; +} + +void Toast::setTitle(QString title) +{ + if (m_used) + { + return; + } + m_title = title; + m_titleLabel->setText(title); +} + +void Toast::setText(QString text) +{ + if (m_used) + { + return; + } + m_text = text; + m_textLabel->setText(text); +} + +void Toast::setIcon(QPixmap icon) +{ + if (m_used) + { + return; + } + m_icon = icon; + m_iconWidget->setIcon(QIcon(icon)); + setIconColor(m_iconColor); +} + +void Toast::setIcon(Icon icon) +{ + if (m_used) + { + return; + } + m_icon = getIconFromEnum(icon); + m_iconWidget->setIcon(QIcon(m_icon)); + setIconColor(m_iconColor); +} + +void Toast::setShowIcon(bool enabled) +{ + if (m_used) + { + return; + } + m_showIcon = enabled; +} + +void Toast::setIconSize(QSize size) +{ + if (m_used) + { + return; + } + m_iconSize = size; + m_iconWidget->setFixedSize(size); + m_iconWidget->setIconSize(size); + setIcon(m_icon); +} + +void Toast::setShowIconSeparator(bool enabled) +{ + if (m_used) + { + return; + } + m_showIconSeparator = enabled; + + if (enabled) + { + m_iconSeparator->setFixedWidth(m_iconSeparatorWidth); + } + else { + m_iconSeparator->setFixedWidth(0); + } +} + +void Toast::setIconSeparatorWidth(int width) +{ + if (m_used) + { + return; + } + m_iconSeparatorWidth = width; + + if (m_showIconSeparator) + { + m_iconSeparator->setFixedWidth(width); + } +} + +void Toast::setCloseButtonIcon(QPixmap icon) +{ + if (m_used) + { + return; + } + m_closeButtonIcon = icon; + m_closeButton->setIcon(QIcon(icon)); + setCloseButtonIconColor(m_closeButtonIconColor); +} + +void Toast::setCloseButtonIcon(Icon icon) +{ + if (m_used) + { + return; + } + m_closeButtonIcon = getIconFromEnum(icon); + m_closeButton->setIcon(QIcon(m_closeButtonIcon)); + setCloseButtonIconColor(m_closeButtonIconColor); +} + +void Toast::setShowCloseButton(bool enabled) +{ + if (m_used) + { + return; + } + m_showCloseButton = enabled; +} + +void Toast::setCloseButtonIconSize(QSize size) +{ + if (m_used) + { + return; + } + m_closeButtonIconSize = size; + m_closeButton->setIconSize(size); + setCloseButtonIcon(m_closeButtonIcon); +} + +void Toast::setCloseButtonSize(QSize size) +{ + if (m_used) + { + return; + } + m_closeButtonSize = size; + m_closeButton->setFixedSize(size); +} + +void Toast::setCloseButtonWidth(int width) +{ + if (m_used) + { + return; + } + m_closeButtonSize.setWidth(width); + m_closeButton->setFixedSize(m_closeButtonSize); +} + +void Toast::setCloseButtonHeight(int height) +{ + if (m_used) + { + return; + } + m_closeButtonSize.setHeight(height); + m_closeButton->setFixedSize(m_closeButtonSize); +} + +void Toast::setCloseButtonAlignment(ButtonAlignment alignment) +{ + if (m_used) + { + return; + } + m_closeButtonAlignment = alignment; +} + +void Toast::setFadeInDuration(int duration) +{ + if (m_used) + { + return; + } + m_fadeInDuration = duration; +} + +void Toast::setFadeOutDuration(int duration) +{ + if (m_used) + { + return; + } + m_fadeOutDuration = duration; +} + +void Toast::setResetDurationOnHover(bool enabled) +{ + if (m_used) + { + return; + } + m_resetDurationOnHover = enabled; +} + +void Toast::setStayOnTop(bool enabled) +{ + if (m_used) + { + return; + } + m_stayOnTop = enabled; + + if (enabled) + { + setWindowFlags(Qt::WindowType::Tool + | Qt::WindowType::CustomizeWindowHint + | Qt::WindowType::FramelessWindowHint + | Qt::WindowType::WindowStaysOnTopHint); + } + else + { + setWindowFlags(Qt::WindowType::Tool + | Qt::WindowType::CustomizeWindowHint + | Qt::WindowType::FramelessWindowHint); + } +} + +void Toast::setBorderRadius(int borderRadius) +{ + if (m_used) + { + return; + } + m_borderRadius = borderRadius; +} + +void Toast::setBackgroundColor(QColor color) +{ + if (m_used) + { + return; + } + m_backgroundColor = color; +} + +void Toast::setTitleColor(QColor color) +{ + if (m_used) + { + return; + } + m_titleColor = color; +} + +void Toast::setTextColor(QColor color) +{ + if (m_used) + { + return; + } + m_textColor = color; +} + +void Toast::setIconColor(QColor color) +{ + if (m_used) + { + return; + } + m_iconColor = color; + + QImage recoloredImage = recolorImage(m_iconWidget->icon() + .pixmap(m_iconWidget->iconSize()).toImage(), color); + m_iconWidget->setIcon(QIcon(QPixmap::fromImage(recoloredImage))); +} + +void Toast::setIconSeparatorColor(QColor color) +{ + if (m_used) + { + return; + } + m_iconSeparatorColor = color; +} + +void Toast::setCloseButtonIconColor(QColor color) +{ + if (m_used) + { + return; + } + m_closeButtonIconColor = color; + + QImage recoloredImage = recolorImage(m_closeButton->icon() + .pixmap(m_closeButton->iconSize()).toImage(), color); + m_closeButton->setIcon(QIcon(QPixmap::fromImage(recoloredImage))); +} + +void Toast::setDurationBarColor(QColor color) +{ + if (m_used) + { + return; + } + m_durationBarColor = color; +} + +void Toast::setTitleFont(QFont font) +{ + if (m_used) + { + return; + } + m_titleFont = font; + m_titleLabel->setFont(font); +} + +void Toast::setTextFont(QFont font) +{ + if (m_used) + { + return; + } + m_textFont = font; + m_textLabel->setFont(font); +} + +void Toast::setMargins(QMargins margins) +{ + if (m_used) + { + return; + } + m_margins = margins; +} + +void Toast::setMarginLeft(int margin) +{ + if (m_used) + { + return; + } + m_margins.setLeft(margin); +} + +void Toast::setMarginTop(int margin) +{ + if (m_used) + { + return; + } + m_margins.setTop(margin); +} + +void Toast::setMarginRight(int margin) +{ + if (m_used) + { + return; + } + m_margins.setRight(margin); +} + + +void Toast::setMarginBottom(int margin) +{ + if (m_used) + { + return; + } + m_margins.setBottom(margin); +} + + +void Toast::setIconMargins(QMargins margins) +{ + if (m_used) + { + return; + } + m_iconMargins = margins; +} + + +void Toast::setIconMarginLeft(int margin) +{ + if (m_used) + { + return; + } + m_iconMargins.setLeft(margin); +} + + +void Toast::setIconMarginTop(int margin) +{ + if (m_used) + { + return; + } + m_iconMargins.setTop(margin); +} + + +void Toast::setIconMarginRight(int margin) +{ + if (m_used) + { + return; + } + m_iconMargins.setRight(margin); +} + + +void Toast::setIconMarginBottom(int margin) +{ + if (m_used) + { + return; + } + m_iconMargins.setBottom(margin); +} + + +void Toast::setIconSectionMargins(QMargins margins) +{ + if (m_used) + { + return; + } + m_iconSectionMargins = margins; +} + + +void Toast::setIconSectionMarginLeft(int margin) +{ + if (m_used) + { + return; + } + m_iconSectionMargins.setLeft(margin); +} + + +void Toast::setIconSectionMarginTop(int margin) +{ + if (m_used) + { + return; + } + m_iconSectionMargins.setTop(margin); +} + + +void Toast::setIconSectionMarginRight(int margin) +{ + if (m_used) + { + return; + } + m_iconSectionMargins.setRight(margin); +} + + +void Toast::setIconSectionMarginBottom(int margin) +{ + if (m_used) + { + return; + } + m_iconSectionMargins.setBottom(margin); +} + + +void Toast::setTextSectionMargins(QMargins margins) +{ + if (m_used) + { + return; + } + m_textSectionMargins = margins; +} + + +void Toast::setTextSectionMarginLeft(int margin) +{ + if (m_used) + { + return; + } + m_textSectionMargins.setLeft(margin); +} + + +void Toast::setTextSectionMarginTop(int margin) +{ + if (m_used) + { + return; + } + m_textSectionMargins.setTop(margin); +} + + +void Toast::setTextSectionMarginRight(int margin) +{ + if (m_used) + { + return; + } + m_textSectionMargins.setRight(margin); +} + + +void Toast::setTextSectionMarginBottom(int margin) +{ + if (m_used) + { + return; + } + m_textSectionMargins.setBottom(margin); +} + + +void Toast::setCloseButtonMargins(QMargins margins) +{ + if (m_used) + { + return; + } + m_closeButtonMargins = margins; +} + + +void Toast::setCloseButtonMarginLeft(int margin) +{ + if (m_used) + { + return; + } + m_closeButtonMargins.setLeft(margin); +} + + +void Toast::setCloseButtonMarginTop(int margin) +{ + if (m_used) + { + return; + } + m_closeButtonMargins.setTop(margin); +} + + +void Toast::setCloseButtonMarginRight(int margin) +{ + if (m_used) + { + return; + } + m_closeButtonMargins.setRight(margin); +} + + +void Toast::setCloseButtonMarginBottom(int margin) +{ + if (m_used) + { + return; + } + m_closeButtonMargins.setBottom(margin); +} + + +void Toast::setTextSectionSpacing(int spacing) +{ + if (m_used) + { + return; + } + m_textSectionSpacing = spacing; +} + + +void Toast::setFixedSize(QSize size) +{ + setMinimumSize(size); + setMaximumSize(size); +} + + +void Toast::setFixedSize(int width, int height) +{ + setMinimumSize(width, height); + setMaximumSize(width, height); +} + + +void Toast::setFixedWidth(int width) +{ + setMinimumWidth(width); + setMaximumWidth(width); +} + +void Toast::setFixedHeight(int height) +{ + setMinimumHeight(height); + setMaximumHeight(height); +} + +void Toast::applyPreset(Preset preset) +{ + if (m_used) + { + return; + } + + if (preset == Preset::Success) + { + setIcon(Icon::Success); + setIconColor(sc_successAccentColor); + setDurationBarColor(sc_successAccentColor); + } + else if (preset == Preset::Warning) + { + setIcon(Icon::Warning); + setIconColor(sc_warningAccentColor); + setDurationBarColor(sc_warningAccentColor); + } + else if (preset == Preset::Error) + { + setIcon(Icon::Error); + setIconColor(sc_errorAccentColor); + setDurationBarColor(sc_errorAccentColor); + } + else if (preset == Preset::Information) + { + setIcon(Icon::Information); + setIconColor(sc_informationAccentColor); + setDurationBarColor(sc_informationAccentColor); + } + + if ( + #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) + QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark || + #endif + VeyonCore::useDarkMode()) + { + setBackgroundColor(sc_defaultBackgroundColorDark); + setCloseButtonIconColor(sc_defaultCloseButtonIconColorDark); + setIconSeparatorColor(sc_defaultIconSeparatorColorDark); + setTitleColor(sc_defaultTitleColorDark); + setTextColor(sc_defaultTextColorDark); + } + else + { + setBackgroundColor(sc_defaultBackgroundColor); + setCloseButtonIconColor(sc_defaultCloseButtonIconColor); + setIconSeparatorColor(sc_defaultIconSeparatorColor); + setTitleColor(sc_defaultTitleColor); + setTextColor(sc_defaultTextColor); + } + + setShowDurationBar(true); + setShowIcon(true); + setShowIconSeparator(true); + setIconSeparatorWidth(2); +} + + +void Toast::show() +{ + // Check if already used + if (m_used) + { + return; + } + + // If max notifications on screen not reached, show notification + if (s_maximumOnScreen > int(s_currentlyShown.size())) + { + m_used = true; + s_currentlyShown.push_back(this); + + // Setup UI + setupUI(); + + // Start duration timer + if (m_duration != 0) + { + m_durationTimer->start(m_duration); + } + + // Start duration bar update timer + if (m_duration != 0 && m_showDurationBar) + { + m_durationBarTimer->start(sc_durationBarUpdateInterval); + } + + // Calculate position and show + QPoint position = calculatePosition(); + + // If not first toast on screen, also do a fade down / up animation + if (s_currentlyShown.size() > 1) + { + // Calculate offset if predecessor toast is still in fade down / up animation + Toast* predecessorToast = getPredecessorToast(); + QPoint predecessorTarget = predecessorToast->calculatePosition(); + int predecessorTargetDifferenceY = abs(predecessorToast->y() - predecessorTarget.y()); + + // Calculate start position of fade down / up animation based on position + if (s_position == Position::BottomRight + || s_position == Position::BottomLeft + || s_position == Position::BottomMiddle) + { + move(position.x(), + position.y() - (int)(height() / 1.5) - predecessorTargetDifferenceY); + } + else if (s_position == Position::TopRight + || s_position == Position::TopLeft + || s_position == Position::TopMiddle + || s_position == Position::Center) + { + move(position.x(), + position.y() + (int)(height() / 1.5) + predecessorTargetDifferenceY); + } + + // Start fade down / up animation + QPropertyAnimation* posAnimation = new QPropertyAnimation(this, "pos"); + posAnimation->setEndValue(QPoint(position.x(), position.y())); + posAnimation->setDuration(m_fadeInDuration); + posAnimation->start(QAbstractAnimation::DeleteWhenStopped); + } + else + { + move(position.x(), position.y()); + } + + // Fade in + QDialog::show(); + QPropertyAnimation* fadeInAnimation = new QPropertyAnimation(m_opacityEffect, "opacity"); + fadeInAnimation->setDuration(m_fadeInDuration); + fadeInAnimation->setStartValue(0); + fadeInAnimation->setEndValue(1); + fadeInAnimation->start(QAbstractAnimation::DeleteWhenStopped); + + // Make sure title bar of parent is not grayed out + if (m_parent) + { + m_parent->activateWindow(); + } + + // Update every other currently shown notification + for (Toast* toast : s_currentlyShown) + { + toast->updatePositionXY(); + } + } + else + { + // Add notification to queue instead + s_queue.push_back(this); + } +} + +void Toast::hide() +{ + if (!m_fadingOut) + { + if (m_duration != 0) + { + m_durationTimer->stop(); + } + fadeOut(); + } +} + +void Toast::hide_() +{ + close(); + + int index = 0; + for (Toast* toast : s_currentlyShown) + { + if (toast == this) + { + s_currentlyShown.erase(s_currentlyShown.begin() + index); + m_elapsedTime = 0; + m_fadingOut = false; + + // Emit signal + Q_EMIT closed(); + + // Update every other currently shown notification + for (Toast* toast : s_currentlyShown) + { + toast->updatePositionY(); + } + + // Show next item from queue after updating + QTimer::singleShot(m_fadeInDuration, this, &Toast::deleteAndShowNextInQueue); + + break; + }; + index++; + } +} + +void Toast::enterEvent(EnterEvent* event) +{ + Q_UNUSED(event) + + // Reset timer if hovered and resetting is enabled + if (m_duration != 0 && m_durationTimer->isActive() && m_resetDurationOnHover) + { + m_durationTimer->stop(); + + // Reset duration bar if enabled + if (m_showDurationBar) + { + m_durationBarTimer->stop(); + m_durationBarChunk->setFixedWidth(m_notification->width()); + m_elapsedTime = 0; + } + } +} + +void Toast::leaveEvent(QEvent* event) +{ + Q_UNUSED(event) + + // Start timer again when leaving notification and reset is enabled + if (m_duration != 0 && !m_durationTimer->isActive() && m_resetDurationOnHover) + { + m_durationTimer->start(m_duration); + + // Restart duration bar animation if enabled + if (m_showDurationBar) + { + m_durationBarTimer->start(sc_durationBarUpdateInterval); + } + } +} + +void Toast::fadeOut() +{ + m_fadingOut = true; + QPropertyAnimation* fadeOutAnimation = new QPropertyAnimation(m_opacityEffect, "opacity"); + fadeOutAnimation->setDuration(m_fadeOutDuration); + fadeOutAnimation->setStartValue(1); + fadeOutAnimation->setEndValue(0); + connect(fadeOutAnimation, &QPropertyAnimation::finished, this, &Toast::hide_); + fadeOutAnimation->start(QAbstractAnimation::DeleteWhenStopped); +} + +void Toast::updateDurationBar() +{ + m_elapsedTime += sc_durationBarUpdateInterval; + + if (m_elapsedTime >= m_duration) + { + m_durationBarTimer->stop(); + return; + } + double newChunkWidth = floor(m_durationBarContainer->width() + - (double)m_elapsedTime / (double)m_duration * m_durationBarContainer->width()); + m_durationBarChunk->setFixedWidth(newChunkWidth); +} + +void Toast::showNextInQueue() +{ + if (s_queue.size() > 0) + { + Toast* nextToast = s_queue.front(); + s_queue.pop_front(); + nextToast->show(); + } +} + +void Toast::setupUI() +{ + // Update stylesheet + updateStylesheet(); + + // Calculate title and text width and height + QFontMetrics* titleFontMetrics = new QFontMetrics(m_titleFont); + int titleWidth = titleFontMetrics->boundingRect(m_title).width() + 1; + int titleHeight = titleFontMetrics->boundingRect(m_title).height(); + delete titleFontMetrics; + + QFontMetrics* textFontMetrics = new QFontMetrics(m_textFont); + int textWidth = textFontMetrics->boundingRect(m_text).width() + 1; + int textHeight = textFontMetrics->boundingRect(m_text).height(); + delete textFontMetrics; + + int textSectionSpacing = m_title.isEmpty() || m_text.isEmpty() ? 0 : m_textSectionSpacing; + + int textSectionHeight = m_textSectionMargins.top() + titleHeight + + textSectionSpacing + textHeight + m_textSectionMargins.bottom(); + + // Calculate duration bar height + int durationBarHeight = m_showDurationBar ? m_durationBarContainer->height() : 0; + + // Calculate icon section width and height + int iconSectionWidth = 0; + int iconSectionHeight = 0; + + if (m_showIcon) + { + iconSectionWidth = m_iconSectionMargins.left() + m_iconMargins.left() + + m_iconWidget->width() + m_iconMargins.right() + + m_iconSeparator->width() + m_iconSectionMargins.right(); + iconSectionHeight = m_iconSectionMargins.top() + m_iconMargins.top() + + m_iconWidget->height() + m_iconMargins.bottom() + m_iconSectionMargins.bottom(); + } + + // Calculate close button section size + int closeButtonWidth = m_showCloseButton ? m_closeButton->width() : 0; + int closeButtonHeight = m_showCloseButton ? m_closeButton->height() : 0; + QMargins closeButtonMargins = m_showCloseButton ? m_closeButtonMargins : QMargins(0, 0, 0, 0); + + int closeButtonSectionHeight = m_closeButtonMargins.top() + + closeButtonHeight + m_closeButtonMargins.bottom(); + + // Calculate needed width and height + int width = m_margins.left() + iconSectionWidth + m_textSectionMargins.left() + + std::max(titleWidth, textWidth) + m_textSectionMargins.right() + + closeButtonMargins.left() + closeButtonWidth + + closeButtonMargins.right() + m_margins.right(); + + int height = m_margins.top() + std::max({iconSectionHeight, textSectionHeight, + closeButtonSectionHeight}) + m_margins.bottom() + durationBarHeight; + + int forcedAdditionalHeight = 0; + int forcedReducedHeight = 0; + + // Handle width greater than maximum width + if (width > maximumWidth()) + { + // Enable line break for title and text and recalculate size + int newTitleWidth = std::max(titleWidth, textWidth) - (width - maximumWidth()); + if (newTitleWidth > 0) + { + titleWidth = newTitleWidth; + } + + int newTextWidth = std::max(titleWidth, textWidth) - (width - maximumWidth()); + if (newTextWidth > 0) + { + textWidth = newTextWidth; + } + + m_titleLabel->setMinimumWidth(titleWidth); + m_titleLabel->setWordWrap(true); + if (m_title.isEmpty() == false) + { + titleHeight = m_titleLabel->sizeHint().height(); + } + m_titleLabel->setFixedSize(titleWidth, titleHeight); + + m_textLabel->setMinimumWidth(textWidth); + m_textLabel->setWordWrap(true); + if (m_text.isEmpty() == false) + { + textHeight = m_textLabel->sizeHint().height(); + } + m_textLabel->setFixedSize(textWidth, textHeight); + + // Recalculate width and height + width = maximumWidth(); + + textSectionHeight = m_textSectionMargins.top() + titleHeight + + textSectionSpacing + textHeight + m_textSectionMargins.bottom(); + + height = m_margins.top() + std::max({iconSectionHeight, textSectionHeight, + closeButtonSectionHeight}) + m_margins.bottom() + durationBarHeight; + } + + // Handle height less than minimum height + if (height < minimumHeight()) + { + // Enable word wrap for title and text labels + m_titleLabel->setWordWrap(true); + m_textLabel->setWordWrap(true); + + // Calculate height with initial label width + titleWidth = m_titleLabel->fontMetrics().boundingRect(QRect(0, 0, 0, 0), + Qt::TextFlag::TextWordWrap, m_titleLabel->text()).width(); + + textWidth = m_textLabel->fontMetrics().boundingRect(QRect(0, 0, 0, 0), + Qt::TextFlag::TextWordWrap, m_textLabel->text()).width(); + + int tempWidth = std::max(titleWidth, textWidth); + + titleWidth = m_titleLabel->fontMetrics().boundingRect(QRect(0, 0, tempWidth, 0), + Qt::TextFlag::TextWordWrap, m_titleLabel->text()).width(); + if (m_title.isEmpty() == false) + { + titleHeight = m_titleLabel->fontMetrics().boundingRect(QRect(0, 0, tempWidth, 0), + Qt::TextFlag::TextWordWrap, m_titleLabel->text()).height(); + } + + textWidth = m_textLabel->fontMetrics().boundingRect(QRect(0, 0, tempWidth, 0), + Qt::TextFlag::TextWordWrap, m_textLabel->text()).width(); + if (m_text.isEmpty() == false) + { + textHeight = m_textLabel->fontMetrics().boundingRect(QRect(0, 0, tempWidth, 0), + Qt::TextFlag::TextWordWrap, m_textLabel->text()).height(); + } + + textSectionHeight = m_textSectionMargins.top() + titleHeight + + textSectionSpacing + textHeight + m_textSectionMargins.bottom(); + + height = m_margins.top() + std::max({ iconSectionHeight, textSectionHeight, + closeButtonSectionHeight }) + m_margins.bottom() + durationBarHeight; + + while (tempWidth <= width) + { + // Recalculate height with different text widths to find optimal value + int tempTitleWidth = m_titleLabel->fontMetrics().boundingRect(QRect(0, 0, tempWidth, 0), + Qt::TextFlag::TextWordWrap, m_titleLabel->text()).width(); + + int tempTitleHeight = m_titleLabel->fontMetrics().boundingRect(QRect(0, 0, tempWidth, 0), + Qt::TextFlag::TextWordWrap, m_titleLabel->text()).height(); + + int tempTextWidth = m_textLabel->fontMetrics().boundingRect(QRect(0, 0, tempWidth, 0), + Qt::TextFlag::TextWordWrap, m_textLabel->text()).width(); + + int tempTextHeight = m_textLabel->fontMetrics().boundingRect(QRect(0, 0, tempWidth, 0), + Qt::TextFlag::TextWordWrap, m_textLabel->text()).height(); + + if (m_title.isEmpty()) + { + tempTitleHeight = 0; + } + + if (m_text.isEmpty()) + { + tempTextHeight = 0; + } + + int tempTextSectionHeight = m_textSectionMargins.top() + tempTitleHeight + + textSectionSpacing + tempTextHeight + m_textSectionMargins.bottom(); + + int tempHeight = m_margins.top() + std::max({ iconSectionHeight, tempTextSectionHeight, + closeButtonSectionHeight }) + m_margins.bottom() + durationBarHeight; + + // Store values if calculated height is greater than or equal to min height + if (tempHeight >= minimumHeight()) + { + titleWidth = tempTitleWidth; + titleHeight = tempTitleHeight; + textWidth = tempTextWidth; + textHeight = tempTextHeight; + textSectionHeight = tempTextSectionHeight; + height = tempHeight; + tempWidth += 1; + } + else + { + // Exit loop if calculated height is less than min height + break; + } + } + + // Recalculate width + width = m_margins.left() + iconSectionWidth + m_textSectionMargins.left() + + std::max(titleWidth, textWidth) + m_textSectionMargins.right() + + closeButtonMargins.left() + closeButtonWidth + + closeButtonMargins.right() + m_margins.right(); + + // If min height not met, set height to min height + if (height < minimumHeight()) + { + forcedAdditionalHeight = minimumHeight() - height; + height = minimumHeight(); + } + } + + // Handle width less than minimum width + if (width < minimumWidth()) + { + width = minimumWidth(); + } + + // Handle height greater than maximum height + if (height > maximumHeight()) + { + forcedReducedHeight = height - maximumHeight(); + height = maximumHeight(); + } + + // Calculate width and height including space for drop shadow + int totalWidth = width + sc_dropShadowSize * 2; + int totalHeight = height + sc_dropShadowSize * 2; + + // Resize drop shadow + m_dropShadowLayer1->resize(totalWidth, totalHeight); + m_dropShadowLayer1->move(0, 0); + m_dropShadowLayer2->resize(totalWidth - 2, totalHeight - 2); + m_dropShadowLayer2->move(1, 1); + m_dropShadowLayer3->resize(totalWidth - 4, totalHeight - 4); + m_dropShadowLayer3->move(2, 2); + m_dropShadowLayer4->resize(totalWidth - 6, totalHeight - 6); + m_dropShadowLayer4->move(3, 3); + m_dropShadowLayer5->resize(totalWidth - 8, totalHeight - 8); + m_dropShadowLayer5->move(4, 4); + + // Resize window + QDialog::setFixedSize(totalWidth, totalHeight); + m_notification->setFixedSize(width, height); + m_notification->move(sc_dropShadowSize, sc_dropShadowSize); + m_notification->raise(); + + // Calculate difference between height and height of icon section + int heightIconSectionHeightDifference = std::max({ iconSectionHeight, + textSectionHeight, closeButtonSectionHeight }) - iconSectionHeight; + + if (m_showIcon) + { + // Move icon + m_iconWidget->move(m_margins.left() + m_iconSectionMargins.left()+ m_iconMargins.left(), + m_margins.top() + m_iconSectionMargins.top() + m_iconMargins.top() + + ceil(heightIconSectionHeightDifference / 2) - floor(forcedReducedHeight / 2)); + + // Move and resize icon separator + m_iconSeparator->setFixedHeight(textSectionHeight); + m_iconSeparator->move(m_margins.left() + m_iconSectionMargins.left() + m_iconMargins.left() + + m_iconWidget->width() + m_iconMargins.right(), m_margins.top() + m_iconSectionMargins.top() + + ceil(forcedAdditionalHeight / 2) - floor(forcedReducedHeight / 2)); + } + else + { + // Hide icon section + m_iconWidget->setVisible(false); + m_iconSeparator->setVisible(false); + } + + // Calculate difference between height and height of text section + int heightTextSectionHeightDifference = std::max({iconSectionHeight, + textSectionHeight, closeButtonSectionHeight}) - textSectionHeight; + + // Resize title and text labels + m_titleLabel->setFixedSize(std::max(titleWidth, textWidth), titleHeight); + m_textLabel->setFixedSize(std::max(titleWidth, textWidth), textHeight); + + // Move title and text labels + if (m_showIcon) + { + m_titleLabel->move(m_margins.left() + m_iconSectionMargins.left() + + m_iconMargins.left() + m_iconWidget->width() + m_iconMargins.right() + + m_iconSeparator->width() + m_iconSectionMargins.right() + m_textSectionMargins.left(), + m_margins.top() + m_textSectionMargins.top() + ceil(heightTextSectionHeightDifference / 2) + + ceil(forcedAdditionalHeight / 2) - floor(forcedReducedHeight / 2)); + + m_textLabel->move(m_margins.left() + m_iconSectionMargins.left() + + m_iconMargins.left() + m_iconWidget->width() + m_iconMargins.right() + + m_iconSeparator->width() + m_iconSectionMargins.right() + m_textSectionMargins.left(), + m_margins.top() + m_textSectionMargins.top() + titleHeight + + textSectionSpacing + ceil(heightTextSectionHeightDifference / 2) + + ceil(forcedAdditionalHeight / 2) - floor(forcedReducedHeight / 2)); + } + else { + // Position is different if icon hidden + m_titleLabel->move(m_margins.left() + m_textSectionMargins.left(), + m_margins.top() + m_textSectionMargins.top() + ceil(heightTextSectionHeightDifference / 2) + + ceil(forcedAdditionalHeight / 2) - floor(forcedReducedHeight / 2)); + + m_textLabel->move(m_margins.left() + m_textSectionMargins.left(), + m_margins.top() + m_textSectionMargins.top() + titleHeight + + textSectionSpacing + ceil(heightTextSectionHeightDifference / 2) + + ceil(forcedAdditionalHeight / 2) - floor(forcedReducedHeight / 2)); + } + + // Adjust label position if either title or text is empty + if (m_title.isEmpty() && m_text.isEmpty() == false) + { + m_textLabel->move(m_textLabel->x(), + (int)((height - textHeight - durationBarHeight) / 2)); + } + else if (m_title.isEmpty() == false && m_text.isEmpty()) + { + m_titleLabel->move(m_titleLabel->x(), + (int)((height - titleHeight - durationBarHeight) / 2)); + } + + // Move close button to top, middle, or bottom position + if (m_closeButtonAlignment == ButtonAlignment::Top) + { + m_closeButton->move(width - closeButtonWidth - closeButtonMargins.right() + - m_margins.right(), m_margins.top() + closeButtonMargins.top()); + } + else if (m_closeButtonAlignment == ButtonAlignment::Middle) + { + m_closeButton->move(width - closeButtonWidth - closeButtonMargins.right() + - m_margins.right(), ceil((height - closeButtonHeight - durationBarHeight) / 2)); + } + else if (m_closeButtonAlignment == ButtonAlignment::Bottom) + { + m_closeButton->move(width - closeButtonWidth - closeButtonMargins.right() + - m_margins.right(), height - closeButtonHeight - m_margins.bottom() + - closeButtonMargins.bottom() - durationBarHeight); + } + + // Hide close button if disabled + if (!m_showCloseButton) + { + m_closeButton->setVisible(false); + } + + // Resize, move, and show duration bar if enabled + if (m_showDurationBar) + { + m_durationBarContainer->setFixedWidth(width); + m_durationBarContainer->move(0, height - durationBarHeight); + m_durationBar->setFixedWidth(width); + m_durationBarChunk->setFixedWidth(width); + } + else { + m_durationBarContainer->setVisible(false); + } +} + +QPoint Toast::calculatePosition() +{ + // Calculate vertical space taken up by all the currently showing notifications + int offsetY = 0; + + for (Toast* toast : s_currentlyShown) + { + if (toast == this) + { + break; + } + offsetY += toast->m_notification->height() + s_spacing; + } + + // Get screen + QScreen* primaryScreen = QGuiApplication::primaryScreen(); + QScreen* currentScreen = nullptr; + + if (s_fixedScreen) + { + currentScreen = s_fixedScreen; + } + else if (s_alwaysOnMainScreen || !m_parent) + { + currentScreen = primaryScreen; + } + else + { + QList screens = QGuiApplication::screens(); + + for (QScreen* screen : screens) + { + if (m_parent->geometry().intersects(screen->geometry())) + { + if (!currentScreen) + { + currentScreen = screen; + } + else + { + currentScreen = primaryScreen; + break; + } + } + } + } + + // Calculate x and y position of notification + int x = 0; + int y = 0; + + if (s_position == Position::BottomRight) + { + x = currentScreen->geometry().width() - m_notification->width() + - s_offsetX + currentScreen->geometry().x(); + y = currentScreen->geometry().height() - m_notification->height() + - s_offsetY + currentScreen->geometry().y() - offsetY; + } + else if (s_position == Position::BottomLeft) + { + x = currentScreen->geometry().x() + s_offsetX; + y = currentScreen->geometry().height() - m_notification->height() + - s_offsetY + currentScreen->geometry().y() - offsetY; + } + else if (s_position == Position::BottomMiddle) + { + x = (int)(currentScreen->geometry().x() + + currentScreen->geometry().width() / 2 - m_notification->width() / 2); + y = currentScreen->geometry().height() - m_notification->height() + - s_offsetY + currentScreen->geometry().y() - offsetY; + } + else if (s_position == Position::TopRight) + { + x = currentScreen->geometry().width() - m_notification->width() + - s_offsetX + currentScreen->geometry().x(); + y = currentScreen->geometry().y() + s_offsetY + offsetY; + } + else if (s_position == Position::TopLeft) + { + x = currentScreen->geometry().x() + s_offsetX; + y = currentScreen->geometry().y() + s_offsetY + offsetY; + } + else if (s_position == Position::TopMiddle) + { + x = (int)(currentScreen->geometry().x() + + currentScreen->geometry().width() / 2 - m_notification->width() / 2); + y = currentScreen->geometry().y() + s_offsetY + offsetY; + } + else if (s_position == Position::Center) + { + x = (int)(currentScreen->geometry().x() + + currentScreen->geometry().width() / 2 - m_notification->width() / 2); + y = (int)(currentScreen->geometry().y() + currentScreen->geometry().height() / 2 + - m_notification->height() / 2 + offsetY); + } + + x -= sc_dropShadowSize; + y -= sc_dropShadowSize; + + return QPoint(x, y); +} + +void Toast::updatePositionXY() +{ + QPoint position = calculatePosition(); + + // Animate position change + QPropertyAnimation* posAnimation = new QPropertyAnimation(this, "pos"); + posAnimation->setEndValue(position); + posAnimation->setDuration(sc_updatePositionDuration); + posAnimation->start(QAbstractAnimation::DeleteWhenStopped); +} + +void Toast::updatePositionX() +{ + QPoint position = calculatePosition(); + + // Animate position change + QPropertyAnimation* posAnimation = new QPropertyAnimation(this, "pos"); + posAnimation->setEndValue(QPoint(position.x(), y())); + posAnimation->setDuration(sc_updatePositionDuration); + posAnimation->start(); +} + +void Toast::updatePositionY() +{ + QPoint position = calculatePosition(); + + // Animate position change + QPropertyAnimation* posAnimation = new QPropertyAnimation(this, "pos"); + posAnimation->setEndValue(QPoint(x(), position.y())); + posAnimation->setDuration(sc_updatePositionDuration); + posAnimation->start(QAbstractAnimation::DeleteWhenStopped); +} + +void Toast::updateStylesheet() +{ + m_notification->setStyleSheet(QStringLiteral("background: %1;" + "border-radius: %2px; ").arg(m_backgroundColor.name()).arg(m_borderRadius)); + + m_durationBar->setStyleSheet(QStringLiteral("background: rgba(%1, %2, %3, 100);" + "border-radius: %4px;").arg(m_durationBarColor.red()) + .arg(m_durationBarColor.green()).arg(m_durationBarColor.blue()).arg(m_borderRadius)); + + m_durationBarChunk->setStyleSheet(QStringLiteral("background: rgba(%1, %2, %3, 255);" + "border-bottom-left-radius: %4px; border-bottom-right-radius: %5px;") + .arg(m_durationBarColor.red()).arg(m_durationBarColor.green()) + .arg(m_durationBarColor.blue()).arg(m_borderRadius) + .arg(m_duration == 0 ? m_borderRadius : 0)); + + m_iconSeparator->setStyleSheet(QStringLiteral("background: %1;").arg(m_iconSeparatorColor.name())); + + m_titleLabel->setStyleSheet(QStringLiteral("color: %1;").arg(m_titleColor.name())); + m_textLabel->setStyleSheet(QStringLiteral("color: %1;").arg(m_textColor.name())); +} + +Toast* Toast::getPredecessorToast() +{ + Toast* predecessorToast = nullptr; + + for (Toast* toast : s_currentlyShown) + { + if (toast == this) + { + return predecessorToast; + } + predecessorToast = toast; + } + + return predecessorToast; +} + +QImage Toast::recolorImage(QImage image, QColor color) +{ + // Loop through every pixel + for (int x = 0; x < image.width(); x++) { + for (int y = 0; y < image.height(); y++) { + // Get current color of the pixel + QColor currentColor = image.pixelColor(x, y); + + // Replace the rgb values with rgb of new color and keep alpha the same + QColor newColor = QColor::fromRgba(qRgba(color.red(), color.green(), + color.blue(), currentColor.alpha())); + image.setPixelColor(x, y, newColor); + } + } + return image; +} + +QPixmap Toast::getIconFromEnum(Icon enumIcon) +{ + auto base = QStringLiteral(":/core/toast-%1"); + + if (enumIcon == Icon::Success) + { + return QPixmap(base.arg(QStringLiteral("success.png"))); + } + else if (enumIcon == Icon::Warning) + { + return QPixmap(base.arg(QStringLiteral("warning.png"))); + } + else if (enumIcon == Icon::Error) + { + return QPixmap(base.arg(QStringLiteral("error.png"))); + } + else if (enumIcon == Icon::Information) + { + return QPixmap(base.arg(QStringLiteral("information.png"))); + } + else if (enumIcon == Icon::Close) + { + return QPixmap(base.arg(QStringLiteral("close.png"))); + } + return QPixmap(); +} + +void Toast::updateCurrentlyShowingPositionXY() +{ + for (Toast* toast : s_currentlyShown) + { + toast->updatePositionXY(); + } +} + +void Toast::updateCurrentlyShowingPositionX() +{ + for (Toast* toast : s_currentlyShown) + { + toast->updatePositionX(); + } +} + +void Toast::updateCurrentlyShowingPositionY() +{ + for (Toast* toast : s_currentlyShown) + { + toast->updatePositionY(); + } +} + +void Toast::deleteAndShowNextInQueue() +{ + showNextInQueue(); + deleteLater(); +} diff --git a/core/src/Toast.h b/core/src/Toast.h new file mode 100644 index 000000000..badd0b6be --- /dev/null +++ b/core/src/Toast.h @@ -0,0 +1,319 @@ +/* + * File based on https://github.com/niklashenning/qt-toast/blob/master/src/Toast.h + * + * MIT License + + * Copyright (c) 2024 Niklas Henning + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#pragma once + +#include +#include + +class QGraphicsOpacityEffect; +class QLabel; + +class Toast : public QDialog +{ + Q_OBJECT +public: + enum class Preset + { + Success, + Warning, + Error, + Information, + }; + + enum class Icon + { + Success, + Warning, + Error, + Information, + Close + }; + + enum class Position + { + BottomLeft, + BottomMiddle, + BottomRight, + TopLeft, + TopMiddle, + TopRight, + Center + }; + + enum class ButtonAlignment + { + Top, + Middle, + Bottom + }; + + Toast(QWidget* parent = nullptr); + ~Toast(); + + static int getMaximumOnScreen(); + static int getSpacing(); + static QPoint getOffset(); + static int getOffsetX(); + static int getOffsetY(); + static bool isAlwaysOnMainScreen(); + static QScreen* getFixedScreen(); + static Position getPosition(); + static int getCount(); + static int getVisibleCount(); + static int getQueuedCount(); + int getDuration(); + bool isShowDurationBar(); + QString getTitle(); + QString getText(); + QPixmap getIcon(); + bool isShowIcon(); + QSize getIconSize(); + bool isShowIconSeparator(); + int getIconSeparatorWidth(); + QPixmap getCloseButtonIcon(); + bool isShowCloseButton(); + QSize getCloseButtonIconSize(); + int getCloseButtonWidth(); + int getCloseButtonHeight(); + QSize getCloseButtonSize(); + ButtonAlignment getCloseButtonAlignment(); + int getFadeInDuration(); + int getFadeOutDuration(); + bool isResetDurationOnHover(); + bool isStayOnTop(); + int getBorderRadius(); + QColor getBackgroundColor(); + QColor getTitleColor(); + QColor getTextColor(); + QColor getIconColor(); + QColor getIconSeparatorColor(); + QColor getCloseButtonIconColor(); + QColor getDurationBarColor(); + QFont getTitleFont(); + QFont getTextFont(); + QMargins getMargins(); + QMargins getIconMargins(); + QMargins getIconSectionMargins(); + QMargins getTextSectionMargins(); + QMargins getCloseButtonMargins(); + int getTextSectionSpacing(); + + static void setMaximumOnScreen(int maximum); + static void setSpacing(int spacing); + static void setOffset(int x, int y); + static void setOffsetX(int offsetX); + static void setOffsetY(int offsetY); + static void setAlwaysOnMainScreen(bool enabled); + static void setFixedScreen(QScreen* screen); + static void setPosition(Position position); + static void reset(); + void setDuration(int duration); + void setShowDurationBar(bool enabled); + void setTitle(QString title); + void setText(QString text); + void setIcon(QPixmap icon); + void setIcon(Icon icon); + void setShowIcon(bool enabled); + void setIconSize(QSize size); + void setShowIconSeparator(bool enabled); + void setIconSeparatorWidth(int width); + void setCloseButtonIcon(QPixmap icon); + void setCloseButtonIcon(Icon icon); + void setShowCloseButton(bool enabled); + void setCloseButtonIconSize(QSize size); + void setCloseButtonSize(QSize size); + void setCloseButtonWidth(int width); + void setCloseButtonHeight(int height); + void setCloseButtonAlignment(ButtonAlignment alignment); + void setFadeInDuration(int duration); + void setFadeOutDuration(int duration); + void setResetDurationOnHover(bool enabled); + void setStayOnTop(bool enabled); + void setBorderRadius(int borderRadius); + void setBackgroundColor(QColor color); + void setTitleColor(QColor color); + void setTextColor(QColor color); + void setIconColor(QColor color); + void setIconSeparatorColor(QColor color); + void setCloseButtonIconColor(QColor color); + void setDurationBarColor(QColor color); + void setTitleFont(QFont font); + void setTextFont(QFont font); + void setMargins(QMargins margins); + void setMarginLeft(int margin); + void setMarginTop(int margin); + void setMarginRight(int margin); + void setMarginBottom(int margin); + void setIconMargins(QMargins margins); + void setIconMarginLeft(int margin); + void setIconMarginTop(int margin); + void setIconMarginRight(int margin); + void setIconMarginBottom(int margin); + void setIconSectionMargins(QMargins margins); + void setIconSectionMarginLeft(int margin); + void setIconSectionMarginTop(int margin); + void setIconSectionMarginRight(int margin); + void setIconSectionMarginBottom(int margin); + void setTextSectionMargins(QMargins margins); + void setTextSectionMarginLeft(int margin); + void setTextSectionMarginTop(int margin); + void setTextSectionMarginRight(int margin); + void setTextSectionMarginBottom(int margin); + void setCloseButtonMargins(QMargins margins); + void setCloseButtonMarginLeft(int margin); + void setCloseButtonMarginTop(int margin); + void setCloseButtonMarginRight(int margin); + void setCloseButtonMarginBottom(int margin); + void setTextSectionSpacing(int spacing); + void setFixedSize(QSize size); + void setFixedSize(int width, int height); + void setFixedWidth(int width); + void setFixedHeight(int height); + void applyPreset(Preset preset); + + +public Q_SLOTS: + void show(); + void hide(); + +Q_SIGNALS: + void closed(); + +protected: +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + using EnterEvent = QEnterEvent; +#else + using EnterEvent = QEvent; +#endif + void enterEvent(EnterEvent* event) override; + void leaveEvent(QEvent* event) override; + +private Q_SLOTS: + void hide_(); + void fadeOut(); + void updateDurationBar(); + void deleteAndShowNextInQueue(); + +private: + static int s_maximumOnScreen; + static int s_spacing; + static int s_offsetX; + static int s_offsetY; + static bool s_alwaysOnMainScreen; + static QScreen* s_fixedScreen; + static Position s_position; + static std::deque s_currentlyShown; + static std::deque s_queue; + int m_duration; + bool m_showDurationBar; + QString m_title; + QString m_text; + QPixmap m_icon; + bool m_showIcon; + QSize m_iconSize; + bool m_showIconSeparator; + int m_iconSeparatorWidth; + QPixmap m_closeButtonIcon; + bool m_showCloseButton; + QSize m_closeButtonIconSize; + QSize m_closeButtonSize; + ButtonAlignment m_closeButtonAlignment; + int m_fadeInDuration; + int m_fadeOutDuration; + bool m_resetDurationOnHover; + bool m_stayOnTop; + int m_borderRadius; + QColor m_backgroundColor; + QColor m_titleColor; + QColor m_textColor; + QColor m_iconColor; + QColor m_iconSeparatorColor; + QColor m_closeButtonIconColor; + QColor m_durationBarColor; + QFont m_titleFont; + QFont m_textFont; + QMargins m_margins; + QMargins m_iconMargins; + QMargins m_iconSectionMargins; + QMargins m_textSectionMargins; + QMargins m_closeButtonMargins; + int m_textSectionSpacing; + int m_elapsedTime; + bool m_fadingOut; + bool m_used; + QWidget* m_parent; + QLabel* m_notification; + QWidget* m_dropShadowLayer1; + QWidget* m_dropShadowLayer2; + QWidget* m_dropShadowLayer3; + QWidget* m_dropShadowLayer4; + QWidget* m_dropShadowLayer5; + QGraphicsOpacityEffect* m_opacityEffect; + QPushButton* m_closeButton; + QLabel* m_titleLabel; + QLabel* m_textLabel; + QPushButton* m_iconWidget; + QWidget* m_iconSeparator; + QWidget* m_durationBarContainer; + QWidget* m_durationBar; + QWidget* m_durationBarChunk; + QTimer* m_durationTimer; + QTimer* m_durationBarTimer; + + void setupUI(); + void updatePositionXY(); + void updatePositionX(); + void updatePositionY(); + void updateStylesheet(); + QPoint calculatePosition(); + Toast* getPredecessorToast(); + static QImage recolorImage(QImage image, QColor color); + static QPixmap getIconFromEnum(Icon enumIcon); + static void updateCurrentlyShowingPositionXY(); + static void updateCurrentlyShowingPositionX(); + static void updateCurrentlyShowingPositionY(); + static void showNextInQueue(); + + static const int sc_updatePositionDuration; + static const int sc_durationBarUpdateInterval; + static const int sc_dropShadowSize; + static const QColor sc_successAccentColor; + static const QColor sc_warningAccentColor; + static const QColor sc_errorAccentColor; + static const QColor sc_informationAccentColor; + static const QColor sc_defaultAccentColor; + static const QColor sc_defaultBackgroundColor; + static const QColor sc_defaultTitleColor; + static const QColor sc_defaultTextColor; + static const QColor sc_defaultIconSeparatorColor; + static const QColor sc_defaultCloseButtonIconColor; + static const QColor sc_defaultBackgroundColorDark; + static const QColor sc_defaultTitleColorDark; + static const QColor sc_defaultTextColorDark; + static const QColor sc_defaultIconSeparatorColorDark; + static const QColor sc_defaultCloseButtonIconColorDark; +}; From f8a90e805fa1010d7201168ef5e67ab5f7a26042 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 10:57:33 +0100 Subject: [PATCH 1719/1765] ServiceControl: use Toast instead of QProgressDialog Do not block usage of graphical application while service operation is running. --- core/src/ServiceControl.cpp | 47 +++++++++++++++++-------------------- core/src/ServiceControl.h | 6 ++--- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/core/src/ServiceControl.cpp b/core/src/ServiceControl.cpp index 0b255c25c..6c684da18 100644 --- a/core/src/ServiceControl.cpp +++ b/core/src/ServiceControl.cpp @@ -23,12 +23,11 @@ */ #include -#include -#include #include #include "PlatformServiceFunctions.h" #include "ServiceControl.h" +#include "Toast.h" ServiceControl::ServiceControl( const QString& name, @@ -96,45 +95,41 @@ void ServiceControl::unregisterService() -void ServiceControl::serviceControl( const QString& title, const Operation& operation ) +void ServiceControl::serviceControl(const QString& title, Operation&& operation) { - if( m_parent ) + if (m_parent) { - graphicalFeedback( title, operation ); + graphicalFeedback(title, std::move(operation)); } else { - textFeedback( title, operation ); + textFeedback(title, std::move(operation)); } } -void ServiceControl::graphicalFeedback( const QString& title, const Operation& operation ) +void ServiceControl::graphicalFeedback(const QString& title, Operation&& operation) { - QProgressDialog pd( title, {}, 0, 0, m_parent ); - pd.setWindowTitle( tr( "Service control" ) ); - - auto b = new QProgressBar( &pd ); - b->setMaximum( 100 ); - b->setTextVisible( false ); - pd.setBar( b ); - b->show(); - pd.setWindowModality( Qt::WindowModal ); - pd.show(); - - int j = 0; - while( operation.isFinished() == false ) - { - QCoreApplication::processEvents(); - b->setValue( ++j % 100 ); - QThread::msleep( 10 ); - } + auto toast = new Toast(m_parent); + toast->setTitle(tr("Service control")); + toast->setText(title); + toast->applyPreset(Toast::Preset::Information); + toast->setDuration(0); + toast->show(); + +#if QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) + operation.then(toast, [=]() { toast->hide(); }); +#else + operation.waitForFinished(); + toast->hide(); +#endif + } -void ServiceControl::textFeedback( const QString& title, const Operation& operation ) +void ServiceControl::textFeedback(const QString& title, Operation&& operation) { printf( "%s", qUtf8Printable( title ) ); diff --git a/core/src/ServiceControl.h b/core/src/ServiceControl.h index b8aaa5c62..0cf4950ac 100644 --- a/core/src/ServiceControl.h +++ b/core/src/ServiceControl.h @@ -53,9 +53,9 @@ class VEYON_CORE_EXPORT ServiceControl : public QObject private: using Operation = QFuture; - void serviceControl( const QString& title, const Operation& operation ); - void graphicalFeedback( const QString &title, const Operation& operation ); - void textFeedback( const QString &title, const Operation& operation ); + void serviceControl(const QString& title, Operation&& operation); + void graphicalFeedback(const QString &title, Operation&& operation); + void textFeedback(const QString &title, Operation&& operation); const QString m_name; const QString m_filePath; From 242d75fe2534413634ffac48cfbd61f506df0340 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 11:00:24 +0100 Subject: [PATCH 1720/1765] ServiceControl: add restartService() --- core/src/ServiceControl.cpp | 11 +++++++++++ core/src/ServiceControl.h | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/core/src/ServiceControl.cpp b/core/src/ServiceControl.cpp index 6c684da18..dd1f6934b 100644 --- a/core/src/ServiceControl.cpp +++ b/core/src/ServiceControl.cpp @@ -75,6 +75,17 @@ void ServiceControl::stopService() +void ServiceControl::restartService() +{ + serviceControl(tr("Restarting service %1").arg(m_name), + QtConcurrent::run([=]() { + VeyonCore::platform().serviceFunctions().stop(m_name); + VeyonCore::platform().serviceFunctions().start(m_name); + })); +} + + + void ServiceControl::registerService() { serviceControl( tr( "Registering service %1" ).arg( m_name ), diff --git a/core/src/ServiceControl.h b/core/src/ServiceControl.h index 0cf4950ac..77d79b9a5 100644 --- a/core/src/ServiceControl.h +++ b/core/src/ServiceControl.h @@ -49,7 +49,7 @@ class VEYON_CORE_EXPORT ServiceControl : public QObject void startService(); void stopService(); - + void restartService(); private: using Operation = QFuture; From 134cdd23a274015baabd41c928950afddf948116 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 11:07:54 +0100 Subject: [PATCH 1721/1765] ServiceConfigurationPage: use new restart method --- configurator/src/ServiceConfigurationPage.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/configurator/src/ServiceConfigurationPage.cpp b/configurator/src/ServiceConfigurationPage.cpp index 1a049e022..bfa8fbef7 100644 --- a/configurator/src/ServiceConfigurationPage.cpp +++ b/configurator/src/ServiceConfigurationPage.cpp @@ -83,7 +83,7 @@ void ServiceConfigurationPage::connectWidgetsToProperties() void ServiceConfigurationPage::applyConfiguration() { - VeyonServiceControl serviceControl( this ); + VeyonServiceControl serviceControl(this); if( serviceControl.isServiceRunning() && QMessageBox::question( this, tr( "Restart %1 Service" ).arg( VeyonCore::applicationName() ), @@ -92,8 +92,7 @@ void ServiceConfigurationPage::applyConfiguration() "Restart it now?" ).arg( VeyonCore::applicationName() ), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ) == QMessageBox::Yes ) { - serviceControl.stopService(); - serviceControl.startService(); + serviceControl.restartService(); } } @@ -101,7 +100,7 @@ void ServiceConfigurationPage::applyConfiguration() void ServiceConfigurationPage::startService() { - VeyonServiceControl( this ).startService(); + VeyonServiceControl(this).startService(); updateServiceControl(); } @@ -110,7 +109,7 @@ void ServiceConfigurationPage::startService() void ServiceConfigurationPage::stopService() { - VeyonServiceControl( this ).stopService(); + VeyonServiceControl(this).stopService(); updateServiceControl(); } From 1dac8ec1d91a5520cf2f013ec044309c46d119a0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 13:41:16 +0100 Subject: [PATCH 1722/1765] Add initial dark mode support Make color scheme configurable and use dark variants of all necessary icons (Veyon Master only so far). For Qt < 6.8 the UI color scheme setting only affects the icons. Closes #1015. --- configurator/src/GeneralConfigurationPage.ui | 27 +++++++++++++ core/resources/core.qrc | 12 ++++++ core/resources/document-open-dark.png | Bin 0 -> 355 bytes core/resources/document-save-dark.png | Bin 0 -> 342 bytes core/resources/edit-find-dark.png | Bin 0 -> 1846 bytes core/resources/go-down-dark.png | Bin 0 -> 1561 bytes core/resources/go-next-dark.png | Bin 0 -> 1299 bytes core/resources/go-previous-dark.png | Bin 0 -> 1282 bytes core/resources/go-up-dark.png | Bin 0 -> 1551 bytes core/resources/help-about-dark.png | Bin 0 -> 2320 bytes core/resources/media-playback-pause-dark.png | Bin 0 -> 181 bytes core/resources/media-playback-start-dark.png | Bin 0 -> 377 bytes core/resources/media-playback-stop-dark.png | Bin 0 -> 179 bytes core/resources/user-group-new-dark.png | Bin 0 -> 1790 bytes core/src/Toast.cpp | 7 ++-- core/src/VeyonConfigurationProperties.h | 3 +- core/src/VeyonCore.cpp | 38 ++++++++++++++++++ core/src/VeyonCore.h | 8 ++++ .../exchange-positions-zorder-dark.png | Bin 0 -> 1969 bytes master/resources/homerun-dark.png | Bin 0 -> 344 bytes master/resources/master.qrc | 6 +++ master/resources/powered-on-dark.png | Bin 0 -> 2464 bytes .../update-realtime-disabled-dark.png | Bin 0 -> 3016 bytes .../update-realtime-enabled-dark.png | Bin 0 -> 3594 bytes master/resources/zoom-fit-best-dark.png | Bin 0 -> 551 bytes master/src/ComputerMonitoringWidget.cpp | 12 +++++- master/src/MainToolBar.cpp | 1 - master/src/MainWindow.cpp | 15 ++++++- master/src/ScreenshotManagementPanel.cpp | 5 +++ master/src/SlideshowPanel.cpp | 10 +++++ master/src/SpotlightPanel.cpp | 10 +++++ 31 files changed, 145 insertions(+), 9 deletions(-) create mode 100644 core/resources/document-open-dark.png create mode 100644 core/resources/document-save-dark.png create mode 100644 core/resources/edit-find-dark.png create mode 100644 core/resources/go-down-dark.png create mode 100644 core/resources/go-next-dark.png create mode 100644 core/resources/go-previous-dark.png create mode 100644 core/resources/go-up-dark.png create mode 100644 core/resources/help-about-dark.png create mode 100644 core/resources/media-playback-pause-dark.png create mode 100644 core/resources/media-playback-start-dark.png create mode 100644 core/resources/media-playback-stop-dark.png create mode 100644 core/resources/user-group-new-dark.png create mode 100644 master/resources/exchange-positions-zorder-dark.png create mode 100644 master/resources/homerun-dark.png create mode 100644 master/resources/powered-on-dark.png create mode 100644 master/resources/update-realtime-disabled-dark.png create mode 100644 master/resources/update-realtime-enabled-dark.png create mode 100644 master/resources/zoom-fit-best-dark.png diff --git a/configurator/src/GeneralConfigurationPage.ui b/configurator/src/GeneralConfigurationPage.ui index fa8ee3f55..49757a5b1 100644 --- a/configurator/src/GeneralConfigurationPage.ui +++ b/configurator/src/GeneralConfigurationPage.ui @@ -68,6 +68,32 @@ + + + + Color scheme: + + + + + + + + System + + + + + Light + + + + + Dark + + + + @@ -393,6 +419,7 @@ applicationName uiLanguage uiStyle + uiColorScheme userGroupsBackend logFileDirectory openLogFileDirectory diff --git a/core/resources/core.qrc b/core/resources/core.qrc index 33fef9a85..3c3a6106e 100644 --- a/core/resources/core.qrc +++ b/core/resources/core.qrc @@ -5,27 +5,39 @@ application-x-pem-key.png license.png user-group-new.png + user-group-new-dark.png languages.png presentation-none.png icon16.png icon22.png icon32.png document-open.png + document-open-dark.png document-save.png + document-save-dark.png list-add.png edit-delete.png edit-find.png + edit-find-dark.png help-about.png + help-about-dark.png dialog-ok-apply.png document-edit.png default-pkey.pem go-up.png + go-up-dark.png go-down.png + go-down-dark.png go-previous.png + go-previous-dark.png go-next.png + go-next-dark.png media-playback-pause.png + media-playback-pause-dark.png media-playback-start.png + media-playback-start-dark.png media-playback-stop.png + media-playback-stop-dark.png media-record.png toast-close.png toast-error.png diff --git a/core/resources/document-open-dark.png b/core/resources/document-open-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3430cb382aec858ec41954a19d029911871482 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg`mX84zY%eyHLVP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXpd#r2pAgsoNZ>aZ{DA@PK$pEh zWgI0ze!&ckZ0sHVo40J~)SC|!+v@4!7?N@C?e&ekha3c4E(*8J(b8ayx*@P@0gIHw ztWBK1M-Yb<0x9#Vh9fI`E6XP&wf{VYY&~V_uU=?fyGeoW%)M zTZNt-*s)DWD50uMNNBNTQ$$~3^#lpinR(g8$%zH2dih1^v)|cBF)%Pb3-AeX{ZC8q6AApn0KajA zKcs`dBm%6KlWr|O9avq2X)it_s3aGqyZb3kV7h4U3CUNK8sjNlnYk zFDxo9DJ?6nsI024scq=!?CS36oiTIPoOvr&u3Eiz-TDn1H*MLvbN8No`;Q(waq`Uh z3l}e4zH;^2^&2;D-M)M8{)2~)9zT2j;^nK?Z{NND@bS~~S4H5%zH zVqjoV@pN$vskrqv>bG@>ql8@K?vA@ju}VdpnqH@t#)w6hD=E1?^?S$JJ!MIV-s??z zH)GD#-{L=e=4R~ab2Dcq&!3lmFaGTBz3=B4KmWb&CmRD36g=56CFahZ^vF9KZkvng z?mc_-)3y>=`eD$w&@$pH~GW{YyR_n=U{8OFV{MBvms!w&iwZUr`TT!@N(ZL@);jq*&buY!`pSj!$rC#a<iXRv4;`Gfmu`TT@RNp-Mu39 z&xN1sck@@g7Prv+^X>#!!B4AA*8Fq+JpFuC-@1@vUy$sZyxx6jM-wl0&Rkx%u=!uv z&Tnf{Z+W$|R8Bhn@vpVbe{;p>YfZ{dX#Y?7bZNih`~9)~>#wQk-|Kw%!*k~vi)^XD9FF_ZfxxydeZq2ZaNQ?X^WXVpb=EayxS-qm8k{buS* z$$Rx1pDd}^Bb*)iwb?9C!*%6aj_~IRZp^$teup1>?Xt(}*uQMqr~3s`U6fCCuFhGy zQ{e9eqorrGR)v>yEne|Y!%uTpsE2IY#eSE+`CE(fWM54^EXfnH;Ftf#>AWlK6IPyn zpU|`2yxUXjBb$t7PnJ@l8DU0_n) za^YgM;$O?HjdczsO}VztEWE<-VW!W$+cYfXMzOi`^Z6g=aB`NgQ-=-`{oa z%@wvc22E|B4ESHN|6k9zem~O|&h?eq!hWBB@~E%m{qoV%SwELNQhSzU@@{QX z%c+lv3Za&ENqWb3D4txF_}uA}TCH*4B7T+cMqgTNV4}SVv-@49uRi(&l_K!=a2=;T?7w@p!*`A(f z+%or~XyvAvd=?92+h?nu(tNn-pSRpE2X%kD{la%zRCFFcy^3FWRWv4IOR{dY3qI+w>MTte1y`t3n=KQZ( z)YSYs_=))R;{G*S78kZne6{~llZ&ZL!O|Ju;wj2s64 zZT#!j2Fkr!^@QQYr}p!|#QPT7ESFh2jhW%lnZMENUd^sux_r`>Dn5n}o<^o$ee|N< zmc4$IQa<_RvfH1h&*D3wAj83asIdS}&2j6xOm-b+~sz@JuCPf7G2%_ ji(v^58zT&u|KLvkc_F?*;l_Dj;l|+U>gTe~DWM4f9mi!} literal 0 HcmV?d00001 diff --git a/core/resources/go-down-dark.png b/core/resources/go-down-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..36bf7a0a2ba1fe86e73f3bec6e9e51467a1a243d GIT binary patch literal 1561 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BeuE$$&89@lpinR(g8$%zH2dih1^v)|cBF)%Rx3-AeX{ZD)F69#@^fZs%b zKV*Tw!~uf#lVv$Mny|VT*?Hs`N=VOo#-Ce($z^3pkY6wZBNHqvnWdGTy@Qjpi>sTvho`rXZ$MyBXm~_qOl(48 zQgTXqMrKZKUSUy5X?bN;V^ecWTSsSi--L;ircRqaW7h0BbLY)pxOmy}RcqF++puxV z*6llX?cRUz@R6g(PMkb*_WXs5m#-V3(|2}-G{>8w+^xV_MF{I+w+ZoTpgB=Bqs-NW$VtLcWdn9gyxlYFoZMO~I``iNF zuyRLiT)fCbQ1Rq%{oc+uI+h1+*IIMNKl|P}`OKZ!hi@BwXEfkBj6gp2KeECubc@~p zvU*yTQ`m8)tp7XTUgKRKwet0%)X3c8jKAG=$6VI$n)>H_)c=gRo-gAs2#N1~6STrM zP4$Oe@45O@*Z(hC{wAA0dT-5auc!7aBRk}_>#h^pdhI!<$-iX#1!+rbe+I6pvu`_O z|6NyWUO;5a@{Rj6&)>0sZu%-VD6-|jt_E3sw^_f~=Pi!f8ol;-F>m#}w3$EC?VQ#| zt%Q(w+`jSszk=ug&Xqoik9%JH>iy0>t*^>+>~~A8cdlQ& z^-0QCwYSSYulR83VBV$s`>#Cje8)NMh~Q`8P`ktYugt=O?r2`pO_RNleK&dHomG$I z`ZxM7FI4|F^Q>sAu9LdOrgt)n_Wth(byRpJkX0}BplG80 zdMyQaKApwCwNKPGi>kl;d$2U^1EccusW%yt`*%ypN->?h&nD&LZc%Nc_@!c!h`5oQ z6{o_k6OB*f=FfPzyY>E^ug<3?G`p>Jud-5{rI6e&6S1yi>NBh7HVrS7*u@OByqQ02 z*6}dB+4~}F;*S+f_L*nerYN&cJ2E4p&HU=_zzJ-h3^ur!F->XdjDLBH0 zorur6Ik~@a>E_@+H|OwYI`ioy`OVpCsT)>M8papscL(L(Pg^t#{)ulxt!f9-$-@5YfwxvuVlEWD#6m0D1ktRkM(Vj XoOJoxYjF;kPZ>O2{an^LB{Ts5o%rY$ literal 0 HcmV?d00001 diff --git a/core/resources/go-next-dark.png b/core/resources/go-next-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7a78d72d4cd7b79aec529616ed018933364e3dbf GIT binary patch literal 1299 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BeuE$$&89@lpinR(g8$%zH2dih1^v)|cBF)%Q04)6(a{ZC`?6AXS~fZy1_ zA41?SZh*}^kQgB&DUwHX4%`hC8A?dAlQ!^cjZI(_Es`HPpXUcYtc z?!EgDA3u5e?D@-Auiw0V|Ka1O&tJZN`|~S4$(Z|;GB7Z?db&7_0tAfbvv&AT)mDXtuADJ@v3(o zEDO&6T)zDxi^Ib{fj#}I99-L46W%B}PS~x;GWjFR!L_1_KjwG{EYasYxILvwAvcWU z*?M6XO=G7G70n7eKDly)8FMu4;8ct_t;V5OE6_CmCyV2m4uLmf!YuO?6>sP}?(6yM z^x?POBi=afgAZ+676fzjy;uIX#+RdJE62fL*MRnlCC8l}m?*LEb~SMF^!v3uuoRM5 zCCVr)p~cq<6nV<-bfKB0?NYpxL4~3Tv-3TEMG1E%XFhp}ebEUXp^b@*oIIZKp$R)W zS=us1C5$+mS~L|SfGXZ_$Vx1_&v8&rNJ42(Ny3G&shm9T#1t)7rL0-y&*UuX^x*>w zAJ462KVJzpZK}PoF1x|)hv1dg2mJy6c^mJni+6D;cHH0fvS0A8#j9w>!M%ml8cMD zpgp@`X{hgq=a;jss|qDe6+ZJb{C+PP_U*slhv)2T-gh_I&$mn1@h5O@K}zeqzx%o7 ze_V1_^LIV(hX1D*=Ke1>PyMHU;NNBT-qzhl^;2$Kc;voz;+M$v+J8i=Z`73C`pabf t_M5Oxa{ukWS$Rb>ebhkl{x|lpinR(g8$%zH2dih1^v)|cBF)%Q$3h)VW{ZC`?6AXT#g5TJ{ zA41?SZh+0a--OJgf;_T|kljE9qcM!Q)%v#r7`446L4Lsuj7-cdtZeKYT--c-`~reP z!Xl#L5>nE#atewn>Ka6^A;^$vUJ({Y94__61|Nn;h=KHsk_4oQ`-~IcWecs+{mapfe z^DD{qAAkI@!iIb5HDe9CLcgumoG0D~guXqjer~UZj ztKaj#sJQ0eHS=TjyX@@t7oGai@BR35`9AZ1hfP2J+&aJ4ew&S5{q>%Y??sM3zg}c*>k@BzqxnK zKYPY6^~bk-l%Klcm;JV;tN&-WuKCB$_)Geg{lfXYn~%L``0}}6*46WBm;ayPY>;tZ@{VErU3*$?##UGdIa;(U*tz^!KI6aS$NkB19u=yOmrj{~>T@+` zo$+Dw<)60|hq|zSshcE!vExbnQdP}tpYo0s4RRspq_4`kYjLz+)$Lez@Nv~caj`$A z)T%SDcCW~~VZfub-1*C+pe6sLckdEi`8!GUj;@;4g6rS^FgAO*7928+^9l+0XJwIe z^8v5(Iy0WtV&R7ad_w|EgiLs1%$ sm2<1g)LYK1y!;3l-N0D?Z2yy&b$?)H34g&YU?OMmboFyt=akR{0Ps^x^8f$< literal 0 HcmV?d00001 diff --git a/core/resources/go-up-dark.png b/core/resources/go-up-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2697d36f163f3bce256e34698b6986bf2a4b45c9 GIT binary patch literal 1551 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BeuE$$&89@lpinR(g8$%zH2dih1^v)|cBF)%Rx3-AeX{ZD)F69#@^fZs%b zKcs`dL<1u1|4q96nyN9Q@k8eO=P-u8WOl(48 zQgTXqMrKZKUSUy5X?bN;bz@U=OIv$KXLsL(iIb*In?7UK>^XDi&0n~9+45Cu)~?&Q zW$X4GyLRtCc=*WCV<%3YIeY%X#miT&UB7Yj_PqxWA3b^c{Kcy`Z{NND@bUB4Z{L6X z{Pp|K-+!xo_a0(kV7lw+;uunK>+Ov1&X*lTj?WH@S}Vq~ebI^?<#(Ay3-b#bn7@aK ztlq({^*~HqtBYCE_g=l`q9?LjJ@roBeLDU7PtJRL%kOXVe785>NwG3?Xhzkuzx$iGCG^sX?K4zwY{*Id z^{?XfmW^lTC|udF=4jnztD|~_N!(?td>?)BE}ipt+0EsCzq;lp?A7=y8f)?QT#?tj z#><;D4mYu}SczFKKkvF<;n;>V$!0O9f;TLPU6Ghre<`#^_4G_{v)kJl56Str=+ohlGmYUzzYN#-ejpuF4Uxvpni|)PeSUUHh?7U|`4HY!|oztEez594#X<{O; zM{eJ9!(UzDhYv{!*t;EmZMTN8Qb0WQY2LAr80+2Do!2*Hq;GuY8Fxbc-F&tE=hwgg zyo8Hoe^FuOqOhh9)BSS%R~DSHQ&`Y_v*fDsxtr~*UkXp}d}MLnx5DdyN^)X^UV*9U z+c_=M&)aT(s(Nmj*h)czvuQKetuHj+nxUn6@4kBQMFB?v79`{%R>!>K+)4M{-g=XO Pxs$=u)z4*}Q$iB}WxL`^ literal 0 HcmV?d00001 diff --git a/core/resources/help-about-dark.png b/core/resources/help-about-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3eafb192ae66aa4f02c9db20c02a63d17c21f743 GIT binary patch literal 2320 zcmchYcTm%56UTo95}Kii6zLrd7!*RNQVzHfq(q9eP!0s7NC_|rH38&M0i{>=Y32+jcgeE8fB1e-J@sO8Jj+>kJ&-b0X*O~V-v%51p&$IL0nVsGH7;6-iOOy)$ z04Unr)b=cr{xA;KGynBt=D}Iu3^jKS2LOlVKa3@Z*nmGvUW_nvim(gujllna^8xU9 zJlsDxFx>lxP#<^*&aarEFA4x4G{(~2jQM}$;NKknSC0M;$KSxoxAAvm9({w%zxwq* zb@Qjrzgp#geYY2>eS9`~JrTCnb^r^Al?@DG=iojE<>BSyKQC}WSmdIpn1rO1jI5lz zf})Z#Ohxsw+Lf#78VF6KmbQ+rp8hohLnGtwOiayC=IHB|R@Rssws!Uoj!w=lu5Rw0 zKE8hb0f9kxf5+}+dr%bPw*|G?1j+Y##M*!bl13~hF9p8oOI#iiwy)wT7F%`L{~?ca93 z?(QEP9vz>YN_t3T001}|ZE9>!nAs{iakV$QK%vejk7A6#J&0!*OZoFoH+yWcV_Z4`C5C2?-d z-7FZdz+Kef%)Hb46Q_}T&6Xn zi7t)c-&`g#tI@I5Q4g7rn8{V@setz^+D;={gWhsF;!sQ!D79Eb8%rq#ZC{e9l!*dS zsCVq0iM2b&Vcn%R`&IL%p(ybdtes<~_2MTQx=aYjBKEA-1pFrKZCq>x-UTv#)EMiq z(I<*C3`bB@A{S5)ra3ds!TPv+lwvFfAj-rWDD5liGFYw*yh+Sxd9<1?%pz$C(6K|jK0AuxV=u>&lqn{3wVdOIY950!5?^}_-AjSr$gd>L_w|)9p*+>$Zs&8@} zCk5$go{Biy7leZ0xyAz5CD5%a9)_IKvZzKm5K4Xak=h`*K2wjvMIR9pC9462U(gC+Q;!!GNd8bWIL#Zr|1RX1)Pl zA)9?@0vCx!LTxezN%R0=fo4|uIqy6fK0Amz0*ed)V?rUiEu0`Dr5{g?RLCixv=xe^ zre-o{tD$9pnt`u9Le#ll^lgPd3n5-I5W`=I5epec-{8%NrI?(|@R^Ru>9?(?4(&@3 z=q5QZfDrv8#fIlld-L6vojx;&t8y}RerRKLGA(`u6(3c?`l30-gHA1cLlN4hQ@_A& zW0G4Eo*MIuRX+Zhj;ftD%7%%@K8ed!R#*LrPV0Gk)zIi^kz(F@%)DY=N15}7@J>n1 zUxNmZ=JmXg-15pk@9F(74cq4;2K>4@Isc*D_KrRnS%Fyck8>z2othH|H@>7Y>Y}+< ztsXh?_Z@Sm#?vkN%_oa^R6q}XS_Az4Cc|CB)cVq{mdSJGD;+^u6_a3EfeHaP z{b@klNk~C_Q@nu3(qN7rCM}ugP^D3mtI1nT3xw6s9FyQ~e{RER?dEt9yav5?1 z3e(1-MdY4VSB_IqspV|eycqtWU1S32=Jn`?HS`_y1~+WDFe z|17IluQsfGyiZSN*QXbkmS)e_o44!Nt50iR?-vt@YRuqVY&tZ2ZVb-*g|Be6^GkCiC KxvXkL literal 0 HcmV?d00001 diff --git a/core/resources/user-group-new-dark.png b/core/resources/user-group-new-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..f66e4dd5b5d7bbd4222346e8e2856d77c267eba3 GIT binary patch literal 1790 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevT?FC`R;;al2prB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=B+S0X`wF|7j0?g26A`;5TvL z59#19(EzIxNVkwCI?z0U=2Ti(`QYZoiNIvEu_VYZn1PXrnT3^&or9B$n}<(8P)Jxr zR9s40MpjNyMO95*LrX``z|hFp#MI2(!phpl*3RC+(aG7x&E3=6&p$XMEFv;0CN?fU zAt^OIC%3SuxU{UIvbwgezOkvfrM+*$q{&mJPMbS#{(^;zmM&Yqa@FcJYuBycuyNCt zt=qQm*tu)>p1u1I96WUR$kF2`PM$h*?!v_@SFc^adF%GQ2M-^=c=_t}o44=YfBf|M z%hzw;fBgLQ`_JEh%q;JG7#Nt>c)B=-RNQ(y>wC1Yp~UgqPMXe+1qxartcBt$y1WV( zG(2Jm2|2>p#T*zd)4|*r6cQk_LsQE_KxE3j`W4fg?RsK7iadXvn0&r}@Apr2)#tz3 zd9G8N?4mT$Lq(|5#i)74)}>o^ZTlAU^4W}l67%O*_%#>v+`W?}cK7~ApP3HNtv1H* zw^`t$R1ovPwPR(lLPg76uEcT?je8!BjOR40=7?Xm_rI7ryW`*H>MzWDHgjB`UJuH`}QuZAGkj3 zjbxho#}?%`1*KYP~P*|Ya5HRdw;+}GF7Svjv{yW;AeV76i^ab3L*DzuKm5`3`%t_3QuWS))TXmi z>F0H`rFg_*6Be=Z+}A(NA-%sxCqsJm=cAiE93EC5zj5}r%{*5ouKTk;yMMhSclL?f zf)BMpyUPyghBc{ut9`;d?Q-y{+$XDV@y-_8#3FcB!LeO6g;QutA!LJJ^7)g-beSZYii4iSqbYK*;DnZ=S)5JoiAYLtVQ)X z1zvAX&;KAc;mr4o%2^NdKK=Wse=P0(>)xOLnxn$~_Bq}%Ty;Ozt(IReMRj9Me)ePg zxQrX$A6$LqdWm7_trw+cPWRP!EoW$XqV{I~I$xLdErP%0_PHtWCRB2r%i1#O_q~%U z4imSro3>PG=D~E~12=Noe%w2$a6s2bjupY2JWpt;AdEfPDp62eZzwt|W0`_$!HaL|Y z5PY+?RU_*D>mbH?x<9^7*?0Z9&Wu+A?^MH#cnUmaH!$x1r#JPz;Et<|fAexy)Y#`T s1f?`ciY~a}>$uSqnv;}%>i^{4%%WX>f4TrWu+U-fboFyt=akR{0CHkx8UO$Q literal 0 HcmV?d00001 diff --git a/core/src/Toast.cpp b/core/src/Toast.cpp index d8c127def..08144790b 100644 --- a/core/src/Toast.cpp +++ b/core/src/Toast.cpp @@ -1187,9 +1187,10 @@ void Toast::applyPreset(Preset preset) } if ( - #if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) - QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark || - #endif +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) + (QGuiApplication::styleHints() && + QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark) || +#endif VeyonCore::useDarkMode()) { setBackgroundColor(sc_defaultBackgroundColorDark); diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 95ff45de8..4176316fd 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -59,7 +59,8 @@ #define FOREACH_VEYON_UI_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QString, applicationName, setApplicationName, "ApplicationName", "UI", QStringLiteral("Veyon"), Configuration::Property::Flag::Hidden ) \ OP( VeyonConfiguration, VeyonCore::config(), QString, uiLanguage, setUiLanguage, "Language", "UI", QString(), Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::UiStyle, uiStyle, setUiStyle, "Style", "UI", QVariant::fromValue(VeyonCore::UiStyle::Fusion), Configuration::Property::Flag::Standard ) + OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::UiStyle, uiStyle, setUiStyle, "Style", "UI", QVariant::fromValue(VeyonCore::UiStyle::Fusion), Configuration::Property::Flag::Standard ) \ + OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::UiColorScheme, uiColorScheme, setUiColorScheme, "ColorScheme", "UI", QVariant::fromValue(VeyonCore::UiColorScheme::System), Configuration::Property::Flag::Standard ) #define FOREACH_VEYON_SERVICE_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), bool, isTrayIconHidden, setTrayIconHidden, "HideTrayIcon", "Service", false, Configuration::Property::Flag::Advanced ) \ diff --git a/core/src/VeyonCore.cpp b/core/src/VeyonCore.cpp index 7cf34ec5b..2d32f2fd5 100644 --- a/core/src/VeyonCore.cpp +++ b/core/src/VeyonCore.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -289,6 +290,29 @@ void VeyonCore::enforceBranding( QWidget *topLevelWidget ) +bool VeyonCore::useDarkMode() +{ + const auto colorScheme = config().uiColorScheme(); + +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) + if (colorScheme == UiColorScheme::System && + QGuiApplication::styleHints() && + QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark) + { + return true; + } +#endif + + if (colorScheme == UiColorScheme::Dark) + { + return true; + } + + return false; +} + + + bool VeyonCore::isDebugging() { return s_instance && s_instance->m_debugging; @@ -645,6 +669,20 @@ void VeyonCore::initUi() toolTipPalette.setColor(QPalette::ToolTipBase, toolTipBackgroundColor); toolTipPalette.setColor(QPalette::ToolTipText, Qt::white); QToolTip::setPalette(toolTipPalette); + +#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0) + switch (config().uiColorScheme()) + { + case UiColorScheme::Dark: + QGuiApplication::styleHints()->setColorScheme(Qt::ColorScheme::Dark); + break; + case UiColorScheme::Light: + QGuiApplication::styleHints()->setColorScheme(Qt::ColorScheme::Light); + break; + default: + break; + } +#endif } } diff --git a/core/src/VeyonCore.h b/core/src/VeyonCore.h index 6251e391b..b65cf58c4 100644 --- a/core/src/VeyonCore.h +++ b/core/src/VeyonCore.h @@ -101,6 +101,13 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject }; Q_ENUM(UiStyle) + enum class UiColorScheme { + System, + Light, + Dark + }; + Q_ENUM(UiColorScheme) + static constexpr char RfbSecurityTypeVeyon = 40; VeyonCore( QCoreApplication* application, Component component, const QString& appComponentName ); @@ -191,6 +198,7 @@ class VEYON_CORE_EXPORT VeyonCore : public QObject static QString applicationName(); static void enforceBranding( QWidget* topLevelWidget ); + static bool useDarkMode(); static bool isDebugging(); diff --git a/master/resources/exchange-positions-zorder-dark.png b/master/resources/exchange-positions-zorder-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..59d1dc0fcce2bcbcb4bb1bde84f5a6f5233de200 GIT binary patch literal 1969 zcma)63p7+)7~buW5iS>qpo|#scyM<-F5%9_P4+N{oncbfA-ny?DF&V(AG52 z1ORAzdAj<;Ge6ivGSh82Gawt1ZU6u}%+Dv#ZR{Tb6}3;$XchAB73b2fZ%ZWgOKIOX1tyHL zUKr`ZAD$W+8G(e|Ffz(js8lNFi+W*%%`n127s(MaIy&ks=z&p1gmSv53*ifdDv=@j zlA;THX`)M>_u7{@9;}M-xQck zsE;h2$M;3>UkzVuB2{~^&3T;shZ9L5jl=#41YUmMlB(d3FOJklP6NpzhVK#SM1_Jc zhxUCI;eUI+)<<;BksSr_UA)Qk_YD9jGzN=TSJ%)aXlZLtnmk2+8i{ORFx}9|)ZD_t z(sG8i%}iTcDs`5<{p{Hej*j!@)9B6%phd23Ztm_Lo?c#yy?uO^_%8KZ<{uao6dbZ5 zEFv;`bxdsBy7h^hn44Mb=%B<+?C1`RSXdosoJANqEKD<|%q%fg5gILu+kV z)(0f|(=i(=Fy$Btt%7F#3cCFHd~Is1P=~!XLGiZkQ-qY;7J6*JnMRN#;rSv zapEM0ED~SNeYFd9Dal)l3O&vVumU$Li$;&|ia)1FjZ2(6FXj1>76Bl$)K9^N90>rx zaHfs8!z)D>KxfW{D=M|Mf#H^8Ii`oyK)Li5w#GmgMY+6NLvzkgK#RI2qcaeYLb9f( z4HcuM;Vl`X%K|}bJyzZT_Iisi+N5g&qbJ3FkQ!%ApZTC@BV@}s<4Yj>cNy=sF5L)K zlkczKd8%>VJH^c~ibAKXit|w`83G=6EiqDm))_l3r~L^>h7SR18u{e*Il8!p6#A@d z(ffOVcVesie28txN+9aB)d{{bo zs=@Tlu_bxx+4Wp`4Z4x=CPKXZwqAJsROZyP1N&^E@~*BruJp&{t24ZmB zT)5Zr@?his+qO^g~cLqSYd7U-~& zP?OuTQ1#n3yJ>;!1u;gv!My~9oIB8WhD)VXn*T9&L7fwk;F6$kQk{|g&~f18T!@su zTiO4pU`zQUO^Pe!?C-fHlMC)`bHHIW%v;u`k)Nt<_qFQD%-xdy?8Qj02YqZq-DAuX zQDh(#)NaNMBZ*OemY;h29 zdl)KsS^J<6OSFOUM*hjCa~wCYcpHcYuHTuwIJKb1&GEzD3-bFsN+O?kbga{RJEds< zkz1E!8s01q`JsAontlVH&eRN^18UR1vCMcnS&?CNOcu}zpqI-TqV;DnZ8)9!q@_q$ zV7iz5ewSO5tQV!H)lK~=7sEWm{`DVeMzB(qgnbj9v?Q^fnf}?u<=VgO_!G9Xv%_>j Na-Ob!F6*2UngBkglVbn? literal 0 HcmV?d00001 diff --git a/master/resources/master.qrc b/master/resources/master.qrc index bb032eff9..05bd9ab3e 100644 --- a/master/resources/master.qrc +++ b/master/resources/master.qrc @@ -1,6 +1,7 @@ zoom-fit-best.png + zoom-fit-best-dark.png camera-photo.png host-offline.png host-online.png @@ -11,16 +12,21 @@ computers.png align-grid.png exchange-positions-zorder.png + exchange-positions-zorder-dark.png powered-on.png + powered-on-dark.png edit-find.png add-group.png remove-group.png edit-select-all.png homerun.png + homerun-dark.png application-menu.png computer-slideshow.png spotlight.png update-realtime-enabled.png + update-realtime-enabled-dark.png update-realtime-disabled.png + update-realtime-disabled-dark.png diff --git a/master/resources/powered-on-dark.png b/master/resources/powered-on-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7cea1b6f7656b849822edcabc5bfb354bf729a0c GIT binary patch literal 2464 zcmc(gcTm%56UToc5J0+=BcK>SkfKx(rGudfK}v`oaKXUQ41_>10Srp-2Ut)}6wr|b z2J(X_+5np>py^ zjw&33DJm%+S5ZBormmrR@|2dgj;`T3BV!X&a|_G!aBCY|JNpX`jtD1b7gsl=JL(ep zijSXvKw!{SY;XuJ6dx8&h#*CgZ^XvMCnlw)XJr18m7R0z_MN-A_wMKYnqTnv3ALoO zj8!|oh5CfNbg_zr_=bwzBY~)9O z3aW^CGagWwMDL5{Zf?a8-i%+bs@qgRWWbLrNeFgq^LNnQh}}n+W9!34#GUPMJpT7LPRm1Iiu2UtR=&%H@Hx zn*tf+l~tew8vEkj<-OewLjWlPWSV2#%*qsbiNY2oA-5{71&Fs4fMSRImUiX8@$NyG zTU6u*EujSi%%k0IlTHIHSs>7LoGl6}1O<{jxE%ht5rF*jP@L~EmRzhB7UB`H(H2UB z#@cA^dTz{po48L?mji?d7|z2y#?%9!0!cHxj+%mLvn9$rz@v{9l_(T0!H!4ojma$Yq}Z}m5)bunNa7Ab zKB5EYI_gczuto)1EsxiLOKE2KP1h*FsCekv0t)JZpOe7+jD{qb%GYd;s5{dqWs+d# z%R$6%HG9#|o)RbXt0Z3^G~`|L44@jJFD@_)QsUw+Tzx))jzZf)HARHI9xrG2b7N=q zt)g0sATVYr?@N*Nxha9t8xsNI~U2D3mm;zOI5F!O3Z4h|H`s#TwX^!(@eRrtkHc^St{h zv2^;hbB5+g4_aksRS+K)#3*op<%cP?PgIhkB{&3%e5?A$ukre+O<6D_aUZd&I28OF z$dYYG@kxi2NpM`^TRtt?puv8rHxgl;2y-`22!-nfPg*^kPF*3YLc#3M^D%oyYZHx4=}!Bwl`PQq^{z?yP<jZH5Qc2pcL7e|5@_O;TX)_L0JM2^_bwH;3C4pu6>F;fm_T*~qu z=_Nz(RuDfPXA|6~N3;5|w8|o#$>)jJm&d(!d&8p4)Dr1J6k4ti(_MzxT^G17w!YX~ zA86+<+HV4x&{=aoTEq|jhVFb^ID02#q&Vj-Q9A|XMX=OyC(`v+gB>8I@q?i;!A1R7 zCmU++4W6%7iaAZ!8xA2{B9blDQiPe(>_`mN6s*v5*?*3dsqo`Oqae~wj-}(X?N~@n zrtd86^6B5L>etm7aPX)?Yt*tf&7J)f zP91!SNa;vRj*@O_XF!Kkc+-}z4J2B>-ZDN_$uD}*A_7c7`UgK_t+o!SpxBaT61TfP zl%y*h_MWb;)(&n|e=3`LTfU%@kXCH$fFl#LBlk1e0elkrE5Ir*=By?nbbsjU_&i0NOI7o;FvwE!?TAT g2MagNuB5%0#N(jaFJ<=R;C=!2)=uzBt1Iz;0&61BkpKVy literal 0 HcmV?d00001 diff --git a/master/resources/update-realtime-disabled-dark.png b/master/resources/update-realtime-disabled-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6d1d266b7787712643e63368e8689d8a9346ff GIT binary patch literal 3016 zcmV;(3pezMP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H13sp%( zK~#9!?VWj$6~!6AXJHR6jTi+9F+{mUw?R*L>1B8dN4L}|p1gn7Q5wdRk-KVK_EK0}aftdlLO=b^yqO`{|xc3ZH_o8}2}ZjZXc~ zpR)h}?FS!Abp9l~53jKCaFjpH$Eq3;m}@caE{i*g`OJqyeCT2DW4- zBzypDiW~q8hHqTEQcb7f_av@Y17M(m&Dcb51!?t(5x5ojJv>#q536-@V3k2&$98DuQY`M0f0&$11S~-fQGQh zZLv#sj>31hy8HSVhp{lz0P!YWBD&xedyI{RyR9C0r2y1}Y;*OxT>gn!-NOKA02{g4KUUIeSl}?4DkCzN#&geoKLh}{mlJ=B zw9(nZVK>xTy(2-;0M>KU;MSl3^4L!M+OOj8v&S7{U_&%sgVhzN?X_+7d#-=H*Dk3RZWC{}+!q7@|NawrnPNAFH~<{Prja1Hf}4OJ2LJ%S2xk1)?y*{D3PVX1 zPUb?UeboUhv)$s9>ib6n4eSIKhu~ZMaU=*X<$~yMr~+ukDH1bSM_dvoi=!C>bSf7z z{ecnyF8FZ{n+NPjb2#pp2GO|DEg>mmi+Wkrdv(Oz(LjU!+L_}I6T(u^KyPu2p*#Sq z8~4siLv$pc?Q$R}4`$-1=^=VE7kIx`8UW{5ei_byp#z+`Lv@vE^@a`b7e()IzYY5Y zX#lXn_Wt9c2jfzQ9+<9lht_qjH65gc{#mg#;BLp;d^xLE==pf9BfV{5N6BlOu!&He z0{5v({>kcN_YB>Vwr=lhgzd5;IxKklv|}2ql(Z)IbNb^qN{*3z4Z2+pz%1KEf6x@L zJmf%dn=q=d)+Gy+kj+1%fd;%`n|QyM17J@;4b!wJJ?Ic+uTL)T3ObVu#V7_l&#Uut z+m&l&0OX%9VXj*|+H3REH#wHWu^vJA37$!C1cWp4V<6d?GsN?S0JuxO*5|`peI2=_ zZ=B`ObRhlAw;HGlJ1Jp5ZF`;VgaFb~kO&ALXtm8=cZf6B_KS|N(!XZdO^pejxzS(m z2)qFLqE_>?HJssN_o*Ojb2`m#z4OYCO$?I%hu3VA?h)|_m=h!j8aR1@@DI$x1~3wi z`4&nq6y<~^bK0}T09M#8xJR>#(wJY@0pSok>_6+1H-?yY!)^C^S3CuFXto0R4wWgD zMt=!qAx*GSZoCOcz*qiV(tzOalER;%arKm%pwj#kF@U3)24Hn#;_Vc*uux*hkTL-H zN(|ssrU9VA1d!n)l?;RufYV|CXEP7Lu^8Gy=P)vi@g)F|6a%0U0I2r3`#CxdF9~^X zfnLdu5#YMJgeCAA4fpm3kPrhn5`hjF;|gH37Pz9V6(RtljZa#vfg-luC01ORc>wea z@d&Uv52Esd;9h|p0oxvCBZkW4mB*2CKS8!#+3*)v%t8*7NpVN5m+bJnx7B z%(K0jaamUlsH$&>4Zs|+FJLb*dF4U}0DrW-&_~51;7%KWzh3YoV4F<|{#+ar?Bu^} zTwpEVo{_*dVgQBqxD0l&Y*DiPf2IjHH z0RZV!a)}YU8r&b%mY58$2DiZ}w_KEajg>8aAKW+3WQ#Y74RWuX7dfUZJ`yA+<39-i09)H@Jj2%sg%rOJsSYGQ5+v1TpCGluZ*x9D)A|#?q9ZvG zSbQW%j#so-20(8LUo5R_#V6ZCiH`)yu5pbO0iXe!?MGu^%lZL8W`q_W36dAo0Spgb zo1<~|cP3N|0P1cR_?DM&TPBjx9FxGk|20~~M}p)%RR9Lu?g(8MMEw4XwTX|U)@=-k ze5emN1e2o$5SynF0FsxL0a(4cEs!s0aWJc!{snk~tdcfT#gMQ0ua{@fT#m7XenRd80^HJ04i{~ZUAIy003yf%N&5MnM-Ba zM!;v<0qhP002|wm(5Q;&+#o}<3PghBL@)pbwn-H-Rz_zF5KB9NWKaMG9RL(+qjif( zQagZ}zyQ!-zlD*4-?XrL!caDjJ*El3N$miRhXCNxnp-`fj7_97VKLj1R^vbHVpD?l z)*cqZS~%cYPqt216qzj3ZU-#U0ie*gkc#Q6FD5bVBf!)$1?UtX01JW@Gr7isN_7K> zm*~*}tvt6jNS_uX1)xx~8a!TJph*cjjx0)5`N{^+<;w5KT%7=7bClg-&q>hFa|)cL zGi9QOasbS(q*h}Sby$_GG! z-Ps;fM7D(%f2UWTI8?oFTK@2)>qck3)xc($$0}eH9pv0f4G*vwEMlKP61d=Hyj{S= zXk9y6(N;M%CZz`!rI)(X66x(w!VjwO6$xf9ayqd1r{g^XBuAwtK}qUZgY$!%4s>pj z4)h%n$FXhkp5$n-5Qy0?NP1kU5Y_e}g*nWc_le$CH#Q0W=DQ`@e~a7o zF8;xd=DQNsVJ%q^zdm@8lu8qS?yMQy3A16n@1Y3XxdKo{pM=3)rLr#!gk8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H14VOto zK~#9!?Oh9yRK*oVS(cv?F@{e_LX@BQ2Q^B9$*R$E+21TkSq4lnRUuW0NsJm|kQFed zj33k>Agd@9<0oujW_A^!BvztP11Javj0Opm2@qHqWS7tWW;f?TZ=6icboYC&`@Mc| zd#g^(?C#8a-F?sNzW4UMx4U(8bab=my0C*_31A1o62QU|z`_#1!V-VZ^*~dGa8;odcpI1x+=zP)QqbGfUV6KNN#rg@M}^fWWx`5k5fMW}=N>l<5n;lVsn$*%E+{lQ6i~ z(i#q=O%r?$P#agG%~$8^6aIHi=jTD14VD18(H#Rc1p~At1VYaVwEbP`1N9}NUj^BH z0wKO;36Sx`V^F?DQ)*ZRpMwY_@N()O-rthrGrzY4I59Pj!(gmaH1G$2SAfSc=y%{X z#!N%*_wbpE@j4OTxee|44c@N-K2g-BH(0x}|K5WB59!JTIGx$*UbOjt0ZV}I;(DWL zCds3Gaj%naRw9!P|Njo~B(O(=5_wOTBmg=;$?bq*(Eb7Z8c*$4@(ElK0kUy2?s+-x zeIM|lA`<)u*X`Mr2+*5Nu}%l78K}W`zv+^2DhQD6lb~gz8aU>W1UGdF0+4GJ0{pwf z!P&>`>;WEU9OVSaz(D4wNVz1y`p6Rioh$_oIT(~in&$D{&nUXTP6Bk|6cFL(Zj?vN zCYME(04HHkW;;;yAotdJ_}*s~6VML=bmDVN^LIjmXQM~}a_TI0U^j1a>0dXE00SM) zcD|d0e%z!Go%(}h=Z}!hPTn$&OOS5_V5Y4b$I{XAOLNoNSJy@fifGEDHRJbhm9wh#aEh6fMF8OkHhH5H>_~Qfvq{Lh<*6`mrNx< zPZm+j6F&XKtZ>DiL>2*+Gsp!0?_(SRSVS&2h>~s9Dm61PAm7JzUx<+K3t6BmZ!G5< zMF3KEB%B*nii1arvIZ&^Atka(WIdt(UpIvSr&4&cpuu$tO}#IWot#6_+#aFi4e}#A zFBsE*(ozvP0l>sZ1r6Ov5kCqBr4Q4Hk8x(1J0r9d^c8KHInb^<08RRRus^HP{D=wBuFsbPv?zJU5I8h zL1_C~$_XIYqWmaG#|sAJDw*6uKNM8*LXsm2NNCyjBiDb*Ry8FG1!v)uhkB>{M8PB$86B2AMJ$~Kp|cV{r?Q=7xIulbrx;OU%u zzOIS@1zClavrUc>2JWA)moN*R1glWU`wSPU-v7&m&@l^8GOfT3Uf`Jkf}4C|;=Vg= zib!N99qN!M_)N8kfcHJr{aM4RmgypU1Lxr!?wJ625*<77s=?l}XC;KQm~)L$q%eA^ z9W1MedFf<6OCups<}En_sDew#do9*RUi<24glaVGWx6$Gf`++dR78z;R*b~?i@4CHPv z>pXO&^8#Axrf}NzqKYM8li?mf(Ev@>SP1$fx_-dUuOh+h=6MGA*vlXpLV`al7W`qh z|Iy2bwtJ~k{x=l_*c)~N&{j6pqET^73|r?1`AA+b?fqB<0S<v1sO)RpU? zkpK-U2yi3{1duQZ^M;p`br6)p%Oe4rRS=*xA_Qo3*!H8WM)9cux7(AhVrPI)`?1b} z@)}lX`2>2hQ@ms%hzp}Y04l$$ zVg^{taRiMu-4T?%Kfoga6aJ7e^+^yAtHcqsnsbBFkXGTMquaJK{f3mox7f5_7`Fbf zgRJt&XSoUjRCAt~pW2#!f$KJRa|p0d#a;lfM9Je;2!YQ4zvVojx2c!`DmVoAqZLBn zGr&fU5_p}8n849q%nS>?X>q(<2>c9HL4ZPDbPRq*T0sO?P#RD9{dwvnG|ITIJ*S0f zsQ+u>93$Bo$ByGQRpg;PZ3SRPd0AFLt&Oe!_o_?`;VFVUIwE%DOUSK)Vzz}}tc(Dx zLRCA*BY24&d^r>?oz|-?UU^knB6d${B31`{2&8~C1HJ#CG+tR-lB}3pQd@py@yo?d z50xIJG&xkl+_>Kgmyfa)6UUY&E1rOG4+0$yk)rRG*Ore_-7Y5txJyvF+%5w-Fd-4U z2m)N~Lg+bBmaJHX+2KOp3BWRCj5+k!bWE<9+#3RW6lhZ={0y{W33-H;6F&*iO;C&H zcUJK1sgGBV#8bLigW&%kxChJeJtD67jWJF5 z4DGVBfY+U;R|O=P8EKn85vw+o0HhEu(oO(Y7@3!L-Grs!+$aj4cIep7U5BCA4~w8s zD*@On@R+Dtmh9GKm_XaK1`Gd$MUbqxLOTJdShC*ve9|LoN}rC zBDMsij3)pTK|cvV7@DKd;?gMk17K#ggn$6eeiNWGU752Dr-Mx-0By7wt_ap&Ts^&qQA!{N_<5)Gc~ys+ zt1N3*60clr@bte>rVoCXG#lq)2{=L)f~q(}l?0%mi{rr;1_p#ssG4yEkO(N{E(ajO zFTK|BQ(f2+gT2x~0@P^_3DZ>9PWEh`HSDC0f}jadR#$eeVQ%48*{44!M^I0%hfrh| zr@*Z6AZl0iplTMYUP*sd&!1r2OTE^ttfO1KI9=xq= z79O_I0MFlMry0Y6)$GlaV|c*9q0AyQF@2*tolei9r3b{jR_0)7;3f)SAwto)JIs7t zB#00m?sHOTHue@LV#BnjhAGqqmgOtc4nd9AaL|)iq(wClSY~iT0K#vWP+RV*Oiz$i zuE%Euk8aJLw&~nnnS-GH0&P^GUER5vLJ$N!jeZ7wVCo;|S9-X%GN&Z$eC5yZzpI%O zsmTBm%#uhL8Sax#u))o=Zwvu2pf|IDO-O#{GzefiuV9rApy1c*W%34K9zLWaZ;;H+ zl6d8VE~M3A@ ziaIb-G%@UFe_MY1Gx)5`uAU`;g(ZN6C4hw`fQ2Q1g(ZN6C4hw`fQ1PE1@|R#A&Lvh Qi~s-t07*qoM6N<$g3eup@&Et; literal 0 HcmV?d00001 diff --git a/master/resources/zoom-fit-best-dark.png b/master/resources/zoom-fit-best-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..31a3feb6973d81d26226e564777e08f444aa6382 GIT binary patch literal 551 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg`mX84zY%eyHLVP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXpdz6FpAgso|Ns95gWq8A=g*&b z?(ZOrSWANZf*H!|8#*?hQ(C~lz}V{P;uw-~@9hmoJ|;yT)(e>y&fjGY`hK6&IOTWz zQ3>NhiOin|{9f|S*;B)K@S#Q7+gn>-hdm9N{%*pr^E>3b)-f)evW3M%a~D%fxVA3C zr>vJY0{70E@SfPc(xBiq*Ym?G|L1HD_H%gN@Zsd_Weh(Vte9I~Pgu(7u&$wxIkX{~ zg=2!$g_)Tp-}`v~s3qj;y;IxN7|+_YHQ?O7D~wCnGt?bkG9K+$sCD?uP9}|B zK&`@Vb>Xj#FXa2~Fn@aW@!yUA6U{b!5!x8P>z~krD&D7w4Ot3(^{i&h4Gc3GFF2-X zGjL51Wtit?#&m!|l9BI+)1-XHwtSP9VhMkOro9%FU|%8E*x8-AZdn4;f-J5yz2}zt k_ujR$bG-ou=lj>3b1nxvr=*oh0%M55)78&qol`;+0He<0V*mgE literal 0 HcmV?d00001 diff --git a/master/src/ComputerMonitoringWidget.cpp b/master/src/ComputerMonitoringWidget.cpp index 050199417..e114a1b2a 100644 --- a/master/src/ComputerMonitoringWidget.cpp +++ b/master/src/ComputerMonitoringWidget.cpp @@ -164,8 +164,16 @@ void ComputerMonitoringWidget::setIconSize( const QSize& size ) void ComputerMonitoringWidget::setColors( const QColor& backgroundColor, const QColor& textColor ) { auto pal = palette(); - pal.setColor( QPalette::Base, backgroundColor ); - pal.setColor( QPalette::Text, textColor ); + if (VeyonCore::useDarkMode()) + { + pal.setColor(QPalette::Base, textColor); + pal.setColor(QPalette::Text, backgroundColor); + } + else + { + pal.setColor(QPalette::Base, backgroundColor); + pal.setColor(QPalette::Text, textColor); + } setPalette( pal ); } diff --git a/master/src/MainToolBar.cpp b/master/src/MainToolBar.cpp index fd7c0458f..d47231e26 100644 --- a/master/src/MainToolBar.cpp +++ b/master/src/MainToolBar.cpp @@ -21,7 +21,6 @@ * USA. */ -#include #include #include "MainToolBar.h" diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 541e16d37..e4e0af54c 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -226,10 +226,11 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : // initialize computer placement controls auto customComputerPositionsControlMenu = new QMenu; - customComputerPositionsControlMenu->addAction(QIcon(QStringLiteral(":/core/document-open.png")), + const auto darkSuffix = VeyonCore::useDarkMode() ? QStringLiteral("-dark") : QString(); + customComputerPositionsControlMenu->addAction(QIcon(QStringLiteral(":/core/document-open%1.png").arg(darkSuffix)), tr("Load computer positions"), this, &MainWindow::loadComputerPositions); - customComputerPositionsControlMenu->addAction(QIcon(QStringLiteral(":/core/document-save.png")), + customComputerPositionsControlMenu->addAction(QIcon(QStringLiteral(":/core/document-save%1.png").arg(darkSuffix)), tr("Save computer positions"), this, &MainWindow::saveComputerPositions); ui->useCustomComputerPositionsButton->setMenu(customComputerPositionsControlMenu); @@ -252,6 +253,16 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : btn->setIconSize(QSize(20, 20)); } + if (VeyonCore::useDarkMode()) + { + ui->aboutButton->setIcon(QIcon(QStringLiteral(":/core/help-about-dark.png"))); + ui->filterComputersWithLoggedOnUsersButton->setIcon(QIcon(QStringLiteral(":/core/user-group-new-dark.png"))); + ui->autoAdjustComputerIconSizeButton->setIcon(QIcon(QStringLiteral(":/master/zoom-fit-best-dark.png"))); + ui->alignComputersButton->setIcon(QIcon(QStringLiteral(":/master/homerun-dark.png"))); + ui->useCustomComputerPositionsButton->setIcon(QIcon(QStringLiteral(":/master/exchange-positions-zorder-dark.png"))); + ui->filterPoweredOnComputersButton->setIcon(QIcon(QStringLiteral(":/master/powered-on-dark.png"))); + } + // create the main toolbar ui->toolBar->layout()->setSpacing( 2 ); ui->toolBar->toggleViewAction()->setEnabled( false ); diff --git a/master/src/ScreenshotManagementPanel.cpp b/master/src/ScreenshotManagementPanel.cpp index 6e3aa90f6..725df1773 100644 --- a/master/src/ScreenshotManagementPanel.cpp +++ b/master/src/ScreenshotManagementPanel.cpp @@ -62,6 +62,11 @@ ScreenshotManagementPanel::ScreenshotManagementPanel( QWidget *parent ) : connect( ui->showBtn, &QPushButton::clicked, this, &ScreenshotManagementPanel::showScreenshot ); connect( ui->deleteBtn, &QPushButton::clicked, this, &ScreenshotManagementPanel::deleteScreenshot ); + if (VeyonCore::useDarkMode()) + { + ui->showBtn->setIcon(QIcon(QStringLiteral(":/core/edit-find-dark.png"))); + } + updateModel(); } diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index bc5b1e0d4..9048a2561 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -47,6 +47,16 @@ SlideshowPanel::SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* co ui->monitoringWidget->setSelectionMode( QListView::SingleSelection ); ui->monitoringWidget->setModel( m_model ); + if (VeyonCore::useDarkMode()) + { + QIcon startStopIcon; + startStopIcon.addPixmap(QPixmap(QStringLiteral(":/core/media-playback-pause-dark.png")), QIcon::Mode::Normal, QIcon::State::On); + startStopIcon.addPixmap(QPixmap(QStringLiteral(":/core/media-playback-start-dark.png")), QIcon::Mode::Normal, QIcon::State::Off); + ui->startStopButton->setIcon(startStopIcon); + ui->showPreviousButton->setIcon(QIcon(QStringLiteral(":/core/go-previous-dark.png"))); + ui->showNextButton->setIcon(QIcon(QStringLiteral(":/core/go-next-dark.png"))); + } + connect( ui->startStopButton, &QAbstractButton::toggled, this, &SlideshowPanel::updateDuration ); connect( ui->durationSlider, &QSlider::valueChanged, this, &SlideshowPanel::updateDuration ); diff --git a/master/src/SpotlightPanel.cpp b/master/src/SpotlightPanel.cpp index 83ee542f9..4861f5d59 100644 --- a/master/src/SpotlightPanel.cpp +++ b/master/src/SpotlightPanel.cpp @@ -50,6 +50,16 @@ SpotlightPanel::SpotlightPanel( UserConfig& config, ComputerMonitoringWidget* co ui->monitoringWidget->setIgnoreWheelEvent( true ); ui->monitoringWidget->setModel( m_model ); + if (VeyonCore::useDarkMode()) + { + QIcon realtimeViewIcon; + realtimeViewIcon.addPixmap(QPixmap(QStringLiteral(":/master/update-realtime-enabled-dark.png")), QIcon::Mode::Normal, QIcon::State::On); + realtimeViewIcon.addPixmap(QPixmap(QStringLiteral(":/master/update-realtime-disabled-dark.png")), QIcon::Mode::Normal, QIcon::State::Off); + ui->realtimeViewButton->setIcon(realtimeViewIcon); + ui->addButton->setIcon(QIcon(QStringLiteral(":/core/go-up-dark.png"))); + ui->removeButton->setIcon(QIcon(QStringLiteral(":/core/go-down-dark.png"))); + } + connect( ui->addButton, &QAbstractButton::clicked, this, &SpotlightPanel::add ); connect( ui->removeButton, &QAbstractButton::clicked, this, &SpotlightPanel::remove ); connect( ui->realtimeViewButton, &QAbstractButton::toggled, this, &SpotlightPanel::setRealtimeView ); From da3fd703dc735214b33f6af124a317a86d8bbda8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 13:48:19 +0100 Subject: [PATCH 1723/1765] VariantStream: add missing includes --- core/src/VariantStream.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/VariantStream.cpp b/core/src/VariantStream.cpp index 3f39895dd..6e4f05df7 100644 --- a/core/src/VariantStream.cpp +++ b/core/src/VariantStream.cpp @@ -22,7 +22,9 @@ * */ +#include #include +#include #include "VariantStream.h" From a5987c0515aa59ec250f6fccaf709235d099e7c1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 14:20:15 +0100 Subject: [PATCH 1724/1765] ServiceControl: use displayName for operation titles --- core/src/ServiceControl.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/src/ServiceControl.cpp b/core/src/ServiceControl.cpp index dd1f6934b..123448f99 100644 --- a/core/src/ServiceControl.cpp +++ b/core/src/ServiceControl.cpp @@ -60,8 +60,8 @@ bool ServiceControl::isServiceRunning() void ServiceControl::startService() { - serviceControl( tr( "Starting service %1" ).arg( m_name ), - QtConcurrent::run( [=]() { VeyonCore::platform().serviceFunctions().start( m_name ); } ) ); + serviceControl(tr("Starting %1").arg(m_displayName), + QtConcurrent::run([=]() { VeyonCore::platform().serviceFunctions().start(m_name); })); } @@ -69,15 +69,15 @@ void ServiceControl::startService() void ServiceControl::stopService() { - serviceControl( tr( "Stopping service %1" ).arg( m_name ), - QtConcurrent::run( [=]() { VeyonCore::platform().serviceFunctions().stop( m_name ); } ) ); + serviceControl(tr("Stopping %1").arg(m_displayName), + QtConcurrent::run([=]() { VeyonCore::platform().serviceFunctions().stop(m_name); })); } void ServiceControl::restartService() { - serviceControl(tr("Restarting service %1").arg(m_name), + serviceControl(tr("Restarting %1").arg(m_displayName), QtConcurrent::run([=]() { VeyonCore::platform().serviceFunctions().stop(m_name); VeyonCore::platform().serviceFunctions().start(m_name); @@ -88,19 +88,19 @@ void ServiceControl::restartService() void ServiceControl::registerService() { - serviceControl( tr( "Registering service %1" ).arg( m_name ), - QtConcurrent::run( [=]() { VeyonCore::platform().serviceFunctions().install( m_name, - m_filePath, - PlatformServiceFunctions::StartMode::Auto, - m_displayName ); } ) ); + serviceControl(tr("Registering %1").arg(m_displayName), + QtConcurrent::run([=]() { VeyonCore::platform().serviceFunctions().install(m_name, + m_filePath, + PlatformServiceFunctions::StartMode::Auto, + m_displayName ); })); } void ServiceControl::unregisterService() { - serviceControl( tr( "Unregistering service %1" ).arg( m_name ), - QtConcurrent::run( [=]() { VeyonCore::platform().serviceFunctions().uninstall( m_name ); } ) ); + serviceControl(tr("Unregistering %1").arg(m_displayName), + QtConcurrent::run([=]() { VeyonCore::platform().serviceFunctions().uninstall( m_name ); })); } From c4cdff4eb06dce28522f165ff8e50bf613ba5576 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 15:19:26 +0100 Subject: [PATCH 1725/1765] ServiceControl: revert to synchronous waiting for op to complete --- core/src/ServiceControl.cpp | 24 ++++++++++++------------ core/src/ServiceControl.h | 6 +++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/src/ServiceControl.cpp b/core/src/ServiceControl.cpp index 123448f99..d82723e5f 100644 --- a/core/src/ServiceControl.cpp +++ b/core/src/ServiceControl.cpp @@ -23,7 +23,7 @@ */ #include -#include +#include #include "PlatformServiceFunctions.h" #include "ServiceControl.h" @@ -106,21 +106,21 @@ void ServiceControl::unregisterService() -void ServiceControl::serviceControl(const QString& title, Operation&& operation) +void ServiceControl::serviceControl(const QString& title, const Operation& operation) { if (m_parent) { - graphicalFeedback(title, std::move(operation)); + graphicalFeedback(title, operation); } else { - textFeedback(title, std::move(operation)); + textFeedback(title, operation); } } -void ServiceControl::graphicalFeedback(const QString& title, Operation&& operation) +void ServiceControl::graphicalFeedback(const QString& title, const Operation& operation) { auto toast = new Toast(m_parent); toast->setTitle(tr("Service control")); @@ -129,18 +129,18 @@ void ServiceControl::graphicalFeedback(const QString& title, Operation&& operati toast->setDuration(0); toast->show(); -#if QT_VERSION >= QT_VERSION_CHECK(6, 1, 0) - operation.then(toast, [=]() { toast->hide(); }); -#else - operation.waitForFinished(); - toast->hide(); -#endif + while (operation.isRunning()) + { + QCoreApplication::processEvents(); + QThread::msleep(10); + } + toast->hide(); } -void ServiceControl::textFeedback(const QString& title, Operation&& operation) +void ServiceControl::textFeedback(const QString& title, const Operation& operation) { printf( "%s", qUtf8Printable( title ) ); diff --git a/core/src/ServiceControl.h b/core/src/ServiceControl.h index 77d79b9a5..bbd9f31e7 100644 --- a/core/src/ServiceControl.h +++ b/core/src/ServiceControl.h @@ -53,9 +53,9 @@ class VEYON_CORE_EXPORT ServiceControl : public QObject private: using Operation = QFuture; - void serviceControl(const QString& title, Operation&& operation); - void graphicalFeedback(const QString &title, Operation&& operation); - void textFeedback(const QString &title, Operation&& operation); + void serviceControl(const QString& title, const Operation& operation); + void graphicalFeedback(const QString &title, const Operation& operation); + void textFeedback(const QString &title, const Operation& operation); const QString m_name; const QString m_filePath; From 5da127e34e1ceb23a2f6d3dc27ebe7587769acf1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 19 Mar 2025 15:27:04 +0100 Subject: [PATCH 1726/1765] ServerAccessControlManager: indicate denied access more explicitly This amends commit 89ad77d548e8b51ff53603b2affe11623137899e. --- server/src/ServerAccessControlManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/ServerAccessControlManager.cpp b/server/src/ServerAccessControlManager.cpp index 232ba4740..308df349b 100644 --- a/server/src/ServerAccessControlManager.cpp +++ b/server/src/ServerAccessControlManager.cpp @@ -226,7 +226,7 @@ void ServerAccessControlManager::finishDesktopAccessConfirmation( VncServerClien else { client->setAccessControlState( VncServerClient::AccessControlState::Failed ); - client->setAccessControlDetails(tr("User did not confirm access")); + client->setAccessControlDetails(tr("User has denied access")); } } From 81755b6120b164d5bb9b9c50208630e9835b309d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 Mar 2025 12:03:05 +0100 Subject: [PATCH 1727/1765] HeadlessVncServer: include RFB log messages in our own logging --- .../vncserver/headless/HeadlessVncServer.cpp | 36 +++++++++++++++++++ .../vncserver/headless/HeadlessVncServer.h | 3 ++ 2 files changed, 39 insertions(+) diff --git a/plugins/vncserver/headless/HeadlessVncServer.cpp b/plugins/vncserver/headless/HeadlessVncServer.cpp index 51ca50383..5cdc23a4d 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.cpp +++ b/plugins/vncserver/headless/HeadlessVncServer.cpp @@ -64,6 +64,17 @@ void HeadlessVncServer::prepareServer() bool HeadlessVncServer::runServer( int serverPort, const Password& password ) { + if (VeyonCore::isDebugging()) + { + rfbLog = rfbLogDebug; + rfbErr = rfbLogDebug; + } + else + { + rfbLog = rfbLogNone; + rfbErr = rfbLogNone; + } + HeadlessVncScreen screen; if( initScreen( &screen ) == false || @@ -148,4 +159,29 @@ bool HeadlessVncServer::initVncServer( int serverPort, const VncServerPluginInte } + +void HeadlessVncServer::rfbLogDebug(const char* format, ...) +{ + va_list args; + va_start(args, format); + + static constexpr int MaxMessageLength = 256; + char message[MaxMessageLength]; + + vsnprintf(message, sizeof(message), format, args); + message[MaxMessageLength-1] = 0; + + va_end(args); + + vDebug() << message; +} + + + +void HeadlessVncServer::rfbLogNone(const char* format, ...) +{ + Q_UNUSED(format); +} + + IMPLEMENT_CONFIG_PROXY(HeadlessVncConfiguration) diff --git a/plugins/vncserver/headless/HeadlessVncServer.h b/plugins/vncserver/headless/HeadlessVncServer.h index 8c0b80811..59d70bb9b 100644 --- a/plugins/vncserver/headless/HeadlessVncServer.h +++ b/plugins/vncserver/headless/HeadlessVncServer.h @@ -108,6 +108,9 @@ class HeadlessVncServer : public QObject, VncServerPluginInterface, PluginInterf bool handleScreenChanges( HeadlessVncScreen* screen ); + static void rfbLogDebug(const char* format, ...); + static void rfbLogNone(const char* format, ...); + HeadlessVncConfiguration m_configuration; }; From 3c35efb818c83d00888d66442219ddd15ab9a047 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 21 Mar 2025 13:45:55 +0100 Subject: [PATCH 1728/1765] ComputerItemDelegate: fix overlay icons position --- master/src/ComputerItemDelegate.cpp | 15 ++++++++------- master/src/ComputerItemDelegate.h | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/master/src/ComputerItemDelegate.cpp b/master/src/ComputerItemDelegate.cpp index 58bc551ba..5b299e7fc 100644 --- a/master/src/ComputerItemDelegate.cpp +++ b/master/src/ComputerItemDelegate.cpp @@ -43,7 +43,8 @@ void ComputerItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& if (index.isValid() && index.model()) { - drawFeatureIcons(painter, index.model()->data(index, ComputerControlListModel::ControlInterfaceRole).value()); + drawFeatureIcons(painter, option.rect.topLeft(), + index.model()->data(index, ComputerControlListModel::ControlInterfaceRole).value()); } } @@ -62,7 +63,7 @@ void ComputerItemDelegate::initFeaturePixmaps() -void ComputerItemDelegate::drawFeatureIcons(QPainter* painter, ComputerControlInterface::Pointer controlInterface) const +void ComputerItemDelegate::drawFeatureIcons(QPainter* painter, const QPoint& pos, ComputerControlInterface::Pointer controlInterface) const { if (painter && controlInterface && @@ -82,21 +83,21 @@ void ComputerItemDelegate::drawFeatureIcons(QPainter* painter, ComputerControlIn return; } + int x = pos.x() + OverlayIconsPadding; + const int y = pos.y() + OverlayIconsPadding; + painter->setRenderHint(QPainter::Antialiasing); painter->setBrush(QColor(255, 255, 255, 192)); painter->setPen(QColor(25, 140, 179)); - painter->drawRoundedRect(QRect(OverlayIconsPadding, OverlayIconsPadding, - count * (OverlayIconSize + OverlayIconSpacing), OverlayIconSize), + painter->drawRoundedRect(QRect(x, y, count * (OverlayIconSize + OverlayIconSpacing), OverlayIconSize), OverlayIconsRadius, OverlayIconsRadius); - int x = OverlayIconsPadding; - for (const auto& feature : controlInterface->activeFeatures()) { const auto it = m_featurePixmaps.find(feature); if (it != m_featurePixmaps.constEnd()) { - painter->drawPixmap(QPoint(x, OverlayIconsPadding), *it); + painter->drawPixmap(QPoint(x, y), *it); x += OverlayIconSize + OverlayIconSpacing; } } diff --git a/master/src/ComputerItemDelegate.h b/master/src/ComputerItemDelegate.h index 9ccc5e67e..96835bd35 100644 --- a/master/src/ComputerItemDelegate.h +++ b/master/src/ComputerItemDelegate.h @@ -39,7 +39,7 @@ class ComputerItemDelegate : public QStyledItemDelegate private: void initFeaturePixmaps(); - void drawFeatureIcons(QPainter* painter, ComputerControlInterface::Pointer controlInterface) const; + void drawFeatureIcons(QPainter* painter, const QPoint& pos, ComputerControlInterface::Pointer controlInterface) const; static constexpr int OverlayIconSize = 32; static constexpr int OverlayIconSpacing = 4; From f75861b5bbadc224c8b1b7e6690b1595524d5870 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:33:05 +0200 Subject: [PATCH 1729/1765] NetworkObjectDirectory: move ComputerNameSource to Computer::NameSource --- core/src/Computer.h | 14 ++++++++++++++ core/src/NetworkObjectDirectory.h | 13 ------------- core/src/VeyonConfigurationProperties.h | 3 ++- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/core/src/Computer.h b/core/src/Computer.h index 2c3897493..3a1bbfa91 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -33,7 +33,21 @@ class VEYON_CORE_EXPORT Computer { + Q_GADGET public: + enum class NameSource + { + Default, + HostAddress, + SessionClientAddress, + SessionClientName, + SessionHostName, + SessionMetaData, + UserFullName, + UserLoginName, + }; + Q_ENUM(NameSource) + explicit Computer( NetworkObject::Uid networkObjectUid = NetworkObject::Uid(), const QString& displayName = {}, const QString& hostAddress = {}, diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index 3d468786d..99620e091 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -41,19 +41,6 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject MaximumUpdateInterval = 3600 }; - enum class ComputerNameSource - { - Default, - HostAddress, - SessionClientAddress, - SessionClientName, - SessionHostName, - SessionMetaData, - UserFullName, - UserLoginName, - }; - Q_ENUM(ComputerNameSource) - explicit NetworkObjectDirectory( const QString& name, QObject* parent ); const QString& name() const diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 4176316fd..b5623b45b 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -31,6 +31,7 @@ #include #include "ComputerListModel.h" +#include "Computer.h" #include "Logger.h" #include "NetworkObjectDirectory.h" #include "PlatformSessionFunctions.h" @@ -145,7 +146,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, autoOpenComputerSelectPanel, setAutoOpenComputerSelectPanel, "AutoOpenComputerSelectPanel", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, confirmUnsafeActions, setConfirmUnsafeActions, "ConfirmUnsafeActions", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, showFeatureWindowsOnSameScreen, setShowFeatureWindowsOnSameScreen, "ShowFeatureWindowsOnSameScreen", "Master", false, Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), NetworkObjectDirectory::ComputerNameSource, computerNameSource, setComputerNameSource, "ComputerNameSource", "Master", QVariant::fromValue(NetworkObjectDirectory::ComputerNameSource::Default), Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), Computer::NameSource, computerNameSource, setComputerNameSource, "ComputerNameSource", "Master", QVariant::fromValue(Computer::NameSource::Default), Configuration::Property::Flag::Advanced ) \ #define FOREACH_VEYON_AUTHENTICATION_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), QStringList, enabledAuthenticationPlugins, setEnabledAuthenticationPlugins, "EnabledPlugins", "Authentication", QStringList(), Configuration::Property::Flag::Standard ) \ From 1d128215de3242adf720dda58290f39747ea61cc Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:33:34 +0200 Subject: [PATCH 1730/1765] ComputerControlInterface: add computerName() and computerNameSource() --- core/src/ComputerControlInterface.cpp | 31 ++++++++++++++++++++++++++- core/src/ComputerControlInterface.h | 8 +++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index d408015c0..c9fdf38db 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -36,7 +36,8 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, int port, QObject* parent ) : QObject( parent ), m_computer( computer ), - m_port( port ) + m_port(port), + m_computerNameSource(VeyonCore::config().computerNameSource()) { m_pingTimer.setInterval(ConnectionWatchdogPingDelay); m_pingTimer.setSingleShot(true); @@ -137,6 +138,34 @@ void ComputerControlInterface::stop() +QString ComputerControlInterface::computerName() const +{ + const auto propertyOrFallback = [this](const QString& value) + { + return value.isEmpty() ? + (computer().displayName().isEmpty() ? computer().hostName() : computer().displayName()) + : + value; + }; + + switch (computerNameSource()) + { + case Computer::NameSource::HostAddress: return propertyOrFallback(computer().hostName()); + case Computer::NameSource::SessionClientName: return propertyOrFallback(sessionInfo().clientName); + case Computer::NameSource::SessionClientAddress: return propertyOrFallback(sessionInfo().clientAddress); + case Computer::NameSource::SessionHostName: return propertyOrFallback(sessionInfo().hostName); + case Computer::NameSource::SessionMetaData: return propertyOrFallback(sessionInfo().metaData); + case Computer::NameSource::UserFullName: return propertyOrFallback(userFullName()); + case Computer::NameSource::UserLoginName: return propertyOrFallback(userLoginName()); + default: + break; + } + + return propertyOrFallback({}); +} + + + bool ComputerControlInterface::hasValidFramebuffer() const { return vncConnection() && vncConnection()->hasValidFramebuffer(); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index d766ea7f3..5f0839aa6 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -81,6 +81,13 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_computer; } + QString computerName() const; + + Computer::NameSource computerNameSource() const + { + return m_computerNameSource; + } + State state() const { return m_state; @@ -224,6 +231,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab const int m_port; UpdateMode m_updateMode{UpdateMode::Disabled}; + Computer::NameSource m_computerNameSource{Computer::NameSource::Default}; State m_state{State::Disconnected}; QString m_userLoginName{}; From 825417151b98f2834a87522bf3933739f33230f4 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:36:26 +0200 Subject: [PATCH 1731/1765] ComputerManager: use new CCI::computerName() method --- master/src/ComputerManager.cpp | 63 +++++++++++++--------------------- master/src/ComputerManager.h | 2 -- 2 files changed, 23 insertions(+), 42 deletions(-) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 984fa0610..4d9c0465b 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -50,8 +50,7 @@ ComputerManager::ComputerManager( UserConfig& config, QObject* parent ) : m_computerTreeModel( new CheckableItemProxyModel( NetworkObjectModel::UidRole, this ) ), m_networkObjectFilterProxyModel( new NetworkObjectFilterProxyModel( this ) ), m_localHostNames( QHostInfo::localHostName().toLower() ), - m_localHostAddresses(QHostInfo::fromName(QHostInfo::localHostName()).addresses()), - m_computerNameSource(VeyonCore::config().computerNameSource()) + m_localHostAddresses(QHostInfo::fromName(QHostInfo::localHostName()).addresses()) { if( m_networkObjectDirectory == nullptr ) { @@ -156,23 +155,15 @@ void ComputerManager::updateUser(const ComputerControlInterface::Pointer& contro } m_networkObjectOverlayDataModel->setData(mapToUserNameModelIndex(networkObjectIndex), user); - QString computerName; - switch (m_computerNameSource) + if (controlInterface->computerNameSource() == Computer::NameSource::UserFullName || + controlInterface->computerNameSource() == Computer::NameSource::UserLoginName) { - case NetworkObjectDirectory::ComputerNameSource::UserFullName: - computerName = controlInterface->userFullName(); - break; - case NetworkObjectDirectory::ComputerNameSource::UserLoginName: - computerName = controlInterface->userLoginName(); - break; - default: - break; - } - - if (computerName.isEmpty() == false) - { - m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), - computerName); + const auto computerName = controlInterface->computerName(); + if (computerName.isEmpty() == false) + { + m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), + computerName); + } } } } @@ -194,34 +185,26 @@ void ComputerManager::updateSessionInfo(const ComputerControlInterface::Pointer& m_networkObjectOverlayDataModel->setData(mapToSessionUptimeModelIndex(networkObjectIndex), uptimeString, Qt::DisplayRole); - QString computerName; - switch (m_computerNameSource) + switch (controlInterface->computerNameSource()) { - case NetworkObjectDirectory::ComputerNameSource::HostAddress: - computerName = controlInterface->computer().hostName(); - break; - case NetworkObjectDirectory::ComputerNameSource::SessionClientName: - computerName = controlInterface->sessionInfo().clientName; - break; - case NetworkObjectDirectory::ComputerNameSource::SessionClientAddress: - computerName = controlInterface->sessionInfo().clientAddress; - break; - case NetworkObjectDirectory::ComputerNameSource::SessionHostName: - computerName = controlInterface->sessionInfo().hostName; - break; - case NetworkObjectDirectory::ComputerNameSource::SessionMetaData: - computerName = controlInterface->sessionInfo().metaData; + case Computer::NameSource::HostAddress: + case Computer::NameSource::SessionClientName: + case Computer::NameSource::SessionClientAddress: + case Computer::NameSource::SessionHostName: + case Computer::NameSource::SessionMetaData: + { + const auto computerName = controlInterface->computerName(); + if (computerName.isEmpty() == false) + { + m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), + computerName); + } break; + } default: break; } - - if (computerName.isEmpty() == false) - { - m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), - computerName); - } } } diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index 4a290885d..64964a8fb 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -102,6 +102,4 @@ class ComputerManager : public QObject QStringList m_localHostNames; QList m_localHostAddresses; - NetworkObjectDirectory::ComputerNameSource m_computerNameSource; - }; From d053954e5b68b72c0485810ef385b0a9382e3fef Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:36:55 +0200 Subject: [PATCH 1732/1765] ComputerControlListModel: notify UidRole change if UID based on session meta data --- master/src/ComputerControlListModel.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index b3cf082a9..0aa0d6933 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -410,7 +410,15 @@ void ComputerControlListModel::updateUser( const QModelIndex& index ) void ComputerControlListModel::updateSessionInfo(const QModelIndex& index) { - Q_EMIT dataChanged(index, index, {Qt::ToolTipRole}); + if (uidRoleContent() == UidRoleContent::SessionMetaDataHash) + { + Q_EMIT dataChanged(index, index, {Qt::ToolTipRole, UidRole}); + } + else + { + Q_EMIT dataChanged(index, index, {Qt::ToolTipRole}); + + } auto controlInterface = computerControlInterface( index ); if (controlInterface.isNull() == false) From 6d7ff42adc3877c0c0ad935dbfedcdd59593d44a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:37:25 +0200 Subject: [PATCH 1733/1765] ComputerControlListModel: use new CCI::computerName() method --- master/src/ComputerControlListModel.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 0aa0d6933..5defeeca8 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -507,7 +507,7 @@ QImage ComputerControlListModel::scaleAndAlignIcon( const QImage& icon, QSize si QString ComputerControlListModel::computerToolTipRole( const ComputerControlInterface::Pointer& controlInterface ) const { const QString state( computerStateDescription( controlInterface ) ); - const QString displayName(tr("Name: %1").arg(controlInterface->computer().displayName())); + const QString name(tr("Name: %1").arg(controlInterface->computerName())); const QString location( tr( "Location: %1" ).arg( controlInterface->computer().location() ) ); const QString host = controlInterface->computer().hostAddress().isNull() ? @@ -522,10 +522,10 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte if (controlInterface->state() != ComputerControlInterface::State::Connected) { - return QStringLiteral("%1
    %2
    %3
    %4").arg(state, displayName, location, host); + return QStringLiteral("%1
    %2
    %3
    %4").arg(state, name, location, host); } - return QStringLiteral("%1
    %2
    %3
    %4
    %5
    %6").arg(state, displayName, location, host, features, user); + return QStringLiteral("%1
    %2
    %3
    %4
    %5
    %6").arg(state, name, location, host, features, user); } @@ -547,12 +547,12 @@ QString ComputerControlListModel::computerDisplayRole( const ComputerControlInte return user; } - return QStringLiteral("%1 - %2").arg(user, controlInterface->computer().displayName()); + return QStringLiteral("%1 - %2").arg(user, controlInterface->computerName()); } if( displayRoleContent() != DisplayRoleContent::UserName ) { - return controlInterface->computer().displayName(); + return controlInterface->computerName(); } return tr("[no user]"); @@ -565,11 +565,11 @@ QString ComputerControlListModel::computerSortRole( const ComputerControlInterfa switch( sortOrder() ) { case SortOrder::ComputerAndUserName: - return controlInterface->computer().location() + controlInterface->computer().displayName() + + return controlInterface->computer().location() + controlInterface->computerName() + controlInterface->computer().hostName() + controlInterface->userLoginName(); case SortOrder::ComputerName: - return controlInterface->computer().location() + controlInterface->computer().displayName() + + return controlInterface->computer().location() + controlInterface->computerName() + controlInterface->computer().hostName(); case SortOrder::UserName: From 7e772795cf5c3a452cf79451a0a1754f9bd06609 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:37:54 +0200 Subject: [PATCH 1734/1765] ComputerZoomWidget: use new CCI::computerName() method --- master/src/ComputerZoomWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 6c581bdb7..84fbf05c1 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -139,13 +139,13 @@ void ComputerZoomWidget::updateComputerZoomWidgetTitle() if (username.isEmpty()) { - setWindowTitle( QStringLiteral( "%1 - %2" ).arg( m_vncView->computerControlInterface()->computer().displayName(), + setWindowTitle( QStringLiteral( "%1 - %2" ).arg( m_vncView->computerControlInterface()->computerName(), VeyonCore::applicationName() ) ); } else { setWindowTitle( QStringLiteral( "%1 - %2 - %3" ).arg( username, - m_vncView->computerControlInterface()->computer().displayName(), + m_vncView->computerControlInterface()->computerName(), VeyonCore::applicationName() ) ); } } From 8dfc6e6083ede3434f65d692083bfb2b844ed95f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:38:29 +0200 Subject: [PATCH 1735/1765] RemoteAccessWidget: use new CCI::computerName() method --- plugins/remoteaccess/RemoteAccessWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index f65ac9e9f..d64d8f66d 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -503,13 +503,13 @@ void RemoteAccessWidget::updateRemoteAccessTitle() if (username.isEmpty() ) { - setWindowTitle(tr("%1 - %2 Remote Access").arg(m_computerControlInterface->computer().displayName(), + setWindowTitle(tr("%1 - %2 Remote Access").arg(m_computerControlInterface->computerName(), VeyonCore::applicationName())); } else { setWindowTitle(tr("%1 - %2 - %3 Remote Access").arg(username, - m_computerControlInterface->computer().displayName(), + m_computerControlInterface->computerName(), VeyonCore::applicationName())); } } From 82bc8b73b4289759f5aaa2b5350e16e818de4c4e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:38:12 +0200 Subject: [PATCH 1736/1765] FlexibleListView: restore positions on UID changes --- master/src/FlexibleListView.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/master/src/FlexibleListView.cpp b/master/src/FlexibleListView.cpp index 856582574..ccf2381f7 100644 --- a/master/src/FlexibleListView.cpp +++ b/master/src/FlexibleListView.cpp @@ -153,6 +153,11 @@ void FlexibleListView::dataChanged( const QModelIndex& topLeft, const QModelInde { QListView::dataChanged( topLeft, bottomRight, roles ); + if (roles.contains(m_uidRole)) + { + restorePositions(); + } + if( m_toolTipPos.isNull() == false && ( roles.isEmpty() || roles.contains(Qt::ToolTipRole) ) ) { if( viewport()->mapToGlobal(m_toolTipPos) != QCursor::pos() ) From 52b0876e5627b428b72296b26963f814406eb374 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 14:13:05 +0200 Subject: [PATCH 1737/1765] MonitoringMode: rename updateUserData() to updateUserInfo() --- core/src/MonitoringMode.cpp | 6 +++--- core/src/MonitoringMode.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 4797501ef..ebe979315 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -76,7 +76,7 @@ MonitoringMode::MonitoringMode( QObject* parent ) : connect(&m_sessionInfoUpdateTimer, &QTimer::timeout, this, &MonitoringMode::updateSessionInfo); m_sessionInfoUpdateTimer.start(SessionInfoUpdateInterval); - updateUserData(); + updateUserInfo(); updateSessionInfo(); updateScreenInfoList(); @@ -328,7 +328,7 @@ bool MonitoringMode::sendUserInformation(VeyonServerInterface& server, const Mes m_userDataLock.lockForRead(); if (m_userLoginName.isEmpty()) { - updateUserData(); + updateUserInfo(); message.addArgument(Argument::UserLoginName, QString{}); message.addArgument(Argument::UserFullName, QString{}); } @@ -396,7 +396,7 @@ void MonitoringMode::updateActiveFeatures() -void MonitoringMode::updateUserData() +void MonitoringMode::updateUserInfo() { // asynchronously query information about logged on user (which might block // due to domain controller queries and timeouts etc.) diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 975726021..6378a6d6c 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -155,7 +155,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac } void updateActiveFeatures(); - void updateUserData(); + void updateUserInfo(); void updateSessionInfo(); void updateScreenInfoList(); From 8dd1a740ac1ec716b6e8bd7f49d89f08abff79ee Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 14:13:32 +0200 Subject: [PATCH 1738/1765] MonitoringMode: retry updating user info if empty --- core/src/MonitoringMode.cpp | 7 +++++++ core/src/MonitoringMode.h | 1 + 2 files changed, 8 insertions(+) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index ebe979315..0cb3056b3 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -415,6 +415,13 @@ void MonitoringMode::updateUserInfo() } m_userDataLock.unlock(); } + + m_userDataLock.lockForRead(); + if (m_userLoginName.isEmpty() && m_userFullName.isEmpty()) + { + QTimer::singleShot(UserInfoUpdateRetryInterval, this, &MonitoringMode::updateUserInfo); + } + m_userDataLock.unlock(); } ); } diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 6378a6d6c..131d7a31b 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -167,6 +167,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac static constexpr int ActiveFeaturesUpdateInterval = 250; static constexpr int SessionInfoUpdateInterval = 1000; + static constexpr int UserInfoUpdateRetryInterval = 1000; const Feature m_monitoringModeFeature; const Feature m_queryApplicationVersionFeature; From f426146b4f777d38b695fad7807714c5cf95e99c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 14:41:31 +0200 Subject: [PATCH 1739/1765] UserConfig: don't reload after loading template Make keys from template config take precedence over user config. --- master/src/UserConfig.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index 774f96994..61dc9fb40 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -38,7 +38,6 @@ UserConfig::UserConfig(const QString& storeName) : { Configuration::JsonStore jsonStore(Configuration::Store::Scope::System, templateFileName); *this += UserConfig(&jsonStore); - reloadFromStore(); } } From 762ac65c104c624aea1d0f095053f94605945513 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 14:57:21 +0200 Subject: [PATCH 1740/1765] Master: fix filter controls initialization Connect filter buttons before initializing their states from configuration. --- master/src/MainWindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index e4e0af54c..c14d21b6c 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -197,15 +197,15 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : ui->computerSelectPanelButton->setChecked( true ); } - // initialize search filter - ui->filterPoweredOnComputersButton->setChecked( m_master.userConfig().filterPoweredOnComputers() ); - ui->filterComputersWithLoggedOnUsersButton->setChecked( m_master.userConfig().filterComputersWithLoggedOnUsers() ); + // initialize filter controls connect( ui->filterLineEdit, &QLineEdit::textChanged, this, [this]( const QString& filter ) { ui->computerMonitoringWidget->setSearchFilter( filter ); } ); connect( ui->filterPoweredOnComputersButton, &QToolButton::toggled, this, [this]( bool enabled ) { ui->computerMonitoringWidget->setFilterPoweredOnComputers( enabled ); } ); connect( ui->filterComputersWithLoggedOnUsersButton, &QToolButton::toggled, this, [this]( bool enabled ) { ui->computerMonitoringWidget->setFilterComputersWithLoggedOnUsers( enabled ); } ); + ui->filterPoweredOnComputersButton->setChecked(m_master.userConfig().filterPoweredOnComputers()); + ui->filterComputersWithLoggedOnUsersButton->setChecked(m_master.userConfig().filterComputersWithLoggedOnUsers()); // initialize monitoring screen size slider ui->gridSizeSlider->setMinimum( ComputerMonitoringWidget::MinimumComputerScreenSize ); From f5fc1f0681456c6fc442be3c8650860bfb1a43ad Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 9 Apr 2025 18:56:57 +0200 Subject: [PATCH 1741/1765] RemoteAccess: move view-fullscreen.png to Core --- core/resources/core.qrc | 2 ++ core/resources/view-fullscreen-dark.png | Bin 0 -> 471 bytes core/resources/view-fullscreen.png | Bin 0 -> 471 bytes plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- plugins/remoteaccess/remoteaccess.qrc | 1 - plugins/remoteaccess/view-fullscreen.png | Bin 486 -> 0 bytes 6 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 core/resources/view-fullscreen-dark.png create mode 100644 core/resources/view-fullscreen.png delete mode 100644 plugins/remoteaccess/view-fullscreen.png diff --git a/core/resources/core.qrc b/core/resources/core.qrc index 3c3a6106e..c1428e7de 100644 --- a/core/resources/core.qrc +++ b/core/resources/core.qrc @@ -44,5 +44,7 @@ toast-information.png toast-success.png toast-warning.png + view-fullscreen.png + view-fullscreen-dark.png
    diff --git a/core/resources/view-fullscreen-dark.png b/core/resources/view-fullscreen-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c170702309de4edec3e88378738facc51b52761b GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg`mX84zY%eyHLVP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXpdz6FpAgso|Ns95gWq8A=g*&b z?(ZOrSWANZf*H!|8#*?hQ(C~lz-a2};uw-~@9ho4ydw@AtN|D1G|p3AQg~icp!)yn zC0#-{5B#}VqFtB$`sL|wCzuwUOflN|^sDsxcN6W+OB=!%k{hm@vNCO9lVIFa9mK?N zi*XP8p8Cj5tXtSC*nhmMp2)kvx}o~O_xWqKG`wSc$KdYQYto>^aJ?a!J>1K|utEDk z{&B0b{;fO#A`fH=oERsG1jsz#DLBM9iRFTD!~BNJoDQED_MK~J{UdMH!1kl&!Q5(7j#m2wJtC) zioOuL+$Qp(!GUYb=}Kmzopr0Iqeo AiU0rr literal 0 HcmV?d00001 diff --git a/core/resources/view-fullscreen.png b/core/resources/view-fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..a8679f9cba7ab28bcffea47ae73e4cc19cefe23c GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg`mX84zY%eyHLVP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXpdz6FpAgso|NkqgYbvQ}sHkbF zsA(#zX)4Ox*8?M;tg<11`*IoTt2` z@Vulz_5amNx`b{X_;a&FyDt0n%hTUZFfBTnVzl$=SLyZdCfb{qHiR)GH(WPmW!l0f z!MLY7h>77A;~w@s^^u!cx3E{R|9DqDk#~W0L-m30^Ve)?c*ppT!QHRdq(O<{dP6dM zxR--rgZ6>^<5p+=TX_OR9>^3pF-{T*ka@sUaENgd%LUJaJJ- - view-fullscreen.png preferences-system-windows-effect-desktopgrid.png application-exit.png krdc.png diff --git a/plugins/remoteaccess/view-fullscreen.png b/plugins/remoteaccess/view-fullscreen.png deleted file mode 100644 index 6fc7cf047de20ecf422fc5c9b33d65712dbecdcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI=3*z$5DpHG+YkL80J)q69+AZi z40*dinDN@Zjp9H-$r9IylHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSgaUj* zT!HkbPoF-2{`~RdM<4?T?ibxL2a2+m1o;Isl-DGkg>+MAa) zgfS#HTsLK9+QKHmxTiXZiQyLG9`-%;k(*ezuvf7Ecvn4+Wp$P_p+P7(=_dB9U}h;b6j1>uJI4VO6` zJ~8Y&*UA| zFte|#`C%p!arBFvMnNby$6+yn)prtD*kZm49ecpUDp1gvC77Dg$i=b6VP}u=1_w@- zhy`&TQeg|&n6xkGr1ENAU|7+B*>X8NdYuVK~<)!4Xy TrmhPxL>W9?{an^LB{Ts5#7(;0 From 3312dc260de3b539b6a5068bdfe7e8b5a2b1689a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 9 Apr 2025 20:54:26 +0200 Subject: [PATCH 1742/1765] SlideshowPanel: add button to switch view mode This allows viewing the slideshow in a separate window. --- master/src/SlideshowPanel.cpp | 21 +++++++++++++++++++++ master/src/SlideshowPanel.h | 2 ++ master/src/SlideshowPanel.ui | 19 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index 9048a2561..3114efe46 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -55,6 +55,7 @@ SlideshowPanel::SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* co ui->startStopButton->setIcon(startStopIcon); ui->showPreviousButton->setIcon(QIcon(QStringLiteral(":/core/go-previous-dark.png"))); ui->showNextButton->setIcon(QIcon(QStringLiteral(":/core/go-next-dark.png"))); + ui->viewInSeparateWindowButton->setIcon(QIcon(QStringLiteral(":/core/view-fullscreen-dark.png"))); } connect( ui->startStopButton, &QAbstractButton::toggled, this, &SlideshowPanel::updateDuration ); @@ -63,6 +64,8 @@ SlideshowPanel::SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* co connect( ui->showPreviousButton, &QAbstractButton::clicked, m_model, &SlideshowModel::showPrevious ); connect( ui->showNextButton, &QAbstractButton::clicked, m_model, &SlideshowModel::showNext ); + connect(ui->viewInSeparateWindowButton, &QToolButton::toggled, this, &SlideshowPanel::switchViewMode); + ui->durationSlider->setValue( m_config.slideshowDuration() ); updateDuration(); @@ -103,3 +106,21 @@ void SlideshowPanel::updateDuration() ui->durationLabel->setText( QStringLiteral("%1 s").arg( duration / 1000 ) ); } + + + +void SlideshowPanel::switchViewMode() +{ + if (ui->viewInSeparateWindowButton->isChecked()) + { + m_originalParent = parentWidget(); + setParent(nullptr); + setWindowTitle(tr("%1 Master – Slideshow").arg(VeyonCore::applicationName())); + showMaximized(); + } + else + { + setParent(m_originalParent); + m_originalParent = nullptr; + } +} diff --git a/master/src/SlideshowPanel.h b/master/src/SlideshowPanel.h index 54a0d8bce..1e0e8170f 100644 --- a/master/src/SlideshowPanel.h +++ b/master/src/SlideshowPanel.h @@ -49,10 +49,12 @@ class SlideshowPanel : public QWidget private: void updateDuration(); + void switchViewMode(); Ui::SlideshowPanel* ui; UserConfig& m_config; SlideshowModel* m_model; + QWidget* m_originalParent = nullptr; } ; diff --git a/master/src/SlideshowPanel.ui b/master/src/SlideshowPanel.ui index 4b5ffd1e5..36b006bf1 100644 --- a/master/src/SlideshowPanel.ui +++ b/master/src/SlideshowPanel.ui @@ -2,6 +2,10 @@ SlideshowPanel + + + :/master/computer-slideshow.png:/master/computer-slideshow.png + 0 @@ -125,6 +129,20 @@ + + + + View in separate window + + + + :/core/view-fullscreen.png:/core/view-fullscreen.png + + + true + + + @@ -140,6 +158,7 @@ + From c1e04afdcdfab1c179e66fa476e0fb3ad15a1da9 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 11:11:40 +0200 Subject: [PATCH 1743/1765] NetworkObject: add include for QJsonObject --- core/src/NetworkObject.h | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index 166b98d88..a569c5a19 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -24,6 +24,7 @@ #pragma once +#include #include #include From bab65ea5b91b1a4a68183b53b1e9887ee9e2d43e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 11:17:27 +0200 Subject: [PATCH 1744/1765] AccessControlRulesTestDialog: improve result text for no action --- configurator/src/AccessControlRulesTestDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index 87b6364ef..e59cb4c5d 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -96,7 +96,7 @@ void AccessControlRulesTestDialog::accept() resultText = tr( "The access in the given scenario needs permission of the logged on user." ); break; default: - resultText = tr( "ERROR: Unknown action" ); + resultText = tr("There is no matching rule with a valid action. The access is therefore denied."); break; } From 84d40359abbdf485c21228049b0c04a310bf8876 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 11:24:07 +0200 Subject: [PATCH 1745/1765] AccessControlRulesTestDialog: improve dialog layout --- .../src/AccessControlRulesTestDialog.ui | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/configurator/src/AccessControlRulesTestDialog.ui b/configurator/src/AccessControlRulesTestDialog.ui index 0d264d999..e5ce866bb 100644 --- a/configurator/src/AccessControlRulesTestDialog.ui +++ b/configurator/src/AccessControlRulesTestDialog.ui @@ -14,7 +14,14 @@ - + + + + 300 + 0 + + + @@ -56,21 +63,15 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QDialogButtonBox::Close|QDialogButtonBox::Ok + QDialogButtonBox::StandardButton::Close|QDialogButtonBox::StandardButton::Ok - - - 0 - 0 - - Please enter the following user and computer information in order to test the configured ruleset. From 25e3a8067db394eb0a4d87d885b9008042f44a0d Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 11:48:50 +0200 Subject: [PATCH 1746/1765] Configuration: Property: detach and delete if proxy is destroyed --- core/src/Configuration/Property.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index e7f3d18c5..fd33ce4ab 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -54,6 +54,10 @@ Configuration::Property::Property( Proxy* proxy, const QString& key, const QStri m_defaultValue( defaultValue ), m_flags( flags ) { + connect (proxy, &QObject::destroyed, this, [this]() { + setParent(nullptr); + deleteLater(); + }); } From d6fc9ef7c9b1bc0efd14c56f3406acd2abd1bdb0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 12:40:52 +0200 Subject: [PATCH 1747/1765] DesktopServicesFeaturePlugin: stop worker after opening website --- plugins/desktopservices/DesktopServicesFeaturePlugin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index b0631604f..90054c6b4 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -185,6 +186,7 @@ bool DesktopServicesFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& w if( message.featureUid() == m_openWebsiteFeature.uid() ) { openWebsite( message.argument( Argument::WebsiteUrls ).toString() ); + QCoreApplication::quit(); return true; } From c34568efec24f114c9e85179659c15b6c726b910 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 12:41:35 +0200 Subject: [PATCH 1748/1765] FileTransfer: stop worker after all files have been transferred --- plugins/filetransfer/FileTransferController.cpp | 2 ++ plugins/filetransfer/FileTransferPlugin.cpp | 12 ++++++++++++ plugins/filetransfer/FileTransferPlugin.h | 2 ++ 3 files changed, 16 insertions(+) diff --git a/plugins/filetransfer/FileTransferController.cpp b/plugins/filetransfer/FileTransferController.cpp index bfc804b10..2b03ee2c5 100644 --- a/plugins/filetransfer/FileTransferController.cpp +++ b/plugins/filetransfer/FileTransferController.cpp @@ -156,6 +156,8 @@ void FileTransferController::process() m_plugin->sendOpenTransferFolderMessage( m_interfaces ); } + m_plugin->sendStopWorkerMessage(m_interfaces); + m_processTimer.stop(); Q_EMIT finished(); } diff --git a/plugins/filetransfer/FileTransferPlugin.cpp b/plugins/filetransfer/FileTransferPlugin.cpp index b163242b1..a60d0ce2f 100644 --- a/plugins/filetransfer/FileTransferPlugin.cpp +++ b/plugins/filetransfer/FileTransferPlugin.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -290,6 +291,10 @@ bool FileTransferPlugin::handleFeatureMessage( VeyonWorkerInterface& worker, con QDesktopServices::openUrl( QUrl::fromLocalFile( destinationDirectory() ) ); return true; + case StopWorker: + QCoreApplication::quit(); + return true; + default: break; } @@ -350,6 +355,13 @@ void FileTransferPlugin::sendOpenTransferFolderMessage( const ComputerControlInt +void FileTransferPlugin::sendStopWorkerMessage(const ComputerControlInterfaceList& interfaces) +{ + sendFeatureMessage(FeatureMessage(m_fileTransferFeature.uid(), Commands::StopWorker), interfaces); +} + + + QString FileTransferPlugin::destinationDirectory() const { auto dir = VeyonCore::filesystem().expandPath( m_configuration.fileTransferDestinationDirectory() ); diff --git a/plugins/filetransfer/FileTransferPlugin.h b/plugins/filetransfer/FileTransferPlugin.h index 3e3ab1e94..d6951009d 100644 --- a/plugins/filetransfer/FileTransferPlugin.h +++ b/plugins/filetransfer/FileTransferPlugin.h @@ -111,6 +111,7 @@ class FileTransferPlugin : public QObject, FeatureProviderInterface, PluginInter void sendFinishMessage( QUuid transferId, const QString& fileName, bool openFileInApplication, const ComputerControlInterfaceList& interfaces ); void sendOpenTransferFolderMessage( const ComputerControlInterfaceList& interfaces ); + void sendStopWorkerMessage(const ComputerControlInterfaceList& interfaces); ConfigurationPage* createConfigurationPage() override; @@ -132,6 +133,7 @@ class FileTransferPlugin : public QObject, FeatureProviderInterface, PluginInter FileTransferCancelCommand, FileTransferFinishCommand, OpenTransferFolder, + StopWorker, CommandCount }; From db7718174e310c0997219371a86747ef23b8c10b Mon Sep 17 00:00:00 2001 From: Yann Salmon Date: Thu, 8 May 2025 14:31:36 +0200 Subject: [PATCH 1749/1765] Configurator: allow sorting computers by user surname --- configurator/src/MasterConfigurationPage.ui | 5 +++++ core/src/ComputerListModel.h | 1 + master/src/ComputerControlListModel.cpp | 9 +++++++++ translations/veyon.ts | 4 ++++ translations/veyon_fr.ts | 6 +++++- 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/configurator/src/MasterConfigurationPage.ui b/configurator/src/MasterConfigurationPage.ui index 8f814ccfe..ceee96304 100644 --- a/configurator/src/MasterConfigurationPage.ui +++ b/configurator/src/MasterConfigurationPage.ui @@ -185,6 +185,11 @@ Only user name + + + Only last part of user name + + Only computer name diff --git a/core/src/ComputerListModel.h b/core/src/ComputerListModel.h index 734b4c18e..4836c8736 100644 --- a/core/src/ComputerListModel.h +++ b/core/src/ComputerListModel.h @@ -58,6 +58,7 @@ class VEYON_CORE_EXPORT ComputerListModel : public QAbstractListModel enum class SortOrder { ComputerAndUserName, UserName, + LastPartOfUserName, ComputerName, }; Q_ENUM(SortOrder) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index 5defeeca8..673fbe49b 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -578,6 +578,15 @@ QString ComputerControlListModel::computerSortRole( const ComputerControlInterfa return controlInterface->userFullName(); } + return controlInterface->userLoginName(); + + case SortOrder::LastPartOfUserName: + const QStringList parts = controlInterface->userFullName().split(QLatin1Char(' '), Qt::SkipEmptyParts); + if( parts.isEmpty() == false ) + { + return parts.constLast(); + } + return controlInterface->userLoginName(); } diff --git a/translations/veyon.ts b/translations/veyon.ts index 19ebef753..43ca08422 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -3206,6 +3206,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name + + Only last part of user name + + Only computer name diff --git a/translations/veyon_fr.ts b/translations/veyon_fr.ts index d34499a9b..8b9b049f0 100644 --- a/translations/veyon_fr.ts +++ b/translations/veyon_fr.ts @@ -3364,6 +3364,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Only user name Uniquement le nom d'utilisateur + + Only last part of user name + Uniquement la dernière partie du nom d'utilisateur + Only computer name Nom d'ordinateur seulement @@ -4596,4 +4600,4 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin N'utilise pas l'extension X Damage
    - \ No newline at end of file + From 88eb0a3a89fb81917b041663ce0a34c8b474a705 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Thu, 8 May 2025 14:34:36 +0200 Subject: [PATCH 1750/1765] Update translations --- translations/veyon.ts | 584 ++++++++- translations/veyon_ar.ts | 378 +++++- translations/veyon_bg.ts | 400 ++++++- translations/veyon_ca_ES.ts | 404 ++++++- translations/veyon_cs.ts | 402 ++++++- translations/veyon_de.ts | 410 ++++++- translations/veyon_el.ts | 392 +++++- translations/veyon_es_ES.ts | 404 ++++++- translations/veyon_et.ts | 408 ++++++- translations/veyon_fa.ts | 384 +++++- translations/veyon_fr.ts | 402 ++++++- translations/veyon_he.ts | 586 ++++++--- translations/veyon_hu.ts | 763 ++++++++---- translations/veyon_id.ts | 404 ++++++- translations/veyon_it.ts | 416 ++++++- translations/veyon_ja.ts | 456 +++++-- translations/veyon_ko.ts | 404 ++++++- translations/veyon_lt.ts | 394 ++++++- translations/veyon_lv.ts | 549 +++++++-- translations/veyon_mn.ts | 378 +++++- translations/veyon_nl.ts | 408 ++++++- translations/veyon_no_NO.ts | 376 +++++- translations/veyon_pl.ts | 410 ++++++- translations/veyon_pt_BR.ts | 458 +++++-- translations/veyon_pt_PT.ts | 689 ++++++++--- translations/veyon_ru.ts | 410 ++++++- translations/veyon_sl.ts | 400 ++++++- translations/veyon_sr.ts | 400 ++++++- translations/veyon_sv.ts | 2228 ++++++++++++++++++++--------------- translations/veyon_th.ts | 392 +++++- translations/veyon_tr.ts | 965 ++++++++++----- translations/veyon_uk.ts | 410 ++++++- translations/veyon_vi.ts | 380 +++++- translations/veyon_zh_CN.ts | 450 +++++-- translations/veyon_zh_TW.ts | 450 +++++-- 35 files changed, 14180 insertions(+), 3564 deletions(-) diff --git a/translations/veyon.ts b/translations/veyon.ts index 43ca08422..781a75e3c 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -137,15 +137,14 @@ If you're interested in translating Veyon into your local or another langua - Missing user groups backend - - - - No default user groups plugin was found. Please check your installation! + Restrict access to members of specific user groups + + + AccessControlProvider - Restrict access to members of specific user groups + Provider for access control features @@ -323,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -367,15 +374,15 @@ If you're interested in translating Veyon into your local or another langua - ERROR: Unknown action + Test result - Test result + Authentication method - Authentication method + There is no matching rule with a valid action. The access is therefore denied. @@ -468,10 +475,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! - - Please enter the name of the user group or role for which to import the authentication key: - - Please select a key to export! @@ -484,6 +487,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -682,10 +691,6 @@ The public key is used on client computers to authenticate incoming connection r This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - - Please specify the command to display help for! - - TYPE @@ -726,6 +731,14 @@ The public key is used on client computers to authenticate incoming connection r Please specify the key name (e.g. "teacher/public") as the first argument. + + Please specify the command to display help for. + + + + The specified command does not exist or no help is available for it. + + AuthKeysTableModel @@ -1190,6 +1203,14 @@ The public key is used on client computers to authenticate incoming connection r MAC ADDRESS + + The specified command does not exist or no help is available for it. + + + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1207,10 +1228,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 @@ -1260,7 +1277,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 + + + + unknown + + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1332,6 +1365,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1390,6 +1435,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1538,6 +1587,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -1609,10 +1666,6 @@ The public key is used on client computers to authenticate incoming connection r All screens - - Screen %1 [%2] - - DesktopAccessDialog @@ -1797,9 +1850,133 @@ The public key is used on client computers to authenticate incoming connection r - FeatureControl + FeatureCommands + + List names of all available features + + + + Show table with details of all available features + + + + Start a feature on a remote host + + + + Stop a feature on a remote host + + + + Please specify the command to display help for. + + + + Displays a list with the names of all available features. + + + + Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. + + + + HOST ADDRESS + + + + FEATURE + + + + ARGUMENTS + + - Feature control + Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information + + + + Lock the screen + + + + Display a text message + + + + Test message + + + + Start an application + + + + Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. + + + + Unlock the screen + + + + The specified command does not exist or no help is available for it. + + + + Name + + + + Description + + + + Master + + + + Service + + + + Worker + + + + UID + + + + Plugin + + + + Invalid feature name or UID specified + + + + Error parsing the JSON-encoded arguments: %1 + + + + Failed to initialize credentials + + + + Could not establish a connection to host %1 + + + + Failed to send feature control message to host %1 + + + + Feature-related CLI operations + + + + Commands for controlling features @@ -2044,6 +2221,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2774,6 +2991,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + + LdapNetworkObjectDirectoryConfigurationPage @@ -2901,11 +3126,11 @@ The public key is used on client computers to authenticate incoming connection r - Disable balloon tooltips + Show icons only - Show icons only + Disable tooltips @@ -3115,6 +3340,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + + + Only show computers with logged on users + + + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3294,6 +3537,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3309,6 +3640,18 @@ The public key is used on client computers to authenticate incoming connection r This mode allows you to monitor all computers at one or more locations. + + Query application version of the server + + + + Query active features + + + + Query properties of remotely available screens + + NestedNetworkObjectDirectory @@ -3374,7 +3717,7 @@ The public key is used on client computers to authenticate incoming connection r - PluginsCommands + PluginCommands List names of all installed plugins @@ -3559,11 +3902,15 @@ Please save your work and close all programs. - Please enter the hostname or IP address of the computer to access: + Show help about command - Show help about command + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: @@ -3655,6 +4002,14 @@ Please save your work and close all programs. Connecting... + + Select screen + + + + All screens + + ScreenLockFeaturePlugin @@ -3775,6 +4130,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -3890,44 +4276,82 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) - - - ServiceControl - Starting service %1 + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. - Stopping service %1 + Miscellaneous settings - Registering service %1 + Disable clipboard synchronization - Unregistering service %1 + Session metadata - Service control + Content + + + + None + + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) - ServiceControlPlugin + ServiceControl - Service is running + Service control - Service is not running + Starting %1 - Configure and control Veyon service + Stopping %1 + + Restarting %1 + + + + Registering %1 + + + + Unregistering %1 + + + + + ServiceControlCommands Register Veyon Service @@ -3952,13 +4376,25 @@ Typically this is required to support terminal servers. Query status of Veyon Service + + Service is running + + + + Service is not running + + + + Configure and control Veyon service + + Commands for configuring and controlling Veyon Service - ShellCommandLinePlugin + ShellCommands Run command file @@ -3968,7 +4404,7 @@ Typically this is required to support terminal servers. - Interactive shell and script execution for Veyon Control + Interactive shell and script execution for Veyon CLI @@ -3994,6 +4430,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4144,17 +4588,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog @@ -4279,6 +4712,21 @@ The second button removes the selected or last computer. Authentication test + + Screen %1 + + + + + VeyonMaster + + No write access + + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + VeyonServiceControl @@ -4363,6 +4811,10 @@ The second button removes the selected or last computer. Plugin implementing abstract functions for the Windows platform + + Internal display + + WindowsServiceControl @@ -4371,27 +4823,31 @@ The second button removes the selected or last computer. - The service "%1" could not be installed. + The service "%1" has been installed successfully. - The service "%1" has been installed successfully. + The service "%1" has been uninstalled successfully. - The service "%1" could not be uninstalled. + Service "%1" could not be found. - The service "%1" has been uninstalled successfully. + The service "%1" could not be installed (error %2). - The start type of service "%1" could not be changed. + Could not change the failure actions config for service "%1" (error %2). - Service "%1" could not be found. + The service "%1" could not be uninstalled (error %2). + + + + The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_ar.ts b/translations/veyon_ar.ts index 85723297e..8d5124d9e 100644 --- a/translations/veyon_ar.ts +++ b/translations/veyon_ar.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -135,15 +135,14 @@ If you're interested in translating Veyon into your local or another langua - Missing user groups backend - - - - No default user groups plugin was found. Please check your installation! + Restrict access to members of specific user groups + + + AccessControlProvider - Restrict access to members of specific user groups + Provider for access control features @@ -321,6 +320,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -365,15 +372,15 @@ If you're interested in translating Veyon into your local or another langua - ERROR: Unknown action + Test result - Test result + Authentication method - Authentication method + There is no matching rule with a valid action. The access is therefore denied. @@ -466,10 +473,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! - - Please enter the name of the user group or role for which to import the authentication key: - - Please select a key to export! @@ -482,6 +485,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1196,6 +1205,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1213,10 +1226,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 @@ -1266,11 +1275,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 + + + + unknown + غير معروف + + + IP address: %1 + + + + Hostname could not be resolved - [none] + No features active @@ -1342,6 +1363,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1400,6 +1433,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1548,6 +1585,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2174,6 +2219,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + مجموعات المستخدم + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2904,6 +2989,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + + LdapNetworkObjectDirectoryConfigurationPage @@ -3031,11 +3124,11 @@ The public key is used on client computers to authenticate incoming connection r - Disable balloon tooltips + Show icons only - Show icons only + Disable tooltips @@ -3245,10 +3338,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3340,6 +3447,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name + + Only last part of user name + + Only computer name @@ -3424,6 +3535,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + عنوان المضيف + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3701,12 +3900,16 @@ Please save your work and close all programs. عرض عن بعد أو التحكم في الحاسوب - Please enter the hostname or IP address of the computer to access: + Show help about command + عرض المساعدة حول الأمر + + + Exchange clipboard contents - Show help about command - عرض المساعدة حول الأمر + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + @@ -3925,6 +4128,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4040,27 +4274,77 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 + Service control - Stopping service %1 + Starting %1 - Registering service %1 + Stopping %1 - Unregistering service %1 + Restarting %1 - Service control + Registering %1 + + + + Unregistering %1 @@ -4144,6 +4428,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4294,17 +4586,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - لا يوجد وصول للكتابة - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - تعذر حفظ إعداداتك الشخصية! الرجاء التحقق من مسار ملف ضبط المستخدم باستخدام٪ 1 مكون. - - UserLoginDialog @@ -4434,6 +4715,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + لا يوجد وصول للكتابة + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + تعذر حفظ إعداداتك الشخصية! الرجاء التحقق من مسار ملف ضبط المستخدم باستخدام٪ 1 مكون. + + VeyonServiceControl @@ -4506,6 +4798,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_bg.ts b/translations/veyon_bg.ts index ebe5e109f..d89c6e751 100644 --- a/translations/veyon_bg.ts +++ b/translations/veyon_bg.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: Потребителски групи: - - Missing user groups backend - Липсват потребителски групи - - - No default user groups plugin was found. Please check your installation! - Не е намерен плъгин за групи потребители по подразбиране. Моля, проверете вашата инсталация! - Restrict access to members of specific user groups Ограничете достъпа до членове на определени потребителски групи + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. The access in the given scenario needs permission of the logged on user. - - ERROR: Unknown action - ERROR: Unknown action - Test result Test result @@ -378,6 +381,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! Please select a key to delete! - - Please enter the name of the user group or role for which to import the authentication key: - Please enter the name of the user group or role for which to import the authentication key: - Please select a key to export! Please select a key to export! @@ -487,6 +490,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! Please select a key which to set the access group for! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1201,6 +1210,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - Host/IP address: %1 - Active features: %1 Active features: %1 @@ -1271,11 +1280,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 - [none] + unknown + unknown + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1347,6 +1368,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1405,6 +1438,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1553,6 +1590,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2179,6 +2224,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + Backend: + + + Include user groups from domain + + + + Missing user groups backend + Липсват потребителски групи + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2928,6 +3013,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3054,14 +3147,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration Configuration - - Disable balloon tooltips - Disable balloon tooltips - Show icons only Show icons only + + Disable tooltips + + MainWindow @@ -3269,10 +3362,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Locations & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3364,6 +3471,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name Only user name + + Only last part of user name + + Only computer name Only computer name @@ -3448,6 +3559,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Host address + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3726,14 +3925,18 @@ Please save your work and close all programs. Remote view or control a computer Remote view or control a computer - - Please enter the hostname or IP address of the computer to access: - Please enter the hostname or IP address of the computer to access: - Show help about command Show help about command + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3951,6 +4154,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4067,28 +4301,78 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + None + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Starting service %1 + Service control + Service control + + + Starting %1 + - Stopping service %1 - Stopping service %1 + Stopping %1 + - Registering service %1 - Registering service %1 + Restarting %1 + - Unregistering service %1 - Unregistering service %1 + Registering %1 + - Service control - Service control + Unregistering %1 + @@ -4171,6 +4455,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4321,17 +4613,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - No write access - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - UserLoginDialog @@ -4461,6 +4742,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + No write access + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + VeyonServiceControl @@ -4533,6 +4825,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_ca_ES.ts b/translations/veyon_ca_ES.ts index ea816c073..ba7cca52b 100644 --- a/translations/veyon_ca_ES.ts +++ b/translations/veyon_ca_ES.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Si esteu interessat a traduir el Veyon al vostre idioma local o a un altre o vol User groups backend: Rerefons dels grups d'usuaris: - - Missing user groups backend - Falta el rerefonss de grups d'usuaris - - - No default user groups plugin was found. Please check your installation! - No s'ha trobat cap connector de grups d'usuaris predeterminat. Comproveu la instal·lació! - Restrict access to members of specific user groups Restringeix l'accés als membres de grups d'usuaris específics + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ Si esteu interessat a traduir el Veyon al vostre idioma local o a un altre o vol Session being accessed is a login screen La sessió que s'està accedint és una pantalla d'inici de sessió + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Si esteu interessat a traduir el Veyon al vostre idioma local o a un altre o vol The access in the given scenario needs permission of the logged on user. L'accés a l'escenari indicat necessita el permís de l'usuari connectat. - - ERROR: Unknown action - ERROR: acció desconeguda - Test result Resultat de la prova @@ -378,6 +381,10 @@ Si esteu interessat a traduir el Veyon al vostre idioma local o a un altre o vol Authentication method Mètode d'autenticació + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Please select a key to delete! Seleccioneu una clau per suprimir! - - Please enter the name of the user group or role for which to import the authentication key: - Introduïu el nom del grup d'usuaris o el rol per al qual s'importarà la clau d'autenticació: - Please select a key to export! Seleccioneu una clau per exportar! @@ -487,6 +490,12 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Please select a key which to set the access group for! Seleccioneu una clau per a la qual establir el grup d'accés! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1201,6 +1210,10 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· The specified command does not exist or no help is available for it. L'ordre indicada no existeix o no hi ha cap ajuda disponible per a ella. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· ComputerControlListModel - - Host/IP address: %1 - Adreça IP/amfitrió: %1 - Active features: %1 Característiques actives: %1 @@ -1271,12 +1280,24 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Nom: %1 - invalid - no vàlid + Hostname: %1 + - [none] - [cap] + unknown + desconegut + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active + @@ -1347,6 +1368,18 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. No s'ha pogut determinar la ubicació d'aquest ordinador. Això indica un problema amb la configuració del sistema. Totes les ubicacions es mostraran al plafó de selecció de l'ordinador. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1405,6 +1438,10 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Could not write the computer and users list to %1! Please check the file access permissions. No s'ha pogut escriure la llista d'ordinadors i usuaris a %1! Comproveu els permisos d'accés als fitxers. + + Search computers + + ConfigCommands @@ -1553,6 +1590,14 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Slow down thumbnail updates while demo is running Alenteix les actualitzacions de miniatures mentre s'està executant la demostració + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2179,6 +2224,46 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Host private key file Fitxer de clau privada de l'amfitrió + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + Dorsal: + + + Include user groups from domain + + + + Missing user groups backend + Falta el rerefonss de grups d'usuaris + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2928,6 +3013,14 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Query nested user groups (supported by AD only) Consulta els grups d'usuaris imbricats (disponible només AD) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3054,14 +3147,14 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Configuration Configuració - - Disable balloon tooltips - Desactiva els consells d'eina de globus - Show icons only Mostra només les icones + + Disable tooltips + + MainWindow @@ -3269,10 +3362,24 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Locations & computers Ubicacions i ordinadors + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users Mostra només els ordinadors amb usuaris connectats + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3364,6 +3471,10 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Only user name Només nom d'usuari + + Only last part of user name + + Only computer name Només nom de l'ordinador @@ -3448,6 +3559,94 @@ La clau pública s'utilitza en ordinadors de client per autenticar la sol· Open feature windows on the same screen as the main window Obre les finestres de les característiques a la mateixa pantalla que la finestra principal + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Adreça de l'amfitrió + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3726,14 +3925,18 @@ Deseu el vostre treball i tanqueu tots els programes. Remote view or control a computer Visualització remota o control remot a un ordinador - - Please enter the hostname or IP address of the computer to access: - Introduïu el nom d'amfitrió o l'adreça IP de l'ordinador on voleu accedir: - Show help about command Mostra l'ajuda sobre l'ordre + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3951,6 +4154,37 @@ Deseu el vostre treball i tanqueu tots els programes. Esteu segur que voleu suprimir totes les captures de pantalla seleccionades? + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4067,28 +4301,78 @@ Normalment es requereix per a donar suport als servidors de terminals.Multi session mode (distinct server instance for each local and remote desktop session) Mode de sessió múltiple (instàncies del servidor diferents per a cada sessió d'escriptori local i remot) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Cap + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - S'està iniciant el servei %1 + Service control + Control del servei + + + Starting %1 + - Stopping service %1 - S'està aturant el servei %1 + Stopping %1 + - Registering service %1 - S'està registrant el servei %1 + Restarting %1 + - Unregistering service %1 - S'està cancel·lant el registre del servei %1 + Registering %1 + - Service control - Control del servei + Unregistering %1 + @@ -4171,6 +4455,14 @@ Normalment es requereix per a donar suport als servidors de terminals.Duration: Duració: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4322,17 +4614,6 @@ El segon botó elimina l'ordinador seleccionat o l'últim.Ús màxim de la CPU - - UserConfig - - No write access - Sense permís d'escriptura - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - No s'ha pogut desar la vostra configuració personal! Comproveu el camí del fitxer de configuració de l'usuari utilitzant el configurador de %1. - - UserLoginDialog @@ -4462,6 +4743,17 @@ El segon botó elimina l'ordinador seleccionat o l'últim. + + VeyonMaster + + No write access + Sense permís d'escriptura + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + No s'ha pogut desar la vostra configuració personal! Comproveu el camí del fitxer de configuració de l'usuari utilitzant el configurador de %1. + + VeyonServiceControl @@ -4534,6 +4826,10 @@ El segon botó elimina l'ordinador seleccionat o l'últim.Use input device interception driver Utilitza el controlador d'intercepció del dispositiu d'entrada + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_cs.ts b/translations/veyon_cs.ts index 8f9f45a6e..e0d6138f2 100644 --- a/translations/veyon_cs.ts +++ b/translations/veyon_cs.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně User groups backend: Podpůrná vrstva uživatelských skupin: - - Missing user groups backend - Chybí podpůrná vrstva uživatelských skupin - - - No default user groups plugin was found. Please check your installation! - Nebyl nalezen žádný výchozí zásuvný modul uživatelských skupin. Zkontrolujte svou instalaci! - Restrict access to members of specific user groups Omezit přístup na členy konkrétních skupin uživatelů + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně The access in the given scenario needs permission of the logged on user. Přístup v zadaném scénáři vyžaduje svolení od přihlášeného uživatele. - - ERROR: Unknown action - CHYBA: neznámá akce - Test result Výsledek zkoušky fungování @@ -378,6 +381,10 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně Authentication method + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -395,7 +402,7 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně 2) Set an access group whose members should be allowed to access other computers. - 2( Nastavte přístupovou skupinu jejíž členům by mělo být umožněno přistupovat k ostatním počítačům. + 2) Nastavte přístupovou skupinu jejíž členům by mělo být umožněno přistupovat k ostatním počítačům. 3) Export the public key and import it on all client computers with the same name. @@ -471,10 +478,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří Please select a key to delete! Vyberte klíč, který chcete smazat! - - Please enter the name of the user group or role for which to import the authentication key: - Zadejte název uživatelské skupiny nebo role pro kterou chcete importovat ověřovací klíč: - Please select a key to export! Vyberte klíč který chcete exportovat! @@ -487,6 +490,12 @@ Veřejná část je použita na klientských počítačích pro ověření pří Please select a key which to set the access group for! Vyberte klíč pro který nastavit přístupovou skupinu! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1201,6 +1210,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ Veřejná část je použita na klientských počítačích pro ověření pří ComputerControlListModel - - Host/IP address: %1 - Stroj / IP adresa: %1 - Active features: %1 Aktivní funkce: %1 @@ -1271,11 +1280,23 @@ Veřejná část je použita na klientských počítačích pro ověření pří - invalid + Hostname: %1 - [none] + unknown + Neznámé + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1347,6 +1368,18 @@ Veřejná část je použita na klientských počítačích pro ověření pří Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Umístění počítače se nedaří zjistit. To značí problém s nastavením systému. Náhradně budou v panelu výběru počítačů zobrazena všechna umístění. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1405,6 +1438,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří Could not write the computer and users list to %1! Please check the file access permissions. Nedaří se zapsat seznam počítačů a uživatelů do %1! Zkontrolujte přístupová práva souboru. + + Search computers + + ConfigCommands @@ -1553,6 +1590,14 @@ Veřejná část je použita na klientských počítačích pro ověření pří Slow down thumbnail updates while demo is running Zpomalit aktualizace náhledů při běhu ukázky + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2179,6 +2224,46 @@ Veřejná část je použita na klientských počítačích pro ověření pří Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + Podpůrná vrstva (backend): + + + Include user groups from domain + + + + Missing user groups backend + Chybí podpůrná vrstva uživatelských skupin + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2924,6 +3009,14 @@ Veřejná část je použita na klientských počítačích pro ověření pří Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3050,14 +3143,14 @@ Veřejná část je použita na klientských počítačích pro ověření pří Configuration Nastavení - - Disable balloon tooltips - Nezobrazovat popisky nástrojů - Show icons only Zobrazovat pouze ikony + + Disable tooltips + + MainWindow @@ -3265,10 +3358,24 @@ Veřejná část je použita na klientských počítačích pro ověření pří Locations & computers Umístění a počítače + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3360,6 +3467,10 @@ Veřejná část je použita na klientských počítačích pro ověření pří Only user name Pouze uživatelské jméno + + Only last part of user name + + Only computer name Pouze název počítače @@ -3444,6 +3555,94 @@ Veřejná část je použita na klientských počítačích pro ověření pří Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Adresa stroje + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3722,14 +3921,18 @@ Uložte si rozdělanou práci a ukončete všechny aplikace. Remote view or control a computer Pohled na nebo ovládání počítače na dálku - - Please enter the hostname or IP address of the computer to access: - Zadejte název nebo IP adresu počítače ke kterému přistoupit: - Show help about command Zobrazit nápovědu k příkazu + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3947,6 +4150,37 @@ Uložte si rozdělanou práci a ukončete všechny aplikace.
    + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4063,28 +4297,78 @@ Typicky je toto třeba na terminálových serverech. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Žádné + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Spouštění služby %1 + Service control + Řízení služby + + + Starting %1 + - Stopping service %1 - Zastavování služby %1 + Stopping %1 + - Registering service %1 - Registrace služby %1 + Restarting %1 + - Unregistering service %1 - Rušení registrace služby %1 + Registering %1 + - Service control - Řízení služby + Unregistering %1 + @@ -4167,6 +4451,14 @@ Typicky je toto třeba na terminálových serverech. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4317,17 +4609,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - Do daného umístění nelze zapisovat - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Nedaří se uložit vaše osobní nastavení! Zkontrolujte popis umístění souboru s uživatelskými nastaveními v nastavení %1. - - UserLoginDialog @@ -4457,6 +4738,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + Do daného umístění nelze zapisovat + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Nedaří se uložit vaše osobní nastavení! Zkontrolujte popis umístění souboru s uživatelskými nastaveními v nastavení %1. + + VeyonServiceControl @@ -4529,6 +4821,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_de.ts b/translations/veyon_de.ts index b3b0f970d..b977405ce 100644 --- a/translations/veyon_de.ts +++ b/translations/veyon_de.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -134,19 +134,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: Benutzergruppen-Backend: - - Missing user groups backend - Fehlendes Benutzergruppen-Backend - - - No default user groups plugin was found. Please check your installation! - Es wurde kein Benutzergruppen-Plugin gefunden. Bitte überprüfen Sie Ihre Installation! - Restrict access to members of specific user groups Zugriff auf Mitglieder bestimmter Benutzergruppen einschränken + + AccessControlProvider + + Provider for access control features + Anbieter für Zugriffskontrollfunktionen + + AccessControlRuleEditDialog @@ -321,6 +320,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen Sitzung, auf die zugegriffen wird, ist ein Anmeldebildschirm + + Local computer is already being accessed + Auf den lokalen Computer wird bereits zugegriffen + + + Local computer is not yet being accessed + Auf den lokalen Computer wird noch nicht zugegriffen + AccessControlRulesTestDialog @@ -364,10 +371,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Der Zugriff benötigt im angegebenen Szenario die Erlaubnis des angemeldeten Benutzers. - - ERROR: Unknown action - FEHLER: Unbekannte Aktion - Test result Testergebnis @@ -376,6 +379,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method Authentifizierungsmethode + + There is no matching rule with a valid action. The access is therefore denied. + Es gibt keine zutreffende Regel mit einer gültigen Aktion. Der Zugriff wird daher verweigert. + AuthKeysConfigurationWidget @@ -468,10 +475,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Please select a key to delete! Bitte wählen Sie den zu löschenden Schlüssel! - - Please enter the name of the user group or role for which to import the authentication key: - Bitte geben Sie den Namen der Benutzergruppe oder -rolle ein, für die ein Authentifizierungsschlüssel importiert werden soll: - Please select a key to export! Bitte wählen Sie den zu exportierenden Schlüssel! @@ -484,6 +487,14 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Please select a key which to set the access group for! Bitte wählen Sie den Schlüssel, für den die Zugriffsgruppe gesetzt werden soll! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + Bitte geben Sie den Namen der Benutzergruppe oder -rolle an, für die der Authentifizierungsschlüssel importiert werden soll. + +Achten Sie darauf, dass die Namen der zueinander gehörenden Schlüssel auf allen Computern identisch sind. + AuthKeysManager @@ -1198,6 +1209,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e The specified command does not exist or no help is available for it. Der angegebene Befehl existiert nicht oder es ist keine Hilfe für ihn verfügbar. + + Location "%1" not found. + Standort "%1" nicht gefunden. + BuiltinUltraVncServer @@ -1215,10 +1230,6 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e ComputerControlListModel - - Host/IP address: %1 - Host-/IP-Adresse: %1 - Active features: %1 Aktive Funktionen: %1 @@ -1268,12 +1279,24 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Name: %1 - invalid - ungültig + Hostname: %1 + Hostname: %1 + + + unknown + unbekannt + + + IP address: %1 + IP-Adresse: %1 - [none] - [keine] + Hostname could not be resolved + Hostname konnte nicht aufgelöst werden + + + No features active + Keine Funktionen aktiv @@ -1344,6 +1367,18 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Der Standort dieses Computers konnte nicht ermittelt werden. Das deutet auf ein Problem mit der Systemkonfiguration hin. Stattdessen werden alle Standorte im Computerauswahlbedienfeld angezeigt. + + Logged in since + Angemeldet seit + + + %1 days + %1 Tage + + + 1 day + 1 Tag + ComputerMonitoring @@ -1402,6 +1437,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Could not write the computer and users list to %1! Please check the file access permissions. Die Computer- und Benutzerliste konnte nicht in die Datei %1 geschrieben werden. Bitte überprüfen Sie die Dateizugriffsrechte. + + Search computers + Computer suchen + ConfigCommands @@ -1550,6 +1589,14 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Slow down thumbnail updates while demo is running Miniaturbildaktualisierungen während laufender Demo verlangsamen + + Bandwidth limit + Bandbreitenbeschränkung + + + MB/s + MB/s + DemoFeaturePlugin @@ -2176,6 +2223,46 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Host private key file Private Host-Schlüsseldatei + + Style: + Stil: + + + Native + Nativ + + + Color scheme: + Farbschema: + + + Light + Hell + + + Dark + Dunkel + + + User groups + Benutzergruppen + + + Backend: + Backend: + + + Include user groups from domain + Benutzergruppen von Domain einbeziehen + + + Missing user groups backend + Fehlendes Benutzergruppen-Backend + + + No user groups plugin was found. Please check your installation! + Es wurde kein Benutzergruppen-Plugin gefunden. Bitte überprüfen Sie Ihre Installation! + HeadlessVncServer @@ -2925,6 +3012,14 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Query nested user groups (supported by AD only) Verschachtelte Benutzergruppen abfragen (nur von AD unterstützt) + + Query timeout + Abfrage-Timeout + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3051,14 +3146,14 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Configuration Konfiguration - - Disable balloon tooltips - Balloon-Tooltips deaktivieren - Show icons only Nur Icons anzeigen + + Disable tooltips + Tooltips deaktivieren + MainWindow @@ -3266,10 +3361,26 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Locations & computers Standorte & Computer + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + Benutzerdefinierte Computeranordnung verwenden. + +Gedrückt halten, um die Anordnung aus einer Datei zu laden oder die aktuelle Anordnung in einer Datei zu speichern. + Only show computers with logged on users Nur Computer mit angemeldeten Benutzern anzeigen + + Load computer positions + Computerpositionen laden + + + Save computer positions + Computerpositionen speichern + MasterConfigurationPage @@ -3361,6 +3472,10 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Only user name Nur Benutzername + + Only last part of user name + Nur letzter Teil des Benutzernamens + Only computer name Nur Computername @@ -3445,6 +3560,94 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e Open feature windows on the same screen as the main window Funktionsfenster auf dem gleichen Bildschirm wie der des Hauptfensters öffnen + + Configuration templates + Konfigurationsvorlagen + + + Image quality in monitoring mode + Bildqualität im Beobachtungsmodus + + + Highest + Höchste + + + High + Hoch + + + Medium + Mittel + + + Low + Niedrig + + + Lowest + Niedrigste + + + Remote access image quality + Bildqualität beim Fernzugriff + + + Advanced + Erweitert + + + Computer name source + Quelle für Computernamen + + + Default + Standard + + + Host address + Hostadresse + + + Session client address + Adresse des Sitzungsclients + + + Session client name + Name des Sitzungsclients + + + Session host name + Sitzungshostname + + + Session metadata + Sitzungsmetadaten + + + Full name of user + Voller Name des Benutzers + + + User login name + Benutzeranmeldename + + + Computer UID role + Computer-UID-Rolle + + + Session meta data hash + Hash über Sitzungsmetadaten + + + Always expand all locations + Immer alle Standorte ausklappen + + + Image quality + Bildqualität + MonitoringMode @@ -3723,14 +3926,18 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Remote view or control a computer Fernansicht oder -Steuerung eines Computers - - Please enter the hostname or IP address of the computer to access: - Bitte geben Sie den Hostnamen oder IP-Adresse des Computers ein, auf den Sie zugreifen möchten: - Show help about command Hilfe über Befehl anzeigen + + Exchange clipboard contents + Inhalt der Zwischenablage austauschen + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Da kein Computer ausgewählt wurde, können Sie einen Hostnamen oder eine IP-Adresse eines Computers für den manuellen Zugriff eingeben: + RemoteAccessPage @@ -3948,6 +4155,37 @@ Bitte speichern Sie Ihre Arbeiten und schließen alle Programme. Möchten Sie wirklich alle ausgewählten Screenshots löschen? + + ServerAccessControlManager + + Requested authentication method not available + Angeforderte Authentifizierungsmethode nicht verfügbar + + + Access allowed by rule "%1" + Zugriff erlaubt durch Regel "%1" + + + Access denied by rule "%1" + Zugriff verweigert durch Regel "%1" + + + No rule allowed access + Keine Regel erlaubt Zugriff + + + Accessing user not member of an authorized user group + Zugreifender Benutzer ist nicht Mitglied einer autorisierten Benutzergruppe + + + User has denied access + Benutzer hat den Zugriff abgelehnt + + + User confirmed access + Benutzer hat den Zugriff bestätigt + + ServiceConfigurationPage @@ -4064,28 +4302,80 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Multi session mode (distinct server instance for each local and remote desktop session) Mehrsitzungsmodus (eigene Serverinstanz für jede lokale und entfernte Desktop-Sitzung) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + Aktivieren, wenn eine einzelne Veyon Server-Instanz für die gerade aktive Sitzung gestartet werden soll, egal ob lokal oder remote. + + + Miscellaneous settings + Sonstige Einstellungen + + + Disable clipboard synchronization + Synchronisierung der Zwischenablage deaktivieren + + + Session metadata + Sitzungsmetadaten + + + Content + Inhalt + + + None + Keine + + + Value of an environment variable + Wert einer Umgebungsvariable + + + Value of a registry key + Wert eines Registryschlüssels + + + Environment variable name: + Name der Umgebungsvariable: + + + Registry key name: + Name des Registryschlüssels: + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + Geben Sie optional einen regulären Ausdruck mit einem Capture ein, um einen Teil des Computernamens zu extrahieren und ihn als Anzeigenamen für den Computer zu verwenden. + +Beispiel: [^-]*-(PC[0-9]*) + ServiceControl - Starting service %1 - Starte Dienst %1 + Service control + Dienststeuerung - Stopping service %1 - Beende Dienst %1 + Starting %1 + Starte %1 - Registering service %1 - Registriere Dienst %1 + Stopping %1 + Beende %1 - Unregistering service %1 - Deregistriere Dienst %1 + Restarting %1 + Starte %1 neu - Service control - Dienststeuerung + Registering %1 + Registriere %1 + + + Unregistering %1 + Deregistriere %1 @@ -4168,6 +4458,14 @@ Normalerweise ist dies erforderlich, um Terminalserver zu unterstützen.Duration: Dauer: + + View in separate window + Ansicht in separatem Fenster + + + %1 Master – Slideshow + %1 Master – Diashow + SpotlightPanel @@ -4319,17 +4617,6 @@ Der zweite Button entfernt den gewählten oder letzten Computer. Maximale CPU-Auslastung - - UserConfig - - No write access - Kein Schreibzugriff - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Ihre persönlichen Einstellungen konnten nicht gespeichert werden! Bitte überprüfen Sie den Pfad für die Benutzerkonfiguration mit Hilfe des %1 Configurators. - - UserLoginDialog @@ -4459,6 +4746,17 @@ Der zweite Button entfernt den gewählten oder letzten Computer. Bildschirm %1 + + VeyonMaster + + No write access + Kein Schreibzugriff + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Ihre persönlichen Einstellungen konnten nicht gespeichert werden! Bitte überprüfen Sie den Pfad für die Benutzerkonfiguration mit Hilfe des %1 Configurators. + + VeyonServiceControl @@ -4531,6 +4829,10 @@ Der zweite Button entfernt den gewählten oder letzten Computer. Use input device interception driver Eingabegeräte-Interception-Treiber verwenden + + Use custom power scheme with disabled power button + Benutzerdefiniertes Energieschema mit deaktiviertem Ein-/Ausschaltknopf verwenden + WindowsPlatformPlugin diff --git a/translations/veyon_el.ts b/translations/veyon_el.ts index e0f1a48e6..165e8eb72 100644 --- a/translations/veyon_el.ts +++ b/translations/veyon_el.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: Υποστίρηξη ομάδων χρηστών - - Missing user groups backend - Έλλειψη υποστίριξης ομαδών χρηστών - - - No default user groups plugin was found. Please check your installation! - Δεν βρέθηκε κάνένα πρόσθετο για ομάδες χρηστών. Παρακαλούμε ελέγχξται την εγκατάσταση σας! - Restrict access to members of specific user groups Περιορισμός πρόσβασης σε μέλη συγκεκριμένης ομάδας χρηστών + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Η πρόσβαση στο δεδομένο σενάριο χρειάζεται άδεια από τον συνδεδεμένο χρήστη. - - ERROR: Unknown action - ΣΦΑΛΜΑ: Άγνωστη ενέργεια - Test result Αποτέλεσμα δοκιμής @@ -378,6 +381,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -468,10 +475,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! Επιλέξτε ένα κλειδί για διαγραφή! - - Please enter the name of the user group or role for which to import the authentication key: - - Please select a key to export! Επιλέξτε ένα κλειδί για εξαγωγή! @@ -484,6 +487,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1198,6 +1207,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1215,10 +1228,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 @@ -1268,11 +1277,23 @@ The public key is used on client computers to authenticate incoming connection r Όνομα: %1 - invalid + Hostname: %1 + + + + unknown + άγνωστο + + + IP address: %1 + + + + Hostname could not be resolved - [none] + No features active @@ -1344,6 +1365,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1402,6 +1435,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1550,6 +1587,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2176,6 +2221,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + Ομάδες χρηστών + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + Έλλειψη υποστίριξης ομαδών χρηστών + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2906,6 +2991,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3032,14 +3125,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration Ρυθμίσεις - - Disable balloon tooltips - - Show icons only Προβολή μόνο των εικονιδίων + + Disable tooltips + + MainWindow @@ -3247,10 +3340,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Τοποθεσίες & υπολογιστές + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3342,6 +3449,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name Μόνο όνομα χρήστη + + Only last part of user name + + Only computer name Μόνο όνομα υπολογιστή @@ -3426,6 +3537,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Διεύθυνση κεντρικού υπολογιστή + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3703,12 +3902,16 @@ Please save your work and close all programs. Απομακρυσμένος έλεγχος/προβολή ενός υπολογιστή - Please enter the hostname or IP address of the computer to access: + Show help about command + Εμφάνιση βοήθειας για την εντολή + + + Exchange clipboard contents - Show help about command - Εμφάνιση βοήθειας για την εντολή + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + @@ -3927,6 +4130,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4042,27 +4276,77 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Εκκίνηση της υπηρεσίας %1 + Service control + - Stopping service %1 - Τερματισμός της υπηρεσίας %1 + Starting %1 + - Registering service %1 + Stopping %1 - Unregistering service %1 + Restarting %1 - Service control + Registering %1 + + + + Unregistering %1 @@ -4146,6 +4430,14 @@ Typically this is required to support terminal servers. Duration: Διάρκεια: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4296,17 +4588,6 @@ The second button removes the selected or last computer. Μέγιστη χρήση CPU - - UserConfig - - No write access - Χωρίς πρόσβαση εγγραφής - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog @@ -4436,6 +4717,17 @@ The second button removes the selected or last computer. Οθόνη %1 + + VeyonMaster + + No write access + Χωρίς πρόσβαση εγγραφής + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + + VeyonServiceControl @@ -4508,6 +4800,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_es_ES.ts b/translations/veyon_es_ES.ts index f140f2c5e..dd229d497 100644 --- a/translations/veyon_es_ES.ts +++ b/translations/veyon_es_ES.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -138,19 +138,18 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla User groups backend: Backend para grupos de usuarios: - - Missing user groups backend - Falta backend para grupos de usuarios - - - No default user groups plugin was found. Please check your installation! - No se encontró el plugin por defecto para grupos de usuarios. ¡Por favor, compruebe la instalación! - Restrict access to members of specific user groups Restringir el acceso a miembros de grupos de usuarios específicos + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -325,6 +324,14 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla Session being accessed is a login screen La sesión a la que se accede es una pantalla de inicio de sesión + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -368,10 +375,6 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla The access in the given scenario needs permission of the logged on user. El acceso en el escenario dado necesita permiso del usuario conectado. - - ERROR: Unknown action - ERROR: Acción desconocida - Test result Resultado de la prueba @@ -380,6 +383,10 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla Authentication method Métodos de autenticación + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -473,10 +480,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Please select a key to delete! Por favor, ¡seleccione clave a eliminar! - - Please enter the name of the user group or role for which to import the authentication key: - Introduzca el nombre del grupo de usuarios o rol para el cual importar la clave de autenticación: - Please select a key to export! Por favor, ¡seleccione una clave a exportar! @@ -489,6 +492,12 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Please select a key which to set the access group for! ¡Seleccione una clave para configurar el grupo que tenga acceso! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1203,6 +1212,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu The specified command does not exist or no help is available for it. El comando especificado no existe o no hay ayuda sobre el. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1220,10 +1233,6 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu ComputerControlListModel - - Host/IP address: %1 - Equipo/Dirección IP: %1 - Active features: %1 Características activas: %1 @@ -1273,12 +1282,24 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Nombre: %1 - invalid - invalido + Hostname: %1 + - [none] - [ninguno/a] + unknown + desconocido + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active + @@ -1349,6 +1370,18 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. No se pudo determinar la ubicación de este equipo. Esto indica un problema con la configuración del sistema. En su lugar, se mostrarán todas las ubicaciones en el panel de selección del equipo. + + Logged in since + Conectado desde + + + %1 days + %1 días + + + 1 day + 1 día + ComputerMonitoring @@ -1407,6 +1440,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Could not write the computer and users list to %1! Please check the file access permissions. No se pudo escribir la lista de equipos y usuarios en %1. Por favor, compruebe los permisos de acceso al archivo. + + Search computers + Buscar equipos + ConfigCommands @@ -1555,6 +1592,14 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Slow down thumbnail updates while demo is running Ralentizar las actualizaciones de miniaturas mientras se ejecuta la demostración + + Bandwidth limit + Límite de ancho de banda + + + MB/s + MB/s + DemoFeaturePlugin @@ -2181,6 +2226,46 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Host private key file Archivo de clave privada de equipo + + Style: + Estilo: + + + Native + Nativo + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + Grupos de usuarios + + + Backend: + Backend: + + + Include user groups from domain + + + + Missing user groups backend + Falta backend para grupos de usuarios + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2930,6 +3015,14 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Query nested user groups (supported by AD only) Consultar grupos de usuarios anidados (compatible solo con AD) + + Query timeout + Tiempo vencido de consulta + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3056,14 +3149,14 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Configuration Configuración - - Disable balloon tooltips - Desactivar ayudas en globos - Show icons only Mostrar solo iconos + + Disable tooltips + Desactivar los tooltips + MainWindow @@ -3271,10 +3364,24 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Locations & computers Ubicaciones y equipos + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users Mostrar solo equipos con usuarios registrados + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3366,6 +3473,10 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Only user name Sólo nombre del usuario + + Only last part of user name + + Only computer name Sólo nombre del equipo @@ -3450,6 +3561,94 @@ La clave pública se usa en las computadoras cliente para autenticar la solicitu Open feature windows on the same screen as the main window Abrir ventanas de funciones en la misma pantalla que la ventana principal + + Configuration templates + + + + Image quality in monitoring mode + Calidad de imagen en modo de monitoreo + + + Highest + Más alto + + + High + Alto + + + Medium + Medio + + + Low + Bajo + + + Lowest + El más bajo + + + Remote access image quality + Calidad de imagen de acceso remoto + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Dirección del equipo + + + Session client address + Dirección del cliente de la sesión + + + Session client name + Nombre del cliente de sesión + + + Session host name + + + + Session metadata + + + + Full name of user + Nombre completo del usuario + + + User login name + Nombre de inicio de sesión del usuario + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + Calidad de imagen + MonitoringMode @@ -3728,14 +3927,18 @@ Por favor guarde su trabajo y cierre todos los programas. Remote view or control a computer Vista remota o control de un equipo - - Please enter the hostname or IP address of the computer to access: - Por favor, introduzca el nombre o la dirección IP del equipo a acceder: - Show help about command Mostrar ayuda sobre el comando + + Exchange clipboard contents + Intercambiar contenido del portapapeles + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + No se ha seleccionado ninguna computadora, por lo que puede introducir un nombre de host o dirección IP de una computadora para acceso manual: + RemoteAccessPage @@ -3953,6 +4156,37 @@ Por favor guarde su trabajo y cierre todos los programas. ¿Realmente desea eliminar todas las capturas de pantalla seleccionadas? + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4069,28 +4303,78 @@ Por lo general, esto es necesario para admitir servidores de terminales.Multi session mode (distinct server instance for each local and remote desktop session) Modo de sesión múltiple (instancia de servidor distinta para cada sesión de escritorio local y remota) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Ninguno + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Iniciando servicio %1 + Service control + Control de servicio - Stopping service %1 - Deteniendo servicio %1 + Starting %1 + - Registering service %1 - Registrando servicio %1 + Stopping %1 + - Unregistering service %1 - Eliminando registro de servicio %1 + Restarting %1 + - Service control - Control de servicio + Registering %1 + + + + Unregistering %1 + @@ -4173,6 +4457,14 @@ Por lo general, esto es necesario para admitir servidores de terminales.Duration: Duración: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4324,17 +4616,6 @@ El botón secundario elimina el equipo seleccionado o el último. Uso máximo de CPU - - UserConfig - - No write access - No hay acceso de escritura - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - No se pudo guardar su configuración personal. Compruebe la ruta del archivo de configuración del usuario utilizando el Configurador %1. - - UserLoginDialog @@ -4464,6 +4745,17 @@ El botón secundario elimina el equipo seleccionado o el último. Pantalla %1 + + VeyonMaster + + No write access + No hay acceso de escritura + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + No se pudo guardar su configuración personal. Compruebe la ruta del archivo de configuración del usuario utilizando el Configurador %1. + + VeyonServiceControl @@ -4536,6 +4828,10 @@ El botón secundario elimina el equipo seleccionado o el último. Use input device interception driver Utilice el controlador de interceptación del dispositivo de entrada + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_et.ts b/translations/veyon_et.ts index e228d863b..caa02157d 100644 --- a/translations/veyon_et.ts +++ b/translations/veyon_et.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: Kasutajarühmade taustaprogramm: - - Missing user groups backend - Puuduvad kasutajagruppide taustaprogrammid - - - No default user groups plugin was found. Please check your installation! - Kasutajate rühmade vaikepistikprogrammi ei leitud. Palun kontrollige oma installimist! - Restrict access to members of specific user groups Määratud gruppide liikmete juurdepääsu keelamine + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen Seanss, millele pääseb juurde, on sisselogimisekraan + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Antud stsenaariumi korral vajab juurdepääs sisseloginud kasutaja luba. - - ERROR: Unknown action - Viga: Tundmatu tegevus - Test result Testi tulemus @@ -378,6 +381,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method Autentimismeetod + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Please select a key to delete! Valige kustutamiseks võti! - - Please enter the name of the user group or role for which to import the authentication key: - Sisestage kasutajagrupi või rolli nimi, mille jaoks autentimisvõtit importida: - Please select a key to export! Valige eksportimiseks võti! @@ -487,6 +490,14 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Please select a key which to set the access group for! Valige võti, millele juurdepääsugrupp määrata! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + Sisestage selle kasutajarühma või rolli nimi, mille autentimisvõti importida. + +Veenduge, et üksteisele kuuluvate võtmete nimed oleksid kõikides arvutites identsed. + AuthKeysManager @@ -1201,6 +1212,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten The specified command does not exist or no help is available for it. Määratud käsku pole olemas või selle jaoks pole abi saadaval. + + Location "%1" not found. + Asukohta "%1" ei leitud. + BuiltinUltraVncServer @@ -1218,10 +1233,6 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten ComputerControlListModel - - Host/IP address: %1 - Host/IP aadress: %1 - Active features: %1 Aktiivsed funktsioonid: %1 @@ -1271,12 +1282,24 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Nimi: %1 - invalid - kehtetu + Hostname: %1 + + + + unknown + tundmatu + + + IP address: %1 + - [none] - [pole] + Hostname could not be resolved + + + + No features active + @@ -1347,6 +1370,18 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Selle arvuti asukohta ei õnnestunud kindlaks teha. See viitab probleemile süsteemi konfiguratsioonis. Kõik asukohad kuvatakse selle asemel arvuti valimise paneelil. + + Logged in since + Sisse logitud alates + + + %1 days + %1 päeva + + + 1 day + 1 päev + ComputerMonitoring @@ -1405,6 +1440,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Could not write the computer and users list to %1! Please check the file access permissions. Arvutit ja kasutajate loendi %1 kirjutamine nurjus! Kontrollige failidele juurdepääsu õigusi. + + Search computers + Otsige arvuteid + ConfigCommands @@ -1553,6 +1592,14 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Slow down thumbnail updates while demo is running Demo töötamise ajal pidurdage pisipiltide värskendusi + + Bandwidth limit + Ribalaiuse piirang + + + MB/s + MB/s + DemoFeaturePlugin @@ -2179,6 +2226,46 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Host private key file Hosti privaatvõtme fail + + Style: + Stiil: + + + Native + Kohalik + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + Kasutajagrupid + + + Backend: + Taustaprogramm: + + + Include user groups from domain + Kaasake domeeni kasutajarühmad + + + Missing user groups backend + Puuduvad kasutajagruppide taustaprogrammid + + + No user groups plugin was found. Please check your installation! + Ühtegi kasutajarühmade pistikprogrammi ei leitud. Palun kontrolli oma paigaldust! + HeadlessVncServer @@ -2928,6 +3015,14 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Query nested user groups (supported by AD only) Pesastatud kasutajarühmade päring (toetab ainult AD) + + Query timeout + Päringu ajalõpp + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3054,14 +3149,14 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Configuration Konfiguratsioon - - Disable balloon tooltips - Keelake tööriistavihjed - Show icons only Kuva ainult ikoone + + Disable tooltips + Keela tööriistavihjed + MainWindow @@ -3269,10 +3364,24 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Locations & computers Asukohad&arvutid + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users Kuva ainult arvutid, mille kasutajad on sisse logitud + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3364,6 +3473,10 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Only user name Vaid kasutaja nimi + + Only last part of user name + + Only computer name Vaid arvuti nimi @@ -3448,6 +3561,94 @@ Avalikku võtit kasutatakse klientarvutites sissetuleva ühenduse päringu auten Open feature windows on the same screen as the main window Avage funktsiooniaknad peaaknaga samal ekraanil + + Configuration templates + + + + Image quality in monitoring mode + Pildikvaliteet jälgimisrežiimis + + + Highest + Kõrgeim + + + High + Kõrge + + + Medium + Keskmine + + + Low + Madal + + + Lowest + Madalaim + + + Remote access image quality + Kaugjuurdepääsu pildikvaliteet + + + Advanced + + + + Computer name source + + + + Default + Vaikimisi + + + Host address + Seadme aadress + + + Session client address + Seansi kliendi aadress + + + Session client name + Seansi kliendi nimi + + + Session host name + + + + Session metadata + + + + Full name of user + Kasutaja täisnimi + + + User login name + Kasutaja sisselogimisnimi + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + Pildikvaliteet + MonitoringMode @@ -3726,14 +3927,18 @@ Salvestage oma töö ja sulgege kõik programmid. Remote view or control a computer Kaugvaatamine või arvuti kaughaldus - - Please enter the hostname or IP address of the computer to access: - Palun sisestage juurdepääsuks arvuti hostinimi või IP-aadress: - Show help about command Näita abi käsu kohta + + Exchange clipboard contents + Vahetage lõikepuhvri sisu + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Ühtegi arvutit pole valitud, nii et saate käsitsi juurdepääsuks sisestada arvuti hostinime või IP-aadressi: + RemoteAccessPage @@ -3951,6 +4156,37 @@ Salvestage oma töö ja sulgege kõik programmid. Kas soovite tõesti kõik valitud ekraanipildid kustutada? + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4067,28 +4303,80 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Multi session mode (distinct server instance for each local and remote desktop session) Mitme seansi režiim (iga kohaliku ja kaugtöölaua seansi jaoks eraldi serveri eksemplar) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + Mitmesugused seaded + + + Disable clipboard synchronization + Keela lõikelaua sünkroonimine + + + Session metadata + + + + Content + + + + None + Puudub + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + Keskkonna muutuja nimi + + + Registry key name: + Registrivõtme nimi + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + Soovi korral sisestage fikseeritud regulaaravaldis, et eraldada osa arvuti nimest ja kasutada seda arvuti kuvanimena. + +Näide: [^-]*-(PC[0-9]*) + ServiceControl - Starting service %1 - Käivita teenus %1 + Service control + Teenuse juhtimine - Stopping service %1 - Teenuse peatamine %1 + Starting %1 + - Registering service %1 - Teenuse registreerimine %1 + Stopping %1 + - Unregistering service %1 - Teenuse registreerimise tühistamine %1 + Restarting %1 + - Service control - Teenuse juhtimine + Registering %1 + + + + Unregistering %1 + @@ -4171,6 +4459,14 @@ Tavaliselt on see vajalik terminaliserverite toetamiseks. Duration: Kestus: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4322,17 +4618,6 @@ Teine nupp eemaldab valitud või viimase arvuti. Maksimaalne protsessori kasutamine - - UserConfig - - No write access - Kirjutusjuurdepääs puudub - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Teie isiklikke seadeid ei õnnestunud salvestada! Kontrollige kasutaja konfiguratsioonifaili teed %1 Konfiguraatori abil - - UserLoginDialog @@ -4462,6 +4747,17 @@ Teine nupp eemaldab valitud või viimase arvuti. Ekraan %1 + + VeyonMaster + + No write access + Kirjutusjuurdepääs puudub + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Teie isiklikke seadeid ei õnnestunud salvestada! Kontrollige kasutaja konfiguratsioonifaili teed %1 Konfiguraatori abil + + VeyonServiceControl @@ -4534,6 +4830,10 @@ Teine nupp eemaldab valitud või viimase arvuti. Use input device interception driver Kasutage sisendseadme pealtkuulamise draiverit + + Use custom power scheme with disabled power button + Kasutage kohandatud toiteskeemi koos keelatud toitenupuga + WindowsPlatformPlugin diff --git a/translations/veyon_fa.ts b/translations/veyon_fa.ts index a15c8d13d..417085760 100644 --- a/translations/veyon_fa.ts +++ b/translations/veyon_fa.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,15 +136,14 @@ If you're interested in translating Veyon into your local or another langua گروه های کاربر: - Missing user groups backend - گروه های کاربری فاقد بخش مدیریت - - - No default user groups plugin was found. Please check your installation! - هیچ پلاگین گروه کاربر پیش فرض یافت نشد لطفا نصب خود را بررسی کنید! + Restrict access to members of specific user groups + + + + AccessControlProvider - Restrict access to members of specific user groups + Provider for access control features @@ -322,6 +321,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -365,10 +372,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. دسترسی به سناریو داده شده نیاز به اجازه ورود کاربر دارد. - - ERROR: Unknown action - خطا: اقدام ناشناخته - Test result نتیجه تست @@ -377,6 +380,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -467,10 +474,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! لطفا یک کلید برای حذف انتخاب کنید! - - Please enter the name of the user group or role for which to import the authentication key: - لطفا نام گروه کاربری یا نقش را برای وارد کردن کلید تأیید اعتبار وارد کنید. - Please select a key to export! لطفا یک کلید برای صدورانتخاب کنید! @@ -483,6 +486,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! لطفا یک کلید را برای تنظیم گروه دسترسی برای انتخاب کنید! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1197,6 +1206,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1214,10 +1227,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - میزبان / آدرس آی پی :٪ 1 - Active features: %1 ویژگی های فعال:٪ 1 @@ -1267,11 +1276,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 + + + + unknown + + + + IP address: %1 - [none] + Hostname could not be resolved + + + + No features active @@ -1343,6 +1364,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1401,6 +1434,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. لیست کامپیوتر و کاربران را به٪ 1 نمی توان نوشت! لطفا مجوز دسترسی به فایل را بررسی کنید. + + Search computers + + ConfigCommands @@ -1549,6 +1586,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2175,6 +2220,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + گروه های کاربری فاقد بخش مدیریت + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2905,6 +2990,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ام اس + LdapNetworkObjectDirectoryConfigurationPage @@ -3032,11 +3125,11 @@ The public key is used on client computers to authenticate incoming connection r - Disable balloon tooltips + Show icons only - Show icons only + Disable tooltips @@ -3246,10 +3339,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3341,6 +3448,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name + + Only last part of user name + + Only computer name @@ -3425,6 +3536,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3701,14 +3900,18 @@ Please save your work and close all programs. Remote view or control a computer - - Please enter the hostname or IP address of the computer to access: - لطفا نام میزبان یا آدرس آی پی کامپیوتر را وارد کنید: - Show help about command نمایش راهنما در مورد این فرمان + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3926,6 +4129,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4041,27 +4275,77 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 + Service control - Stopping service %1 + Starting %1 - Registering service %1 + Stopping %1 - Unregistering service %1 + Restarting %1 - Service control + Registering %1 + + + + Unregistering %1 @@ -4145,6 +4429,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4295,17 +4587,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - عدم دسترسی نوشتن - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - تنظیمات شخصی شما ذخیره نشد لطفا مسیر پرونده پیکربندی کاربر را با استفاده از پیکربندی ٪ 1 بررسی کنید. - - UserLoginDialog @@ -4435,6 +4716,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + عدم دسترسی نوشتن + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + تنظیمات شخصی شما ذخیره نشد لطفا مسیر پرونده پیکربندی کاربر را با استفاده از پیکربندی ٪ 1 بررسی کنید. + + VeyonServiceControl @@ -4507,6 +4799,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_fr.ts b/translations/veyon_fr.ts index 8b9b049f0..54202d966 100644 --- a/translations/veyon_fr.ts +++ b/translations/veyon_fr.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, User groups backend: Groupes d'utilisateurs de processus d'arrière plan : - - Missing user groups backend - Groupes d'utilisateurs de processus d'arrière plan manquants - - - No default user groups plugin was found. Please check your installation! - Aucun greffon par défaut pour les groupes d'utilisateurs n'a été trouvé. Veuillez vérifier votre installation! - Restrict access to members of specific user groups Restreindre l'accès aux membres de groupes d'utilisateurs spécifiques + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Session being accessed is a login screen La session en cours d'accès est un écran de connexion + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, The access in the given scenario needs permission of the logged on user. L'accès dans le scénario donné demande la permission à l'utilisateur connecté. - - ERROR: Unknown action - ERREUR : Action inconnue - Test result Résultat du test @@ -378,6 +381,10 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, Authentication method Méthode d'authentification + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please select a key to delete! Veuillez sélectionner une clé à supprimer ! - - Please enter the name of the user group or role for which to import the authentication key: - Entrez le nom du groupe d'utilisateurs ou du rôle pour lequel se fait l'import de la clé d'authentification : - Please select a key to export! Veuillez sélectionner une clé à exporter ! @@ -487,6 +490,12 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Please select a key which to set the access group for! Veuillez sélectionner une clé pour accorder l'accès groupe ! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1201,6 +1210,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif The specified command does not exist or no help is available for it. La commande demandée n'existe pas et il n'y a pas d'aide à son propos. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif ComputerControlListModel - - Host/IP address: %1 - Adresse de l'hôte / IP : %1 - Active features: %1 Fonctionnalités activées : %1 @@ -1271,12 +1280,24 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Nom : %1 - invalid - invalide + Hostname: %1 + - [none] - [Aucun] + unknown + inconnu + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active + @@ -1347,6 +1368,18 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Impossible de déterminer l'emplacement de cet ordinateur. Cela indique un problème de configuration du système. A la place, tous les emplacements seront affichés dans le panneau de sélection de l'ordinateur. + + Logged in since + Connecté depuis + + + %1 days + %1 jours + + + 1 day + 1 jour + ComputerMonitoring @@ -1405,6 +1438,10 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Could not write the computer and users list to %1! Please check the file access permissions. Impossible d'écrire la liste des ordinateurs et des utilisateurs dans %1! Vérifiez le fichier des permissions d'accès. + + Search computers + Chercher des ordinateurs + ConfigCommands @@ -1553,6 +1590,14 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Slow down thumbnail updates while demo is running Ralentir la mise à jour des vignettes lorsque qu'une démo est en cours d'exécution + + Bandwidth limit + Limite de bande passante + + + MB/s + Mo/s + DemoFeaturePlugin @@ -2179,6 +2224,46 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Host private key file Fichier de clé privée de l'hôte + + Style: + Style: + + + Native + Natif + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + Groupes d'utilisateurs + + + Backend: + Méthode de fonctionnement: + + + Include user groups from domain + + + + Missing user groups backend + Groupes d'utilisateurs de processus d'arrière plan manquants + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2928,6 +3013,14 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Query nested user groups (supported by AD only) Interroger des groupes d'utilisateurs imbriqués (pris en charge par AD uniquement) + + Query timeout + Délai d'expiration de la requête + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3054,14 +3147,14 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Configuration Configuration - - Disable balloon tooltips - Désactiver les info-bulles - Show icons only Afficher seulement les icônes + + Disable tooltips + Désactiver les info-bulles + MainWindow @@ -3269,10 +3362,24 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Locations & computers Emplacements & ordinateurs + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users Afficher uniquement les ordinateurs avec des utilisateurs connectés + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3452,6 +3559,94 @@ La clé publique est utilisée sur les ordinateurs clients pour l'authentif Open feature windows on the same screen as the main window Ouvrir les fenêtres de fonctionnalités sur le même écran que la fenêtre principale + + Configuration templates + + + + Image quality in monitoring mode + Qualité d'image en mode surveillance + + + Highest + Supérieure + + + High + Élevée + + + Medium + Moyenne + + + Low + Basse + + + Lowest + La plus basse + + + Remote access image quality + Qualité de l'image de l'accès à distance + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Adresse hôte + + + Session client address + Adresse du client de la session + + + Session client name + Nom du client de la session + + + Session host name + + + + Session metadata + + + + Full name of user + Nom complet de l'utilisateur + + + User login name + Identifiant utilisateur + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + Qualité d'image + MonitoringMode @@ -3730,14 +3925,18 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Remote view or control a computer Vue à distance ou contrôle de l'ordinateur - - Please enter the hostname or IP address of the computer to access: - Pour accéder, veuillez entrer le nom de l'hôte ou l'adresse IP de l'ordinateur : - Show help about command Afficher la commande aide et à propos + + Exchange clipboard contents + Échanger le contenu du presse-papiers + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Aucun ordinateur n'a été sélectionné, vous pouvez donc saisir le nom d'hôte ou l'adresse IP d'un ordinateur pour un accès manuel : + RemoteAccessPage @@ -3955,6 +4154,37 @@ Veuillez sauvegarder votre travail et fermer tous les programmes. Souhaitez-vous vraiment supprimer toutes les captures d'écran sélectionnées? + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4071,28 +4301,78 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Multi session mode (distinct server instance for each local and remote desktop session) Mode multi-session (instance de serveur distincte pour chaque session de bureau local et distant) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + Paramètres divers + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Aucun + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + Nom de la variable d'environnement: + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Démarrage du service %1 + Service control + Contrôle du service - Stopping service %1 - Arrêt du service %1 + Starting %1 + - Registering service %1 - Inscription du service %1 + Stopping %1 + - Unregistering service %1 - Déinscription du service %1 + Restarting %1 + - Service control - Contrôle du service + Registering %1 + + + + Unregistering %1 + @@ -4175,6 +4455,14 @@ Généralement, ceci est nécessaire pour prendre en charge les serveurs de term Duration: Durée : + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4326,17 +4614,6 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin Utilisation maximale du processeur - - UserConfig - - No write access - Pas d'accès en écriture - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Impossible de sauvegarder vos paramétrages! Veuillez vérifier le chemin du fichier de configuration utilisateur en utilisant la console de gestion %1 - - UserLoginDialog @@ -4466,6 +4743,17 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin Écran %1 + + VeyonMaster + + No write access + Pas d'accès en écriture + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Impossible de sauvegarder vos paramétrages! Veuillez vérifier le chemin du fichier de configuration utilisateur en utilisant la console de gestion %1 + + VeyonServiceControl @@ -4538,6 +4826,10 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin Use input device interception driver Utiliser le pilote d'interception du périphérique d'entrée + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin @@ -4600,4 +4892,4 @@ Le deuxième bouton supprime l'ordinateur sélectionné ou le dernier ordin N'utilise pas l'extension X Damage - + \ No newline at end of file diff --git a/translations/veyon_he.ts b/translations/veyon_he.ts index 02500709c..5f3713a59 100644 --- a/translations/veyon_he.ts +++ b/translations/veyon_he.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -134,19 +134,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: שרת קבוצות משתמשים: - - Missing user groups backend - חסר שרת קבוצות משתמשים - - - No default user groups plugin was found. Please check your installation! - לא נמצא פלאגין של קבוצות משתמשים. בדוק את ההתקנה שלך! - Restrict access to members of specific user groups הגבל הרשאה לחברי קבוצה מסוימת + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -321,6 +320,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -364,10 +371,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. הגישה במקרה הניתן דורשת הרשאה מצד המשתמש המחובר. - - ERROR: Unknown action - שגיאה: פעולה לא ידועה - Test result תוצאות בדיקה @@ -376,6 +379,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method שיטת התחברות + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -469,10 +476,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! נא לבחור מפתח למחיקה! - - Please enter the name of the user group or role for which to import the authentication key: - נא להזין את שם קבוצת המשתמשים או התפקיד עבורם יש לייבא את מפתח האימות: - Please select a key to export! יש לבחור מפתח לייצוא! @@ -485,6 +488,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! נא לבחור מפתח עבורו יש להגדיר את קבוצת הגישה! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -614,7 +623,7 @@ The public key is used on client computers to authenticate incoming connection r <N/A> - + לא Failed to read key file. @@ -653,7 +662,7 @@ The public key is used on client computers to authenticate incoming connection r KEY - + מפתח ACCESS GROUP @@ -665,11 +674,11 @@ The public key is used on client computers to authenticate incoming connection r NAME - + שם FILE - + קובץ This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. @@ -685,7 +694,7 @@ The public key is used on client computers to authenticate incoming connection r TYPE - + סוג PAIR ID @@ -717,7 +726,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + קובץ מפתח Please specify the key name (e.g. "teacher/public") as the first argument. @@ -832,7 +841,7 @@ The public key is used on client computers to authenticate incoming connection r Logon - + התחברות @@ -880,7 +889,7 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPageTab Enabled - + מופעל Test @@ -930,19 +939,19 @@ The public key is used on client computers to authenticate incoming connection r Locations - + מיקומים Add new location - + הוסף מיקום חדש Remove selected location - + הסר את המיקום שנבחר New location - + מיקום חדש Directory name @@ -1013,7 +1022,7 @@ The public key is used on client computers to authenticate incoming connection r None - + כלום Computer @@ -1025,7 +1034,7 @@ The public key is used on client computers to authenticate incoming connection r Invalid - + לא בתוקף Error while parsing line %1. @@ -1061,7 +1070,7 @@ The public key is used on client computers to authenticate incoming connection r Add a location or computer - + הוסף מיקום או מחשב Clear all locations and computers @@ -1077,7 +1086,7 @@ The public key is used on client computers to authenticate incoming connection r Remove a location or computer - + הסר מיקום או מחשב Location "%1" @@ -1089,15 +1098,15 @@ The public key is used on client computers to authenticate incoming connection r Location - + מיקום FILE - + קובץ LOCATION - + מיקום FORMAT-STRING-WITH-PLACEHOLDERS @@ -1141,15 +1150,15 @@ The public key is used on client computers to authenticate incoming connection r TYPE - + סוג NAME - + שם PARENT - + הורה Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. @@ -1157,7 +1166,7 @@ The public key is used on client computers to authenticate incoming connection r Add a room - + הוסף חדר Add a computer to room %1 @@ -1165,7 +1174,7 @@ The public key is used on client computers to authenticate incoming connection r OBJECT - + חפץ Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. @@ -1181,11 +1190,11 @@ The public key is used on client computers to authenticate incoming connection r "Room 01" - + "חדר 01" "Computer 01" - + "מחשב 01" HOST ADDRESS @@ -1199,6 +1208,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1216,10 +1229,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 @@ -1254,7 +1263,7 @@ The public key is used on client computers to authenticate incoming connection r Location: %1 - + מיקום: %1 [no user] @@ -1269,11 +1278,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 + + + + unknown + לא ידוע + + + IP address: %1 + + + + Hostname could not be resolved - [none] + No features active @@ -1345,6 +1366,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1366,22 +1399,22 @@ The public key is used on client computers to authenticate incoming connection r Add to group - + הוסף לקבוצה Remove from group - + הסר מקבוצה ComputerSelectPanel Computer search - + חיפוש מחשב Add location - + הוסף מיקום Save computer/user list @@ -1397,12 +1430,16 @@ The public key is used on client computers to authenticate incoming connection r File error - + שגיאת קובץ Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1521,7 +1558,7 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + מכוונים ms @@ -1551,6 +1588,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -1572,7 +1617,7 @@ The public key is used on client computers to authenticate incoming connection r Demo - + הדגמה Share your screen or allow a user to share his screen with other users. @@ -1580,7 +1625,7 @@ The public key is used on client computers to authenticate incoming connection r Full screen demo - + הדגמה במסך מלא Share your own screen in fullscreen mode @@ -1592,11 +1637,11 @@ The public key is used on client computers to authenticate incoming connection r Share your own screen in a window - + שתף מסך שלך בחלון Share selected user's screen in fullscreen mode - + שתף את המסך של המשתמש שנבחר במצב מסך מלא In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. @@ -1604,7 +1649,7 @@ The public key is used on client computers to authenticate incoming connection r Share selected user's screen in a window - + שתף את המסך של המשתמש שנבחר בחלון In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. @@ -1620,7 +1665,7 @@ The public key is used on client computers to authenticate incoming connection r All screens - + כל המסכים @@ -1663,19 +1708,19 @@ The public key is used on client computers to authenticate incoming connection r Remove selected website - + הסר את האתר הנבחר URL - + קישור New website - + אתר חדש Applications & websites - + אפליקציה ואתר Predefined applications @@ -1683,7 +1728,7 @@ The public key is used on client computers to authenticate incoming connection r Add new application - + הוסף אפליקציה חדשה Remove selected application @@ -1691,11 +1736,11 @@ The public key is used on client computers to authenticate incoming connection r Add new website - + הוסף אתר חדש New application - + אפליקציה חדשה @@ -1714,11 +1759,11 @@ The public key is used on client computers to authenticate incoming connection r Custom website - + אתר מותאם אישית Start application - + התחל אפליקציה Click this button to start an application on all computers. @@ -1730,7 +1775,7 @@ The public key is used on client computers to authenticate incoming connection r Custom application - + אפליקציה מותאם אישית Start apps and open websites in user sessions @@ -1741,11 +1786,11 @@ The public key is used on client computers to authenticate incoming connection r DocumentationFigureCreator Teacher - + מורה Room %1 - + חדר %1 Please complete all tasks within the next 5 minutes. @@ -1753,7 +1798,7 @@ The public key is used on client computers to authenticate incoming connection r Custom website - + אתר מותאם אישית Open file manager @@ -1769,7 +1814,7 @@ The public key is used on client computers to authenticate incoming connection r Handout - + למסור Texts to read @@ -1781,7 +1826,7 @@ The public key is used on client computers to authenticate incoming connection r Custom application - + אפליקציה מותאם אישית @@ -1886,19 +1931,19 @@ The public key is used on client computers to authenticate incoming connection r Description - + תאור Master - + מנהל Service - + שרות Worker - + עובד UID @@ -1941,11 +1986,11 @@ The public key is used on client computers to authenticate incoming connection r FileTransferConfigurationPage File transfer - + העברת קבצים Directories - + מדריכים Destination directory @@ -1957,7 +2002,7 @@ The public key is used on client computers to authenticate incoming connection r Options - + אפשרויות Remember last source directory @@ -1979,11 +2024,11 @@ The public key is used on client computers to authenticate incoming connection r FileTransferDialog File transfer - + העברת קבצים Options - + אפשרויות Transfer only @@ -1999,11 +2044,11 @@ The public key is used on client computers to authenticate incoming connection r Files - + קובץ Start - + התחל Overwrite existing files @@ -2021,7 +2066,7 @@ The public key is used on client computers to authenticate incoming connection r FileTransferPlugin File transfer - + העברת קבצים Click this button to transfer files from your computer to all computers. @@ -2068,7 +2113,7 @@ The public key is used on client computers to authenticate incoming connection r Logging - + רישום Log file directory @@ -2080,7 +2125,7 @@ The public key is used on client computers to authenticate incoming connection r Nothing - + כלום Only critical messages @@ -2132,7 +2177,7 @@ The public key is used on client computers to authenticate incoming connection r Error - + שגיאה Could not remove all log files. @@ -2178,6 +2223,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + חסר שרת קבוצות משתמשים + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2475,7 +2560,7 @@ The public key is used on client computers to authenticate incoming connection r and - + ו LDAP test successful @@ -2762,7 +2847,7 @@ The public key is used on client computers to authenticate incoming connection r None - + כלום TLS @@ -2862,7 +2947,7 @@ The public key is used on client computers to authenticate incoming connection r Browse - + לדפדף Test @@ -2908,6 +2993,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + + LdapNetworkObjectDirectoryConfigurationPage @@ -3035,11 +3128,11 @@ The public key is used on client computers to authenticate incoming connection r הגדרות - Disable balloon tooltips + Show icons only - Show icons only + Disable tooltips @@ -3051,7 +3144,7 @@ The public key is used on client computers to authenticate incoming connection r toolBar - + סרגל כלים General @@ -3059,11 +3152,11 @@ The public key is used on client computers to authenticate incoming connection r &File - + &קובץ &Help - + &עזרה &Quit @@ -3115,11 +3208,11 @@ The public key is used on client computers to authenticate incoming connection r Service - + שרות Master - + מנהל Access control @@ -3131,7 +3224,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + אוטומטי About @@ -3211,7 +3304,7 @@ The public key is used on client computers to authenticate incoming connection r &Standard - + &רגיל &Advanced @@ -3227,7 +3320,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication - + אימות Adjust size of computer icons automatically @@ -3235,11 +3328,11 @@ The public key is used on client computers to authenticate incoming connection r Slideshow - + מצגת Spotlight - + זרקוֹר Veyon Master @@ -3249,16 +3342,30 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage Directories - + מדריכים User configuration @@ -3270,7 +3377,7 @@ The public key is used on client computers to authenticate incoming connection r Features - + תכונות All features @@ -3294,7 +3401,7 @@ The public key is used on client computers to authenticate incoming connection r Behaviour - + התנהגות Enforce selected mode for client computers @@ -3344,6 +3451,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name + + Only last part of user name + + Only computer name @@ -3414,7 +3525,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + אוטומטי Thumbnail aspect ratio @@ -3428,12 +3539,100 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode Monitoring - + פיקוח Builtin monitoring mode @@ -3478,14 +3677,14 @@ The public key is used on client computers to authenticate incoming connection r NetworkObjectDirectoryConfigurationPageTab Enabled - + מופעל NetworkObjectTreeModel Locations/Computers - + מיקומים/מחשבים @@ -3512,7 +3711,7 @@ The public key is used on client computers to authenticate incoming connection r Name: - + שם: Website name @@ -3535,11 +3734,11 @@ The public key is used on client computers to authenticate incoming connection r Description - + תאור Version - + גרסה UID @@ -3671,11 +3870,11 @@ Please save your work and close all programs. minutes - + דקות seconds - + שניות @@ -3705,11 +3904,15 @@ Please save your work and close all programs. - Please enter the hostname or IP address of the computer to access: + Show help about command - Show help about command + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: @@ -3779,7 +3982,7 @@ Please save your work and close all programs. Menu - + תפריט Alt+Ctrl+F1 @@ -3795,11 +3998,11 @@ Please save your work and close all programs. Exit - + יציאה Connecting... - + מתחבר... Select screen @@ -3807,7 +4010,7 @@ Please save your work and close all programs. All screens - + כל המסכים @@ -3929,6 +4132,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4044,28 +4278,78 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + כלום + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 + Service control + שליטה בשירות + + + Starting %1 - Stopping service %1 + Stopping %1 - Registering service %1 + Restarting %1 - Unregistering service %1 + Registering %1 - Service control - שליטה בשירות + Unregistering %1 + @@ -4148,6 +4432,14 @@ Typically this is required to support terminal servers. Duration: משך זמן: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4165,7 +4457,7 @@ Typically this is required to support terminal servers. Spotlight - + זרקוֹר Please select at least one computer to add. @@ -4181,7 +4473,7 @@ The second button removes the selected or last computer. StartAppDialog Start application - + התחל אפליקציה Please enter the applications to start on the selected computers. You can separate multiple applications by line. @@ -4201,7 +4493,7 @@ The second button removes the selected or last computer. Name: - + שם: e.g. VLC @@ -4298,17 +4590,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - אין גישת כתיבה - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog @@ -4438,6 +4719,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + אין גישת כתיבה + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + + VeyonServiceControl @@ -4510,6 +4802,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_hu.ts b/translations/veyon_hu.ts index 59b2e3fba..66a17f05d 100644 --- a/translations/veyon_hu.ts +++ b/translations/veyon_hu.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő User groups backend: Felhasználói csoportok háttere: - - Missing user groups backend - Hiányzik a felhasználói csoportok háttere - - - No default user groups plugin was found. Please check your installation! - Nincs alapértelmezett felhasználóicsoport-bővítmény. Kérem, ellenőrizd telepítésed! - Restrict access to members of specific user groups Hozzáférés tiltása meghatározott felhasználói csoport tagjainak + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -217,35 +216,35 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő Accessing computer and local computer - + Hozzáférés a számítógéphez és a helyi számítógéphez User being accessed - + Elérendő felhasználó is logged in locally - + helyileg jelentkezett be is logged in remotely - + távolról jelentkezett be No user is logged in locally - + Senki sem jelentkezett be helyileg One or multiple users are logged in locally - + Egy több felhasználó helyileg jelentkezett be No user is logged in remotely - + Senki sem jelentkezett be távolról One or multiple users are logged in remotely - + Egy több felhasználó távolról jelentkezett be is located at @@ -253,15 +252,15 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő is not located at - + nem helyezkedik el are located at the same location - + ugyanazon a helyen található are not located the same location - + nem ugyanazon a helyen található is member of group @@ -269,58 +268,66 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő is not member of group - + nem tagja a csoportnak is authenticated via - + hitelesítése is not authenticated via - + hitelesítése nem has one or more groups in common with user being accessed - + egy vagy több közös csoportja van az elérendő felhasználóval has no groups in common with user being accessed - + nincs közös csoportja van az elérendő felhasználóval equals user being accessed - + egyenlő az elérendő felhasználóval is different from user being accessed - + eltérő az elérendő felhasználótól is already connected - + már csatlakozott is not connected - + nem csatlakozott is local computer - + helyi számítógép is not local computer - + nem helyi számítógép Computer being accessed - + Elérendő számítógépek Session being accessed is a user session - + Az elérendő munkamenet egy felhasználói munkamenet Session being accessed is a login screen + Az elérendő munkamenet egy bejelentkezési képernyő + + + Local computer is already being accessed + + + + Local computer is not yet being accessed @@ -366,10 +373,6 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő The access in the given scenario needs permission of the logged on user. Az adott esetben a hozzáféréshez a bejelentkezett felhasználó jogosultságára van szükség. - - ERROR: Unknown action - HIBA: Ismeretlen művelet - Test result Teszt eredménye: @@ -378,6 +381,10 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő Authentication method Hitelesítési mód + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Please select a key to delete! Kérem, válaszd ki a törlendő kulcsot! - - Please enter the name of the user group or role for which to import the authentication key: - Kérem, add meg a felhasználó csoport vagy szerep nevét, amely számára importálod a hitelesítési kulcsot: - Please select a key to export! Kérem, válaszd ki az importálandó kulcsot! @@ -487,6 +490,12 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Please select a key which to set the access group for! Kérem, válassz egy kulcsot, amelyhez hozzáférési csoportot állítasz be! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -719,19 +728,19 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Key file - + Kulcsfájl Please specify the key name (e.g. "teacher/public") as the first argument. - + Kérem, add meg a kulcsnevet (pl. tanár/publikus) az első argumentumként. Please specify the command to display help for. - + Kérem, válaszd ki az a parancsot, melynek súgóját megjelenítsük. The specified command does not exist or no help is available for it. - + A megadott parancs nem létezik vagy nincs hozzá segítség. @@ -761,11 +770,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Username to bind DN mapping: - + Felhasználónév a DN-leképezés kötéséhez : e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + pl. %username%@DOMAIN or cn=%username%,ou=users,dc=pelda,dc=org @@ -776,7 +785,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Please enter your domain/LDAP username and password in order to access computers. - + Kérem, add meg domain/LDAP felhasználóneved és jelszavad a számítógépek eléréséhez. Username @@ -868,7 +877,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Simple password - + Egyszerű jelszó @@ -882,7 +891,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso AuthenticationPageTab Enabled - + Bekapcsolva Test @@ -948,11 +957,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Directory name - + Mappanév Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + CSV-fájlok importálása parancssori interfészen keresztül lehetséges. Bővebb információért látogasd meg az <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online dokumentációt</a>. @@ -1199,7 +1208,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso The specified command does not exist or no help is available for it. - + A megadott parancs nem létezik vagy nincs hozzá segítség. + + + Location "%1" not found. + Helyszín "%1" nem található. @@ -1218,10 +1231,6 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso ComputerControlListModel - - Host/IP address: %1 - Kiszolgáló/IP cím: %1 - Active features: %1 Aktív szolgáltatások: %1 @@ -1260,22 +1269,34 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso [no user] - + [nincs felhasználó] Veyon Server unreachable or not running - + Veyon szerver nem érhető el vagy nem fut Name: %1 + Név: %1 + + + Hostname: %1 - invalid + unknown + ismeretlen + + + IP address: %1 - [none] + Hostname could not be resolved + + + + No features active @@ -1311,14 +1332,14 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Active connections: - + Aktív kapcsolatok ComputerGroupSelector Group %1 - + %1 csoport @@ -1347,6 +1368,18 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Nem sikerült azt a helyszínt azonosítani, amelyikhez a számítógép tartozik. Ez a rendszer hibás konfigurálására utal. Ehelyett a számítógépkijelölés-panelen az összes helyszínt megjelenítjük. + + Logged in since + Bejelentkezve ekkortól + + + %1 days + %1 nap + + + 1 day + 1 nap + ComputerMonitoring @@ -1405,6 +1438,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Could not write the computer and users list to %1! Please check the file access permissions. Nem sikerült a számítógép- és a felhasználólista kiírása ide: %1. Ellenőrizd a hozzáférési jogosultságaidat. + + Search computers + Számítógépek keresése + ConfigCommands @@ -1505,7 +1542,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Could not configure the firewall configuration for the %1 Service. - + Nem módosíthatók %1 szolgáltatás tűzfalbeállításai. @@ -1553,6 +1590,14 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Slow down thumbnail updates while demo is running Indexképek frissítésének lassítása a demó futása alatt. + + Bandwidth limit + Sávszélesség korlátozása + + + MB/s + MB/s + DemoFeaturePlugin @@ -1574,55 +1619,55 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Demo - + Demo Share your screen or allow a user to share his screen with other users. - + Oszd meg a képernyődet vagy engedélyezd egy felhasználónak, hogy megossza a képernyőjét a többiekkel. Full screen demo - + Teljes képernyős demó Share your own screen in fullscreen mode - + Saját képernyőm megosztása teljes nézetben In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Ebben a módban az összes számítógépen teljes képernyőn jelenik meg a képernyőd, egyúttal a felhasználók bemeneti eszközeit zároljuk. Share your own screen in a window - + Saját képernyőm megosztása ablakban Share selected user's screen in fullscreen mode - + Kiválasztott felhasználó képernyőjének megosztása teljes nézetben In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Ebben a módban az összes számítógépen teljes képernyőn jelenik meg a kiválasztott felhasználó képernyőképe, egyúttal a felhasználók bemeneti eszközeit zároljuk. Share selected user's screen in a window - + Kiválasztott felhasználó képernyőjének megosztása ablakban In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Ebben a módban az összes számítógépen ablakban jelenik meg a kiválasztott felhasználó képernyőképe. A felhasználók eközben ablakot tudnak váltani. Please select a user screen to share. - + Válaszd ki a megosztandó képernyőt. Please select only one user screen to share. - + Csak egy képernyőt válassz a megosztáshoz. All screens - + Összes képernyő @@ -1676,27 +1721,27 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Applications & websites - + Alkalmazások & weboldalak Predefined applications - + Előre definiált alkalmazások Add new application - + Új alkalmazás hozzáadása Remove selected application - + Kiválasztott alkalmazás eltávolítása Add new website - + Új weboldal hozzáadása New application - + Új alkalmazás @@ -1719,23 +1764,23 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Start application - + Alkalmazás indítása Click this button to start an application on all computers. - + Kattints erre a gombra, hogy az összes számítógépen elinduljon egy alkalmazás. Start application "%1" - + "%1" alkalmazás indítása Custom application - + Egyéni alkalmazás Start apps and open websites in user sessions - + Alkalmazások indítása és a weboldalak megnyitása felhasználói munkamenetekben @@ -1782,7 +1827,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Custom application - + Egyéni alkalmazás @@ -1811,31 +1856,31 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso FeatureCommands List names of all available features - + Az összes elérhető funkció nevének felsorolása Show table with details of all available features - + Az összes elérhető funkció adatainak táblázata Start a feature on a remote host - + Funkció indítása egy távoli kiszolgálón Stop a feature on a remote host - + Funkció leállítása egy távoli kiszolgálón Please specify the command to display help for. - + Kérem, válaszd ki az a parancsot, melynek súgóját megjelenítsük. Displays a list with the names of all available features. - + Megjelenít egy felsorolást az összes elérhető funkció nevével. Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. - + Megjelenít egy táblázatot az összes elérhető funkció adataival. Ez tartalmazza a leírást, az UID-t, a funkciót biztosító beépülő modul nevét és néhány egyéb megvalósítással kapcsolatos részletet. HOST ADDRESS @@ -1843,43 +1888,43 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso FEATURE - + TULAJDONSÁG ARGUMENTS - + ÉRVEK Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information - + Elindítja a megadott szolgáltatást a megadott kiszolgálón a távolról futó Veyon-szerverhez való csatlakozással. A szolgáltatás névvel vagy UID-vel adható meg. Az összes elérhető funkció megtekintéséhez használja a ``show`` parancsot. A szolgáltatástól függően további argumentumokat (például a megjelenítendő szöveges üzenetet) kell megadni egyetlen JSON-karakterláncként kódolva. További információért tekintse meg a fejlesztői dokumentációt Lock the screen - + Képernyő zárolása Display a text message - + Szöveges üzenet megjelenítése Test message - + Tesztüzenet Start an application - + Alkalmazás indítása Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. - + Leállítja a megadott szolgáltatást a megadott kiszolgálón a távoli Veyon-szerverhez való csatlakozással. A szolgáltatás névvel vagy UID-vel adható meg. Az összes elérhető funkció megtekintéséhez használja a ``show`` parancsot. Unlock the screen - + Képernyő zárolásának feloldása The specified command does not exist or no help is available for it. - + A megadott parancs nem létezik vagy nincs hozzá segítség. Name @@ -1887,7 +1932,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Description - + Leírás Master @@ -1899,43 +1944,43 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Worker - + Dolgozó UID - + UID Plugin - + Bővítmény Invalid feature name or UID specified - + Érvénytelen tulajdonságnév vagy UID megadás Error parsing the JSON-encoded arguments: %1 - + Hiba a JSON-kódolású argumentumok elemzése során: %1 Failed to initialize credentials - + Nem sikerült inicializálni a hitelesítő adatokat Could not establish a connection to host %1 - + %1 kiszolgálóval nem sikerült kapcsolatot létesíteni. Failed to send feature control message to host %1 - + %1 kiszolgálóhoz nem sikerült elküldeni a funkcióvezérlő üzenetet. Feature-related CLI operations - + Funkciókhoz kapcsolódó CLI műveletek Commands for controlling features - + Funkcióvezérlés parancsai @@ -1950,11 +1995,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Destination directory - + Célmappa Default source directory - + Alapértelmezett forráskönyvtár Options @@ -1962,11 +2007,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Remember last source directory - + Emlékezz az utolsó forráskönyvtárra Create destination directory if it does not exist - + Célmappa létrehozása, ha nem létezik @@ -2157,15 +2202,15 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso TLS configuration - + TLS konfiguráció Use certificate authority for TLS connections - + Tanúsítványhitelesítő használata a TLS kapcsolatokhoz CA certificate file - + CA tanúsítványfájl ... @@ -2173,10 +2218,50 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Host certificate file - + Kiszolgálótanúsítvány-fájl Host private key file + Kiszolgáló privát kulcs fájl + + + Style: + Stílus: + + + Native + Natív + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + Felhasználói csoportok + + + Backend: + Háttér: + + + Include user groups from domain + + + + Missing user groups backend + Hiányzik a felhasználói csoportok háttere + + + No user groups plugin was found. Please check your installation! @@ -2184,7 +2269,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso HeadlessVncServer Headless VNC server - + Headless VNC szerver @@ -2439,7 +2524,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Computer groups filter - + Számítógépcsoport-szűrő Computer locations identification @@ -2451,11 +2536,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Invalid test value - + Érvénytelen tesztérték An empty or invalid value has been supplied for this test. - + Egy üres vagy érvénytelen értéket adtál meg ehhez a teszthez. LDAP %1 test failed @@ -2527,7 +2612,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso LDAP directory - + LDAP könyvtár @@ -2918,15 +3003,23 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Directory name - + Mappanév Query options - + Lekérdezési lehetőségek Query nested user groups (supported by AD only) - + Beágyazott felhasználói csoportok lekérdezése (csak az AD által támogatott) + + + Query timeout + Lekérdezési időtúllépés + + + ms + ms @@ -2937,7 +3030,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + Kérem, használd a globális LDAP konfigurációs oldalt a helyek és számítógépek LDAP-alapú címtárszolgáltatásából való lekérésének konfigurálásához. @@ -2988,7 +3081,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Test binding to an LDAP server - + Tesztkötés egy LDAP-szerverhez The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. @@ -2996,7 +3089,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso LDAP bind - + LDAP kötés @@ -3015,11 +3108,11 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso User sessions - + Felhasználói munkamenetek Minimum session lifetime before server start - + A munkamenet minimális élettartama a szerver indítása előtt User login @@ -3027,7 +3120,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Login key sequence - + Bejelentkezési billentyűsorozat @@ -3054,14 +3147,14 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Configuration Konfiguráció - - Disable balloon tooltips - Buborék-eszköztippek kikapcsolása - Show icons only Csak az ikonok megjelenítése + + Disable tooltips + Eszköztippek kikapcsolása + MainWindow @@ -3251,26 +3344,40 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Adjust size of computer icons automatically - + Számítógépikonok automatikus méretezése Slideshow - + Diavetítés Spotlight - + Reflektorfény Veyon Master - + Veyon Master Locations & computers Helyszínek és számítógépek + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + Csak olyan számítógépeket megjelenítése, melyekre bejelentkezett felhasználó. + + + Load computer positions + + + + Save computer positions @@ -3364,6 +3471,10 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Only user name Csak felhasználónév + + Only last part of user name + + Only computer name Csak számítógépnév @@ -3418,19 +3529,19 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Use modern user interface (experimental) - + Modern felhasználói felületet (kísérleti) Thumbnail spacing - + Indexkép térköze px - + px Hide local session - + Helyi munkamenet elrejtése Auto @@ -3438,16 +3549,104 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Thumbnail aspect ratio - + Indexkép méretaránya Automatically adjust computer icon size - + Számítógépikon automatikus méretezése Open feature windows on the same screen as the main window + A funkcióablakok megnyitása a főablakkal azonos képernyőn. + + + Configuration templates + + + + Image quality in monitoring mode + Képminőség a monitorozási módban + + + Highest + Legmagasabb + + + High + Magas + + + Medium + Közepes + + + Low + Alacsony + + + Lowest + Legalacsonyabb + + + Remote access image quality + Távoli hozzáférés képminősége + + + Advanced + + + + Computer name source + + + + Default + Alap + + + Host address + Kiszolgáló címe + + + Session client address + Munkamenet kliens címe + + + Session client name + Munkamenet ügyfél neve + + + Session host name + + + + Session metadata + + + + Full name of user + A felhasználók teljes neve + + + User login name + A felhasználó bejelentkezési neve + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + Image quality + Képminőség + MonitoringMode @@ -3465,22 +3664,22 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Query application version of the server - + A szerver alkalmazásverziójának lekérdezése Query active features - + Aktív funkciók lekérdezése Query properties of remotely available screens - + A távolról elérhető képernyők tulajdonságainak lekérdezése NestedNetworkObjectDirectory All directories - + Összes mappa @@ -3498,7 +3697,7 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso NetworkObjectDirectoryConfigurationPageTab Enabled - + Bekapcsolva @@ -3536,18 +3735,18 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Website name - + Weboldal neve PluginCommands List names of all installed plugins - + Az összes elérhető bővítmény nevének felsorolása Show table with details of all installed plugins - + Az összes telepített bővítmény adatainak táblázata Name @@ -3555,23 +3754,23 @@ A nyilvános kulcsrészt a kliens számítógépen használjuk a bejövő kapcso Description - + Leírás Version - + Verzió UID - + UID Plugin-related CLI operations - + Bővítményekhez kapcsolódó CLI műveletek Commands for managing plugins - + Parancsok a bővítmények kezeléséhez @@ -3668,15 +3867,15 @@ Please save your work and close all programs. Do you really want to reboot <b>ALL</b> computers? - + Biztos, hogy újraindítod az <b>ÖSSZES</b> számítógépet? Do you really want to power down <b>ALL</b> computers? - + Biztos, hogy kikapcsolod az <b>ÖSSZES</b> számítógépet? Do you really want to power down the selected computers? - + Biztos, hogy kikapcsolod a kiválasztott számítógépeket? @@ -3724,20 +3923,24 @@ Please save your work and close all programs. Remote view or control a computer Egy számítógép távoli megtekintése vagy vezérlése - - Please enter the hostname or IP address of the computer to access: - Kérem, add meg az elérni kívánt gép nevét vagy IP címét: - Show help about command Parancsról segítség megjelenítése + + Exchange clipboard contents + Vágólap tartalmának cseréje + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Nem választottál számítógépet, így beírhatsz egy kiszolgálónevet vagy IP-címet az eléréshez: + RemoteAccessPage Remote access: %1 - + Távoli elérés: %1 @@ -3748,7 +3951,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Távoli elérés @@ -3819,15 +4022,15 @@ Please save your work and close all programs. Connecting... - + Csatlakozás... Select screen - + Képernyő kiválasztása All screens - + Összes képernyő @@ -3854,11 +4057,11 @@ Please save your work and close all programs. Unlock input devices - + Beviteli eszközök zárolásának feloldása To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Az összes felhasználó figyelmének elnyerés érdekében evvel a gombbal zárolhatod számítógépüket. Ebben a módban az összes bemeneti eszközt zároljuk, a képernyők viszont továbbra is láthatók maradnak. @@ -3877,7 +4080,7 @@ Please save your work and close all programs. Could not open screenshot file %1 for writing. - + %1 képernyőkép fájl nem nyitható meg írásra. @@ -3946,6 +4149,37 @@ Please save your work and close all programs. Do you really want to delete all selected screenshots? + Biztos, hogy eltávolítod a kiválasztott képernyőképeket? + + + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access @@ -4022,15 +4256,15 @@ Typically this is required to support terminal servers. Maximum session count - + Maximális munkamenetszám Network port numbers - + Hálózati portok száma Veyon server - + Veyon szerver Internal VNC server @@ -4046,46 +4280,98 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + Egyéb hálózati beállítások Session mode - + Munkamenet mód Local session mode (single server instance for primary local session) - + Helyi munkamenet mód (egyetlen kiszolgálópéldány az elsődleges helyi munkamenethez) Active session mode (single server instance for active local or remote session) - + Aktív munkamenet mód (egyetlen kiszolgálópéldány az aktív hely vagy távoli munkamenethez) Multi session mode (distinct server instance for each local and remote desktop session) + Többszörös munkamenet mód (különálló szerverpéldány minden helyi és távoli asztali munkamenethez) + + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + Egyéb beállítások + + + Disable clipboard synchronization + A vágólap szinkronizálásának kikapcsolása + + + Session metadata + + + + Content + + None + Egyik sem + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + Környezeti változó neve: + + + Registry key name: + Rendszerleíró kulcs neve: + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + Opcionálisan írj egy reguláris kifejezést a számítógépnév egy részének kinyeréséhez, és használd ezt a számítógép megjelenített neveként. + +Példa: [^-]*-(PC[0-9]*) + ServiceControl - Starting service %1 - %1 szolgáltatás indítása + Service control + Szolgáltatásvezérlés - Stopping service %1 - %1 szolgáltatás leállítása + Starting %1 + - Registering service %1 - %1 szolgáltatás nyilvántartásban vétele + Stopping %1 + - Unregistering service %1 - %1 szolgáltatás törlése a nyilvántartásból + Restarting %1 + - Service control - Szolgáltatásvezérlés + Registering %1 + + + + Unregistering %1 + @@ -4143,7 +4429,7 @@ Typically this is required to support terminal servers. Interactive shell and script execution for Veyon CLI - + Interaktív shell- és szkript-végrehajtás a Veyon CLI-hez Commands for shell functionalities @@ -4154,18 +4440,26 @@ Typically this is required to support terminal servers. SlideshowPanel Previous - + Előző Start/pause - + Indítás/szünet Next - + Következő Duration: + Időtartam: + + + View in separate window + + + + %1 Master – Slideshow @@ -4173,39 +4467,40 @@ Typically this is required to support terminal servers. SpotlightPanel Add selected computers - + Kiválasztott számítógép hozzáadása Remove selected computers - + Kiválasztott számítógép eltávolítása Update computers in realtime - + Számítógépek valósidejű frissítése Spotlight - + Reflektorfény Please select at least one computer to add. - + Kérjük, válassz legalább egy számítógépet hozzáadáshoz. Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + Számítógépek hozzáadásához kattints a középső egérgombbal vagy kattints a lenti első gombra. +A második gomb eltávolítja a kiválasztott vagy az utolsó számítógépet. StartAppDialog Start application - + Alkalmazás indítása Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + Kérem, add meg a kiválasztott számítógépeken futtatandó alkalmazásokat. Több alkalmazást sorokkal válassz el. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" @@ -4213,11 +4508,11 @@ The second button removes the selected or last computer. Remember and add to application menu - + Ne felejtsd el és add hozzá az alkalmazás menüjéhez Application name - + Alkalmazás neve Name: @@ -4265,7 +4560,7 @@ The second button removes the selected or last computer. Please enter your message which send to all selected users. - + Kérem, gépeld be az összes kiválasztott felhasználóknak küldendő üzenetedet. @@ -4315,18 +4610,7 @@ The second button removes the selected or last computer. Maximum CPU usage - - - - - UserConfig - - No write access - Nincs írási hozzáférés - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Személyes beállításait nem sikerült menteni! Kérem, ellenőrizd a felhasználói konfigurációs fájl útvonalát %1 Konfigurátorban. + Maximális CPU használat @@ -4380,7 +4664,7 @@ The second button removes the selected or last computer. Do you really want to log off <b>ALL</b> users? - + Biztos, hogy kijelentkezteted az <b>ÖSSZES</b> felhasználót? @@ -4455,7 +4739,18 @@ The second button removes the selected or last computer. Screen %1 - + %1 képernyő + + + + VeyonMaster + + No write access + Nincs írási hozzáférés + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Személyes beállításait nem sikerült menteni! Kérem, ellenőrizd a felhasználói konfigurációs fájl útvonalát %1 Konfigurátorban. @@ -4528,6 +4823,10 @@ The second button removes the selected or last computer. Use input device interception driver + A beviteli eszköz elfogási illesztőprogramjának használata + + + Use custom power scheme with disabled power button @@ -4539,7 +4838,7 @@ The second button removes the selected or last computer. Internal display - + Belső képernyő @@ -4562,19 +4861,19 @@ The second button removes the selected or last computer. The service "%1" could not be installed (error %2). - + "%1" szolgáltatás nem telepíthető (hiba: %2). Could not change the failure actions config for service "%1" (error %2). - + "%1" szolgáltatás hibaeseményeinek konfigurációja nem módosítható (hiba: %2). The service "%1" could not be uninstalled (error %2). - + "%1" szolgáltatás nem távolítható el (hiba: %2). The start type of service "%1" could not be changed (error %2). - + "%1" szolgáltatás indítási típusa nem módosítható (hiba: %2). diff --git a/translations/veyon_id.ts b/translations/veyon_id.ts index 413244b3a..1235e2e28 100644 --- a/translations/veyon_id.ts +++ b/translations/veyon_id.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a User groups backend: Kelompok pengguna backend: - - Missing user groups backend - Backend grup pengguna tidak ada - - - No default user groups plugin was found. Please check your installation! - Tidak ditemukan pengaya grup pengguna bawaan. Sila cek instalasi Anda! - Restrict access to members of specific user groups Batasi akses ke pengguna dari grup pengguna tertentu + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Session being accessed is a login screen Sesi yang diakses adalah layar log masuk + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a The access in the given scenario needs permission of the logged on user. Akses dalam skenario yang diberikan membutuhkan izin dari pengguna yang masuk. - - ERROR: Unknown action - GALAT: Aksi tidak diketahui - Test result Hasil test @@ -378,6 +381,10 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a Authentication method Metode autentikasi + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please select a key to delete! Pilih kunci yang akan dihapus! - - Please enter the name of the user group or role for which to import the authentication key: - Harap masukkan nama grup pengguna atau peran untuk mengimpor kunci autentikasi: - Please select a key to export! Pilih kunci yang akan diekspor! @@ -487,6 +490,12 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Please select a key which to set the access group for! Silakan pilih kunci untuk mengatur grup akses! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1201,6 +1210,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone The specified command does not exist or no help is available for it. Perintah yang ditentukan tidak ada atau tidak ada bantuan yang tersedia untuk itu. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone ComputerControlListModel - - Host/IP address: %1 - Host/Alamat IP: %1 - Active features: %1 Fitur aktif: %1 @@ -1271,11 +1280,23 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone - invalid + Hostname: %1 + + + + unknown - [none] + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1347,6 +1368,18 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Tidak dapat menentukan lokasi komputer ini. Ini menunjukkan masalah dengan konfigurasi sistem. Semua lokasi akan ditampilkan di panel pilih komputer sebagai gantinya. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1405,6 +1438,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1553,6 +1590,14 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2179,6 +2224,46 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + Backend: + + + Include user groups from domain + + + + Missing user groups backend + Backend grup pengguna tidak ada + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2909,6 +2994,14 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3035,14 +3128,14 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Configuration Konfigurasi - - Disable balloon tooltips - Nonaktifkan tooltips balon - Show icons only Hanya tampilkan icon + + Disable tooltips + + MainWindow @@ -3250,10 +3343,24 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Locations & computers Lokasi & komputer + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3345,6 +3452,10 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Only user name Hanya nama pengguna + + Only last part of user name + + Only computer name Hanya nama komputer @@ -3429,6 +3540,94 @@ Kunci publik digunakan pada komputer klien untuk mengautentikasi permintaan kone Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Alamat host + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3706,12 +3905,16 @@ Please save your work and close all programs. - Please enter the hostname or IP address of the computer to access: + Show help about command + Tunjukkan bantuan tentang perintah + + + Exchange clipboard contents - Show help about command - Tunjukkan bantuan tentang perintah + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + @@ -3930,6 +4133,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4045,28 +4279,78 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Tidak ada + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Mulai layanan %1 + Service control + Kontrol Layanan - Stopping service %1 - Matikan layanan %1 + Starting %1 + - Registering service %1 - Daftarkan layanan %1 + Stopping %1 + - Unregistering service %1 - Batalkan pendaftaran layanan %1 + Restarting %1 + - Service control - Kontrol Layanan + Registering %1 + + + + Unregistering %1 + @@ -4149,6 +4433,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4299,17 +4591,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog @@ -4439,6 +4720,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + + VeyonServiceControl @@ -4511,6 +4803,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin @@ -4539,11 +4835,11 @@ The second button removes the selected or last computer. Service "%1" could not be found. - + Layanan "%1" tidak dapat ditemukan The service "%1" could not be installed (error %2). - + Layanan "%1" tidak dapat dipasang (kesalahan %2). Could not change the failure actions config for service "%1" (error %2). @@ -4551,7 +4847,7 @@ The second button removes the selected or last computer. The service "%1" could not be uninstalled (error %2). - + Layanan "%1" tidak dapat dilepaskan (kesalahan %2). The start type of service "%1" could not be changed (error %2). diff --git a/translations/veyon_it.ts b/translations/veyon_it.ts index 61aba76a1..5e29b3fa9 100644 --- a/translations/veyon_it.ts +++ b/translations/veyon_it.ts @@ -1,9 +1,9 @@ - + AboutDialog About - Informazioni su + Informazioni Translation @@ -126,7 +126,7 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche The specified user is not allowed to access computers with this configuration. - L'utente indicato non è abilitato ad accedere a computer con questa confiugurazione. + L'utente indicato non è abilitato ad accedere a computer con questa configurazione. Enable usage of domain groups @@ -136,19 +136,18 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche User groups backend: Backend del gruppo utenti: - - Missing user groups backend - Backend dei gruppi utente non presente - - - No default user groups plugin was found. Please check your installation! - Non è stato trovato alcun plug-in predefinito per gruppi di utenti. Per favore controlla la tua installazione! - Restrict access to members of specific user groups Limita l'accesso a specifici membri di gruppi utenti + + AccessControlProvider + + Provider for access control features + Fornitore di funzionalità di controllo degli accessi + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche Session being accessed is a login screen La sessione a cui si accede è una schermata di accesso + + Local computer is already being accessed + È già in corso l'accesso al computer locale + + + Local computer is not yet being accessed + Il computer locale non è ancora in fase di accesso + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche The access in the given scenario needs permission of the logged on user. L'accesso allo scenario fornito richiede l'autorizzazione dell'utente connesso. - - ERROR: Unknown action - ERRORE: azione sconosciuta - Test result Risultati del test @@ -378,6 +381,10 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche Authentication method Metodo di autenticazione + + There is no matching rule with a valid action. The access is therefore denied. + Non esiste una regola corrispondente con un'azione valida. L'accesso è quindi negato. + AuthKeysConfigurationWidget @@ -468,10 +475,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! Seleziona la chiave da eliminare! - - Please enter the name of the user group or role for which to import the authentication key: - Inserire il nome del gruppo o ruolo dell'utente per il quale importare la chiave di autenticazione: - Please select a key to export! Seleziona la chiave da esportare! @@ -484,6 +487,14 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! Si prega di selezionare una chiave per impostare il gruppo di accesso! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + Inserisci il nome del gruppo di utenti o del ruolo per cui importare la chiave di autenticazione. + +Assicurati che i nomi delle chiavi che appartengono l'una all'altra siano identici su tutti i computer. + AuthKeysManager @@ -1198,6 +1209,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. Il comando specificato non esiste o non è disponibile alcun aiuto. + + Location "%1" not found. + Posizione "%1" non trovata. + BuiltinUltraVncServer @@ -1215,10 +1230,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - Host/indirizzo IP: %1 - Active features: %1 Funzioni attive: %1 @@ -1268,12 +1279,24 @@ The public key is used on client computers to authenticate incoming connection r Nome: %1 - invalid - non valido + Hostname: %1 + Nome host: %1 + + + unknown + sconosciuto + + + IP address: %1 + Indirizzo IP: %1 - [none] - [nessuno] + Hostname could not be resolved + Il nome host non può essere risolto + + + No features active + Nessuna funzione attiva @@ -1344,6 +1367,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Impossibile determinare la posizione di questo computer. Questo indica un problema con la configurazione del sistema. Tutte le posizioni verranno visualizzate nel pannello di selezione del computer. + + Logged in since + Collegato dal + + + %1 days + %1 giorni + + + 1 day + 1 giorno + ComputerMonitoring @@ -1402,6 +1437,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. Impossibile scrivere l'elenco computer e utenti su %1! Controllare i permessi di accesso al file. + + Search computers + Cerca computer + ConfigCommands @@ -1550,6 +1589,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running Rallenta gli aggiornamenti delle miniature mentre la demo è in esecuzione + + Bandwidth limit + Limite di larghezza di banda + + + MB/s + MB/s + DemoFeaturePlugin @@ -2176,6 +2223,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file File della chiave privata dell'host + + Style: + Stile: + + + Native + Nativo + + + Color scheme: + Schema di colori: + + + Light + Leggero + + + Dark + Scuro + + + User groups + Gruppi utenti + + + Backend: + Backend: + + + Include user groups from domain + Includi gruppi di utenti dal dominio + + + Missing user groups backend + Backend dei gruppi utente non presente + + + No user groups plugin was found. Please check your installation! + Nessun plugin per gruppi di utenti è stato trovato. Controlla la tua installazione! + HeadlessVncServer @@ -2915,6 +3002,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) Interroga gruppi di utenti annidati (supportato solo da AD) + + Query timeout + Timeout query + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3041,14 +3136,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration Configurazione - - Disable balloon tooltips - Disabilita tooltip dei palloncini - Show icons only Mostra solamente le icone + + Disable tooltips + Disabilita i tooltip + MainWindow @@ -3256,10 +3351,26 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Posizioni e computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + Utilizza la disposizione personalizzata del computer. + +Tieni premuto per caricare la disposizione da un file o salvare la disposizione corrente in un file. + Only show computers with logged on users Mostra solo computer con utenti connessi + + Load computer positions + Carica le posizioni del computer + + + Save computer positions + Salva le posizioni del computer + MasterConfigurationPage @@ -3351,6 +3462,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name Solo il nome utente + + Only last part of user name + + Only computer name Solo il nome del computer @@ -3435,6 +3550,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window Apri le finestre delle funzioni sulla stessa schermata della finestra principale + + Configuration templates + Modelli di configurazione + + + Image quality in monitoring mode + Qualità dell'immagine in modalità di monitoraggio + + + Highest + Più alto + + + High + Alta + + + Medium + Media + + + Low + Bassa + + + Lowest + Minima + + + Remote access image quality + Qualità dell'immagine per l'accesso remoto + + + Advanced + Avanzato + + + Computer name source + Origine del nome del computer + + + Default + Predefinito + + + Host address + Indirizzo dell'host + + + Session client address + Indirizzo del client di sessione + + + Session client name + Nome del cliente di sessione + + + Session host name + Nome host della sessione + + + Session metadata + Metadati di sessione + + + Full name of user + Nome completo dell'utente + + + User login name + Nome completo dell'utente + + + Computer UID role + Ruolo UID del computer + + + Session meta data hash + Hash dei metadati della sessione + + + Always expand all locations + Espandi sempre tutte le posizioni + + + Image quality + Qualità dell'immagine + MonitoringMode @@ -3713,14 +3916,18 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Remote view or control a computer Vista o controllo remoto di un computer - - Please enter the hostname or IP address of the computer to access: - Inserisci l'hostname o l'indirizzo IP del computer al quale vuoi accedere: - Show help about command Mostra aiuto per i comandi + + Exchange clipboard contents + Scambia il contenuto degli appunti + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Nessun computer è stato selezionato, quindi puoi inserire un nome host o un indirizzo IP di un computer per l'accesso manuale: + RemoteAccessPage @@ -3827,7 +4034,7 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Unlock - Sbloccca + Sblocca Lock screen and input devices of a computer @@ -3938,6 +4145,37 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Vuoi davvero eliminare tutti gli screenshot selezionati? + + ServerAccessControlManager + + Requested authentication method not available + Metodo di autenticazione richiesto non disponibile + + + Access allowed by rule "%1" + Accesso consentito dalla regola "%1" + + + Access denied by rule "%1" + Accesso negato dalla regola "%1" + + + No rule allowed access + Nessuna regola ha consentito l'accesso + + + Accessing user not member of an authorized user group + L'utente che accede non è membro di un gruppo di utenti autorizzati + + + User has denied access + L'utente ha rifiutato l'accesso + + + User confirmed access + L'utente ha confermato l'accesso + + ServiceConfigurationPage @@ -4053,28 +4291,80 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) Modalità multisessione (istanza del server distinta per ogni sessione desktop locale e remota) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + Abilita questa opzione se deve essere avviata una singola istanza di Veyon Server per la sessione attualmente attiva, indipendentemente dal fatto che sia locale o remota. + + + Miscellaneous settings + Impostazioni varie + + + Disable clipboard synchronization + Disabilita la sincronizzazione degli appunti + + + Session metadata + Metadati di sessione + + + Content + Contenuto + + + None + Nessuna + + + Value of an environment variable + Valore di una variabile d'ambiente + + + Value of a registry key + Valore di una chiave di registro + + + Environment variable name: + Nome della variabile d'ambiente: + + + Registry key name: + Nome della chiave di registro: + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + Facoltativamente, inserisci un'espressione regolare con un'acquisizione per estrarre una parte del nome del computer e utilizzarla come nome visualizzato per il computer. + +Esempio: [^-]*-(PC[0-9]*) + ServiceControl - Starting service %1 - Avvio del servizio%1 + Service control + Controllo del servizio - Stopping service %1 - Arresto del servizio%1 + Starting %1 + Avvio %1 - Registering service %1 - Registrazione del servizio%1 + Stopping %1 + Arresto %1 - Unregistering service %1 - Servizio di annullamento della registrazione%1 + Restarting %1 + Riavvio %1 - Service control - Controllo del servizio + Registering %1 + Registrazione di %1 + + + Unregistering %1 + Disregistrazione di %1 @@ -4157,6 +4447,14 @@ Typically this is required to support terminal servers. Duration: Durata: + + View in separate window + Visualizzazione in finestra separata + + + %1 Master – Slideshow + %1 Master – Presentazione + SpotlightPanel @@ -4308,17 +4606,6 @@ Il secondo pulsante rimuove il computer selezionato o l'ultimo.Utilizzo massimo della CPU - - UserConfig - - No write access - Nessun accesso in scrittura - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Impossibile salvare le tue impostazioni personali. Controlla il percorso file di configurazione utente utilizzando il Configuratore %1 - - UserLoginDialog @@ -4448,6 +4735,17 @@ Il secondo pulsante rimuove il computer selezionato o l'ultimo.Schermo %1 + + VeyonMaster + + No write access + Nessun accesso in scrittura + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Impossibile salvare le tue impostazioni personali. Controlla il percorso file di configurazione utente utilizzando il Configuratore %1 + + VeyonServiceControl @@ -4520,6 +4818,10 @@ Il secondo pulsante rimuove il computer selezionato o l'ultimo.Use input device interception driver Usa il driver di intercettazione del dispositivo di input + + Use custom power scheme with disabled power button + Utilizza lo schema di alimentazione personalizzato con il pulsante di accensione disabilitato + WindowsPlatformPlugin diff --git a/translations/veyon_ja.ts b/translations/veyon_ja.ts index 1cf14d4c7..eebc5cb1e 100644 --- a/translations/veyon_ja.ts +++ b/translations/veyon_ja.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,20 +136,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: ユーザーグループのバックエンド - - Missing user groups backend - ユーザーグループのバックエンドが不明 - - - No default user groups plugin was found. Please check your installation! - ユーザーグループのプラグインが見つかりませんでした。 -インストール状況を確認してください! - Restrict access to members of specific user groups 特定のグループのメンバーのアクセスを制限する + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -324,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -367,10 +373,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. このシナリオでのアクセスにはログインしているユーザーの許可が必要です。 - - ERROR: Unknown action - エラー:不明のアクション - Test result テスト結果 @@ -379,6 +381,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method 認証方式 + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -472,10 +478,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! 削除するキーを選択してください! - - Please enter the name of the user group or role for which to import the authentication key: - 認証キーをインポートするユーザーグループかルールの名前を入力してください: - Please select a key to export! エクスポートするキーを選択してください! @@ -488,6 +490,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! アクセスグループに設定するキーを選択してください! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -894,7 +902,7 @@ The public key is used on client computers to authenticate incoming connection r BuiltinDirectoryConfiguration Builtin directory - ビルドインディクショナリー + ビルトインディクショナリー @@ -929,7 +937,7 @@ The public key is used on client computers to authenticate incoming connection r Builtin directory - ビルドインディクショナリー + ビルトインディクショナリー Locations @@ -1040,7 +1048,7 @@ The public key is used on client computers to authenticate incoming connection r Commands for managing the builtin network object directory - ビルドインのネットワークオブジェクト保存先を管理するためのコマンド + ビルトインのネットワークオブジェクト保存先を管理するためのコマンド No format string or regular expression specified! @@ -1088,7 +1096,7 @@ The public key is used on client computers to authenticate incoming connection r Builtin (computers and locations in local configuration) - ビルドイン(ローカル設定内のコンピューターと場所) + ビルトイン(ローカル設定内のコンピューターと場所) Location @@ -1202,6 +1210,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. 指定されたコマンドが存在しないか、そのコマンドに対するヘルプがありません。 + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1219,10 +1231,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - ホスト/IPアドレス: %1 - Active features: %1 アクティブな機能: %1 @@ -1272,12 +1280,24 @@ The public key is used on client computers to authenticate incoming connection r 名前: %1 - invalid - 無効 + Hostname: %1 + - [none] - [なし] + unknown + + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active + @@ -1348,6 +1368,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. このコンピューターの場所を特定できませんでした。これは、システム構成に問題があることを示しています。 代わりに、すべての場所がコンピューターの選択パネルに表示されます。 + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1406,6 +1438,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. コンピュータとユーザのリストを %1 に書き込めません! ファイルのアクセス許可を確認してください。 + + Search computers + + ConfigCommands @@ -1554,6 +1590,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running デモの実行中はサムネイルの更新を遅くする + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -1747,7 +1791,8 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + ルーム %1 + Please complete all tasks within the next 5 minutes. @@ -1775,7 +1820,7 @@ The public key is used on client computers to authenticate incoming connection r Texts to read - + テキストを読み上げる generic-student-user @@ -1860,7 +1905,7 @@ The public key is used on client computers to authenticate incoming connection r Display a text message - + テキストメッセージを表示する Test message @@ -1888,7 +1933,7 @@ The public key is used on client computers to authenticate incoming connection r Description - + 説明 Master @@ -1904,7 +1949,7 @@ The public key is used on client computers to authenticate incoming connection r UID - + UID Plugin @@ -2180,6 +2225,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + ユーザーグループ + + + Backend: + バックエンド: + + + Include user groups from domain + + + + Missing user groups backend + ユーザーグループのバックエンドが不明 + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2373,11 +2458,11 @@ The public key is used on client computers to authenticate incoming connection r users - + ユーザー user groups - + ユーザーグループ computers @@ -2487,7 +2572,9 @@ The public key is used on client computers to authenticate incoming connection r %1 %2 have been queried successfully: %3 - + %1 %2 が正常にクエリされました: + +%3 LDAP filter test failed @@ -2910,6 +2997,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3036,14 +3131,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration 構成 - - Disable balloon tooltips - バルーン通知を無効 - Show icons only アイコンのみ表示 + + Disable tooltips + + MainWindow @@ -3251,10 +3346,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers 場所&コンピューター + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3346,6 +3455,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name ユーザー名のみ + + Only last part of user name + + Only computer name コンピューター名のみ @@ -3430,6 +3543,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window メインウィンドウと同じ画面で機能ウィンドウを開く + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + ホストアドレス + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + 常にすべてのロケーションを展開する + + + Image quality + + MonitoringMode @@ -3439,7 +3640,7 @@ The public key is used on client computers to authenticate incoming connection r Builtin monitoring mode - + 組み込み監視モード This mode allows you to monitor all computers at one or more locations. @@ -3447,15 +3648,15 @@ The public key is used on client computers to authenticate incoming connection r Query application version of the server - + サーバのアプリケーションバージョンを照会する Query active features - + 有効な機能を照会する Query properties of remotely available screens - + リモートで利用可能な画面のプロパティを照会する @@ -3510,7 +3711,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the URL of the website to open: - + 開くウェブサイトのURLを入力してください: Name: @@ -3525,11 +3726,11 @@ The public key is used on client computers to authenticate incoming connection r PluginCommands List names of all installed plugins - + インストールされているすべてのプラグインの名前を一覧表示 Show table with details of all installed plugins - + インストールされているすべてのプラグインの詳細を表で表示 Name @@ -3537,23 +3738,23 @@ The public key is used on client computers to authenticate incoming connection r Description - + 説明 Version - + バージョン UID - + UID Plugin-related CLI operations - + プラグイン関連のCLI操作 Commands for managing plugins - + プラグインを管理するためのコマンド @@ -3707,14 +3908,18 @@ Please save your work and close all programs. Remote view or control a computer - - Please enter the hostname or IP address of the computer to access: - アクセスするコンピュータのホスト名、またはIPアドレスを入力してください - Show help about command コマンドに関するヘルプを表示する + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3932,6 +4137,37 @@ Please save your work and close all programs. 選択したスクリーンショットを削除しても良いですか? + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4047,28 +4283,78 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) マルチセッションモード(ローカルおよびリモートデスクトップセッションごとに異なるサーバーインスタンス) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + なし + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - サービス %1 を開始 + Service control + サービス制御 + + + Starting %1 + - Stopping service %1 - サービス %1 を停止 + Stopping %1 + - Registering service %1 - サービス %1 を登録 + Restarting %1 + - Unregistering service %1 - サービス %1 の登録を解除 + Registering %1 + - Service control - サービス制御 + Unregistering %1 + @@ -4151,6 +4437,14 @@ Typically this is required to support terminal servers. Duration: 期限: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4303,17 +4597,6 @@ The second button removes the selected or last computer. CPUの最大使用率 - - UserConfig - - No write access - 書込不可 - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - 個人設定を保存できませんでした! %1 Configuratorを使ってユーザー設定ファイルのパスを確認してください。 - - UserLoginDialog @@ -4443,6 +4726,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + 書込不可 + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + 個人設定を保存できませんでした! %1 Configuratorを使ってユーザー設定ファイルのパスを確認してください。 + + VeyonServiceControl @@ -4515,6 +4809,10 @@ The second button removes the selected or last computer. Use input device interception driver 入力デバイス遮断ドライバを使用する + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_ko.ts b/translations/veyon_ko.ts index c67bad004..9accf1c4f 100644 --- a/translations/veyon_ko.ts +++ b/translations/veyon_ko.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 User groups backend: 유저그룹 백엔드: - - Missing user groups backend - 유저그룹 백엔드 없음 - - - No default user groups plugin was found. Please check your installation! - 디폴트 유저 그룹 플러그인이 없습니다. 설치상태를 확인하세요! - Restrict access to members of specific user groups 특정 그룹 사용자의 접근 제한 + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 The access in the given scenario needs permission of the logged on user. 주어진 상황에 대한 접근은 로그온된 사용자의 허가가 필요함. - - ERROR: Unknown action - ERROR: 정의되지 않은 작업 - Test result 시험 결과 @@ -378,6 +381,10 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 Authentication method + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! 삭제할 키를 선택하세요 - - Please enter the name of the user group or role for which to import the authentication key: - 접근 키를 불러올 사용자 그룹이나 역할의 이름을 입력하세요: - Please select a key to export! 내보낼 키를 선택하세요! @@ -487,6 +490,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! 이 접근 그룹에 설정할 키를 선택하세요! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -719,7 +728,7 @@ The public key is used on client computers to authenticate incoming connection r Key file - + 키 파일 Please specify the key name (e.g. "teacher/public") as the first argument. @@ -1201,6 +1210,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - 호스트/IP 주소: %1 - Active features: %1 활성화된 기능들: %1 @@ -1271,11 +1280,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 - [none] + unknown + 알수없음 + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1347,6 +1368,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. 이 컴퓨터의 위치를 찾을 수 없음. 시스템 설정에 문제가 있어 보입니다. 대신 모든 위치는 컴퓨터 선정 패널에 표시됩니다. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1405,6 +1438,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. 컴퓨터와 사용자 리스트를 %1에 저장하지 못함. 접근 권한을 확인하세요. + + Search computers + + ConfigCommands @@ -1553,6 +1590,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running 데모가 실행중일 때 썸네일 업데이트 속도를 늦춤 + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2179,6 +2224,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + 백엔드: + + + Include user groups from domain + + + + Missing user groups backend + 유저그룹 백엔드 없음 + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2920,12 +3005,20 @@ The public key is used on client computers to authenticate incoming connection r Query options - + 조회 옵션 Query nested user groups (supported by AD only) + 유저 그룹 중첩 조회(AD에서만 사용 가능) + + + Query timeout + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3052,14 +3145,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration 설정 - - Disable balloon tooltips - 풍선 툴팁기능 해제 - Show icons only 아이콘만 보여주기 + + Disable tooltips + + MainWindow @@ -3267,10 +3360,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers 위치 및 컴퓨터들 + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3362,6 +3469,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name 전용 사용자 이름 + + Only last part of user name + + Only computer name 전용 컴퓨터 이름 @@ -3446,6 +3557,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + 호스트 주소 + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3724,14 +3923,18 @@ Please save your work and close all programs. Remote view or control a computer 감시화면 또는 컴퓨터 제어 - - Please enter the hostname or IP address of the computer to access: - 연결할 컴퓨터의 호스트 이름 또는 IP를 입력하세요: - Show help about command 명령어에 대한 도움말 보여줌 + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3949,6 +4152,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4065,28 +4299,78 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + 없음 + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - 서비스 %1 시작중 + Service control + 서비스 제어 + + + Starting %1 + - Stopping service %1 - 서비스 %1 중지중 + Stopping %1 + - Registering service %1 - 서비스 %1 를 등록중 + Restarting %1 + - Unregistering service %1 - 서비스 %1 를 등록 해제중 + Registering %1 + - Service control - 서비스 제어 + Unregistering %1 + @@ -4169,6 +4453,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4319,17 +4611,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - 쓰기 권한 없음 - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - 개인 설정을 저장할 수 없음. %1 설정자를 이용하여 사용자 설정 화일을 경로를 확인하세요 - - UserLoginDialog @@ -4459,6 +4740,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + 쓰기 권한 없음 + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + 개인 설정을 저장할 수 없음. %1 설정자를 이용하여 사용자 설정 화일을 경로를 확인하세요 + + VeyonServiceControl @@ -4531,6 +4823,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_lt.ts b/translations/veyon_lt.ts index 1f6b84789..0071a3e1d 100644 --- a/translations/veyon_lt.ts +++ b/translations/veyon_lt.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -135,19 +135,18 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p User groups backend: Vartotojų grupių valdymas: - - Missing user groups backend - Vartotojų grupių valdymas nerastas - - - No default user groups plugin was found. Please check your installation! - Nerasta standartinių vartotojų grupių plėtinių. Patikrinkite savo programos įdiegimą - Restrict access to members of specific user groups Apriboti prieigą speficinių grupių nariams + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -322,6 +321,14 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -365,10 +372,6 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p The access in the given scenario needs permission of the logged on user. Prieiga šiomis salygomis reikalauja patvirtinimo iš prisijungusio vartotojo - - ERROR: Unknown action - KLAIDA: Nežinomas veiksmas - Test result Testo rezultatai @@ -377,6 +380,10 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p Authentication method Autorizavimo metodas + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -470,10 +477,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please select a key to delete! Pasirinkite raktą kurį norite ištrinti! - - Please enter the name of the user group or role for which to import the authentication key: - Įveskite naudotojų grupės vardą arba rolę kuriai bus importuojama raktų pora: - Please select a key to export! Pasirinkite raktą kurį norite eksportuoti @@ -486,6 +489,12 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Please select a key which to set the access group for! Pasirinkite vartotojų grupę kuriai norite nustatyti prieigos grupę + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1200,6 +1209,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1217,10 +1230,6 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u ComputerControlListModel - - Host/IP address: %1 - Serverio/IP adresas: %1 - Active features: %1 Aktyvios funkcijos: %1 @@ -1270,11 +1279,23 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u - invalid + Hostname: %1 - [none] + unknown + Nežinomas + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1346,6 +1367,18 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Negalima nustatyti kompiuterio vietos. Tai galėjo įvykti dėl problemos su sistemos konfigūracija. Visos vietos bus nurodytos kompiuterio pasirinkimo lange. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1404,6 +1437,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Could not write the computer and users list to %1! Please check the file access permissions. Neįmanoma įrašyti kompiuterio ir vartotojų sąrašo į %1! Patikrinkite failo prieigos teises. + + Search computers + + ConfigCommands @@ -1552,6 +1589,14 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Slow down thumbnail updates while demo is running Sulėtinti miniatūrų atnaujinimą, kol vyksta prezentacija + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2178,6 +2223,46 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + Sisteminė konfigūracija + + + Include user groups from domain + + + + Missing user groups backend + Naudotojų grupių valdymas nerastas + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2909,6 +2994,14 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3036,11 +3129,11 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Konfigūracija - Disable balloon tooltips + Show icons only - Show icons only + Disable tooltips @@ -3250,10 +3343,24 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Locations & computers Vietos ir kompiuteriai + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3345,6 +3452,10 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Only user name Tik naudotojo vardas + + Only last part of user name + + Only computer name Tik kompiuterio vardas @@ -3429,6 +3540,94 @@ Viešasis raktas skirtas kliento kompiuteriams patvirtinti įeinančio ryšio u Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Kompiuterio adresas + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3706,12 +3905,16 @@ Please save your work and close all programs. Žiūrėti arba valdyti kompiuterį nuotoliniu būdu - Please enter the hostname or IP address of the computer to access: + Show help about command + Parodyti pagalbos komandą + + + Exchange clipboard contents - Show help about command - Parodyti pagalbos komandą + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + @@ -3930,6 +4133,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4045,28 +4279,78 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Nėra + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Paleidžiama tarnyba %1 + Service control + Serviso valdymas + + + Starting %1 + - Stopping service %1 - Stabdoma tarnyba %1 + Stopping %1 + - Registering service %1 - Užregistruojama tarnyba %1 + Restarting %1 + - Unregistering service %1 - Išregistruojama tarnyba %1 + Registering %1 + - Service control - Serviso valdymas + Unregistering %1 + @@ -4149,6 +4433,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4299,17 +4591,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - Neturite leidimo įrašyti - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Neįmanoma išsaugoti asmeninių nustatymų! Prašome patikrinti vartotojo konfigūracijos failo vietą naudojant %1 konfigūratorių - - UserLoginDialog @@ -4439,6 +4720,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + Neturite leidimo įrašyti + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Neįmanoma išsaugoti asmeninių nustatymų! Prašome patikrinti naudotojo konfigūracijos failo vietą naudodami %1 konfigūratorių. + + VeyonServiceControl @@ -4511,6 +4803,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_lv.ts b/translations/veyon_lv.ts index b3d4d440e..5f9d9a8f3 100644 --- a/translations/veyon_lv.ts +++ b/translations/veyon_lv.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l User groups backend: Lietotāju grupas backends: - - Missing user groups backend - Trūks lietotāju grupas backends - - - No default user groups plugin was found. Please check your installation! - Neviens pamata lietotāja grupas spraudnis netika atrasts. Lūdzu pārbaudi instalāciju. - Restrict access to members of specific user groups Ierobežot piekļuvi konkrētas grupas lietotājiem + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -217,7 +216,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Accessing computer and local computer - + Piekļūt datoram un lokālajam datoram User being accessed @@ -233,19 +232,19 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l No user is logged in locally - + Neviens lietotājs nav pieteicies lokāli One or multiple users are logged in locally - + Neviens lietotājs nav pieteicies lokāli No user is logged in remotely - + Neviens lietotājs nav pieteicies One or multiple users are logged in remotely - + Viens vai vairāki lietotāji ir pieteikušies attālināti is located at @@ -253,15 +252,15 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l is not located at - + neatrodas are located at the same location - + atrodas vienā atrašanās vietā are not located the same location - + neatrodas vienā atrašanās vietā is member of group @@ -269,58 +268,66 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l is not member of group - + nav grupas dalībnieks is authenticated via - + ir autentificēts ar is not authenticated via - + nav autentificēts ar has one or more groups in common with user being accessed - + ir viena vai vairākas grupas, kas ir kopīgas lietotājam, kurām var piekļūt has no groups in common with user being accessed - + nav kopīgu grupu ar lietotāju, kuram var piekļūt equals user being accessed - + vienāds ar lietotāju, kuram piekļūst is different from user being accessed - + atšķiras no lietotāja, kuram tiek piekļūts is already connected - + jau ir izveidots savienojums is not connected - + nav savienots is local computer - + ir lokālais dators is not local computer - + nav lokālais dators Computer being accessed - + Dators, kuram piekļūst Session being accessed is a user session - + Sesija, kurai piekļūst, ir lietotāja sesija Session being accessed is a login screen + Sesija, kurai piekļūst, ir pieteikšanās ekrāns + + + Local computer is already being accessed + + + + Local computer is not yet being accessed @@ -344,7 +351,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Please enter the following user and computer information in order to test the configured ruleset. - + Lai pārbaudītu konfigurēto kārtulu kopu, lūdzu, ievadiet tālāk norādīto lietotāja un datora informāciju. Local user: @@ -364,11 +371,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l The access in the given scenario needs permission of the logged on user. - - - - ERROR: Unknown action - Errors: Nezināma darbība + Piekļuvei dotajā scenārijā ir nepieciešama no lietotāja, kurš šobrīd ir pierakstījies. Test result @@ -376,6 +379,10 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Authentication method + Autentifikācijas metode + + + There is no matching rule with a valid action. The access is therefore denied. @@ -387,7 +394,7 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l Please perform the following steps to set up key file authentication: - + Lai iestatītu atslēgas faila autentifikāciju, veiciet šādas darbības: 1) Create a key pair on the master computer. @@ -426,7 +433,10 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Autentifikācijas atslēgu pāris sastāv no divām savienotām kriptogrāfiskām atslēgām - privātas un publiskas atslēgas. +Privātā atslēga ļauj lietotājiem galvenajā datorā piekļūt klientu datoriem. +Ir svarīgi, lai piekļuve privātās atslēgas failam būtu tikai autorizētiem lietotājiem. +Publiskā atslēga tiek izmantota klientu datoros, lai autentificētu ienākošā savienojuma pieprasījumu. Create key pair @@ -458,7 +468,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter the name of the user group or role for which to create an authentication key pair: - + Lūdzu, ievadiet tās lietotāju grupas vai lomas nosaukumu, kurai jāizveido autentifikācijas atslēgu pāris: Do you really want to delete authentication key "%1/%2"? @@ -468,22 +478,24 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! Lūdzu, izvēlieties atslēgu kuru izdzēst! - - Please enter the name of the user group or role for which to import the authentication key: - - Please select a key to export! Lūdzu, izvēlieties atslēgfailu, kuru izvadīt! Please select a user group which to grant access to key "%1": - + Lūdzu, atlasiet lietotāju grupu, kurai piešķirt piekļuvi atslēgai “%1”: Please select a key which to set the access group for! Izvēlies atslēgu kuru piešķirt piekļuves grupai! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -497,11 +509,11 @@ The public key is used on client computers to authenticate incoming connection r Invalid key type specified! Please specify "%1" or "%2". - + Norādīts nederīgs atslēgas tips! Lūdzu, norādiet “%1” vai “%2”. Specified key does not exist! Please use the "list" command to list all installed keys. - + Norādītā atslēga nepastāv! Lūdzu, izmantojiet komandu “list”, lai uzskaitītu visas instalētās atslēgas. One or more key files already exist! Please delete them using the "delete" command. @@ -879,7 +891,7 @@ The public key is used on client computers to authenticate incoming connection r AuthenticationPageTab Enabled - + Iespējots Test @@ -1198,6 +1210,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1215,10 +1231,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - Dalībnieku adreses/IP: %1 - Active features: %1 Aktīvās iespējas: %1 @@ -1268,12 +1280,24 @@ The public key is used on client computers to authenticate incoming connection r Vārds: %1 - invalid - nederīgs + Hostname: %1 + + + + unknown + nezināms + + + IP address: %1 + - [none] - [neviens] + Hostname could not be resolved + + + + No features active + @@ -1344,6 +1368,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + Pieslēdzies kopš + + + %1 days + %1 days + + + 1 day + 1 diena + ComputerMonitoring @@ -1402,6 +1438,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + Meklēt darorus + ConfigCommands @@ -1550,6 +1590,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running + + Bandwidth limit + Joslas platuma limits + + + MB/s + MB/s + DemoFeaturePlugin @@ -2176,6 +2224,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + Lietotāju grupas + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + Trūks lietotāju grupas backends + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2906,6 +2994,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + Pieprasījuma noilgums + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3032,14 +3128,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration - - Disable balloon tooltips - - Show icons only Rādīt ikonas tikai + + Disable tooltips + + MainWindow @@ -3129,7 +3225,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + Automātiski About @@ -3247,10 +3343,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Vietas un datori + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3292,7 +3402,7 @@ The public key is used on client computers to authenticate incoming connection r Behaviour - + Rīcība Enforce selected mode for client computers @@ -3300,7 +3410,7 @@ The public key is used on client computers to authenticate incoming connection r Hide local computer - + Slēpt lokālos datorus Hide computer filter field @@ -3316,7 +3426,7 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Fona krāsa Thumbnail update interval @@ -3328,11 +3438,11 @@ The public key is used on client computers to authenticate incoming connection r Program start - + Programmas izpilde Modes and features - + Režīmi un iespējas User and computer name @@ -3343,9 +3453,13 @@ The public key is used on client computers to authenticate incoming connection r Tikai lietotāja vārdu - Only computer name + Only last part of user name + + Only computer name + Tikai datora vārds + Computer thumbnail caption @@ -3356,15 +3470,15 @@ The public key is used on client computers to authenticate incoming connection r Sort order - + Kārtošanas kārtība Computer and user name - + Datoru un lietotāju vārdi Computer locations - + Datoru atrašanās vietas Show current location only @@ -3412,7 +3526,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + Automātiski Thumbnail aspect ratio @@ -3426,12 +3540,100 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Dalībnieku adreses + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode Monitoring - + Uzraudzība Builtin monitoring mode @@ -3458,14 +3660,14 @@ The public key is used on client computers to authenticate incoming connection r NestedNetworkObjectDirectory All directories - + Visas direktorijas NetworkObjectDirectoryConfigurationPage Update interval: - + Atsvaidzināšanas intervāls: seconds @@ -3476,14 +3678,14 @@ The public key is used on client computers to authenticate incoming connection r NetworkObjectDirectoryConfigurationPageTab Enabled - + Iespējots NetworkObjectTreeModel Locations/Computers - + Atrašanās vietas/Datori @@ -3494,15 +3696,15 @@ The public key is used on client computers to authenticate incoming connection r e.g. Veyon - + piem. Veyon Remember and add to website menu - + Atcerēties un pievienot mājaslapu izvēlei e.g. www.veyon.io - + piem. www.veyon.io Please enter the URL of the website to open: @@ -3514,7 +3716,7 @@ The public key is used on client computers to authenticate incoming connection r Website name - + Mājaslapas nosaukums @@ -3568,7 +3770,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to reboot all computers. - + Noklikšķiniet uz šīs pogas, lai restartētu visus datorus. Power down @@ -3576,7 +3778,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Noklikšķiniet uz šīs pogas, lai izslēgtu visus datorus. Tādējādi nav nepieciešams katru datoru izslēgt atsevišķi. Power on/down or reboot a computer @@ -3596,7 +3798,7 @@ The public key is used on client computers to authenticate incoming connection r Power on a computer via Wake-on-LAN (WOL) - + Ieslēgt datoru izmantojot Wake-on-LAN (WOL) MAC ADDRESS @@ -3604,19 +3806,19 @@ The public key is used on client computers to authenticate incoming connection r This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Šī komanda pārraida tīklā Wake-on-LAN (WOL) paketi, lai ieslēgtu datoru ar norādīto MAC adresi. Please specify the command to display help for! - + Lūdzu, norādiet komandu, kurai parādīt palīdzību! Invalid MAC address specified! - + Norādītā MAC adrese nav pareiza! Commands for controlling power status of computers - + Datoru statusa kontroles komandas Power down now @@ -3624,37 +3826,39 @@ The public key is used on client computers to authenticate incoming connection r Install updates and power down - + Instalēt atjauninājumus un izslēgt Power down after user confirmation - + Izslēgt pēc lietotāja piekrišanas Power down after timeout - + Izslēgt pēc noteikta laika The computer was remotely requested to power down. Do you want to power down the computer now? - + Datoram pieprasa attālināti izslēgties. Vai vēlaties izslēgt datoru tagad? The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + Dators tiks izslēgts pēc %1 minūtēm, %2 sekundēm. + +Lūdzu, saglabājiet savu darbu un aizveriet visas programmas. Do you really want to reboot <b>ALL</b> computers? - + Vai tiešām vēlaties restartēt <b>ALL</b> datorus? Do you really want to power down <b>ALL</b> computers? - + Vai tiešām vēlaties izslēgt <b>ALL</b> datorus? Do you really want to power down the selected computers? - + Vai tiešām vēlaties izslēgt atlasītos datorus? @@ -3665,7 +3869,7 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + Lūdzu, norādiet taimautu, lai izslēgtu atlasītos datorus: minutes @@ -3700,22 +3904,26 @@ Please save your work and close all programs. Remote view or control a computer - + Datora attālā skatīšana vai vadība + + + Show help about command + Parādīt palīdzību par komandu - Please enter the hostname or IP address of the computer to access: + Exchange clipboard contents - Show help about command - Parādīt palīdzību par komandu + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + RemoteAccessPage Remote access: %1 - + Attālā piekļuve: %1 @@ -3726,7 +3934,7 @@ Please save your work and close all programs. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Attālā piekļuve @@ -3820,11 +4028,11 @@ Please save your work and close all programs. Lock screen and input devices of a computer - + Bloķēt datora ekrānu un ievadierīces. To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + Lai atgūtu visu lietotāja uzmanību, varat bloķēt viņu datorus, izmantojot šo pogu. Šajā režīmā visas ievades ierīces ir bloķētas un ekrāni ir melni. Lock input devices @@ -3927,6 +4135,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4042,28 +4281,78 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Nav + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Palaižas pakalpojums %1 + Service control + Pakalpojuma kontrole - Stopping service %1 - Apstājas pakalpojums %1 + Starting %1 + - Registering service %1 - Reģistrēt pakalpojumu %1 + Stopping %1 + - Unregistering service %1 - Atcelt reģistrāciju pakalpojumam %1 + Restarting %1 + - Service control - Pakalpojuma kontrole + Registering %1 + + + + Unregistering %1 + @@ -4146,6 +4435,14 @@ Typically this is required to support terminal servers. Duration: Ilgums: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4296,17 +4593,6 @@ The second button removes the selected or last computer. Maksimālais procesora lietojums - - UserConfig - - No write access - Nav rakstīšanas atļauja - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog @@ -4436,6 +4722,17 @@ The second button removes the selected or last computer. Ekrāns %1 + + VeyonMaster + + No write access + Nav rakstīšanas atļauja + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + + VeyonServiceControl @@ -4508,6 +4805,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_mn.ts b/translations/veyon_mn.ts index 1e0c5875d..0f88cd4f0 100644 --- a/translations/veyon_mn.ts +++ b/translations/veyon_mn.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -80,7 +80,7 @@ If you're interested in translating Veyon into your local or another langua Access control rules - + Хандалт удирдах дүрмүүд Add access control rule @@ -135,15 +135,14 @@ If you're interested in translating Veyon into your local or another langua - Missing user groups backend - - - - No default user groups plugin was found. Please check your installation! + Restrict access to members of specific user groups + + + AccessControlProvider - Restrict access to members of specific user groups + Provider for access control features @@ -321,6 +320,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -365,15 +372,15 @@ If you're interested in translating Veyon into your local or another langua - ERROR: Unknown action + Test result - Test result + Authentication method - Authentication method + There is no matching rule with a valid action. The access is therefore denied. @@ -466,10 +473,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! - - Please enter the name of the user group or role for which to import the authentication key: - - Please select a key to export! @@ -482,6 +485,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1196,6 +1205,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1213,10 +1226,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 @@ -1266,11 +1275,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 + + + + unknown + үл мэдэгдэх + + + IP address: %1 - [none] + Hostname could not be resolved + + + + No features active @@ -1342,6 +1363,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1400,6 +1433,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1548,6 +1585,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2174,6 +2219,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2904,6 +2989,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + + LdapNetworkObjectDirectoryConfigurationPage @@ -3031,11 +3124,11 @@ The public key is used on client computers to authenticate incoming connection r - Disable balloon tooltips + Show icons only - Show icons only + Disable tooltips @@ -3245,10 +3338,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3340,6 +3447,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name + + Only last part of user name + + Only computer name @@ -3424,6 +3535,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3701,11 +3900,15 @@ Please save your work and close all programs. - Please enter the hostname or IP address of the computer to access: + Show help about command - Show help about command + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: @@ -3925,6 +4128,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4040,27 +4274,77 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 + Service control - Stopping service %1 + Starting %1 - Registering service %1 + Stopping %1 - Unregistering service %1 + Restarting %1 - Service control + Registering %1 + + + + Unregistering %1 @@ -4144,6 +4428,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4294,17 +4586,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - Бичих эрх байхгүй - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog @@ -4434,6 +4715,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + Бичих эрх байхгүй + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + + VeyonServiceControl @@ -4506,6 +4798,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_nl.ts b/translations/veyon_nl.ts index 99c12339f..6a9c5f888 100644 --- a/translations/veyon_nl.ts +++ b/translations/veyon_nl.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an User groups backend: Gebruikersgroepen backend - - Missing user groups backend - Ontbrekende gebruikersgroepen backend - - - No default user groups plugin was found. Please check your installation! - Er werd geen standaard gebruikersgroepplugin gevonden. Controleer de installatie! - Restrict access to members of specific user groups Beperk toegang tot leden van bepaalde groepen + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Session being accessed is a login screen De sessie die wordt geopend is een inlogscherm + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an The access in the given scenario needs permission of the logged on user. De toegang in het gegeven scenario heeft toestemming van de ingelogde gebruiker nodig. - - ERROR: Unknown action - FOUT: Onbekende actie - Test result Testresultaat @@ -378,6 +381,10 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an Authentication method Authenticatiemethode + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Please select a key to delete! Gelieve de sleutel aan te duiden die u wilt verwijderen! - - Please enter the name of the user group or role for which to import the authentication key: - Geef de naam van de gebruikers groep of rol waarvoor u een authenticatie sleutel wil importeren: - Please select a key to export! Gelieve de sleutel aan te duiden die u wilt exporteren! @@ -487,6 +490,14 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Please select a key which to set the access group for! Gelieve de sleutel aan te duiden waarvoor u de toegangsgroep wil instellen! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + Voer de naam in van de gebruikersgroep of rol waarvoor de verificatiesleutel moet worden geïmporteerd + +Zorg ervoor dat de namen van de sleutels die bij elkaar horen identiek zijn op alle computers. + AuthKeysManager @@ -1201,6 +1212,10 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa The specified command does not exist or no help is available for it. De opgegeven opdracht bestaat niet of er is geen hulp voor beschikbaar. + + Location "%1" not found. + Locatie "%1" niet gevonden. + BuiltinUltraVncServer @@ -1218,10 +1233,6 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa ComputerControlListModel - - Host/IP address: %1 - Host/IP adres: %1 - Active features: %1 Actieve functies: %1 @@ -1271,12 +1282,24 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Naam: %1 - invalid - ongeldig + Hostname: %1 + + + + unknown + onbekend + + + IP address: %1 + - [none] - [geen] + Hostname could not be resolved + + + + No features active + @@ -1347,6 +1370,18 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Kan de locatie van deze computer niet bepalen. Dit wijst op een probleem met de systeemconfiguratie. In plaats daarvan worden alle locaties weergegeven in het selectiepaneel van de computer. + + Logged in since + Aangemeld sinds + + + %1 days + %1 dagen + + + 1 day + 1 dag + ComputerMonitoring @@ -1405,6 +1440,10 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Could not write the computer and users list to %1! Please check the file access permissions. Kon de computer- en gebruikerslijst niet schrijven naar %1! Controleer de toegangsrechten voor het bestand. + + Search computers + Zoek computers + ConfigCommands @@ -1553,6 +1592,14 @@ De publieke sleutel wordt gebruikt op clientcomputers om inkomende verbindingsaa Slow down thumbnail updates while demo is running Vertraag thumbnailupdates terwijl demo draait + + Bandwidth limit + Bandbreedtelimiet + + + MB/s + MB/s + DemoFeaturePlugin @@ -2181,6 +2228,46 @@ Translated with DeepL Host private key file Host privé sleutelbestand + + Style: + Stijl: + + + Native + Eigen + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + Gebruikersgroepen + + + Backend: + Backend: + + + Include user groups from domain + Gebruikersgroepen uit domein opnemen + + + Missing user groups backend + Ontbrekende gebruikersgroepen backend + + + No user groups plugin was found. Please check your installation! + Er is geen plugin voor gebruikersgroepen gevonden. Controleer je installatie! + HeadlessVncServer @@ -2932,6 +3019,14 @@ Translated with DeepL Query nested user groups (supported by AD only) Geneste gebruikersgroepen opvragen (alleen ondersteund door AD) + + Query timeout + Time-out zoekopdracht + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3058,14 +3153,14 @@ Translated with DeepL Configuration Configuratie - - Disable balloon tooltips - Schakel ballontooltips uit - Show icons only Toon enkel iconen + + Disable tooltips + Tooltips uitschakelen + MainWindow @@ -3273,10 +3368,24 @@ Translated with DeepL Locations & computers Locaties & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users Toon alleen computers met aangemelde gebruikers + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3368,6 +3477,10 @@ Translated with DeepL Only user name Alleen gebruikersnaam + + Only last part of user name + + Only computer name Alleen computernaam @@ -3452,6 +3565,94 @@ Translated with DeepL Open feature windows on the same screen as the main window Functievensters openen op hetzelfde scherm als het hoofdvenster + + Configuration templates + + + + Image quality in monitoring mode + Beeldkwaliteit in bewakingsmodus + + + Highest + Hoogste + + + High + Hoog + + + Medium + Medium + + + Low + Laag + + + Lowest + Laagste + + + Remote access image quality + Beeldkwaliteit van externe toegang + + + Advanced + + + + Computer name source + + + + Default + Standaard + + + Host address + Host adres + + + Session client address + Sessie-clientadres + + + Session client name + Sessie-clientnaam + + + Session host name + + + + Session metadata + + + + Full name of user + Volledige naam van gebruiker + + + User login name + Loginnaam gebruiker + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + Beeldkwaliteit + MonitoringMode @@ -3730,14 +3931,18 @@ Sla je werk op en sluit alle programma's af. Remote view or control a computer Meekijken of overnemen op afstand - - Please enter the hostname or IP address of the computer to access: - Voer de hostnaam of het IP-adres van de computer in waartoe u toegang wil: - Show help about command Toon hulp over commando + + Exchange clipboard contents + Inhoud klembord uitwisselen + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Er is geen computer geselecteerd, dus je kunt een hostnaam of IP-adres van een computer invoeren voor handmatige toegang: + RemoteAccessPage @@ -3955,6 +4160,37 @@ Sla je werk op en sluit alle programma's af. Wil je echt alle geselecteerde schermafbeeldingen verwijderen? + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4071,28 +4307,80 @@ Dit is meestal nodig om terminalservers te ondersteunen. Multi session mode (distinct server instance for each local and remote desktop session) Modus voor meerdere sessies (afzonderlijke serverinstantie voor elke lokale en externe desktopsessie) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + Diverse instellingen + + + Disable clipboard synchronization + Klembordsynchronisatie uitschakelen + + + Session metadata + + + + Content + + + + None + Geen + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + Naam omgevingsvariabele: + + + Registry key name: + Naam registersleutel: + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + Voer optioneel een reguliere expressie met een capture in om een deel van de computernaam te extraheren en te gebruiken als weergavenaam voor de computer. + +Voorbeeld: [^-]*-(PC[0-9]*) + ServiceControl - Starting service %1 - Service %1 wordt gestart + Service control + Servicecontrole - Stopping service %1 - Service %1 wordt gestopt + Starting %1 + - Registering service %1 - Service %1 wordt geregistreerd + Stopping %1 + - Unregistering service %1 - Dienst %1 afmelden + Restarting %1 + - Service control - Servicecontrole + Registering %1 + + + + Unregistering %1 + @@ -4175,6 +4463,14 @@ Dit is meestal nodig om terminalservers te ondersteunen. Duration: Duur: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4326,17 +4622,6 @@ De tweede knop verwijdert de geselecteerde of laatste computer. Maximaal CPU-gebruik - - UserConfig - - No write access - Geen schrijftoegang - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Kon uw persoonlijke instellingen niet opslaan! Controleer het gebruikersconfiguratiebestandspad door gebruik te maken van de %1 Configurator. - - UserLoginDialog @@ -4466,6 +4751,17 @@ De tweede knop verwijdert de geselecteerde of laatste computer. Scherm %1 + + VeyonMaster + + No write access + Geen schrijftoegang + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Kon uw persoonlijke instellingen niet opslaan! Controleer het gebruikersconfiguratiebestandspad door gebruik te maken van de %1 Configurator. + + VeyonServiceControl @@ -4538,6 +4834,10 @@ De tweede knop verwijdert de geselecteerde of laatste computer. Use input device interception driver Gebruik het stuurprogramma voor het onderscheppen van invoerapparaten + + Use custom power scheme with disabled power button + Aangepast voedingsschema gebruiken met uitgeschakelde aan/uit-knop + WindowsPlatformPlugin diff --git a/translations/veyon_no_NO.ts b/translations/veyon_no_NO.ts index 4bb1c0613..12c95d6cf 100644 --- a/translations/veyon_no_NO.ts +++ b/translations/veyon_no_NO.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -135,15 +135,14 @@ If you're interested in translating Veyon into your local or another langua - Missing user groups backend - - - - No default user groups plugin was found. Please check your installation! + Restrict access to members of specific user groups + + + AccessControlProvider - Restrict access to members of specific user groups + Provider for access control features @@ -321,6 +320,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -365,15 +372,15 @@ If you're interested in translating Veyon into your local or another langua - ERROR: Unknown action + Test result - Test result + Authentication method - Authentication method + There is no matching rule with a valid action. The access is therefore denied. @@ -466,10 +473,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! - - Please enter the name of the user group or role for which to import the authentication key: - - Please select a key to export! @@ -482,6 +485,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1196,6 +1205,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1213,10 +1226,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 @@ -1266,11 +1275,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 + + + + unknown - [none] + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1342,6 +1363,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1400,6 +1433,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1548,6 +1585,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2174,6 +2219,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2904,6 +2989,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3031,11 +3124,11 @@ The public key is used on client computers to authenticate incoming connection r - Disable balloon tooltips + Show icons only - Show icons only + Disable tooltips @@ -3245,10 +3338,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3340,6 +3447,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name + + Only last part of user name + + Only computer name @@ -3424,6 +3535,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3701,11 +3900,15 @@ Please save your work and close all programs. - Please enter the hostname or IP address of the computer to access: + Show help about command - Show help about command + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: @@ -3925,6 +4128,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4040,27 +4274,77 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 + Service control - Stopping service %1 + Starting %1 - Registering service %1 + Stopping %1 - Unregistering service %1 + Restarting %1 - Service control + Registering %1 + + + + Unregistering %1 @@ -4144,6 +4428,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4294,17 +4586,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog @@ -4434,6 +4715,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + + VeyonServiceControl @@ -4506,6 +4798,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_pl.ts b/translations/veyon_pl.ts index 54d2d4286..6adbf6edd 100644 --- a/translations/veyon_pl.ts +++ b/translations/veyon_pl.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne User groups backend: Zarządzanie grupami użytkowników: - - Missing user groups backend - Nieskonfigurowane źródło grup użytkowników - - - No default user groups plugin was found. Please check your installation! - Brak domyślnej wtyczki źródła grup użytkowników. Proszę sprawdzić poprawność instalacji programu! - Restrict access to members of specific user groups Ogranicz dostęp do członków wybranych grup + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -257,7 +256,7 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne are located at the same location - + znajdują się w tym samym miejscu are not located the same location @@ -273,7 +272,7 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne is authenticated via - + jest uwierzytelniany przez is not authenticated via @@ -323,6 +322,14 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne Session being accessed is a login screen Dostęp do sesji to ekran logowania + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne The access in the given scenario needs permission of the logged on user. Dostęp w danym scenariuszu wymaga zgody zalogowanego użytkownika. - - ERROR: Unknown action - Błąd: nieznana akcja. - Test result Wynik testu @@ -378,6 +381,10 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne Authentication method Metoda uwierzytelnienia + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Please select a key to delete! Wybierz klucz do usunięcia! - - Please enter the name of the user group or role for which to import the authentication key: - Wprowadź nazwę grupy użytkowników lub roli, dla której chcesz zaimportować klucz uwierzytelniający: - Please select a key to export! Wybierz klucz do wyeksportowania! @@ -487,6 +490,12 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Please select a key which to set the access group for! Wybierz klucz do którego chcesz przydzielić dostęp dla grupy! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1201,6 +1210,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc ComputerControlListModel - - Host/IP address: %1 - Host/adres IP: %1 - Active features: %1 Aktywne funkcje: %1 @@ -1260,7 +1269,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc [no user] - + [no user] Veyon Server unreachable or not running @@ -1271,11 +1280,23 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc - invalid - nieprawidłowy + Hostname: %1 + - [none] + unknown + nieznane + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1347,6 +1368,18 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Nie można określić lokalizacji tego komputera. Wskazuje to na problem z konfiguracją systemu. W panelu wyboru komputera pokazane zostaną wszystkie lokalizacje. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1405,6 +1438,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Could not write the computer and users list to %1! Please check the file access permissions. Nie można zapisać listy komputerów i użytkowników w %1! Sprawdź prawa dostępu do pliku + + Search computers + Wyszukiwanie komputerów + ConfigCommands @@ -1553,6 +1590,14 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Slow down thumbnail updates while demo is running Spowalniaj aktualizacje miniatur podczas działania wersji demonstracyjnej + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -1851,7 +1896,7 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information - + Uruchamia określoną funkcję na określonym hoście, łącząc się ze zdalnie uruchomionym serwerem Veyon Server. Funkcja może być określona przez nazwę lub UID. Użyj polecenia ``show``, aby zobaczyć wszystkie dostępne funkcje. W zależności od funkcji należy określić dodatkowe argumenty (takie jak wiadomość tekstowa do wyświetlenia) zakodowane jako pojedynczy ciąg JSON. Więcej informacji można znaleźć w dokumentacji deweloperskiej Lock the screen @@ -2179,6 +2224,46 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Host private key file Plik klucza prywatnego hosta + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + Zaplecze: + + + Include user groups from domain + + + + Missing user groups backend + Nieskonfigurowane źródło grup użytkowników + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2923,6 +3008,14 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Query nested user groups (supported by AD only) Zapytanie o zagnieżdżone grupy użytkowników (obsługiwane tylko przez AD) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3049,14 +3142,14 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Configuration Konfiguracja - - Disable balloon tooltips - Wyłącz dymki z podpowiedziami - Show icons only Pokaż tylko ikony + + Disable tooltips + + MainWindow @@ -3264,10 +3357,24 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Locations & computers Sale i komputery + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3359,6 +3466,10 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Only user name Tylko nazwa użytkownika + + Only last part of user name + + Only computer name Tylko nazwa komputera @@ -3443,6 +3554,94 @@ Klucz publiczny jest używany na komputerach klienta do uwierzytelnienia połąc Open feature windows on the same screen as the main window Otwieraj okna funkcji na tym samym ekranie, co okno główne + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Adres hosta + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + Nazwa użytkownika + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3721,14 +3920,18 @@ Zapisz swoją pracę i zamknij wszystkie programy. Remote view or control a computer Zdalny podgląd lub sterowanie komputerem - - Please enter the hostname or IP address of the computer to access: - Wprowadź nazwę lub adres IP komputera, do którego chcesz uzyskać dostęp: - Show help about command Pokaż pomoc dotyczącą komendy + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Nie zaznaczono komputera, wpisz nazwę lub adres IP komputera do dostępu ręcznego + RemoteAccessPage @@ -3946,6 +4149,37 @@ Zapisz swoją pracę i zamknij wszystkie programy. Czy na pewno chcesz usunąć wszystkie zaznaczone zrzuty ekranu? + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4062,28 +4296,78 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Brak + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Uruchamianie usługi %1 + Service control + Zarządzenie usługą - Stopping service %1 - Zatrzymywanie usługi %1 + Starting %1 + - Registering service %1 - Rejestrowanie usługi %1 + Stopping %1 + - Unregistering service %1 - Wyrejestrowywanie usługi %1 + Restarting %1 + - Service control - Zarządzenie usługą + Registering %1 + + + + Unregistering %1 + @@ -4166,6 +4450,14 @@ Zazwyczaj jest to wymagane do obsługi serwerów terminali. Duration: Czas trwania: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4316,17 +4608,6 @@ The second button removes the selected or last computer. Maksymalne wykorzystanie CPU - - UserConfig - - No write access - Brak prawa edycji - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Nie można zapisać ustawień osobistych! Sprawdź ścieżkę pliku konfiguracji użytkownika za pomocą Konfiguratora %1. - - UserLoginDialog @@ -4456,6 +4737,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + Brak prawa edycji + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Nie można zapisać ustawień osobistych! Sprawdź ścieżkę pliku konfiguracji użytkownika za pomocą Konfiguratora %1. + + VeyonServiceControl @@ -4528,6 +4820,10 @@ The second button removes the selected or last computer. Use input device interception driver Użyj sterownika przechwytywania urządzenia wejściowego + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_pt_BR.ts b/translations/veyon_pt_BR.ts index 64ab1a46f..365fc339c 100644 --- a/translations/veyon_pt_BR.ts +++ b/translations/veyon_pt_BR.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi User groups backend: Back-end dos grupos de usuários: - - Missing user groups backend - Sem Back-end dos grupos de usuários: - - - No default user groups plugin was found. Please check your installation! - Nenhum plugin padrão de grupos de usuários foi encontrado. Verifique sua instalação! - Restrict access to members of specific user groups Restringir acesso para membros de determinados grupos + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Session being accessed is a login screen + + Local computer is already being accessed + Computador local já está sendo acessado + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi The access in the given scenario needs permission of the logged on user. O acesso na configuração atual requer a permissão de um usuário logado. - - ERROR: Unknown action - ERRO: Ação desconhecida - Test result Resultado do teste @@ -378,6 +381,10 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Authentication method Método de autenticação + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please select a key to delete! Por favor, selecione uma chave para deletar! - - Please enter the name of the user group or role for which to import the authentication key: - Por favor insira o nome do grupo de usuários ou função para o qual deseja importar a chave de autenticação: - Please select a key to export! Por favor, selecione uma chave para exportar! @@ -487,6 +490,12 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Please select a key which to set the access group for! Selecione uma chave para a atribuir o grupo de acesso! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1063,11 +1072,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Add a location or computer - + Adicione uma local ou um computador Clear all locations and computers - + Remova todas as localizações e computadores Dump all or individual locations and computers @@ -1099,7 +1108,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LOCATION - + LOCAL FORMAT-STRING-WITH-PLACEHOLDERS @@ -1201,6 +1210,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç The specified command does not exist or no help is available for it. O comando especificado não existe ou não possui ajuda disponível. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ A chave pública é usada no computadores clientes para autenticar as requisiç ComputerControlListModel - - Host/IP address: %1 - Servidor/endereço IP: %1 - Active features: %1 Funcionalidades ativas: %1 @@ -1264,20 +1273,32 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Veyon Server unreachable or not running - + Servidor Veyon inacessível ou não está sendo executado Name: %1 - invalid - + Hostname: %1 + Nome do host: %1 - [none] + unknown + desconhecido + + + IP address: %1 + Endereço IP: %1 + + + Hostname could not be resolved + + No features active + Nenhum recurso ativado + ComputerControlServer @@ -1311,7 +1332,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Active connections: - + Conecções ativas: @@ -1337,7 +1358,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Location detection failed - + Falha na detecção do local Computer name;Hostname;User @@ -1347,6 +1368,18 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + Conectado desde + + + %1 days + 1% dias + + + 1 day + 1 dia + ComputerMonitoring @@ -1405,6 +1438,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Could not write the computer and users list to %1! Please check the file access permissions. Não foi possível salvar a lista de computadores e usuários em %1! Verifique as permissões de acesso ao arquivo. + + Search computers + Procurar computadores + ConfigCommands @@ -1553,6 +1590,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Slow down thumbnail updates while demo is running Diminua a velocidade das atualizações de miniaturas enquanto a demonstração está em execução + + Bandwidth limit + Limite de rede + + + MB/s + MB/s + DemoFeaturePlugin @@ -1676,27 +1721,27 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Applications & websites - + Aplicativos & websites Predefined applications - + Aplicativos pré-definidos Add new application - + Adicionar novo aplicativo Remove selected application - + Remover aplicativo selecionado Add new website - + Adicionar novo website New application - + Novo aplicativo @@ -1719,19 +1764,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Start application - + Iniciar aplicativo Click this button to start an application on all computers. - + Clique nesse botão para iniciar um aplicativo em todos os computadores Start application "%1" - + Iniciar aplicativo "%1" Custom application - + Aplicativo customizado Start apps and open websites in user sessions @@ -1782,7 +1827,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Custom application - + Aplicativo customizado @@ -1843,11 +1888,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç FEATURE - + Recurso ARGUMENTS - + ARGUMENTOS Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information @@ -1855,19 +1900,19 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Lock the screen - + Bloquear a tela Display a text message - + Mostrar uma mensagem de texto Test message - + Mensagem de teste Start an application - + Iniciar um aplicativo Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. @@ -1875,7 +1920,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Unlock the screen - + Desbloquear a tela The specified command does not exist or no help is available for it. @@ -1887,7 +1932,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Description - + Descrição Master @@ -1907,7 +1952,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Plugin - + Plugin Invalid feature name or UID specified @@ -2179,6 +2224,46 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Host private key file + + Style: + Estilo: + + + Native + Nativo + + + Color scheme: + + + + Light + Claro + + + Dark + Escuro + + + User groups + Grupo de usuários + + + Backend: + Backend: + + + Include user groups from domain + + + + Missing user groups backend + Sem Back-end dos grupos de usuários: + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2914,6 +2999,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -2950,11 +3043,11 @@ A chave pública é usada no computadores clientes para autenticar as requisiç %1 (load computers and locations from LDAP/AD) - + % 1 (carregar computadores e locais do LDAP/AD) %1 (load users and groups from LDAP/AD) - + %1 (carregar usuários e grupos do LDAP/AD) Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" @@ -2989,7 +3082,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç LinuxPlatformConfigurationPage Linux - + Linux Custom PAM service for user authentication @@ -3040,14 +3133,14 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Configuration Configuração - - Disable balloon tooltips - Desativar balões tooltip - Show icons only Exibir apenas ícones + + Disable tooltips + + MainWindow @@ -3255,10 +3348,24 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Locations & computers Locais e computadores + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3350,6 +3457,10 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Only user name + + Only last part of user name + + Only computer name @@ -3412,7 +3523,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç px - + px Hide local session @@ -3434,6 +3545,94 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Ip do host + + + Session client address + Endereço do cliente da sessão + + + Session client name + Nome do cliente da sessão + + + Session host name + + + + Session metadata + + + + Full name of user + Nome completo do usuário + + + User login name + Nome de login do usuário + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3541,7 +3740,7 @@ A chave pública é usada no computadores clientes para autenticar as requisiç Description - + Descrição Version @@ -3710,14 +3909,18 @@ Please save your work and close all programs. Remote view or control a computer Exibir tela ou controlar um computador - - Please enter the hostname or IP address of the computer to access: - Por favor digite o hostname ou endereço IP do computador para acessar: - Show help about command Mostrar ajuda sobre comando + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3935,6 +4138,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4050,27 +4284,79 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Nenhum + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + Opcionalmente, insira uma expressão regular com uma captura para extrair uma parte do nome do computador e usá-la como nome de exibição do computador. + +Exemplo: [^-]*-(PC[0-9]*) + ServiceControl - Starting service %1 + Service control - Stopping service %1 + Starting %1 - Registering service %1 + Stopping %1 - Unregistering service %1 + Restarting %1 - Service control + Registering %1 + + + + Unregistering %1 @@ -4154,6 +4440,14 @@ Typically this is required to support terminal servers. Duration: Duração: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4187,7 +4481,7 @@ The second button removes the selected or last computer. StartAppDialog Start application - + Iniciar aplicativo Please enter the applications to start on the selected computers. You can separate multiple applications by line. @@ -4304,17 +4598,6 @@ The second button removes the selected or last computer. Máximo uso de CPU - - UserConfig - - No write access - Sem acesso de escrita - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Não foi possível salvar suas configurações pessoais! Por favor verifique o arquivo de configuração usando o configurador %1. - - UserLoginDialog @@ -4444,6 +4727,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + Sem acesso de escrita + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Não foi possível salvar suas configurações pessoais! Por favor verifique o arquivo de configuração usando o configurador %1. + + VeyonServiceControl @@ -4516,6 +4810,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_pt_PT.ts b/translations/veyon_pt_PT.ts index be478d9de..05b6c40e9 100644 --- a/translations/veyon_pt_PT.ts +++ b/translations/veyon_pt_PT.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -110,7 +110,7 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma Please enter a user login name whose access permissions to test: - + Por favor introduza o nome de utilizador cujas permissões serão testadas: Access allowed @@ -130,22 +130,21 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma Enable usage of domain groups - + Ativar a utilização de grupos de domínio User groups backend: - - - - Missing user groups backend - + Back-end de grupos de utilizador: - No default user groups plugin was found. Please check your installation! - + Restrict access to members of specific user groups + Restringir acesso a membros de grupos de utilizadores específicos + + + AccessControlProvider - Restrict access to members of specific user groups + Provider for access control features @@ -181,7 +180,7 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma If more than one condition is activated each condition has to meet in order to make the rule apply (logical AND). If only one of multiple conditions has to meet (logical OR) please create multiple access control rules. - + Se mais do que uma condição for ativada, cada condição deve ser atendida para que a regra seja aplicada (E lógico). Se apenas uma das várias condições precisar ser atendida (OR lógico), por favor crie várias regras de controle de acesso. Action @@ -197,7 +196,7 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma Ask logged on user for permission - + Pedir permissão a um utilizador ligado None (rule disabled) @@ -217,51 +216,51 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma Accessing computer and local computer - + A aceder ao computador e ao computador local User being accessed - + Utilizador a ser acedido is logged in locally - + está ligado localmente is logged in remotely - + está ligado remotamente No user is logged in locally - + Nenhum utilizador ligado localmente One or multiple users are logged in locally - + Um ou vários utilizadores ligados localmente No user is logged in remotely - + Nenhum utilizador ligado remotamente One or multiple users are logged in remotely - + Um ou vários utilizadores ligados remotamente is located at - + está localizado em is not located at - + não está localizado em are located at the same location - + estão localizados no mesmo local are not located the same location - + não estão localizados no mesmo local is member of group @@ -269,58 +268,66 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma is not member of group - + não é membro do grupo is authenticated via - + está autenticado através de is not authenticated via - + não está autenticado através de has one or more groups in common with user being accessed - + tem um ou mais grupos em comum com o utilizador que está a ser acedido has no groups in common with user being accessed - + não tem grupos em comum com o utilizador que está a ser acedido equals user being accessed - + é igual ao utilizador que está a ser acedido is different from user being accessed - + é diferente do utilizador que está a ser acedido is already connected - + já está ligado is not connected - + não está ligado is local computer - + é um computador local is not local computer - + não é um computador local Computer being accessed - + Computador a ser acedido Session being accessed is a user session - + A sessão a ser acedida é uma sessão de utilizador Session being accessed is a login screen + A sessão a ser acedida é um ecrã de início de sessão + + + Local computer is already being accessed + + + + Local computer is not yet being accessed @@ -344,7 +351,7 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma Please enter the following user and computer information in order to test the configured ruleset. - + Por favor introduza as seguintes informações de utilizador e computador para poder testar o conjunto de regras configurado. Local user: @@ -356,26 +363,26 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma The access in the given scenario is allowed. - + O acesso no cenário determinado é permitido. The access in the given scenario is denied. - + O acesso no cenário determinado não é permitido. The access in the given scenario needs permission of the logged on user. - - - - ERROR: Unknown action - + O acesso no cenário determinado necessita permissão do utilizador ligado. Test result - + Resultado do teste Authentication method + Método de autenticação + + + There is no matching rule with a valid action. The access is therefore denied. @@ -383,78 +390,81 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma AuthKeysConfigurationWidget Introduction - + Introdução Please perform the following steps to set up key file authentication: - + Execute as seguintes etapas para configurar a autenticação do ficheiro de chave: 1) Create a key pair on the master computer. - + 1) Crie um par de chaves no computador principal. 2) Set an access group whose members should be allowed to access other computers. - + 2) Defina um grupo de acesso cujos membros devem ter permissão para aceder a outros computadores. 3) Export the public key and import it on all client computers with the same name. - + 3) Exporte a chave pública e importe-a em todos os computadores clientes com o mesmo nome. Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Consulte o <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Manual do Administrador Veyon</a> para mais informação. Key file directories - + Diretório de ficheiros de chave Public key file base directory - + Diretório base de chave pública Private key file base directory - + Diretório base de chave privada Available authentication keys - + Chaves de autenticação disponíveis An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Um par de chaves de autenticação consiste em duas chaves criptográficas acopladas, uma chave privada e uma pública. +Uma chave privada permite que os utilizadores do computador mestre acedam a computadores clientes. +É importante que apenas utilizadores autorizados tenham acesso de leitura ao arquivo de chave privada. +A chave pública é usada em computadores clientes para autenticar solicitações de conexão de entrada. Create key pair - + Criar par de chaves Delete key - + Eliminar chave Import key - + Importar chave Export key - + Exportar chave Set access group - + Definir grupo de acesso Key files (*.pem) - + Ficheiros de chave (*.pem) Authentication key name - + Nome da chave de autenticação Please enter the name of the user group or role for which to create an authentication key pair: @@ -466,15 +476,11 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! - - - - Please enter the name of the user group or role for which to import the authentication key: - + Por favor selecione uma chave para eliminar! Please select a key to export! - + Por favor selecione uma chave para exportar! Please select a user group which to grant access to key "%1": @@ -484,12 +490,18 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager Please check your permissions. - + Por favor verifique as suas permissões. Key name contains invalid characters! @@ -509,7 +521,7 @@ The public key is used on client computers to authenticate incoming connection r Creating new key pair for "%1" - + A criar um novo par de chaves para "%1" Failed to create public or private key! @@ -533,7 +545,7 @@ The public key is used on client computers to authenticate incoming connection r File "%1" already exists. - + O ficheiro "%1" já existe. Failed to write output file. @@ -613,7 +625,7 @@ The public key is used on client computers to authenticate incoming connection r <N/A> - + <N/D> Failed to read key file. @@ -624,7 +636,7 @@ The public key is used on client computers to authenticate incoming connection r AuthKeysPlugin Create new authentication key pair - + Criar novo par de chaves de autenticação Delete authentication key @@ -652,11 +664,11 @@ The public key is used on client computers to authenticate incoming connection r KEY - + CHAVE ACCESS GROUP - + GRUPO DE ACESSO This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. @@ -664,11 +676,11 @@ The public key is used on client computers to authenticate incoming connection r NAME - + NOME FILE - + FICHEIRO This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. @@ -684,11 +696,11 @@ The public key is used on client computers to authenticate incoming connection r TYPE - + TIPO PAIR ID - + ID DO PAR Commands for managing authentication keys @@ -735,19 +747,19 @@ The public key is used on client computers to authenticate incoming connection r AuthKeysTableModel Name - + Nome Type - + Tipo Access group - + Grupo de acesso Pair ID - + ID do par @@ -769,7 +781,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLdapDialog Veyon Logon - + Logon do Veyon Please enter your domain/LDAP username and password in order to access computers. @@ -777,15 +789,15 @@ The public key is used on client computers to authenticate incoming connection r Username - + Nome de utilizador Password - + Palavra-passe Authentication error - + Erro de autenticação Logon failed with given username and password. Please try again! @@ -796,7 +808,7 @@ The public key is used on client computers to authenticate incoming connection r AuthLogonDialog Veyon Logon - + Logon do Veyon Please enter your username and password in order to access computers. @@ -804,15 +816,15 @@ The public key is used on client computers to authenticate incoming connection r Username - + Nome de utilizador Password - + Palavra-passe Authentication error - + Erro de autenticação Logon failed with given username and password. Please try again! @@ -827,26 +839,26 @@ The public key is used on client computers to authenticate incoming connection r Logon authentication - + Autenticação de logon Logon - + Logon AuthSimpleDialog Veyon Logon - + Logon do Veyon Please enter the Veyon password: - + Por favor introduza a palavra-passe do Veyon Authentication error - + Erro de autenticação Logon failed with given password. Please try again! @@ -897,11 +909,11 @@ The public key is used on client computers to authenticate incoming connection r BuiltinDirectoryConfigurationPage Computers - + Computadores Name - + Nome Host address/IP @@ -909,11 +921,11 @@ The public key is used on client computers to authenticate incoming connection r MAC address - + Endereço MAC Add new computer - + Adicionar computador novo Remove selected computer @@ -921,7 +933,7 @@ The public key is used on client computers to authenticate incoming connection r New computer - + Computador novo Builtin directory @@ -929,11 +941,11 @@ The public key is used on client computers to authenticate incoming connection r Locations - + Localizações Add new location - + Adicionar localização nova Remove selected location @@ -941,7 +953,7 @@ The public key is used on client computers to authenticate incoming connection r New location - + Localização nova Directory name @@ -972,19 +984,19 @@ The public key is used on client computers to authenticate incoming connection r Type - + Tipo Name - + Nome Host address - + Endereço do anfitrião MAC address - + Endereço MAC Specified object not found. @@ -1012,19 +1024,19 @@ The public key is used on client computers to authenticate incoming connection r None - + Nenhum Computer - + Computador Root - + Raiz Invalid - + Inválido Error while parsing line %1. @@ -1092,11 +1104,11 @@ The public key is used on client computers to authenticate incoming connection r FILE - + FICHEIRO LOCATION - + LOCALIZAÇÃO FORMAT-STRING-WITH-PLACEHOLDERS @@ -1140,15 +1152,15 @@ The public key is used on client computers to authenticate incoming connection r TYPE - + TIPO NAME - + NOME PARENT - + PARENTE Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. @@ -1156,15 +1168,15 @@ The public key is used on client computers to authenticate incoming connection r Add a room - + Adicionar uma sala Add a computer to room %1 - + Adicionar um computador à sala %1 OBJECT - + OBJETO Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. @@ -1180,15 +1192,15 @@ The public key is used on client computers to authenticate incoming connection r "Room 01" - + "Sala 01" "Computer 01" - + "Computador 01" HOST ADDRESS - + ENDEREÇO DO ANFITRIÃO MAC ADDRESS @@ -1198,6 +1210,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1215,10 +1231,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 @@ -1268,11 +1280,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 + + + + unknown + + + + IP address: %1 - [none] + Hostname could not be resolved + + + + No features active @@ -1284,7 +1308,7 @@ The public key is used on client computers to authenticate incoming connection r Authentication error - + Erro de autenticação Remote access @@ -1344,12 +1368,24 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring Computers - + Computadores Search users and computers @@ -1402,6 +1438,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1550,6 +1590,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -1649,7 +1697,7 @@ The public key is used on client computers to authenticate incoming connection r DesktopServicesConfigurationPage Name - + Nome Path @@ -1836,7 +1884,7 @@ The public key is used on client computers to authenticate incoming connection r HOST ADDRESS - + ENDEREÇO DO ANFITRIÃO FEATURE @@ -1880,7 +1928,7 @@ The public key is used on client computers to authenticate incoming connection r Name - + Nome Description @@ -1888,7 +1936,7 @@ The public key is used on client computers to authenticate incoming connection r Master - + Principal Service @@ -2176,6 +2224,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + Back-end de grupos de utilizador em falta + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2305,7 +2393,7 @@ The public key is used on client computers to authenticate incoming connection r User login name attribute - + Atributo do nome de início de sessão de utilizador group members @@ -2668,7 +2756,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Introduza um nome de início de sessão de utilizador (caracter * permitido) que deseja consultar: Enter group name @@ -2692,7 +2780,7 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name whose group memberships to query: - + Introduza um nome de início de sessão de utilizador cujas associações de grupo que deseja consultar: Enter computer IP address @@ -2760,7 +2848,7 @@ The public key is used on client computers to authenticate incoming connection r None - + Nenhum TLS @@ -2888,11 +2976,11 @@ The public key is used on client computers to authenticate incoming connection r User login name attribute - + Atributo do nome de início de sessão de utilizador Configured attribute for user login name or computer hostname (OpenLDAP) - + Atributo configurado para o nome de início de sessão do utilizador ou o nome de host do computador (OpenLDAP) Directory name @@ -2906,6 +2994,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + + LdapNetworkObjectDirectoryConfigurationPage @@ -2989,7 +3085,7 @@ The public key is used on client computers to authenticate incoming connection r User authentication - + Autenticação de utilizador User sessions @@ -3001,11 +3097,11 @@ The public key is used on client computers to authenticate incoming connection r User login - + Início de sessão de utilizador Login key sequence - + Sequência de chaves de início de sessão @@ -3033,11 +3129,11 @@ The public key is used on client computers to authenticate incoming connection r - Disable balloon tooltips + Show icons only - Show icons only + Disable tooltips @@ -3117,7 +3213,7 @@ The public key is used on client computers to authenticate incoming connection r Master - + Principal Access control @@ -3241,16 +3337,30 @@ The public key is used on client computers to authenticate incoming connection r Veyon Master - + Veyon Principal Locations & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3342,6 +3452,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name + + Only last part of user name + + Only computer name @@ -3426,6 +3540,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Endereço do anfitrião + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3529,7 +3731,7 @@ The public key is used on client computers to authenticate incoming connection r Name - + Nome Description @@ -3703,11 +3905,15 @@ Please save your work and close all programs. - Please enter the hostname or IP address of the computer to access: + Show help about command + + + + Exchange clipboard contents - Show help about command + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: @@ -3927,6 +4133,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4042,27 +4279,77 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Nenhum + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 + Service control - Stopping service %1 + Starting %1 - Registering service %1 + Stopping %1 - Unregistering service %1 + Restarting %1 - Service control + Registering %1 + + + + Unregistering %1 @@ -4146,6 +4433,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4296,41 +4591,30 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog User login - + Início de sessão de utilizador Please enter a username and password for automatic login on all computers. - + Por favor introduza o nome de utilizador e palavra-passe para início de sessão automático em todos os computadores. Username - + Nome de utilizador Password - + Palavra-passe UserSessionControlPlugin Log in - + Iniciar sessão Click this button to log in a specific user on all computers. @@ -4338,7 +4622,7 @@ The second button removes the selected or last computer. Log off - + Terminar sessão Click this button to log off users from all computers. @@ -4358,18 +4642,18 @@ The second button removes the selected or last computer. Do you really want to log off <b>ALL</b> users? - + Tem a certeza que quer terminar a sessão de <b>TODOS</b> os utilizadores? VeyonCore [OK] - + [OK] [FAIL] - + [FALHA] Invalid command! @@ -4393,7 +4677,7 @@ The second button removes the selected or last computer. Available modules: - + Módulos disponíveis No module specified or module not found - available modules are: @@ -4405,34 +4689,45 @@ The second button removes the selected or last computer. INFO - + INFO ERROR - + ERRO USAGE - + USO DESCRIPTION - + DESCRIÇÃO EXAMPLES - + EXEMPLOS WARNING - + AVISO Authentication test - + Teste de autenticação Screen %1 + Ecrã %1 + + + + VeyonMaster + + No write access + + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. @@ -4440,7 +4735,7 @@ The second button removes the selected or last computer. VeyonServiceControl Veyon Service - + Serviço Veyon @@ -4454,7 +4749,7 @@ The second button removes the selected or last computer. WindowsPlatformConfigurationPage Windows - + Windows General @@ -4466,23 +4761,23 @@ The second button removes the selected or last computer. Screen lock - + Bloquear ecrã Hide taskbar - + Ocultar a barra de tarefas Hide start menu - + Ocultar o menú iniciar Hide desktop - + Ocultar o ambiente de trabalho User authentication - + Autenticação de utilizador Use alternative user authentication mechanism @@ -4490,7 +4785,7 @@ The second button removes the selected or last computer. User login - + Início de sessão de utilizador Input start delay @@ -4508,6 +4803,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_ru.ts b/translations/veyon_ru.ts index 634eccc07..9bb9c0cf7 100644 --- a/translations/veyon_ru.ts +++ b/translations/veyon_ru.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: Группы пользователей: - - Missing user groups backend - Отсутствующие группы пользователей - - - No default user groups plugin was found. Please check your installation! - Не был найден плагин по умолчанию для пользовательских групп. Проверьте свою установку! - Restrict access to members of specific user groups Ограничить доступ участникам указанных групп пользователей + + AccessControlProvider + + Provider for access control features + Поставщик функций контроля доступа + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen Сеанс для доступа является экраном входа + + Local computer is already being accessed + К локальному компьютеру уже осуществляется доступ + + + Local computer is not yet being accessed + Локальный компьютер пока недоступен + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Доступ в данном сценарии требует разрешения зарегистрированного пользователя. - - ERROR: Unknown action - ОШИБКА: Неизвестное действие - Test result Результат испытаний @@ -378,6 +381,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method Метод проверки подлинности + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! Выберите ключ для удаления! - - Please enter the name of the user group or role for which to import the authentication key: - Введите имя группы пользователей или роли, для которой необходимо импортировать ключ аутентификации: - Please select a key to export! Выберите ключ для экспорта! @@ -487,6 +490,14 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! Выберите ключ, для которого необходимо установить группу доступа! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + Введите имя группы пользователей или роли, для которой необходимо импортировать ключ аутентификации. + +Убедитесь, что имена ключей, принадлежащих друг другу, идентичны на всех компьютерах. + AuthKeysManager @@ -1201,6 +1212,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. Указанная команда не существует, или для неё недоступна справка. + + Location "%1" not found. + Местоположение "%1" не найдено. + BuiltinUltraVncServer @@ -1218,10 +1233,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - Хост/IP-адрес: %1 - Active features: %1 Задействованные возможности: %1 @@ -1271,12 +1282,24 @@ The public key is used on client computers to authenticate incoming connection r Имя: %1 - invalid - некорректно + Hostname: %1 + Имя хоста: %1 - [none] - [нет] + unknown + неизвестный + + + IP address: %1 + IP-адрес: %1 + + + Hostname could not be resolved + Имя хоста не может быть разрешено + + + No features active + Нет активных функций @@ -1347,6 +1370,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Не удалось определить место этого компьютера. Это означает, что в настройках системы есть проблемы. На панели выбора компьютера будут показаны все места. + + Logged in since + Вошел в систему с + + + %1 days + %1 дн. + + + 1 day + 1 день + ComputerMonitoring @@ -1405,6 +1440,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. Не удалось записать список компьютеров и пользователей в %1! Пожалуйста, проверьте права доступа к файлу. + + Search computers + Поиск компьютеров + ConfigCommands @@ -1553,6 +1592,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running Замедлить обновление миниатюр, пока запущена демонстрация + + Bandwidth limit + Ограничение пропускной способности + + + MB/s + МБ/с + DemoFeaturePlugin @@ -2179,6 +2226,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file Файл закрытого ключа хоста + + Style: + Стиль: + + + Native + Нативный + + + Color scheme: + Цветовая схема: + + + Light + Светлая + + + Dark + Тёмная + + + User groups + Группы пользователей + + + Backend: + Бэкэнд: + + + Include user groups from domain + Включить группы пользователей из домена + + + Missing user groups backend + Отсутствующие группы пользователей + + + No user groups plugin was found. Please check your installation! + Плагин групп пользователей не найден. Проверьте установку! + HeadlessVncServer @@ -2928,6 +3015,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) Опросить вложенные группы пользователей (поддерживается только AD) + + Query timeout + Время ожидания запроса + + + ms + мс + LdapNetworkObjectDirectoryConfigurationPage @@ -3054,14 +3149,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration Конфигурация - - Disable balloon tooltips - Отключить всплывающие подсказки - Show icons only Показывать только значки + + Disable tooltips + Отключить всплывающие подсказки + MainWindow @@ -3269,10 +3364,26 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Места и компьютеры + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + Использовать пользовательское расположение компьютеров. + +Нажмите и удерживайте, чтобы загрузить расположение из файла или сохранить текущее расположение в файл. + Only show computers with logged on users Показывать только те компьютеры, где пользователи выполнили вход в систему + + Load computer positions + Загрузить позиции компьютеров + + + Save computer positions + Сохранить позиции компьютеров + MasterConfigurationPage @@ -3364,6 +3475,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name Только имя пользователя + + Only last part of user name + + Only computer name Только имя компьютера @@ -3448,6 +3563,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window Открывать окно функций на том же экране, что и главное окно + + Configuration templates + Шаблоны конфигурации + + + Image quality in monitoring mode + Качество изображения в режиме мониторинга + + + Highest + Самое высокое + + + High + Высокое + + + Medium + Среднее + + + Low + Низкое + + + Lowest + Самое низкое + + + Remote access image quality + Качество изображения удаленного доступа + + + Advanced + Расширенный + + + Computer name source + Источник имени компьютера + + + Default + По умолчанию + + + Host address + Адрес хоста + + + Session client address + Адрес клиента сеанса + + + Session client name + Имя клиента сеанса + + + Session host name + Имя хоста сеанса + + + Session metadata + Метаданные сеанса + + + Full name of user + Полное имя пользователя + + + User login name + Имя пользователя (логин) + + + Computer UID role + Роль UID компьютера + + + Session meta data hash + Хеш метаданных сеанса + + + Always expand all locations + Всегда раскрывать все местоположения + + + Image quality + Качество изображения + MonitoringMode @@ -3726,14 +3929,18 @@ Please save your work and close all programs. Remote view or control a computer Удалённый просмотр или управление компьютером - - Please enter the hostname or IP address of the computer to access: - Пожалуйста, укажите имя хоста или IP-адрес компьютера, доступ к которому необходимо получить: - Show help about command Показать помощь по команде + + Exchange clipboard contents + Обмен содержимым буфера обмена + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Компьютер не выбран, поэтому вы можете ввести имя хоста или IP-адрес компьютера для доступа к нему: + RemoteAccessPage @@ -3951,6 +4158,37 @@ Please save your work and close all programs. Действительно удалить выбранные снимки экрана? + + ServerAccessControlManager + + Requested authentication method not available + Запрошенный метод аутентификации недоступен + + + Access allowed by rule "%1" + Доступ разрешен правилом "%1" + + + Access denied by rule "%1" + Доступ запрещён правилом "%1" + + + No rule allowed access + Ни одно правило не разрешает доступ + + + Accessing user not member of an authorized user group + Доступ пользователя, не являющегося членом авторизованной группы пользователей + + + User has denied access + Пользователю отказано в доступе + + + User confirmed access + Пользователь подтвердил доступ + + ServiceConfigurationPage @@ -4067,28 +4305,80 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) Режим мультисеанса (отдельный экземпляр сервера для каждого сеанса локального и удалённого рабочего стола) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + Включите этот параметр, если необходимо запустить один экземпляр сервера Veyon для текущего активного сеанса, независимо от того, локальный он или удаленный. + + + Miscellaneous settings + Дополнительные настройки + + + Disable clipboard synchronization + Отключить синхронизацию буфера обмена + + + Session metadata + Метаданные сеанса + + + Content + Содержимое + + + None + Нет + + + Value of an environment variable + Значение переменной среды + + + Value of a registry key + Значение ключа реестра + + + Environment variable name: + Имя переменной среды: + + + Registry key name: + Имя ключа реестра: + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + При необходимости введите регулярное выражение с захватом, чтобы извлечь часть имени компьютера и использовать её в качестве отображаемого имени компьютера. + +Пример: [^-]*-(PC[0-9]*) + ServiceControl - Starting service %1 - Запускаем сервис %1 + Service control + Управление сервисам - Stopping service %1 - Останавливаем сервис %1 + Starting %1 + Запуск %1 - Registering service %1 - Регистрируем сервис %1 + Stopping %1 + Остановка %1 - Unregistering service %1 - Отменяем регистрацию сервиса %1 + Restarting %1 + Перезапуск %1 - Service control - Управление сервисам + Registering %1 + Регистрация %1 + + + Unregistering %1 + Отмена регистрации %1 @@ -4171,6 +4461,14 @@ Typically this is required to support terminal servers. Duration: Продолжительность: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4322,17 +4620,6 @@ The second button removes the selected or last computer. Максимальное использование ЦП - - UserConfig - - No write access - Нет доступа на запись - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Не удалось сохранить ваши личные настройки! Пожалуйста, проверьте, правильно ли указан путь к файлу настроек пользователей с помощью конфигуратора %1. - - UserLoginDialog @@ -4462,6 +4749,17 @@ The second button removes the selected or last computer. Экран %1 + + VeyonMaster + + No write access + Нет доступа на запись + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Не удалось сохранить ваши личные настройки! Пожалуйста, проверьте, правильно ли указан путь к файлу настроек пользователей с помощью конфигуратора %1. + + VeyonServiceControl @@ -4534,6 +4832,10 @@ The second button removes the selected or last computer. Use input device interception driver Использовать драйвер перехвата устройства ввода + + Use custom power scheme with disabled power button + Использовать пользовательскую схему питания с отключенной кнопкой питания + WindowsPlatformPlugin diff --git a/translations/veyon_sl.ts b/translations/veyon_sl.ts index 97236cd42..a9f0eb423 100644 --- a/translations/veyon_sl.ts +++ b/translations/veyon_sl.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: Uporabniške skupine ozadja: - - Missing user groups backend - Manjkajoče skupine uporabnikov ozadja - - - No default user groups plugin was found. Please check your installation! - Noben privzeti vtičnik uporabniških skupin ni bil najden. Prosimo, preverite namestitev! - Restrict access to members of specific user groups Omejite dostop do članov določenih skupin uporabnikov + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Dostop v danem scenariju potrebuje dovoljenje prijavljenega uporabnika - - ERROR: Unknown action - NAPAKA: neznano dejanje - Test result Rezultati testa @@ -378,6 +381,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method Metoda overjanja + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please select a key to delete! Prosimo, izberite ključ za brisanje! - - Please enter the name of the user group or role for which to import the authentication key: - Vnesite ime uporabniške skupine ali vzorca, za katero želite uvoziti ključ za preverjanje pristnosti: - Please select a key to export! Prosimo, izberite ključ za izvoz! @@ -487,6 +490,12 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Please select a key which to set the access group for! Izberite ključ, za katerega želite nastaviti skupino za dostop! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1201,6 +1210,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti ComputerControlListModel - - Host/IP address: %1 - Gostitelj/IP naslov: %1 - Active features: %1 Aktivne funkcije: %1 @@ -1271,11 +1280,23 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti - invalid + Hostname: %1 - [none] + unknown + neznano + + + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1347,6 +1368,18 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Ne morem določiti lokacije tega računalnika. To kaže na težavo s konfiguracijo sistema. Namesto tega bodo v izbranem oknu računalnika prikazane vse lokacije. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1405,6 +1438,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Could not write the computer and users list to %1! Please check the file access permissions. Računalnika in uporabnikov ni mogoče vpisati v seznam %1! Preverite dovoljenja za dostop do datotek. + + Search computers + + ConfigCommands @@ -1553,6 +1590,14 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2179,6 +2224,46 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + Ozadje: + + + Include user groups from domain + + + + Missing user groups backend + Manjkajoče skupine uporabnikov ozadja + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2928,6 +3013,14 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3054,14 +3147,14 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Configuration Nastavitve - - Disable balloon tooltips - Onemogoči namige v balončkih - Show icons only Prikaži samo ikone + + Disable tooltips + + MainWindow @@ -3269,10 +3362,24 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Locations & computers Lokacije in računalniki + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3364,6 +3471,10 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Only user name Samo uporabniško ime + + Only last part of user name + + Only computer name Samo ime računalnika @@ -3448,6 +3559,94 @@ Javni ključ se uporablja v odjemalskih računalnikih za preverjanje pristnosti Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Naslov gostitelja + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3724,14 +3923,18 @@ Please save your work and close all programs. Remote view or control a computer Oddaljeni pogled ali nadzor računalnika - - Please enter the hostname or IP address of the computer to access: - Vnesite ime gostitelja ali naslov IP računalnika za dostop: - Show help about command Prikaži pomoč o ukazu + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3949,6 +4152,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4065,28 +4299,78 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Brez + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Zagon storitve %1 + Service control + Nadzor storitve + + + Starting %1 + - Stopping service %1 - Zaustavitev storitve %1 + Stopping %1 + - Registering service %1 - Registracija storitve %1 + Restarting %1 + - Unregistering service %1 - Odregistracija storitve %1 + Registering %1 + - Service control - Nadzor storitve + Unregistering %1 + @@ -4169,6 +4453,14 @@ Običajno je to potrebno za podporo terminalskih strežnikov. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4319,17 +4611,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - Ni pravice pisanja - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Vaših osebnih nastavitev ni bilo mogoče shraniti! Preverite pot do konfiguracijske datoteke uporabnika s konfiguratorjem %1. - - UserLoginDialog @@ -4459,6 +4740,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + Ni pravice pisanja + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Vaših osebnih nastavitev ni bilo mogoče shraniti! Preverite pot do konfiguracijske datoteke uporabnika s konfiguratorjem %1. + + VeyonServiceControl @@ -4531,6 +4823,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_sr.ts b/translations/veyon_sr.ts index bbb2c284b..968aa16ae 100644 --- a/translations/veyon_sr.ts +++ b/translations/veyon_sr.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili User groups backend: Pozadina grupe korisnika: - - Missing user groups backend - Nedostaje pozadina grupe korisnika - - - No default user groups plugin was found. Please check your installation! - Nije pronađjen nijedan dodatak za grupe korisnika. Molimo proverite vašu instalaciju! - Restrict access to members of specific user groups Ograniči pristup članovima određjenih grupa korisnika + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili The access in the given scenario needs permission of the logged on user. Za pristup datom scenariju potrebne su dozvole prijavljenog korisnika. - - ERROR: Unknown action - GREŠKA: Nepoznata akcija - Test result Rezultati testa @@ -378,6 +381,10 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili Authentication method Način provere autentifikacije + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Please select a key to delete! Odaberite ključ za brisanje! - - Please enter the name of the user group or role for which to import the authentication key: - Unesite ime korisničke grupe ili uloge za koju želite uvesti ključ za autentifikaciju: - Please select a key to export! Odaberite ključ za izvoz! @@ -487,6 +490,12 @@ Javni ključ koristi se na klijentskim računarima za proveru dolaznog zahteva z Please select a key which to set the access group for! Odaberite ključ za koji ćete podesiti pristupnu grupu! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1203,6 +1212,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1220,10 +1233,6 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u ComputerControlListModel - - Host/IP address: %1 - Domaćin/IP adresa: %1 - Active features: %1 Aktivne karakteristike: %1 @@ -1273,11 +1282,23 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u - invalid + Hostname: %1 + + + + unknown + nepoznato + + + IP address: %1 - [none] + Hostname could not be resolved + + + + No features active @@ -1349,6 +1370,18 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Ne mogu odrediti lokaciju ovog računara. Ovo ukazuje na problem sa konfiguracijom sistema. Sve lokacije će se umesto toga prikazati na ploči za odabir računara. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1407,6 +1440,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Could not write the computer and users list to %1! Please check the file access permissions. Ne može se zapisati lista računara i korisnika na %1! Proverite dozvole za pristup datoteci. + + Search computers + + ConfigCommands @@ -1555,6 +1592,14 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Slow down thumbnail updates while demo is running Usporite ažuriranje sličica dok je demonstracija aktivna + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2181,6 +2226,46 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + Pozadina: + + + Include user groups from domain + + + + Missing user groups backend + Nedostaje pozadina grupe korisnika + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2930,6 +3015,14 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3056,14 +3149,14 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Configuration Konfiguracija - - Disable balloon tooltips - Onemogućite balon opisa alatki - Show icons only Prikaži samo ikone + + Disable tooltips + + MainWindow @@ -3271,10 +3364,24 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Locations & computers Lokacije & računari + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3366,6 +3473,10 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Only user name Samo korisničko ime + + Only last part of user name + + Only computer name Samo ime računara @@ -3450,6 +3561,94 @@ Molimo unesite ispravnu šifru ili se prebacite na drugi metod autentifikacije u Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + Domaćin adresa + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3728,14 +3927,18 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. Remote view or control a computer Daljinski prikaz ili kontrola kompjutera - - Please enter the hostname or IP address of the computer to access: - Molimo unesite ime ili IP adresu kompjutera kojem pristupate: - Show help about command Pokažite pomoć o naredbi + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3953,6 +4156,37 @@ Molimo snimite/spasite Vaš rad i zatvorite sve programe. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4069,28 +4303,78 @@ Obično je ovo zahtevano kao podrška trminal serverima. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + Nijedan + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - Startanje servisa %1 + Service control + Kontrola servisa + + + Starting %1 + - Stopping service %1 - Zaustavljanje servisa %1 + Stopping %1 + - Registering service %1 - Registrovanje servisa %1 + Restarting %1 + - Unregistering service %1 - Deregistrovanje servisa %1 + Registering %1 + - Service control - Kontrola servisa + Unregistering %1 + @@ -4173,6 +4457,14 @@ Obično je ovo zahtevano kao podrška trminal serverima. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4323,17 +4615,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - Nema pristupa za pisanje - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Ne mogu se spasiti vaše lične postavke! Molimo proverite put do korisničke konfiguraciske datoteke upotrebom %1 Configurator-a - - UserLoginDialog @@ -4463,6 +4744,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + Nema pristupa za pisanje + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Ne mogu se spasiti vaše lične postavke! Molimo proverite put do korisničke konfiguraciske datoteke upotrebom %1 Configurator-a + + VeyonServiceControl @@ -4535,6 +4827,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_sv.ts b/translations/veyon_sv.ts index 71f4f37e1..20bd511af 100644 --- a/translations/veyon_sv.ts +++ b/translations/veyon_sv.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -27,7 +27,7 @@ Website: - Hemsida + Webbsida: Current language not translated yet (or native English). @@ -58,7 +58,7 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an Test - Test + Testa Process access control rules @@ -137,15 +137,14 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an Backend för användargrupper: - Missing user groups backend - Saknad backend för användargrupper - - - No default user groups plugin was found. Please check your installation! - Inget standard användargrupp-plugin kunde hittas. Vänligen kontrollera din installation! + Restrict access to members of specific user groups + Begränsa åtkomsten till medlemmar i specifika användargrupper + + + AccessControlProvider - Restrict access to members of specific user groups + Provider for access control features @@ -217,51 +216,51 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an Accessing computer and local computer - + Åtkomst till dator och lokal dator User being accessed - + Användare som nås is logged in locally - + är inloggad lokalt is logged in remotely - + är inloggad på distans No user is logged in locally - + Ingen användare är inloggad lokalt One or multiple users are logged in locally - + En eller flera användare är inloggade lokalt No user is logged in remotely - + Ingen användare är inloggad på distans One or multiple users are logged in remotely - + En eller flera användare är inloggade på distans is located at - + är belägen på is not located at - + är inte belägen på are located at the same location - + är belägna på samma plats are not located the same location - + inte är belägna på samma plats is member of group @@ -269,59 +268,67 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an is not member of group - + inte är medlem i gruppen is authenticated via - + är autentiserad via is not authenticated via - + inte är autentiserad via has one or more groups in common with user being accessed - + har en eller flera grupper gemensamt med användaren som får åtkomst has no groups in common with user being accessed - + har inga grupper gemensamt med användaren som nås equals user being accessed - + är lika med användaren som nås is different from user being accessed - + är annorlunda än den användare som nås is already connected - + är redan ansluten is not connected - + är inte ansluten is local computer - + är lokal dator is not local computer - + är inte lokal dator Computer being accessed - + Åtkomst till datorn Session being accessed is a user session - + Sessionen som öppnas är en användarsession Session being accessed is a login screen - + Sessionen som öppnas är en inloggningsskärm + + + Local computer is already being accessed + Den lokala datorn är redan tillgänglig + + + Local computer is not yet being accessed + Den lokala datorn är ännu inte åtkomlig @@ -332,50 +339,50 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an Accessing user: - + Tillgång till användare: Local computer: - + Lokal dator: Accessing computer: - + Åtkomst till dator: Please enter the following user and computer information in order to test the configured ruleset. - + Ange följande användar- och datorinformation för att testa den konfigurerade regeluppsättningen. Local user: - + Lokal användare: Connected users: - + Anslutna användare: The access in the given scenario is allowed. - + Åtkomsten i det givna scenariot är tillåten. The access in the given scenario is denied. - + Tillträde i det givna scenariot nekas. The access in the given scenario needs permission of the logged on user. - - - - ERROR: Unknown action - + Åtkomsten i det givna scenariot kräver tillstånd från den inloggade användaren. Test result - + Testresultat Authentication method + Autentiseringsmetod + + + There is no matching rule with a valid action. The access is therefore denied. @@ -383,371 +390,378 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an AuthKeysConfigurationWidget Introduction - + Introduktion Please perform the following steps to set up key file authentication: - + Utför följande steg för att konfigurera autentisering av nyckelfiler: 1) Create a key pair on the master computer. - + 1) Skapa ett nyckelpar på huvuddatorn. 2) Set an access group whose members should be allowed to access other computers. - + 2) Ange en åtkomstgrupp vars medlemmar ska ha åtkomst till andra datorer. 3) Export the public key and import it on all client computers with the same name. - + 3) Exportera den publika nyckeln och importera den på alla klientdatorer med samma namn. Please refer to the <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyon Administrator Manual</a> for more information. - + Mer information finns i <a href="https://veyon.readthedocs.io/en/latest/admin/index.html">Veyons administratörshandbok</a>. Key file directories - + Kataloger med nyckelfiler Public key file base directory - + Baskatalog för fil med offentlig nyckel Private key file base directory - + Baskatalog för fil med privat nyckel Available authentication keys - + Tillgängliga autentiseringsnycklar An authentication key pair consist of two coupled cryptographic keys, a private and a public key. A private key allows users on the master computer to access client computers. It is important that only authorized users have read access to the private key file. The public key is used on client computers to authenticate incoming connection request. - + Ett nyckelpar för autentisering består av två kopplade kryptografiska nycklar, en privat och en offentlig nyckel. +En privat nyckel ger användare på huvuddatorn åtkomst till klientdatorer. +Det är viktigt att endast behöriga användare har läsbehörighet till den privata nyckelfilen. +Den publika nyckeln används på klientdatorer för att autentisera inkommande anslutningsbegäran. Create key pair - + Skapa nyckelpar Delete key - + Radera tangent Import key - + Importera nyckel Export key - + Exportknapp Set access group - + Ställ in åtkomstgrupp Key files (*.pem) - + Nyckelfiler (*.pem) Authentication key name - + Namn på autentiseringsnyckel Please enter the name of the user group or role for which to create an authentication key pair: - + Ange namnet på den användargrupp eller roll för vilken du vill skapa ett nyckelpar för autentisering: Do you really want to delete authentication key "%1/%2"? - + Vill du verkligen ta bort autentiseringsnyckeln "%1/%2"? Please select a key to delete! - - - - Please enter the name of the user group or role for which to import the authentication key: - + Välj en nyckel som ska raderas! Please select a key to export! - + Vänligen välj en nyckel för export! Please select a user group which to grant access to key "%1": - + Välj en användargrupp som ska få tillgång till nyckeln "%1": Please select a key which to set the access group for! - + Välj en nyckel som du vill ställa in åtkomstgruppen för! + + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + Ange namnet på den användargrupp eller roll som autentiseringsnyckeln ska importeras för. + +Se till att namnen på de nycklar som tillhör varandra är identiska på alla datorer. AuthKeysManager Please check your permissions. - + Vänligen kontrollera dina behörigheter. Key name contains invalid characters! - + Nyckelns namn innehåller ogiltiga tecken! Invalid key type specified! Please specify "%1" or "%2". - + Ogiltig nyckeltyp angiven! Vänligen ange "%1" eller "%2". Specified key does not exist! Please use the "list" command to list all installed keys. - + Angiven nyckel finns inte! Använd kommandot "list" för att lista alla installerade nycklar. One or more key files already exist! Please delete them using the "delete" command. - + En eller flera nyckelfiler finns redan! Ta bort dem med hjälp av kommandot "delete". Creating new key pair for "%1" - + Skapar nytt nyckelpar för "%1" Failed to create public or private key! - + Misslyckades med att skapa offentlig eller privat nyckel! Newly created key pair has been saved to "%1" and "%2". - + Det nyskapade nyckelparet har sparats till "%1" och "%2". Could not remove key file "%1"! - + Det gick inte att ta bort nyckelfilen "%1"! Could not remove key file directory "%1"! - + Det gick inte att ta bort nyckelfilskatalogen "%1"! Failed to create directory for output file. - + Misslyckades med att skapa katalog för utdatafil. File "%1" already exists. - + Filen "%1" finns redan. Failed to write output file. - + Misslyckades med att skriva utdatafilen. Key "%1/%2" has been exported to "%3" successfully. - + Nyckel "%1/%2" har exporterats till "%3" framgångsrikt. Failed read input file. - + Misslyckades med att läsa inmatningsfilen. File "%1" does not contain a valid private key! - + Filen "%1" innehåller inte en giltig privat nyckel! File "%1" does not contain a valid public key! - + Filen "%1" innehåller inte en giltig offentlig nyckel! Failed to create directory for key file. - + Misslyckades med att skapa katalog för nyckelfilen. Failed to write key file "%1". - + Misslyckades med att skriva nyckelfilen "%1". Failed to set permissions for key file "%1"! - + Misslyckades med att ange behörigheter för nyckelfilen "%1"! Key "%1/%2" has been imported successfully. Please check file permissions of "%3" in order to prevent unauthorized accesses. - + Nyckel "%1/%2" har importerats framgångsrikt. Kontrollera filbehörigheterna för "%3" för att förhindra obehörig åtkomst. Failed to convert private key to public key - + Misslyckades med att konvertera privat nyckel till offentlig nyckel Failed to create directory for private key file "%1". - + Det gick inte att skapa en katalog för den privata nyckelfilen "%1". Failed to save private key in file "%1"! - + Misslyckades med att spara privat nyckel i filen "%1"! Failed to set permissions for private key file "%1"! - + Misslyckades med att ange behörigheter för privat nyckelfil "%1"! Failed to create directory for public key file "%1". - + Det gick inte att skapa en katalog för den offentliga nyckelfilen "%1". Failed to save public key in file "%1"! - + Misslyckades med att spara offentlig nyckel i filen "%1"! Failed to set permissions for public key file "%1"! - + Misslyckades med att ange behörigheter för den offentliga nyckelfilen "%1"! Failed to set owner of key file "%1" to "%2". - + Misslyckades med att ange ägare för nyckelfilen "%1" till "%2". Failed to set permissions for key file "%1". - + Misslyckades med att ange behörigheter för nyckelfilen "%1". Key "%1" is now accessible by user group "%2". - + Nyckel "%1" är nu tillgänglig för användargrupp "%2". <N/A> - + <N/A> Failed to read key file. - + Misslyckades med att läsa nyckelfilen. AuthKeysPlugin Create new authentication key pair - + Skapa ett nytt nyckelpar för autentisering Delete authentication key - + Ta bort autentiseringsnyckel List authentication keys - + Lista autentiseringsnycklar Import public or private key - + Importera offentlig eller privat nyckel Export public or private key - + Exportera offentlig eller privat nyckel Extract public key from existing private key - + Extrahera offentlig nyckel från befintlig privat nyckel Set user group allowed to access a key - + Ange vilken användargrupp som ska ha åtkomst till en nyckel KEY - + Nyckel ACCESS GROUP - + TILLGÅNGSGRUPP This command adjusts file access permissions to <KEY> such that only the user group <ACCESS GROUP> has read access to it. - + Detta kommando justerar filåtkomstbehörigheterna för <KEY> så att endast användargruppen <ACCESS GROUP> har läsåtkomst till den. NAME - + NAMN FILE - + ORDER This command exports the authentication key <KEY> to <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + Detta kommando exporterar autentiseringsnyckeln <KEY> till <FILE>. Om <FILE> inte anges kommer ett namn att konstrueras utifrån namn och typ för <KEY>. This command imports the authentication key <KEY> from <FILE>. If <FILE> is not specified a name will be constructed from name and type of <KEY>. - + Detta kommando importerar autentiseringsnyckeln <KEY> från <FILE>. Om <FILE> inte anges kommer ett namn att konstrueras utifrån namn och typ i <KEY>. This command lists all available authentication keys in the configured key directory. If the option "%1" is specified a table with key details will be displayed instead. Some details might be missing if a key is not accessible e.g. due to the lack of read permissions. - + Detta kommando listar alla tillgängliga autentiseringsnycklar i den konfigurerade nyckelkatalogen. Om alternativet "%1" anges visas i stället en tabell med nyckelinformation. Vissa detaljer kan saknas om en nyckel inte är tillgänglig, t.ex. på grund av att läsbehörighet saknas. TYPE - + TYP PAIR ID - + PAIR ID Commands for managing authentication keys - + Kommandon för hantering av autentiseringsnycklar This command creates a new authentication key pair with name <NAME> and saves private and public key to the configured key directories. The parameter must be a name for the key, which may only contain letters. - + Det här kommandot skapar ett nytt nyckelpar för autentisering med namnet <NAME> och sparar den privata och offentliga nyckeln i de konfigurerade nyckelkatalogerna. Parametern måste vara ett namn för nyckeln, som endast får innehålla bokstäver. This command deletes the authentication key <KEY> from the configured key directory. Please note that a key can't be recovered once it has been deleted. - + Detta kommando raderar autentiseringsnyckeln <KEY> från den konfigurerade nyckelkatalogen. Observera att en nyckel inte kan återställas när den har tagits bort. This command extracts the public key part from the private key <KEY> and saves it as the corresponding public key. When setting up another master computer, it is therefore sufficient to transfer the private key only. The public key can then be extracted. - + Detta kommando extraherar den offentliga nyckeldelen från den privata nyckeln <KEY> och sparar den som motsvarande offentliga nyckel. När du installerar en annan huvuddator räcker det därför med att endast överföra den privata nyckeln. Den publika nyckeln kan sedan extraheras. Authentication key files are not set up properly on this computer. Please create new key files or switch to a different authentication method using the Veyon Configurator. - + Autentiseringsnyckelfiler är inte korrekt inställda på den här datorn. Skapa nya nyckelfiler eller byt till en annan autentiseringsmetod med hjälp av Veyon Configurator. Key file authentication - + Autentisering av nyckelfiler Key file - + Nyckelfil Please specify the key name (e.g. "teacher/public") as the first argument. - + Ange nyckelns namn (t.ex. "teacher/public") som första argument. Please specify the command to display help for. - + Ange det kommando som du vill visa hjälp för. The specified command does not exist or no help is available for it. - + Det angivna kommandot finns inte eller så finns det ingen hjälp tillgänglig för det. AuthKeysTableModel Name - + Namn Type - + Typ Access group - + Behörighetsgrupp Pair ID - + Par-ID @@ -758,22 +772,22 @@ The public key is used on client computers to authenticate incoming connection r Username to bind DN mapping: - + Användarnamn för att binda DN-mappning: e.g. %username%@DOMAIN or cn=%username%,ou=users,dc=example,dc=org - + t.ex. %username%@DOMAIN eller cn=%username%,ou=users,dc=example,dc=org AuthLdapDialog Veyon Logon - + Veyon inloggning Please enter your domain/LDAP username and password in order to access computers. - + Ange ditt domän/LDAP-användarnamn och lösenord för att få tillgång till datorer. Username @@ -789,18 +803,18 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + Inloggning misslyckades med angivet användarnamn och lösenord. Vänligen försök igen! AuthLogonDialog Veyon Logon - + Veyon inloggning Please enter your username and password in order to access computers. - + Ange ditt användarnamn och lösenord för att få tillgång till datorerna. Username @@ -816,33 +830,33 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given username and password. Please try again! - + Inloggning misslyckades med angivet användarnamn och lösenord. Vänligen försök igen! AuthLogonPlugin The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Det angivna användarnamnet eller lösenordet är fel. Ange giltiga inloggningsuppgifter eller byt till en annan autentiseringsmetod med Veyon Configurator. Logon authentication - + Autentisering av inloggning Logon - + Logga in AuthSimpleDialog Veyon Logon - + Veyon inloggning Please enter the Veyon password: - + Vänligen ange lösenordet för Veyon: Authentication error @@ -850,398 +864,398 @@ The public key is used on client computers to authenticate incoming connection r Logon failed with given password. Please try again! - + Inloggning misslyckades med angivet lösenord. Vänligen försök igen! AuthSimplePlugin The supplied password is wrong. Please enter the correct password or switch to a different authentication method using the Veyon Configurator. - + Det angivna lösenordet är fel. Ange rätt lösenord eller byt till en annan autentiseringsmetod med hjälp av Veyon Configurator. Simple password authentication - + Enkel autentisering med lösenord Simple password - + Enkelt lösenord AuthenticationPage Authentication is set up properly on this computer. - + Autentiseringen är korrekt inställd på den här datorn. AuthenticationPageTab Enabled - + Aktiverad Test - Test + Testa BuiltinDirectoryConfiguration Builtin directory - + Inbyggd katalog BuiltinDirectoryConfigurationPage Computers - + Datorer Name - + Namn Host address/IP - + Värdadress/IP MAC address - + MAC-adress Add new computer - + Lägg till ny dator Remove selected computer - + Ta bort vald dator New computer - + Ny dator Builtin directory - + Inbyggd katalog Locations - + Platser Add new location - + Skapa ny plats Remove selected location - + Ta bort vald plats New location - + Ny plats Directory name - + Namn på katalog Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + Import av CSV-filer är möjlig via kommandoradsgränssnittet. Mer information finns i <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">onlinedokumentationen</a>. BuiltinDirectoryPlugin Show help for specific command - + Visa hjälp för ett specifikt kommando Import objects from given file - + Importera objekt från en given fil Export objects to given file - + Exportera objekt till en given fil Invalid type specified. Valid values are "%1" or "%2". - + Ogiltig typ angiven. Giltiga värden är "%1" eller "%2". Type - + Typ Name - + Namn Host address - + Värdadress MAC address - + MAC-adress Specified object not found. - + Angivet objekt hittades inte. File "%1" does not exist! - + Filen "%1" finns inte! Can't open file "%1" for reading! - + Kan inte öppna filen "%1" för läsning! Unknown argument "%1". - + Okänt argument "%1". Computer "%1" (host address: "%2" MAC address: "%3") - + Dator "%1" (värdadress: "%2" MAC-adress: "%3") Unclassified object "%1" with ID "%2" - + Oklassificerat objekt "%1" med ID "%2" None - + Ingen Computer - + Dator Root - + Rot Invalid - + Ogiltig Error while parsing line %1. - + Fel vid parsning av rad %1. Network object directory which stores objects in local configuration - + Nätverksobjektkatalog som lagrar objekt i lokal konfiguration Commands for managing the builtin network object directory - + Kommandon för att hantera den inbyggda katalogen för nätverksobjekt No format string or regular expression specified! - + Ingen formatsträng eller reguljärt uttryck har angetts! Can't open file "%1" for writing! - + Kan inte öppna filen "%1" för skrivning! No format string specified! - + Ingen formatsträng specificerad! Object UUID - + Objektets UUID Parent UUID - + Förälder UUID Add a location or computer - + Lägg till en plats eller dator Clear all locations and computers - + Rensa alla platser och datorer Dump all or individual locations and computers - + Dumpa alla eller enskilda platser och datorer List all locations and computers - + Lista alla platser och datorer Remove a location or computer - + Ta bort en plats eller dator Location "%1" - + Plats "%1" Builtin (computers and locations in local configuration) - + Inbyggd (datorer och platser i lokal konfiguration) Location - + Plats FILE - + ORDER LOCATION - + PLATS FORMAT-STRING-WITH-PLACEHOLDERS - + FORMAT-STRÄNG-MED-PLATSHÅLLARE REGULAR-EXPRESSION-WITH-PLACEHOLDER - + REGULJÄRT UTTRYCK-MED-PLATSHÅLLARE Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 - + Importerar objekt från den angivna textfilen med hjälp av den angivna formatsträngen eller det reguljära uttrycket som innehåller en eller flera platshållare. Giltiga platshållare är: %1 Import simple CSV file to a single room - + Importera enkel CSV-fil till ett enda rum Import CSV file with location name in first column - + Importera CSV-fil med platsnamn i första kolumnen Import text file with with key/value pairs using regular expressions - + Importera textfil med nyckel/värde-par med hjälp av reguljära uttryck Import arbitrarily formatted data - + Importera godtyckligt formaterad data Exports objects to the specified text file using the given format string containing one or multiple placeholders. Valid placeholders are: %1 - + Exporterar objekt till den angivna textfilen med hjälp av den angivna formatsträngen som innehåller en eller flera platshållare. Giltiga platshållare är: %1 Export all objects to a CSV file - + Exportera alla objekt till en CSV-fil Export all computers in a specific location to a CSV file - + Exportera alla datorer på en viss plats till en CSV-fil TYPE - + TYP NAME - + NAMN PARENT - + FÖRÄLDRAR Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. - + Lägger till ett objekt där %1 ckan vara en av "%2" eller "%3". %4 ckan specificeras med namn eller UUID. Add a room - + Lägg till ett rum Add a computer to room %1 - + Lägg till en dator i rum %1 OBJECT - + OBJECT Removes the specified object from the directory. %1 can be specified by name or UUID. Removing a location will also remove all related computers. - + Tar bort det angivna objektet från katalogen. %1 c kan anges med namn eller UUID. Om du tar bort en plats tas även alla relaterade datorer bort. Remove a computer by name - + Ta bort en dator med namn Remove an object by UUID - + Ta bort ett objekt med UUID "Room 01" - + "Rum 01" "Computer 01" - + "Dator 01" HOST ADDRESS - + VÄRDENS ADRESS MAC ADDRESS - + MAC-ADRESS The specified command does not exist or no help is available for it. - + Det angivna kommandot finns inte eller så finns det ingen hjälp tillgänglig för det. + + + Location "%1" not found. + Platsen "%1" hittades inte. BuiltinUltraVncServer Builtin VNC server (UltraVNC) - + Inbyggd VNC-server (UltraVNC) BuiltinX11VncServer Builtin VNC server (x11vnc) - + Inbyggd VNC-server (x11vnc) ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 - + Aktiva funktioner: %1 Online and connected - + Online och uppkopplad Establishing connection - + Upprättande av anslutning Computer offline or switched off - + Dator offline eller avstängd Authentication failed or access denied - + Autentiseringen misslyckades eller åtkomst nekades Disconnected - + Urkopplad No user logged on @@ -1249,30 +1263,42 @@ The public key is used on client computers to authenticate incoming connection r Logged on user: %1 - + Inloggad användare: %1 Location: %1 - + Plats: %1 [no user] - + [ingen användare] Veyon Server unreachable or not running - + Veyon Server går inte att nå eller körs inte Name: %1 + Namn: %1 + + + Hostname: %1 + + + + unknown + okänd + + + IP address: %1 - invalid + Hostname could not be resolved - [none] + No features active @@ -1280,7 +1306,7 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlServer %1 Service %2 at %3:%4 - + %1 Service %2 vid %3:%4 Authentication error @@ -1288,228 +1314,244 @@ The public key is used on client computers to authenticate incoming connection r Remote access - + Fjärråtkomst User "%1" at host "%2" is now accessing this computer. - + Användaren "%1" på värden "%2" har nu tillgång till den här datorn. User "%1" at host "%2" attempted to access this computer but could not authenticate successfully. - + Användaren "%1" på värden "%2" försökte komma åt den här datorn men kunde inte autentisera sig. Access control error - + Fel i åtkomstkontroll User "%1" at host "%2" attempted to access this computer but has been blocked due to access control settings. - + Användaren "%1" på värden "%2" försökte komma åt den här datorn men blockerades på grund av inställningar för åtkomstkontroll. Active connections: - + Aktiva anslutningar: ComputerGroupSelector Group %1 - + Grupp %1 ComputerManager User - + Användare Missing network object directory plugin - + Saknar plugin för nätverksobjektkatalog No default network object directory plugin was found. Please check your installation or configure a different network object directory backend via %1 Configurator. - + Inget standardinsticksprogram för nätverksobjektkatalog hittades. Kontrollera din installation eller konfigurera en annan backend för nätverksobjektkatalog via %1 Configurator. Location detection failed - + Platsdetektering misslyckades Computer name;Hostname;User - + Datornamn;Värdnamn;Användare Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. - + Det gick inte att fastställa platsen för den här datorn. Detta indikerar ett problem med systemkonfigurationen. Alla platser visas i stället i panelen för val av dator. + + + Logged in since + Inloggad sedan + + + %1 days + %1 days + + + 1 day + 1 dag ComputerMonitoring Computers - + Datorer Search users and computers - + Sök användare och datorer Select all - + Markera allt Unselect all - + Avmarkera alla Add to group - + Lägg till i grupp Remove from group - + Ta bort från grupp ComputerSelectPanel Computer search - + Sökning i dator Add location - + Lägg till plats Save computer/user list - + Spara dator/användarlista Select output filename - + Välj filnamn för utdata CSV files (*.csv) - + CSV-filer (*.csv) File error - + Fel i filen Could not write the computer and users list to %1! Please check the file access permissions. - + Det gick inte att skriva dator- och användarlistan till %1! Kontrollera filåtkomstbehörigheterna. + + + Search computers + Sök datorer ConfigCommands Clear system-wide Veyon configuration - + Rensa systemomfattande Veyon-konfiguration List all configuration keys and values - + Lista alla konfigurationsnycklar och värden Import configuration from given file - + Importera konfiguration från given fil Export configuration to given file - + Exportera konfiguration till angiven fil Read and output configuration value for given key - + Läser och matar ut konfigurationsvärde för given nyckel Write given value to given configuration key - + Skriv ett givet värde till en given konfigurationsnyckel Unset (remove) given configuration key - + Ta bort (unset) en given konfigurationsnyckel Upgrade and save configuration of program and plugins - + Uppgradera och spara konfiguration av program och plugins Please specify an existing configuration file to import. - + Ange en befintlig konfigurationsfil som ska importeras. Configuration file is not readable! - + Konfigurationsfilen är inte läsbar! Please specify a valid filename for the configuration export. - + Ange ett giltigt filnamn för konfigurationsexporten. Output file is not writable! - + Utdatafilen är inte skrivbar! Output directory is not writable! - + Utdatakatalogen är inte skrivbar! Please specify a valid key. - + Vänligen ange en giltig nyckel. Specified key does not exist in current configuration! - + Angiven nyckel finns inte i aktuell konfiguration! Please specify a valid value. - + Vänligen ange ett giltigt värde. Configure Veyon at command line - + Konfigurera Veyon på kommandoraden Commands for managing the configuration of Veyon - + Kommandon för att hantera konfigurationen av Veyon ConfigurationManager Could not modify the autostart property for the %1 Service. - + Det gick inte att ändra egenskapen autostart för tjänsten %1. Could not configure the firewall configuration for the %1 Server. - + Det gick inte att konfigurera brandväggskonfigurationen för servern %1. Could not configure the firewall configuration for the %1 Worker. - + Det gick inte att konfigurera brandväggskonfigurationen för %1 Worker. Configuration is not writable. Please check your permissions! - + Konfigurationen är inte skrivbar. Vänligen kontrollera dina behörigheter! Could not apply platform-specific configuration settings. - + Det gick inte att tillämpa plattformsspecifika konfigurationsinställningar. Could not configure the firewall configuration for the %1 Service. - + Det gick inte att konfigurera brandväggskonfigurationen för tjänsten %1. DemoClient %1 Demo - + %1 Demo @@ -1520,42 +1562,50 @@ The public key is used on client computers to authenticate incoming connection r Tunables - + Avstämbara instrument ms - + ms Key frame interval - + Intervall för nyckelram Memory limit - + Minnesgräns MB - + MB Update interval - + Uppdateringsintervall s - + s Slow down thumbnail updates while demo is running - + Långsammare uppdatering av miniatyrbilder när demo körs + + + Bandwidth limit + Begränsning av bandbredd + + + MB/s + MB/s DemoFeaturePlugin Stop demo - + Stoppa demo Window demo @@ -1563,74 +1613,74 @@ The public key is used on client computers to authenticate incoming connection r Give a demonstration by screen broadcasting - + Ge en demonstration genom skärmutsändning In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. - + I det här läget visas din skärm i ett fönster på alla datorer. Användarna kan växla till andra fönster efter behov. Demo - + Demo Share your screen or allow a user to share his screen with other users. - + Dela din skärm eller låt en användare dela sin skärm med andra användare. Full screen demo - + Demo i fullskärm Share your own screen in fullscreen mode - + Dela din egen skärm i helskärmsläge In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + I det här läget visas din skärm i helskärmsläge på alla datorer medan användarnas inmatningsenheter är låsta. Share your own screen in a window - + Dela din egen skärm i ett fönster Share selected user's screen in fullscreen mode - + Dela den valda användarens skärm i helskärmsläge In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + I detta läge visas skärmen för den valda användaren i helskärmsläge på alla datorer medan användarnas inmatningsenheter är låsta. Share selected user's screen in a window - + Dela den valda användarens skärm i ett fönster In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + I det här läget visas skärmen för den valda användaren i ett fönster på alla datorer. Användarna kan växla till andra fönster efter behov. Please select a user screen to share. - + Välj en användarskärm som du vill dela med dig av. Please select only one user screen to share. - + Välj bara en användarskärm att dela med dig av. All screens - + Alla skärmar DesktopAccessDialog Desktop access dialog - + Dialog för åtkomst till skrivbord Confirm desktop access - + Bekräfta åtkomst till skrivbordet Never for this session @@ -1642,97 +1692,97 @@ The public key is used on client computers to authenticate incoming connection r The user %1 at computer %2 wants to access your desktop. Do you want to grant access? - + Användaren %1 på datorn %2 vill komma åt ditt skrivbord. Vill du bevilja åtkomst? DesktopServicesConfigurationPage Name - + Namn Path - + Sökväg Predefined websites - + Fördefinierade webbplatser Remove selected website - + Ta bort vald webbplats URL - + URL New website - + Ny webbplats Applications & websites - + Applikationer & webbplatser Predefined applications - + Fördefinierade applikationer Add new application - + Lägg till ny applikation Remove selected application - + Ta bort vald applikation Add new website - + Lägg till ny webbplats New application - + Ny application DesktopServicesFeaturePlugin Open website - + Öppna webbplats Click this button to open a website on all computers. - + Klicka på den här knappen för att öppna en webbplats på alla datorer. Open website "%1" - + Öppna webbplatsen "%1" Custom website - + Anpassad webbplats Start application - + Starta ansökan Click this button to start an application on all computers. - + Klicka på den här knappen för att starta ett program på alla datorer. Start application "%1" - + Starta applikationen "%1" Custom application - + Anpassad applikation Start apps and open websites in user sessions - + Starta appar och öppna webbplatser i användarsessioner @@ -1743,307 +1793,307 @@ The public key is used on client computers to authenticate incoming connection r Room %1 - + Rum %1 Please complete all tasks within the next 5 minutes. - + Vänligen slutför alla uppgifter inom de närmaste 5 minuterna. Custom website - + Anpassad webbplats Open file manager - + Öppna filhanteraren Start learning tool - + Starta inlärningsverktyget Play tutorial video - + Spela upp instruktionsvideo Handout - + Handout Texts to read - + Texter att läsa generic-student-user - + generisk-student-användare Custom application - + Anpassad applikation ExternalVncServer External VNC server - + Extern VNC-server ExternalVncServerConfigurationWidget External VNC server configuration - + Konfiguration av extern VNC-server Port: - + Hamn: Password: - + Lösenord: FeatureCommands List names of all available features - + Lista namn på alla tillgängliga funktioner Show table with details of all available features - + Visa tabell med detaljer om alla tillgängliga funktioner Start a feature on a remote host - + Starta en funktion på en avlägsen värd Stop a feature on a remote host - + Stoppa en funktion på en fjärrvärd Please specify the command to display help for. - + Ange det kommando som du vill visa hjälp för. Displays a list with the names of all available features. - + Visar en lista med namnen på alla tillgängliga funktioner. Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. - + Visar en tabell med detaljerad information om alla tillgängliga funktioner. Informationen omfattar en beskrivning, UID, namnet på det plugin som tillhandahåller respektive funktion och vissa andra implementeringsrelaterade detaljer. HOST ADDRESS - + VÄRDENS ADRESS FEATURE - + Funktion ARGUMENTS - + Aktivera extra videoargument Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information - + Startar den angivna funktionen på den angivna värden genom att ansluta till Veyon Server som körs på distans. Funktionen kan anges med namn eller UID. Använd kommandot ``show`` för att se alla tillgängliga funktioner. Beroende på funktionen måste ytterligare argument (t.ex. textmeddelandet som ska visas) kodade som en enda JSON-sträng anges. Se utvecklarens dokumentation för mer information Lock the screen - + Lås skärmen Display a text message - + Visa ett textmeddelande Test message - + Test meddelande Start an application - + Starta en ansökan Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. - + Stoppar den angivna funktionen på den angivna värden genom att ansluta till Veyon-servern som körs på distans. Funktionen kan anges med namn eller UID. Använd kommandot ``show`` för att se alla tillgängliga funktioner. Unlock the screen - + Lås upp skärmen The specified command does not exist or no help is available for it. - + Det angivna kommandot finns inte eller så finns det ingen hjälp tillgänglig för det. Name - + Namn Description - + Beskrivning Master - + Säkerhetsansvarig Service - + Tjänst Worker - + Vägledare UID - + UID Plugin - + Tillägg Invalid feature name or UID specified - + Ogiltigt funktionsnamn eller UID angivet Error parsing the JSON-encoded arguments: %1 - + Fel vid analys av JSON-kodade argument: %1 Failed to initialize credentials - + Initialisering av autentiseringsuppgifter misslyckades Could not establish a connection to host %1 - + Det gick inte att upprätta en anslutning till värden %1 Failed to send feature control message to host %1 - + Misslyckades med att skicka feature control-meddelande till host %1 Feature-related CLI operations - + Funktionsrelaterade CLI-åtgärder Commands for controlling features - + Kommandon för styrning av funktioner FileTransferConfigurationPage File transfer - + Filöverföring Directories - + Kataloger Destination directory - + Destinationskatalog Default source directory - + Standard källkatalog Options - + Alternativ Remember last source directory - + Kom ihåg den senaste källkatalogen Create destination directory if it does not exist - + Skapa destinationskatalog om den inte finns FileTransferController Could not open file "%1" for reading! Please check your permissions! - + Filen "%1" kunde inte öppnas för läsning! Vänligen kontrollera dina behörigheter! FileTransferDialog File transfer - + Filöverföring Options - + Alternativ Transfer only - + Endast överföring Transfer and open file(s) with associated program - + Överför och öppna fil(er) med tillhörande program Transfer and open destination folder - + Överför och öppna målmappen Files - + Filer Start - + Starta Overwrite existing files - + Skriv över befintliga filer FileTransferFileDialog Select one or more files to transfer - + Välj en eller flera filer som ska överföras FileTransferPlugin File transfer - + Filöverföring Click this button to transfer files from your computer to all computers. - + Klicka på den här knappen för att överföra filer från din dator till alla datorer. Select one or more files to transfer - + Välj en eller flera filer som ska överföras Transfer files to remote computer - + Överför filer till fjärrdatorn Received file "%1". - + Mottagen fil "%1". Could not receive file "%1" as it already exists. - + Kunde inte ta emot filen "%1" eftersom den redan finns. Could not receive file "%1" as it could not be opened for writing! - + Kunde inte ta emot filen "%1" eftersom den inte kunde öppnas för skrivning! @@ -2054,15 +2104,15 @@ The public key is used on client computers to authenticate incoming connection r Language: - + Språk: Use system language setting - + Använd systemets språkinställning Veyon - + Veyon Logging @@ -2110,59 +2160,59 @@ The public key is used on client computers to authenticate incoming connection r Log to standard error output - + Logga till standardfelutmatning %1 service - + %1 tjänst The %1 service needs to be stopped temporarily in order to remove the log files. Continue? - + %1 service måste stoppas tillfälligt för att ta bort loggfilerna. Fortsätter du? Log files cleared - + Loggfiler rensade All log files were cleared successfully. - + Alla loggfiler rensades framgångsrikt. Error - + Fel Could not remove all log files. - + Det gick inte att ta bort alla loggfiler. MB - + MB Rotate log files - + Rotera loggfiler x - + bredd Write to logging system of operating system - + Skriv till operativsystemets loggningssystem TLS configuration - + TLS-konfiguration Use certificate authority for TLS connections - + Använd certifikatutfärdare för TLS-anslutningar CA certificate file - + CA-certifikatfil ... @@ -2170,349 +2220,408 @@ The public key is used on client computers to authenticate incoming connection r Host certificate file - + Värdcertifikatfil Host private key file + Värdens privata nyckelfil + + + Style: + Stil: + + + Native + Inbyggd + + + Color scheme: + + + + Light + + + + Dark + + User groups + Användargrupper + + + Backend: + Bakände: + + + Include user groups from domain + Inkludera användargrupper från domänen + + + Missing user groups backend + Saknad backend för användargrupper + + + No user groups plugin was found. Please check your installation! + Inget plugin för användargrupper hittades. Vänligen kontrollera din installation! + HeadlessVncServer Headless VNC server - + Huvudlös VNC-server LdapBrowseDialog Browse LDAP - + Bläddra i LDAP LdapClient LDAP error description: %1 - + Beskrivning av LDAP-fel: %1 LdapConfiguration LDAP connection failed - + LDAP-anslutningen misslyckades Could not connect to the LDAP server. Please check the server parameters. %1 - + Det gick inte att ansluta till LDAP-servern. Kontrollera serverns parametrar. + +%1 LDAP bind failed - + LDAP-bindning misslyckades Could not bind to the LDAP server. Please check the server parameters and bind credentials. %1 - + Det gick inte att binda till LDAP-servern. Kontrollera serverparametrarna och bindningsuppgifterna. + +%1 LDAP bind successful - + LDAP bindning framgångsrik Successfully connected to the LDAP server and performed an LDAP bind. The basic LDAP settings are configured correctly. - + Anslöt till LDAP-servern och utförde en LDAP-bindning. De grundläggande LDAP-inställningarna är korrekt konfigurerade. LDAP base DN test failed - + Test av LDAP-bas-DN misslyckades Could not query the configured base DN. Please check the base DN parameter. %1 - + Det gick inte att fråga efter det konfigurerade bas-DN:et. Kontrollera parametern för bas-DN. + +%1 LDAP base DN test successful - + Test av LDAP-bas-DN framgångsrikt The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP-bas-DN:n har sökts framgångsrikt. Följande poster hittades: + +%1 LDAP naming context test failed - + Test av LDAP-namngivningskontext misslyckades Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + Det gick inte att fråga efter bas-DN via namngivningskontexter. Kontrollera parametern för attribut för namngivningskontext. + +%1 LDAP naming context test successful - + Test av LDAP-namngivningskontext framgångsrikt The LDAP naming context has been queried successfully. The following base DN was found: %1 - + LDAP-namngivningskontexten har sökts framgångsrikt. Följande bas-DN hittades: +%1 user tree - + användarträd User tree - + Användarträd group tree - + gruppträd Group tree - + Gruppträd computer tree - + datorträd Computer tree - + Dator träd computer group tree - + datorgrupp träd Computer group tree - + Dator grupp träd user objects - + användarobjekt User login name attribute - + Attribut för användarens inloggningsnamn group members - + gruppmedlemmar Group member attribute - + Attribut för gruppmedlem Group not found - + Gruppen hittades inte Could not find a group with the name "%1". Please check the group name or the group tree parameter. - + Det gick inte att hitta en grupp med namnet "%1". Kontrollera gruppnamnet eller parametern för gruppträdet. computer objects - + datorobjekt Computer display name attribute - + Attribut för datorns visningsnamn Invalid hostname - + Ogiltigt värdnamn You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + Du konfigurerade datorns värdnamn så att de lagras som fullständigt kvalificerade domännamn (FQDN) men angav ett värdnamn utan domän. You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Du konfigurerade datorns värdnamn så att de lagras som enkla värdnamn utan domännamn, men angav ett värdnamn med en domännamnsdel. Computer hostname attribute - + Attribut för datorns värdnamn computer MAC addresses - + mAC-adresser till datorer Computer MAC address attribute - + MAC-adressattribut för dator computer locations - + datorplatser Computer location attribute - + Attribut för datorplats Location name attribute - + Attribut för platsnamn users - + användare user groups - + användargrupper computers - + datorer computer groups - + datorgrupper computer containers - + datorbehållare groups of user - + grupper av användare User not found - + Användare kunde inte hittas Could not find a user with the name "%1". Please check the username or the user tree parameter. - + Det gick inte att hitta en användare med namnet "%1". Kontrollera användarnamnet eller parametern för användarträdet. groups of computer - + grupper av datorer Computer not found - + Datorn hittades inte Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + Det gick inte att hitta en dator med värdnamnet "%1". Kontrollera värdnamnet eller parametern för datorträdet. Hostname lookup failed - + Sökningen efter värdnamn misslyckades Could not lookup hostname for IP address %1. Please check your DNS server settings. - + Det gick inte att söka efter värdnamn för IP-adressen %1. Kontrollera inställningarna för din DNS-server. location entries - + platsangivelser Computer groups filter - + Filter för datorgrupper Computer locations identification - + Identifiering av datorplatser Filter for computer groups - + Filter för datorgrupper Invalid test value - + Ogiltigt testvärde An empty or invalid value has been supplied for this test. - + Ett tomt eller ogiltigt värde har angetts för detta test. LDAP %1 test failed - + LDAP %1-testet misslyckades Could not query any entries in configured %1. Please check the parameter "%2". %3 - + Det gick inte att fråga efter några poster i konfigurerad %1. Vänligen kontrollera parametern "%2". + +%3 LDAP %1 test successful - + LDAP %1-test framgångsrikt The %1 has been queried successfully and %2 entries were found. - + %1 har sökts framgångsrikt och %2 entries hittades. LDAP test failed - + LDAP-testet misslyckades Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + Kunde inte fråga någon %1. Kontrollera parametern/parametrarna %2 och ange namnet på ett befintligt objekt. + +%3 and - + och LDAP test successful - + LDAP-test framgångsrikt %1 %2 have been queried successfully: %3 - + %1 %2 har sökts framgångsrikt: + +%3 LDAP filter test failed - + Test av LDAP-filter misslyckades Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - + Kunde inte fråga någon %1 using det konfigurerade filtret. Kontrollera LDAP-filtret för %1. + +%2 LDAP filter test successful - + Test av LDAP-filter framgångsrikt %1 %2 have been queried successfully using the configured filter. - + %1 %2 har sökts framgångsrikt med hjälp av det konfigurerade filtret. LDAP directory - + LDAP-katalog LdapConfigurationPage Basic settings - + Standardinställningar General @@ -2520,147 +2629,147 @@ The public key is used on client computers to authenticate incoming connection r LDAP server and port - + LDAP-server och port Bind DN - + Binda DN Bind password - + Bind lösenord Anonymous bind - + Anonym bindning Use bind credentials - + Använd inloggningsuppgifter för bindning Base DN - + Bas DN Fixed base DN - + Fast bas DN e.g. dc=example,dc=org - + t.ex. dc=exempel,dc=org Discover base DN by naming context - + Upptäck bas-DN genom att namnge sammanhang e.g. namingContexts or defaultNamingContext - + t.ex. namingContexts eller defaultNamingContext Environment settings - + Miljöinställningar Object trees - + Objektträd Computer tree - + Dator träd e.g. OU=Groups - + t.ex. OU=Grupper User tree - + Användarträd e.g. OU=Users - + t.ex. OU=Användare e.g. OU=Computers - + t.ex. OU=Datorer Group tree - + Gruppträd Perform recursive search operations in object trees - + Utföra rekursiva sökoperationer i objektträd Object attributes - + Objektets attribut e.g. hwAddress - + t.ex. hwAddress e.g. member or memberUid - + t.ex. medlem eller memberUid e.g. dNSHostName - + t.ex. dNSHostName Computer MAC address attribute - + MAC-adressattribut för dator Group member attribute - + Attribut för gruppmedlem e.g. uid or sAMAccountName - + t.ex. uid eller sAMAccountName Advanced settings - + Avancerade inställningar Optional object filters - + Valfria objektfilter Filter for user groups - + Filter för användargrupper Filter for users - + Filter för användare Filter for computer groups - + Filter för datorgrupper Group member identification - + Identifiering av gruppmedlem Distinguished name (Samba/AD) - + Särskiljande namn (Samba/AD) List all groups of a user - + Lista alla grupper för en användare List all groups of a computer - + Lista alla grupper i en dator Get computer object by IP address - + Hämta datorobjekt via IP-adress Enter username @@ -2668,377 +2777,385 @@ The public key is used on client computers to authenticate incoming connection r Please enter a user login name (wildcards allowed) which to query: - + Ange ett användarinloggningsnamn (jokertecken tillåtna) som du vill fråga: Enter group name - + Ange gruppnamn Please enter a group name whose members to query: - + Ange ett gruppnamn vars medlemmar du vill fråga: Enter computer name - + Ange datorns namn Enter computer DN - + Gå in i datorn DN Please enter the DN of a computer whose MAC address to query: - + Ange DN för en dator vars MAC-adress du vill fråga efter: Please enter a user login name whose group memberships to query: - + Ange ett inloggningsnamn för den användare vars gruppmedlemskap ska efterfrågas: Enter computer IP address - + Ange datorns IP-adress Please enter a computer IP address which to resolve to an computer object: - + Ange en IP-adress för en dator som ska lösas upp till ett datorobjekt: (only if different from group tree) - + (endast om det skiljer sig från gruppträdet) Computer group tree - + Dator grupp träd Filter for computers - + Filter för datorer e.g. room or computerLab - + t.ex. rum eller datorLab Integration tests - + Integrationstest Computer groups - + Datorgrupper e.g. name or description - + t.ex. namn eller beskrivning Filter for computer containers - + Filter för datorbehållare Computer containers or OUs - + Datorbehållare eller OU:er Connection security - + Anslutningssäkerhet TLS certificate verification - + Verifiering av TLS-certifikat System defaults - + Systemets standardinställningar Never (insecure!) - + Aldrig (osäker!) Custom CA certificate file - + Anpassad CA-certifikatfil None - + Ingen TLS - + TLS SSL - + SSL e.g. (objectClass=computer) - + t.ex. (objektKlass=dator) e.g. (objectClass=group) - + t.ex. (objektKlass=grupp) e.g. (objectClass=person) - + t.ex. (objektKlass=person) e.g. (objectClass=room) or (objectClass=computerLab) - + t.ex. (objektKlass=rum) eller (objektKlass=datalabb) e.g. (objectClass=container) or (objectClass=organizationalUnit) - + t.ex. (objectClass=container) eller (objectClass=organizationalUnit) Certificate files (*.pem) - + Certifikatfiler (*.pem) Encryption protocol - + Krypteringsprotokoll Computer location attribute - + Attribut för datorplats Computer display name attribute - + Attribut för datorns visningsnamn Location name attribute - + Attribut för platsnamn e.g. cn or displayName - + t.ex. cn eller displayName Computer locations identification - + Identifiering av datorplatser Identify computer locations (e.g. rooms) via: - + Identifiera datorplatser (t.ex. rum) via: Location attribute in computer objects - + Platsattribut i datorobjekt List all entries of a location - + Lista alla poster för en plats List all locations - + Lista alla platser Enter computer display name - + Ange datorns visningsnamn Please enter a computer display name to query: - + Ange en dators visningsnamn för att ställa en fråga: Enter computer location name - + Ange datorns platsnamn Please enter the name of a computer location (wildcards allowed): - + Ange namnet på en datorplats (jokertecken tillåtna): Enter location name - + Ange platsens namn Please enter the name of a location whose entries to query: - + Ange namnet på en plats vars poster du vill söka efter: Browse - + Bläddra Test - Test + Testa Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Värdnamn lagrade som fullständigt kvalificerade domännamn (FQDN, t.ex. myhost.example.org) Computer hostname attribute - + Attribut för datorns värdnamn Please enter a computer hostname to query: - + Ange en dators värdnamn för att ställa en fråga: Enter hostname - + Ange värdnamn Please enter a computer hostname whose group memberships to query: - + Ange ett värdnamn på en dator vars gruppmedlemskap ska frågas: User login name attribute - + Attribut för användarens inloggningsnamn Configured attribute for user login name or computer hostname (OpenLDAP) - + Konfigurerat attribut för användarens inloggningsnamn eller datorns värdnamn (OpenLDAP) Directory name - + Namn på katalog Query options - + Alternativ för frågor Query nested user groups (supported by AD only) - + Fråga efter nästlade användargrupper (stöds endast av AD) + + + Query timeout + Tidsgräns för förfrågningar + + + ms + ms LdapNetworkObjectDirectoryConfigurationPage LDAP - + LDAP Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + Använd den globala LDAP-konfigurationssidan för att konfigurera hur du hämtar platser och datorer från din LDAP-baserade katalogtjänst. LdapPlugin Auto-configure the base DN via naming context - + Automatisk konfiguration av bas-DN via namngivningskontext Query objects from LDAP directory - + Fråga efter objekt från LDAP-katalog Show help about command - + Visa hjälp om kommandot Commands for configuring and testing LDAP/AD integration - + Kommandon för att konfigurera och testa LDAP/AD-integration Basic LDAP/AD support for Veyon - + Grundläggande LDAP/AD-stöd för Veyon %1 (load computers and locations from LDAP/AD) - + %1 (ladda datorer och platser från LDAP/AD) %1 (load users and groups from LDAP/AD) - + %1 (ladda användare och grupper från LDAP/AD) Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + Ange en giltig LDAP-url enligt schemat "ldap[s]://[user[:password]@]hostname[:port]" No naming context attribute name given - falling back to configured value. - + Inget namn på attribut i namngivningskontext anges - faller tillbaka till konfigurerat värde. Could not query base DN. Please check your LDAP configuration. - + Kunde inte fråga bas DN. Kontrollera din LDAP-konfiguration. Configuring %1 as base DN and disabling naming context queries. - + Konfigurera %1 som bas-DN och inaktivera frågor om namngivningskontext. Test binding to an LDAP server - + Testa bindning till en LDAP-server The supplied username or password is wrong. Please enter valid credentials or switch to a different authentication method using the Veyon Configurator. - + Det angivna användarnamnet eller lösenordet är fel. Ange giltiga inloggningsuppgifter eller byt till en annan autentiseringsmetod med Veyon Configurator. LDAP bind - + LDAP-bindning LinuxPlatformConfigurationPage Linux - + Linux Custom PAM service for user authentication - + Anpassad PAM-tjänst för autentisering av användare User authentication - + Autentisering av användare User sessions - + Användarsessioner Minimum session lifetime before server start - + Minsta sessionslivslängd före serverstart User login - + Användarinloggning Login key sequence - + Tangentsekvens för inloggning LinuxPlatformPlugin Plugin implementing abstract functions for the Linux platform - + Plugin som implementerar abstrakta funktioner för Linux-plattformen LocationDialog Select location - + Välj plats enter search filter... - + ange sökfilter ... MainToolBar Configuration - + Konfiguration - Disable balloon tooltips - + Show icons only + Visa endast ikoner - Show icons only - + Disable tooltips + Inaktivera verktygstips @@ -3109,19 +3226,19 @@ The public key is used on client computers to authenticate incoming connection r Veyon Configurator - + Veyon konfigurator Service - + Tjänst Master - + Säkerhetsansvarig Access control - + Åtkomstkontroll About Veyon @@ -3129,7 +3246,7 @@ The public key is used on client computers to authenticate incoming connection r Auto - + Auto About @@ -3137,15 +3254,15 @@ The public key is used on client computers to authenticate incoming connection r %1 Configurator %2 - + %1 Konfigurator %2 JSON files (*.json) - + JSON-filer (*.json) The local configuration backend reported that the configuration is not writable! Please run the %1 Configurator with higher privileges. - + Den lokala konfigurationsbackend rapporterade att konfigurationen inte är skrivbar! Kör %1 Configurator med högre behörigheter. Access denied @@ -3153,75 +3270,75 @@ The public key is used on client computers to authenticate incoming connection r According to the local configuration you're not allowed to access computers in the network. Please log in with a different account or let your system administrator check the local configuration. - + Enligt den lokala konfigurationen har du inte åtkomst till datorer i nätverket. Logga in med ett annat konto eller låt din systemadministratör kontrollera den lokala konfigurationen. Screenshots - + Skärmbilder Feature active - + Funktion aktiv The feature "%1" is still active. Please stop it before closing %2. - + Funktionen "%1" är fortfarande aktiv. Vänligen stoppa den innan du stänger %2. Reset configuration - + Återställ konfiguration Do you really want to reset the local configuration and revert all settings to their defaults? - + Vill du verkligen återställa den lokala konfigurationen och återställa alla inställningar till standardvärdena? Search users and computers - + Sök användare och datorer Align computers to grid - + Rikta in datorerna i rutnätet %1 Configurator - + %1 Konfigurator Insufficient privileges - + Otillräckliga privilegier Could not start with administrative privileges. Please make sure a sudo-like program is installed for your desktop environment! The program will be run with normal user privileges. - + Kunde inte starta med administrativa behörigheter. Se till att ett sudo-liknande program är installerat för din skrivbordsmiljö! Programmet kommer att köras med normala användarrättigheter. Only show powered on computers - + Visa endast datorer som är påslagna &Save settings to file - + &Spara inställningar till fil &View - + &Visa &Standard - + Skärm %1$u Standard (%2$u:%3$u) &Advanced - + Avancerat Use custom computer arrangement - + Använd anpassade datorarrangemang Locations && computers - + Platser & & datorer Authentication @@ -3229,86 +3346,102 @@ The public key is used on client computers to authenticate incoming connection r Adjust size of computer icons automatically - + Justera storleken på datorikoner automatiskt Slideshow - + Bildspel Spotlight - + Strålkastare Veyon Master - + Veyon Master Locations & computers - + Platser och datorer + + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + Använd anpassade datorarrangemang. + +Håll nedtryckt för att ladda arrangemanget från en fil eller spara aktuellt arrangemang i en fil. Only show computers with logged on users - + Visa endast datorer med inloggade användare + + + Load computer positions + Ladda datorpositioner + + + Save computer positions + Spara datorpositioner MasterConfigurationPage Directories - + Kataloger User configuration - + Konfiguration av användare Feature on computer double click: - + Funktion på datorn dubbelklicka: Features - + Funktioner All features - + Alla funktioner Disabled features - + Funktioner för funktionshindrade Screenshots - + Skärmbilder <no feature> - + <no feature> Basic settings - + Standardinställningar Behaviour - + Beteende Enforce selected mode for client computers - + Tillämpa valt läge för klientdatorer Hide local computer - + Dölj lokal dator Hide computer filter field - + Dölj datorns filterfält Actions such as rebooting or powering down computers - + Åtgärder som att starta om eller stänga av datorer User interface @@ -3316,240 +3449,332 @@ The public key is used on client computers to authenticate incoming connection r Background color - + Bakgrundsfärg Thumbnail update interval - + Uppdateringsintervall för miniatyrbilder ms - + ms Program start - + Start av program Modes and features - + Modi och funktioner User and computer name - + Användar- och datornamn Only user name + Endast användarnamn + + + Only last part of user name Only computer name - + Endast datorns namn Computer thumbnail caption - + Bildtext för datorns miniatyrbild Text color - + Textfärg Sort order - + Sorteringsordning Computer and user name - + Dator och användarnamn Computer locations - + Datorplatser Show current location only - + Visa endast den aktuella platsen Allow adding hidden locations manually - + Tillåt att lägga till dolda platser manuellt Hide empty locations - + Dölj tomma platser Show confirmation dialog for potentially unsafe actions - + Visa bekräftelsedialog för potentiellt osäkra åtgärder Perform access control - + Utföra åtkomstkontroll Automatically select current location - + Välj automatiskt aktuell plats Automatically open computer select panel - + Öppna automatiskt datorns urvalspanel Use modern user interface (experimental) - + Använd ett modernt användargränssnitt (experimentellt) Thumbnail spacing - + Avstånd mellan miniatyrbilder px - + bildpunkter Hide local session - + Dölj lokal session Auto - + Auto Thumbnail aspect ratio - + Bildförhållande för miniatyrbilder Automatically adjust computer icon size - + Justera automatiskt storleken på datorikonen Open feature windows on the same screen as the main window - + Öppna funktionsfönster på samma skärm som huvudfönstret + + + Configuration templates + Konfigurationsmallar + + + Image quality in monitoring mode + Bildkvalitet i övervakningsläge + + + Highest + Högst + + + High + Hög + + + Medium + Medium + + + Low + Låg + + + Lowest + Lägsta + + + Remote access image quality + Bildkvalitet för fjärråtkomst + + + Advanced + Avancerat + + + Computer name source + Datornamn källa + + + Default + Standard + + + Host address + Värdadress + + + Session client address + Sessionens klientadress + + + Session client name + Sessionens klientnamn + + + Session host name + Sessionens värdnamn + + + Session metadata + Metadata för sessionen + + + Full name of user + Fullständigt namn på användaren + + + User login name + Användarens inloggningsnamn + + + Computer UID role + Dator UID roll + + + Session meta data hash + Hash för sessionens metadata + + + Always expand all locations + Expandera alltid alla platser + + + Image quality + Bildkvalitet MonitoringMode Monitoring - + Monitorering Builtin monitoring mode - + Inbyggt övervakningsläge This mode allows you to monitor all computers at one or more locations. - + I det här läget kan du övervaka alla datorer på en eller flera platser. Query application version of the server - + Fråga efter serverns applikationsversion Query active features - + Fråga efter aktiva funktioner Query properties of remotely available screens - + Fråga efter egenskaper för fjärrtillgängliga skärmar NestedNetworkObjectDirectory All directories - + Alla kataloger NetworkObjectDirectoryConfigurationPage Update interval: - + Uppdateringsintervall: seconds - sekunder + sekunder NetworkObjectDirectoryConfigurationPageTab Enabled - + Aktiverad NetworkObjectTreeModel Locations/Computers - + Platser/Datorer OpenWebsiteDialog Open website - + Öppna webbplats e.g. Veyon - + t.ex. Veyon Remember and add to website menu - + Kom ihåg och lägg till i webbplatsens meny e.g. www.veyon.io - + t.ex. www.veyon.io Please enter the URL of the website to open: - + Ange webbadressen till den webbplats som ska öppnas: Name: - + Namn: Website name - + Webbplats PluginCommands List names of all installed plugins - + Lista namn på alla installerade plugins Show table with details of all installed plugins - + Visa en tabell med information om alla installerade plugins Name - + Namn Description - + Beskrivning Version - + Version UID - + UID Plugin-related CLI operations - + Plugin-relaterade CLI-åtgärder Commands for managing plugins - + Kommandon för hantering av plugins @@ -3560,7 +3785,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power on all computers. This way you do not have to power on each computer by hand. - + Klicka på den här knappen för att slå på alla datorer. På så sätt behöver du inte slå på varje dator för hand. Reboot @@ -3568,7 +3793,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to reboot all computers. - + Klicka på den här knappen för att starta om alla datorer. Power down @@ -3576,85 +3801,87 @@ The public key is used on client computers to authenticate incoming connection r Click this button to power down all computers. This way you do not have to power down each computer by hand. - + Klicka på den här knappen för att stänga av alla datorer. På så sätt behöver du inte stänga av varje dator för hand. Power on/down or reboot a computer - + Slå på/av eller starta om en dator Confirm reboot - + Bekräfta omstart Confirm power down - + Bekräfta avstängning Do you really want to reboot the selected computers? - + Vill du verkligen starta om de utvalda datorerna? Power on a computer via Wake-on-LAN (WOL) - + Slå på en dator via Wake-on-LAN (WOL) MAC ADDRESS - + MAC-ADRESS This command broadcasts a Wake-on-LAN (WOL) packet to the network in order to power on the computer with the given MAC address. - + Detta kommando sänder ett WOL-paket (Wake-on-LAN) till nätverket för att slå på datorn med den angivna MAC-adressen. Please specify the command to display help for! - + Ange det kommando som du vill visa hjälp för! Invalid MAC address specified! - + Ogiltig MAC-adress angiven! Commands for controlling power status of computers - + Kommandon för att kontrollera datorers strömstatus Power down now - + Stäng av strömmen nu Install updates and power down - + Installera uppdateringar och stäng av strömmen Power down after user confirmation - + Avstängning efter användarens bekräftelse Power down after timeout - + Stängs av efter timeout The computer was remotely requested to power down. Do you want to power down the computer now? - + Datorn fick en fjärrstyrd begäran om avstängning. Vill du stänga av datorn nu? The computer will be powered down in %1 minutes, %2 seconds. Please save your work and close all programs. - + Datorn kommer att stängas av om %1 minuter, %2 second. + +Spara ditt arbete och stäng alla program. Do you really want to reboot <b>ALL</b> computers? - + Vill du verkligen starta om <b>ALLA</b> datorer? Do you really want to power down <b>ALL</b> computers? - + Vill du verkligen stänga av <b>ALLA</b> datorer? Do you really want to power down the selected computers? - + Vill du verkligen stänga av de utvalda datorerna? @@ -3665,26 +3892,26 @@ Please save your work and close all programs. Please specify a timeout for powering down the selected computers: - + Ange en tidsgräns för när de valda datorerna ska stängas av: minutes - + minuter seconds - + sekunder RemoteAccessFeaturePlugin Remote view - + Fjärrvisning Open a remote view for a computer without interaction. - + Öppna en fjärrvy för en dator utan interaktion. Remote control @@ -3692,41 +3919,45 @@ Please save your work and close all programs. Open a remote control window for a computer. - + Öppna ett fjärrkontrollfönster för en dator. Remote access - + Fjärråtkomst Remote view or control a computer - + Fjärrvisning eller fjärrstyrning av en dator - Please enter the hostname or IP address of the computer to access: - + Show help about command + Visa hjälp om kommandot - Show help about command - + Exchange clipboard contents + Innehåll i Exchange-klippbord + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Ingen dator har valts så du kan ange ett värdnamn eller en IP-adress för en dator för manuell åtkomst: RemoteAccessPage Remote access: %1 - + Fjärråtkomst: %1 RemoteAccessWidget %1 - %2 Remote Access - + %1 - %2 Fjärråtkomst %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Fjärråtkomst @@ -3741,7 +3972,7 @@ Please save your work and close all programs. Send shortcut - + Genväg för att skicka Fullscreen @@ -3753,35 +3984,35 @@ Please save your work and close all programs. Ctrl+Alt+Del - + Ctrl+Alt+Del Ctrl+Esc - + Ctrl+Esc Alt+Tab - + Alt+Tab Alt+F4 - + Alt+F4 Win+Tab - + Win+Tab Win - + Vinst Menu - + Meny Alt+Ctrl+F1 - + Alt+Ctrl+F1 Connected. @@ -3789,54 +4020,54 @@ Please save your work and close all programs. Screenshot - + Skärmbild Exit - + Avsluta Connecting... - + Ansluter... Select screen - + Välj skärm All screens - + Alla skärmar ScreenLockFeaturePlugin Lock - + Lås Unlock - + Lås upp Lock screen and input devices of a computer - + Låsskärm och inmatningsenheter på en dator To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. - + För att återfå alla användares fulla uppmärksamhet kan du låsa deras datorer med den här knappen. I det här läget är alla inmatningsenheter låsta och skärmarna är mörklagda. Lock input devices - + Lås inmatningsenheter Unlock input devices - + Lås upp inmatningsenheter To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + För att återfå alla användares fulla uppmärksamhet kan du låsa deras datorer med den här knappen. I det här läget är alla inmatningsenheter låsta medan skrivbordet fortfarande är synligt. @@ -3847,52 +4078,52 @@ Please save your work and close all programs. Could not take a screenshot as directory %1 doesn't exist and couldn't be created. - + Det gick inte att ta en skärmdump eftersom katalogen %1 d inte finns och inte kunde skapas. Screenshot - + Skärmbild Could not open screenshot file %1 for writing. - + Det gick inte att öppna skärmdumpfilen %1 f eller skriva. ScreenshotFeaturePlugin Screenshot - + Skärmbild Use this function to take a screenshot of selected computers. - + Använd den här funktionen för att ta en skärmdump av valda datorer. Screenshots taken - + Skärmdumpar tagna Screenshot of %1 computer have been taken successfully. - + Skärmdump av %1 computer har tagits framgångsrikt. Take screenshots of computers and save them locally. - + Ta skärmdumpar av datorer och spara dem lokalt. ScreenshotManagementPage Screenshots - + Skärmbilder ScreenshotManagementPanel All screenshots taken by you are listed here. You can take screenshots by clicking the "Screenshot" item in the context menu of a computer. The screenshots can be managed using the buttons below. - + Här listas alla skärmdumpar som du har tagit. Du kan ta skärmdumpar genom att klicka på objektet "Skärmdump" i snabbmenyn på en dator. Skärmdumparna kan hanteras med hjälp av knapparna nedan. User: @@ -3900,7 +4131,7 @@ Please save your work and close all programs. Computer: - + Dator: Date: @@ -3920,10 +4151,41 @@ Please save your work and close all programs. Screenshot - + Skärmbild Do you really want to delete all selected screenshots? + Vill du verkligen ta bort alla valda skärmdumpar? + + + + ServerAccessControlManager + + Requested authentication method not available + Begärd autentiseringsmetod är inte tillgänglig + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access @@ -3963,23 +4225,23 @@ Please save your work and close all programs. Allow connections from localhost only - + Tillåt endast anslutningar från localhost VNC server - + VNC-server Plugin: - + Tillägg: Restart %1 Service - + Starta om %1-tjänsten All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - + Alla inställningar sparades framgångsrikt. För att de ska träda i kraft måste %1 service startas om. Starta om den nu? Running @@ -3988,35 +4250,36 @@ Please save your work and close all programs. Enabling this option will make the service launch a server process for every interactive session on a computer. Typically this is required to support terminal servers. - + Om du aktiverar det här alternativet kommer tjänsten att starta en serverprocess för varje interaktiv session på en dator. +Detta krävs vanligtvis för att stödja terminalservrar. Show notification on remote connection - + Visa meddelande om fjärranslutning Show notification when an unauthorized access is blocked - + Visa meddelande när en obehörig åtkomst blockeras Maximum session count - + Maximalt antal sessioner Network port numbers - + Portnummer för nätverk Veyon server - + Veyon server Internal VNC server - + Intern VNC-server Feature manager - + Funktionschef Demo server @@ -4024,45 +4287,97 @@ Typically this is required to support terminal servers. Miscellaneous network settings - + Diverse nätverksinställningar Session mode - + Sessionsläge Local session mode (single server instance for primary local session) - + Läge för lokal session (en enda serverinstans för primär lokal session) Active session mode (single server instance for active local or remote session) - + Aktivt sessionsläge (en enda serverinstans för aktiv lokal session eller fjärrsession) Multi session mode (distinct server instance for each local and remote desktop session) - + Multisessionsläge (separat serverinstans för varje lokal skrivbordssession och fjärrskrivbordssession) + + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + Aktivera om en enda Veyon Server-instans ska startas för den aktuella aktiva sessionen, oavsett om den är lokal eller fjärrstyrd. + + + Miscellaneous settings + Övriga inställningar + + + Disable clipboard synchronization + Inaktivera synkronisering av urklipp + + + Session metadata + Metadata för sessionen + + + Content + Innehåll + + + None + Ingen + + + Value of an environment variable + Värde för en miljövariabel + + + Value of a registry key + Värde för en registernyckel + + + Environment variable name: + Namn på miljövariabel: + + + Registry key name: + Namn på registernyckel: + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + Ange eventuellt ett reguljärt uttryck med en capture för att extrahera en del av datornamnet och använda det som datorns visningsnamn. + +Exempel: [^-]*-(pc[0-9]*) [^-]*-(PC[0-9]*) ServiceControl - Starting service %1 + Service control + Servicekontroll + + + Starting %1 - Stopping service %1 + Stopping %1 - Registering service %1 + Restarting %1 - Unregistering service %1 + Registering %1 - Service control + Unregistering %1 @@ -4070,80 +4385,88 @@ Typically this is required to support terminal servers. ServiceControlCommands Register Veyon Service - + Registrera Veyon Service Unregister Veyon Service - + Avregistrera Veyon Service Start Veyon Service - + Starta Veyon Service Stop Veyon Service - + Stoppa Veyon Service Restart Veyon Service - + Starta om Veyon Service Query status of Veyon Service - + Förfrågningsstatus för Veyon Service Service is running - + Tjänsten är igång Service is not running - + Tjänsten är inte igång Configure and control Veyon service - + Konfigurera och kontrollera Veyon-tjänster Commands for configuring and controlling Veyon Service - + Kommandon för att konfigurera och styra Veyon Service ShellCommands Run command file - + Kör kommandofilen File "%1" does not exist! - + Filen "%1" finns inte! Interactive shell and script execution for Veyon CLI - + Interaktiv shell- och skriptexekvering för Veyon CLI Commands for shell functionalities - + Kommandon för shell-funktioner SlideshowPanel Previous - + Föregående Start/pause - + Starta/pausa Next - + Nästa Duration: + Varaktighet: + + + View in separate window + + + + %1 Master – Slideshow @@ -4151,88 +4474,89 @@ Typically this is required to support terminal servers. SpotlightPanel Add selected computers - + Lägg till valda datorer Remove selected computers - + Ta bort valda datorer Update computers in realtime - + Uppdatera datorer i realtid Spotlight - + Strålkastare Please select at least one computer to add. - + Vänligen välj minst en dator att lägga till. Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + Lägg till datorer genom att klicka med den mellersta musknappen eller klicka på den första knappen nedan. +Den andra knappen tar bort den valda eller sista datorn. StartAppDialog Start application - + Starta ansökan Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + Ange de program som ska startas på de valda datorerna. Du kan separera flera program med en rad. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" - + t.ex. "C:\Program Files\VideoLAN\VLC\vlc.exe" Remember and add to application menu - + Kom ihåg och lägg till i applikationsmenyn Application name - + Applikationsnamn Name: - + Namn: e.g. VLC - + t.ex. VLC SystemTrayIcon System tray icon - + Ikon för systemfältet SystemUserGroupsPlugin User groups backend for system user groups - + Användargrupper backend för systemets användargrupper Default (system user groups) - + Standard (systemets användargrupper) TestingCommandLinePlugin Test internal Veyon components and functions - + Testa Veyons interna komponenter och funktioner Commands for testing internal components and functions of Veyon - + Kommandon för att testa interna komponenter och funktioner i Veyon @@ -4243,7 +4567,7 @@ The second button removes the selected or last computer. Please enter your message which send to all selected users. - + Ange ditt meddelande som skickas till alla utvalda användare. @@ -4254,15 +4578,15 @@ The second button removes the selected or last computer. Use this function to send a text message to all users e.g. to assign them new tasks. - + Använd den här funktionen för att skicka ett textmeddelande till alla användare, t.ex. för att tilldela dem nya uppgifter. Message from teacher - + Meddelande från lärare Send a message to a user - + Skicka ett meddelande till en användare @@ -4273,7 +4597,7 @@ The second button removes the selected or last computer. Poll full screen (leave this enabled per default) - + Poll fullskärm (låt detta vara aktiverat som standard) Low accuracy (turbo mode) @@ -4281,41 +4605,30 @@ The second button removes the selected or last computer. Builtin UltraVNC server configuration - + Inbyggd konfiguration av UltraVNC-server Enable multi monitor support - + Aktivera stöd för flera skärmar Enable Desktop Duplication Engine on Windows 8 and newer - + Aktivera Desktop Duplication Engine i Windows 8 och nyare Maximum CPU usage - - - - - UserConfig - - No write access - Ingen skrivåtkomst - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - + Maximal CPU-användning UserLoginDialog User login - + Användarinloggning Please enter a username and password for automatic login on all computers. - + Ange användarnamn och lösenord för automatisk inloggning på alla datorer. Username @@ -4330,131 +4643,142 @@ The second button removes the selected or last computer. UserSessionControlPlugin Log in - + Logga in Click this button to log in a specific user on all computers. - + Klicka på den här knappen för att logga in en viss användare på alla datorer. Log off - + Logga ut Click this button to log off users from all computers. - + Klicka på den här knappen för att logga ut användare från alla datorer. Confirm user logoff - + Bekräfta utloggning av användare Do you really want to log off the selected users? - + Vill du verkligen logga ut de utvalda användarna? User session control - + Kontroll av användarsessioner Do you really want to log off <b>ALL</b> users? - + Vill du verkligen logga ut <b>ALLA</b> användare? VeyonCore [OK] - + Ok [FAIL] - + [FAIL] Invalid command! - + Ogiltigt kommando! Available commands: - + Tillgängliga kommandon: Invalid arguments given - + Ogiltiga argument angivna Not enough arguments given - use "%1 help" for more information - + Inte tillräckligt med argument angivna - använd "%1 help" för mer information Unknown result! - + Okänt resultat! Available modules: - + Tillgängliga moduler: No module specified or module not found - available modules are: - + Ingen modul angiven eller modul hittades inte - tillgängliga moduler är: Plugin not licensed - + Plugin inte licensierat INFO - + INFO ERROR - + FEL USAGE - + Användning DESCRIPTION - + BESKRIVNING EXAMPLES - + Exempel WARNING - + VARNING Authentication test - + Autentiseringstest Screen %1 - + Skärm %1 + + + + VeyonMaster + + No write access + Ingen skrivåtkomst + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Det gick inte att spara dina personliga inställningar! Kontrollera sökvägen till användarkonfigurationsfilen med hjälp av %1 Configurator. VeyonServiceControl Veyon Service - + Veyon Service WindowsPlatformConfiguration Could not change the setting for SAS generation by software. Sending Ctrl+Alt+Del via remote control will not work! - + Det gick inte att ändra inställningen för SAS-generering med programvaran. Att skicka Ctrl+Alt+Del via fjärrkontroll fungerar inte! WindowsPlatformConfigurationPage Windows - + Fönster General @@ -4462,112 +4786,116 @@ The second button removes the selected or last computer. Enable SAS generation by software (Ctrl+Alt+Del) - + Aktivera SAS-generering med programvara (Ctrl+Alt+Del) Screen lock - + Skärmlås Hide taskbar - + Dölj aktivitetsfältet Hide start menu - + Dölj startmenyn Hide desktop - + Dölj skrivbordet User authentication - + Autentisering av användare Use alternative user authentication mechanism - + Använd alternativ mekanism för användarautentisering User login - + Användarinloggning Input start delay - + Fördröjning av start av ingång Simulated key presses interval - + Intervall för simulerade tangenttryckningar Confirm legal notice (message displayed before user logs in) - + Bekräfta juridiskt meddelande (meddelande som visas innan användaren loggar in) Use input device interception driver - + Använd drivrutin för avlyssning av inmatningsenheter + + + Use custom power scheme with disabled power button + Använd ett anpassat strömschema med inaktiverad strömknapp WindowsPlatformPlugin Plugin implementing abstract functions for the Windows platform - + Plugin som implementerar abstrakta funktioner för Windows-plattformen Internal display - + Intern display WindowsServiceControl The service "%1" is already installed. - + Tjänsten "%1" är redan installerad. The service "%1" has been installed successfully. - + Tjänsten "%1" har installerats framgångsrikt. The service "%1" has been uninstalled successfully. - + Tjänsten "%1" har avinstallerats framgångsrikt. Service "%1" could not be found. - + Tjänsten "%1" kunde inte hittas. The service "%1" could not be installed (error %2). - + Tjänsten "%1" kunde inte installeras (fel %2). Could not change the failure actions config for service "%1" (error %2). - + Det gick inte att ändra konfigurationen för felåtgärder för tjänsten "%1" (fel %2). The service "%1" could not be uninstalled (error %2). - + Tjänsten "%1" kunde inte avinstalleras (fel %2). The start type of service "%1" could not be changed (error %2). - + Det gick inte att ändra starttypen för tjänsten "%1" (fel %2). X11VncConfigurationWidget Builtin x11vnc server configuration - + Inbyggd konfiguration av x11vnc-server Custom x11vnc parameters: - + Anpassade x11vnc-parametrar: Do not use X Damage extension - + Använd inte X Damage-tillägget \ No newline at end of file diff --git a/translations/veyon_th.ts b/translations/veyon_th.ts index 4136df4f6..05e90bd58 100644 --- a/translations/veyon_th.ts +++ b/translations/veyon_th.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -135,15 +135,14 @@ If you're interested in translating Veyon into your local or another langua - Missing user groups backend - - - - No default user groups plugin was found. Please check your installation! + Restrict access to members of specific user groups + + + AccessControlProvider - Restrict access to members of specific user groups + Provider for access control features @@ -321,6 +320,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -364,10 +371,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. - - ERROR: Unknown action - ข้อผิดพลาด: การกระทำที่ไม่รู้จัก - Test result ผลการทดสอบ @@ -376,6 +379,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -469,10 +476,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! โปรดเลือกกุญแจที่จะลบก่อน! - - Please enter the name of the user group or role for which to import the authentication key: - - Please select a key to export! กรุณาเลือกกุญแจที่จะส่งออกก่อน! @@ -485,6 +488,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1199,6 +1208,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1216,10 +1229,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 @@ -1269,11 +1278,23 @@ The public key is used on client computers to authenticate incoming connection r - invalid + Hostname: %1 + + + + unknown + ไม่รู้จัก + + + IP address: %1 + + + + Hostname could not be resolved - [none] + No features active @@ -1345,6 +1366,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1403,6 +1436,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1551,6 +1588,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running ลดความเร็วการอัปเดตภาพทัมเนลลงเมื่ออยู่ในโหมดสาธิต + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2177,6 +2222,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2907,6 +2992,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + ms + LdapNetworkObjectDirectoryConfigurationPage @@ -3033,14 +3126,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration - - Disable balloon tooltips - - Show icons only แสดงไอคอนเท่านั้น + + Disable tooltips + + MainWindow @@ -3248,10 +3341,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers สถานที่และคอมพิวเตอร์ + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3343,6 +3450,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name เฉพาะชื่อผู้ใช้ + + Only last part of user name + + Only computer name เฉพาะชื่อคอมพิวเตอร์ @@ -3427,6 +3538,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + โฮสแอดแดรส + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3705,11 +3904,15 @@ Please save your work and close all programs. ดูจากระยะไกลหรือเข้าควบคุมคอมพิวเตอร์ - Please enter the hostname or IP address of the computer to access: + Show help about command - Show help about command + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: @@ -3929,6 +4132,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4044,28 +4278,78 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + ไม่มี + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - กำลังเริ่มเซอร์วิส %1 + Service control + การควบคุมเซอร์วิส - Stopping service %1 - กำลังหยุดเซอร์วิส %1 + Starting %1 + - Registering service %1 - กำลังลงทะเบียนเซอร์วิส %1 + Stopping %1 + - Unregistering service %1 - กำลังถอนการลงทะเบียนเซอร์วิส %1 + Restarting %1 + - Service control - การควบคุมเซอร์วิส + Registering %1 + + + + Unregistering %1 + @@ -4148,6 +4432,14 @@ Typically this is required to support terminal servers. Duration: ระยะเวลา: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4298,17 +4590,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog @@ -4438,6 +4719,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + + VeyonServiceControl @@ -4510,6 +4802,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_tr.ts b/translations/veyon_tr.ts index a421c931e..368a05844 100644 --- a/translations/veyon_tr.ts +++ b/translations/veyon_tr.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -27,7 +27,7 @@ Website: - Web Sitesi: + İnternet Sitesi: Current language not translated yet (or native English). @@ -58,7 +58,7 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v Test - Sına + Test Process access control rules @@ -66,19 +66,19 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v User groups authorized for computer access - Bilgisayar erişimi için yetkili kullanıcı kümeleri + Bilgisayar erişimi için yetkilendirilmiş kullanıcı grupları Please add the groups whose members should be authorized to access computers in your Veyon network. - Veyon ağınızdaki bilgisayarlara erişmeye yetkili olacak kullanıcıları içeren kümeleri ekleyin. + Lütfen Veyon ağınızdaki bilgisayarlara erişim yetkisi verilmesi gereken üyelerin gruplarını ekleyin. Authorized user groups - Yetkili kullanıcı kümeleri + Yetkili kullanıcı grupları All groups - Tüm kümeler + Tüm gruplar Access control rules @@ -110,7 +110,7 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v Please enter a user login name whose access permissions to test: - Sınamak için izinlere erişecek bir kullanıcı giriş adı girin: + Lütfen test etmek için erişim izinlerine sahip bir kullanıcı oturum açma adı girin: Access allowed @@ -130,25 +130,24 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v Enable usage of domain groups - Alan adı kümelerinin kullanımını etkinleştir + Etki alanı gruplarının kullanımını etkinleştir User groups backend: - Kullanıcı kümeleri arka ucu: - - - Missing user groups backend - Eksik kullanıcı kümeleri arka ucu - - - No default user groups plugin was found. Please check your installation! - Öntanımlı kullanıcı kümeleri eklentisi bulunamadı. Lütfen kurulumunuzu gözden geçirin! + Kullanıcı grupları arka ucu: Restrict access to members of specific user groups Giriş yetkisini sadece belirli kullanıcı grup üyeleriyle sınırla + + AccessControlProvider + + Provider for access control features + Erişim denetimi özellikleri sağlayıcısı + + AccessControlRuleEditDialog @@ -217,35 +216,35 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v Accessing computer and local computer - + Bilgisayara ve yerel bilgisayara erişim User being accessed - + Kullanıcıya erişiliyor is logged in locally - + yerel olarak oturum açıldı is logged in remotely - + uzaktan oturum açıldı No user is logged in locally - + Yerel olarak oturum açmış kullanıcı yok One or multiple users are logged in locally - + Bir veya birden fazla kullanıcı yerel olarak oturum açmış durumda No user is logged in remotely - + Uzaktan oturum açmış kullanıcı yok One or multiple users are logged in remotely - + Bir veya birden fazla kullanıcı uzaktan oturum açtı is located at @@ -253,75 +252,83 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v is not located at - + konumda bulunmuyor are located at the same location - + aynı yerde bulunmaktadır are not located the same location - + aynı yerde bulunmuyor is member of group - kümenin üyesidir + grubun üyesidir is not member of group - + grubun üyesi değil is authenticated via - + aracılığıyla doğrulandı is not authenticated via - + aracılığıyla doğrulanmadı has one or more groups in common with user being accessed - + erişilen kullanıcıyla ortak bir veya daha fazla gruba sahip has no groups in common with user being accessed - + erişilen kullanıcıyla ortak hiçbir grup yok equals user being accessed - + erişilen kullanıcıya eşittir is different from user being accessed - + erişilen kullanıcıdan farklıdır is already connected - + zaten bağlı is not connected - + bağlı değil is local computer - + yerel bilgisayar is not local computer - + yerel bilgisayar değil Computer being accessed - + Bilgisayara erişiliyor Session being accessed is a user session - + Erişilen oturum bir kullanıcı oturumudur Session being accessed is a login screen - + Erişilen oturum bir giriş ekranıdır + + + Local computer is already being accessed + Yerel bilgisayara zaten erişiliyor + + + Local computer is not yet being accessed + Yerel bilgisayara henüz erişilemiyor @@ -366,18 +373,18 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v The access in the given scenario needs permission of the logged on user. Verilen senaryodaki erişim, oturum açmış kullanıcının iznini gerektiriyor. - - ERROR: Unknown action - HATA: Bilinmeyen eylem - Test result - Sınama sonuçları + Test sonucu Authentication method Kimlik doğrulama yöntemi + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -461,7 +468,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter the name of the user group or role for which to create an authentication key pair: - Lütfen yetkilendirme anahtarı çifti oluşturulacak kullanıcı kümesinin veya rolün adını girin: + Lütfen kimlik doğrulama anahtar çifti oluşturmak istediğiniz kullanıcı grubu veya rolünün adını girin: Do you really want to delete authentication key "%1/%2"? @@ -471,10 +478,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please select a key to delete! Lütfen silinecek anahtar seçin! - - Please enter the name of the user group or role for which to import the authentication key: - Lütfen içe aktarılacak yetkilendirme anahtarı için kullanıcı kümesinin veya rolün adını girin: - Please select a key to export! Lütfen dışa aktarılacak anahtar seçin! @@ -487,6 +490,14 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please select a key which to set the access group for! Lütfen erişim grubunu ayarlamak için bir anahtar seçin! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + Lütfen kimlik doğrulama anahtarının içe aktarılacağı kullanıcı grubu veya rolünün adını girin. + +Birbirine ait anahtarların isimlerinin tüm bilgisayarlarda aynı olduğundan emin olun. + AuthKeysManager @@ -723,15 +734,15 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please specify the key name (e.g. "teacher/public") as the first argument. - + Lütfen ilk argüman olarak anahtar adını belirtin (örneğin "öğretmen/genel"). Please specify the command to display help for. - + Lütfen yardımın görüntüleneceği komutu belirtin. The specified command does not exist or no help is available for it. - + Belirtilen komut mevcut değil veya bu komut için yardım mevcut değil. @@ -886,7 +897,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Test - Sına + Test @@ -920,7 +931,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Remove selected computer - Seçilen bilgisayarı kaldır + Seçili bilgisayarı kaldır New computer @@ -948,11 +959,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Directory name - + Dizin adı Importing CSV files is possible through the command line interface. For more information, see the <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">online documentation</a>. - + CSV dosyalarının içe aktarılması komut satırı arayüzü aracılığıyla mümkündür. Daha fazla bilgi için <a href="https://docs.veyon.io/en/latest/admin/cli.html#network-object-directory">çevrimiçi belgelere</a> bakın. @@ -1103,11 +1114,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do FORMAT-STRING-WITH-PLACEHOLDERS - + BİÇİMLENDİRME-DİZİSİYLE-YER-TUTUCULAR REGULAR-EXPRESSION-WITH-PLACEHOLDER - + DÜZENLİ-İFADE-YER-TUTUCULU Imports objects from the specified text file using the given format string or regular expression containing one or multiple placeholders. Valid placeholders are: %1 @@ -1151,7 +1162,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do PARENT - VELİ + AİLE Adds an object where %1 can be one of "%2" or "%3". %4 can be specified by name or UUID. @@ -1199,7 +1210,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do The specified command does not exist or no help is available for it. - + Belirtilen komut mevcut değil veya bu komut için yardım mevcut değil. + + + Location "%1" not found. + "%1" konumu bulunamadı. @@ -1218,10 +1233,6 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do ComputerControlListModel - - Host/IP address: %1 - Ana makine/IP adresi: %1 - Active features: %1 Etkin özellikler: %1 @@ -1260,23 +1271,35 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do [no user] - + [kullanıcı yok] Veyon Server unreachable or not running - + Veyon Sunucusuna erişilemiyor veya çalışmıyor Name: %1 - + İsim: %1 - invalid - + Hostname: %1 + Ana bilgisayar adı: %1 - [none] - + unknown + bilinmeyen + + + IP address: %1 + IP adresi: %1 + + + Hostname could not be resolved + Ana bilgisayar adı çözülemedi + + + No features active + Hiçbir özellik etkin değil @@ -1347,6 +1370,18 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Bu bilgisayarın konumu belirlenemedi. Bu, sistem yapılandırmasında bir sorun olduğunu gösterir. Bunun yerine tüm konumlar bilgisayar seçim panelinde gösterilir. + + Logged in since + den beri giriş yapıldı + + + %1 days + %1 gün + + + 1 day + 1 gün + ComputerMonitoring @@ -1405,6 +1440,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not write the computer and users list to %1! Please check the file access permissions. Bilgisayar ve kullanıcı listesi %1 konumuna yazılamadı! Lütfen dosya erişim izinlerini gözden geçirin. + + Search computers + Bilgisayarları ara + ConfigCommands @@ -1434,7 +1473,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Unset (remove) given configuration key - Verilen yapılandırma anahtarını kaldır + Verilen yapılandırma anahtarını kaldır (ayarını kaldır) Upgrade and save configuration of program and plugins @@ -1512,14 +1551,14 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do DemoClient %1 Demo - %1 Tanıtımı + %1 Gösteri DemoConfigurationPage Demo server - Tanıtım sunucusu + Gösteri sunucusu Tunables @@ -1551,22 +1590,30 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Slow down thumbnail updates while demo is running - Demo çalışırken küçük resim güncellemelerini yavaşlatın + Gösteri çalışırken küçük resim güncellemelerini yavaşlatın + + + Bandwidth limit + Bant genişliği sınırı + + + MB/s + MB/s DemoFeaturePlugin Stop demo - Tanıtımı durdur + Gösteriyi durdur Window demo - Pencere kipinde gösterim + Pencere kipinde gösteri Give a demonstration by screen broadcasting - Ekran yayını ile bir tanıtım gerçekleştir + Ekran yayını ile bir gösteri gerçekleştir In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. @@ -1574,55 +1621,55 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Demo - + Gösteri Share your screen or allow a user to share his screen with other users. - + Ekranınızı paylaşın veya bir kullanıcının ekranını diğer kullanıcılarla paylaşmasına izin verin. Full screen demo - + Tam ekran gösterisi Share your own screen in fullscreen mode - + Kendi ekranınızı tam ekran modunda paylaş In this mode your screen is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Bu modda ekranınız tüm bilgisayarlarda tam ekran modunda görüntülenirken kullanıcıların giriş cihazları kilitlidir. Share your own screen in a window - + Kendi ekranınızı bir pencerede paylaş Share selected user's screen in fullscreen mode - + Seçili kullanıcının ekranını tam ekran modunda paylaş In this mode the screen of the selected user is being displayed in full screen mode on all computers while the input devices of the users are locked. - + Bu modda, seçili kullanıcının ekranı tüm bilgisayarlarda tam ekran modunda görüntülenirken, kullanıcıların giriş cihazları kilitlidir. Share selected user's screen in a window - + Seçili kullanıcının ekranını bir pencerede paylaş In this mode the screen of the selected user being displayed in a window on all computers. The users are able to switch to other windows as needed. - + Bu modda seçili kullanıcının ekranı tüm bilgisayarlarda bir pencerede görüntülenir. Kullanıcılar ihtiyaç duyduklarında diğer pencerelere geçebilirler. Please select a user screen to share. - + Lütfen paylaşmak için bir kullanıcı ekranı seçin. Please select only one user screen to share. - + Lütfen paylaşmak için yalnızca bir kullanıcı ekranı seçin. All screens - + Tüm ekranlar @@ -1660,11 +1707,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Predefined websites - Önceden tanımlanmış web siteleri + Önceden tanımlanmış internet siteleri Remove selected website - Seçilen web sitesini kaldır + Seçilen internet sitesini kaldır URL @@ -1672,70 +1719,70 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do New website - Yeni web sitesi + Yeni internet sitesi Applications & websites - + Uygulamalar ve internet siteleri Predefined applications - + Önceden tanımlanmış uygulamalar Add new application - + Yeni uygulama ekle Remove selected application - + Seçili uygulamayı kaldır Add new website - + Yeni internet sitesi ekle New application - + Yeni uygulama DesktopServicesFeaturePlugin Open website - Web sitesi aç + İnternet sitesi aç Click this button to open a website on all computers. - Tüm bilgisayarlarda bir web sitesi açmak için bu düğmeye tıklayın. + Tüm bilgisayarlarda bir internet sitesi açmak için bu düğmeye tıklayın. Open website "%1" - Web sitesini "%1" açın + "%1" internet sitesini aç Custom website - Özel web sitesi + Özel internet sitesi Start application - + Uygulama başlat Click this button to start an application on all computers. - + Bir uygulamayı tüm bilgisayarlarda başlatmak için bu butona tıklayın. Start application "%1" - + "%1" uygulamasını başlat Custom application - + Özel uygulama Start apps and open websites in user sessions - + Kullanıcı oturumlarında uygulamaları başlatın ve internet sitelerini açın @@ -1754,7 +1801,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Custom website - Özel web sitesi + Özel internet sitesi Open file manager @@ -1782,7 +1829,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Custom application - + Özel uygulama @@ -1811,31 +1858,31 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do FeatureCommands List names of all available features - + Mevcut tüm özelliklerin adlarını listeleyin Show table with details of all available features - + Tüm mevcut özelliklerin ayrıntılarını içeren tabloyu göster Start a feature on a remote host - + Uzak bir ana bilgisayarda bir özelliği başlatın Stop a feature on a remote host - + Uzak bir ana bilgisayarda bir özelliği durdurun Please specify the command to display help for. - + Lütfen yardımın görüntüleneceği komutu belirtin. Displays a list with the names of all available features. - + Mevcut tüm özelliklerin adlarını içeren bir liste görüntüler. Displays a table with detailed information about all available features. This information include a description, the UID, the name of the plugin providing the respective feature and some other implementation-related details. - + Mevcut tüm özellikler hakkında ayrıntılı bilgi içeren bir tablo görüntüler. Bu bilgiler bir açıklama, UID, ilgili özelliği sağlayan eklentinin adı ve diğer bazı uygulamayla ilgili ayrıntıları içerir. HOST ADDRESS @@ -1843,43 +1890,43 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do FEATURE - + ÖZELLİK ARGUMENTS - + ARGÜMANLAR Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information - + Belirtilen özelliği belirtilen ana bilgisayarda uzaktan çalışan Veyon Sunucusuna bağlanarak başlatır. Özellik, ad veya UID ile belirtilebilir. Tüm kullanılabilir özellikleri görmek için ``show`` komutunu kullanın. Özelliğe bağlı olarak, tek bir JSON dizesi olarak kodlanmış ek argümanlar (görüntülenecek metin mesajı gibi) belirtilmelidir. Daha fazla bilgi için lütfen geliştirici belgelerine bakın Lock the screen - + Ekranı kilitle Display a text message - + Bir metin mesajı görüntüle Test message - + Test mesajı Start an application - + Bir uygulamayı başlat Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. - + Uzaktan çalışan Veyon Sunucusuna bağlanarak belirtilen ana bilgisayarda belirtilen özelliği durdurur. Özellik ad veya UID ile belirtilebilir. Kullanılabilir tüm özellikleri görmek için ``show`` komutunu kullanın. Unlock the screen - + Ekranın kilidini aç The specified command does not exist or no help is available for it. - + Belirtilen komut mevcut değil veya bu komut için yardım mevcut değil. Name @@ -1899,7 +1946,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Worker - + Çalışan UID @@ -1907,35 +1954,35 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Plugin - + Eklenti Invalid feature name or UID specified - + Geçersiz özellik adı veya UID belirtildi Error parsing the JSON-encoded arguments: %1 - + JSON kodlu argümanları ayrıştırırken hata oluştu: %1 Failed to initialize credentials - + Kimlik bilgileri başlatılamadı Could not establish a connection to host %1 - + %1 ana makinesine bağlantı kurulamadı Failed to send feature control message to host %1 - + Özellik kontrol mesajı %1 ana bilgisayarına gönderilemedi Feature-related CLI operations - + Özellik ile ilgili CLI işlemleri Commands for controlling features - + Özellikleri kontrol etmek için komutlar @@ -1950,11 +1997,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Destination directory - + Hedef dizin Default source directory - + Varsayılan kaynak dizini Options @@ -1962,11 +2009,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Remember last source directory - + Son kaynak dizinini hatırla Create destination directory if it does not exist - + Hedef dizin yoksa oluşturun @@ -1992,7 +2039,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Transfer and open file(s) with associated program - İlişkili programla dosya aktarma ve açma + İlgili programla dosya(ları) aktarın ve açın Transfer and open destination folder @@ -2157,15 +2204,15 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do TLS configuration - + TLS yapılandırması Use certificate authority for TLS connections - + TLS bağlantıları için sertifika yetkilisini kullan CA certificate file - + CA sertifika dosyası ... @@ -2173,18 +2220,58 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Host certificate file - + Ana bilgisayar sertifika dosyası Host private key file - + Özel anahtar dosyasını barındır + + + Style: + Stil: + + + Native + Yerel + + + Color scheme: + Renk şeması: + + + Light + Aydınlık + + + Dark + Karanlık + + + User groups + Kullanıcı grupları + + + Backend: + Arka uç: + + + Include user groups from domain + Etki alanından kullanıcı gruplarını dahil et + + + Missing user groups backend + Eksik kullanıcı grupları arka ucu + + + No user groups plugin was found. Please check your installation! + Hiçbir kullanıcı grubu eklentisi bulunamadı. Lütfen kurulumunuzu kontrol edin! HeadlessVncServer Headless VNC server - + Başlıksız VNC sunucusu @@ -2237,7 +2324,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do LDAP base DN test failed - LDAP temel DN sınaması başarısız + LDAP tabanlı DN testi başarısız oldu Could not query the configured base DN. Please check the base DN parameter. @@ -2249,27 +2336,31 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do LDAP base DN test successful - LDAP temel DN sınaması başarılı + LDAP tabanlı DN testi başarılı The LDAP base DN has been queried successfully. The following entries were found: %1 - + LDAP temel DN'si başarıyla sorgulandı. Aşağıdaki girdiler bulundu:: + +%1 LDAP naming context test failed - LDAP adlandırma bağlamı sınaması başarısız + LDAP adlandırma bağlamı testi başarısız oldu Could not query the base DN via naming contexts. Please check the naming context attribute parameter. %1 - + Adlandırma bağlamları aracılığıyla temel DN sorgulanamadı. Lütfen adlandırma bağlamı öznitelik parametresini kontrol edin. + +%1 LDAP naming context test successful - LDAP adlandırma bağlamı sınaması başarılı + LDAP adlandırma bağlamı testi başarılı The LDAP naming context has been queried successfully. The following base DN was found: @@ -2287,11 +2378,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do group tree - küme ağacı + grup ağacı Group tree - Küme ağacı + Grup ağacı computer tree @@ -2303,11 +2394,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do computer group tree - bilgisayar kümesi ağacı + bilgisayar grup ağacı Computer group tree - Bilgisayar kümesi ağacı + Bilgisayar grup ağacı user objects @@ -2319,19 +2410,19 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do group members - küme üyeleri + grup üyeleri Group member attribute - Küme üyesi özniteliği + Grup üyesi özniteliği Group not found - Küme bulunamadı + Grup bulunamadı Could not find a group with the name "%1". Please check the group name or the group tree parameter. - "%1" adlı bir küme bulunamadı.. Lütfen küme adını veya küme ağacı parametresini gözden geçirin. + "%1" adında bir grup bulunamadı. Lütfen grup adını veya grup ağacı parametresini kontrol edin. computer objects @@ -2347,11 +2438,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. - + Bilgisayar ana bilgisayar adlarını tam nitelikli etki alanı adları (FQDN) olarak depolanacak şekilde yapılandırdınız ancak etki alanı olmayan bir ana bilgisayar adı girdiniz. You configured computer hostnames to be stored as simple hostnames without a domain name but entered a hostname with a domain name part. - + Bilgisayar ana bilgisayar adlarını, etki alanı adı olmadan basit ana bilgisayar adları olarak depolanacak şekilde yapılandırdınız ancak etki alanı adı kısmı olan bir ana bilgisayar adı girdiniz. Computer hostname attribute @@ -2383,7 +2474,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do user groups - kullanıcı kümeleri + kullanıcı grupları computers @@ -2391,7 +2482,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do computer groups - bilgisayar kümeleri + bilgisayar grupları computer containers @@ -2399,7 +2490,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do groups of user - kullanıcı kümeleri + kullanıcı grupları User not found @@ -2407,11 +2498,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not find a user with the name "%1". Please check the username or the user tree parameter. - + "%1" adlı bir kullanıcı bulunamadı. Lütfen kullanıcı adını veya kullanıcı ağacı parametresini kontrol edin. groups of computer - bilgisayar kümeleri + bilgisayar grupları Computer not found @@ -2419,7 +2510,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not find a computer with the hostname "%1". Please check the hostname or the computer tree parameter. - + "%1" ana bilgisayar adına sahip bir bilgisayar bulunamadı. Lütfen ana bilgisayar adını veya bilgisayar ağacı parametresini kontrol edin. Hostname lookup failed @@ -2427,7 +2518,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not lookup hostname for IP address %1. Please check your DNS server settings. - + IP adresi %1 için ana bilgisayar adı bulunamadı. Lütfen DNS sunucu ayarlarınızı kontrol edin. location entries @@ -2443,7 +2534,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Filter for computer groups - Bilgisayar kümeleri için süzme + Bilgisayar grupları için filtre Invalid test value @@ -2455,17 +2546,19 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do LDAP %1 test failed - LDAP %1 sınaması başarısız + LDAP %1 testi başarısız oldu Could not query any entries in configured %1. Please check the parameter "%2". %3 - + Yapılandırılan %1'deki hiçbir girdi sorgulanamadı. Lütfen "%2" parametresini kontrol edin. + +%3 LDAP %1 test successful - LDAP %1 sınaması başarılı + LDAP %1 testi başarılı The %1 has been queried successfully and %2 entries were found. @@ -2479,7 +2572,9 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Could not query any %1. Please check the parameter(s) %2 and enter the name of an existing object. %3 - + %1 sorgulanamadı. Lütfen %2 parametresini(lerini) kontrol edin ve var olan bir nesnenin adını girin. + +%3 and @@ -2499,27 +2594,27 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do LDAP filter test failed - LDAP süzgeç sınaması başarısız + LDAP filtre testi başarısız oldu Could not query any %1 using the configured filter. Please check the LDAP filter for %1. %2 - Yapılandırılmış süzgeç kullanılarak herhangi bir %1 sorgulanamadı. Lütfen %1 için LDAP süzgecini denetleyin. + Yapılandırılmış filtre kullanılarak herhangi bir %1 sorgulanamadı. Lütfen %1 için LDAP filtresini kontrol edin. %2 LDAP filter test successful - LDAP süzgeç sınaması başarılı + LDAP filtre testi başarılı %1 %2 have been queried successfully using the configured filter. - Yapılandırılmış süzgeç kullanılarak %1 %2 başarıyla sorgulandı. + %1 %2 yapılandırılmış filtre kullanılarak başarıyla sorgulandı. LDAP directory - + LDAP dizini @@ -2586,7 +2681,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do e.g. OU=Groups - örn. OU=Kümeler + örn. OU=Gruplar User tree @@ -2602,7 +2697,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Group tree - Küme ağacı + Grup ağacı Perform recursive search operations in object trees @@ -2630,7 +2725,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Group member attribute - Küme üyesi özniteliği + Grup üyesi özniteliği e.g. uid or sAMAccountName @@ -2642,23 +2737,23 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Optional object filters - İsteğe bağlı nesne süzgeçleri + İsteğe bağlı nesne filtreleri Filter for user groups - Kullanıcı kümeleri için süzgeç + Kullanıcı grupları için filtre Filter for users - Kullanıcılar için süzme + Kullanıcılar için filtre Filter for computer groups - Bilgisayar kümeleri için süzme + Bilgisayar grupları için filtre Group member identification - Küme üyesi kimliği + Grup üye tanımlaması Distinguished name (Samba/AD) @@ -2666,11 +2761,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do List all groups of a user - Kullanıcının tüm kümelerini listele + Bir kullanıcının tüm gruplarını listele List all groups of a computer - Bilgisayarın tüm kümelerini listele + Bir bilgisayarın tüm gruplarını listele Get computer object by IP address @@ -2686,11 +2781,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Enter group name - Küme adı gir + Grup adını girin Please enter a group name whose members to query: - Üyeleri sorgulanacak küme adını girin: + Lütfen üyelerini sorgulamak istediğiniz grubun adını girin: Enter computer name @@ -2706,7 +2801,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter a user login name whose group memberships to query: - Küme üyelikleri sorgulanacak kullanıcı giriş adı girin: + Lütfen sorgulanacak grup üyeliklerinin kullanıcı adını girin: Enter computer IP address @@ -2718,11 +2813,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do (only if different from group tree) - (eğer yalnızca küme ağacından farklıysa) + (sadece grup ağacından farklıysa) Computer group tree - Bilgisayar kümesi ağacı + Bilgisayar grubu ağacı Filter for computers @@ -2734,11 +2829,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Integration tests - Tümleştirme sınamaları + Entegrasyon testleri Computer groups - Bilgisayar kümeleri + Bilgisayar grupları e.g. name or description @@ -2750,7 +2845,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Computer containers or OUs - + Bilgisayar konteynerleri veya OU'lar Connection security @@ -2790,7 +2885,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do e.g. (objectClass=group) - örnek: (nesneSınıfı=grup) + ör. (objectClass=grup) e.g. (objectClass=person) @@ -2798,11 +2893,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do e.g. (objectClass=room) or (objectClass=computerLab) - + ör. (objectClass=room) VEYA (objectClass=computerLab) e.g. (objectClass=container) or (objectClass=organizationalUnit) - + ör. (objectClass=container) veya (objectClass=organizationalUnit) Certificate files (*.pem) @@ -2826,7 +2921,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do e.g. cn or displayName - + ör. cn veya ekranAdı Computer locations identification @@ -2838,7 +2933,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Location attribute in computer objects - + Bilgisayar nesnelerindeki konum niteliği List all entries of a location @@ -2862,7 +2957,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter the name of a computer location (wildcards allowed): - + Lütfen bilgisayar konumunun adını girin (joker karakterlere izin verilir): Enter location name @@ -2870,7 +2965,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter the name of a location whose entries to query: - + Lütfen sorgulanacak girişlerin bulunduğu konumun adını girin: Browse @@ -2878,11 +2973,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Test - Sına + Test Hostnames stored as fully qualified domain names (FQDN, e.g. myhost.example.org) - + Tam nitelikli alan adları (FQDN, örn. myhost.example.org) olarak depolanan ana bilgisayar adları Computer hostname attribute @@ -2890,7 +2985,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter a computer hostname to query: - + Lütfen sorgulanacak bir bilgisayar adı girin: Enter hostname @@ -2898,7 +2993,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter a computer hostname whose group memberships to query: - + Lütfen sorgulanacak grup üyeliklerinin bulunduğu bilgisayarın adını girin: User login name attribute @@ -2906,19 +3001,27 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Configured attribute for user login name or computer hostname (OpenLDAP) - + Kullanıcı oturum açma adı veya bilgisayar ana bilgisayar adı için yapılandırılmış öznitelik (OpenLDAP) Directory name - + Dizin adı Query options - + Sorgu seçenekleri Query nested user groups (supported by AD only) - + İç içe geçmiş kullanıcı gruplarını sorgula (yalnızca AD tarafından desteklenir) + + + Query timeout + Sorgu zaman aşımı + + + ms + ms @@ -2929,7 +3032,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please use the global LDAP configuration page to configure how to retrieve locations and computers from your LDAP-based directory service. - + Konumları ve bilgisayarları LDAP tabanlı dizin hizmetinizden nasıl alacağınızı yapılandırmak için lütfen genel LDAP yapılandırma sayfasını kullanın. @@ -2948,35 +3051,35 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Commands for configuring and testing LDAP/AD integration - LDAP/AD tümelemesini yapılandırmak ve sınamak için komutlar + LDAP/AD entegrasyonunu yapılandırma ve test etme komutları Basic LDAP/AD support for Veyon - + Veyon için temel LDAP/AD desteği %1 (load computers and locations from LDAP/AD) - + %1 (LDAP/AD'den bilgisayarlar ve konumlar yükleme) %1 (load users and groups from LDAP/AD) - + %1 (LDAP/AD'den kullanıcıları ve grupları yükleme) Please specify a valid LDAP url following the schema "ldap[s]://[user[:password]@]hostname[:port]" - + Lütfen şemayı takip eden geçerli bir LDAP URL'si belirtin"ldap[s]://[user[:password]@]hostname[:port]" No naming context attribute name given - falling back to configured value. - + Adlandırma bağlamı özniteliği adı verilmedi - yapılandırılmış değere geri dönülüyor. Could not query base DN. Please check your LDAP configuration. - + Temel DN sorgulanamadı. Lütfen LDAP yapılandırmanızı kontrol edin. Configuring %1 as base DN and disabling naming context queries. - + %1'i temel DN olarak yapılandırıyor ve adlandırma bağlamı sorgularını devre dışı bırakıyor. Test binding to an LDAP server @@ -3007,11 +3110,11 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do User sessions - + Kullanıcı oturumları Minimum session lifetime before server start - + Sunucu başlamadan önceki minimum oturum ömrü User login @@ -3019,7 +3122,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Login key sequence - + Oturum açma anahtarı dizisi @@ -3037,7 +3140,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do enter search filter... - arama süzgeci gir... + arama filtresine girin... @@ -3046,14 +3149,14 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Configuration Yapılandırma - - Disable balloon tooltips - Balon iouçlarını devre dışı bırak - Show icons only Yalnızca simgeleri göster + + Disable tooltips + Araç ipuçlarını devre dışı bırak + MainWindow @@ -3131,7 +3234,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Master - Usta + Master Access control @@ -3243,15 +3346,15 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Adjust size of computer icons automatically - + Bilgisayar simgelerinin boyutunu otomatik olarak ayarla Slideshow - + Slayt gösterisi Spotlight - + Spot ışığı Veyon Master @@ -3261,9 +3364,25 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Locations & computers Konumlar ve bilgisayarlar + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + Özel bilgisayar düzenlemesini kullanın. + +Düzenlemeyi bir dosyadan yüklemek veya mevcut düzenlemeyi bir dosyaya kaydetmek için basılı tutun. + Only show computers with logged on users - + Yalnızca oturum açmış kullanıcıların olduğu bilgisayarları göster + + + Load computer positions + Bilgisayar pozisyonlarını yükle + + + Save computer positions + Bilgisayar pozisyonlarını kaydet @@ -3318,7 +3437,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Hide computer filter field - Bilgisayar süzme alanını gizle + Bilgisayar filtre alanını gizle Actions such as rebooting or powering down computers @@ -3356,6 +3475,10 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Only user name Yalnızca kullanıcı adı + + Only last part of user name + + Only computer name Yalnızca bilgisayar adı @@ -3414,15 +3537,15 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Thumbnail spacing - + Küçük resim aralığı px - + px Hide local session - + Yerel oturumu gizle Auto @@ -3430,15 +3553,103 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Thumbnail aspect ratio - + Küçük resim en boy oranı Automatically adjust computer icon size - + Bilgisayar simgesi boyutunu otomatik olarak ayarla Open feature windows on the same screen as the main window - + Özellik pencerelerini ana pencereyle aynı ekranda açın + + + Configuration templates + Yapılandırma şablonları + + + Image quality in monitoring mode + İzleme modunda görüntü kalitesi + + + Highest + En yüksek + + + High + Yüksek + + + Medium + Orta + + + Low + Düşük + + + Lowest + En düşük + + + Remote access image quality + Uzaktan erişim görüntü kalitesi + + + Advanced + Gelişmiş + + + Computer name source + Bilgisayar adı kaynağı + + + Default + Varsayılan + + + Host address + Host adresi + + + Session client address + Oturum istemci adresi + + + Session client name + Oturum istemci adı + + + Session host name + Oturum ana bilgisayar adı + + + Session metadata + Oturum meta verileri + + + Full name of user + Kullanıcının tam adı + + + User login name + Kullanıcı oturum açma adı + + + Computer UID role + Bilgisayar UID rolü + + + Session meta data hash + Oturum meta verileri karma değeri + + + Always expand all locations + Her zaman tüm konumları genişlet + + + Image quality + Görüntü kalitesi @@ -3457,22 +3668,22 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Query application version of the server - + Sunucunun uygulama sürümünü sorgula Query active features - + Etkin özellikleri sorgula Query properties of remotely available screens - + Uzaktan erişilebilen ekranların sorgu özellikleri NestedNetworkObjectDirectory All directories - + Tüm dizinler @@ -3504,7 +3715,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do OpenWebsiteDialog Open website - Web sitesi aç + İnternet sitesi aç e.g. Veyon @@ -3512,7 +3723,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Remember and add to website menu - Unutmayın ve web sitesi menüsüne ekleyin + Hatırla ve internet sitesi menüsüne ekle e.g. www.veyon.io @@ -3520,7 +3731,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Please enter the URL of the website to open: - Lütfen açılacak web sitesinin URL'sini girin: + Lütfen açılacak internet sitesinin URL'sini girin: Name: @@ -3528,7 +3739,7 @@ Genel anahtar, istemci bilgisayarlarda gelen bağlantı isteğinin kimliğini do Website name - + İnternet sitesi adı @@ -3662,15 +3873,15 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. Do you really want to reboot <b>ALL</b> computers? - + Gerçekten <b>TÜM</b> bilgisayarları yeniden başlatmak istiyor musunuz? Do you really want to power down <b>ALL</b> computers? - + Gerçekten <b>TÜM</b> bilgisayarları kapatmak istiyor musunuz? Do you really want to power down the selected computers? - + Seçili bilgisayarların gerçekten kapanmasını istiyor musunuz? @@ -3718,14 +3929,18 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın.Remote view or control a computer Bilgisayarı uzaktan görüntüle veya denetle - - Please enter the hostname or IP address of the computer to access: - Bilgisayara erişim için lütfen bir ana makine adı veya IP adresi giriniz: - Show help about command Komut hakkında bilgi göster + + Exchange clipboard contents + Panodaki içerikleri değiştir + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Hiçbir bilgisayar seçilmediğinden manuel erişim için bir bilgisayarın ana bilgisayar adını veya IP adresini girebilirsiniz: + RemoteAccessPage @@ -3742,7 +3957,7 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. %1 - %2 - %3 Remote Access - + %1 - %2 - %3 Uzaktan Erişim @@ -3813,15 +4028,15 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. Connecting... - + Bağlanıyor... Select screen - + Ekran seç All screens - + Tüm ekranlar @@ -3844,15 +4059,15 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. Lock input devices - + Giriş aygıtlarını kilitle Unlock input devices - + Giriş aygıtlarının kilidini aç To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked while the desktop is still visible. - + Tüm kullanıcıların tüm dikkatini geri kazanmak için bu düğmeyi kullanarak bilgisayarlarını kilitleyebilirsiniz. Bu modda masaüstü hala görünürken tüm giriş aygıtları kilitlenir. @@ -3940,7 +4155,38 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. Do you really want to delete all selected screenshots? - + Seçili tüm ekran görüntülerini gerçekten silmek istiyor musunuz? + + + + ServerAccessControlManager + + Requested authentication method not available + İstenen kimlik doğrulama yöntemi mevcut değil + + + Access allowed by rule "%1" + "%1" kuralı tarafından erişime izin verildi + + + Access denied by rule "%1" + Erişim "%1" kuralı tarafından engellendi + + + No rule allowed access + Hiçbir kurala erişime izin verilmiyor + + + Accessing user not member of an authorized user group + Yetkili bir kullanıcı grubunun üyesi olmayan kullanıcıya erişim + + + User has denied access + Kullanıcının erişimi engellendi + + + User confirmed access + Kullanıcı erişimi onayladı @@ -4017,70 +4263,122 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir. Maximum session count - + Maksimum oturum sayısı Network port numbers - + Ağ bağlantı noktası numaraları Veyon server - + Veyon sunucusu Internal VNC server - + Dahili VNC sunucusu Feature manager - + Özellik yöneticisi Demo server - Tanıtım sunucusu + Gösteri sunucusu Miscellaneous network settings - + Çeşitli ağ ayarları Session mode - + Oturum modu Local session mode (single server instance for primary local session) - + Yerel oturum modu (birincil yerel oturum için tek sunucu örneği) Active session mode (single server instance for active local or remote session) - + Etkin oturum modu (etkin yerel veya uzak oturum için tek sunucu örneği) Multi session mode (distinct server instance for each local and remote desktop session) - + Çoklu oturum modu (her yerel ve uzak masaüstü oturumu için ayrı sunucu örneği) + + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + Yerel veya uzak olması fark etmeksizin, geçerli etkin oturum için tek bir Veyon Sunucu örneğinin başlatılması gerekiyorsa etkinleştirin. + + + Miscellaneous settings + Çeşitli ayarlar + + + Disable clipboard synchronization + Pano senkronizasyonunu devre dışı bırak + + + Session metadata + Oturum meta verileri + + + Content + İçerik + + + None + Yok + + + Value of an environment variable + Bir ortam değişkeninin değeri + + + Value of a registry key + Bir kayıt defteri anahtarının değeri + + + Environment variable name: + Ortam değişkeni adı: + + + Registry key name: + Kayıt anahtarı adı: + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + İsteğe bağlı olarak, bilgisayar adının bir kısmını çıkarmak ve bunu bilgisayar için görüntü adı olarak kullanmak üzere bir yakalama içeren düzenli bir ifade girin. + +Örnek: [^-]*-(PC[0-9]*) ServiceControl - Starting service %1 - Hizmet başlatılıyor %1 + Service control + Hizmet kontrolü - Stopping service %1 - Hizmet durduruluyor %1 + Starting %1 + %1 başlatılıyor - Registering service %1 - Hizmet kaydediliyor %1 + Stopping %1 + %1 durduruluyor - Unregistering service %1 - Hizmet kaydedilimiyor %1 + Restarting %1 + %1 tekrar başlatılıyor - Service control - Hizmet kontrolü + Registering %1 + %1 kayıt oluyor + + + Unregistering %1 + %1 kaydı siliniyor @@ -4138,7 +4436,7 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir. Interactive shell and script execution for Veyon CLI - + Veyon CLI için etkileşimli kabuk ve betik yürütme Commands for shell functionalities @@ -4149,18 +4447,26 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.SlideshowPanel Previous - + Önceki Start/pause - + Başlat/duraklat Next - + Sonraki Duration: + Süre: + + + View in separate window + + + + %1 Master – Slideshow @@ -4168,39 +4474,40 @@ Bu genellikle terminal sunucularını desteklemek için gereklidir.SpotlightPanel Add selected computers - + Seçili bilgisayarları ekle Remove selected computers - + Seçili bilgisayarları kaldır Update computers in realtime - + Bilgisayarları gerçek zamanlı olarak güncelle Spotlight - + Spot ışığı Please select at least one computer to add. - + Lütfen eklemek için en az bir bilgisayar seçin. Add computers by clicking with the middle mouse button or clicking the first button below. The second button removes the selected or last computer. - + Orta fare düğmesine tıklayarak veya alttaki ilk düğmeye tıklayarak bilgisayar ekleyin. +İkinci buton seçili veya son bilgisayarı kaldırır. StartAppDialog Start application - + Uygulama başlat Please enter the applications to start on the selected computers. You can separate multiple applications by line. - + Lütfen seçili bilgisayarlarda başlatılacak uygulamaları girin. Birden fazla uygulamayı satırla ayırabilirsiniz. e.g. "C:\Program Files\VideoLAN\VLC\vlc.exe" @@ -4208,11 +4515,11 @@ The second button removes the selected or last computer. Remember and add to application menu - + Hatırla ve uygulama menüsüne ekle Application name - + Uygulama adı Name: @@ -4260,7 +4567,7 @@ The second button removes the selected or last computer. Please enter your message which send to all selected users. - + Lütfen seçili tüm kullanıcılara gönderilecek mesajınızı girin. @@ -4310,18 +4617,7 @@ The second button removes the selected or last computer. Maximum CPU usage - - - - - UserConfig - - No write access - Erişim izni yok - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Kişisel ayarlarınız kaydedilemedi! Lütfen kullanıcı yapılandırma dosyasının yolunu, %1 Yapılandırıcıyı kullanarak gözden geçirin. + Maksimum işlemci kullanımı @@ -4375,7 +4671,7 @@ The second button removes the selected or last computer. Do you really want to log off <b>ALL</b> users? - + Gerçekten <b>TÜM</b> kullanıcıların oturumunu kapatmak istiyor musunuz? @@ -4450,7 +4746,18 @@ The second button removes the selected or last computer. Screen %1 - + Ekran %1 + + + + VeyonMaster + + No write access + Erişim izni yok + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Kişisel ayarlarınız kaydedilemedi! Lütfen kullanıcı yapılandırma dosyasının yolunu, %1 Yapılandırıcıyı kullanarak gözden geçirin. @@ -4471,7 +4778,7 @@ The second button removes the selected or last computer. WindowsPlatformConfigurationPage Windows - Pencereler + Windows General @@ -4525,6 +4832,10 @@ The second button removes the selected or last computer. Use input device interception driver Girdi cihazı müdahale sürücüsü kullan + + Use custom power scheme with disabled power button + Güç düğmesi devre dışıyken özel güç şemasını kullan + WindowsPlatformPlugin @@ -4534,7 +4845,7 @@ The second button removes the selected or last computer. Internal display - + Dahili ekran @@ -4557,19 +4868,19 @@ The second button removes the selected or last computer. The service "%1" could not be installed (error %2). - + "%1" hizmeti yüklenemedi (hata %2). Could not change the failure actions config for service "%1" (error %2). - + "%1" hizmeti için hata eylemleri yapılandırması değiştirilemedi (hata %2). The service "%1" could not be uninstalled (error %2). - + "%1" hizmeti kaldırılamadı (hata %2). The start type of service "%1" could not be changed (error %2). - + "%1" hizmetinin başlangıç ​​türü değiştirilemedi (hata %2). diff --git a/translations/veyon_uk.ts b/translations/veyon_uk.ts index e237c7681..4c00779b5 100644 --- a/translations/veyon_uk.ts +++ b/translations/veyon_uk.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: Модуль груп користувачів: - - Missing user groups backend - Не вистачає модуля обробки груп користувачів - - - No default user groups plugin was found. Please check your installation! - Не знайдено типового додатка груп користувачів. Будь ласка, перевірте, чи належним чином встановлено програму! - Restrict access to members of specific user groups Обмежити доступ учасникам вказаних груп користувачів + + AccessControlProvider + + Provider for access control features + Надавач можливостей керування доступом + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen Сеанс доступу є вікном вітання + + Local computer is already being accessed + Доступ до локального комп'ютера вже здійснюється + + + Local computer is not yet being accessed + Доступ до локального комп'ютера ще не здійснюється + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Доступ за вказаним сценарієм потребує дозволу від користувача, який увійшов до системи. - - ERROR: Unknown action - ПОМИЛКА: невідома дія - Test result Результат тестування @@ -378,6 +381,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method Метод розпізнавання + + There is no matching rule with a valid action. The access is therefore denied. + Немає відповідного правила із коректною дією. Через це у доступі відмовлено. + AuthKeysConfigurationWidget @@ -468,10 +475,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! Будь ласка, виберіть ключ для вилучення! - - Please enter the name of the user group or role for which to import the authentication key: - Будь ласка, вкажіть назву групи користувачів або роль, для якої слід імпортувати ключ розпізнавання: - Please select a key to export! Будь ласка, виберіть ключ для експортування! @@ -484,6 +487,14 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! Будь ласка, виберіть ключ, доступ до якого слід встановити для групи! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + Будь ласка, вкажіть назву групи користувачів або роль, для якої слід імпортувати ключ розпізнавання. + +Переконайтеся, що назви ключів, пов'язаних один із одним, є однаковими на усіх комп'ютерах. + AuthKeysManager @@ -1198,6 +1209,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. Вказаної команди не існує або немає доступу до довідки до неї. + + Location "%1" not found. + Місце «%1» не знайдено. + BuiltinUltraVncServer @@ -1215,10 +1230,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - Вузол/IP-адреса: %1 - Active features: %1 Задіяні можливості: %1 @@ -1268,12 +1279,24 @@ The public key is used on client computers to authenticate incoming connection r Назва: %1 - invalid - некоректний + Hostname: %1 + Назва вузла: %1 + + + unknown + невідомий + + + IP address: %1 + IP-адреса: %1 - [none] - [немає] + Hostname could not be resolved + Не вдалося визначити адресу за назвою вузла + + + No features active + Немає активних можливостей @@ -1344,6 +1367,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. Не вдалося визначити місце цього комп'ютера. Це означає, що у налаштуваннях системи є проблеми. На панелі вибору комп'ютера буде показано усі місця. + + Logged in since + Працює у системі протягом + + + %1 days + %1 днів + + + 1 day + 1 дня + ComputerMonitoring @@ -1402,6 +1437,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. Не вдалося записати список комп’ютерів і користувачів до %1! Будь ласка, перевірте, чи є у вас належні права для доступу до цього файла. + + Search computers + Шукати комп'ютери + ConfigCommands @@ -1550,6 +1589,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running Уповільнити оновлення мініатюр, доки запущено демонстрацію + + Bandwidth limit + Обмеження потоку даних + + + MB/s + МБ/с + DemoFeaturePlugin @@ -2176,6 +2223,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file Файл закритого ключа вузла + + Style: + Стиль: + + + Native + Природний + + + Color scheme: + Схема кольорів: + + + Light + Світла + + + Dark + Темна + + + User groups + Групи користувачів + + + Backend: + Модуль: + + + Include user groups from domain + Включити групи користувачів з домену + + + Missing user groups backend + Не вистачає модуля обробки груп користувачів + + + No user groups plugin was found. Please check your installation! + Не знайдено додатка груп користувачів. Будь ласка, перевірте, чи належним чином встановлено програму! + HeadlessVncServer @@ -2927,6 +3014,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) Опитати вкладені групи користувачів (лише для AD) + + Query timeout + Перевищення часу очікування на виконання запиту + + + ms + мс + LdapNetworkObjectDirectoryConfigurationPage @@ -3053,14 +3148,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration Налаштування - - Disable balloon tooltips - Вимкнути панелі підказок - Show icons only Показати лише піктограми + + Disable tooltips + Вимкнути підказки + MainWindow @@ -3268,10 +3363,26 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers Місця і комп'ютери + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + Використати нетипову конфігурацію комп'ютерів. + +Натисніть і утримуйте, щоб завантажити конфігурацію з файла або зберегти конфігурацію до файла. + Only show computers with logged on users Показувати лише комп'ютери із користувачами у системі + + Load computer positions + Звантажити місця комп'ютерів + + + Save computer positions + Зберегти місця комп'ютерів + MasterConfigurationPage @@ -3363,6 +3474,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name Лише ім'я користувача + + Only last part of user name + + Only computer name Лише назва комп'ютера @@ -3447,6 +3562,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window Відкривати вікна додатків на тому самому екрані, що і головне вікно + + Configuration templates + Шаблони налаштувань + + + Image quality in monitoring mode + Якість зображення у режимі стеження + + + Highest + Найвища + + + High + Висока + + + Medium + Середня + + + Low + Низька + + + Lowest + Найнижча + + + Remote access image quality + Якість зображення віддаленого доступу + + + Advanced + Додатково + + + Computer name source + Джерело назв комп'ютерів + + + Default + Типове + + + Host address + Адреса вузла + + + Session client address + Адреса клієнта сеансу + + + Session client name + Назва клієнта сеансу + + + Session host name + Назва вузла сеансу + + + Session metadata + Метадані сеансу + + + Full name of user + Повне ім'я користувача + + + User login name + Назва запису користувача + + + Computer UID role + Роль UID комп'ютера + + + Session meta data hash + Хеш-сума метаданих сеансу + + + Always expand all locations + Завжди розгортати усі місця + + + Image quality + Якість зображення + MonitoringMode @@ -3725,14 +3928,18 @@ Please save your work and close all programs. Remote view or control a computer Віддалений перегляд або керування комп’ютером - - Please enter the hostname or IP address of the computer to access: - Будь ласка, вкажіть назву вузла або IP-адресу комп’ютера, доступ до якого слід отримати: - Show help about command Показати довідку щодо команди + + Exchange clipboard contents + Обмін вмістом буфера обміну даними + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + Не вибрано жодного комп'ютера. Ви можете ввести назву вузла або IP-адресу комп'ютера для доступу вручну: + RemoteAccessPage @@ -3950,6 +4157,37 @@ Please save your work and close all programs. Справді хочете вилучити усі позначені знімки вікон? + + ServerAccessControlManager + + Requested authentication method not available + Запитаний спосіб розпізнавання недоступний + + + Access allowed by rule "%1" + Доступ дозволено за правилом «%1» + + + Access denied by rule "%1" + Доступ заборонено за правилом «%1» + + + No rule allowed access + Жодне правило не надає доступу + + + Accessing user not member of an authorized user group + Доступ для користувача, який не є учасником уповноваженої групи користувачів + + + User has denied access + Доступ користувачеві заборонено + + + User confirmed access + Доступ підтверджено користувачем + + ServiceConfigurationPage @@ -4066,28 +4304,80 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) Режим багатьох сеансів (окремий екземпляр сервера для кожного локального і віддаленого стільничного сеансу) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + Увімкніть, якщо єдиний екземпляр Veyon Server має бути запущено для поточного активного сеансу, локального чи віддаленого. + + + Miscellaneous settings + Інші параметри + + + Disable clipboard synchronization + Вимкнути синхронізацію буфера обміну + + + Session metadata + Метадані сеансу + + + Content + Дані + + + None + Немає + + + Value of an environment variable + Значення змінної середовища + + + Value of a registry key + Значення ключа реєстру + + + Environment variable name: + Назва змінної середовища: + + + Registry key name: + Назва ключа реєстра: + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + Якщо хочете, введіть формальний вираз із використанням захоплення даних для видобування частини назви комп'ютера і використання її як показану назву комп'ютера. + +Приклад: [^-]*-(PC[0-9]*) + ServiceControl - Starting service %1 - Запускаємо службу %1 + Service control + Керування службами - Stopping service %1 - Зупиняємо службу %1 + Starting %1 + Запускаємо %1 - Registering service %1 - Реєструємо службу %1 + Stopping %1 + Зупиняємо %1 - Unregistering service %1 - Скасовуємо реєстрацію служби %1 + Restarting %1 + Перезапускаємо %1 - Service control - Керування службами + Registering %1 + Реєструємо %1 + + + Unregistering %1 + Скасовуємо реєстрацію %1 @@ -4170,6 +4460,14 @@ Typically this is required to support terminal servers. Duration: Тривалість: + + View in separate window + Переглянути в окремому вікні + + + %1 Master – Slideshow + Основне керування %1 – Показ слайдів + SpotlightPanel @@ -4321,17 +4619,6 @@ The second button removes the selected or last computer. Максимальне використання процесора - - UserConfig - - No write access - Немає доступу на запис - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - Не вдалося зберегти ваші особисті параметри! Будь ласка, перевірте, чи правильно вказано шлях до файла налаштувань користувачів за допомогою засобу налаштовування %1. - - UserLoginDialog @@ -4461,6 +4748,17 @@ The second button removes the selected or last computer. Екран %1 + + VeyonMaster + + No write access + Немає доступу на запис + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + Не вдалося зберегти ваші особисті параметри! Будь ласка, перевірте, чи правильно вказано шлях до файла налаштувань користувачів за допомогою засобу налаштовування %1. + + VeyonServiceControl @@ -4533,6 +4831,10 @@ The second button removes the selected or last computer. Use input device interception driver Скористатися драйвером-перехоплювачем пристроїв введення + + Use custom power scheme with disabled power button + Використати нетипову схему живлення із вимкненою кнопкою живлення + WindowsPlatformPlugin diff --git a/translations/veyon_vi.ts b/translations/veyon_vi.ts index a797130a1..0e617b7eb 100644 --- a/translations/veyon_vi.ts +++ b/translations/veyon_vi.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -137,15 +137,14 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa Backend nhóm người dùng: - Missing user groups backend - Thiếu backend nhóm người dùng - - - No default user groups plugin was found. Please check your installation! - Không tìm thấy plugin nhóm người dùng mặc định. Vui lòng kiểm tra bản cài đặt của bạn! + Restrict access to members of specific user groups + + + + AccessControlProvider - Restrict access to members of specific user groups + Provider for access control features @@ -323,6 +322,14 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa Session being accessed is a login screen + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa The access in the given scenario needs permission of the logged on user. Truy cập trong tình huống đã cho cần quyền của người dùng đã đăng nhập. - - ERROR: Unknown action - LỖI: Hành động không xác định - Test result Kết quả kiểm tra @@ -378,6 +381,10 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa Authentication method + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Please select a key to delete! Vui lòng chọn một khóa để xóa! - - Please enter the name of the user group or role for which to import the authentication key: - Vui lòng nhập tên của nhóm người dùng hoặc vai trò để nhập khóa xác thực: - Please select a key to export! Vui lòng chọn một khóa để xuất! @@ -487,6 +490,12 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Please select a key which to set the access group for! Vui lòng chọn một khóa để đặt nhóm truy cập! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1201,6 +1210,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực The specified command does not exist or no help is available for it. + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1218,10 +1231,6 @@ Khóa công được sử dụng trên các máy tính khách để xác thực ComputerControlListModel - - Host/IP address: %1 - - Active features: %1 @@ -1271,11 +1280,23 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - invalid + Hostname: %1 + + + + unknown - [none] + IP address: %1 + + + + Hostname could not be resolved + + + + No features active @@ -1347,6 +1368,18 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. + + Logged in since + + + + %1 days + + + + 1 day + + ComputerMonitoring @@ -1405,6 +1438,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Could not write the computer and users list to %1! Please check the file access permissions. + + Search computers + + ConfigCommands @@ -1553,6 +1590,14 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Slow down thumbnail updates while demo is running + + Bandwidth limit + + + + MB/s + + DemoFeaturePlugin @@ -2179,6 +2224,46 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Host private key file + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + + + + Backend: + + + + Include user groups from domain + + + + Missing user groups backend + Thiếu backend nhóm người dùng + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2909,6 +2994,14 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Query nested user groups (supported by AD only) + + Query timeout + + + + ms + + LdapNetworkObjectDirectoryConfigurationPage @@ -3036,11 +3129,11 @@ Khóa công được sử dụng trên các máy tính khách để xác thực - Disable balloon tooltips + Show icons only - Show icons only + Disable tooltips @@ -3250,10 +3343,24 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Locations & computers + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3345,6 +3452,10 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Only user name + + Only last part of user name + + Only computer name @@ -3429,6 +3540,94 @@ Khóa công được sử dụng trên các máy tính khách để xác thực Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3706,11 +3905,15 @@ Please save your work and close all programs. - Please enter the hostname or IP address of the computer to access: + Show help about command - Show help about command + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: @@ -3930,6 +4133,37 @@ Please save your work and close all programs. + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4045,27 +4279,77 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 + Service control - Stopping service %1 + Starting %1 - Registering service %1 + Stopping %1 - Unregistering service %1 + Restarting %1 - Service control + Registering %1 + + + + Unregistering %1 @@ -4149,6 +4433,14 @@ Typically this is required to support terminal servers. Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4299,17 +4591,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - - - UserLoginDialog @@ -4439,6 +4720,17 @@ The second button removes the selected or last computer. + + VeyonMaster + + No write access + + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + + + VeyonServiceControl @@ -4511,6 +4803,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_zh_CN.ts b/translations/veyon_zh_CN.ts index ce6efa6a9..341a1b88d 100644 --- a/translations/veyon_zh_CN.ts +++ b/translations/veyon_zh_CN.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: 用户组后端: - - Missing user groups backend - 缺少用户组后端 - - - No default user groups plugin was found. Please check your installation! - 没有找到默认的用户组插件,请检查您的安装程序! - Restrict access to members of specific user groups 限制特定用户组成员的访问权限 + + AccessControlProvider + + Provider for access control features + + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen 正在被访问的会话是登录界面 + + Local computer is already being accessed + + + + Local computer is not yet being accessed + + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. 指定场景中的访问需要登录用户的权限。 - - ERROR: Unknown action - 错误:未知的操作 - Test result 测试规则 @@ -378,6 +381,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method 验证模式 + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -472,10 +479,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! 请选择要删除的密钥! - - Please enter the name of the user group or role for which to import the authentication key: - 请输入要为其导入身份验证密钥的用户组或角色的名称: - Please select a key to export! 请选择要导出的密钥! @@ -488,6 +491,12 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! 请选择一个用于访问组的的密钥! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + + AuthKeysManager @@ -1202,6 +1211,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. 指定的命令不存在或没有它的说明可以使用。 + + Location "%1" not found. + + BuiltinUltraVncServer @@ -1219,10 +1232,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - 主机/IP 地址: %1 - Active features: %1 激活的功能: %1 @@ -1272,12 +1281,24 @@ The public key is used on client computers to authenticate incoming connection r 名称:%1 - invalid - 无效 + Hostname: %1 + + + + unknown + 未知 - [none] - [无] + IP address: %1 + + + + Hostname could not be resolved + + + + No features active + @@ -1348,6 +1369,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. 无法确定此计算机的地点。这表明系统配置存在问题。所有地点都将显示在计算机选择面板中。 + + Logged in since + 登录自 + + + %1 days + %1 天 + + + 1 day + 1 天 + ComputerMonitoring @@ -1406,6 +1439,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. 无法将计算机和用户列表写入 %1!请检查文件访问权限。 + + Search computers + 搜索计算机 + ConfigCommands @@ -1554,6 +1591,14 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running 当演示正在运行时降低缩略图更新频率 + + Bandwidth limit + 带宽限制 + + + MB/s + MB/s + DemoFeaturePlugin @@ -1575,7 +1620,7 @@ The public key is used on client computers to authenticate incoming connection r Demo - + 屏幕演示 Share your screen or allow a user to share his screen with other users. @@ -1583,7 +1628,7 @@ The public key is used on client computers to authenticate incoming connection r Full screen demo - + 全屏演示 Share your own screen in fullscreen mode @@ -1697,7 +1742,7 @@ The public key is used on client computers to authenticate incoming connection r New application - + 新程序 @@ -1724,7 +1769,7 @@ The public key is used on client computers to authenticate incoming connection r Click this button to start an application on all computers. - + 点击此按钮,将在所有计算机上启动一个程序 Start application "%1" @@ -1812,19 +1857,19 @@ The public key is used on client computers to authenticate incoming connection r FeatureCommands List names of all available features - + 列出所有可用功能的名称 Show table with details of all available features - + 显示含有所有可用功能的详细信息表格 Start a feature on a remote host - + 启动远程主机功能 Stop a feature on a remote host - + 停止远程主机功能 Please specify the command to display help for. @@ -1844,7 +1889,7 @@ The public key is used on client computers to authenticate incoming connection r FEATURE - + 功能 ARGUMENTS @@ -1900,11 +1945,11 @@ The public key is used on client computers to authenticate incoming connection r Worker - + Worker UID - + UID Plugin @@ -1920,11 +1965,11 @@ The public key is used on client computers to authenticate incoming connection r Failed to initialize credentials - + 初始化认证失败 Could not establish a connection to host %1 - + 无法建立到主机 %1 的连接 Failed to send feature control message to host %1 @@ -2180,6 +2225,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file 主机私钥文件 + + Style: + + + + Native + + + + Color scheme: + + + + Light + + + + Dark + + + + User groups + 用户组 + + + Backend: + 后端: + + + Include user groups from domain + + + + Missing user groups backend + 缺少用户组后端 + + + No user groups plugin was found. Please check your installation! + + HeadlessVncServer @@ -2348,7 +2433,7 @@ The public key is used on client computers to authenticate incoming connection r Invalid hostname - 无效的主机名 + 主机名无效 You configured computer hostnames to be stored as fully qualified domain names (FQDN) but entered a hostname without domain. @@ -2440,7 +2525,7 @@ The public key is used on client computers to authenticate incoming connection r Computer groups filter - + 计算机组筛选器 Computer locations identification @@ -2452,7 +2537,7 @@ The public key is used on client computers to authenticate incoming connection r Invalid test value - + 测试值无效 An empty or invalid value has been supplied for this test. @@ -2528,7 +2613,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP directory - + LDAP 目录 @@ -2929,6 +3014,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) + + Query timeout + + + + ms + 毫秒 + LdapNetworkObjectDirectoryConfigurationPage @@ -2997,7 +3090,7 @@ The public key is used on client computers to authenticate incoming connection r LDAP bind - + LDAP 绑定 @@ -3055,14 +3148,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration 配置 - - Disable balloon tooltips - 禁用气球浮动提示 - Show icons only 仅显示图标 + + Disable tooltips + + MainWindow @@ -3270,10 +3363,24 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers 地点及计算机 + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + + Only show computers with logged on users + + Load computer positions + + + + Save computer positions + + MasterConfigurationPage @@ -3365,6 +3472,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name 仅用户名 + + Only last part of user name + + Only computer name 仅计算机名称 @@ -3427,11 +3538,11 @@ The public key is used on client computers to authenticate incoming connection r px - + px Hide local session - + 隐藏本机会话 Auto @@ -3449,6 +3560,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window + + Configuration templates + + + + Image quality in monitoring mode + + + + Highest + + + + High + + + + Medium + + + + Low + + + + Lowest + + + + Remote access image quality + + + + Advanced + + + + Computer name source + + + + Default + + + + Host address + 主机地址 + + + Session client address + + + + Session client name + + + + Session host name + + + + Session metadata + + + + Full name of user + + + + User login name + + + + Computer UID role + + + + Session meta data hash + + + + Always expand all locations + + + + Image quality + + MonitoringMode @@ -3564,7 +3763,7 @@ The public key is used on client computers to authenticate incoming connection r UID - + UID Plugin-related CLI operations @@ -3671,11 +3870,11 @@ Please save your work and close all programs. Do you really want to reboot <b>ALL</b> computers? - + 您真的要重新启动<b>所有的</b>计算机? Do you really want to power down <b>ALL</b> computers? - + 您真的要关闭<b>所有的</b>计算机? Do you really want to power down the selected computers? @@ -3727,14 +3926,18 @@ Please save your work and close all programs. Remote view or control a computer 远程查看或控制电脑 - - Please enter the hostname or IP address of the computer to access: - 请输入要访问的计算机的主机名或IP地址: - Show help about command 显此命令的帮助信息 + + Exchange clipboard contents + + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + + RemoteAccessPage @@ -3952,6 +4155,37 @@ Please save your work and close all programs. 您确定要删除所有选中的屏幕截图吗? + + ServerAccessControlManager + + Requested authentication method not available + + + + Access allowed by rule "%1" + + + + Access denied by rule "%1" + + + + No rule allowed access + + + + Accessing user not member of an authorized user group + + + + User has denied access + + + + User confirmed access + + + ServiceConfigurationPage @@ -4068,28 +4302,78 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + + + + Miscellaneous settings + + + + Disable clipboard synchronization + + + + Session metadata + + + + Content + + + + None + + + + Value of an environment variable + + + + Value of a registry key + + + + Environment variable name: + + + + Registry key name: + + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + + ServiceControl - Starting service %1 - 启动服务 %1 + Service control + 服务控制 - Stopping service %1 - 停止服务 %1 + Starting %1 + - Registering service %1 - 注册服务 %1 + Stopping %1 + - Unregistering service %1 - 反注册服务 %1 + Restarting %1 + - Service control - 服务控制 + Registering %1 + + + + Unregistering %1 + @@ -4172,6 +4456,14 @@ Typically this is required to support terminal servers. Duration: 持续时间: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4322,17 +4614,6 @@ The second button removes the selected or last computer. - - UserConfig - - No write access - 没有写入权限 - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - 无法保存您的个人设置! 请使用 %1 配置器检查用户配置文件路径。 - - UserLoginDialog @@ -4462,6 +4743,17 @@ The second button removes the selected or last computer. 屏幕 %1 + + VeyonMaster + + No write access + 没有写入权限 + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + 无法保存您的个人设置! 请使用 %1 配置器检查用户配置文件路径。 + + VeyonServiceControl @@ -4534,6 +4826,10 @@ The second button removes the selected or last computer. Use input device interception driver + + Use custom power scheme with disabled power button + + WindowsPlatformPlugin diff --git a/translations/veyon_zh_TW.ts b/translations/veyon_zh_TW.ts index 9a69c96be..c10d22e33 100644 --- a/translations/veyon_zh_TW.ts +++ b/translations/veyon_zh_TW.ts @@ -1,4 +1,4 @@ - + AboutDialog @@ -136,19 +136,18 @@ If you're interested in translating Veyon into your local or another langua User groups backend: 使用者群組後端: - - Missing user groups backend - 缺少使用者群組後端 - - - No default user groups plugin was found. Please check your installation! - 找不到預設的使用者群組外掛程式。 請檢查您的安裝! - Restrict access to members of specific user groups 限制對指定使用者群組成員的存取 + + AccessControlProvider + + Provider for access control features + 存取控制功能的提供者 + + AccessControlRuleEditDialog @@ -323,6 +322,14 @@ If you're interested in translating Veyon into your local or another langua Session being accessed is a login screen 正在存取的工作階段是登入畫面 + + Local computer is already being accessed + 已經存取本機電腦 + + + Local computer is not yet being accessed + 尚未存取本機電腦 + AccessControlRulesTestDialog @@ -366,10 +373,6 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. 在給予情境中存取。需要登入使用者的權限。 - - ERROR: Unknown action - 錯誤: 未知的動作 - Test result 測試結果 @@ -378,6 +381,10 @@ If you're interested in translating Veyon into your local or another langua Authentication method 身份驗證方法 + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationWidget @@ -471,10 +478,6 @@ The public key is used on client computers to authenticate incoming connection r Please select a key to delete! 請選取要刪除的金鑰! - - Please enter the name of the user group or role for which to import the authentication key: - 請輸入要為其匯入身份驗證金鑰的使用者群組或角色的名稱: - Please select a key to export! 請選擇要匯出的金鑰! @@ -487,6 +490,14 @@ The public key is used on client computers to authenticate incoming connection r Please select a key which to set the access group for! 請選擇要為其設定存取群組的金鑰! + + Please enter the name of the user group or role for which to import the authentication key. + +Make sure that the names of the keys belonging to each other are identical on all computers. + 請輸入要為其匯入身份驗證金鑰的使用者群組或角色的名稱。 + +確認所有電腦上彼此所屬的金鑰名稱相同。 + AuthKeysManager @@ -1201,6 +1212,10 @@ The public key is used on client computers to authenticate incoming connection r The specified command does not exist or no help is available for it. 指定的命令不存在或沒有它的說明可以使用。 + + Location "%1" not found. + 找不到位置 "%1"。 + BuiltinUltraVncServer @@ -1218,10 +1233,6 @@ The public key is used on client computers to authenticate incoming connection r ComputerControlListModel - - Host/IP address: %1 - 主機/IP 位址: %1 - Active features: %1 可用功能: %1 @@ -1271,12 +1282,24 @@ The public key is used on client computers to authenticate incoming connection r 名稱: %1 - invalid - 無效 + Hostname: %1 + 主機名稱: %1 + + + unknown + 未知 + + + IP address: %1 + IP 位址: %1 - [none] - [無] + Hostname could not be resolved + 無法解析主機名稱 + + + No features active + 沒有功能啟用 @@ -1347,6 +1370,18 @@ The public key is used on client computers to authenticate incoming connection r Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. 無法確定這部電腦的位置。 這表示系統組態有問題。 所有位置將顯示在電腦選取面板中。 + + Logged in since + 登入自 + + + %1 days + %1 天 + + + 1 day + 1 天 + ComputerMonitoring @@ -1391,7 +1426,7 @@ The public key is used on client computers to authenticate incoming connection r Select output filename - 選擇輸出檔案名稱 + 選取輸出檔案名稱 CSV files (*.csv) @@ -1405,6 +1440,10 @@ The public key is used on client computers to authenticate incoming connection r Could not write the computer and users list to %1! Please check the file access permissions. 無法寫入電腦和使用者清單到 %1! 請檢查檔案的存取權限。 + + Search computers + 搜尋電腦 + ConfigCommands @@ -1512,14 +1551,14 @@ The public key is used on client computers to authenticate incoming connection r DemoClient %1 Demo - %1 示範 + %1 演示 DemoConfigurationPage Demo server - 示範伺服器 + 演示伺服器 Tunables @@ -1551,22 +1590,30 @@ The public key is used on client computers to authenticate incoming connection r Slow down thumbnail updates while demo is running - 示範執行時,縮圖更新速度變慢 + 演示執行時,縮圖更新速度變慢 + + + Bandwidth limit + 頻寬限制 + + + MB/s + MB/秒 DemoFeaturePlugin Stop demo - 停止示範 + 停止演示 Window demo - 視窗示範 + 視窗演示 Give a demonstration by screen broadcasting - 透過螢幕廣播給予示範 + 透過螢幕廣播給予演示 In this mode your screen being displayed in a window on all computers. The users are able to switch to other windows as needed. @@ -1574,7 +1621,7 @@ The public key is used on client computers to authenticate incoming connection r Demo - 示範 + 演示 Share your screen or allow a user to share his screen with other users. @@ -1582,7 +1629,7 @@ The public key is used on client computers to authenticate incoming connection r Full screen demo - 全螢幕示範 + 全螢幕演示 Share your own screen in fullscreen mode @@ -1851,7 +1898,7 @@ The public key is used on client computers to authenticate incoming connection r Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information - 透過連線到遠端執行的 veyon 伺服器來啟動指定主機的指定功能。 該功能可以由名稱或 UID 指定。 使用「show」命令查看所有的可用功能。 根據功能,必須指定編碼為單一 JSON 字串的附加引數 (比如顯示的文字訊息)。 請參閱開發人員文件取得更多資訊 + 透過連線到遠端執行的 Veyon 伺服器來啟動指定主機的指定功能。 該功能可以由名稱或 UID 指定。 使用「show」命令查看所有的可用功能。 根據功能,必須指定編碼為單一 JSON 字串的附加引數 (比如顯示的文字訊息)。 請參閱開發人員文件取得更多資訊 Lock the screen @@ -1871,7 +1918,7 @@ The public key is used on client computers to authenticate incoming connection r Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. - 透過連線到遠端執行的 veyon 伺服器來停止指定主機的指定功能。 該功能可以由名稱或 UID 指定。 使用「show」命令查看所有的可用功能。 + 透過連線到遠端執行的 Veyon 伺服器來停止指定主機的指定功能。 該功能可以由名稱或 UID 指定。 使用「show」命令查看所有的可用功能。 Unlock the screen @@ -2179,6 +2226,46 @@ The public key is used on client computers to authenticate incoming connection r Host private key file 主機私密金鑰檔 + + Style: + 樣式: + + + Native + 原生 + + + Color scheme: + 色彩架構: + + + Light + 淺色 + + + Dark + 深色 + + + User groups + 使用者群組 + + + Backend: + 後端: + + + Include user groups from domain + 包含網域中的使用者群組 + + + Missing user groups backend + 缺少使用者群組後端 + + + No user groups plugin was found. Please check your installation! + 找不到使用者群組外掛程式。 請檢查您的安裝! + HeadlessVncServer @@ -2928,6 +3015,14 @@ The public key is used on client computers to authenticate incoming connection r Query nested user groups (supported by AD only) 查詢巢狀使用者群組 (只有 AD 支援) + + Query timeout + 查詢逾時 + + + ms + 毫秒 + LdapNetworkObjectDirectoryConfigurationPage @@ -2952,7 +3047,7 @@ The public key is used on client computers to authenticate incoming connection r Show help about command - 顯示命令的說明 + 顯示有關命令的說明 Commands for configuring and testing LDAP/AD integration @@ -3054,14 +3149,14 @@ The public key is used on client computers to authenticate incoming connection r Configuration 組態 - - Disable balloon tooltips - 停用氣球工具提示 - Show icons only 只顯示圖示 + + Disable tooltips + 停用工具提示 + MainWindow @@ -3179,7 +3274,7 @@ The public key is used on client computers to authenticate incoming connection r Screenshots - 螢幕截圖 + 螢幕快照 Feature active @@ -3239,11 +3334,11 @@ The public key is used on client computers to authenticate incoming connection r Use custom computer arrangement - 使用自訂電腦排列 + 使用自訂電腦安排 Locations && computers - 地點 && 電腦 + 位置 && 電腦 Authentication @@ -3269,10 +3364,26 @@ The public key is used on client computers to authenticate incoming connection r Locations & computers 位置 & 電腦 + + Use custom computer arrangement. + +Press and hold to load arrangement from a file or save current arrangement to a file. + 使用自訂電腦安排。 + +按住不放以從檔案載入安排或將目前安排儲存到檔案。 + Only show computers with logged on users 只顯示已登入使用者的電腦 + + Load computer positions + 載入電腦位置 + + + Save computer positions + 儲存電腦位置 + MasterConfigurationPage @@ -3302,7 +3413,7 @@ The public key is used on client computers to authenticate incoming connection r Screenshots - 螢幕截圖 + 螢幕快照 <no feature> @@ -3364,6 +3475,10 @@ The public key is used on client computers to authenticate incoming connection r Only user name 僅使用者名稱 + + Only last part of user name + + Only computer name 僅電腦名稱 @@ -3448,6 +3563,94 @@ The public key is used on client computers to authenticate incoming connection r Open feature windows on the same screen as the main window 在與主視窗同一螢幕上開啟功能視窗 + + Configuration templates + 組態範本 + + + Image quality in monitoring mode + 監控模式中圖片品質 + + + Highest + 最高 + + + High + + + + Medium + + + + Low + + + + Lowest + 最低 + + + Remote access image quality + 遠端存取圖片品質 + + + Advanced + 進階 + + + Computer name source + 電腦名稱來源 + + + Default + 預設值 + + + Host address + 主機位址 + + + Session client address + 工作階段用戶端位址 + + + Session client name + 工作階段用戶端名稱 + + + Session host name + 工作階段主機名稱 + + + Session metadata + 工作階段中繼資料 + + + Full name of user + 使用者的全名 + + + User login name + 使用者登入名稱 + + + Computer UID role + 電腦 UID 角色 + + + Session meta data hash + 工作階段中繼資料雜湊 + + + Always expand all locations + 一律展開所有位置 + + + Image quality + 圖片品質 + MonitoringMode @@ -3727,12 +3930,16 @@ Please save your work and close all programs. 遠端檢視或控制電腦 - Please enter the hostname or IP address of the computer to access: - 請輸入主機名稱或電腦的 IP 位址來存取: + Show help about command + 顯示有關命令的說明 - Show help about command - 顯示命令的說明 + Exchange clipboard contents + 交換剪貼簿內容 + + + No computer has been selected so you can enter a hostname or IP address of a computer for manual access: + 未選取電腦,因此您可以輸入電腦的主機名稱或 IP 地址以手動存取: @@ -3909,7 +4116,7 @@ Please save your work and close all programs. ScreenshotManagementPage Screenshots - 螢幕截圖 + 螢幕快照 @@ -3951,6 +4158,37 @@ Please save your work and close all programs. 您真的要刪除所有的螢幕快照嗎? + + ServerAccessControlManager + + Requested authentication method not available + 請求的身份驗證方法不可用 + + + Access allowed by rule "%1" + 規則「%1」允許存取 + + + Access denied by rule "%1" + 規則「%1」拒絕存取 + + + No rule allowed access + 無規則允許存取 + + + Accessing user not member of an authorized user group + 存取使用者不是授權使用者群組的成員 + + + User has denied access + 使用者拒絕存取 + + + User confirmed access + 使用者確認存取 + + ServiceConfigurationPage @@ -4003,7 +4241,7 @@ Please save your work and close all programs. All settings were saved successfully. In order to take effect the %1 service needs to be restarted. Restart it now? - 已成功儲存所有的設定。 為了生效 %1 服務需要重新啟動。 立即重新啟動它? + 儲存所有的設定成功。 為了生效 %1 服務需要重新啟動。 立即重新啟動它? Running @@ -4045,7 +4283,7 @@ Typically this is required to support terminal servers. Demo server - 示範伺服器 + 演示伺服器 Miscellaneous network settings @@ -4067,28 +4305,80 @@ Typically this is required to support terminal servers. Multi session mode (distinct server instance for each local and remote desktop session) 多工作階段模式 (每個本機和遠端桌面工作階段的不同伺服器實例) + + Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. + 如果應該為目前活動會話啟動單一 Veyon Server 實例 (無論是本機還是遠端),則啟用。 + + + Miscellaneous settings + 雜項設定 + + + Disable clipboard synchronization + 停用剪貼簿同步 + + + Session metadata + 工作階段中繼資料 + + + Content + 內文 + + + None + + + + Value of an environment variable + 環境變數的值 + + + Value of a registry key + 登錄檔機碼的值 + + + Environment variable name: + 環境變數名稱: + + + Registry key name: + 登錄檔機碼名稱: + + + Optionally enter a regular expression with a capture to extract a part of the computer name and use it as the display name for the computer. + +Example: [^-]*-(PC[0-9]*) + (可選) 輸入含擷取的正規表示式,以擷取電腦名稱的一部分並將其用於電腦的顯示名稱。 + +例如: [^-]*-(PC[0-9]*) + ServiceControl - Starting service %1 - 正在啟動服務 %1 + Service control + 服務控制 - Stopping service %1 - 正在停止服務 %1 + Starting %1 + 正在啟動 %1 - Registering service %1 - 註冊服務 %1 + Stopping %1 + 正在停止 %1 - Unregistering service %1 - 取消註冊服務 %1 + Restarting %1 + 正在重新啟動 %1 - Service control - 服務控制 + Registering %1 + 正在註冊 %1 + + + Unregistering %1 + 正在取消註冊 %1 @@ -4171,6 +4461,14 @@ Typically this is required to support terminal servers. Duration: 持續時間: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4322,17 +4620,6 @@ The second button removes the selected or last computer. 最大 CPU 使用率 - - UserConfig - - No write access - 沒有寫入存取 - - - Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. - 無法儲存您的個人設定! 請檢查使用 %1 組態的使用者設定檔路徑。 - - UserLoginDialog @@ -4462,6 +4749,17 @@ The second button removes the selected or last computer. 螢幕 %1 + + VeyonMaster + + No write access + 沒有寫入存取 + + + Could not save your personal settings! Please check the user configuration file path using the %1 Configurator. + 無法儲存您的個人設定! 請檢查使用 %1 組態的使用者設定檔路徑。 + + VeyonServiceControl @@ -4528,12 +4826,16 @@ The second button removes the selected or last computer. Confirm legal notice (message displayed before user logs in) - 確認法律通知 (在使用者登入前顯示訊息) + 確認法律聲明 (在使用者登入前顯示訊息) Use input device interception driver 使用輸入裝置攔截驅動程式 + + Use custom power scheme with disabled power button + 使用停用電源按鈕的自訂電源方案 + WindowsPlatformPlugin From 9fcaa9961fda2f57b57f0c9a930d187c9dd6ccf8 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 9 May 2025 14:08:31 +0200 Subject: [PATCH 1751/1765] LDAP: add support for mapping OUs 1:1 to locations This new feature is based on the NetworkObjectDirectory implementation of the retired LDAP Pro add-on. It allows using nested OU/container structures as nested locations in Veyon. --- plugins/ldap/common/LdapConfiguration.h | 1 + plugins/ldap/common/LdapConfigurationPage.ui | 24 ++ plugins/ldap/common/LdapDirectory.cpp | 2 + plugins/ldap/common/LdapDirectory.h | 7 + .../common/LdapNetworkObjectDirectory.cpp | 298 ++++++++++++------ .../ldap/common/LdapNetworkObjectDirectory.h | 23 +- translations/veyon.ts | 4 + 7 files changed, 260 insertions(+), 99 deletions(-) diff --git a/plugins/ldap/common/LdapConfiguration.h b/plugins/ldap/common/LdapConfiguration.h index d6131e230..74b1c1397 100644 --- a/plugins/ldap/common/LdapConfiguration.h +++ b/plugins/ldap/common/LdapConfiguration.h @@ -39,6 +39,7 @@ OP( LdapConfiguration, m_configuration, QString, userGroupsFilter, setUserGroupsFilter, "UserGroupsFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, computersFilter, setComputersFilter, "ComputersFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, bool, queryNestedUserGroups, setQueryNestedUserGroups, "QueryNestedUserGroups", "LDAP", false, Configuration::Property::Flag::Standard ) \ + OP( LdapConfiguration, m_configuration, bool, mapContainerStructureToLocations, setMapContainerStructureToLocations, "MapContainerStructureToLocations", "LDAP", false, Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, bool, identifyGroupMembersByNameAttribute, setIdentifyGroupMembersByNameAttribute, "IdentifyGroupMembersByNameAttribute", "LDAP", false, Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, computerGroupsFilter, setComputerGroupsFilter, "ComputerGroupsFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ OP( LdapConfiguration, m_configuration, QString, computerContainersFilter, setComputerContainersFilter, "ComputerContainersFilter", "LDAP", QString(), Configuration::Property::Flag::Standard ) \ diff --git a/plugins/ldap/common/LdapConfigurationPage.ui b/plugins/ldap/common/LdapConfigurationPage.ui index a2b88c35e..85e6741e0 100644 --- a/plugins/ldap/common/LdapConfigurationPage.ui +++ b/plugins/ldap/common/LdapConfigurationPage.ui @@ -876,6 +876,13 @@ + + + + Map container/OU structure 1:1 to locations + + + @@ -1123,6 +1130,7 @@ testComputerGroupsFilter testComputerContainersFilter queryNestedUserGroups + mapContainerStructureToLocations identifyGroupMembersByDN identifyGroupMembersByNameAttribute computerLocationsByGroups @@ -1411,6 +1419,22 @@ + + computerLocationsByContainer + toggled(bool) + mapContainerStructureToLocations + setEnabled(bool) + + + 281 + 536 + + + 281 + 309 + + + diff --git a/plugins/ldap/common/LdapDirectory.cpp b/plugins/ldap/common/LdapDirectory.cpp index 245bedc24..cd8dc45e0 100644 --- a/plugins/ldap/common/LdapDirectory.cpp +++ b/plugins/ldap/common/LdapDirectory.cpp @@ -58,6 +58,8 @@ LdapDirectory::LdapDirectory( const LdapConfiguration& configuration, QObject* p m_computerLocationsByContainer = m_configuration.computerLocationsByContainer(); m_computerLocationsByAttribute = m_configuration.computerLocationsByAttribute(); m_computerLocationAttribute = m_configuration.computerLocationAttribute(); + + m_mapContainerStructureToLocations = m_configuration.mapContainerStructureToLocations(); } diff --git a/plugins/ldap/common/LdapDirectory.h b/plugins/ldap/common/LdapDirectory.h index 2462fa6d2..af0bd1254 100644 --- a/plugins/ldap/common/LdapDirectory.h +++ b/plugins/ldap/common/LdapDirectory.h @@ -97,6 +97,11 @@ class LDAP_COMMON_EXPORT LdapDirectory : public QObject return m_computerLocationsByContainer; } + bool mapContainerStructureToLocations() const + { + return m_mapContainerStructureToLocations; + } + private: LdapClient::Scope computerSearchScope() const; @@ -131,4 +136,6 @@ class LDAP_COMMON_EXPORT LdapDirectory : public QObject bool m_computerLocationsByAttribute = false; bool m_computerHostNameAsFQDN = false; + bool m_mapContainerStructureToLocations = false; + }; diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index 86dffdb30..cfb70d61d 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -7,22 +7,22 @@ #include "LdapNetworkObjectDirectory.h" -LdapNetworkObjectDirectory::LdapNetworkObjectDirectory( const LdapConfiguration& ldapConfiguration, - QObject* parent ) : - NetworkObjectDirectory( ldapConfiguration.directoryName(), parent ), - m_ldapDirectory( ldapConfiguration ) +LdapNetworkObjectDirectory::LdapNetworkObjectDirectory(const LdapConfiguration& ldapConfiguration, + QObject* parent) : + NetworkObjectDirectory(ldapConfiguration.directoryName(), parent), + m_ldapDirectory(ldapConfiguration) { } -NetworkObjectList LdapNetworkObjectDirectory::queryObjects( NetworkObject::Type type, - NetworkObject::Property property, const QVariant& value ) +NetworkObjectList LdapNetworkObjectDirectory::queryObjects(NetworkObject::Type type, + NetworkObject::Property property, const QVariant& value) { - switch( type ) + switch (type) { - case NetworkObject::Type::Location: return queryLocations( property, value ); - case NetworkObject::Type::Host: return queryHosts( property, value ); + case NetworkObject::Type::Location: return queryLocations(property, value); + case NetworkObject::Type::Host: return queryHosts(property, value); default: break; } @@ -31,68 +31,117 @@ NetworkObjectList LdapNetworkObjectDirectory::queryObjects( NetworkObject::Type -NetworkObjectList LdapNetworkObjectDirectory::queryParents( const NetworkObject& object ) +NetworkObjectList LdapNetworkObjectDirectory::queryParents(const NetworkObject& object) { - switch( object.type() ) + NetworkObjectList parents; + + if (object.type() == NetworkObject::Type::Host || object.type() == NetworkObject::Type::Location) { - case NetworkObject::Type::Host: - return { NetworkObject( this, NetworkObject::Type::Location, - m_ldapDirectory.locationsOfComputer( object.property( NetworkObject::Property::DirectoryAddress ).toString() ).value( 0 ) ) }; - case NetworkObject::Type::Location: - return { rootObject() }; - default: - break; + if (m_ldapDirectory.computerLocationsByContainer()) + { + const auto parentDn = LdapClient::parentDn(object.property(NetworkObject::Property::DirectoryAddress).toString()); + if (parentDn.isEmpty() == false) + { + const NetworkObject parentObject{this, NetworkObject::Type::Location, parentDn, { + { NetworkObject::propertyKey(NetworkObject::Property::DirectoryAddress), parentDn} + }}; + parents.append(parentObject); + + // computer tree root DN not yet reached? + if (QString::compare(parentDn, m_ldapDirectory.computersDn(), Qt::CaseInsensitive) != 0) + { + parents.append(queryParents(parentObject)); + } + } + } + else if (object.type() == NetworkObject::Type::Host) + { + const auto locations = m_ldapDirectory.locationsOfComputer(object.property(NetworkObject::Property::DirectoryAddress).toString()); + const NetworkObject parentObject(this, NetworkObject::Type::Location, locations.value(0)); + parents.append(parentObject); + } } - return { NetworkObject( this, NetworkObject::Type::None ) }; + return parents; } void LdapNetworkObjectDirectory::update() { - const auto locations = m_ldapDirectory.computerLocations(); + updateObjects(rootObject()); - for( const auto& location : std::as_const( locations ) ) - { - const NetworkObject locationObject{this, NetworkObject::Type::Location, location}; + setObjectPopulated(rootObject()); +} - addOrUpdateObject( locationObject, rootObject() ); - updateLocation( locationObject ); + +void LdapNetworkObjectDirectory::fetchObjects(const NetworkObject& parent) +{ + if (parent.type() == NetworkObject::Type::Root) + { + update(); + } + else if (parent.type() != NetworkObject::Type::Location) + { + setObjectPopulated(parent); } + else + { + updateObjects(parent); - removeObjects( rootObject(), [locations]( const NetworkObject& object ) { - return object.type() == NetworkObject::Type::Location && locations.contains( object.name() ) == false; } ); + setObjectPopulated(parent); + } } -void LdapNetworkObjectDirectory::updateLocation( const NetworkObject& locationObject ) +void LdapNetworkObjectDirectory::updateObjects(const NetworkObject& parent) { - const auto computers = m_ldapDirectory.computerLocationEntries( locationObject.name() ); - - for( const auto& computer : std::as_const( computers ) ) + if (m_ldapDirectory.computerLocationsByContainer() && m_ldapDirectory.mapContainerStructureToLocations()) { - const auto hostObject = computerToObject( this, &m_ldapDirectory, computer ); - if( hostObject.type() == NetworkObject::Type::Host ) + updateLocations(parent); + updateComputers(parent); + } + else if (parent.type() == NetworkObject::Type::Root) + { + const auto locationNames = m_ldapDirectory.computerLocations(); + + for (const auto& locationName : std::as_const(locationNames)) { - addOrUpdateObject( hostObject, locationObject ); + addOrUpdateObject(NetworkObject{this, NetworkObject::Type::Location, locationName}, parent); } + + removeObjects(parent, [&locationNames](const NetworkObject& object) { + return object.type() == NetworkObject::Type::Location && locationNames.contains(object.name()) == false; }); } + else + { + const auto computerDns = m_ldapDirectory.computerLocationEntries(parent.name()); - removeObjects( locationObject, [computers]( const NetworkObject& object ) { - return object.type() == NetworkObject::Type::Host && - computers.contains( object.property( NetworkObject::Property::DirectoryAddress ).toString() ) == false; } ); + for (const auto& computerDn : std::as_const(computerDns)) + { + const auto hostObject = computerToObject(computerDn); + if (hostObject.type() == NetworkObject::Type::Host) + { + addOrUpdateObject(hostObject, parent); + } + } + + removeObjects(parent, [&computerDns](const NetworkObject& object) { + return object.type() == NetworkObject::Type::Host && + computerDns.contains(object.property(NetworkObject::Property::DirectoryAddress)) == false; + }); + } } -NetworkObjectList LdapNetworkObjectDirectory::queryLocations( NetworkObject::Property property, const QVariant& value ) +NetworkObjectList LdapNetworkObjectDirectory::queryLocations(NetworkObject::Property property, const QVariant& value) { QString name; - switch( property ) + switch (property) { case NetworkObject::Property::None: break; @@ -106,14 +155,14 @@ NetworkObjectList LdapNetworkObjectDirectory::queryLocations( NetworkObject::Pro return {}; } - const auto locations = m_ldapDirectory.computerLocations( name ); + const auto locations = m_ldapDirectory.computerLocations(name); NetworkObjectList locationObjects; locationObjects.reserve( locations.size() ); - for( const auto& location : locations ) + for (const auto& location : locations) { - locationObjects.append( NetworkObject{this, NetworkObject::Type::Location, location} ); + locationObjects.append(NetworkObject{this, NetworkObject::Type::Location, location}); } return locationObjects; @@ -121,28 +170,28 @@ NetworkObjectList LdapNetworkObjectDirectory::queryLocations( NetworkObject::Pro -NetworkObjectList LdapNetworkObjectDirectory::queryHosts( NetworkObject::Property property, const QVariant& value ) +NetworkObjectList LdapNetworkObjectDirectory::queryHosts(NetworkObject::Property property, const QVariant& value) { QStringList computers; - switch( property ) + switch (property) { case NetworkObject::Property::None: - computers = m_ldapDirectory.computersByHostName( {} ); + computers = m_ldapDirectory.computersByHostName({}); break; case NetworkObject::Property::Name: - computers = m_ldapDirectory.computersByDisplayName( value.toString() ); + computers = m_ldapDirectory.computersByDisplayName(value.toString()); break; case NetworkObject::Property::HostAddress: { - const auto hostName = m_ldapDirectory.hostToLdapFormat( value.toString() ); - if( hostName.isEmpty() ) + const auto hostName = m_ldapDirectory.hostToLdapFormat(value.toString()); + if (hostName.isEmpty()) { return {}; } - computers = m_ldapDirectory.computersByHostName( hostName ); + computers = m_ldapDirectory.computersByHostName(hostName); break; } @@ -152,14 +201,14 @@ NetworkObjectList LdapNetworkObjectDirectory::queryHosts( NetworkObject::Propert } NetworkObjectList hostObjects; - hostObjects.reserve( computers.size() ); + hostObjects.reserve(computers.size()); - for( const auto& computer : std::as_const(computers) ) + for (const auto& computer : std::as_const(computers)) { - const auto hostObject = computerToObject( this, &m_ldapDirectory, computer ); - if( hostObject.isValid() ) + const auto hostObject = computerToObject(computer); + if (hostObject.isValid()) { - hostObjects.append( hostObject ); + hostObjects.append(hostObject); } } @@ -168,61 +217,130 @@ NetworkObjectList LdapNetworkObjectDirectory::queryHosts( NetworkObject::Propert -NetworkObject LdapNetworkObjectDirectory::computerToObject( NetworkObjectDirectory* directory, - LdapDirectory* ldapDirectory, const QString& computerDn ) +void LdapNetworkObjectDirectory::updateLocations(const NetworkObject& parent) { - auto displayNameAttribute = ldapDirectory->computerDisplayNameAttribute(); - if( displayNameAttribute.isEmpty() ) + auto baseDn = parent.property(NetworkObject::Property::DirectoryAddress).toString(); + if (parent.type() == NetworkObject::Type::Root) { - displayNameAttribute = LdapClient::cn(); + baseDn = m_ldapDirectory.computersDn(); } - auto hostNameAttribute = ldapDirectory->computerHostNameAttribute(); - if( hostNameAttribute.isEmpty() ) + const auto locations = m_ldapDirectory.client().queryObjects(baseDn, { m_ldapDirectory.locationNameAttribute() }, + m_ldapDirectory.computerContainersFilter(), LdapClient::Scope::One); + for (auto it = locations.begin(), end = locations.end(); it != end; ++it) + { + for (const auto& locationName : std::as_const(it.value().first())) + { + addOrUpdateObject(NetworkObject{ + this, NetworkObject::Type::Location, locationName, { + { NetworkObject::propertyKey(NetworkObject::Property::DirectoryAddress), it.key()}, + } + }, + parent); + } + } + + const auto locationDNs = locations.keys(); + + removeObjects(parent, [locationDNs](const NetworkObject& object) { + return object.type() == NetworkObject::Type::Location && + locationDNs.contains(object.property(NetworkObject::Property::DirectoryAddress)) == false; }); +} + + + +void LdapNetworkObjectDirectory::updateComputers(const NetworkObject& parent) +{ + auto baseDn = parent.property(NetworkObject::Property::DirectoryAddress).toString(); + if (parent.type() == NetworkObject::Type::Root) + { + baseDn = m_ldapDirectory.computersDn(); + } + + const auto displayNameAttribute = m_ldapDirectory.computerDisplayNameAttribute(); + auto hostNameAttribute = m_ldapDirectory.computerHostNameAttribute(); + if (hostNameAttribute.isEmpty()) { hostNameAttribute = LdapClient::cn(); } - QStringList computerAttributes{ LdapClient::cn(), displayNameAttribute, hostNameAttribute }; + QStringList computerAttributes{displayNameAttribute, hostNameAttribute}; - auto macAddressAttribute = ldapDirectory->computerMacAddressAttribute(); - if( macAddressAttribute.isEmpty() == false ) + const auto macAddressAttribute = m_ldapDirectory.computerMacAddressAttribute(); + if (macAddressAttribute.isEmpty() == false) { - computerAttributes.append( macAddressAttribute ); + computerAttributes.append(macAddressAttribute); } computerAttributes.removeDuplicates(); - const auto computers = ldapDirectory->client().queryObjects( computerDn, computerAttributes, - ldapDirectory->computersFilter(), LdapClient::Scope::Base ); - if( computers.isEmpty() == false ) + const auto computers = m_ldapDirectory.client().queryObjects(baseDn, computerAttributes, + m_ldapDirectory.computersFilter(), LdapClient::Scope::One); + + QStringList computerDns; + + for (auto it = computers.begin(), end = computers.end(); it != end; ++it) { - const auto& computerDn = computers.firstKey(); - const auto& computer = computers.first(); + const auto displayName = it.value()[displayNameAttribute].value(0); + const auto hostName = it.value()[hostNameAttribute].value(0); + const auto macAddress = (macAddressAttribute.isEmpty() == false) ? it.value()[hostNameAttribute].value(0) : QString(); + + addOrUpdateObject(NetworkObject{this, NetworkObject::Type::Host, displayName, { + { NetworkObject::propertyKey(NetworkObject::Property::HostAddress), hostName}, + { NetworkObject::propertyKey(NetworkObject::Property::MacAddress), macAddress}, + { NetworkObject::propertyKey(NetworkObject::Property::DirectoryAddress), it.key()}, + } + }, + parent); + + computerDns.append(it.key()); + } - auto displayName = computer[displayNameAttribute].value( 0 ); - auto hostName = computer[hostNameAttribute].value( 0 ); + removeObjects(parent, [computerDns](const NetworkObject& object) { + return object.type() == NetworkObject::Type::Host && + computerDns.contains(object.property(NetworkObject::Property::DirectoryAddress)) == false; + }); +} - if( displayName.isEmpty() ) - { - displayName = computer[LdapClient::cn()].value( 0 ); - } - if( hostName.isEmpty() ) - { - hostName = computer[LdapClient::cn()].value( 0 ); - } - NetworkObject::Properties properties; - properties[NetworkObject::propertyKey(NetworkObject::Property::HostAddress)] = hostName; - if( macAddressAttribute.isEmpty() == false ) - { - properties[NetworkObject::propertyKey(NetworkObject::Property::MacAddress)] = - computer[macAddressAttribute].value( 0 ); - } - properties[NetworkObject::propertyKey(NetworkObject::Property::DirectoryAddress)] = computerDn; - return NetworkObject{directory, NetworkObject::Type::Host, displayName, properties}; +NetworkObject LdapNetworkObjectDirectory::computerToObject(const QString& computerDn) +{ + const auto displayNameAttribute = m_ldapDirectory.computerDisplayNameAttribute(); + + auto hostNameAttribute = m_ldapDirectory.computerHostNameAttribute(); + if (hostNameAttribute.isEmpty()) + { + hostNameAttribute = LdapClient::cn(); + } + + QStringList computerAttributes{displayNameAttribute, hostNameAttribute}; + + auto macAddressAttribute = m_ldapDirectory.computerMacAddressAttribute(); + if (macAddressAttribute.isEmpty() == false) + { + computerAttributes.append(macAddressAttribute); + } + + computerAttributes.removeDuplicates(); + + const auto computers = m_ldapDirectory.client().queryObjects(computerDn, computerAttributes, + m_ldapDirectory.computersFilter(), LdapClient::Scope::Base); + if (computers.isEmpty() == false) + { + const auto& computerDn = computers.firstKey(); + const auto& computer = computers.first(); + const auto displayName = computer[displayNameAttribute].value(0); + const auto hostName = computer[hostNameAttribute].value(0); + const auto macAddress = (macAddressAttribute.isEmpty() == false) ? computer[macAddressAttribute].value(0) : QString(); + + return NetworkObject{this, NetworkObject::Type::Host, displayName, { + { NetworkObject::propertyKey(NetworkObject::Property::HostAddress), hostName}, + { NetworkObject::propertyKey(NetworkObject::Property::MacAddress), macAddress}, + { NetworkObject::propertyKey(NetworkObject::Property::DirectoryAddress), computerDn}, + } + }; } - return NetworkObject{directory, NetworkObject::Type::None}; + return NetworkObject{this, NetworkObject::Type::None}; } diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.h b/plugins/ldap/common/LdapNetworkObjectDirectory.h index 8e90ebde5..00a4cedd3 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.h +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.h @@ -11,21 +11,26 @@ class LDAP_COMMON_EXPORT LdapNetworkObjectDirectory : public NetworkObjectDirect { Q_OBJECT public: - LdapNetworkObjectDirectory( const LdapConfiguration& ldapConfiguration, QObject* parent ); + LdapNetworkObjectDirectory(const LdapConfiguration& ldapConfiguration, QObject* parent); - NetworkObjectList queryObjects( NetworkObject::Type type, - NetworkObject::Property property, const QVariant& value ) override; - NetworkObjectList queryParents( const NetworkObject& childId ) override; + NetworkObjectList queryObjects(NetworkObject::Type type, + NetworkObject::Property property, const QVariant& value) override; + NetworkObjectList queryParents(const NetworkObject& childId) override; - static NetworkObject computerToObject( NetworkObjectDirectory* directory, - LdapDirectory* ldapDirectory, const QString& computerDn ); + NetworkObject computerToObject(const QString& computerDn); private: void update() override; - void updateLocation( const NetworkObject& locationObject ); + void fetchObjects(const NetworkObject& parent) override; - NetworkObjectList queryLocations( NetworkObject::Property property, const QVariant& value ); - NetworkObjectList queryHosts( NetworkObject::Property property, const QVariant& value ); + void updateObjects(const NetworkObject& parent); + + NetworkObjectList queryLocations(NetworkObject::Property property, const QVariant& value); + NetworkObjectList queryHosts(NetworkObject::Property property, const QVariant& value); + + void updateLocations(const NetworkObject& parent); + void updateComputers(const NetworkObject& parent); LdapDirectory m_ldapDirectory; + }; diff --git a/translations/veyon.ts b/translations/veyon.ts index 781a75e3c..4d7d892bc 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -2999,6 +2999,10 @@ Make sure that the names of the keys belonging to each other are identical on al ms + + Map container/OU structure 1:1 to locations + + LdapNetworkObjectDirectoryConfigurationPage From 842269cd3aab8e56962a7daf934f508ab50bd421 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 9 May 2025 14:13:15 +0200 Subject: [PATCH 1752/1765] ServiceConfigurationPage: drop colons from labels --- configurator/src/ServiceConfigurationPage.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configurator/src/ServiceConfigurationPage.ui b/configurator/src/ServiceConfigurationPage.ui index 8c7015829..dcce5416c 100644 --- a/configurator/src/ServiceConfigurationPage.ui +++ b/configurator/src/ServiceConfigurationPage.ui @@ -371,7 +371,7 @@ Typically this is required to support terminal servers. - Environment variable name: + Environment variable name @@ -381,7 +381,7 @@ Typically this is required to support terminal servers. - Registry key name: + Registry key name From 52337d93f782ca7b0725ce8142e95c039b4d6cb1 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 9 May 2025 14:14:00 +0200 Subject: [PATCH 1753/1765] NetworkObjectFilterProxyModel: read object type later --- master/src/NetworkObjectFilterProxyModel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 7af0e6aba..d2defa377 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -78,12 +78,12 @@ void NetworkObjectFilterProxyModel::setComputersExcluded(bool enabled) bool NetworkObjectFilterProxyModel::filterAcceptsRow( int sourceRow, const QModelIndex& sourceParent ) const { const auto index = sourceModel()->index(sourceRow, 0, sourceParent); - const auto objectType = NetworkObject::Type(sourceModel()->data(index, NetworkObjectModel::TypeRole).toInt()); if (filterAcceptsRowRecursive(index)) { return true; } + const auto objectType = NetworkObject::Type(sourceModel()->data(index, NetworkObjectModel::TypeRole).toInt()); if (NetworkObject::isContainer(objectType)) { return parentContainerAccepted(index); From 7be3bee79a92a0533aa54e709ec06a34994f4baf Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 9 May 2025 14:14:25 +0200 Subject: [PATCH 1754/1765] NetworkObjectFilterProxyModel: use QModelIndex::parent() --- master/src/NetworkObjectFilterProxyModel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index d2defa377..8a3949067 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -106,7 +106,7 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRowRecursive(const QModelIndex& } const auto parentAccepted = m_groupList.isEmpty() || - parentContainerAccepted(sourceModel()->parent(index)); + parentContainerAccepted(index.parent()); if (parentAccepted == false) { return false; @@ -163,5 +163,5 @@ bool NetworkObjectFilterProxyModel::parentContainerAccepted(const QModelIndex& i { return index.isValid() && (m_groupList.contains(sourceModel()->data(index).toString()) || - parentContainerAccepted(sourceModel()->parent(index))); + parentContainerAccepted(index.parent())); } From af6f366f21ef47061805aa2fba8b1cf24753a292 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 9 May 2025 14:14:42 +0200 Subject: [PATCH 1755/1765] NetworkObjectFilterProxyModel: make local variable name unambiguous --- master/src/NetworkObjectFilterProxyModel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/master/src/NetworkObjectFilterProxyModel.cpp b/master/src/NetworkObjectFilterProxyModel.cpp index 8a3949067..0d698ac1e 100644 --- a/master/src/NetworkObjectFilterProxyModel.cpp +++ b/master/src/NetworkObjectFilterProxyModel.cpp @@ -143,9 +143,9 @@ bool NetworkObjectFilterProxyModel::filterAcceptsRowRecursive(const QModelIndex& for (int i = 0; i < rows; ++i) { const auto rowIndex = sourceModel()->index(i, 0, index); - const auto objectType = NetworkObject::Type(sourceModel()->data(rowIndex, NetworkObjectModel::TypeRole).toInt()); + const auto rowObjectType = NetworkObject::Type(sourceModel()->data(rowIndex, NetworkObjectModel::TypeRole).toInt()); - if (NetworkObject::isContainer(objectType) && filterAcceptsRowRecursive(rowIndex)) + if (NetworkObject::isContainer(rowObjectType) && filterAcceptsRowRecursive(rowIndex)) { return true; } From a175cb29df20678309da2644d34cb0f58c644d6e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 9 May 2025 20:45:00 +0200 Subject: [PATCH 1756/1765] LdapNetworkObjectDirectory: convert property to QString explicitly --- plugins/ldap/common/LdapNetworkObjectDirectory.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp index cfb70d61d..f16dc8ca4 100644 --- a/plugins/ldap/common/LdapNetworkObjectDirectory.cpp +++ b/plugins/ldap/common/LdapNetworkObjectDirectory.cpp @@ -130,7 +130,7 @@ void LdapNetworkObjectDirectory::updateObjects(const NetworkObject& parent) removeObjects(parent, [&computerDns](const NetworkObject& object) { return object.type() == NetworkObject::Type::Host && - computerDns.contains(object.property(NetworkObject::Property::DirectoryAddress)) == false; + computerDns.contains(object.property(NetworkObject::Property::DirectoryAddress).toString()) == false; }); } } @@ -244,7 +244,7 @@ void LdapNetworkObjectDirectory::updateLocations(const NetworkObject& parent) removeObjects(parent, [locationDNs](const NetworkObject& object) { return object.type() == NetworkObject::Type::Location && - locationDNs.contains(object.property(NetworkObject::Property::DirectoryAddress)) == false; }); + locationDNs.contains(object.property(NetworkObject::Property::DirectoryAddress).toString()) == false; }); } @@ -298,7 +298,7 @@ void LdapNetworkObjectDirectory::updateComputers(const NetworkObject& parent) removeObjects(parent, [computerDns](const NetworkObject& object) { return object.type() == NetworkObject::Type::Host && - computerDns.contains(object.property(NetworkObject::Property::DirectoryAddress)) == false; + computerDns.contains(object.property(NetworkObject::Property::DirectoryAddress).toString()) == false; }); } From 3c8914a82b686bae81bb0e04af90e125f47d0342 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 14 May 2025 14:03:57 +0200 Subject: [PATCH 1757/1765] 3rdparty: ultravnc: update submodule (1.6.1.0) --- 3rdparty/ultravnc | 2 +- plugins/vncserver/ultravnc-builtin/CMakeLists.txt | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/3rdparty/ultravnc b/3rdparty/ultravnc index e58859db7..493f12135 160000 --- a/3rdparty/ultravnc +++ b/3rdparty/ultravnc @@ -1 +1 @@ -Subproject commit e58859db74aaaae89a239e3da621a0493eaac3f4 +Subproject commit 493f1213556b3aa1589ce0ccc3606172fe24e670 diff --git a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt index f52a91ab5..4a212fc7e 100644 --- a/plugins/vncserver/ultravnc-builtin/CMakeLists.txt +++ b/plugins/vncserver/ultravnc-builtin/CMakeLists.txt @@ -10,12 +10,13 @@ find_package(LZO REQUIRED) set(ultravnc_CXX_SOURCES ${ultravnc_DIR}/common/Clipboard.cpp + ${ultravnc_DIR}/common/inifile.cpp ${ultravnc_DIR}/common/UltraVncZ.cpp ${ultravnc_DIR}/common/win32_helpers.cpp ${ultravnc_DIR}/rdr/ZlibInStream.cxx ${ultravnc_DIR}/rdr/ZlibOutStream.cxx ${ultravnc_DIR}/rfb/dh.cpp - ${ultravnc_DIR}/winvnc/omnithread/nt.cpp + ${ultravnc_DIR}/omnithread/nt.cpp ${ultravnc_DIR}/winvnc/winvnc/benchmark.cpp ${ultravnc_DIR}/winvnc/winvnc/buildtime.cpp ${ultravnc_DIR}/winvnc/winvnc/CpuUsage.cpp @@ -23,7 +24,6 @@ set(ultravnc_CXX_SOURCES ${ultravnc_DIR}/winvnc/winvnc/DeskdupEngine.cpp ${ultravnc_DIR}/winvnc/winvnc/HelperFunctions.cpp ${ultravnc_DIR}/winvnc/winvnc/HideDesktop.cpp - ${ultravnc_DIR}/winvnc/winvnc/inifile.cpp ${ultravnc_DIR}/winvnc/winvnc/IPC.cpp ${ultravnc_DIR}/winvnc/winvnc/MouseSimulator.cpp ${ultravnc_DIR}/winvnc/winvnc/rfbRegion_win32.cpp @@ -59,8 +59,6 @@ set(ultravnc_CXX_SOURCES ${ultravnc_DIR}/winvnc/winvnc/vnclog.cpp ${ultravnc_DIR}/winvnc/winvnc/vncMultiMonitor.cpp ${ultravnc_DIR}/winvnc/winvnc/vncOSVersion.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncproperties.cpp - ${ultravnc_DIR}/winvnc/winvnc/vncpropertiesPoll.cpp ${ultravnc_DIR}/winvnc/winvnc/vncserver.cpp ${ultravnc_DIR}/winvnc/winvnc/vncsetauth.cpp ${ultravnc_DIR}/winvnc/winvnc/vncsockconnect.cpp @@ -69,7 +67,7 @@ set(ultravnc_CXX_SOURCES ) set(ultravnc_C_SOURCES - ${ultravnc_DIR}/winvnc/winvnc/d3des.c + ${ultravnc_DIR}/common/d3des.c ${ultravnc_DIR}/winvnc/winvnc/vncauth.c ) @@ -92,13 +90,14 @@ target_link_libraries(builtin-ultravnc-server PRIVATE -lws2_32 -luserenv -lole32 target_include_directories(builtin-ultravnc-server PRIVATE ${ultravnc_DIR} ${ultravnc_DIR}/common + ${ultravnc_DIR}/omnithread ${ultravnc_DIR}/winvnc - ${ultravnc_DIR}/winvnc/omnithread ${ultravnc_DIR}/winvnc/winvnc ) target_compile_definitions(builtin-ultravnc-server PRIVATE ULTRAVNC_VEYON_SUPPORT + _VCPKG _INTERNALLIB _USE_DESKTOPDUPLICATION ) From d06ec6edbd67bc3f66866bfe729d8261f76b5503 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 14 May 2025 14:05:24 +0200 Subject: [PATCH 1758/1765] 3rdparty: ddengine: update to 1.6.1.0 --- 3rdparty/ddengine/ddengine.dll | Bin 259016 -> 259016 bytes 3rdparty/ddengine/ddengine64.dll | Bin 336328 -> 336328 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/3rdparty/ddengine/ddengine.dll b/3rdparty/ddengine/ddengine.dll index ab7a5295077e7e76ceb5e8997022a7096d0d6d91..bf666b7eb01aeabfd44a6d7897d51d1a502e26b6 100644 GIT binary patch delta 1855 zcmY*Z3pmv28vp<2Kdy~tVq%=clwveuuBawNE+u2e*r=98Oo%;%E;^w;Jd>g&2hk+AV$!0^GNITG=`5N3&+a*$bKd9qzVCg0zxR7D-}^q_qbc;GDfAs2 zh_o7g6fQOa4}c75Bv@n!T1yc)FKzf>;zb(x^WM%vkqHO@B5hxmift0H7XpB6f#-@! z6$P-A4dVH&+dxw>-ohN^*c42KFxdhj%!yeR&&y-SHg8-T z0NB~gSmh)V0M4~0991=jsbFc0fHyV%y%qrcA0}YI3`&{qDc1``Oil{0_icBX9s-^Bf46_kf=Wmj7@lSjWPP z;RgW>&;N1~76HQj(Og+H0TP;FL_?;iJf6MBy}g)PW-V@~4Cx7xG&M{e0L&KI4kjdH zVpqxgD5I1~>J0S@HHIdl>)C-0GUOFV%N8rs)Y+EdnX#k?Y9Y$_mN!X!%PNVP9P-5< zxp%p%(6lIJmX{pOv$;9P6t&pLn3SXD_ZtTh9&>YLd2)!k4)un_Uq6ljK~e}k;kE7O#m1eU4BR)||0cq0IDJi2<=ohSbaZ|r_QG4`QF)WlrH~VS0W;!{ ztUJ5D#ztUL%ESa=t3!`Bys&)R%c<$26!q}3m!8GChX(J$_pf?C>}~jG?o%Q=b8Dlj zwcI0dB>BWD{{_w3uZdr8ZcK?Er~g(`!PWixp!s7t?v>{Gfp+~ z00v`qI*h8**Wgj`ogw;+h_q1Eyx4f?hrHvO6?L&7R#BJVX`EfSui~kTM~4u#=j9c) z4mMNB->4T~?XHT>`ShJ%+36DUmjz)A-$IHDet%6@a@LL45&u6%(^pHKG0ujJ(fO=)hab!N222v)V85m=Q4>Uhe0vB2$$W#IFlP6) zU+QTwu!JFVN!bKsXf&s}=HGLqg8`9cY2(PWm!vd>W;vMmU`&EQY`1yYkPHXZf<^0Po5scp(!K^jYJ`n$uugR zLYCRRf*jG_|AQPRIekq?2T7(NNj-}$-Ol|rtx9iR;ah2*vAoGRr#8qcuKM9?vKhOy z&#+%Hm3KLJk?k{WnM97bAZwe4tK)6bpz7C8R`$Dx+ZErgKaIVyT0uDxJ=TGWDl&R5 zbugAhcK2ktWt9AQsU`Z_VWYf)#i44;Yd;k30y6zpH6HZSBDti}Re2@-;(hMcZ<}{Y zN0OJW1ym_>ryGK5ezvOE8K@YtbdUpx9CqQ_yku3boDrHPf9FT0^Dle)+ol;xPp z3&%O$b^38EhQZiI+1mCjyMd?YJEam#q${Hd|IR7z?jwSo+}fA^yo2YebqR;$Ybv@& zV!vztem;Zh6u?-XqaFyH?fvzZ_NBuvdsfi+@z1o*lHCg-bKEmWbr$Guwjn;p5Q>k> z%`f7tk8lyIFFjbqJN~d|sFZv`cJVp{8_c#s)pd|*o`x1jDOf6qy zki;hk*OVqHZ{1MbT&Ue{-5||v58DyAmgy+7SR8W;&J2?4h1I2h;l-W4HFmW!obGpI z`dT2a0SRRsaA1 delta 1755 zcmYjR4LH;78vpP$X<&6rZA3MLt?)W*SldGL=Ln zdOM0V^BGPQg%a;;sKpyLAD4V2yy@)Bxz6dF-*w&3{anBMzMkj)-OqhJ?J`We3{#;C zB5Sk!LtuT-9c-@(2lH{DSrtN;j#fH`p+E&MKzlP4UixACAppour>!a!5dc%(2(N6j zKp9~S_5%QHY+|HAtqmeW*z9z^G9efCG5HM)h0RTW0#{&H(@Pr5wg4a)JNgetptG|R z{%Cr~P^3IA^E^|K!WA%d1z`3;uD9Z>ub-EKX_nrM;pf4{W;D4h- z09beMJp?bER{p@?n;~Wfq+?8r7R`>8&g;AwUy@R3jvO_|HXt% zGf4N}jTfIbgZKv6artbDm|w;y`J`u*G~hodM$#Z6N@XJj!0L+a8IYKvy-0GlmROII zr^w&Qkv0Nb&~9<37TON0iUkhfupzNUQr{QFBy ze}8&BDu205(ir(Z({NF&a7f|A^vuBG%bgHIQ+<@k(HTa7ATf;SE1cu+efOENY_99N!YHXur8++h$;glIZ-xA<`h{*pjUTszpbCKGfEP{=zOq&W z5&miS#PLf-Gkeu})n9p!_eFHxtS+9=+3hsmYGVKKyB)sJFEHNdgXBB+>0htk!={gX zeG@Xa)FHWZsK(<4Q@XDrbWk;by=)chJLXx&63I?CT>4y-ML9-#5TO!sCA-)77-6Po zxh6K|skC5gA5*6*Hb22DYQcxq8XvmnFqAiF&!XhLYCmMvV1b++;xH|ve~4XcJo|djVn@@B!s&UlqOT^CBEKwc z8wKV#A1!Zu@T_rzdalETlOS{ z3Sk%LoaiTYOPeT!4$wmHy^qk->j{lsF%^&HkDz}qd8>=DCR&q;wnTdpg+wA!#I_^Q zZj8tOG5$pAkBZcgBx@vbD9)5z;MlrX!B0&{qMvekHJ2dC)t2pj143Nv=s;%n^V&I? z@u(&*PxoEJK)=4Yc~&Wpz5mheS2yMtHb8d!Ri~Wl>j<-v2D{hAFVq)TTqXY+0qUO( zs%u+Fqy4Eh3fo}4)+1wiNkw#S zEjrj;n!H#W)`EM9^S%CrXW%F~KS@t|fu3-q?uZ+>c*I{eqZNMs_RCh>!`cq_Z``+9Co|(%Atjg7ptGEAC>jQFLJ&bhZkELUXkW-e)aG5fk^BxH4R+- zp&iKw_yhNOM4I|FZs$K|hNF9{S#EXrGLnzFUn4gjuIpF!Ix&E=9 zTT!lNhCu5kawyrhXoA{s_js-}!Kv-2G{AmZC;uw#&h_pBl+lsoT`dw<6{#pF1Q$3~ zQ1EkNSmi^*YwkGD&ei66s}-NtA&r4E6EhyM{e@dD;Hozq*?CxTFaU$5>tXtuicrt` Vqzl_ddne#54w|xA`g-m6{TGWt4x0b~ diff --git a/3rdparty/ddengine/ddengine64.dll b/3rdparty/ddengine/ddengine64.dll index 4882e9834f3c04611e4511e3aa37b93e33827bab..45121484a99809650aab6932462e68667c801070 100644 GIT binary patch delta 59720 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 VU*owq6V3$$_gYq+@6eU{e*k@c5Y7Mq delta 59685 zcmb?^cUV+M)c4N76$F;0Ek)@?K}11BQA9yN7scLtH}(p#iw02F>)LK~j9n9JjE(4u zNfayCdvDmUK@HJZh-JUu+zaTN_x?K`o}NiH2BUEAthGXU-x5jgmL8B3KWJt)#&#*Nah`a<4IaJEC3#dK{Nu5(p5wNqiUVzWpituVG-IT}m=b9)wJMTFv{tBX#6o#PvPN?} zrH~lJlp^5I@8?wqku1McMRKAU3ei3gwUQ0SR{6(MN;GnhmK8$!O20T(&z#y^qsim! zS?{fNDTO&F(gisfoHM4CXfk{aVka5=MRL@a%qx{)(;ooy-T)5!{k9Mw|Il5dS!fWa z6&b`{;5sFjd@0O@Bwn9W@{3gdJSV5L0&QZ}0jYzo1+kJ=>!t>+?xxX1=NpVx24j*f zeop8q{~kx=x1*`%wEB--m`yx$J2}lHWU_S4If!)5{ove;kO@*#*La&PBS0wsD9v*1 zM=~VYbs!lbwQ}>esSo%7uqul?3{e8)MAlk&>C_q>5fW|@P_U#^$F-h z|81U|9}ptgC5yi-!%#^!j+S0jt1bmquS!lyO{#m7y;9HWfqs&|71!T8Gycd2l_tHO z!PM!WG?S2Z*Gdz8VxhFQdXTsE@#bwc$zrR8iQ=Ke@T11&p~+&(_laVDV)!xXe)Y(D zDbX*|j3a{mQ$XSK1 zoV^xUgK5EL{xIe(!^1f9JpStT<`kk#a}pcK!A?rMr9lF?9hA(FlclW_+T5{BVy!Yr zs;E;St&FuRAPP<8R>m@#ouqh_QWoh!s9V2F2`HX%^hAUB|1E<$`3BLXLFoym?RSvbO@w)nuLIRkJTyD^0F>((8>QG(^k}p2Pb<{62W0@;oQs zk$Oe=5g%zd<v+>v986eg9B}*?OCXqeTkXmC&l613{4>9Gwua!}W z?2tyqd_&quS7UlP-gkx(7h5M7#7h?aquj)L%_vzS&53R0(`Pu0cJxtL#5M-;MnQ^= zC#1qG+F117I_Xtx{V02T&MPW4gYHza=u7Q5q-6qE61+Z8Ukzoix1{b3YK2X8&0Oz5tG{!96L>7ITw5!24BskZrVN50RL~4@|K{iX%62_4F(#wQC z_}e;h66qxsCiYLT>t9yX?BF7_gKqD$=vxL+d+WZnCQ*E^+xvd;3zknBg+NOzMP z1PNu*1LW{yYIb)kvil4`fpAZ1nBqr{NZnKFkP^w1Qj-i&(#xb5Db;A@yOO?HYmz4o zY&OWY#~o|U5sT0<_d>Ic#IMr)PJc_@@dk(7CxkpbhSkba#{*#>EYz?88US#iMHHNG6^xc zhL(pYTq3*H9m!RxPwODkUdn3SgnTC*X&uiMqfHJp(xOu7!15~6m^L={XFl+P z*?|9{^j(_mYMhnlR%WbApmk(0MwttYIT$gr%glgJL z_1cG$w^E<>{^X4`qy0x1v1uKulk2$~I>ZpNT)NdU($8xgB%1WK-a-*fS}VNCl`1Q< zssnQUAl2xUTC>4hsySjX_6&yaksj>S1>Ky0j4k@}f1!BddyD>>lDKZsACT5`s#aw- zUNQPGE*vfT!!N0(*xHa)4Q61ebgxq=87bLz_Ny5IqOA9p^e6-7AydcTNQ=Iy%I9au zxs_fC#xauji4Jh7L+8;w#*MLt)QQdpQU6UVYw(iko>}i{dL0zB^Bdk!#E^B!_F1hE zJ`{wkblz5n(_wi9o3GGqFh>Giw+szc74}I!U26CYdI2ZtFmzdwQXH;mHBTEXAD%$Y3)c>?$ z!&hJ0aD7dsk*=Z1%iFN{?=R>c4hnis8Jf4@N}!AH@ihUuz#~F!Jfn2CyE9zGlJ1R& zL5k?nm{xv~JF-V30^e$DPk*viI@Pl(>hQE@Z&F)o)+-DPh%vp6csGEs2Da&*hOB%i zXr~<%&=7Yx<2mwKo!h4OFp??#%bQjI1PHMZBtPOEs{)JOj)S6w9?6PcuT;RNVAU57 zvj)TS#|k!H#m=h0PF1jHRji+iomhb#tYCMlSi-THCjGDqbXx_zSVccfQZgPzuhaXXyiQeA^l%lOR>Ay0!G3(C z)VP(3ZB~Ijtzhq}*xD*Kp#r;C!RD)2XBFGD0=sr-CeL`iihkWxsd1wU^jw8GTg6^c zvGppj=?ZqRiZ!d)$O>$41#3{TKd9Im6nLakmARLStyO{b zR`?{# zt%@yBv7Qy!?FzQ5iru1Ot5jf@DcFW8R#dUx|ML1P8t|Qh_Eym&RkUvf^9Tj|`GHd7 zHvi4Ivw|&Bu~GlcI6=W4R{HMll3U-!?y{2NFDvI^_8{U{h zRBWD#b>Uc}Pz)4mX3@7$u`5)pLj~_eg|}v=ik_yT9V^hkD`-a*+egLPR$wtv#MF)^!%fM9! z-bfSmx+YTfLH?N$U@dkBW*{)Bm`ySLcySn2if%XpR5zfI+u_E@%?1KX(fZN(YMpwi zxQ*qwI~6#!UY%6@ERILL4)Biqs#=*syh<>*j9~Q_0#OK4aV^S)&#VxR22*jh%5j4@ zqa|c7uWWgv5|ze|)7bNDK@bl*i@y3@su3}3N-2Ybyc-Qf)x~GLit)U8O47uC;pOtC z_*=>z97O(*HV;+%kaBZJp2UknpEE2s$d4x7r8&ExTe5a^iwOODi!WOQbkr%8T(W)awXo?U#YQO zS%yu&&QP!Ny^K?8SiOu-6yB&jS5>$UaCSe1xHP_kX{_ylS9oHR zIOLslbx2qzUYKWC7{OR;`|-3tPg_Ek+(La)qVxB!)oC=(tgr~;wX=lyaCrF>pt661 z2kZQ@!3o|t?R}}^&_P6!_7A=8I1`1_=yHAqra%}gtsNFvw+i|nxfP=e<<36b4bBLY ze*jr_e!4&AjFUhBFLC@uZwfx|{?glF$#x9^Nwi$B2q&cE;gMvSlrh{dd}2TN<0}xc zNSON`tIyc1_>q9nj2L-4M9Mk#_|q24Zlh0U>EQ5gUjOv9)@0g5=RYe!kxWf3XpRXf zX!&3%YJ?m2utp4W+rs@gc;}93;_>Ky$zdT%gTSTJy7PB0h91VB{-@s;bz23(xP!S zwG*NM7jK9s4bl1m(#dgt2%`Ksu1WB%i)ai!-<(9kq7PPH3-?#H)?oA_#tLP~ms*Vv z&J-b7K8dRFpiL~y_c)ZrfCyeJd{nH91j^qmTXJv$(&xciAZ!GLi!Bh= zBE{RNK-gNA+GmSb!|;5r8S6P`fi=ORTJr@SENYuZa>;4d{^d}tFSH@$Kyao?Zs{qR zKZ0K#$K@gWP-H)sHwg+FT2|01{9P2r^M_G*)Rht*}JBpNAxU*%c^6YrwjsqrQ zsb(;`5xlZz(BjrShM?MPXiczx+4As)MNcm9#{KO*FANrVZ4phwpyO8aV|u-YhtG3t z&)^|oPUwT_0xSN`UzjBYoy(b{Enwpk`Wm>l&Xh)E)Whoe$BbY)@{+RJFUqh9G0Bkk z^&-AJz>uvVlmNp}$>Ccc^0QRqTR*HoT727#{3I><)+gNe94||Xr@@%wWYOCv3L}_7(^>RnqlB)NKunKB!@{_Pgj+|;Xee) zAgH5#Rs$A{|0@Vm{mxUjl!Qu7TY9?!hOkUaxKr@9HZO+ z&~5yf0^w7b%3dJ6lR8h1jwrx;R-tWyuonqfDveS26{&=`1^(%-S%v-u!YaH93Sxz{ zcXA*}mu^gMs%-}-{>?~t616!}=oHDyOJgk^nBrCClZ96=Ex4@(uma%&#-GwH*n_A^G471H4u(c~NH?TiN6lmhrS0a^WRHKGt8HJTYk zZ3?8(Gvml^>F1fTWK!;ZvKa~EU839N z6NUGT0E>R?Z+uh;H8@%ng374kW(!V87Ds0d3=Tyr2+gXZF%VUP(Z`&-Sage&n=1m- zi@dO37(pmCb(13d9N!=IJ(m&tF z10m^7T*Kjli@d3>ORE;dk(JVo1uw$4oB5zckg16hYvJe>3W$gP5tc=1VImVeE&6Qf z?}a0&yIJbHNKY)%w~PE;@9yQyX~APEh)zpe77cW-?tgKDFQ5@|`yKC4ShssJG-1NUJXOB|W5uOJ|W^ zr9(?=lSjFKFZCg0u%uhogWBzsMl9=2w&xZs>q-#R_h0TcaK(MD^{oo!>1Kl1u}S|O z)DVCfvamyGVfsKJm?8H90St@2pGvSyezaX7xUWiBCO0Z0NKgrO%12a!d}-BkKQdAJ zV|gI?Bo!?Wp?Z>9v(N z91povKh9GKxj1qV_OXf7yfF}CO|AS zv@$>z{cj2%mtJ~|=a$Rg!Qa9lRxOmPDFS+8CNT;p>nVDOnZu%QEVWtb>pEI#AU?EH z_n?JPt}W7xl|EIQRKUGB9JcunNafEv(!P~7=+@0r+m-HtE^wxh?=7Vjxs*M>s?-h2 zs8c2HRZ;fU@rH5cYJtbmbyZ#cj2Kkq6mL1`Xqn3Zqp-@uX6hzhgR|1XRen(Hd#gO? z(oH-k$#Jz!?SdlJ$ob3ba+U7nIWFC*bmWhB%5gayhsChMXS*ALS(I>!)PHr2I{6r6 zh>Ri+wKvut;qMKV_Y&S@J=4U3=!@bRi=J24qCY1cSRKk^ZL34*jE%e?Rb==b5V-4J zd4A$vlO&6P3tXA(Gavv5AVQ5TN5YOnZDe3G>j_qR-o? z#DXis8)=L7F`&ElZcv)xE6JmNzgv|&9=O4zu9qM%xvVS=k$^nn|c>hYaY z$m__bKx`GQ4I$5@^tCbiVxUn|JMQXCgz&Bqj%u#;rJB3a-L>IC_FQml_%qyrD3jd< zO;qf_H)nWG{iK@fsyI8Uf`qaH*8fQ<;K+402}3ISqUlavHLg8BsoL{+z4|=!BY&dC z2tESEW7_3{ZvMyx#Wz(nU2k6@>+ufAf~flnt0m;b7ZJyiM4ied%vK~wKI?4~_Eq%2 zV$RO_2l1ltx>-V8xCnJ=mlgjAZlMNyVhskMO}TFd!#znFxIQj(33nJ_9N{nU!UBom zuKLR2jjTdTiSCdv6f``fT}3|9pZAHjZy8f%zOQ&oEo%i|B*ySl5EKZ1;4k+bE&4T} zfoU*A`-Biath=D8pr&ai$@fPuoIr^Ev01O}wShU5RZ21(WEXH@L3dAs!YLa>k%|qP z`Fx0?6vAAN;QJog!EFKIJB~V@g-P4BErv{7VS04pK5OJ%rX+t#w|=Z*dynU86k?@M zKl;#d>v&h#-h_(+o&Hg3_)|0Nb@v=#B+~lGDrEL^EEmPH?+YqvHbCaGxa4u?T2;JV-}z!;1E-`o{H zk0Auk^e^40O*QG8Up90MeGBuT?o46OH)Uo0EhL1X=S=!2Jm9`ALvZ9R-(0WE`$`l7 zIkth|iia-yI%=5}Uk_>Psp+uZOzOM67C9>|*dE6>3bxn5{@Um5VWgE5x+9P@m0Irb zjUInawMvn4tMzD=x<&P)AKDELBcl^D!yVV2Y+H_V|Yps@Q-F&yqo>A90_2K#ZH zKb`v~H;niX^97GsYE1Mr6kt!+ViAQ70Ez89jfvi(&_rsy=i7v9KB(Fse1sUpm`ixk z&GW$<#&3%FIJtrFJ3uMo8{I6pdm7O({7m|gtWv7WxeSivSivOyv!^$yC3V=FRdv5N zxW6OF2xm&34dtzw^EM+LO*&Qjdv6mgx}(g|_&dlPf*nB7+ze}pi{=d1)T*4X8u;YE zcNR->Y(#ab`@U18O>VV3M|uy*o)jk^*I6@_W&_FfCg?5BJ4%E1algd9Og6^fhp7;c8)F{h3Hq!2 z(fn9S_9LTkmZx);pa^mEEza*dZ$n2fhX zo%u|%&a9D$*+;5+O^Y4tuxo+3D4>k-^*O8Pk8{^PT1KtYdSU&sE|R$Bws{I`b}Tnveo4tJX-BaSb?PCVEv}v^J+;EbqtO%( zED&ZR%`L4#oEO}ek2f4xsy_``%{)30uSW`mL7;#lYKrT@9pN6BAxkFdUVJ8XfL;QN zVXY}X0CRwJvAtqmj6xl}KtHB#loR0S%Lg}eE9lK-HJmERgLZ&rURH<$0A)?I|2L)0 zeqLPOW+8)=HskHNTE#7pwm%<@>B;xSG4d?;(To1pq_NceRWPmGSsMB3m3IWZPqf)U z4BqbC5&g>AwUDN~4)ga{2{6p=!nad&{Tb|qD4fG9f&jTkU)vJSS;+wl9RA|G&3wU!`^zU0MFHXu!vHIe#yxf(Vzxx5pqxPkMvwuhKuuQRxlx z5l;WVPL>3~r7#%n4WJ88kz%3-&=DAV}Rp&W|ICy3+o-_^l{!&M zFKvOjrT(bKRifJtRLkx9jB@O$q z%H_&Po*O{~-XxSNY1Yq?R<$w-gQfZ(k5HG9(#MZ6a8l}g>O)#ei$8^vgVF)~eJ%Zo zzwadX&wZ%Ph};REcTtkY!U!1{b8i@ADr4H%+HDhQ?F?(#fnrTiEM-w zNg~JCPAk%gjA1XV$UqXr+FO&~$T!SUAd5mTtcGzejK^S@kr62WWkWQgw)6~!ZtzNr zB`f3wlA4m4AsbnNKzy7vXaA>ymasPh3F~$oRD9Tr!aSrb`9>idPd?bdFJ13$x}iuu%GP69um&F+mme4jNP**bx0O-aUkE24{Wjnsp(v)07s`AEWxG% zpMFH`TV{431-iEl(aPe2zGyg$zH)tL(vn&vkNvJC@Y2{_SXB4^AW4I&K~-=LdVxA- zUa(L{5*_IE1$Sw#z(at%A7+2)hfp@nk%Zgdj^WwxG5LVyI+A)sWPdu6Wuykn(vcwd zC;xngb<9#?vOK6VaiV<|znFHM9;fG~DT{M$Q{|NhUi>Y3Z5{43Li^gvqi_Tob4d`;1wuTV;ZEw3 zwrr0(nd4GFN(uD%qsppf*vr~@kba~i+vNd`TE(t=K%=@bZ%@+6rpa&0%+C7#NnP23 zI;67sdrz{2kXx)q6;hqVvG!F+7hhc-*9HHn*4T?1iIs(AA6I&<1HcFum}P+nE6TGv?}GD*`*6k+iF2?X7QGdKX^12nXTb>ul!yQL z_Ddn+f6Np>T6r$7#`B-WdvvaFXt$N7k@YwSQOISl0!SUdAwmD!D7N}bzL28~>gDF7 zK;lQpdNv@4Bodiz2qImmlYxB>B0Xu9U~|u4l0%@j4?;*Nr2%G#YUB-dU9pw--HnV+ zN?%7?W(&VCw=fdwpACfC+d?N!6L$m?X#xDC=6Ey44`MyTNESK6ir|iu=B!o?66>}U z+gatYx*2OR-Vg?2lWUL`D9*7OF8N}TcXC|*G!Gt%s(PExrd`m(*iaY-g5oMXR;4$HHtLN5-fIb=h*hwI5u_oR z!v2kb87N^swMekfE#zM&@lcV#h2jKT7k@?A4%WLCsX{)oNwqNeIAXse?Zhy+knseh{Q^IeN19waAU?Ej@V6@(rfWPH{=;y7}ACj0V$qwVb{{D%2tD zeQgp=p0S#dWElCDu}E?{C{JI;+NCd8r%yGQrhpA0j)g!d3C3ncky^B`o<&3wFLo}9 zgiuet`E3;Wk&mC{(WGC@*jTmk{pAjNr7_zY)W-Lhw_>rvU9;&J)V%5aJ5V$ZVk_TU4J^vyT7*s`_V` z&uezLK8e$x!-gp~pL8f?PCoQ2<6wbs&g>FPCQwX7a~qOSx0@%p6;#8@GZreUx`Q2W zNV+)Pv!|Mb>=zjrp6BHLCq7F%Z+l2ZMr*Snj*Oxh=;nA5;8r(|H>v*2QY(#mieJ>8 zFh7qcl_>d+y>3FnNLS{QKo*k?Y-a-5i!S;mkvw&;Rtb7DSLguG4aOVOr#JRk64}6} zq!^mgHi=}CE9`s{i6_kLm`tV$`aeGt&0MXg$Qc@*ROoF)wkDPQMSYEIVG9_hNb{8z zt_Si-z;DS%><{4L_o{O>I17lZ7XQxvWDkjLqR}ZZ86}&3^6$W{df5FVezVo7}Xl zYzVhZWHJ58eQoE&FU6f}4jMpSS&=@>{TuR#OlBXx!Dz?Z5K@!8Vo5_Vt^Hx1I0TwY zV%e&pf^N}rKu?kN)O}v2i3S@EVWB@t9 z)})iQa0e4INH4I{+wbuZ2!4_&VQ#ocAjIpZR4WBoK%^ew4M*0GQLkz@9pKuU?* zlv1LReX$vstP4G_3q7ansGY+?CXsrT+X3@R*Da=jdEg|{gjBBlo@fT^Y6~~a+a?q2 zuE^#+Q_xG~7qdK-%p-QO|EPG)KWzGRwD~KRJDr>)f3fMA=+mp_HJM~NK^HfiNlHiy zbNF{;H6cH zVhmZS4=)C0;*+y!y=HHXuAycqdz_$VrV}E9u%XLXF-z)ExroSp>YQlV% zkZM(Ik8x7?HnS1aR<{q1fz+bUWWAS=Djv5Ra|_zJ0=Z2=wq^@}^h{EaAr(kTLHg`u zhn5g8k6{Y-9|WjXxsw&_bM`k_Gy5sXBNfP@3i3Dpj%8kU42Bu^Bx^We=1~saU61Dl z;o)voT3dx-ZaD*#Twy4+FK0NXF!ZZnsIM?|QyDUK*|p0!3M)7|D;$v(9Mu$#(DE#5 zmNBpjhG`0eWqWym;6g27s0IJ=$jLz{eS>mS_5#2LPFj%sBbF%=xe zjd-4x3|(Ab!QS|#yaAYky}%rnL3JDz>|bX+C9 zZdPivij|;*&gWFHM&7D|M>F5$0IyTQ{_<26oXFAub{VgN6Xez^*!5>NWjXP7PEp}~ zWq%d^m~CE8{N3CXuxW+{0m0{cm27vh+ZzezM$DC88Q}Q`8fc+%dIXzz{1z#eDUlZaMs{u$oI0DE?AnGF=3u%qt_Du7!!D~#)%X7-E_Wk>d;qN)eHh0SN(AJ2V1i?>UJ$^mw;0M zn+Q7;L0nmFfjF_JYl(+bEo2aVBF+h-4?%Qo=D3ddhrQfTCc0lVM7OIDeH`$)%{$^W zNt}|^0oG+5mUHkQ*O5@GiyOmhPSRsJ5ZsT{)I}HovUE zKU^S34*&dlB*!*~U#{;{j=oxsZl&__zSOrX$D;NsbL}#$C$KHcvCGS`&ShACU{lJm zQ(3>CNTW>0NX#_H1uOn25Z>_F7XO~*@H!yIhxb(Rg3K?wV$eOns{y;^84gf!<*4P( zwY*a;`g}aGygI}QMD1Zbgw}llN zXKZO3g|R@+@fpn;ZXiLy%~26U+;y&Gr{q_BX}}lBSORN`wRxEkfMcL+<^~cP{DBvv zoN{A1ihEwkNnzDO2bWq76Fbrd`bp2+HMBB9PBYND+$Zu^#* zv7T(?CK8re2VgYFQ-nlaBG4Nd9r7YkMfouIQ8BzRiVNj+A7EvS!YeMqq`jm_O2c_k zleYdRSTLNb^H0pP0UHLIZ~=uh>F0k03s~!5GjL&nP!O*6G&-^?Klrb1!>+5@01{!R z>Y<;eLF{qiJN$)ar1J+a$2op@6bmi9?^g=8m=`Q7WH4*JnXDqE?D=Lgmds|ow~&np zCJS5P<8NT+w~`B9msWCXiNoqfZmU&G$nP`!#`gaVx4b`d-G8{lHh-J44D=+gee()-3EG-6_>G)^8WqjCah- zc9C&}x_r+Za!D1tClZ>2>(2`onF|AaKvGxLBXWroT_~~44#d~IG8d6>r}F(0iCP;!LKY!M^S4ud+#ANh)=D>T(o*2Ta@5Pl+_VIDc8kpz+Mu8XvU(w zBv_AVJ#hLGpD)Yw=RWL3JgLH-cP7r}H+xAcC0ALKJW}1saRG=CV7{g9MXXVvquv_ z-ybB#iujv5<&%$u+UJ=&9EN2iPuaIeNL*O>eqKbrCg-PBvJN@P)A-&QmR*sUG~zi{ zx#pV1ZXO{+t^Uqd7r)!)q1Gm0=4y3KysHd6LIsDFfyb7CYpUQyW#FhX@N?{SLP!Gz z?8X`#BU-297$zu;!PE^VP_WHoosW@lYTtxq9m7@b`mFJBQlEM>Hc!Bl*xzmR*-{*X zu_#|=c?IM<(vCGMMD1#^K7}N*_NO>LR@=mi6Z};*gkoLD_8#;puf}*ObGMw!G5kK@7#0pL3Z{8>E_*PI&Unf$;#jvyxXxZP3)c6vrq3{ z&swmgljIbc&UB|p0tsPlPa#15nN2u_DC;S9_!JrH(l3^mrlmn1631KktlXBxpC&&z z@2$@>gqNwm#S{9g?CEI|?>vNqk@xLhybP!0t}NyZiSzXac*bubu+)I&dUA^`o=tZ% zh|O@G@+q5t1}ciiID^G2!oO#+Xh^Qd1+_NpCh{HwayGR_-QLR)tnXRG2@2USXUR~~ zn|YigovB|88+{Jz+qaCJBW?8aCn}E5mm`Pb4S6y9a1Jry5$1sNWDLbrz4#(xgTJt% zi9UYP^7JS_sKLMWe7T=UX3&}g!-J4{*OAuglwe3n($*5{mHsBWaD(10gw@9s! z$2dNyXzkhzxX?%y%AL83YSIr^F@^H143?jOcy_1T#7u@T?H%GvQd!MA*cHlUhwqSq z)dyEAYvUn~wN_sA>SbTG5OPpUaj{st=W#q`>% zV3Ne@+=uP;{6?|8^xBU`99e}eFn1&Tk+L^!a@hO@Bw02FInw}q^jNF0g7H* z^e0%yhnRPk4^Zcwg%1(U9bsPg5Yb5Lv67v8L^hFT<_V7x_M*Oh+50CLx35^xQ*s<( zus@$7kaxyxkjWo}n9Y^`BoWr$iQS1NJ71S$Qfh*E@~TpIe!RLGYx5G*&U^E;mqd#X z4KeXAY_lL}^%s$?NP&6#Yhr7SIHCC+X+uVtZQc_<8uT_z@yYpa3*VRMUa>E61_)Rl zi~cf8{TF6z0~_-%b|faG@mVvF<^4-8WBQo?0sYvH1%JeRyomFRE!+(e9pxk3@{T&N-Xs-pHByIP6HVzXCgLn9E`kGG*-q_Me+ z4XsMZpKQD>jjnaJ5!{PeGtg$)w{$t#c&3^5@}Y=B=|CxmqSq@4>~|U2Wm_7AkpFvI z+6%Ky=gQRAbx4M~T1=3e8kAL}O(QnDGW9_ic|&CyPL8q*{B0Kdt1_+W(ycL9-`OWC zhRsA4VMiNMpN4Fx9b}JTCOZ`GAGXDghPZBw=hT-^lqoyvbd=q(iG z-*N#~0Gwuv9OyIxW2B`mz1qj3sf3;d|MRG%Z_v2mWXHud|R{pd*p9Vfsv@z0rXKLMKt zmpth(*Kb+@rkHVOK3kadjssX*FIolL2*bVTU~+_A^rE#L<3@bN+M4OA(3Z4HE!MLN zC^21Ep&MMTcT*+B%60e@fb;XLR#kLa2iBr0O(Boj!m9Ka?uvL*(IvcVIdKlR^0*zq zZh6zHJ{$Y1HEJv8*H!EzKPQuFQb^`9S0B28{Lb=xXc$?{9{SK=mlvJO%ila)p-N_6 zz7RB|pDHL;{w}&qP+Qr4on)+aFR#}vcBcS$kLVyD%QMv)kn z;78-hJ2u^q`gvRn1w9Uo@-w+*la0Sce~A6+M*|R{xavm@q%-sLr|~Xx2A7xWRj88X zUu={=ZB7odz5W#6v0+#J=@8ew9m=VkR4Q!`)-Hg0W9*I!pplMOs}VJd!w)eZV%q{} zhbl_~c_GR#+rTCd1d&DmZ4i<2*XmiVK#D`?tX?2?T#Bj@>ELoNHU=>FK~2DCv=Ng$ zmGNL~j>Rxk-V{iK9mfykI1GbS$h*o82BO!Nvs;0*jZ60c?#YOWjgD|ERwJpbQ4k%3 ziD-Qg4GLcXG(U-cYIagxNCvTKSmAhtnKN8ktKYsGT*5GF#W7X$~aV+^#X5W=#+XYDycCq0AwP*1-vfCP~;n ztmUrTg%6Z6}aG?b7CvtKLfMyY2fb4(lh6AeCs zacU56>O!?AlvJrMEG1tTDxAWbF02(cfVAh?r*<^VqxD;!aVIB(ahl9$8)L5$EXm)n z`1UjsYm-s!=`47FZ`#wu_D|M+vLuP~W>)WmYgSe#EceGCu>ilZ_+{d^55Ii;&f`~v z-$eYJaO%b%zqLq5;`tuW1U&oVx5PZB1MNV_B=hZ#bT)teK{m6I z-DnNln5hsT3QO6VZd6b5*`98+A-cJw8}*}zXYoxyD*VNw@FYu^Q+JGmV{8n6j5IIo zPCr^BQf2BxJ>Ugz=tJjF-BVV(FWpqHH6M1cP?7RlzPL8&R|Tm{uzu9HW=t|{bEzdgntLmb^4uyo<*M}u5JAD{i}GQ-^Dvzobfr5R z-;Xx)IGhAKoxyJ&uY?vOT>Fr-{KC%nqXB**ka8U`A>hz`Ki_W8kbT=r83b}oj)QMtV7>a&plTnQa{2r;Pq;;IdBFLe0VH0Rn}I>`%>ZXGhmqYj z0>Lj~)J9GJ91EgCxe17nISyy%qr!*?wHSxW7=@O2;HH|5Y=`pTTXgDa=dyEKy}2B; zf`dH96K68Dt<1Ft(4EBL@o4Zu8b;|{bMZjh(1x^O)ke_KRCm+NM$mt)$wRhyEX|-1 z*Vy0Ps0Z^OM{PnKUIE|u>5{%BL$({PYp1qjicQNM*YU|)M!mcvdD>)!80nH zNSnZ4u$=^D=*_B6q9FmXJ#lKq2VG!;gyodM2T{s}f?7j=tH01x+^^liX}gJ_DN zAOPh+2td3Wi&hi{)2So4i*ZAzH5)yZR&)DH%N;M|ibI0vHZI~L+cK4USKfg}2_1WjCG?0v70n?~!_zYCekQIdA5l{>L6te3X z*OgXOKizSsnleO2u|Cu24V-6cFr9YyYFEG~iap%1Rj%4VIiM3f3b}1MyidmhCQqmJ z-L)W#KEW>n-a5`H;c{8@g)AnMHiZ$Jm`U4PZ7tOB^Of%S$bi0eFzl;%Dp5R%J8Nmt z`ey81CS8aF6LV(JV7Hw|Awn$N@1b7G=bIs|SpE#^NmjBOGia1U4W?BcBqbW6b31I@7@wdl#Gc@pNh;&A6 zZ z@xlv5?Rj_Tjc8{!Aq$i6L3THb24%M7aM8hDc2vGqD#WSpR`ABLt7FOsGw-3S51ttp z5GVBpTK+AJLql{(7l6*99SSro*1err0I5wm;1KeffkEN>MW($f6Bh{*L0@)X z4od?$5c-9>Rpx7dw1f2_Hf}bpu3h1cY3Eed{U*2p_ZQnZ8>_sr%z6$@f|F#JL(_@h zK2+8?#i`gyG+3t@4YsKwM$wPF1&qUOvkGzS%#+!yr(VoqE)5S#$GLf2-@qwJsp;nZC$~4L8 zxQ4K|b7>s;k<}6DvCKhv5F-}yJA-!n`6MkPA3QAjmcM<~MF!kKkHy%*o+H*;CVi#K z>L!pch+q!=_$}?&GB^%1a-rNxayeCh=Q(h+dZV!=vMKLIBh^N*iSuY6rD^7s^XMq* zw>uS|SW&MDikEP0s77th9uti&#Wyz_v9JYnv5gV80gS>Fc6b5p;8-0m+)7Nt7eDlY zENCIZ07F^Ng*3*tC4|9z)HMIFkY*5amgyGLs*Sfcr~KZfh-nW6;osa-&#h@^0wM3? zV3T$lPZ#pEsKR@y>5**6VtS0)IJ4RkmVRB?9SP2R0CW4EhQR%8_&xPUa9Lmw6HlDL(g+$))mj>% zI$9&_cwEe<8hnd1litsPWv-<4;R%{o(x@(O5TwiA&J9{AU1;aE|}i^odQqHg#rH~^%Z{T33RMWHKjYeW;=_ zrO4Qh@2;-+8?7v+TsIiugK2xQ^Xuta^4vW3M`}mx*2Tb*cwiceWjQ~=s6JGZVy78{Hnd{HA8aJvx(M3bKlM01x{dZh*naCa+QYs22kdp= z^S1fH##p&Mzu0N=(S2Z5e?j==9&7yz8uT|d>KEEYx2cYDyGL;^E&4_5GDy4z18C9r z{ejPQ86I+yG7}&~Jc{{kr}e##r+l)s67Q#qa+>&OOL5-k^G~c{>h;Ij=i zNI6b|b=-!fED8%b*Ei73%)c!bOp|5nxGT(Q2ldkZtdf^4+8(pm9kfP+_8j|_IrL5Et_1!^Ry5%GHJZ}tGtXFm-4RgGU)!d0@2xDnG zskhr&PT->wEK~^=v8f=SHyCTRlU8+0{^!g3C=zLih+?OAVxhN?m$hu6_xtx6%~z{4 zJ!e7~i|0#JCW?pb^}iQqExwX6A5tou#T!^H-gyl$_6?xOm-n?b9r(AID{l~g$*7x10pHho#-?L}MiwcA^XjhRYA+`i$Qe3jQ333Zj% zk&)fh+rCQ~Xvo-*m3Ub9iV;d5?br+3q6lCd-w zF7n7%TrBsn1|XH^t`@Bg((=oHxi6wDh3&*^`0U0K6itv@#&8b48-OP7Q}LAuG*SaD zp^7RYjLS9Yt8qaaxFF~UA1h_ubQKNE)4lP*ARG$;vomL|sxlLmnR4c#Wz1-k^(qse z@r`^vE9%>p@CAQ7sSd~ba9#qqvx=I87h+*>sSw7qlv)2uBZ8~)H7h;|1a}Ze(qN|` zYxH7XfQqH=GS=x=8ml!2z`Tw$4EO-wIhQT}l~!$nYmQ)cD3w>&g>(dvtS!m>zhV%k ztBCjNqU`(v-YVLm<7Wp1Gx`{!3Wm+WPkduY6ELJeHTX%pXo9o<7ioK|3hMXQ7w z#4~6qp&BdQLr0VE+0ebTgGW9lTZ33)!2gVbB9m|J;WOh?v+UAd%-Kzuy_ses4z$n= zUoM#aZANhSDXX=QW;z^1Ti~`}^hJw)n>lYE#T}5j?C0Oz!wJc1kND}9gx7iJ%1Fh zn2N>5QMS)qVW$x^!-OGfd}T~lk^B##I~KHC#x)-2#JvO;dNg{Lvhcd?_V5%9}oZ%@-?98HWnL%n0}T*cJMzk28f9=;&GbP|{R z!K|zSjM`5w{M+uLeh=u<#6t?{GdAxGtzw0uNHf!1F@0OJ{4-csAX0mlTKMA}9E>Vg z%yrLEYl_Lg!3E6l+s0#2e+!D{D_^TmKO1?0w$PV2Wt#3|19ug}&jo54 zNt#>79T}%H#Jw4}f-_8EE>~zXy7 z+HjR##%15h*YNf?TX~I6aeHiostq-WuhYcWsfRvSN;5@VWZ~DbZ}N<}-9RjN0ULFL zhJ_8HywKKiY)_j8y6h7eTc~VX1?V7S>!SqgSY4<^AHni(&>WnpX?7Fd=4|%uO*+Ni zewZ?XD|4^m<4tT<{KDGaqPf~(9OSx5ZPSz`W}5sTCiJ1bS&{_t?nZd^qNh+k5QV>ez{M-!~RR; z1KQv3!AYFjDC9>4{kWe{Q<-Jux<4uZ1BM>X)&n{bS5s;{gtxhbwS7pvGeg0GRoS$Y zTn}3M+LPk$~8#kmf2R77&dJiBTa5fV@4SNDfjV20)&x5N8!K z1dx9Rs36M;CHpY|m8g&xDr6!cPgKY)1tQMi9TKO#p#qPqK;>Lvoc6Q|+@%7QrBR&r zAZz`IhNMnS?zCj0H_|7-0`;Hs+DzrW5o8$|;F1qDY`P)tpnamFceN}MrKQPI%Ua4Ib8 zkW=Q6sOYAy8Jd+Pb=5SiEU~n(tk5hm?S`ghX@x^+rulxKz1H!P|9k)UzMuEqpU;o) zv(|prwD;O;4`=TMSE60)e|%4m`Yr#%v+e>H!{*{2-S>qA{wf0^7t9?>=eFs$ywi=f z=iHGMPjEdpzaaiezt8PE&v7Jew7uut;Q_~z7*`U;A7C(i%!#qyA!hYw^Qu-&7=LWx zfs7d)YIP&&%*hE$|KLGp8~ej^?tvWJ5$E0G12ZqN=FWuid<_;j%YKrmO2HD*^RdJHW@%g}1{4BCJ;Be(LX5EO};q0Xoe8ivN9 zY3O0J2(3cv(JSZ;^d92hd$m^sT^^N$#-NF4Dw>5JLG#d)C=1zWJ$eDJEGC4bCMS^H<++AN2&dzaaz8Hu8AYe$eH) zFK7jy?(|#wu`|cq&9Gzn=Utu;EZ3_1*UNcYx~jH*k&I?V|F$=NR^-_O{3D=qbwBWn zw6B-cm}`uq#Vgd z={oMi_Vo&$VZ4kpxT2?_>#h7pDthu=u6y%a26zfwwYsh~EoG?hDL+kx*@s=K|3dnG zrw#eRl{~v$+>U(`f45+hg*` zq?k709Q`Dreq2`6_X}cuzxsjUp!cDZy*+!KCnbEg7#%Gs=6xfh%HFe0CI+1go9X0r zF7SRy!%yhka#F-c7rO?H2-wRL6nSXGmkfb#A5&h|1lM{UM;Q2s!x3Ncl*f56gkOm~ z9GdUMCk6J^>xpxG3T54Jy-xh)$Kz?^dBfa*y4G2*szmMVWB)r z3XbN@#;6caY;=a>ne3P8(0N=%?xV>yIC`#ALU7Y;drpX_e%E+iVACXB8F~733LQpb z|45Rs6JJUhNoOedJHoAZ6Q(i66N8S|inqTG@pSIK*KtV>d(&a?kE{x-C2k2pkMXo@ z<`=Cd23>2~f%@>M?bjbJaBnv;Yj$mN3tamJUzIXHjXk=ur)rBF9omWK*>&8_ox8K_ zB;J0LSk1$g4t|MZe9E)0hwK+Cdm4L365fC9yG#3jKi;&C*uOVxS`7v*=*rdK{zJd~ zM9lu6MO>1y?s!;V@%bY;`g85udL)$%TJV%!8`#N-JzlG)@Z`)(uKg#E9FXT*h5L^k zk6wWgzia4v8;q)$}+p5UeAkM`}INoOJAj3m7@V(WU-#>zzZh-qvU3j_HE@LzufWf9Iabj0FZX*aBdb5xRU2h&FgTUQKbmGf!->Cz& zxBRn9tm3Md)S>U~KbQ0c>)!M$uz#xJsn(^?Nt5hXBs`Z?wEvIMA5nqmBBzAlre}3Y z7xrIDIzSnRf4U9Xu_R&rQF;h~v_TkZehc-WH93H%=O-u^?^n!aX#7V4?yUydkxK^Oby zP)~!-R}VX(Fv>c6UH0Ga56t3@PCin|V&@-V^{j>%Tg8xGa1_J$wDVhgP?)EF+x#5o zDaib*f6l&3&bF~VmUs8S7*2&-s7=q72YT?`MdVxTKQ7tBV{T{dT!aOwsCy*M!{`qF&E2|nW7ha{?&4`$8cBaS0=$&`RR}!M`Gpf=epgs zs;5@uXcHI72*kTrg%tI+EpPAgVCoCzU9=yo>Pfw0GFxG0s63!evwy1Uxzk;1d45DS zPbC+(J~82pfd%YjD3m-Cy{@HBJr@G`lk=W*WS`bSOA zNM7n~U&}K<-tDdBnJM2o)$-JI-D}sV?TM{3T|PbFfAg_%spLpPXFuq2L!LYZaD6-2 zp3G}iOg+=Lj%NptAtF7YTvLZddfHWM&`7pZ&#idfq0P;V?&UnZqJ=fOvbn(BjL>|rt{%QBB?`aYKKB2zLEq~{~ zQ&5MXgvN*X;U>>sS>KZz*_~HP^bZ={1LPMC?px(67v~c??gXOjfl;2r@~UYxn<6=X zZ?vbpdqmXP>+;V5_~l`VT>1TQ`TOfU;aid^_E~Lbh1ok|pHJ67U% zi@khFq}W^YYc=v*^0=<&hcxwEtPuESHlM}iHNPQ0ef??&xAm0Tv28t(Z^U^LtqM)X zt4wOHvg{EZJ-upX-LHc=Pr03F73gu8`Mo>SK6%0uS~KP~?a^_k_Q=4!y<);Gr>xQN^Q^Y?c0+~=xr zI@woh^DdrhU2g?VF_ATNvI66lI99ud8)l^F@B+hJ`^hezX5Nlw8y!s5t9=Zepu>@7 zeR@rueS!&}HvT?F8h_t5FE#$L#=pS$UpMsE{$3U8bEu^YIDMZkI6h6Y(1f=d`U;4z zt^NItU-EzOFEIW`Og^!We-)*6n}|)mg7OcVH(lNaO6Aa^<>i9ep zPBcvWO8Z5ba1+BKQ(odPdi_4b6vO1BPJBhx(U&lP&b^*qp8t3(6jX3IdpsvrSLnP6 z`?~P|Bma3U+@8@{Q((V}x&pz?bp^6b1u~lHaJX5Y7o+`5OI1;{4kxzNtl3WUgb5$4 zBw?>oIaT$FT*HE{I-Fow7^}m+3TAZE;l*wK8t*&kru5PAv3F^1uBNGiHGQLolON@) zEYq@9re(1~dU(1Vs5zv8PMCI=ZgHf)j^Aur9A{dzFHZaUn|wC8wcpuFng`2iZVfaQ z`O}rjSBXlcw9py*D&T9$?G-5fFDsDd>m$Lsz$VRgfu)@_J35){l z=6@dFF|GBc-7!h0-#1fpb1NO6d|SM){6v$^x^4YwlfKxj-m%Fg*85ufpO|V_nBuA9Eq>Kxlc#xmvdvp` z{6SOP?dyGE%cRdS)$rxJ%NK9TVb&U_nI_+QD()2>5p3F(Wx~r|)A3gRfhnGwuC5Dq z>Tr6n9*upRyGO_GGV3qDr^7|NG-vJAOw6zFfG6Mm9|vb&gTg!L?dcm4b{*IGY&A?i zsl)z9HS-Q>#(b%nQKIQP@Dn;Z`FYhQlfgkl-|xqKIqLGJ{H8PTwfuJG=$fnl+cDCYk8h0hg(DdwWr$3l z@xXXs*O~2k-0K^4c2&{c*|$}Wgz0e2P)$`?bAe$_RUO`E{9=q>E3-b$xZEtoX0Hhp#a{mUjOC(p|jD*IyQQ(HZ`?-6f`)-Vpz9-Gy`KzZ;J87MTODldf1v zxGpdzLi4f-7n_RIH1WO$`Iu|AR4e26mx~NJcL$q<|NB+Oe}9otY$|s9MMk8F_f|ri037K)txif zGoan=7vl-t%yHp+R$%TT3U80MU5|POl)0@O@u=tfJG{F#>Z;K#^z!^)!@KvGmKJFG zE(CqdSf%4n7$z3$@DxK|wnKdRzOL7I)U2nX-q#T+hFM?eu&;n3`{a{6h42M^`K|Ni zXCjhK*ymSj+I7${GQZst&+w@sR~zdmEoTiE*c+~Rs@;k%^hM_%xZ-)luj6~m?oE{v z+$a&H_OeuJGkHTxDc`yP>`=6Wbvw$evomja!Y%R2Uw6ZEuzB!fH=cOvku$6NE=Zd5 zQdo~3&)eJ%OlcF$On7(AnvgLoYU(t}Hj`POBB3uXDmGT-5*Huji_1_Y-SVr)T2(!P zSBJP&aTWe82@CVnwX_=dE||ls#zb}F6d=)CNh`~4C})L2DDg+2tSN!gpz}~(8M|t@ z%ih+~%6CdwY)aT=&u(S)tt%y@5Vaj|$tjpAuwHeRYWaT5GGG@NjFZv#@d-t3_8Su`tx)w?tiHx=A+IWVaZ~F3L8{h0>-x z6W(PnY-4>EBH84U%{W#`#S82SZLRJ+lYP0Z)j?{De05iDs_OL8O6TZ-k#jf>eeo@vr@@u@jy$}^>Zt~A%RZ# zFmc%uhp((J8+OvzXWCf}!-C_LYKG1mS0`-OZErOml-X6OGbm<|&ZTTPBGOM)ZWXR7 zyFyht4wD{iF?lpwmzP}pXH`?VJ(T(lrJ1xkY_D%`wFu+KW;L`g-P5dd!uFZ=R(*b2 zuh7A&Xka5D8>sm-UXFJR) zr(y>x)eYtJ*Dd%Ej&@9y z3Mo>}H{t8hsT=?5rqV?#-4p9hl=e_P716Mq3QrAIp{;_H|8^@~`q@?Tzn68AMv?CU zo_mR1I@0;C95l*)yrb2ZP4h`ds|NU?qcx`PzG3n^KDj=q)Hf)~)U5eK+^?c2dr~K> z&OJW21w?H`9gN$1*q@XMSEyc2Ri{$bXH+c-O|Oz7>7-G98FWrGoOC~B*k5+C+K2eo z&3ss?4QRPtx3g8FwJ*Aes4M7Ak_apC|E;Wg{EB9>{QIN)2ZqO#y2kqU_VmtHcRB3d z=xnvAUAc`%#Zjs({pV>$RCKF~Ey^Y0Q?ZLRv95H5&6D+b))fCUEA;029m-P4UfIR! zQbF8`aNBAh>teNaf-(1dR7-noSF1*}tW6{++j$z9$g(F_XVhkc6I3JY5%E?-XB^7F zbrrGVKFqj}GpxQ|yFUbFi&cJ3hdV;?f5P4yZ`B_qCFYtEUo=U#8xDA0yFLwN*#{-7 zrkk9gN`MmHVZtB3p#96gsMj~NyLPpzRFWbJDMFTWtL^IXR&}SLrKZ?ErnnMQv*=v$ zRI0nZfo;-Ll7~;x+vH(frSi|1B!}20621tXBpY>j7?helYQpc^u5MPf2+1m*tg1Y# z-8w>9*4WLvSsiN2(ZB~vDuT~Kt#KRyxTig!D}FZLUee8K;gz^7;-u7uOerbcMGumt zcB#&`9h7Cf3D1O5nm!3zVYw znDAjJ6$+6C%+n1hDN{hkO}&0Cl%=enf4WCC`AV1dvABEWoy|O zNyJN;X}4{RNB`8Wi=ZqoL8<#zyHO90N=ce&k|y4kH2vVFFiq40!w7RTw?F1!$B9tY|#6N9E^t4(!rCl|p zg%@bo2kfyut?o`=h@7sQ|E}qgpBh%%sa*#{Sw=!>{wF5>f(b`Nlv5F@6&QK_<&2Up zEl42G%WpWz)PQ`QPXsUHmUlIC&SxoP6cJOd4GDutSV@)J?skUkbQ1bb2`5cO`n;tx z*au~?>=Acc9h@to98>o{jcY~I_wwG=N#vVKS&rI!@3vMrBU}MV&VHs>M-}PSc~F{` zpFh2qRo+!mnouyqqpthg^AfCX&SpAGST^!3Q$!||G+9u3a4wWRx)oZm0Lm5M=dc|7 z4$}A3@6aCxFsp0@SO=C}8oMM{CJlm;{yCTHE++%tQ*tsm040OF-7Y7C*{~wv8y=mo zp*_8~RmHi~44$d;u4S+6Z8ejV!F#=}26ui)k#aJqQJ)tNSk6LcVcHQ1mpL(1?qdxb zA)6zGtYlqzCUDGep#6S;vN)rGxt3UrUunFFcTRm3Ri!}{(<`L-bE4s+K$FiD>hQX~ zw~sX-M52p{et^%aq==X8x_vF~B8XPAJSv!ZjU>9e-Mg>zytq&8LlBPPh00ipLcwsjD^7;WbeFLu&e~nyD4-75%J0=Sa<^60$U@qBBmg zxAn8Cjg|Tpn)PPzyv7VlH`x9)2% z#e~n+&EIA=!>4d;Go5TMlqKJUk3fmJ*3AB>zct8dK|JYYNo5ubY2tFb`8`$*XA7s9 ztXr5GeZ?>@E?1!}A>ncrcLzg4Mdd%ka>kM@lV$*E9^m^$@m~QQf9@ngTUEFlRYHFoxa{~TS5wu7|mOnYFWIi_M+_52te zeaxPdXw`SFWs*#a;sJV9*-MDThk47?-b)V71xNmGj$d{p!j7#Irltc;$O1|4z^m#IKODH)u8tkvhiK?PkdA-`31@{ ziy1{Fi--=om;ZCjXKtj&JSrl>QWaYTs*0=1rT4IZ9c(?+S!$fiDoIv{WU@3fe2Mq0 zB>o2|%YtRPrW>Iw7na$t46&-Wl{^Yf9+OBbX?)#!-zuHQWhhJfYMsZN)h_#y9#(|D znS$>&iN>2m)9iLbt!BYti@e6J)$7xtEXV98DasjX zOIR&S!5Z!2F)kth;%d!5)1$mkX}>d27VW2t^j+1(;wRNvMb%I7j-lAsp)BQdbeQJ~ zT+Nw_fg}>d*v*Gq-JQEMHD9Nf6N)TvyrR>54rK}9gQSXs%Eih~h%vq&Qr5_qwcl7M zOW9`^iTJIt4-L1fIG4^D1ZDYxiSwm;r=cvrK(Uz~( z$L;1x<|3*PH(6e{2PRn^oa?F_{@g`0&^dD?nOv@uy2Eu{*eEE=Qu`Q%Im1P!af{$TuE-L>_f^uop-`4b?TBQnMlI=a zn@u6Bc+Ms+A3|9U*#mKLI&hK6?HN<$SD+O6h6xL$oDZPf0~|B)ITv)rc0jSdhT?Yx zieHF*AlaO_ubNuKGO$Z6hS(KGS#@|e)o7HtDu`UBn{xPuZuL)4ma<1r0zQ)ZDJl?Z zuN-A{cbb@PqR*RprCiimtgtVPGFJzY%RQsKYrwfvj`uy~bD_>#SCto4u_GUJ>hr}sFkS8r)(+-i@CWI7}%tud6P4U|$tYL=7x zFcr?-M8F__=guPqfAO6`jlu@#ba&au#_<4O9<=3hdtQNF7k)T2_SPd<+&)8(kwoY! z&t3mKPog^(Uv6>&yZ!TV?Y5yjWk5k)JnGw__OS8RjA+S6D)!a=ZuR;Uw`#~b;g{%l zU)cU>JkM^#RT|vxakn~zPU9;4Ba_)I;Wfgtw4CQw?T{}V5$vym4+oT1Eb%WYSHM&B z6t`1-DK^mSRxMC3(h4Q~3Yuc_a+=f4X^#E(R4&PU_1%{4R%fQ`O<89KkN=TSHfeLLo`UGpO{#8OYr^SF+W)r=!%&p!a?m{Vg=d%Ep)wQ z-TW-K%0ac_Jq|-|TmRr{zSlz?STBpKs->#73Q$#71xa3Zvx%19t;g(5*Sgh8bU)4~ zU`UXqf?AbRK`rh`_ch|e8a5~zXiu7GwY_z8?Og9xd(c38+eAhNpZ6T1=1a7%_yD&G znBkZBuX0|yiH?RA*{=H-lYLpVdVymWZLk~NSEj&Dukx`X(goh~eut>f|7Wz{Yi`vV z-RAu$o=Y9?ukW+!+{)ye9d1=^Cp*9nOtWg-x^b{^qYBfZn4GFxoKAhT{1mH#-#fq${H{l4b; z7wTc3q?}vZr}1e%5JjWykjYkC3g|uAsl}wp&d+VjCtEFv+&kH-ax2O5pWW&?G}}Hi z+3FJQJg%oZ>O#x^rH9S`)vcDJr|jPMTa6p}HtWZ~u{o}wuDT~X+rqU(l`FA|+y(NJ z*0c9pb)pM?cdHuL==AgT&vRwN5mh+IHj3*>a;A!bQ>-qa{}ik5t%Klj6^}ZGUZfo1 zzuGRNLU}TR`2B2(lqqB4C68J{i)7e5OwzcjdI;SKWtnP+Om%*0YdY2HP+8i~z^Ec_ zUHID%PqiBGIrE08R+ZN2-TrwN+0@vy_tuYAe34tp`pfA)hj4HEhpASb-jZ`EIfvA? zRP9z_s`5qs_^|*NsoQ+AmPP(ajx1%btIy(-N4)q&*ei!wRpeYZahla&ROK=?`tnYl z)S_mNYnhq_(~Cmt`m4IL?ohQjt3+^C2^>_R#5oJGPW*p0d+;3p?N7or?H{IDb)=|@ z4_FQA{X@1MHCrkF43Om)!ZOtT^R#FWdcdmJ+t)FEjpgLl+@n^QmQ`?$w{r3e->u{A zS=JY!0(^v$pKr;w-+6%FLR0PL=~flHX1W#1r`}>$$R4JBQtXw}S(TD*#WDG(tje}5 zduzHC%s;={Th_BwdzRwqSv*wPUY8YS$4|#`h~vl%8xy8mBl!S(?{t1BFOp|Fw=LQB zjp^24{^jq$8CDhXpF!oK>}@)I?OJh)}jK^n!$r_(Fae*5I(HyX1uY*CpGY$|_#5*qgy-i=X(fJZ@yr zD)lc{jhbWi^%OtqURgI{?Gnr1J~+p!84=IVE%M`iDJtT}|I+>_k!Kb8u7|BXt-YzO zm0Ff)sdU(Q6NL}5yebpJ_pXF+UJok4`whasp(O0G??lME5l!z_DwB9&AC!%q2&*J0 zwF$fIdlK@##2HjbywJZNmBS8(Klb+aB7yIDv#=Z_a4At=+;UYAI-N#|5J~Z)#urdd=#D~JcNb(s1R~wr*f)`|lSgII)%7Gk*EeCX6Ubc|5QP6AbOgJ`~9~%)5eVA=i(a#GRR1crV?Z5oKzwh_Cc~G`oY!c2=UplLJFH2{{Z+9 zDj_}>o%(~!^WoV3FJNGg#8i_s=3cODMpYGC&uFPjBpIg-Rf#w+zsDl2e02u~xa zgzyhzx0;|-3fh6sT=)r+N)*8xNVbaqL?(blQg9UPgCw8bkWbpw5z_Kao$~jl=@oo1 zrdf3==VYab_yOC7lAPkzM3l4{|ND7OCev{dv_{2f~`}uKoD3yb4 zk@$GyFrGqEYre%)qtkV*GoX#cDF@~odl$TfV#w$+Oqj0wO(uK}iGMEKW9;iNhKHgO zFT8*PNEkJt92o1vyhXawM9Re4N?Ij?_vt~suEHt+8Yh#zd___K> z5vC)_NVve*!cUO2xCm~3l!1tXg%BzpXc-&uVcjNfQpBsP#y_V zV8DEaS;TI|rvQHN1b*0s@C=elL@j2Z zTWngEO5j-}8Rf#aQ6UL-!%0uFkFlq~VkADo?pz2?xEYPTLVitY-g9kFAN(8A&DL;eEzVgKLn~GzWfW;)`HlHZ2>$P!0KL zR9&Y4Az!FETY?WwRU0H}$!VNjPHGEd9enHXzK9yB%pVoF9TyAVWja3glga5sj%7CX(Mk3=s-`uKNf76-r zS*+@1Y`)1=d|&HiDtzC>?}PWO(nMuV{ba+AX>>dUG&NBS|bAkf#esgCC=0T5}NAc~!?p!tqG_=fVPG z7r`p8>3F`_SMf;peLt9uq!Pk|#uhgHJNsWwyRm<#$0D&aVa!&Z6H>5n9ZDl!_!E-W zm%@(Qv@Kj{?8WdCB%|JGSYx~PsR{ccsnA^b0g|$UU+4J0_jMhZ1>ZGx{0@FQK$0L6 zzGCb=_yv;I6vHb!u}3kY!M1Pcc=>nOD~z2BkLGh;z(@Yq_a!uohN)e=R*Z7IWOM{W zW;st8&6x@oAgNsuOnRG25HFl7wzL2~w_9JH=fWHBa5YQ;>Rsk?LNXp?!s}=OX@zI@ zC@v~2br!BFU}VHU8+!l2A33v?z&H2N0ZFhMw%X5r8)G?a`=Kr@4jwAx7*CT=fU@pG+-Y*QN%7B!}Y%y8;WNuSnY()GaOF&nnvOy{N!u) zzjN(I;EiwC4eXm;@Qo53zYAu3OCq+4aON4EcoyvSoxYMufPed*vm6y&2VXp^55LXu z9Fh)uUgFNt`|%O-6}LJ~o+)08y+{rxKIv9(lydfyO282p^rd$)TzHYI77{Op%`S0D zPUfhAMVDzAwy@Q&`T|6F*A*&<{{pz~D!Yurgu}1VKiC~fF#J0EKaEW%M$;QQaV#A0 zr&5_@ng|O~37aeSCIz7sY+;FVslstw1Hx0>Wap8o+-%qPb2mZ5tRG4XO;jD7Z z8pC-9dez$U%w|K6&4Ig+99sL}X=7i9=XrXUF_z5;%U5uzbPD4mXw?#lKi@SgzDagA zwQ#kG=TmaE$Jl)5uFe^oZ`@V2ijvk#>oNES-AOEb$XUUDf*0>_sbXm*>>J>6UcBdj zZ>c>e43Z9h7QPwk zQXMC7c*9S_Xf(FB2xE9v?UV%9ASsxS<<)+)nay4ZuOO-1Ramu}E;t-^Gjw4Lwydqc1<`SMq zyRd}~qbQu#C&90fRN@3280}J5*>uc5pngWORZ8I?UYC>)Gp4{w4P7dk0utcQNIG~a zTp6S79gq+E)KxFFi^B+MMn<$I6xNHSvrs@H{18dO%u%2kHz!keO(OgQrQ>rQ9&Y90 z=93{AzS^3MvA4p7ZFGg0$3V4h%a)@;e8#AbBe|Ajq6FpL8%M#klDP#GGblLwUf2am z%i`g7B$e0!ReS9toPs1?_$P91<2$fSBSJ;#hd}E zLKj_F0IVJFaxRl2;c_JB@+|1zm0m5I6f%Q@zLmt;N7}UB*OZ=*#A=Ns9r90Z-R^adRhawBRL8d^ycN;J`_NF0K6YLEr#2X z`0Ri;k!&s1m%|u|-2*o3hd-M-7H&k&Ar0&EqM>sM@5OlF9tz;FNr%gjBo^iwTX@je z!bSshCF0;-WAB6CqUo5a)`Vg_iJFjj8N7xh z{yJ>cSG>2IRC7P9COPITzL+&d5mGDEMmO*f-z#_NKM;DA)!nnYNPWD5za zP0+26g*zs4Op{i43CXU!4C~&f^NE6eQT${&CYw%PLK-!hDz{R2S-llY{saU36;SaMF z@$Ui0A}K5t-bBs-^@vM7f#hm?@gp4npAwJ`RRmpg864PL7VM5B(;jfXu@}JijeQly zJ*o#B;q1p45lNc?Pa?_lI^0YdQVC(@OznRHPIw$2FHY$g6Xwwh5~sm(^YxbShw?v- zr4p^+G$fe@EO4nu7IH41Lcf8>Q8@MqSZk3kEDf$Rws7|o>|%U`VM|={h$0{0@Q}EtIG58WgnyudX*{)B;ZlRM*acH54E9>7E1CeSuhPS6O}G>(e3)HC zZC_1CCVyraQI)dUt;7ez35c!YRcRO@Yjh_Hh3$|Wqa9)Ewe(~Pj)ON*3N}-d@Qt3{ zD#8KAX6h2P6Ui3Z1*3A3ah`YD_0Y?MN(KCoFVb}%z_`G0_=lc zj4QIDKZ#+RS9A-Qh(wJ?5}yiJ7@G-6RNxl21c`$oGnc4D>^$hnV_?E&_7hbXNx@NY zCz6IS`-xinsJo%d51=*0WUfIri*D5hM|`yPh9q3tQ~Gvo}_@PT|iGUmc*yJXih{-c(`0Ol9DloP=Y%dl|*Z zl!;-~@b~nMK@z-(b}KHZvlXzk~8Oj=>%5A-f;0`Egop)`2rLw&wK z3)>&i`E-PzA@T7RVNCc)Z}>eCv5&wihqO;9 zya(;35{dABl!ToDnFhznU-;eU+<4C5@P@;V&`|88BOLz?zT^Z$0_Mt5yOFe5Sc0Sy zLgv+RY~hh&HYxtXJCErCn!vY^bhO>D{c-Z50H(oF4sE|oYWb`z>!EQ$|OK48_5;0@M9!b&&<)I zJ~_qKpsXUe;#&@7^3Q_aN@rL>AQ*o09sK~C$$wOxvm9C^h=j9#(49;8J(5Z=0gx&_ zN5S|wJkPnGv^j9kPujl#o<&l*%W(M5dJCn%++Uodz^jTdvP-#ZnMti-^aVQFY<351 zc9DHKi_2%Y3l$PC%)2DVE~6ft_^a;KY48NfARpnF-*mxDD5SEH>;hrnReeMR!{xuT z|KvuNSHQnNaF!B#wQ(^FR#sCTyJ|{K>KcSs~oOOUxw{z%*~FuEiU0WE2Gh{fHk- zVK50v%Yp(R88rJ4L(q-hyEI(=qI*Yvwe(B}UE&|L~q=I;rSu$+}A45{1 zOt=n7{}8@|!XM(Ily{WBK}pyp@IGER&cRNDGm!Ytg3C}W@j^Fm7)$;Zd<2~(-n$7S zh&O?qP6T(Lm<&#}aA9q?%Er!yf1)&ORmZLBMe3d$1zXkCws0(x0(2FFaTzC|T4^s-MN)5Elv_mScAxF+| zF0&xh59tmFU5)s+>~m-_WI7@zPhpokX&CYGck=RUxyH1b#LQi%zDM#5hxzRkbKN<+ zK-jq{FUh8p0Lq&?@`znH7s-|r?nmp$lnIQ~bravDnOluVG7P7}EaYqA0CBp!N0+UNwK@VwY05VmitE71{pktEK9_2Z}rw_Q>2b+ilr9k4+=(*XDulC8KK z9_Ykj{V)R&4DCv1#1o_>0ON`%q<=@&ye)ZsZKzZaZ`1MXq}XOdCkJvbw|(JY0% z2Jk5}@dykSC<{9m?jOgIf?YC>m*vw z3%Z=Zt(I)_V*_EE0Pvp zh1DN08Nu$x?g6JF$#gEvN0PPxHb~d;F)(@t6{2!6@GL6D7Vex$pLmojC>W8!7Q^<| z#OU)dhYf*#aQP$pP|1Q{KFZO-V^iKKRMj5S1;oL6nH-8_8U?o?sZbv5GLKA&kB46( z=lLLfZ9ZcL*92Q(*9AI09WGwL{!gdiECMUhEbLsk0cBvHfb|yY0;1qZV<*EFPv}fr z!8yp;D)2pH?}HT=>-YdT3dz<=fqRi$yzE=d@qdYc{0MOwws?{rOTj5H7cIu#3a_9n z?5l9_QZmI(h836Tp*H~DiR39-6FAb?$?$pP9A$7H+C^I7nB`Q$OD$$$#63kXXGJ_* zizES4;;Z}>dUr6{y=s`HTN4joL?!rdhBa2|mequFkhE+rOkBloqQ$~{k>tq~bgBT! z)?yku<*l+>2jbv;#!iFlka~=c3H`J6J`?stvKf=%p*1@G2n<-u3-|a7PoXB*r7+K? zU~J)UND96R2j@68&;KyGKcmO_9&iH^r%mwAbqvWQZUS?V6f9i-EMYl=!IMZHMxKU$ zB59>s&k=;gt_g=2I~m$&7kTEu&)2j6vk4rL6}h?+Iq>8L-MKEqyEbweg-<$U20*m{ zo0;;|FGvbt_B`IPF$KecNE*N_dy1L&99wt=iGRQ*D8i2PV#Jz&aDuVZV1}`Um0#e7 zfr3NfW#rF=t8n0pd^bY;5cnyQeP0A?yrc_`h0$9mLoRgT1r#S~;kZ2Zztl7rqt>f# z70-%DI0g;DPJz#&0_FzYlF#`CXxi|b-r&xvbmTDQH?fs3j7Sog+>t^zJuX8otqH& zB$5J_!FP;Z0Pot#iHi#HuO!rDblOW`3dS~+n8~RYo^n=j4fqE8dKXtM#2F#-P)%kT;er>W$=ixh1K8DPBq~;W2eHM zNVdu@81b&&-!cunnWj>?3RuUW=e00;B5_K9zoS{S_&V&k z*VGg?e2?Bwd5Ug6jlf$_UU|T!X#r0-`L0gmx2!x z_~HY$02vj-S%q}8F^r6`_DAe9DHv`-0gp2_z|jZE6gvfejpPEg1g3wY2PNU)&xpro z2&{UD3l{8fScH0D7aj6)XdKox74|c>(DMb?`Z!r|4wAcCCfrmzk+dxIOFo`M^8RNY zeD$clN7x1X7wbwe!>3|)Pscw4UPW?<3R@jxYsvHfWf=a)_5M41g4Tb{iGqTKe*d6{ zWBbEeB~*4EhbXLfk`9X<1v{P6c0AnrEn9$i;nSx%caU}+oclfZjl}bBRa7a;#uj=P zpXE3vAp8l*?RP1BO&+ZGlWt`{I1kBV`#d=0XYC_=4;7Mj zA8hoC?jNmS=Tdg-Jg)!aG4ha;7~Vv(iPQzQ%0)&y5)0Q{aw}^-oeM6$%&wt-2;W3b zuZCTI)dj@Eji?F!n_#=&bVWPDWhjw&VXG_b{}cjqueep4tGZXm!B>%Fx)lcfuI*s> zGLp)b{oYEx!y0gd{y{#%si+V;9S;3dS11YohKh+-H_5~8aZb%8UX1TO9_N(W zeHBi^VSXOx9xn+lDThsbHjLq;Q@O_z-dTY!z!z|ihZ6#rAPqYW{)yy{n183Esv&7i zBphMvWcVd=p8phMRIB814xw;35Xm#XA@HLhY%)Cv%LjYZ6l{Ok49NqESlEdV$Yv2A z52qn1EFCUKa(HLK06rvJjE}G}lK3W}9Sw`Rl(3NTzXaot z`W}@?VikomlIu9(8%U0hU2sgau5}8m##dXCX$;(rN*7T8?A_3#c47B}2V*?W)w6Ix zBabR3f8h&ATE7`adHKprI#d))LXxSl2Vb2fl97;kc2zowg-pfk_*i_v_6!QfXC2&) z;-nI=PgBC275l-e&8Qq{!=V>R{ySj%SiOtAJurqLS&*GH;*QG9Q)9FD156 zW+xMSN}QKkn}AHaB~z!#3ZYDe=0DDIC{u<>yileM6I-SYlPSZ*7Rr2DVhd#o6tRUe z;gr}ibCk>mCAKhCY%c*Z|FM}P(C>)-s>3hZTlu}9EI{7 zyCe|G_ugU)<=bwth4Rs{*h2Y?TWsMXV+%JJTllWAh4Njq_zQoRxqu`fUnt8bw_*z$ z8(Y}J*uv4q7S1-d@F`;p<&#>;M=0OOiY;Gz$_Jqd94SKi(9|ibJw`Oz%&{w!Z(<8M zUWN0GEuVb8jU<75+F7FQ{E+Xh8}5~{}%^&+POsBEH|YxX-S|SKb=&UeMy#`Za%WRQ}3q);%Es zr(@@ZmAGB5*tFOo_RoHPF>6x%n%G?e{Jh?mpZ@;Wb~D;N|J=zLABN0*-x8+fa5m&=c-JzbgWPUn`tBjJzo`=3jF-1XbBwpPxo1s5u`DPLuB zt?e0)y*sM#;EO{>H@mR8L%G&zNdtf1zWCuAJ==tQQvC5dQT;Q&+4ZE~sT$=9AIe|* z<}1(t;r%V}Z@J%H?MZR z_oc_X58K#e(P~fhD^r)ce?4(=!xt|u$qKbz{l0zZ{lC5)|5d%D<7aPH^xi)p-L>P1 z+@3}5jeq=np~}xO-@Y1AFfF=%!?cW}M+)mkruLfB^T416HO;>>+Qe)e9PKrSGYcH(DIAeQw`2N*gWs8a#u!7cZ!cw=fwlXZ_YYdZSQ^}lSGS7ku#yefUm zRcu_&Wx3|H^>|#(=T+%IT-#gwOFB!H7^0%=+)92`tCg0!!*rtx!7eNJ@e=FtuVWwo z%KoI1U%g&~)-Tyo%{uhXA@A~x;X&UuywYLG7tie7l0Cuu@S8VlaLFB}PEWaO&6b#> zmFqs-<&L+?=e=ILR>OngK`mliw2W;X+pc+B^XARl=C=;=>m1a-Ow7HpU2fH=g4Mi* z6}zqWvN?Yqo3XZ~r%|`4*S|Y=X!DynRiCw1CvUtnVCPps7f(fgK6~JvYfC@sU+L1x zxI6C7FR1P3ae3?Ro;%>gkcxYIR(qv%O4q3^tQBiqPd3cycUPzK9qSD4Vn6Xfokx0n z@7cYfO?=kWpew%}tr-99mm9yFHT0?0b+Z<}`Qn?~nvANwe$THr&Yiju^7f3VZk!{6QEI$5*Y*%iM$*sN!{8%aC+dk*wF zu;a$F=`U~J+GbIWweOC8t?Q~+C+&)Qzh9y^`s$62^@jP)A6Go2cuir|PO-Bq9q96Q zf_>`wUu(DAwy^S>1+T4qe)Xw|mkwQf^sD2icC3u5zJ9_;@6AE;2QL}8_sNEXURblU z=ZAlby>sD*CjvILTbb^^^5^QGM19-3#mUh8BL7y`s@z<%qw&6tFJ|P8yHTb4yAvWV zJ{x!M=BIj;?3;b)Q~S#HDxPsQK5hEUwthjE)~~(x^!MefW}kXHBH^<`4?o*3VqEKi zJ8t~+>D^T>MW6Sq__F2F_!`^4m~8F$&V95X(fjAou|3a4cAL0v{hnX^Vq3&-p3x@g zw?$vp%d?k#xun6PLl=Y({dv~C8>?)-aaZlj_r2bw=q=CRPt|DgXj;|0cMrrQ&m6ny z@EzBJK3`m;_0Kz>soB5WLwQwxf1%=2qryMF_|dcPq^B)^yyb!&JHC1PaM;q!f%B8! ZY?ssKTI)f5QV*~4fAMG>9~3C{e*m2$G%ElA From 6a128648053f94c641cb9f89997471e16df9dcb3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 14 May 2025 14:06:14 +0200 Subject: [PATCH 1759/1765] WtsSessionManager: remove debug message --- plugins/platform/windows/WtsSessionManager.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/platform/windows/WtsSessionManager.cpp b/plugins/platform/windows/WtsSessionManager.cpp index 9457c30ce..bb9ab2c31 100644 --- a/plugins/platform/windows/WtsSessionManager.cpp +++ b/plugins/platform/windows/WtsSessionManager.cpp @@ -170,8 +170,6 @@ QString WtsSessionManager::querySessionInformation(SessionId sessionId, SessionI WTSFreeMemory(queryBuffer); - vDebug() << sessionId << sessionInfo << result; - return result; } From 4b1fdfed08c272076618d9883d3dd5d26cdab284 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 14 May 2025 15:21:39 +0200 Subject: [PATCH 1760/1765] WindowsSessionFunctions: add screen capture interference handling Transparent windows with LWA_COLORKEY set are captured by the DeskDupEngine as black windows, effectively allowing users to escape monitoring. The soft workaround is to rectify these windows such that the problematic attributes no longer are set. Alternatively terminate all processes with suspicious LWA settings. --- .../windows/WindowsPlatformConfiguration.h | 2 + .../WindowsPlatformConfigurationPage.ui | 20 ++++- .../windows/WindowsSessionFunctions.cpp | 84 +++++++++++++++++++ .../windows/WindowsSessionFunctions.h | 15 ++++ 4 files changed, 120 insertions(+), 1 deletion(-) diff --git a/plugins/platform/windows/WindowsPlatformConfiguration.h b/plugins/platform/windows/WindowsPlatformConfiguration.h index c01ad98f7..385cbf524 100644 --- a/plugins/platform/windows/WindowsPlatformConfiguration.h +++ b/plugins/platform/windows/WindowsPlatformConfiguration.h @@ -28,6 +28,8 @@ #define FOREACH_WINDOWS_PLATFORM_CONFIG_PROPERTY(OP) \ OP( WindowsPlatformConfiguration, m_configuration, bool, isSoftwareSASEnabled, setSoftwareSASEnabled, "SoftwareSASEnabled", "Windows", true, Configuration::Property::Flag::Advanced ) \ + OP( WindowsPlatformConfiguration, m_configuration, bool, rectifyInterferingWindows, setRectifyInterferingWindows, "RectifyInterferingWindows", "Windows", true, Configuration::Property::Flag::Advanced ) \ + OP( WindowsPlatformConfiguration, m_configuration, bool, terminateInterferingProcesses, setTerminateInterferingProcesses, "TerminateInterferingProcesses", "Windows", false, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, bool, disableSSPIBasedUserAuthentication, setDisableSSPIBasedUserAuthentication, "DisableSSPIBasedUserAuthentication", "Windows", false, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, bool, hideDesktopForScreenLock, setHideDesktopForScreenLock, "HideDesktopForScreenLock", "Windows", true, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, bool, hideTaskbarForScreenLock, setHideTaskbarForScreenLock, "HideTaskbarForScreenLock", "Windows", true, Configuration::Property::Flag::Advanced ) \ diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.ui b/plugins/platform/windows/WindowsPlatformConfigurationPage.ui index 90393e005..99b55040e 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.ui +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.ui @@ -29,6 +29,20 @@ + + + + Rectify windows that interfere with screen capture + + + + + + + Terminate processes that interfere with screen capture + + + @@ -157,7 +171,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -171,6 +185,8 @@ isSoftwareSASEnabled + rectifyInterferingWindows + terminateInterferingProcesses disableSSPIBasedUserAuthentication logonInputStartDelay logonKeyPressInterval @@ -178,6 +194,8 @@ hideTaskbarForScreenLock hideStartMenuForScreenLock hideDesktopForScreenLock + useInterceptionDriver + useCustomPowerSchemeForScreenLock diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 89d2bbd94..48aa1d306 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -30,10 +30,23 @@ #include "WindowsCoreFunctions.h" #include "PlatformSessionManager.h" +#include "VeyonConfiguration.h" +#include "WindowsPlatformConfiguration.h" #include "WindowsSessionFunctions.h" #include "WtsSessionManager.h" +WindowsSessionFunctions::WindowsSessionFunctions() +{ + if (VeyonCore::component() == VeyonCore::Component::Server) + { + QObject::connect (VeyonCore::instance(), &VeyonCore::initialized, + VeyonCore::instance(), [this]() { initDesktopWindowsRectifier(); }); + } +} + + + WindowsSessionFunctions::SessionId WindowsSessionFunctions::currentSessionId() { const auto currentSession = WtsSessionManager::currentSession(); @@ -162,3 +175,74 @@ QVariant WindowsSessionFunctions::querySettingsValueInCurrentSession(const QStri return QSettings(QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()).value(key); } + + +void WindowsSessionFunctions::initDesktopWindowsRectifier() +{ + WindowsPlatformConfiguration config(&VeyonCore::config()); + + m_rectifyInterferingWindows = config.rectifyInterferingWindows(); + m_terminateInterferingProcesses = config.terminateInterferingProcesses(); + + if (m_rectifyInterferingWindows || m_terminateInterferingProcesses) + { + QObject::connect (&m_desktopWindowsInspectionTimer, &QTimer::timeout, &m_desktopWindowsInspectionTimer, [this]() { + inspectDesktopWindows(); + }); + m_desktopWindowsInspectionTimer.start(DesktopWindowsInspectionInterval); + } +} + + + +void WindowsSessionFunctions::inspectDesktopWindows() +{ + EnumWindows([](HWND window, LPARAM instance) -> WINBOOL { + const auto _this = reinterpret_cast(instance); + return _this->inspectDesktopWindow(window); + }, LPARAM(this)); +} + + + +WINBOOL WindowsSessionFunctions::inspectDesktopWindow(HWND window) +{ + const auto windowStyle = GetWindowLong(window, GWL_EXSTYLE); + if (windowStyle & (WS_EX_TOPMOST | WS_EX_TRANSPARENT | WS_EX_LAYERED)) { + COLORREF crKey; + BYTE alpha; + DWORD flags; + if (GetLayeredWindowAttributes(window, &crKey, &alpha, &flags) && (flags & LWA_COLORKEY)) + { + if (m_rectifyInterferingWindows) + { + vDebug() << "rectifying window" << window << flags << crKey << alpha; + SetLayeredWindowAttributes(window, 0, 255, LWA_COLORKEY | LWA_ALPHA); + SetWindowLong(window, GWL_EXSTYLE, + windowStyle & ~(WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST)); + RedrawWindow(window, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); + ShowWindow(window, SW_HIDE); + } + + if (m_terminateInterferingProcesses) + { + vDebug() << "terminating process of window" << window << flags << crKey << alpha; + DWORD processId = 0; + if (GetWindowThreadProcessId(window, &processId)) + { + const auto processHandle = OpenProcess(PROCESS_TERMINATE, 0, processId); + if (processHandle) + { + TerminateProcess(processHandle, 0); + CloseHandle(processHandle); + } + else + { + PostMessage(window, WM_QUIT, 0, 0); + } + } + } + } + } + return TRUE; +} diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index d596da2ce..11cd0759d 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -24,6 +24,8 @@ #pragma once +#include + #include "PlatformSessionFunctions.h" // clazy:excludeall=copyable-polymorphic @@ -31,6 +33,8 @@ class WindowsSessionFunctions : public PlatformSessionFunctions { public: + WindowsSessionFunctions(); + SessionId currentSessionId() override; SessionUptime currentSessionUptime() const override; @@ -45,4 +49,15 @@ class WindowsSessionFunctions : public PlatformSessionFunctions EnvironmentVariables currentSessionEnvironmentVariables() const override; QVariant querySettingsValueInCurrentSession(const QString& key) const override; +private: + void initDesktopWindowsRectifier(); + void inspectDesktopWindows(); + WINBOOL inspectDesktopWindow(HWND window); + + static constexpr auto DesktopWindowsInspectionInterval = 1000; + + QTimer m_desktopWindowsInspectionTimer; + bool m_rectifyInterferingWindows = false; + bool m_terminateInterferingProcesses = false; + }; From ba052574adebd53fe5a3888c35f0d03b78b78385 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 May 2025 11:17:40 +0200 Subject: [PATCH 1761/1765] WindowsSessionFunctions: extend interfering window handling Make single action configurable and add action for closing session. --- .../windows/WindowsPlatformConfiguration.h | 4 +- .../WindowsPlatformConfigurationPage.ui | 48 +++++++++++++------ .../windows/WindowsSessionFunctions.cpp | 33 ++++++++----- .../windows/WindowsSessionFunctions.h | 14 ++++-- 4 files changed, 69 insertions(+), 30 deletions(-) diff --git a/plugins/platform/windows/WindowsPlatformConfiguration.h b/plugins/platform/windows/WindowsPlatformConfiguration.h index 385cbf524..452d001b7 100644 --- a/plugins/platform/windows/WindowsPlatformConfiguration.h +++ b/plugins/platform/windows/WindowsPlatformConfiguration.h @@ -25,11 +25,11 @@ #pragma once #include "Configuration/Proxy.h" +#include "WindowsSessionFunctions.h" #define FOREACH_WINDOWS_PLATFORM_CONFIG_PROPERTY(OP) \ OP( WindowsPlatformConfiguration, m_configuration, bool, isSoftwareSASEnabled, setSoftwareSASEnabled, "SoftwareSASEnabled", "Windows", true, Configuration::Property::Flag::Advanced ) \ - OP( WindowsPlatformConfiguration, m_configuration, bool, rectifyInterferingWindows, setRectifyInterferingWindows, "RectifyInterferingWindows", "Windows", true, Configuration::Property::Flag::Advanced ) \ - OP( WindowsPlatformConfiguration, m_configuration, bool, terminateInterferingProcesses, setTerminateInterferingProcesses, "TerminateInterferingProcesses", "Windows", false, Configuration::Property::Flag::Advanced ) \ + OP( WindowsPlatformConfiguration, m_configuration, WindowsSessionFunctions::InterferingWindowHandling, interferingWindowHandling, setInterferingWindowHandling, "InterferingWindowHandling", "Windows", QVariant::fromValue(WindowsSessionFunctions::InterferingWindowHandling::FixWindowAttributes), Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, bool, disableSSPIBasedUserAuthentication, setDisableSSPIBasedUserAuthentication, "DisableSSPIBasedUserAuthentication", "Windows", false, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, bool, hideDesktopForScreenLock, setHideDesktopForScreenLock, "HideDesktopForScreenLock", "Windows", true, Configuration::Property::Flag::Advanced ) \ OP( WindowsPlatformConfiguration, m_configuration, bool, hideTaskbarForScreenLock, setHideTaskbarForScreenLock, "HideTaskbarForScreenLock", "Windows", true, Configuration::Property::Flag::Advanced ) \ diff --git a/plugins/platform/windows/WindowsPlatformConfigurationPage.ui b/plugins/platform/windows/WindowsPlatformConfigurationPage.ui index 99b55040e..843e07462 100644 --- a/plugins/platform/windows/WindowsPlatformConfigurationPage.ui +++ b/plugins/platform/windows/WindowsPlatformConfigurationPage.ui @@ -30,18 +30,39 @@ - - - Rectify windows that interfere with screen capture - - - - - - - Terminate processes that interfere with screen capture - - + + + + + Handling of interfering windows + + + + + + + + None + + + + + Fix window attributes + + + + + Terminate related process + + + + + Close session + + + + + @@ -185,8 +206,7 @@ isSoftwareSASEnabled - rectifyInterferingWindows - terminateInterferingProcesses + interferingWindowHandling disableSSPIBasedUserAuthentication logonInputStartDelay logonKeyPressInterval diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 48aa1d306..411cbaf42 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -30,6 +30,7 @@ #include "WindowsCoreFunctions.h" #include "PlatformSessionManager.h" +#include "PlatformUserFunctions.h" #include "VeyonConfiguration.h" #include "WindowsPlatformConfiguration.h" #include "WindowsSessionFunctions.h" @@ -41,7 +42,7 @@ WindowsSessionFunctions::WindowsSessionFunctions() if (VeyonCore::component() == VeyonCore::Component::Server) { QObject::connect (VeyonCore::instance(), &VeyonCore::initialized, - VeyonCore::instance(), [this]() { initDesktopWindowsRectifier(); }); + VeyonCore::instance(), [this]() { initInterferingWindowHandling(); }); } } @@ -177,14 +178,13 @@ QVariant WindowsSessionFunctions::querySettingsValueInCurrentSession(const QStri } -void WindowsSessionFunctions::initDesktopWindowsRectifier() +void WindowsSessionFunctions::initInterferingWindowHandling() { WindowsPlatformConfiguration config(&VeyonCore::config()); - m_rectifyInterferingWindows = config.rectifyInterferingWindows(); - m_terminateInterferingProcesses = config.terminateInterferingProcesses(); + m_interferingWindowHandling = config.interferingWindowHandling(); - if (m_rectifyInterferingWindows || m_terminateInterferingProcesses) + if (m_interferingWindowHandling != InterferingWindowHandling::None) { QObject::connect (&m_desktopWindowsInspectionTimer, &QTimer::timeout, &m_desktopWindowsInspectionTimer, [this]() { inspectDesktopWindows(); @@ -214,19 +214,22 @@ WINBOOL WindowsSessionFunctions::inspectDesktopWindow(HWND window) DWORD flags; if (GetLayeredWindowAttributes(window, &crKey, &alpha, &flags) && (flags & LWA_COLORKEY)) { - if (m_rectifyInterferingWindows) + std::wstring windowTitle(GetWindowTextLength(window) + 1, L'\0'); + GetWindowTextW(window, &windowTitle[0], windowTitle.size()); + + switch (m_interferingWindowHandling) { - vDebug() << "rectifying window" << window << flags << crKey << alpha; + case InterferingWindowHandling::FixWindowAttributes: + vDebug() << "fixing attributes of interfering window" << window << windowTitle << flags << crKey << alpha; SetLayeredWindowAttributes(window, 0, 255, LWA_COLORKEY | LWA_ALPHA); SetWindowLong(window, GWL_EXSTYLE, windowStyle & ~(WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_TOPMOST)); RedrawWindow(window, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); ShowWindow(window, SW_HIDE); - } - - if (m_terminateInterferingProcesses) + break; + case InterferingWindowHandling::TerminateProcess: { - vDebug() << "terminating process of window" << window << flags << crKey << alpha; + vDebug() << "terminating process of interfering window" << window << windowTitle << flags << crKey << alpha; DWORD processId = 0; if (GetWindowThreadProcessId(window, &processId)) { @@ -241,6 +244,14 @@ WINBOOL WindowsSessionFunctions::inspectDesktopWindow(HWND window) PostMessage(window, WM_QUIT, 0, 0); } } + break; + } + case InterferingWindowHandling::CloseSession: + vDebug() << "closing session due to interfering window" << window << windowTitle << flags << crKey << alpha; + VeyonCore::platform().userFunctions().logoff(); + break; + default: + break; } } } diff --git a/plugins/platform/windows/WindowsSessionFunctions.h b/plugins/platform/windows/WindowsSessionFunctions.h index 11cd0759d..d93ebe47d 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.h +++ b/plugins/platform/windows/WindowsSessionFunctions.h @@ -32,7 +32,16 @@ class WindowsSessionFunctions : public PlatformSessionFunctions { + Q_GADGET public: + enum class InterferingWindowHandling { + None, + FixWindowAttributes, + TerminateProcess, + CloseSession + }; + Q_ENUM(InterferingWindowHandling) + WindowsSessionFunctions(); SessionId currentSessionId() override; @@ -50,14 +59,13 @@ class WindowsSessionFunctions : public PlatformSessionFunctions QVariant querySettingsValueInCurrentSession(const QString& key) const override; private: - void initDesktopWindowsRectifier(); + void initInterferingWindowHandling(); void inspectDesktopWindows(); WINBOOL inspectDesktopWindow(HWND window); static constexpr auto DesktopWindowsInspectionInterval = 1000; + InterferingWindowHandling m_interferingWindowHandling = InterferingWindowHandling::None; QTimer m_desktopWindowsInspectionTimer; - bool m_rectifyInterferingWindows = false; - bool m_terminateInterferingProcesses = false; }; From 43881fa16ddf223eb2fe6ca151e6ac8ee7ec821c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 May 2025 13:55:17 +0200 Subject: [PATCH 1762/1765] CI: replace Fedora 40 with Fedora 42 Fedora 40 is EOL as of 2025-05-13. --- .ci/{linux.fedora.40 => linux.fedora.42}/Dockerfile | 4 ++-- .ci/{linux.fedora.40 => linux.fedora.42}/script.sh | 2 +- .gitlab-ci.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename .ci/{linux.fedora.40 => linux.fedora.42}/Dockerfile (93%) rename .ci/{linux.fedora.40 => linux.fedora.42}/script.sh (76%) diff --git a/.ci/linux.fedora.40/Dockerfile b/.ci/linux.fedora.42/Dockerfile similarity index 93% rename from .ci/linux.fedora.40/Dockerfile rename to .ci/linux.fedora.42/Dockerfile index e0965b679..27275644a 100644 --- a/.ci/linux.fedora.40/Dockerfile +++ b/.ci/linux.fedora.42/Dockerfile @@ -1,8 +1,8 @@ -FROM fedora:40 +FROM fedora:42 MAINTAINER Tobias Junghans RUN \ - dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-40.noarch.rpm && \ + dnf install -y https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-42.noarch.rpm && \ dnf install -y --setopt=install_weak_deps=False \ git gcc-c++ ninja-build cmake rpm-build fakeroot fakeroot-libs \ qt6-qtbase-devel qt6-qtbase qt6-qt5compat-devel qt6-linguist qt6-qttools-devel qt6-qtdeclarative-devel qt6-qthttpserver-devel \ diff --git a/.ci/linux.fedora.40/script.sh b/.ci/linux.fedora.42/script.sh similarity index 76% rename from .ci/linux.fedora.40/script.sh rename to .ci/linux.fedora.42/script.sh index aa6dab734..35d528dcf 100755 --- a/.ci/linux.fedora.40/script.sh +++ b/.ci/linux.fedora.42/script.sh @@ -2,7 +2,7 @@ set -e -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_PCH=OFF -DCPACK_DIST=fedora.40 -DCMAKE_CXX_FLAGS=-Wno-template-id-cdtor" +export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_PCH=OFF -DCPACK_DIST=fedora.42 -DCMAKE_CXX_FLAGS=-Wno-template-id-cdtor" $1/.ci/common/linux-build.sh $@ $1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e08e3cd71..af738392a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,8 +12,8 @@ build-linux: - DISTRO: - debian.11 - debian.12 - - fedora.40 - fedora.41 + - fedora.42 - opensuse.15.5 - opensuse.15.6 - opensuse.tumbleweed From ef0d3f04d50fd3ba7df584a377a0add0e3494c01 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 May 2025 13:56:10 +0200 Subject: [PATCH 1763/1765] CI: drop openSUSE 15.5 It's EOL since 2024-12-31. --- .ci/linux.opensuse.15.5/Dockerfile | 19 ------------------- .ci/linux.opensuse.15.5/script.sh | 8 -------- .gitlab-ci.yml | 1 - 3 files changed, 28 deletions(-) delete mode 100644 .ci/linux.opensuse.15.5/Dockerfile delete mode 100755 .ci/linux.opensuse.15.5/script.sh diff --git a/.ci/linux.opensuse.15.5/Dockerfile b/.ci/linux.opensuse.15.5/Dockerfile deleted file mode 100644 index 44ae40846..000000000 --- a/.ci/linux.opensuse.15.5/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM opensuse/leap:15.5 -MAINTAINER Tobias Junghans - -RUN \ - zypper --gpg-auto-import-keys install -y git gcc-c++ ninja cmake rpm-build fakeroot \ - libqt5-qtbase-devel libqt5-qtbase-private-headers-devel libqt5-linguist-devel libqt5-qttools-devel libqt5-qtquickcontrols2 libQt5QuickControls2-devel \ - libXtst-devel libXrandr-devel libXinerama-devel libXcursor-devel libXrandr-devel libXdamage-devel libXcomposite-devel libXfixes-devel \ - libfakekey-devel \ - libjpeg8-devel \ - zlib-devel \ - libpng16-devel libpng16-compat-devel \ - libopenssl-devel \ - procps-devel \ - pam-devel lzo-devel \ - libqca-qt5-devel libqca-qt5-plugins \ - libavcodec-devel libavformat-devel libavutil-devel libswscale-devel \ - cyrus-sasl-devel \ - openldap2-devel - diff --git a/.ci/linux.opensuse.15.5/script.sh b/.ci/linux.opensuse.15.5/script.sh deleted file mode 100755 index c1a30a512..000000000 --- a/.ci/linux.opensuse.15.5/script.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -e - -export CMAKE_FLAGS="$CMAKE_FLAGS -DWITH_QT6=OFF -DCPACK_DIST=opensuse.15.5" - -$1/.ci/common/linux-build.sh $@ -$1/.ci/common/finalize-rpm.sh $1 $2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index af738392a..07f73e2ca 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,7 +14,6 @@ build-linux: - debian.12 - fedora.41 - fedora.42 - - opensuse.15.5 - opensuse.15.6 - opensuse.tumbleweed - rhel.8 From 83072ef484b4247a45302f4a9ada5243874a7173 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 May 2025 14:15:33 +0200 Subject: [PATCH 1764/1765] WindowsServiceControl: drop LanmanWorkstation service dependency It could delay the start of the Veyon Service e.g. when performing large GPO updates etc. Also drop the check for Windows < 10 since we do not support older versions anyway. --- plugins/platform/windows/WindowsServiceControl.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugins/platform/windows/WindowsServiceControl.cpp b/plugins/platform/windows/WindowsServiceControl.cpp index 6224b74c1..1cbc8cff2 100644 --- a/plugins/platform/windows/WindowsServiceControl.cpp +++ b/plugins/platform/windows/WindowsServiceControl.cpp @@ -22,8 +22,6 @@ * */ -#include - #include "WindowsCoreFunctions.h" #include "WindowsServiceControl.h" @@ -193,9 +191,7 @@ bool WindowsServiceControl::install( const QString& filePath, const QString& dis { const auto binaryPath = QStringLiteral("\"%1\"").arg( QString( filePath ).replace( QLatin1Char('"'), QString() ) ); - const wchar_t* dependencies = QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows10 ? - L"Tcpip\0RpcSs\0LanmanWorkstation\0\0" : - L"Tcpip\0RpcSs\0LSM\0LanmanWorkstation\0\0"; + const wchar_t* dependencies = L"Tcpip\0RpcSs\0LSM\0\0"; m_serviceHandle = CreateService( m_serviceManager, // SCManager database From 1af8d89e572a0aa9490a714400bcd03f5edfac7b Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 28 May 2025 14:48:10 +0200 Subject: [PATCH 1765/1765] WindowsSessionFunctions: add CALLBACK attribute to lambda --- plugins/platform/windows/WindowsSessionFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/platform/windows/WindowsSessionFunctions.cpp b/plugins/platform/windows/WindowsSessionFunctions.cpp index 411cbaf42..a51955550 100644 --- a/plugins/platform/windows/WindowsSessionFunctions.cpp +++ b/plugins/platform/windows/WindowsSessionFunctions.cpp @@ -197,7 +197,7 @@ void WindowsSessionFunctions::initInterferingWindowHandling() void WindowsSessionFunctions::inspectDesktopWindows() { - EnumWindows([](HWND window, LPARAM instance) -> WINBOOL { + EnumWindows([](HWND window, LPARAM instance) -> WINBOOL CALLBACK { const auto _this = reinterpret_cast(instance); return _this->inspectDesktopWindow(window); }, LPARAM(this));