├── autotests └── CMakeLists.txt ├── server ├── krdpserversettings.kcfg ├── Messages.sh ├── 00-krdp.preset ├── app-org.kde.krdpserver.service.in ├── CMakeLists.txt ├── SessionController.h ├── org.kde.krdpserver.desktop.cmake └── main.cpp ├── README.md.license ├── src ├── kcm │ ├── kcm_krdpserver.json.license │ ├── Messages.sh │ ├── ui │ │ ├── CertError.qml │ │ ├── KeychainErrorDialog.qml │ │ ├── CodecError.qml │ │ ├── DeleteUserModal.qml │ │ ├── RestartServerWarning.qml │ │ ├── CertLoader.qml │ │ ├── EditUserModal.qml │ │ └── UserListView.qml │ ├── org.freedesktop.impl.portal.PermissionStore.xml │ ├── usersmodel.h │ ├── krdpserversettings.kcfg │ ├── CMakeLists.txt │ ├── usersmodel.cpp │ └── kcmkrdpserver.h ├── VideoFrame.h ├── Clipboard.h ├── PlasmaScreencastV1Session.h ├── PeerContext_p.h ├── PeerContext.cpp ├── Cursor.h ├── NetworkDetection.h ├── screencasting_p.h ├── PortalSession.h ├── PortalSession_p.h ├── InputHandler.h ├── CMakeLists.txt ├── AbstractSession.h ├── RdpConnection.h ├── VideoStream.h ├── Server.h ├── AbstractSession.cpp ├── screencasting.cpp └── Server.cpp ├── examples ├── CMakeLists.txt └── streamer │ ├── CMakeLists.txt │ ├── main.cpp │ └── org.kde.krdp.desktop.cmake ├── .gitignore ├── KRdpConfig.cmake.in ├── .gitlab-ci.yml ├── .kde-ci.yml ├── LICENSES ├── LicenseRef-KDE-Accepted-LGPL.txt ├── BSD-2-Clause.txt └── BSD-3-Clause.txt ├── cmake ├── FindSystemd.cmake └── FindPAM.cmake ├── po ├── sk │ └── krdpserver.po ├── de │ └── krdpserver.po ├── pa │ └── krdpserver.po ├── cs │ └── krdpserver.po ├── zh_CN │ └── krdpserver.po ├── ko │ └── krdpserver.po ├── zh_TW │ └── krdpserver.po ├── nn │ └── krdpserver.po ├── az │ └── krdpserver.po ├── hi │ └── krdpserver.po ├── en_GB │ └── krdpserver.po ├── he │ └── krdpserver.po ├── ia │ └── krdpserver.po ├── fi │ └── krdpserver.po ├── fr │ └── krdpserver.po ├── ar │ └── krdpserver.po ├── ka │ └── krdpserver.po ├── sv │ └── krdpserver.po ├── sa │ └── krdpserver.po ├── sl │ └── krdpserver.po ├── tr │ └── krdpserver.po ├── lv │ └── krdpserver.po ├── eo │ └── krdpserver.po ├── hu │ └── krdpserver.po ├── it │ └── krdpserver.po ├── gl │ └── krdpserver.po ├── lt │ └── krdpserver.po ├── bg │ └── krdpserver.po ├── pl │ └── krdpserver.po ├── nl │ └── krdpserver.po ├── uk │ └── krdpserver.po ├── es │ └── krdpserver.po ├── ru │ └── krdpserver.po ├── ca │ └── krdpserver.po ├── ca@valencia │ └── krdpserver.po ├── eu │ └── krdpserver.po └── pt_BR │ └── krdpserver.po └── CMakeLists.txt /autotests/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/krdpserversettings.kcfg: -------------------------------------------------------------------------------- 1 | ../src/kcm/krdpserversettings.kcfg -------------------------------------------------------------------------------- /README.md.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | SPDX-License-Identifier: BSD-2-Clause 3 | -------------------------------------------------------------------------------- /src/kcm/kcm_krdpserver.json.license: -------------------------------------------------------------------------------- 1 | SPDX-License-Identifier: CC0-1.0 2 | SPDX-FileCopyrightText: 2024 Akseli Lahtinen 3 | -------------------------------------------------------------------------------- /examples/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | # SPDX-License-Identifier: BSD-2-Clause 3 | 4 | add_subdirectory(streamer) 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: None 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | .clang-format 5 | *kdev4* 6 | 7 | .flatpak-builder 8 | .cache 9 | build*/ 10 | CMakeLists.txt.user 11 | compile_commands.json 12 | -------------------------------------------------------------------------------- /server/Messages.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | # SPDX-FileCopyrightText: 2024 Akseli Lahtinen 3 | # SPDX-License-Identifier: CC0-1.0 4 | 5 | $EXTRACTRC `find . -name \*.kcfg` >> rc.cpp 6 | $XGETTEXT `find . -name "*.cpp"` -o $podir/krdpserver.pot 7 | -------------------------------------------------------------------------------- /src/kcm/Messages.sh: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env bash 2 | # SPDX-FileCopyrightText: 2024 Akseli Lahtinen 3 | # SPDX-License-Identifier: CC0-1.0 4 | 5 | $EXTRACTRC `find . -name \*.kcfg` >> rc.cpp 6 | $XGETTEXT `find . -name "*.cpp" -o -name "*.qml"` -o $podir/kcm_krdpserver.pot 7 | -------------------------------------------------------------------------------- /examples/streamer/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | # SPDX-License-Identifier: BSD-2-Clause 3 | 4 | add_executable(krdpstreamer) 5 | 6 | target_sources(krdpstreamer PRIVATE main.cpp) 7 | 8 | target_link_libraries(krdpstreamer Qt${QT_MAJOR_VERSION}::Gui KRdp) 9 | 10 | 11 | -------------------------------------------------------------------------------- /KRdpConfig.cmake.in: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | # SPDX-License-Identifier: BSD-2-Clause 3 | 4 | @PACKAGE_INIT@ 5 | 6 | include(CMakeFindDependencyMacro) 7 | find_dependency(Qt6Core @REQUIRED_QT_VERSION@) 8 | 9 | find_dependency(ECM @KF_DEP_VERSION@) 10 | 11 | @PACKAGE_INCLUDE_QCHTARGETS@ 12 | -------------------------------------------------------------------------------- /server/00-krdp.preset: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 2 | # SPDX-FileCopyrightText: 2025 Nate Graham 3 | 4 | # This service should never be enabled by default, irrespective of 5 | # distro policy regarding the default enablement state of user units. 6 | disable app-org.kde.krdpserver.service 7 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: None 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | include: 5 | - project: sysadmin/ci-utilities 6 | file: 7 | - /gitlab-templates/reuse-lint.yml 8 | - /gitlab-templates/xml-lint.yml 9 | - /gitlab-templates/yaml-lint.yml 10 | - /gitlab-templates/qml-lint.yml 11 | - /gitlab-templates/linux-qt6.yml 12 | - /gitlab-templates/linux-qt6-next.yml 13 | -------------------------------------------------------------------------------- /server/app-org.kde.krdpserver.service.in: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 2 | # SPDX-FileCopyrightText: 2024 Akseli Lahtinen 3 | [Unit] 4 | Description=KRDP Server 5 | After=plasma-xdg-desktop-portal-kde.service 6 | After=plasma-core.target 7 | 8 | [Service] 9 | Type=exec 10 | ExecStart=@CMAKE_INSTALL_PREFIX@/bin/krdpserver 11 | Restart=on-abnormal 12 | 13 | [Install] 14 | WantedBy=plasma-workspace.target 15 | -------------------------------------------------------------------------------- /src/kcm/ui/CertError.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | import QtQuick.Layouts 6 | import org.kde.kirigami as Kirigami 7 | 8 | Kirigami.InlineMessage { 9 | id: certificateError 10 | type: Kirigami.MessageType.Error 11 | position: Kirigami.InlineMessage.Position.Header 12 | Layout.fillWidth: true 13 | // TODO better text 14 | text: i18nc("@info:status", "Generating certificates automatically has failed!") 15 | } 16 | -------------------------------------------------------------------------------- /.kde-ci.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: None 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | Dependencies: 5 | - 'on': ['@all'] 6 | 'require': 7 | 'frameworks/extra-cmake-modules': '@latest-kf6' 8 | 'frameworks/kconfig': '@latest-kf6' 9 | 'frameworks/kdbusaddons': '@latest-kf6' 10 | 'frameworks/kstatusnotifieritem': '@latest-kf6' 11 | 'frameworks/kcmutils': '@latest-kf6' 12 | 'frameworks/kcrash': '@latest-kf6' 13 | 'plasma/kpipewire': '@latest-kf6' 14 | 'third-party/qtkeychain': '@latest' 15 | 16 | Options: 17 | require-passing-tests-on: ['@all'] 18 | -------------------------------------------------------------------------------- /src/kcm/ui/KeychainErrorDialog.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | import QtQuick 6 | import org.kde.kirigami as Kirigami 7 | 8 | Kirigami.PromptDialog { 9 | id: keychainErrorDialog 10 | 11 | property string errorText 12 | 13 | showCloseButton: false 14 | title: i18nc("@title:window", "Keychain error") 15 | subtitle: i18nc("@info", "Received following error with password keychain: %1", errorText) 16 | 17 | standardButtons: Kirigami.Dialog.Ok 18 | } 19 | -------------------------------------------------------------------------------- /src/kcm/ui/CodecError.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | import QtQuick.Layouts 6 | import org.kde.kirigami as Kirigami 7 | 8 | Kirigami.InlineMessage { 9 | type: Kirigami.MessageType.Error 10 | position: Kirigami.InlineMessage.Position.Header 11 | Layout.fillWidth: true 12 | visible: !kcm.isH264Supported() 13 | text: i18nc("@info:status", "Remote desktop cannot be enabled because your system does not support H264 video encoding. Please contact your distribution regarding how to enable it.") 14 | } 15 | -------------------------------------------------------------------------------- /LICENSES/LicenseRef-KDE-Accepted-LGPL.txt: -------------------------------------------------------------------------------- 1 | This library is free software; you can redistribute it and/or 2 | modify it under the terms of the GNU Lesser General Public 3 | License as published by the Free Software Foundation; either 4 | version 3 of the license or (at your option) any later version 5 | that is accepted by the membership of KDE e.V. (or its successor 6 | approved by the membership of KDE e.V.), which shall act as a 7 | proxy as defined in Section 6 of version 3 of the license. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | -------------------------------------------------------------------------------- /src/kcm/org.freedesktop.impl.portal.PermissionStore.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/kcm/ui/DeleteUserModal.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | import QtQuick 6 | import org.kde.kirigami as Kirigami 7 | 8 | Kirigami.PromptDialog { 9 | id: deleteUserModal 10 | // if oldUsername is empty, we're adding a new user 11 | property string selectedUsername 12 | 13 | showCloseButton: false 14 | title: i18nc("@title:window", "Discard user?") 15 | subtitle: i18nc("@info", "Are you sure you want to discard following user: %1?", selectedUsername) 16 | 17 | standardButtons: Kirigami.Dialog.Discard | Kirigami.Dialog.Cancel 18 | 19 | onDiscarded: { 20 | kcm.deleteUser(selectedUsername); 21 | deleteUserModal.close(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /cmake/FindSystemd.cmake: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: BSD-3-Clause 2 | # SPDX-FileCopyrightText: 2021 Henri Chain 3 | # SPDX-FileCopyrightText: 2021 Harald Sitter 4 | 5 | # Try to find systemd on a linux system 6 | # This will define the following variables: 7 | # 8 | # ``Systemd_FOUND`` 9 | # True if systemd is available 10 | # ``Systemd_VERSION`` 11 | # The version of systemd 12 | 13 | find_package(PkgConfig QUIET) 14 | pkg_check_modules(Systemd QUIET IMPORTED_TARGET GLOBAL libsystemd) 15 | 16 | if(TARGET PkgConfig::Systemd) 17 | add_library(Systemd::systemd ALIAS PkgConfig::Systemd) 18 | endif() 19 | 20 | include(FindPackageHandleStandardArgs) 21 | find_package_handle_standard_args(Systemd 22 | REQUIRED_VARS 23 | Systemd_FOUND 24 | VERSION_VAR 25 | Systemd_VERSION 26 | ) 27 | 28 | mark_as_advanced(Systemd_VERSION) 29 | -------------------------------------------------------------------------------- /src/kcm/ui/RestartServerWarning.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | import QtQuick.Layouts 6 | import org.kde.kirigami as Kirigami 7 | 8 | Kirigami.InlineMessage { 9 | type: Kirigami.MessageType.Warning 10 | position: Kirigami.InlineMessage.Position.Header 11 | Layout.fillWidth: true 12 | visible: false 13 | text: i18nc("@info:status", "Restart the server to apply changed settings. This may disconnect active connections.") 14 | actions: [ 15 | Kirigami.Action { 16 | icon.name: "system-reboot-symbolic" 17 | text: i18n("Restart Server") 18 | onTriggered: source => { 19 | kcm.restartServer(); 20 | restartServerWarning.visible = false; 21 | } 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /src/kcm/ui/CertLoader.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | import QtQuick 6 | import QtQuick.Controls as QQC2 7 | import QtQuick.Layouts 8 | import QtQuick.Dialogs as QtDialogs 9 | 10 | Loader { 11 | id: certLoader 12 | property bool selectKey 13 | active: false 14 | sourceComponent: QtDialogs.FileDialog { 15 | id: fileDialog 16 | title: selectKey ? i18nc("@title:window", "Select Certificate Key file") : i18nc("@title:window", "Select Certificate file") 17 | Component.onCompleted: open() 18 | onAccepted: { 19 | var file = kcm.toLocalFile(selectedFile); 20 | if (selectKey) { 21 | certKeyPathField.text = file; 22 | } else { 23 | certPathField.text = file; 24 | } 25 | certLoader.active = false; 26 | } 27 | onRejected: { 28 | certLoader.active = false; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/VideoFrame.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include "krdp_export.h" 15 | 16 | namespace KRdp 17 | { 18 | 19 | class RdpConnection; 20 | 21 | /** 22 | * A frame of compressed video data. 23 | */ 24 | struct VideoFrame { 25 | /** 26 | * The size of the frame, in pixels. 27 | */ 28 | QSize size; 29 | /** 30 | * h264 compressed data in YUV420 color space. 31 | */ 32 | QByteArray data; 33 | /** 34 | * Area of the frame that was actually damaged. 35 | * TODO: Actually use this information. 36 | */ 37 | QRegion damage; 38 | /** 39 | * Whether the packet contains all the information 40 | */ 41 | bool isKeyFrame; 42 | /** 43 | * When was this frame presented. 44 | */ 45 | std::chrono::system_clock::time_point presentationTimeStamp; 46 | }; 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/Clipboard.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | 10 | #include 11 | #include 12 | 13 | #include 14 | 15 | #include "krdp_export.h" 16 | 17 | namespace KRdp 18 | { 19 | 20 | class RdpConnection; 21 | 22 | class KRDP_EXPORT Clipboard : public QObject 23 | { 24 | Q_OBJECT 25 | 26 | public: 27 | /** 28 | * TODO: This clipboard is currently not implemented. It only 29 | * works as a dummy clipboard that does nothing to avoid crashes if 30 | * cliprdr channel is opened. 31 | */ 32 | explicit Clipboard(RdpConnection *session); 33 | ~Clipboard() override; 34 | 35 | bool initialize(); 36 | void close(); 37 | 38 | bool enabled(); 39 | 40 | void setServerData(const QMimeData *data); 41 | 42 | Q_SIGNAL void clientDataChanged(); 43 | std::unique_ptr getClipboard() const; 44 | 45 | private: 46 | void sendServerData(); 47 | 48 | class Private; 49 | const std::unique_ptr d; 50 | }; 51 | } 52 | -------------------------------------------------------------------------------- /src/PlasmaScreencastV1Session.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | #include "AbstractSession.h" 17 | #include "krdp_export.h" 18 | 19 | namespace KRdp 20 | { 21 | 22 | struct VideoFrame; 23 | class Server; 24 | 25 | /** 26 | * An implementation of the Plasma screencasting wayland protocol. 27 | */ 28 | class KRDP_EXPORT PlasmaScreencastV1Session : public AbstractSession 29 | { 30 | Q_OBJECT 31 | 32 | public: 33 | PlasmaScreencastV1Session(); 34 | ~PlasmaScreencastV1Session() override; 35 | 36 | void start() override; 37 | 38 | void sendEvent(const std::shared_ptr &event) override; 39 | void setClipboardData(std::unique_ptr data) override; 40 | 41 | private: 42 | void onPacketReceived(const PipeWireEncodedStream::Packet &data); 43 | 44 | class Private; 45 | const std::unique_ptr d; 46 | }; 47 | 48 | } 49 | -------------------------------------------------------------------------------- /LICENSES/BSD-2-Clause.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2 | 3 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 4 | 5 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 6 | 7 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8 | 9 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 10 | -------------------------------------------------------------------------------- /src/PeerContext_p.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | 9 | namespace KRdp 10 | { 11 | 12 | class RdpConnection; 13 | class InputHandler; 14 | class VideoStream; 15 | class NetworkDetection; 16 | class Clipboard; 17 | 18 | /** 19 | * Extension of the FreeRDP Peer Context used to store extra data for KRdp. 20 | */ 21 | struct PeerContext { 22 | // The base rdpContext structure. 23 | // Important: This should remain as a plain value as that is how the 24 | // extension mechanism works. 25 | rdpContext _p; 26 | 27 | RdpConnection *connection = nullptr; 28 | InputHandler *inputHandler = nullptr; 29 | VideoStream *stream = nullptr; 30 | NetworkDetection *networkDetection = nullptr; 31 | Clipboard *clipboard = nullptr; 32 | 33 | HANDLE virtualChannelManager = nullptr; 34 | }; 35 | 36 | // Convenience method to get the PeerContext instance for a specific FreeRDP peer. 37 | PeerContext *contextForPeer(freerdp_peer *peer); 38 | } 39 | 40 | // FreeRDP callbacks used to initialize a PeerContext during creation/destruction. 41 | BOOL newPeerContext(freerdp_peer *peer, rdpContext *peer_context); 42 | void freePeerContext(freerdp_peer *peer, rdpContext *peer_context); 43 | -------------------------------------------------------------------------------- /server/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | # SPDX-License-Identifier: BSD-2-Clause 3 | 4 | add_definitions(-DTRANSLATION_DOMAIN=\"krdpserver\") 5 | 6 | add_executable(krdpserver) 7 | 8 | target_sources(krdpserver PRIVATE main.cpp SessionController.cpp) 9 | 10 | kconfig_target_kcfg_file(krdpserver FILE krdpserversettings.kcfg CLASS_NAME ServerConfig SINGLETON) 11 | 12 | target_include_directories(krdpserver PRIVATE ${CMAKE_BINARY_DIR}) 13 | 14 | target_link_libraries(krdpserver PRIVATE Qt6::Gui KF6::CoreAddons KF6::ConfigGui KF6::DBusAddons KF6::Crash KRdp qt6keychain KF6::StatusNotifierItem KF6::I18n) 15 | 16 | if (BUILD_PLASMA_SESSION) 17 | target_compile_definitions(krdpserver PRIVATE -DWITH_PLASMA_SESSION) 18 | endif() 19 | 20 | configure_file(org.kde.krdpserver.desktop.cmake ${CMAKE_CURRENT_BINARY_DIR}/org.kde.krdpserver.desktop @ONLY) 21 | configure_file(app-org.kde.krdpserver.service.in ${CMAKE_CURRENT_BINARY_DIR}/app-org.kde.krdpserver.service @ONLY) 22 | 23 | install(TARGETS krdpserver DESTINATION ${KDE_INSTALL_BINDIR}) 24 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.kde.krdpserver.desktop DESTINATION ${KDE_INSTALL_APPDIR}) 25 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/app-org.kde.krdpserver.service DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR}) 26 | install(FILES 00-krdp.preset DESTINATION ${KDE_INSTALL_SYSTEMDUNITDIR}/user-preset) 27 | -------------------------------------------------------------------------------- /src/PeerContext.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #include "PeerContext_p.h" 6 | 7 | #include 8 | 9 | #include "krdp_logging.h" 10 | 11 | namespace KRdp 12 | { 13 | 14 | PeerContext *contextForPeer(freerdp_peer *peer) 15 | { 16 | return reinterpret_cast(peer->context); 17 | } 18 | 19 | } 20 | 21 | BOOL newPeerContext(freerdp_peer *peer, rdpContext *context) 22 | { 23 | auto peerContext = reinterpret_cast(context); 24 | 25 | // Initialize the virtual channel manager, so that we can create new 26 | // dynamic channels. 27 | peerContext->virtualChannelManager = WTSOpenServerA((LPSTR)peer->context); 28 | if (!peerContext->virtualChannelManager || peerContext->virtualChannelManager == INVALID_HANDLE_VALUE) { 29 | qCWarning(KRDP) << "Failed creating virtual channel manager"; 30 | freerdp_peer_context_free(peer); 31 | return FALSE; 32 | } 33 | 34 | return TRUE; 35 | } 36 | 37 | void freePeerContext(freerdp_peer * /*peer*/, rdpContext *context) 38 | { 39 | auto peerContext = reinterpret_cast(context); 40 | 41 | if (!peerContext) { 42 | return; 43 | } 44 | 45 | WTSCloseServer(peerContext->virtualChannelManager); 46 | peerContext->virtualChannelManager = nullptr; 47 | } 48 | -------------------------------------------------------------------------------- /LICENSES/BSD-3-Clause.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) . All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without modification, 4 | are permitted provided that the following conditions are met: 5 | 6 | 1. Redistributions of source code must retain the above copyright notice, 7 | this list of conditions and the following disclaimer. 8 | 9 | 2. Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | 3. Neither the name of the copyright holder nor the names of its contributors 14 | may be used to endorse or promote products derived from this software without 15 | specific prior written permission. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 21 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 23 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 24 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 26 | USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | -------------------------------------------------------------------------------- /src/Cursor.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | #include 10 | 11 | #include 12 | #include 13 | #include 14 | 15 | #include "krdp_export.h" 16 | 17 | namespace KRdp 18 | { 19 | 20 | class RdpConnection; 21 | 22 | /** 23 | * Encapsulates cursor-specific parts of the RDP protocol. 24 | * 25 | * Cursor information is sent separately from the video stream. We need to keep 26 | * track of some state, most importantly which cursor images have already been 27 | * sent so we don't have to re-send those. This class takes care of doing that 28 | * and the actual sending. 29 | */ 30 | class KRDP_EXPORT Cursor : public QObject 31 | { 32 | Q_OBJECT 33 | 34 | public: 35 | struct CursorUpdate { 36 | QPoint hotspot; 37 | QImage image; 38 | 39 | uint32_t cacheId = 0; 40 | std::chrono::steady_clock::time_point lastUsed; 41 | 42 | bool operator==(const CursorUpdate &other) const; 43 | }; 44 | 45 | enum class CursorType { 46 | Hidden, 47 | SystemDefault, 48 | Image, 49 | }; 50 | 51 | Cursor(RdpConnection *session); 52 | ~Cursor(); 53 | 54 | void update(const CursorUpdate &update); 55 | 56 | private: 57 | void setCursorType(CursorType type); 58 | 59 | class Private; 60 | const std::unique_ptr d; 61 | }; 62 | 63 | size_t qHash(const KRdp::Cursor::CursorUpdate &update, size_t seed = 0); 64 | 65 | } 66 | -------------------------------------------------------------------------------- /server/SessionController.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Arjen Hiemstra 2 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 3 | 4 | #pragma once 5 | 6 | #include "RdpConnection.h" 7 | #include 8 | #include 9 | #include 10 | 11 | #include 12 | 13 | namespace KRdp 14 | { 15 | class AbstractSession; 16 | class Server; 17 | class RdpConnection; 18 | } 19 | 20 | class SessionWrapper; 21 | 22 | class SessionController : public QObject 23 | { 24 | Q_OBJECT 25 | public: 26 | enum class SessionType { 27 | Portal, 28 | Plasma, 29 | }; 30 | 31 | SessionController(KRdp::Server *server, SessionType sessionType); 32 | ~SessionController() override; 33 | 34 | void setVirtualMonitor(const KRdp::VirtualMonitor &vm); 35 | void setMonitorIndex(const std::optional &index); 36 | void setQuality(const std::optional &quality); 37 | void setSNIStatus(const KRdp::RdpConnection::State state); 38 | void stopFromSNI(); 39 | 40 | private: 41 | void onNewConnection(KRdp::RdpConnection *newConnection); 42 | std::unique_ptr makeSession(); 43 | 44 | KRdp::Server *m_server = nullptr; 45 | SessionType m_sessionType; 46 | std::optional m_monitorIndex; 47 | std::optional m_quality; 48 | std::optional m_virtualMonitor; 49 | 50 | std::unique_ptr m_initializationSession; 51 | 52 | std::vector> m_wrappers; 53 | 54 | KStatusNotifierItem *m_sni; 55 | }; 56 | -------------------------------------------------------------------------------- /src/NetworkDetection.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | 10 | #include 11 | 12 | #include 13 | #include 14 | 15 | namespace KRdp 16 | { 17 | 18 | class RdpConnection; 19 | 20 | class NetworkDetection : public QObject 21 | { 22 | Q_OBJECT 23 | 24 | public: 25 | enum class State { 26 | None, 27 | PendingStop, 28 | QueuedStop, 29 | PendingResults, 30 | }; 31 | 32 | explicit NetworkDetection(RdpConnection *session); 33 | ~NetworkDetection(); 34 | 35 | Q_PROPERTY(std::chrono::system_clock::duration minimumRTT READ minimumRTT NOTIFY rttChanged) 36 | std::chrono::system_clock::duration minimumRTT() const; 37 | Q_PROPERTY(std::chrono::system_clock::duration averageRTT READ averageRTT NOTIFY rttChanged) 38 | std::chrono::system_clock::duration averageRTT() const; 39 | 40 | Q_SIGNAL void rttChanged(); 41 | 42 | void initialize(); 43 | 44 | void startBandwidthMeasure(); 45 | void stopBandwidthMeasure(); 46 | 47 | void update(); 48 | 49 | private: 50 | friend BOOL rttMeasureResponse(rdpAutoDetect *, RDP_TRANSPORT_TYPE, uint16_t); 51 | friend BOOL bwMeasureResults(rdpAutoDetect *, RDP_TRANSPORT_TYPE, uint16_t, uint16_t, uint32_t, uint32_t); 52 | 53 | bool onRttMeasureResponse(uint16_t sequence); 54 | bool onBandwidthMeasureResults(); 55 | 56 | void updateAverageRtt(); 57 | 58 | class Private; 59 | const std::unique_ptr d; 60 | }; 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/screencasting_p.h: -------------------------------------------------------------------------------- 1 | /* 2 | SPDX-FileCopyrightText: 2020 Aleix Pol Gonzalez 3 | 4 | SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 5 | */ 6 | 7 | #pragma once 8 | 9 | #include 10 | #include 11 | 12 | class ScreencastingPrivate; 13 | class ScreencastingStreamPrivate; 14 | class ScreencastingStream : public QObject 15 | { 16 | Q_OBJECT 17 | public: 18 | ScreencastingStream(QObject *parent); 19 | ~ScreencastingStream() override; 20 | 21 | quint32 nodeId() const; 22 | QSize size() const; 23 | 24 | Q_SIGNALS: 25 | void created(quint32 nodeid); 26 | void failed(const QString &error); 27 | void closed(); 28 | 29 | private: 30 | friend class Screencasting; 31 | std::unique_ptr d; 32 | }; 33 | 34 | class Screencasting : public QObject 35 | { 36 | Q_OBJECT 37 | public: 38 | explicit Screencasting(QObject *parent = nullptr); 39 | ~Screencasting() override; 40 | 41 | enum CursorMode { 42 | Hidden = 1, 43 | Embedded = 2, 44 | Metadata = 4, 45 | }; 46 | Q_ENUM(CursorMode) 47 | 48 | ScreencastingStream *createOutputStream(QScreen *screen, CursorMode mode); 49 | ScreencastingStream *createWorkspaceStream(CursorMode mode); 50 | ScreencastingStream *createRegionStream(QRect g, qreal scale, CursorMode mode); 51 | ScreencastingStream *createVirtualMonitorStream(const QString &name, const QSize &resolution, qreal dpr, CursorMode mode); 52 | 53 | void destroy(); 54 | 55 | Q_SIGNALS: 56 | void initialized(); 57 | void removed(); 58 | void sourcesChanged(); 59 | 60 | private: 61 | std::unique_ptr d; 62 | }; 63 | -------------------------------------------------------------------------------- /src/kcm/usersmodel.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2025 David Edmundson 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include "krdpserversettings.h" 8 | #include 9 | #include 10 | 11 | #include 12 | 13 | /* 14 | * A model representing a list of users that can be used to configure the KRDPServerSettings. 15 | * The first entry always represents the system user. 16 | * 17 | */ 18 | 19 | class UsersModel : public QAbstractListModel 20 | { 21 | Q_OBJECT 22 | public: 23 | explicit UsersModel(KRDPServerSettings *settings, QObject *parent = nullptr); 24 | 25 | enum Roles { 26 | /// both a human name but also an ID for additional users 27 | DisplayRole = Qt::DisplayRole, 28 | /// whether this entry represents the first entry for system login 29 | SystemUserRole = Qt::UserRole, 30 | // whether system user login is enabled, only applicable for SystemUserRole 31 | SystemUserEnabledRole = Qt::UserRole + 1 32 | }; 33 | 34 | int rowCount(const QModelIndex &parent = QModelIndex()) const override; 35 | QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 36 | bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; 37 | QHash roleNames() const override; 38 | 39 | 40 | QStringList users() const; 41 | /** 42 | * Updates both the model and the underlying configuration object 43 | */ 44 | void setUsers(const QStringList &users); 45 | 46 | private: 47 | KRDPServerSettings *m_settings; 48 | KUser m_currentUser; 49 | public: 50 | }; 51 | 52 | -------------------------------------------------------------------------------- /src/PortalSession.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #include "AbstractSession.h" 18 | #include "krdp_export.h" 19 | 20 | namespace KRdp 21 | { 22 | 23 | struct VideoFrame; 24 | class Server; 25 | 26 | /** 27 | * A FreeDesktop Remote Desktop Portal session. 28 | * 29 | * This encapsulates all the required setup to start a FreeDesktop Remote 30 | * Desktop Portal session including input sending and video streaming. 31 | */ 32 | class KRDP_EXPORT PortalSession : public AbstractSession 33 | { 34 | Q_OBJECT 35 | 36 | public: 37 | explicit PortalSession(); 38 | ~PortalSession() override; 39 | 40 | void start() override; 41 | /** 42 | * Send a new event to the portal. 43 | * 44 | * \param event The new event to send. 45 | */ 46 | void sendEvent(const std::shared_ptr &event) override; 47 | 48 | void setClipboardData(std::unique_ptr data) override; 49 | 50 | private: 51 | void onCreateSession(uint code, const QVariantMap &result); 52 | void onDevicesSelected(uint code, const QVariantMap &result); 53 | void onSourcesSelected(uint code, const QVariantMap &result); 54 | void onSessionStarted(uint code, const QVariantMap &result); 55 | void onPacketReceived(const PipeWireEncodedStream::Packet &data); 56 | Q_SLOT void onSessionClosed(); 57 | 58 | class Private; 59 | const std::unique_ptr d; 60 | }; 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/kcm/krdpserversettings.kcfg: -------------------------------------------------------------------------------- 1 | 2 | 7 | 11 | 12 | 13 | 14 | 15 | 3389 16 | 17 | 18 | 19 | true 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 75 30 | 31 | 32 | 33 | 34 | 35 | 36 | false 37 | 38 | 39 | 40 | false 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/kcm/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | # 3 | # SPDX-License-Identifier: BSD-2-Clause 4 | 5 | add_definitions(-DTRANSLATION_DOMAIN=\"kcm_krdpserver\") 6 | 7 | kcmutils_add_qml_kcm(kcm_krdpserver) 8 | 9 | kcmutils_generate_module_data(kcm_krdpserver 10 | MODULE_DATA_HEADER krdpserverdata.h 11 | MODULE_DATA_CLASS_NAME KRDPServerData 12 | SETTINGS_HEADERS krdpserversettings.h 13 | SETTINGS_CLASSES KRDPServerSettings 14 | ) 15 | 16 | kconfig_target_kcfg_file(kcm_krdpserver 17 | FILE krdpserversettings.kcfg 18 | CLASS_NAME KRDPServerSettings 19 | MUTATORS 20 | DEFAULT_VALUE_GETTERS 21 | GENERATE_PROPERTIES 22 | PARENT_IN_CONSTRUCTOR 23 | NOTIFIERS 24 | GENERATE_MOC 25 | ) 26 | 27 | ecm_qt_declare_logging_category(kcm_krdpserver 28 | HEADER krdp_logging.h 29 | IDENTIFIER KRDP 30 | CATEGORY_NAME org.kde.krdp 31 | DESCRIPTION "KRdp" 32 | EXPORT kcm_krdpserver 33 | DEFAULT_SEVERITY Debug 34 | ) 35 | 36 | target_sources(kcm_krdpserver PRIVATE 37 | kcmkrdpserver.cpp 38 | kcmkrdpserver.h 39 | usersmodel.cpp 40 | usersmodel.h 41 | ) 42 | 43 | qt_add_dbus_interface(kcm_krdpserver_dbus_srcs org.freedesktop.impl.portal.PermissionStore.xml org.freedesktop.impl.portal.PermissionStore) 44 | 45 | target_sources(kcm_krdpserver PRIVATE ${kcm_krdpserver_dbus_srcs}) 46 | 47 | ecm_qt_declare_logging_category(kcm_krdpserver 48 | HEADER krdpkcm_logging.h 49 | IDENTIFIER KRDPKCM 50 | CATEGORY_NAME org.kde.krdp.kcm 51 | DESCRIPTION "KRDPKCM" 52 | EXPORT kcm_krdpserver 53 | DEFAULT_SEVERITY Debug 54 | ) 55 | 56 | target_link_libraries(kcm_krdpserver PRIVATE 57 | Qt::Quick 58 | Qt::DBus 59 | qt6keychain 60 | KF6::CoreAddons 61 | KF6::KCMUtils 62 | KF6::KCMUtilsQuick 63 | KF6::I18n 64 | K::KPipeWireRecord 65 | Systemd::systemd 66 | ) 67 | 68 | ecm_qt_install_logging_categories(EXPORT kcm_krdpserver DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR}) 69 | -------------------------------------------------------------------------------- /src/PortalSession_p.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #include "krdp_export.h" 18 | 19 | namespace KRdp 20 | { 21 | 22 | /** 23 | * Convenience class to help with making requests to the Desktop portal less cumbersome to work with. 24 | * 25 | * A request to the portal requires first calling a method on the portal, which 26 | * will return an object path that should be listened to for a signal. The 27 | * signal provides the actual proper data for the original method call. 28 | */ 29 | class PortalRequest : public QObject 30 | { 31 | Q_OBJECT 32 | public: 33 | template 34 | PortalRequest(const QDBusPendingCall &call, ContextType *context, Callback callback) 35 | : m_context(context) 36 | { 37 | if constexpr (std::is_member_function_pointer::value) { 38 | m_callback = std::bind(callback, context, std::placeholders::_1, std::placeholders::_2); 39 | } else { 40 | m_callback = callback; 41 | } 42 | 43 | auto watcher = new QDBusPendingCallWatcher(call); 44 | // We need to wait here because otherwise we risk the signal arriving 45 | // before we know what path to listen on. 46 | watcher->waitForFinished(); 47 | onStarted(watcher); 48 | } 49 | 50 | private: 51 | void onStarted(QDBusPendingCallWatcher *watcher); 52 | Q_SLOT void onFinished(uint code, const QVariantMap &result); 53 | 54 | QPointer m_context; 55 | std::function m_callback; 56 | }; 57 | 58 | struct PortalSessionStream { 59 | uint nodeId; 60 | QVariantMap map; 61 | }; 62 | 63 | } 64 | 65 | Q_DECLARE_METATYPE(KRdp::PortalSessionStream) 66 | -------------------------------------------------------------------------------- /src/kcm/usersmodel.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2025 David Edmundson 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #include "usersmodel.h" 6 | 7 | UsersModel::UsersModel(KRDPServerSettings *settings, QObject *parent) 8 | : QAbstractListModel(parent) 9 | , m_settings(settings) 10 | { 11 | } 12 | 13 | int UsersModel::rowCount(const QModelIndex &parent) const 14 | { 15 | if (parent.isValid()) 16 | return 0; 17 | 18 | return m_settings->users().size() + 1; 19 | } 20 | 21 | QVariant UsersModel::data(const QModelIndex &index, int role) const 22 | { 23 | if (!index.isValid() || index.row() >= m_settings->users().size() +1) 24 | return QVariant(); 25 | 26 | if (index.row() == 0) { 27 | switch (role) { 28 | case DisplayRole: 29 | return m_currentUser.loginName(); 30 | case SystemUserRole: 31 | return true; 32 | case SystemUserEnabledRole: 33 | return m_settings->systemUserEnabled(); 34 | } 35 | } else { 36 | switch (role) { 37 | case DisplayRole: 38 | return m_settings->users().at(index.row() - 1); 39 | case SystemUserRole: 40 | return false; 41 | } 42 | } 43 | 44 | return QVariant(); 45 | } 46 | 47 | bool UsersModel::setData(const QModelIndex &index, const QVariant &value, int role) 48 | { 49 | if (index.row() != 0) { 50 | Q_ASSERT(false); 51 | return false; 52 | } 53 | if (role != SystemUserEnabledRole) { 54 | Q_ASSERT(false); 55 | return false; 56 | } 57 | m_settings->setSystemUserEnabled(value.toBool()); 58 | Q_EMIT dataChanged(index, index, {role}); 59 | return true; 60 | } 61 | 62 | QHash UsersModel::roleNames() const 63 | { 64 | QHash roles; 65 | roles[DisplayRole] = "userName"; 66 | roles[SystemUserRole] = "systemUser"; 67 | roles[SystemUserEnabledRole] = "systemUserEnabled"; 68 | return roles; 69 | } 70 | 71 | QStringList UsersModel::users() const 72 | { 73 | return m_settings->users(); 74 | } 75 | 76 | void UsersModel::setUsers(const QStringList &users) 77 | { 78 | beginResetModel(); 79 | m_settings->setUsers(users); 80 | endResetModel(); 81 | } 82 | -------------------------------------------------------------------------------- /examples/streamer/main.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #include 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include "PortalSession.h" 15 | #include "VideoStream.h" 16 | 17 | using namespace Qt::StringLiterals; 18 | 19 | int main(int argc, char **argv) 20 | { 21 | QGuiApplication application{argc, argv}; 22 | 23 | QCommandLineParser parser; 24 | parser.addHelpOption(); 25 | parser.addOptions({ 26 | {u"quit-after"_s, u"Quit after running for this amount of seconds"_s, u"seconds"_s}, 27 | {u"monitor"_s, u"Index of the monitor to display."_s, u"monitor"_s, u"-1"_s}, 28 | {u"quality"_s, u"Encoding quality of the stream, from 0 (lowest) to 100 (highest)"_s, u"quality"_s}, 29 | }); 30 | parser.process(application); 31 | 32 | KRdp::PortalSession session; 33 | session.requestStreamingEnable(&application); 34 | session.setActiveStream(parser.value(u"monitor"_s).toInt()); 35 | if (parser.isSet(u"quality"_s)) { 36 | session.setVideoQuality(parser.value(u"quality"_s).toUShort()); 37 | } 38 | 39 | signal(SIGINT, [](int) { 40 | QCoreApplication::exit(0); 41 | }); 42 | 43 | signal(SIGUSR1, [](int) { 44 | QCoreApplication::exit(0); 45 | }); 46 | 47 | QFile file{u"stream.raw"_s}; 48 | if (!file.open(QFile::WriteOnly)) { 49 | qDebug() << "Failed opening stream.raw"; 50 | return -1; 51 | } 52 | 53 | QObject::connect(&session, &KRdp::PortalSession::frameReceived, &session, [&file](const KRdp::VideoFrame &frame) { 54 | file.write(frame.data); 55 | }); 56 | 57 | QTimer timer; 58 | QObject::connect(&timer, &QTimer::timeout, &application, &QCoreApplication::quit); 59 | if (parser.isSet(u"quit-after"_s)) { 60 | QObject::connect(&session, &KRdp::PortalSession::started, &timer, qOverload<>(&QTimer::start)); 61 | timer.setInterval(parser.value(u"quit-after"_s).toInt() * 1000); 62 | } 63 | 64 | session.start(); 65 | auto result = application.exec(); 66 | 67 | file.close(); 68 | 69 | return result; 70 | } 71 | -------------------------------------------------------------------------------- /cmake/FindPAM.cmake: -------------------------------------------------------------------------------- 1 | # - Try to find the PAM libraries 2 | # Once done this will define 3 | # 4 | # PAM_FOUND - system has pam 5 | # PAM_INCLUDE_DIR - the pam include directory 6 | # PAM_LIBRARIES - libpam library 7 | 8 | #============================================================================= 9 | # SPDX-FileCopyrightText: 2015 Bhushan Shah 10 | # 11 | # SPDX-License-Identifier: BSD-3-Clause 12 | #============================================================================= 13 | 14 | if (PAM_INCLUDE_DIR AND PAM_LIBRARY) 15 | # Already in cache, be silent 16 | set(PAM_FIND_QUIETLY TRUE) 17 | endif (PAM_INCLUDE_DIR AND PAM_LIBRARY) 18 | 19 | find_path(PAM_INCLUDE_DIR NAMES security/pam_appl.h pam/pam_appl.h) 20 | find_library(PAM_LIBRARY pam) 21 | find_library(DL_LIBRARY dl) 22 | 23 | if (PAM_INCLUDE_DIR AND PAM_LIBRARY) 24 | set(PAM_FOUND TRUE) 25 | if (DL_LIBRARY) 26 | set(PAM_LIBRARIES ${PAM_LIBRARY} ${DL_LIBRARY}) 27 | else (DL_LIBRARY) 28 | set(PAM_LIBRARIES ${PAM_LIBRARY}) 29 | endif (DL_LIBRARY) 30 | 31 | if (EXISTS ${PAM_INCLUDE_DIR}/pam/pam_appl.h) 32 | # darwin claims to be something special 33 | set(HAVE_PAM_PAM_APPL_H 1) 34 | endif (EXISTS ${PAM_INCLUDE_DIR}/pam/pam_appl.h) 35 | 36 | if (NOT DEFINED PAM_MESSAGE_CONST) 37 | include(CheckCXXSourceCompiles) 38 | # XXX does this work with plain c? 39 | check_cxx_source_compiles(" 40 | #if ${HAVE_PAM_PAM_APPL_H}+0 41 | # include 42 | #else 43 | # include 44 | #endif 45 | 46 | static int PAM_conv( 47 | int num_msg, 48 | const struct pam_message **msg, /* this is the culprit */ 49 | struct pam_response **resp, 50 | void *ctx) 51 | { 52 | return 0; 53 | } 54 | 55 | int main(void) 56 | { 57 | struct pam_conv PAM_conversation = { 58 | &PAM_conv, /* this bombs out if the above does not match */ 59 | 0 60 | }; 61 | 62 | return 0; 63 | } 64 | " PAM_MESSAGE_CONST) 65 | endif (NOT DEFINED PAM_MESSAGE_CONST) 66 | set(PAM_MESSAGE_CONST ${PAM_MESSAGE_CONST} CACHE BOOL "PAM expects a conversation function with const pam_message") 67 | 68 | endif (PAM_INCLUDE_DIR AND PAM_LIBRARY) 69 | 70 | if (PAM_FOUND) 71 | if (NOT PAM_FIND_QUIETLY) 72 | message(STATUS "Found PAM: ${PAM_LIBRARIES}") 73 | endif (NOT PAM_FIND_QUIETLY) 74 | else (PAM_FOUND) 75 | if (PAM_FIND_REQUIRED) 76 | message(FATAL_ERROR "PAM was not found") 77 | endif(PAM_FIND_REQUIRED) 78 | endif (PAM_FOUND) 79 | 80 | mark_as_advanced(PAM_INCLUDE_DIR PAM_LIBRARY DL_LIBRARY PAM_MESSAGE_CONST) 81 | -------------------------------------------------------------------------------- /src/InputHandler.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | 9 | #include 10 | #include 11 | 12 | #include 13 | 14 | #include "krdp_export.h" 15 | 16 | namespace KRdp 17 | { 18 | 19 | class RdpConnection; 20 | 21 | /** 22 | * This class processes RDP input events and converts them to Qt events. 23 | * 24 | * One input handler is created per session. 25 | */ 26 | class KRDP_EXPORT InputHandler : public QObject 27 | { 28 | Q_OBJECT 29 | 30 | public: 31 | explicit InputHandler(RdpConnection *session); 32 | ~InputHandler() override; 33 | 34 | /** 35 | * Initialize the InputHandler. Called from within Session::initialize(). 36 | */ 37 | void initialize(rdpInput *input); 38 | 39 | /** 40 | * Emitted whenever a new input event was received from the client. 41 | * 42 | * \param event The input event that was received. 43 | */ 44 | // Note: Intentional pass-by-value to ensure lifetime of the shared_ptr is extended. 45 | Q_SIGNAL void inputEvent(std::shared_ptr event); 46 | 47 | private: 48 | // FreeRDP callbacks that need to call the event handler functions in the 49 | // handler. 50 | friend BOOL inputSynchronizeEvent(rdpInput *, uint32_t); 51 | friend BOOL inputMouseEvent(rdpInput *, uint16_t, uint16_t, uint16_t); 52 | friend BOOL inputExtendedMouseEvent(rdpInput *, uint16_t, uint16_t, uint16_t); 53 | friend BOOL inputKeyboardEvent(rdpInput *, uint16_t, uint8_t); 54 | friend BOOL inputUnicodeKeyboardEvent(rdpInput *, uint16_t, uint16_t); 55 | 56 | /** 57 | * Called when the state of modifier keys changes. 58 | * 59 | * \param flags The state of modifier keys. 60 | */ 61 | bool synchronizeEvent(uint32_t flags); 62 | /** 63 | * Called when a new mouse event was sent. 64 | * 65 | * \param x The X position, in client coordinates. 66 | * \param y The Y position, in client coordinates. 67 | * \param flags Mouse button state and other flags. 68 | */ 69 | bool mouseEvent(uint16_t x, uint16_t y, uint16_t flags); 70 | bool extendedMouseEvent(uint16_t x, uint16_t y, uint16_t flags); 71 | bool keyboardEvent(uint16_t code, uint16_t flags); 72 | bool unicodeKeyboardEvent(uint16_t code, uint16_t flags); 73 | 74 | class Private; 75 | const std::unique_ptr d; 76 | }; 77 | 78 | } 79 | -------------------------------------------------------------------------------- /po/sk/krdpserver.po: -------------------------------------------------------------------------------- 1 | # translation of krdpserver.po to Slovak 2 | # SPDX-FileCopyrightText: 2024 Roman Paholik 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: krdpserver\n" 6 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 7 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 8 | "PO-Revision-Date: 2024-11-11 17:49+0100\n" 9 | "Last-Translator: Roman Paholík \n" 10 | "Language-Team: Slovak \n" 11 | "Language: sk\n" 12 | "MIME-Version: 1.0\n" 13 | "Content-Type: text/plain; charset=UTF-8\n" 14 | "Content-Transfer-Encoding: 8bit\n" 15 | "X-Generator: Lokalize 24.08.3\n" 16 | "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" 17 | 18 | #, kde-format 19 | msgctxt "NAME OF TRANSLATORS" 20 | msgid "Your names" 21 | msgstr "Roman Paholík" 22 | 23 | #, kde-format 24 | msgctxt "EMAIL OF TRANSLATORS" 25 | msgid "Your emails" 26 | msgstr "wizzardsk@gmail.com" 27 | 28 | #. i18n: ectx: label, entry (ListenPort), group (General) 29 | #: krdpserversettings.kcfg:14 30 | #, kde-format 31 | msgid "The port the server listens on" 32 | msgstr "" 33 | 34 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 35 | #: krdpserversettings.kcfg:18 36 | #, kde-format 37 | msgid "Are certificates autogenerated during server start" 38 | msgstr "" 39 | 40 | #. i18n: ectx: label, entry (Certificate), group (General) 41 | #: krdpserversettings.kcfg:22 42 | #, kde-format 43 | msgid "The certificate to use for TLS connections" 44 | msgstr "" 45 | 46 | #. i18n: ectx: label, entry (CertificateKey), group (General) 47 | #: krdpserversettings.kcfg:25 48 | #, kde-format 49 | msgid "The key that matches the TLS certificate" 50 | msgstr "" 51 | 52 | #. i18n: ectx: label, entry (Quality), group (General) 53 | #: krdpserversettings.kcfg:28 54 | #, kde-format 55 | msgid "The quality of the video stream" 56 | msgstr "" 57 | 58 | #. i18n: ectx: label, entry (Users), group (General) 59 | #: krdpserversettings.kcfg:32 60 | #, kde-format 61 | msgid "Users allowed to login, passwords are stored in KWallet" 62 | msgstr "" 63 | 64 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 65 | #: krdpserversettings.kcfg:35 66 | #, kde-format 67 | msgid "Whether the current user can log in via PAM" 68 | msgstr "" 69 | 70 | #. i18n: ectx: label, entry (Autostart), group (General) 71 | #: krdpserversettings.kcfg:39 72 | #, kde-format 73 | msgid "Autostart the server on login" 74 | msgstr "" 75 | 76 | #: SessionController.cpp:102 77 | #, kde-format 78 | msgid "RDP Server" 79 | msgstr "" 80 | 81 | #: SessionController.cpp:105 82 | #, kde-format 83 | msgid "Quit" 84 | msgstr "Ukončiť" 85 | -------------------------------------------------------------------------------- /po/de/krdpserver.po: -------------------------------------------------------------------------------- 1 | # German translations for krdp package 2 | # German translation for krdp. 3 | # Copyright (C) 2024 This file is copyright: 4 | # This file is distributed under the same license as the krdp package. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdpserver\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2024-05-27 09:23+0200\n" 11 | "Last-Translator: Automatically generated\n" 12 | "Language-Team: German \n" 13 | "Language: de\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | 19 | #, kde-format 20 | msgctxt "NAME OF TRANSLATORS" 21 | msgid "Your names" 22 | msgstr "Deutsches KDE-Übersetzungsteam" 23 | 24 | #, kde-format 25 | msgctxt "EMAIL OF TRANSLATORS" 26 | msgid "Your emails" 27 | msgstr "kde-i18n-de@kde.org" 28 | 29 | #. i18n: ectx: label, entry (ListenPort), group (General) 30 | #: krdpserversettings.kcfg:14 31 | #, kde-format 32 | msgid "The port the server listens on" 33 | msgstr "" 34 | 35 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 36 | #: krdpserversettings.kcfg:18 37 | #, kde-format 38 | msgid "Are certificates autogenerated during server start" 39 | msgstr "" 40 | 41 | #. i18n: ectx: label, entry (Certificate), group (General) 42 | #: krdpserversettings.kcfg:22 43 | #, kde-format 44 | msgid "The certificate to use for TLS connections" 45 | msgstr "" 46 | 47 | #. i18n: ectx: label, entry (CertificateKey), group (General) 48 | #: krdpserversettings.kcfg:25 49 | #, kde-format 50 | msgid "The key that matches the TLS certificate" 51 | msgstr "" 52 | 53 | #. i18n: ectx: label, entry (Quality), group (General) 54 | #: krdpserversettings.kcfg:28 55 | #, kde-format 56 | msgid "The quality of the video stream" 57 | msgstr "" 58 | 59 | #. i18n: ectx: label, entry (Users), group (General) 60 | #: krdpserversettings.kcfg:32 61 | #, kde-format 62 | msgid "Users allowed to login, passwords are stored in KWallet" 63 | msgstr "" 64 | 65 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 66 | #: krdpserversettings.kcfg:35 67 | #, kde-format 68 | msgid "Whether the current user can log in via PAM" 69 | msgstr "" 70 | 71 | #. i18n: ectx: label, entry (Autostart), group (General) 72 | #: krdpserversettings.kcfg:39 73 | #, kde-format 74 | msgid "Autostart the server on login" 75 | msgstr "" 76 | 77 | #: SessionController.cpp:102 78 | #, kde-format 79 | msgid "RDP Server" 80 | msgstr "" 81 | 82 | #: SessionController.cpp:105 83 | #, kde-format 84 | msgid "Quit" 85 | msgstr "" 86 | -------------------------------------------------------------------------------- /po/pa/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024 A S Alam 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2024-10-01 14:51-0500\n" 11 | "Last-Translator: A S Alam \n" 12 | "Language-Team: pa\n" 13 | "Language: pa\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Generator: Lokalize 24.08.0\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ ੨੦੨੪" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "aalam@punlinux.org" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "ਸਰਵਰ ਜਿਸ ਪੋਰਟ ਉੱਤੇ ਸੁਣਦਾ ਹੈ" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "" 87 | -------------------------------------------------------------------------------- /po/cs/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # SPDX-FileCopyrightText: 2024 Vit Pelcak 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2024-08-13 13:25+0200\n" 11 | "Last-Translator: Vit Pelcak \n" 12 | "Language-Team: Czech \n" 13 | "Language: cs\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" 18 | "X-Generator: Lokalize 24.05.2\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Vít Pelčák" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "vit@pelcak.org" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "Server RDP" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "Ukončit" 87 | -------------------------------------------------------------------------------- /po/zh_CN/krdpserver.po: -------------------------------------------------------------------------------- 1 | msgid "" 2 | msgstr "" 3 | "Project-Id-Version: kdeorg\n" 4 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 5 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 6 | "PO-Revision-Date: 2024-05-27 19:11\n" 7 | "Last-Translator: \n" 8 | "Language-Team: Chinese Simplified\n" 9 | "Language: zh_CN\n" 10 | "MIME-Version: 1.0\n" 11 | "Content-Type: text/plain; charset=UTF-8\n" 12 | "Content-Transfer-Encoding: 8bit\n" 13 | "Plural-Forms: nplurals=1; plural=0;\n" 14 | "X-Crowdin-Project: kdeorg\n" 15 | "X-Crowdin-Project-ID: 269464\n" 16 | "X-Crowdin-Language: zh-CN\n" 17 | "X-Crowdin-File: /kf6-trunk/messages/krdp/krdpserver.pot\n" 18 | "X-Crowdin-File-ID: 53710\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Guo Yunhe, Tyson Tan" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "i@guoyunhe.me, tds00@qq.com" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "服务器监听的端口" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "是否在服务器启动时自动生成证书" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "用于 TLS 连接的证书" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "匹配该 TLS 证书的密钥" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "视频流的画质" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "用户允许登录,密码保存在 KWallet" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "当前用户是否可以通过 PAM 登录" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "登录时自动启动服务器" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "RDP 服务器" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "退出" 87 | -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | # SPDX-License-Identifier: BSD-2-Clause 3 | 4 | add_library(KRdp) 5 | 6 | if (BUILD_PLASMA_SESSION) 7 | if (Qt6_VERSION VERSION_GREATER_EQUAL "6.8.0") 8 | set(private_code_option "PRIVATE_CODE") 9 | endif() 10 | qt6_generate_wayland_protocol_client_sources(KRdp FILES 11 | ${PLASMA_WAYLAND_PROTOCOLS_DIR}/zkde-screencast-unstable-v1.xml 12 | ${PLASMA_WAYLAND_PROTOCOLS_DIR}/fake-input.xml 13 | ${Wayland_DATADIR}/wayland.xml 14 | ${private_code_option} 15 | ) 16 | target_sources(KRdp PRIVATE screencasting.cpp PlasmaScreencastV1Session.cpp) 17 | endif() 18 | 19 | target_sources(KRdp PRIVATE 20 | AbstractSession.cpp 21 | Clipboard.cpp 22 | Clipboard.h 23 | RdpConnection.cpp 24 | Server.cpp 25 | Server.h 26 | InputHandler.cpp 27 | InputHandler.h 28 | PeerContext.cpp 29 | PeerContext_p.h 30 | PortalSession.cpp 31 | PortalSession.h 32 | VideoStream.cpp 33 | VideoStream.h 34 | Cursor.cpp 35 | Cursor.h 36 | NetworkDetection.cpp 37 | NetworkDetection.h 38 | ) 39 | 40 | ecm_qt_declare_logging_category(KRdp 41 | HEADER krdp_logging.h 42 | IDENTIFIER KRDP 43 | CATEGORY_NAME org.kde.krdp 44 | DESCRIPTION "KRdp" 45 | EXPORT KRdp 46 | DEFAULT_SEVERITY Debug 47 | ) 48 | 49 | ecm_generate_export_header(KRdp 50 | BASE_NAME KRdp 51 | VERSION ${CMAKE_PROJECT_VERSION} 52 | DEPRECATED_BASE_VERSION 0 53 | EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT} 54 | ) 55 | 56 | qt6_add_dbus_interface(_dbus_sources xdp_dbus_remotedesktop_interface.xml xdp_dbus_remotedesktop_interface) 57 | qt6_add_dbus_interface(_dbus_sources xdp_dbus_screencast_interface.xml xdp_dbus_screencast_interface) 58 | target_sources(KRdp PRIVATE ${_dbus_sources}) 59 | 60 | target_include_directories(KRdp PUBLIC ${FreeRDP_INCLUDE_DIR} ${WinPR_INCLUDE_DIR} ${FreeRDP_Server_INCLUDE_DIR}) 61 | 62 | target_link_libraries(KRdp PUBLIC 63 | Qt::Core 64 | Qt::Gui 65 | Qt::Network 66 | Qt::DBus 67 | Qt::WaylandClient 68 | Qt::GuiPrivate 69 | 70 | freerdp 71 | winpr 72 | freerdp-server 73 | KF6::CoreAddons 74 | KF6::GuiAddons 75 | ${PAM_LIBRARIES} 76 | 77 | KF6::ConfigCore 78 | K::KPipeWire 79 | K::KPipeWireRecord 80 | XKB::XKB 81 | ) 82 | 83 | set_target_properties(KRdp PROPERTIES 84 | VERSION ${PROJECT_VERSION} 85 | SOVERSION ${PROJECT_VERSION_MAJOR} 86 | ) 87 | 88 | install(TARGETS KRdp DESTINATION ${KDE_INSTALL_LIBDIR}) 89 | 90 | ecm_qt_install_logging_categories(EXPORT KRdp DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR}) 91 | 92 | add_subdirectory(kcm) 93 | -------------------------------------------------------------------------------- /po/ko/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # SPDX-FileCopyrightText: 2024, 2025 Shinjo Park 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-10-09 01:01+0200\n" 11 | "Last-Translator: Shinjo Park \n" 12 | "Language-Team: Korean \n" 13 | "Language: ko\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=1; plural=0;\n" 18 | "X-Generator: Lokalize 24.12.3\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "박신조" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "kde@peremen.name" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "서버가 연결을 받아들이는 포트" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "서버 시작 시 인증서 자동 생성 여부" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "TLS 연결에 사용할 인증서" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "TLS 인증서와 일치하는 키" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "동영상 스트림 품질" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "로그인이 허용된 사용자, 암호는 KWallet에 저장됨" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "현재 사용자를 PAM으로 로그인할지 여부" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "로그인할 때 서버 자동으로 시작" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "RDP 서버" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "끝내기" 87 | -------------------------------------------------------------------------------- /po/zh_TW/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024, 2025 Kisaragi Hiu 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-05 17:12+0900\n" 11 | "Last-Translator: Kisaragi Hiu \n" 12 | "Language-Team: Traditional Chinese \n" 13 | "Language: zh_TW\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=1; plural=0;\n" 18 | "X-Generator: Lokalize 25.11.70\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Kisaragi Hiu" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "mail@kisaragi-hiu.com" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "伺服器所聆聽的連接埠" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "憑證是否在伺服器啟動時自動產生" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "TLS 連線所使用的憑證" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "與 TLS 憑證相符的金鑰" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "視訊串流的品質" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "允許登入的使用者,密碼會儲存在 KWallet 中" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "目前使用者是否能夠透過 PAM 登入" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "登入時自動啟動伺服器" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "RDP 伺服器" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "離開" 87 | -------------------------------------------------------------------------------- /po/nn/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Translation of krdpserver to Norwegian Nynorsk 2 | # 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: krdp\n" 6 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 7 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 8 | "PO-Revision-Date: 2024-08-26 22:14+0200\n" 9 | "Last-Translator: Karl Ove Hufthammer \n" 10 | "Language-Team: Norwegian Nynorsk \n" 11 | "Language: nn\n" 12 | "MIME-Version: 1.0\n" 13 | "Content-Type: text/plain; charset=UTF-8\n" 14 | "Content-Transfer-Encoding: 8bit\n" 15 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 16 | "X-Generator: Lokalize 24.11.70\n" 17 | "X-Environment: kde\n" 18 | "X-Accelerator-Marker: &\n" 19 | "X-Text-Markup: kde4\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Karl Ove Hufthammer" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "karl@huftis.org" 30 | 31 | #. i18n: ectx: label, entry (ListenPort), group (General) 32 | #: krdpserversettings.kcfg:14 33 | #, kde-format 34 | msgid "The port the server listens on" 35 | msgstr "Porten som tenaren lyttar på" 36 | 37 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 38 | #: krdpserversettings.kcfg:18 39 | #, kde-format 40 | msgid "Are certificates autogenerated during server start" 41 | msgstr "Vert sertifikat autogenererte ved tenarstart" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "Sertifikat brukt for TLS-tilkoplingar" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "Nøkkel som passar til TLS-sertifikatet" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "Kvaliteten på videostraumen" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "Brukarar med løyve til å logga inn (passorda vert lagra i KWallet)" 66 | 67 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 68 | #: krdpserversettings.kcfg:35 69 | #, kde-format 70 | msgid "Whether the current user can log in via PAM" 71 | msgstr "" 72 | 73 | #. i18n: ectx: label, entry (Autostart), group (General) 74 | #: krdpserversettings.kcfg:39 75 | #, kde-format 76 | msgid "Autostart the server on login" 77 | msgstr "Start automatisk tenaren ved innlogging" 78 | 79 | #: SessionController.cpp:102 80 | #, kde-format 81 | msgid "RDP Server" 82 | msgstr "RDP-tenar" 83 | 84 | #: SessionController.cpp:105 85 | #, kde-format 86 | msgid "Quit" 87 | msgstr "Avslutt" 88 | -------------------------------------------------------------------------------- /po/az/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2025 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2025 linux 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-05-22 16:52+0400\n" 11 | "Last-Translator: linux \n" 12 | "Language-Team: Azerbaijani \n" 13 | "Language: az\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | "X-Generator: Lokalize 25.04.1\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Xəyyam Qocayev" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "xxmn77@gmail.com" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "Serverin cavab gözlədiyi port" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "Server işə düşdüyü zaman sertifikatlar avtomatik yaradılır" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "TLS bağlantısı üçün istifadə olunan sertifikat" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "TLS sertifikatına uyğun gələn açar" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "Video axının keyfiyyəti" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "Girişə icazə verilən istifadəçilərin şifrələri KWallet-də saxlanılır" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "Girişdə serveri avtomatik başlatmaq" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "RDP Serveri" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "Çıxış" 87 | -------------------------------------------------------------------------------- /po/hi/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Hindi translations for krdp package. 2 | # Copyright (C) 2024 This file is copyright: 3 | # This file is distributed under the same license as the krdp package. 4 | # Kali , 2024. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: krdp\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 11 | "PO-Revision-Date: 2024-12-15 17:35+0530\n" 12 | "Last-Translator: Kali \n" 13 | "Language-Team: Hindi \n" 14 | "Language: hi\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=(n!=1);\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "तुम्हारे नाम" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "आपके ईमेल" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "वह पोर्ट जिस पर सर्वर सुनता है" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "क्या सर्वर प्रारंभ होने के दौरान प्रमाणपत्र स्वतः उत्पन्न होते हैं" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "TLS कनेक्शन के लिए उपयोग किया जाने वाला प्रमाणपत्र" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "वह कुंजी जो TLS प्रमाणपत्र से मेल खाती है" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "वीडियो स्ट्रीम की गुणवत्ता" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "उपयोगकर्ताओं को लॉगिन करने की अनुमति है, पासवर्ड KWallet में संग्रहीत हैं" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "लॉगिन पर सर्वर को स्वचालित रूप से प्रारंभ करें" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "आरडीपी सर्वर" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "छोड़ना" 87 | -------------------------------------------------------------------------------- /po/en_GB/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024 Steve Allewell 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2024-08-24 12:03+0100\n" 11 | "Last-Translator: Steve Allewell \n" 12 | "Language-Team: British English\n" 13 | "Language: en_GB\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Generator: Lokalize 24.05.2\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Steve Allewell" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "steve.allewell@gmail.com" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "The port the server listens on" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "Are certificates autogenerated during server start" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "The certificate to use for TLS connections" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "The key that matches the TLS certificate" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "The quality of the video stream" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "Users allowed to login, passwords are stored in KWallet" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "Autostart the server on login" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "RDP Server" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "Quit" 87 | -------------------------------------------------------------------------------- /po/he/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024, 2025 Yaron Shahrabani 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-05 13:27+0300\n" 11 | "Last-Translator: Yaron Shahrabani \n" 12 | "Language-Team: צוות התרגום של KDE ישראל\n" 13 | "Language: he\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " 18 | "n % 10 == 0) ? 2 : 3));\n" 19 | "X-Generator: Lokalize 25.08.0\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "צוות התרגום של KDE ישראל" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "kde-l10n-he@kde.org" 30 | 31 | #. i18n: ectx: label, entry (ListenPort), group (General) 32 | #: krdpserversettings.kcfg:14 33 | #, kde-format 34 | msgid "The port the server listens on" 35 | msgstr "הפתחה דרכה מאזין השרת" 36 | 37 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 38 | #: krdpserversettings.kcfg:18 39 | #, kde-format 40 | msgid "Are certificates autogenerated during server start" 41 | msgstr "האם אישורים נוצרים מחדש עם הפעלת השרת" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "האישור לשימוש לחיבורי TLS" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "המפתח שמתאים לאישור ה־TLS" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "איכות שידור הווידאו" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "למשתמשים מותר להיכנס, סיסמאות מאוחסנות ב־KWallet" 66 | 67 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 68 | #: krdpserversettings.kcfg:35 69 | #, kde-format 70 | msgid "Whether the current user can log in via PAM" 71 | msgstr "האם המשתמש הנוכחי יכול להיכנס דרך PAM" 72 | 73 | #. i18n: ectx: label, entry (Autostart), group (General) 74 | #: krdpserversettings.kcfg:39 75 | #, kde-format 76 | msgid "Autostart the server on login" 77 | msgstr "להתחיל את השרת אוטומטית עם הכניסה" 78 | 79 | #: SessionController.cpp:102 80 | #, kde-format 81 | msgid "RDP Server" 82 | msgstr "שרת RDP" 83 | 84 | #: SessionController.cpp:105 85 | #, kde-format 86 | msgid "Quit" 87 | msgstr "יציאה" 88 | -------------------------------------------------------------------------------- /po/ia/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024 giovanni 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2024-09-02 15:33+0200\n" 11 | "Last-Translator: giovanni \n" 12 | "Language-Team: Interlingua \n" 13 | "Language: ia\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Generator: Lokalize 23.08.5\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Giovanni Sora" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "g.sora@tiscali.it" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "Le porto ubi le servitor ascolta" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "" 41 | "ES certificatos generate automaticamente durante que le servitor starta" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "Le certificato a usar per connexiones TLS" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "Le clave que corresponde al certificato TLS" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "Le qualitate del fluxo de video" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "Usatores permittite a acceder,contrasignos es immagazinate in KWallet" 66 | 67 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 68 | #: krdpserversettings.kcfg:35 69 | #, kde-format 70 | msgid "Whether the current user can log in via PAM" 71 | msgstr "" 72 | 73 | #. i18n: ectx: label, entry (Autostart), group (General) 74 | #: krdpserversettings.kcfg:39 75 | #, kde-format 76 | msgid "Autostart the server on login" 77 | msgstr "Starta automaticamente le servitor al accesso" 78 | 79 | #: SessionController.cpp:102 80 | #, kde-format 81 | msgid "RDP Server" 82 | msgstr "Servitor RDP" 83 | 84 | #: SessionController.cpp:105 85 | #, kde-format 86 | msgid "Quit" 87 | msgstr "Quita" 88 | -------------------------------------------------------------------------------- /po/fi/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # SPDX-FileCopyrightText: 2024, 2025 Tommi Nieminen 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-12 16:43+0300\n" 11 | "Last-Translator: Tommi Nieminen \n" 12 | "Language-Team: Finnish \n" 13 | "Language: fi\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | "X-Generator: Lokalize 25.04.0\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Tommi Nieminen" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "translator@legisign.org" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "Palvelimen kuuntelema portti" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "Luodaanko varmenteet automaattisesti palvelinta käynnistettäessä" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "TLS-yhteyksissä käytettävä varmenne" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "TLS-varmennetta vastaava avain" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "Videovirran laatu" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "Käyttäjät, jotka saavat kirjautua; salasanat talletetaan lompakkoon" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "Voiko nykyinen käyttäjä kirjautua PAMilla" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "Käynnistä palvelin automaattisesti kirjauduttaessa" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "RDP-palvelin" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "Lopeta" 87 | -------------------------------------------------------------------------------- /po/fr/krdpserver.po: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2024, 2025 Xavier Besnard 2 | msgid "" 3 | msgstr "" 4 | "Project-Id-Version: krdp\n" 5 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 6 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 7 | "PO-Revision-Date: 2025-09-06 07:19+0200\n" 8 | "Last-Translator: Xavier Besnard \n" 9 | "Language-Team: French >\n" 10 | "Language: fr\n" 11 | "MIME-Version: 1.0\n" 12 | "Content-Type: text/plain; charset=UTF-8\n" 13 | "Content-Transfer-Encoding: 8bit\n" 14 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 15 | "X-Generator: Lokalize 25.08.0\n" 16 | 17 | #, kde-format 18 | msgctxt "NAME OF TRANSLATORS" 19 | msgid "Your names" 20 | msgstr "Xavier Besnard" 21 | 22 | #, kde-format 23 | msgctxt "EMAIL OF TRANSLATORS" 24 | msgid "Your emails" 25 | msgstr "xavier.besnard@kde.org" 26 | 27 | #. i18n: ectx: label, entry (ListenPort), group (General) 28 | #: krdpserversettings.kcfg:14 29 | #, kde-format 30 | msgid "The port the server listens on" 31 | msgstr "Le port sur lequel le serveur écoute" 32 | 33 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 34 | #: krdpserversettings.kcfg:18 35 | #, kde-format 36 | msgid "Are certificates autogenerated during server start" 37 | msgstr "" 38 | "Les certificats sont-ils générés automatiquement au démarrage du serveur ?" 39 | 40 | #. i18n: ectx: label, entry (Certificate), group (General) 41 | #: krdpserversettings.kcfg:22 42 | #, kde-format 43 | msgid "The certificate to use for TLS connections" 44 | msgstr "Le certificat à utiliser pour les connexions « TLS »" 45 | 46 | #. i18n: ectx: label, entry (CertificateKey), group (General) 47 | #: krdpserversettings.kcfg:25 48 | #, kde-format 49 | msgid "The key that matches the TLS certificate" 50 | msgstr "La clé correspondant au certificat « TLS »" 51 | 52 | #. i18n: ectx: label, entry (Quality), group (General) 53 | #: krdpserversettings.kcfg:28 54 | #, kde-format 55 | msgid "The quality of the video stream" 56 | msgstr "La qualité du flux vidéo" 57 | 58 | #. i18n: ectx: label, entry (Users), group (General) 59 | #: krdpserversettings.kcfg:32 60 | #, kde-format 61 | msgid "Users allowed to login, passwords are stored in KWallet" 62 | msgstr "" 63 | "Utilisateurs autorisés à se connecter. Les mots de passe sont enregistrés " 64 | "dans KWallet." 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "Définit si l'utilisateur actuel peut ou non se connecter grâce à PAM" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "Démarrer automatiquement le serveur à la connexion" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "Serveur « RDP »" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "Quitter" 87 | -------------------------------------------------------------------------------- /po/ar/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # SPDX-FileCopyrightText: 2024, 2025 Zayed Al-Saidi 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-15 13:03+0400\n" 11 | "Last-Translator: Zayed Al-Saidi \n" 12 | "Language-Team: ar\n" 13 | "Language: ar\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " 18 | "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" 19 | "X-Generator: Lokalize 23.08.5\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "زايد السعيدي" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "zayed.alsaidi@gmail.com" 30 | 31 | #. i18n: ectx: label, entry (ListenPort), group (General) 32 | #: krdpserversettings.kcfg:14 33 | #, kde-format 34 | msgid "The port the server listens on" 35 | msgstr "المنفذ الذي يستمع الخادم له" 36 | 37 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 38 | #: krdpserversettings.kcfg:18 39 | #, kde-format 40 | msgid "Are certificates autogenerated during server start" 41 | msgstr "هل ستنشئ الشهادات آليًّا أثناء بدء تشغيل الخادم؟" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "الشهادة المستخدمة لاتصالات TLS" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "المفتاح الذي يطابق شهادة TLS" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "جودة بث الفيديو" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "يُسمح للمستخدمين بالولوج، وستخزن كلمات المرور في محفظةك" 66 | 67 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 68 | #: krdpserversettings.kcfg:35 69 | #, kde-format 70 | msgid "Whether the current user can log in via PAM" 71 | msgstr "ما إذا كان المستخدم الحالي يمكنه الولوج باستخدام PAM" 72 | 73 | #. i18n: ectx: label, entry (Autostart), group (General) 74 | #: krdpserversettings.kcfg:39 75 | #, kde-format 76 | msgid "Autostart the server on login" 77 | msgstr "تشغيل الخادم آليًّا عند الولوج" 78 | 79 | #: SessionController.cpp:102 80 | #, kde-format 81 | msgid "RDP Server" 82 | msgstr "خادم سطح المكتب البعيد" 83 | 84 | #: SessionController.cpp:105 85 | #, kde-format 86 | msgid "Quit" 87 | msgstr "أنهِ" 88 | -------------------------------------------------------------------------------- /po/ka/krdpserver.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR This file is copyright: 3 | # This file is distributed under the same license as the krdp package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: krdp\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 11 | "PO-Revision-Date: 2025-09-05 08:46+0200\n" 12 | "Last-Translator: Temuri Doghonadze \n" 13 | "Language-Team: Georgian \n" 14 | "Language: ka\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 19 | "X-Generator: Poedit 3.7\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Temuri Doghonadze" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "Temuri.doghonadze@gmail.com" 30 | 31 | #. i18n: ectx: label, entry (ListenPort), group (General) 32 | #: krdpserversettings.kcfg:14 33 | #, kde-format 34 | msgid "The port the server listens on" 35 | msgstr "პორტი, რომელზეც სერვერი უსმენს" 36 | 37 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 38 | #: krdpserversettings.kcfg:18 39 | #, kde-format 40 | msgid "Are certificates autogenerated during server start" 41 | msgstr "გენერირდება თუ არა სერტიფიკატები ავტომატურად, სერვერის გაშვებისას" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "სერტიფიკატი TLS მიერთებებისთვის" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "გასაღები, რომელიც TLS სერტიფიკატს ემთხვევა" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "ვიდეონაკადის ხარისხი" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "მომხმარებლებს შეუძლიათ შესვლა, პაროლები დამახსოვრებულია KWallet-ში" 66 | 67 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 68 | #: krdpserversettings.kcfg:35 69 | #, kde-format 70 | msgid "Whether the current user can log in via PAM" 71 | msgstr "შეუძლია თუ არა მიმდინარე მომხმარებელს PAM-ით შესვლა" 72 | 73 | #. i18n: ectx: label, entry (Autostart), group (General) 74 | #: krdpserversettings.kcfg:39 75 | #, kde-format 76 | msgid "Autostart the server on login" 77 | msgstr "სერვერის ავტომატური გაშვვება სისტემაში შესვლისას" 78 | 79 | #: SessionController.cpp:102 80 | #, kde-format 81 | msgid "RDP Server" 82 | msgstr "RDP სერვერი" 83 | 84 | #: SessionController.cpp:105 85 | #, kde-format 86 | msgid "Quit" 87 | msgstr "გასვლა" 88 | -------------------------------------------------------------------------------- /po/sv/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024, 2025 Stefan Asserhäll 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-08 18:31+0200\n" 11 | "Last-Translator: Stefan Asserhäll \n" 12 | "Language-Team: Swedish \n" 13 | "Language: sv\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Generator: Lokalize 25.08.0\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Stefan Asserhäll" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "stefan.asserhall@gmail.com" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "Porten som servern lyssnar på" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "Genereras certifikat automatiskt vid serverstart" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "Certifikat att använda för TLS-anslutningar" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "Nyckeln som motsvarar TLS-certifikatet" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "Videoströmmens kvalitet" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "Användare som har tillåtelse att logga in, lösenord lagras i plånboken" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "Om den nuvarande användare kan logga in via PAM" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "Starta servern automatiskt vid inloggning" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "RDP-server" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "Avsluta" 87 | -------------------------------------------------------------------------------- /src/AbstractSession.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include "krdp_export.h" 8 | 9 | #include 10 | #include 11 | 12 | class QMimeData; 13 | 14 | namespace KRdp 15 | { 16 | struct VideoFrame; 17 | class Server; 18 | 19 | struct VirtualMonitor { 20 | QString name; 21 | QSize size; 22 | qreal dpr; 23 | }; 24 | 25 | class KRDP_EXPORT AbstractSession : public QObject 26 | { 27 | Q_OBJECT 28 | public: 29 | AbstractSession(); 30 | ~AbstractSession() override; 31 | 32 | /** 33 | * Properties have been initialised and we can start the session 34 | */ 35 | virtual void start() = 0; 36 | 37 | bool streamingEnabled() const; 38 | void setStreamingEnabled(bool enable); 39 | void setVideoFrameRate(quint32 framerate); 40 | void setActiveStream(int stream); 41 | void setVirtualMonitor(const VirtualMonitor &vm); 42 | void setVideoQuality(quint8 quality); 43 | 44 | void requestStreamingEnable(QObject *requester); 45 | void requestStreamingDisable(QObject *requester); 46 | 47 | /** 48 | * Set the system's clipboard data. 49 | * 50 | * The data is provided by the remote RDP client. 51 | */ 52 | virtual void setClipboardData(std::unique_ptr data) = 0; 53 | 54 | /** 55 | * Send a new event to the portal. 56 | * 57 | * \param event The new event to send. 58 | */ 59 | virtual void sendEvent(const std::shared_ptr &event) = 0; 60 | 61 | Q_SIGNALS: 62 | void started(); 63 | void error(); 64 | 65 | /** 66 | * Emitted whenever a new frame has been received. 67 | * 68 | * Received in this case means that the portal has sent the data and it has 69 | * been encoded by libav. 70 | */ 71 | void frameReceived(const VideoFrame &frame); 72 | 73 | /** 74 | * Emitted whenever a new cursor update was received. 75 | * 76 | * These are separate from frames as RDP has a separate protocol for mouse 77 | * movement that is more performant than embedding things into the video 78 | * stream. 79 | */ 80 | void cursorUpdate(const PipeWireCursor &cursor); 81 | 82 | /** 83 | * Emitted whenever the system's clipboard data changes. 84 | */ 85 | void clipboardDataChanged(const QMimeData *data); 86 | 87 | protected: 88 | QSize size() const; 89 | QSize logicalSize() const; 90 | std::optional virtualMonitor() const; 91 | int activeStream() const; 92 | 93 | void setStarted(bool started); 94 | void setSize(QSize size); 95 | void setLogicalSize(QSize size); 96 | PipeWireEncodedStream *stream(); 97 | 98 | private: 99 | class Private; 100 | const std::unique_ptr d; 101 | }; 102 | 103 | } 104 | -------------------------------------------------------------------------------- /po/sa/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Sanskrit translations for krdp package. 2 | # Copyright (C) 2024 This file is copyright: 3 | # This file is distributed under the same license as the krdp package. 4 | # Kali , 2024. 5 | # 6 | # SPDX-FileCopyrightText: 2024 kali 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: krdp\n" 10 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 11 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 12 | "PO-Revision-Date: 2024-12-24 20:39+0530\n" 13 | "Last-Translator: kali \n" 14 | "Language-Team: Sanskrit \n" 15 | "Language: sa\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n>2);\n" 20 | "X-Generator: Lokalize 24.08.2\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "श्रीकान्त् कलवार्" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "skkalwar999@gmail.com" 31 | 32 | #. i18n: ectx: label, entry (ListenPort), group (General) 33 | #: krdpserversettings.kcfg:14 34 | #, kde-format 35 | msgid "The port the server listens on" 36 | msgstr "सर्वरः यस्मिन् पोर्ट् शृणोति" 37 | 38 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 39 | #: krdpserversettings.kcfg:18 40 | #, kde-format 41 | msgid "Are certificates autogenerated during server start" 42 | msgstr "सर्वरस्य आरम्भस्य समये प्रमाणपत्राणि स्वयमेव उत्पन्नानि सन्ति वा" 43 | 44 | #. i18n: ectx: label, entry (Certificate), group (General) 45 | #: krdpserversettings.kcfg:22 46 | #, kde-format 47 | msgid "The certificate to use for TLS connections" 48 | msgstr "TLS संयोजनानां कृते उपयोक्तुं प्रमाणपत्रम्" 49 | 50 | #. i18n: ectx: label, entry (CertificateKey), group (General) 51 | #: krdpserversettings.kcfg:25 52 | #, kde-format 53 | msgid "The key that matches the TLS certificate" 54 | msgstr "यत् कुञ्जी TLS प्रमाणपत्रेण सह मेलति" 55 | 56 | #. i18n: ectx: label, entry (Quality), group (General) 57 | #: krdpserversettings.kcfg:28 58 | #, kde-format 59 | msgid "The quality of the video stream" 60 | msgstr "विडियो प्रवाहस्य गुणवत्ता" 61 | 62 | #. i18n: ectx: label, entry (Users), group (General) 63 | #: krdpserversettings.kcfg:32 64 | #, kde-format 65 | msgid "Users allowed to login, passwords are stored in KWallet" 66 | msgstr "उपयोक्तारः प्रवेशं कर्तुं अनुमताः, गुप्तशब्दाः KWallet मध्ये संगृहीताः सन्ति" 67 | 68 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 69 | #: krdpserversettings.kcfg:35 70 | #, kde-format 71 | msgid "Whether the current user can log in via PAM" 72 | msgstr "" 73 | 74 | #. i18n: ectx: label, entry (Autostart), group (General) 75 | #: krdpserversettings.kcfg:39 76 | #, kde-format 77 | msgid "Autostart the server on login" 78 | msgstr "प्रवेशसमये सर्वरं स्वयमेव आरभत" 79 | 80 | #: SessionController.cpp:102 81 | #, kde-format 82 | msgid "RDP Server" 83 | msgstr "आरडीपी सर्वर" 84 | 85 | #: SessionController.cpp:105 86 | #, kde-format 87 | msgid "Quit" 88 | msgstr "परिजहातु" 89 | -------------------------------------------------------------------------------- /po/sl/krdpserver.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR This file is copyright: 3 | # This file is distributed under the same license as the krdp package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: krdp\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 11 | "PO-Revision-Date: 2025-09-05 07:09+0200\n" 12 | "Last-Translator: Matjaž Jeran \n" 13 | "Language-Team: Slovenian \n" 14 | "Language: sl\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" 19 | "%100==4 ? 3 : 0);\n" 20 | "X-Generator: Poedit 3.7\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Matjaž Jeran" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "matjaz.jeran@amis.net" 31 | 32 | #. i18n: ectx: label, entry (ListenPort), group (General) 33 | #: krdpserversettings.kcfg:14 34 | #, kde-format 35 | msgid "The port the server listens on" 36 | msgstr "Vrata, ki jih strežnik posluša" 37 | 38 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 39 | #: krdpserversettings.kcfg:18 40 | #, kde-format 41 | msgid "Are certificates autogenerated during server start" 42 | msgstr "Ali so potrdila samodejno ustvarjena med zagonom strežnika" 43 | 44 | #. i18n: ectx: label, entry (Certificate), group (General) 45 | #: krdpserversettings.kcfg:22 46 | #, kde-format 47 | msgid "The certificate to use for TLS connections" 48 | msgstr "Potrdilo za uporabo za povezave TLS" 49 | 50 | #. i18n: ectx: label, entry (CertificateKey), group (General) 51 | #: krdpserversettings.kcfg:25 52 | #, kde-format 53 | msgid "The key that matches the TLS certificate" 54 | msgstr "Ključ, ki se ujema s potrdilom TLS" 55 | 56 | #. i18n: ectx: label, entry (Quality), group (General) 57 | #: krdpserversettings.kcfg:28 58 | #, kde-format 59 | msgid "The quality of the video stream" 60 | msgstr "Kakovost video toka" 61 | 62 | #. i18n: ectx: label, entry (Users), group (General) 63 | #: krdpserversettings.kcfg:32 64 | #, kde-format 65 | msgid "Users allowed to login, passwords are stored in KWallet" 66 | msgstr "Uporabnikom je dovoljena prijava, gesla so shranjena v KWalletu" 67 | 68 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 69 | #: krdpserversettings.kcfg:35 70 | #, kde-format 71 | msgid "Whether the current user can log in via PAM" 72 | msgstr "Ali se trenutni uporabnik lahko prijavi prek PAMa" 73 | 74 | #. i18n: ectx: label, entry (Autostart), group (General) 75 | #: krdpserversettings.kcfg:39 76 | #, kde-format 77 | msgid "Autostart the server on login" 78 | msgstr "Samodejni zagon strežnika ob prijavi" 79 | 80 | #: SessionController.cpp:102 81 | #, kde-format 82 | msgid "RDP Server" 83 | msgstr "Strežnik RDP" 84 | 85 | #: SessionController.cpp:105 86 | #, kde-format 87 | msgid "Quit" 88 | msgstr "Zapusti" 89 | -------------------------------------------------------------------------------- /po/tr/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024, 2025 Emir SARI 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-05 09:49+0300\n" 11 | "Last-Translator: Emir SARI \n" 12 | "Language-Team: Turkish \n" 13 | "Language: tr\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 18 | "X-Generator: Lokalize 25.08.0\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Emir SARI" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "emir_sari@icloud.com" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "Sunucunun üzerinde dinlediği kapı" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "" 41 | "Sertifikaların sunucu başlangıcında kendiliğinden üretilip üretilmediği" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "TLS bağlantıları için kullanılacak sertifika" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "TLS sertifikasıyla eşleşen anahtar" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "Video akışının kalitesi" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "" 66 | "Oturum açmasına izin verilen kullanıcılar, parolalar K Cüzdan’da saklanır" 67 | 68 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 69 | #: krdpserversettings.kcfg:35 70 | #, kde-format 71 | msgid "Whether the current user can log in via PAM" 72 | msgstr "Geçerli kullanıcının PAM ile oturum açıp açamayacağı" 73 | 74 | #. i18n: ectx: label, entry (Autostart), group (General) 75 | #: krdpserversettings.kcfg:39 76 | #, kde-format 77 | msgid "Autostart the server on login" 78 | msgstr "Oturum açılışında sunucuyu kendiliğinden başlat" 79 | 80 | #: SessionController.cpp:102 81 | #, kde-format 82 | msgid "RDP Server" 83 | msgstr "RDP Sunucusu" 84 | 85 | #: SessionController.cpp:105 86 | #, kde-format 87 | msgid "Quit" 88 | msgstr "Çık" 89 | -------------------------------------------------------------------------------- /po/lv/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024, 2025 Toms Trasuns 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-24 15:45+0300\n" 11 | "Last-Translator: Toms Trasuns \n" 12 | "Language-Team: Latvian \n" 13 | "Language: lv\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " 18 | "2);\n" 19 | "X-Generator: Lokalize 25.08.0\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Toms Trasūns" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "toms.trasuns@posteo.net" 30 | 31 | #. i18n: ectx: label, entry (ListenPort), group (General) 32 | #: krdpserversettings.kcfg:14 33 | #, kde-format 34 | msgid "The port the server listens on" 35 | msgstr "Ports, ko klausās serveris" 36 | 37 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 38 | #: krdpserversettings.kcfg:18 39 | #, kde-format 40 | msgid "Are certificates autogenerated during server start" 41 | msgstr "Vai sertifikātus ģenerē automātiski, serverim ieslēdzoties" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "Sertifikāts TLS savienojumiem" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "Atslēga, kas atbilst TLS sertifikātam" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "Video straumes kvalitāte" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "Lietotāji, kuriem ir atļauts ierakstīties, paroles glabājas „KWallet“" 66 | 67 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 68 | #: krdpserversettings.kcfg:35 69 | #, kde-format 70 | msgid "Whether the current user can log in via PAM" 71 | msgstr "Vai pašreizējais lietotājs var ierakstīties caur PAM" 72 | 73 | #. i18n: ectx: label, entry (Autostart), group (General) 74 | #: krdpserversettings.kcfg:39 75 | #, kde-format 76 | msgid "Autostart the server on login" 77 | msgstr "Ierakstoties serveri palaist automātiski" 78 | 79 | #: SessionController.cpp:102 80 | #, kde-format 81 | msgid "RDP Server" 82 | msgstr "RDP serveris" 83 | 84 | #: SessionController.cpp:105 85 | #, kde-format 86 | msgid "Quit" 87 | msgstr "Iziet" 88 | -------------------------------------------------------------------------------- /po/eo/krdpserver.po: -------------------------------------------------------------------------------- 1 | # translation of krdpserver.pot to Esperanto 2 | # Copyright (C) 2024 Free Software Foundation, Inc. 3 | # This file is distributed under the same license as the krdp package. 4 | # Oliver Kellogg , 2024. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: krdp\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 11 | "PO-Revision-Date: 2024-12-28 17:41+0100\n" 12 | "Last-Translator: Oliver Kellogg \n" 13 | "Language-Team: Esperanto \n" 14 | "Language: eo\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: translate-po (https://github.com/zcribe/translate-po)\n" 19 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Oliver Kellogg" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "olivermkellogg@gmail.com" 30 | 31 | #. i18n: ectx: label, entry (ListenPort), group (General) 32 | #: krdpserversettings.kcfg:14 33 | #, kde-format 34 | msgid "The port the server listens on" 35 | msgstr "La pordo sur kiu la servilo aŭskultas" 36 | 37 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 38 | #: krdpserversettings.kcfg:18 39 | #, kde-format 40 | msgid "Are certificates autogenerated during server start" 41 | msgstr "Ĉu atestiloj estas aŭtomate generitaj dum servila lanĉo" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "La atestilo uzota por TLS-konektoj" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "La ŝlosilo kiu kongruas kun la TLS-atestilo" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "La kvalito de la filmetfluo" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "Uzantoj rajtigitaj ensaluti (pasvortoj estas konservitaj en KWallet)" 66 | 67 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 68 | #: krdpserversettings.kcfg:35 69 | #, kde-format 70 | msgid "Whether the current user can log in via PAM" 71 | msgstr "" 72 | 73 | #. i18n: ectx: label, entry (Autostart), group (General) 74 | #: krdpserversettings.kcfg:39 75 | #, kde-format 76 | msgid "Autostart the server on login" 77 | msgstr "Ĉu aŭtomate lanĉi la servilon je ensaluto" 78 | 79 | #: SessionController.cpp:102 80 | #, kde-format 81 | msgid "RDP Server" 82 | msgstr "RDP-Servilo" 83 | 84 | #: SessionController.cpp:105 85 | #, kde-format 86 | msgid "Quit" 87 | msgstr "Forlasi" 88 | -------------------------------------------------------------------------------- /po/hu/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024, 2025 Kristof Kiszel 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-11-10 21:29+0100\n" 11 | "Last-Translator: Kristof Kiszel \n" 12 | "Language-Team: Hungarian \n" 13 | "Language: hu\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | "X-Generator: Lokalize 25.08.2\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Kiszel Kristóf" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "ulysses@fsf.hu" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "A port, amelyen a kiszolgáló figyel" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "" 41 | "A tanúsítványok automatikusan generálódnak-e a kiszolgáló indítása során" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "A TLS kapcsolatokhoz használandó tanúsítvány" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "A TLS tanúsítványra illeszkedő kulcs" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "A videófolyam minősége" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "" 66 | "A bejelentkezésre jogosult felhasználók, a jelszavakat a KWallet tárolja" 67 | 68 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 69 | #: krdpserversettings.kcfg:35 70 | #, kde-format 71 | msgid "Whether the current user can log in via PAM" 72 | msgstr "A jelenlegi felhasználó bejelentkezhet-e PAM-on keresztül" 73 | 74 | #. i18n: ectx: label, entry (Autostart), group (General) 75 | #: krdpserversettings.kcfg:39 76 | #, kde-format 77 | msgid "Autostart the server on login" 78 | msgstr "Kiszolgáló automatikus indítása bejelentkezéskor" 79 | 80 | #: SessionController.cpp:102 81 | #, kde-format 82 | msgid "RDP Server" 83 | msgstr "RDP kiszolgáló" 84 | 85 | #: SessionController.cpp:105 86 | #, kde-format 87 | msgid "Quit" 88 | msgstr "\tKilépés" 89 | -------------------------------------------------------------------------------- /po/it/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # SPDX-FileCopyrightText: 2024, 2025 Vincenzo Reale 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-05 14:32+0200\n" 11 | "Last-Translator: Vincenzo Reale \n" 12 | "Language-Team: Italian \n" 13 | "Language: it\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | "X-Generator: Lokalize 25.08.0\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Vincenzo Reale" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "smart2128vr@gmail.com" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "La porta sulla quale il server è in ascolto" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "I certificati sono generati automaticamente durante l'avvio del server" 41 | 42 | #. i18n: ectx: label, entry (Certificate), group (General) 43 | #: krdpserversettings.kcfg:22 44 | #, kde-format 45 | msgid "The certificate to use for TLS connections" 46 | msgstr "Il certificato da utilizzare per le connessioni TLS" 47 | 48 | #. i18n: ectx: label, entry (CertificateKey), group (General) 49 | #: krdpserversettings.kcfg:25 50 | #, kde-format 51 | msgid "The key that matches the TLS certificate" 52 | msgstr "La chiave che corrisponde al certificato TLS" 53 | 54 | #. i18n: ectx: label, entry (Quality), group (General) 55 | #: krdpserversettings.kcfg:28 56 | #, kde-format 57 | msgid "The quality of the video stream" 58 | msgstr "La qualità del flusso video" 59 | 60 | #. i18n: ectx: label, entry (Users), group (General) 61 | #: krdpserversettings.kcfg:32 62 | #, kde-format 63 | msgid "Users allowed to login, passwords are stored in KWallet" 64 | msgstr "Utenti autorizzati ad accedere, le password sono archiviate in KWallet" 65 | 66 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 67 | #: krdpserversettings.kcfg:35 68 | #, kde-format 69 | msgid "Whether the current user can log in via PAM" 70 | msgstr "Se l'utente attuale può accedere tramite PAM" 71 | 72 | #. i18n: ectx: label, entry (Autostart), group (General) 73 | #: krdpserversettings.kcfg:39 74 | #, kde-format 75 | msgid "Autostart the server on login" 76 | msgstr "Avvia automaticamente il server all'accesso" 77 | 78 | #: SessionController.cpp:102 79 | #, kde-format 80 | msgid "RDP Server" 81 | msgstr "Server RDP" 82 | 83 | #: SessionController.cpp:105 84 | #, kde-format 85 | msgid "Quit" 86 | msgstr "Esci" 87 | -------------------------------------------------------------------------------- /po/gl/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024 Adrián Chaves (Gallaecio) 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2024-08-09 17:47+0200\n" 11 | "Last-Translator: Adrián Chaves (Gallaecio) \n" 12 | "Language-Team: Proxecto Trasno (proxecto@trasno.gal)\n" 13 | "Language: gl\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Generator: Lokalize 24.05.2\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Adrián Chaves (Gallaecio)" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "adrian@chaves.gal" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "O porto no que escoita o servidor." 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "" 41 | "Se os certificados se xeran automaticamente durante o inicio do servidor." 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "O certificado para usar para as conexión por TLS." 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "A chave correspondente ao certificado de TLS." 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "A calidade do fluxo de vídeo." 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "" 66 | "Persoas usuarias ás que se lles permite acceder, os contrasinais gárdanse en " 67 | "KWallet." 68 | 69 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 70 | #: krdpserversettings.kcfg:35 71 | #, kde-format 72 | msgid "Whether the current user can log in via PAM" 73 | msgstr "" 74 | 75 | #. i18n: ectx: label, entry (Autostart), group (General) 76 | #: krdpserversettings.kcfg:39 77 | #, kde-format 78 | msgid "Autostart the server on login" 79 | msgstr "Iniciar o servidor automaticamente ao identificarse." 80 | 81 | #: SessionController.cpp:102 82 | #, kde-format 83 | msgid "RDP Server" 84 | msgstr "Servidor de RDP" 85 | 86 | #: SessionController.cpp:105 87 | #, kde-format 88 | msgid "Quit" 89 | msgstr "Saír" 90 | -------------------------------------------------------------------------------- /po/lt/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Lithuanian translations for krdp package. 2 | # Copyright (C) 2025 This file is copyright: 3 | # This file is distributed under the same license as the krdp package. 4 | # Automatically generated, 2025. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: krdp\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 11 | "PO-Revision-Date: 2025-09-26 01:05+0300\n" 12 | "Last-Translator: Automatically generated\n" 13 | "Language-Team: none\n" 14 | "Language: lt\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n%10>=2 && (n%100<10 || n" 19 | "%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3);\n" 20 | "X-Generator: Poedit 3.6\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Moo" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "<>" 31 | 32 | #. i18n: ectx: label, entry (ListenPort), group (General) 33 | #: krdpserversettings.kcfg:14 34 | #, kde-format 35 | msgid "The port the server listens on" 36 | msgstr "Prievadas, ties kuriuo serveris klausosi" 37 | 38 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 39 | #: krdpserversettings.kcfg:18 40 | #, kde-format 41 | msgid "Are certificates autogenerated during server start" 42 | msgstr "Ar liudijimai yra automatiškai generuojami serverio paleidimo metu" 43 | 44 | #. i18n: ectx: label, entry (Certificate), group (General) 45 | #: krdpserversettings.kcfg:22 46 | #, kde-format 47 | msgid "The certificate to use for TLS connections" 48 | msgstr "TLS ryšiams naudojamas liudijimas" 49 | 50 | #. i18n: ectx: label, entry (CertificateKey), group (General) 51 | #: krdpserversettings.kcfg:25 52 | #, kde-format 53 | msgid "The key that matches the TLS certificate" 54 | msgstr "Raktas, atitinkantis TLS liudijimą" 55 | 56 | #. i18n: ectx: label, entry (Quality), group (General) 57 | #: krdpserversettings.kcfg:28 58 | #, kde-format 59 | msgid "The quality of the video stream" 60 | msgstr "Vaizdo srauto kokybė" 61 | 62 | #. i18n: ectx: label, entry (Users), group (General) 63 | #: krdpserversettings.kcfg:32 64 | #, kde-format 65 | msgid "Users allowed to login, passwords are stored in KWallet" 66 | msgstr "" 67 | "Naudotojai, kuriems leidžiama prisijungti, slaptažodžiai yra saugomi KWallet" 68 | 69 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 70 | #: krdpserversettings.kcfg:35 71 | #, kde-format 72 | msgid "Whether the current user can log in via PAM" 73 | msgstr "Ar dabartinis naudotojas gali prisijungti per PAM" 74 | 75 | #. i18n: ectx: label, entry (Autostart), group (General) 76 | #: krdpserversettings.kcfg:39 77 | #, kde-format 78 | msgid "Autostart the server on login" 79 | msgstr "Automatiškai paleisti serverį prisijungimo metu" 80 | 81 | #: SessionController.cpp:102 82 | #, kde-format 83 | msgid "RDP Server" 84 | msgstr "RDP serveris" 85 | 86 | #: SessionController.cpp:105 87 | #, kde-format 88 | msgid "Quit" 89 | msgstr "Išjungti" 90 | -------------------------------------------------------------------------------- /po/bg/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024, 2025 Mincho Kondarev 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-06 17:32+0200\n" 11 | "Last-Translator: Mincho Kondarev \n" 12 | "Language-Team: Bulgarian \n" 13 | "Language: bg\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Generator: Lokalize 25.07.70\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Минчо Кондарев" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "mkondarev@yahoo.de" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "Портът, който сървърът слуша" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "" 41 | "Автоматично генерирани ли са сертификатите по време на стартиране на сървъра" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "Сертификатът, който да се използва за TLS връзки" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "Ключът, който съответства на TLS сертификата" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "Качеството на видео потока" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "" 66 | "Потребителите, които имат право да влизат, паролите се съхраняват в KWallet" 67 | 68 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 69 | #: krdpserversettings.kcfg:35 70 | #, kde-format 71 | msgid "Whether the current user can log in via PAM" 72 | msgstr "Дали текущият потребител може да влиза в системата чрез PAM" 73 | 74 | #. i18n: ectx: label, entry (Autostart), group (General) 75 | #: krdpserversettings.kcfg:39 76 | #, kde-format 77 | msgid "Autostart the server on login" 78 | msgstr "Автоматично стартиране на сървъра при влизане" 79 | 80 | #: SessionController.cpp:102 81 | #, kde-format 82 | msgid "RDP Server" 83 | msgstr "Сървър RDP" 84 | 85 | #: SessionController.cpp:105 86 | #, kde-format 87 | msgid "Quit" 88 | msgstr "Изход" 89 | -------------------------------------------------------------------------------- /po/pl/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # SPDX-FileCopyrightText: 2024, 2025 Łukasz Wojniłowicz 4 | # 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-27 08:41+0200\n" 11 | "Last-Translator: Łukasz Wojniłowicz \n" 12 | "Language-Team: pl\n" 13 | "Language: pl\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " 18 | "|| n%100>=20) ? 1 : 2);\n" 19 | "X-Generator: Lokalize 25.08.0\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Łukasz Wojniłowicz" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "lukasz.wojnilowicz@gmail.com" 30 | 31 | #. i18n: ectx: label, entry (ListenPort), group (General) 32 | #: krdpserversettings.kcfg:14 33 | #, kde-format 34 | msgid "The port the server listens on" 35 | msgstr "Port, na którym nasłuchuje serwer" 36 | 37 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 38 | #: krdpserversettings.kcfg:18 39 | #, kde-format 40 | msgid "Are certificates autogenerated during server start" 41 | msgstr "Czy certyfikaty są samotworzone w czasie uruchamiania serwera" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "Certyfikat wykorzystywany do połączeń TLS" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "Klucz, odpowiedni certyfikatowi TLS" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "Jakość strumienia obrazu" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "Użytkownicy, którym wolno wchodzić, hasła zapisywane są w KPortfelu" 66 | 67 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 68 | #: krdpserversettings.kcfg:35 69 | #, kde-format 70 | msgid "Whether the current user can log in via PAM" 71 | msgstr "Określa, czy bieżący użytkownik może zalogować się poprzez PAM" 72 | 73 | #. i18n: ectx: label, entry (Autostart), group (General) 74 | #: krdpserversettings.kcfg:39 75 | #, kde-format 76 | msgid "Autostart the server on login" 77 | msgstr "Uruchomić serwer zaraz po wejściu" 78 | 79 | #: SessionController.cpp:102 80 | #, kde-format 81 | msgid "RDP Server" 82 | msgstr "Serwer RDP" 83 | 84 | #: SessionController.cpp:105 85 | #, kde-format 86 | msgid "Quit" 87 | msgstr "Zakończ" 88 | -------------------------------------------------------------------------------- /po/nl/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024, 2025 Freek de Kruijf 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-05 16:12+0200\n" 11 | "Last-Translator: Freek de Kruijf \n" 12 | "Language-Team: \n" 13 | "Language: nl\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Generator: Lokalize 25.08.0\n" 19 | 20 | #, kde-format 21 | msgctxt "NAME OF TRANSLATORS" 22 | msgid "Your names" 23 | msgstr "Freek de Kruijf - 2024 t/m 2025" 24 | 25 | #, kde-format 26 | msgctxt "EMAIL OF TRANSLATORS" 27 | msgid "Your emails" 28 | msgstr "freekdekruijf@kde.nl" 29 | 30 | #. i18n: ectx: label, entry (ListenPort), group (General) 31 | #: krdpserversettings.kcfg:14 32 | #, kde-format 33 | msgid "The port the server listens on" 34 | msgstr "De poort waarop de server luistert" 35 | 36 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 37 | #: krdpserversettings.kcfg:18 38 | #, kde-format 39 | msgid "Are certificates autogenerated during server start" 40 | msgstr "" 41 | "Zijn certificaten automatisch gegenereerd tijdens het starten van de server" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "Het te gebruiken certificaat voor de TLS-verbindingen" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "De sleutel die overeenkomt met het TLS-certificaat" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "De kwaliteit van de videostream" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "" 66 | "Gebruikers die toegestaan wordt zich aan te melden, wachtwoorden zijn " 67 | "opgeslagen in KWallet" 68 | 69 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 70 | #: krdpserversettings.kcfg:35 71 | #, kde-format 72 | msgid "Whether the current user can log in via PAM" 73 | msgstr "Of de huidige gebruiker zich kan aanmelden via PAM" 74 | 75 | #. i18n: ectx: label, entry (Autostart), group (General) 76 | #: krdpserversettings.kcfg:39 77 | #, kde-format 78 | msgid "Autostart the server on login" 79 | msgstr "De server automatisch starten bij aanmelden" 80 | 81 | #: SessionController.cpp:102 82 | #, kde-format 83 | msgid "RDP Server" 84 | msgstr "RDP-server" 85 | 86 | #: SessionController.cpp:105 87 | #, kde-format 88 | msgid "Quit" 89 | msgstr "Afsluiten" 90 | -------------------------------------------------------------------------------- /po/uk/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # Yuri Chornoivan , 2024, 2025. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: krdp\n" 8 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 9 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 10 | "PO-Revision-Date: 2025-09-05 09:08+0300\n" 11 | "Last-Translator: Yuri Chornoivan \n" 12 | "Language-Team: Ukrainian \n" 13 | "Language: uk\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" 18 | "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 19 | "X-Generator: Lokalize 23.04.3\n" 20 | 21 | #, kde-format 22 | msgctxt "NAME OF TRANSLATORS" 23 | msgid "Your names" 24 | msgstr "Юрій Чорноіван" 25 | 26 | #, kde-format 27 | msgctxt "EMAIL OF TRANSLATORS" 28 | msgid "Your emails" 29 | msgstr "yurchor@ukr.net" 30 | 31 | #. i18n: ectx: label, entry (ListenPort), group (General) 32 | #: krdpserversettings.kcfg:14 33 | #, kde-format 34 | msgid "The port the server listens on" 35 | msgstr "Порт, на якому сервер очікує на дані" 36 | 37 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 38 | #: krdpserversettings.kcfg:18 39 | #, kde-format 40 | msgid "Are certificates autogenerated during server start" 41 | msgstr "Чи буде сертифікати створено автоматично під час запуску сервера" 42 | 43 | #. i18n: ectx: label, entry (Certificate), group (General) 44 | #: krdpserversettings.kcfg:22 45 | #, kde-format 46 | msgid "The certificate to use for TLS connections" 47 | msgstr "Сертифікат, яким слід скористатися для з'єднань TLS" 48 | 49 | #. i18n: ectx: label, entry (CertificateKey), group (General) 50 | #: krdpserversettings.kcfg:25 51 | #, kde-format 52 | msgid "The key that matches the TLS certificate" 53 | msgstr "Ключ, який відповідає сертифікату TLS" 54 | 55 | #. i18n: ectx: label, entry (Quality), group (General) 56 | #: krdpserversettings.kcfg:28 57 | #, kde-format 58 | msgid "The quality of the video stream" 59 | msgstr "Якість потоку відеоданих" 60 | 61 | #. i18n: ectx: label, entry (Users), group (General) 62 | #: krdpserversettings.kcfg:32 63 | #, kde-format 64 | msgid "Users allowed to login, passwords are stored in KWallet" 65 | msgstr "Користувачі, яким дозволено вхід, паролі зберігаються у KWallet" 66 | 67 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 68 | #: krdpserversettings.kcfg:35 69 | #, kde-format 70 | msgid "Whether the current user can log in via PAM" 71 | msgstr "" 72 | "Визначає, чи може поточний користувач входити до системи за допомогою PAM" 73 | 74 | #. i18n: ectx: label, entry (Autostart), group (General) 75 | #: krdpserversettings.kcfg:39 76 | #, kde-format 77 | msgid "Autostart the server on login" 78 | msgstr "Автоматично запускати сервер при вході до системи" 79 | 80 | #: SessionController.cpp:102 81 | #, kde-format 82 | msgid "RDP Server" 83 | msgstr "Сервер RDP" 84 | 85 | #: SessionController.cpp:105 86 | #, kde-format 87 | msgid "Quit" 88 | msgstr "Вийти" 89 | -------------------------------------------------------------------------------- /po/es/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Spanish translations for krdpserver.po package. 2 | # Copyright (C) 2024-2025 This file is copyright: 3 | # This file is distributed under the same license as the krdp package. 4 | # Automatically generated, 2024. 5 | # 6 | # SPDX-FileCopyrightText: 2024, 2025 Eloy Cuadra 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: krdpserver\n" 10 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 11 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 12 | "PO-Revision-Date: 2025-09-06 01:22+0100\n" 13 | "Last-Translator: Eloy Cuadra \n" 14 | "Language-Team: Spanish \n" 15 | "Language: es\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 20 | "X-Generator: Lokalize 25.08.0\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Eloy Cuadra" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "ecuadra@eloihr.net" 31 | 32 | #. i18n: ectx: label, entry (ListenPort), group (General) 33 | #: krdpserversettings.kcfg:14 34 | #, kde-format 35 | msgid "The port the server listens on" 36 | msgstr "El puerto en el que escucha el servidor" 37 | 38 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 39 | #: krdpserversettings.kcfg:18 40 | #, kde-format 41 | msgid "Are certificates autogenerated during server start" 42 | msgstr "" 43 | "¿Los certificados se generan automáticamente durante el inicio del servidor?" 44 | 45 | #. i18n: ectx: label, entry (Certificate), group (General) 46 | #: krdpserversettings.kcfg:22 47 | #, kde-format 48 | msgid "The certificate to use for TLS connections" 49 | msgstr "El certificado que se usará para las conexiones TLS" 50 | 51 | #. i18n: ectx: label, entry (CertificateKey), group (General) 52 | #: krdpserversettings.kcfg:25 53 | #, kde-format 54 | msgid "The key that matches the TLS certificate" 55 | msgstr "La clave que coincide con el certificado TLS" 56 | 57 | #. i18n: ectx: label, entry (Quality), group (General) 58 | #: krdpserversettings.kcfg:28 59 | #, kde-format 60 | msgid "The quality of the video stream" 61 | msgstr "La calidad de la emisión de vídeo" 62 | 63 | #. i18n: ectx: label, entry (Users), group (General) 64 | #: krdpserversettings.kcfg:32 65 | #, kde-format 66 | msgid "Users allowed to login, passwords are stored in KWallet" 67 | msgstr "" 68 | "Usuarios que pueden iniciar sesión (las contraseñas se guardan en KWallet)" 69 | 70 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 71 | #: krdpserversettings.kcfg:35 72 | #, kde-format 73 | msgid "Whether the current user can log in via PAM" 74 | msgstr "Indica si el usuario actual puede iniciar sesión mediante PAM" 75 | 76 | #. i18n: ectx: label, entry (Autostart), group (General) 77 | #: krdpserversettings.kcfg:39 78 | #, kde-format 79 | msgid "Autostart the server on login" 80 | msgstr "Lanzar automáticamente el servidor al iniciar sesión" 81 | 82 | #: SessionController.cpp:102 83 | #, kde-format 84 | msgid "RDP Server" 85 | msgstr "Servidor RDP" 86 | 87 | #: SessionController.cpp:105 88 | #, kde-format 89 | msgid "Quit" 90 | msgstr "Salir" 91 | -------------------------------------------------------------------------------- /po/ru/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024 Olesya Gerasimenko 5 | # SPDX-FileCopyrightText: 2025 Alexander Yavorsky 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: krdp\n" 9 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 10 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 11 | "PO-Revision-Date: 2025-10-30 19:51+0300\n" 12 | "Last-Translator: Alexander Yavorsky \n" 13 | "Language-Team: Russian \n" 14 | "Language: ru\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" 19 | "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 20 | "X-Generator: Lokalize 25.08.2\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Олеся Герасименко" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "translation-team@basealt.ru" 31 | 32 | #. i18n: ectx: label, entry (ListenPort), group (General) 33 | #: krdpserversettings.kcfg:14 34 | #, kde-format 35 | msgid "The port the server listens on" 36 | msgstr "Порт, на котором сервер ожидает данных" 37 | 38 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 39 | #: krdpserversettings.kcfg:18 40 | #, kde-format 41 | msgid "Are certificates autogenerated during server start" 42 | msgstr "Автоматическая генерация сертификатов при запуске сервера" 43 | 44 | #. i18n: ectx: label, entry (Certificate), group (General) 45 | #: krdpserversettings.kcfg:22 46 | #, kde-format 47 | msgid "The certificate to use for TLS connections" 48 | msgstr "Сертификат для TLS-соединений" 49 | 50 | #. i18n: ectx: label, entry (CertificateKey), group (General) 51 | #: krdpserversettings.kcfg:25 52 | #, kde-format 53 | msgid "The key that matches the TLS certificate" 54 | msgstr "Ключ, который соответствует TLS-сертификату" 55 | 56 | #. i18n: ectx: label, entry (Quality), group (General) 57 | #: krdpserversettings.kcfg:28 58 | #, kde-format 59 | msgid "The quality of the video stream" 60 | msgstr "Качество видеопотока" 61 | 62 | #. i18n: ectx: label, entry (Users), group (General) 63 | #: krdpserversettings.kcfg:32 64 | #, kde-format 65 | msgid "Users allowed to login, passwords are stored in KWallet" 66 | msgstr "Пользователи, которым разрешён вход, пароли хранятся в KWallet" 67 | 68 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 69 | #: krdpserversettings.kcfg:35 70 | #, kde-format 71 | msgid "Whether the current user can log in via PAM" 72 | msgstr "Возможность использования PAM для входа текущим пользователем" 73 | 74 | #. i18n: ectx: label, entry (Autostart), group (General) 75 | #: krdpserversettings.kcfg:39 76 | #, kde-format 77 | msgid "Autostart the server on login" 78 | msgstr "Автоматический запуск сервера при входе" 79 | 80 | #: SessionController.cpp:102 81 | #, kde-format 82 | msgid "RDP Server" 83 | msgstr "RDP-сервер" 84 | 85 | #: SessionController.cpp:105 86 | #, kde-format 87 | msgid "Quit" 88 | msgstr "Выход" 89 | -------------------------------------------------------------------------------- /po/ca/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Translation of krdpserver.po to Catalan 2 | # Copyright (C) 2024-2025 This_file_is_part_of_KDE 3 | # This file is distributed under the license LGPL version 2.1 or 4 | # version 3 or later versions approved by the membership of KDE e.V. 5 | # 6 | # SPDX-FileCopyrightText: 2024, 2025 Josep M. Ferrer 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: krdp\n" 10 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 11 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 12 | "PO-Revision-Date: 2025-09-05 09:22+0200\n" 13 | "Last-Translator: Josep M. Ferrer \n" 14 | "Language-Team: Catalan \n" 15 | "Language: ca\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 20 | "X-Generator: Lokalize 25.08.0\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Josep M. Ferrer" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "txemaq@gmail.com" 31 | 32 | #. i18n: ectx: label, entry (ListenPort), group (General) 33 | #: krdpserversettings.kcfg:14 34 | #, kde-format 35 | msgid "The port the server listens on" 36 | msgstr "El port que escolta el servidor" 37 | 38 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 39 | #: krdpserversettings.kcfg:18 40 | #, kde-format 41 | msgid "Are certificates autogenerated during server start" 42 | msgstr "Es generen automàticament els certificats durant l'inici del servidor" 43 | 44 | #. i18n: ectx: label, entry (Certificate), group (General) 45 | #: krdpserversettings.kcfg:22 46 | #, kde-format 47 | msgid "The certificate to use for TLS connections" 48 | msgstr "El certificat que s'utilitzarà per a les connexions TLS" 49 | 50 | #. i18n: ectx: label, entry (CertificateKey), group (General) 51 | #: krdpserversettings.kcfg:25 52 | #, kde-format 53 | msgid "The key that matches the TLS certificate" 54 | msgstr "La clau que coincideix amb el certificat TLS" 55 | 56 | #. i18n: ectx: label, entry (Quality), group (General) 57 | #: krdpserversettings.kcfg:28 58 | #, kde-format 59 | msgid "The quality of the video stream" 60 | msgstr "La qualitat del flux de vídeo" 61 | 62 | #. i18n: ectx: label, entry (Users), group (General) 63 | #: krdpserversettings.kcfg:32 64 | #, kde-format 65 | msgid "Users allowed to login, passwords are stored in KWallet" 66 | msgstr "" 67 | "Els usuaris autoritzats a iniciar sessió, les contrasenyes s'emmagatzemen al " 68 | "KWallet" 69 | 70 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 71 | #: krdpserversettings.kcfg:35 72 | #, kde-format 73 | msgid "Whether the current user can log in via PAM" 74 | msgstr "Si l'usuari actual pot iniciar la sessió mitjançant PAM" 75 | 76 | #. i18n: ectx: label, entry (Autostart), group (General) 77 | #: krdpserversettings.kcfg:39 78 | #, kde-format 79 | msgid "Autostart the server on login" 80 | msgstr "Inicia automàticament el servidor en iniciar la sessió" 81 | 82 | #: SessionController.cpp:102 83 | #, kde-format 84 | msgid "RDP Server" 85 | msgstr "Servidor RDP" 86 | 87 | #: SessionController.cpp:105 88 | #, kde-format 89 | msgid "Quit" 90 | msgstr "Surt" 91 | -------------------------------------------------------------------------------- /po/ca@valencia/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Translation of krdpserver.po to Catalan (Valencian) 2 | # Copyright (C) 2024-2025 This_file_is_part_of_KDE 3 | # This file is distributed under the license LGPL version 2.1 or 4 | # version 3 or later versions approved by the membership of KDE e.V. 5 | # 6 | # SPDX-FileCopyrightText: 2024, 2025 Josep M. Ferrer 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: krdp\n" 10 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 11 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 12 | "PO-Revision-Date: 2025-09-05 09:22+0200\n" 13 | "Last-Translator: Josep M. Ferrer \n" 14 | "Language-Team: Catalan \n" 15 | "Language: ca@valencia\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 20 | "X-Generator: Lokalize 25.08.0\n" 21 | 22 | #, kde-format 23 | msgctxt "NAME OF TRANSLATORS" 24 | msgid "Your names" 25 | msgstr "Josep M. Ferrer" 26 | 27 | #, kde-format 28 | msgctxt "EMAIL OF TRANSLATORS" 29 | msgid "Your emails" 30 | msgstr "txemaq@gmail.com" 31 | 32 | #. i18n: ectx: label, entry (ListenPort), group (General) 33 | #: krdpserversettings.kcfg:14 34 | #, kde-format 35 | msgid "The port the server listens on" 36 | msgstr "El port que escolta el servidor" 37 | 38 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 39 | #: krdpserversettings.kcfg:18 40 | #, kde-format 41 | msgid "Are certificates autogenerated during server start" 42 | msgstr "Es generen automàticament els certificats durant l'inici del servidor" 43 | 44 | #. i18n: ectx: label, entry (Certificate), group (General) 45 | #: krdpserversettings.kcfg:22 46 | #, kde-format 47 | msgid "The certificate to use for TLS connections" 48 | msgstr "El certificat que s'utilitzarà per a les connexions TLS" 49 | 50 | #. i18n: ectx: label, entry (CertificateKey), group (General) 51 | #: krdpserversettings.kcfg:25 52 | #, kde-format 53 | msgid "The key that matches the TLS certificate" 54 | msgstr "La clau que coincidix amb el certificat TLS" 55 | 56 | #. i18n: ectx: label, entry (Quality), group (General) 57 | #: krdpserversettings.kcfg:28 58 | #, kde-format 59 | msgid "The quality of the video stream" 60 | msgstr "La qualitat del flux de vídeo" 61 | 62 | #. i18n: ectx: label, entry (Users), group (General) 63 | #: krdpserversettings.kcfg:32 64 | #, kde-format 65 | msgid "Users allowed to login, passwords are stored in KWallet" 66 | msgstr "" 67 | "Els usuaris autoritzats a iniciar sessió, les contrasenyes s'emmagatzemen a " 68 | "KWallet" 69 | 70 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 71 | #: krdpserversettings.kcfg:35 72 | #, kde-format 73 | msgid "Whether the current user can log in via PAM" 74 | msgstr "Si l'usuari actual pot iniciar la sessió mitjançant PAM" 75 | 76 | #. i18n: ectx: label, entry (Autostart), group (General) 77 | #: krdpserversettings.kcfg:39 78 | #, kde-format 79 | msgid "Autostart the server on login" 80 | msgstr "Inicia automàticament el servidor en iniciar la sessió" 81 | 82 | #: SessionController.cpp:102 83 | #, kde-format 84 | msgid "RDP Server" 85 | msgstr "Servidor RDP" 86 | 87 | #: SessionController.cpp:105 88 | #, kde-format 89 | msgid "Quit" 90 | msgstr "Ix" 91 | -------------------------------------------------------------------------------- /po/eu/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Translation for krdpserver.po to Euskara/Basque (eu). 2 | # Copyright (C) 2024-2025 This file is copyright: 3 | # This file is distributed under the same license as the krdp package. 4 | # SPDX-FileCopyrightText: 2024, 2025 KDE euskaratzeko proiektuaren arduraduna 5 | # 6 | # Translators: 7 | # SPDX-FileCopyrightText: 2024, 2025 Iñigo Salvador Azurmendi 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: krdp\n" 11 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 12 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 13 | "PO-Revision-Date: 2025-09-05 23:01+0200\n" 14 | "Last-Translator: Iñigo Salvador Azurmendi \n" 15 | "Language-Team: Basque \n" 16 | "Language: eu\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 21 | "X-Generator: Lokalize 25.08.0\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Iñigo Salvador Azurmendi" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "xalba@ni.eus" 32 | 33 | #. i18n: ectx: label, entry (ListenPort), group (General) 34 | #: krdpserversettings.kcfg:14 35 | #, kde-format 36 | msgid "The port the server listens on" 37 | msgstr "Zerbitzariak entzuten duen ataka" 38 | 39 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 40 | #: krdpserversettings.kcfg:18 41 | #, kde-format 42 | msgid "Are certificates autogenerated during server start" 43 | msgstr "Zerbitzaria abiatzean ziurtagiriak automatikoki sortzen dira?" 44 | 45 | #. i18n: ectx: label, entry (Certificate), group (General) 46 | #: krdpserversettings.kcfg:22 47 | #, kde-format 48 | msgid "The certificate to use for TLS connections" 49 | msgstr "TLS konexioetarako erabili behar den ziurtagiria" 50 | 51 | #. i18n: ectx: label, entry (CertificateKey), group (General) 52 | #: krdpserversettings.kcfg:25 53 | #, kde-format 54 | msgid "The key that matches the TLS certificate" 55 | msgstr "TLS ziurtagiriarekin bat datorren gakoa" 56 | 57 | #. i18n: ectx: label, entry (Quality), group (General) 58 | #: krdpserversettings.kcfg:28 59 | #, kde-format 60 | msgid "The quality of the video stream" 61 | msgstr "Bideo-korrontearen kalitatea" 62 | 63 | #. i18n: ectx: label, entry (Users), group (General) 64 | #: krdpserversettings.kcfg:32 65 | #, kde-format 66 | msgid "Users allowed to login, passwords are stored in KWallet" 67 | msgstr "" 68 | "Saio-hasteko baimendutako erabiltzaileak, pasahitzak «KWallet»en gordetzen " 69 | "dira" 70 | 71 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 72 | #: krdpserversettings.kcfg:35 73 | #, kde-format 74 | msgid "Whether the current user can log in via PAM" 75 | msgstr "Uneko erabiltzaileak PAM bidez saioa hasi dezakeen ala ez" 76 | 77 | #. i18n: ectx: label, entry (Autostart), group (General) 78 | #: krdpserversettings.kcfg:39 79 | #, kde-format 80 | msgid "Autostart the server on login" 81 | msgstr "Abiarazi zerbitzaria automatikoki saioa hasten denean" 82 | 83 | #: SessionController.cpp:102 84 | #, kde-format 85 | msgid "RDP Server" 86 | msgstr "RDP zerbitzaria" 87 | 88 | #: SessionController.cpp:105 89 | #, kde-format 90 | msgid "Quit" 91 | msgstr "Irten" 92 | -------------------------------------------------------------------------------- /po/pt_BR/krdpserver.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 This file is copyright: 2 | # This file is distributed under the same license as the krdp package. 3 | # 4 | # SPDX-FileCopyrightText: 2024 Rafael Sant 'Anna 5 | # SPDX-FileCopyrightText: 2024 Rafael Sant 'Anna 6 | # SPDX-FileCopyrightText: 2024 Rafael Sant'Anna 7 | # SPDX-FileCopyrightText: 2025 Marcus Gama 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: krdp\n" 11 | "Report-Msgid-Bugs-To: https://bugs.kde.org\n" 12 | "POT-Creation-Date: 2025-11-17 11:53+0000\n" 13 | "PO-Revision-Date: 2025-09-05 05:30-0300\n" 14 | "Last-Translator: Marcus Gama \n" 15 | "Language-Team: Brazilian Portuguese \n" 16 | "Language: pt_BR\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 21 | "X-Generator: Lokalize 25.08.0\n" 22 | 23 | #, kde-format 24 | msgctxt "NAME OF TRANSLATORS" 25 | msgid "Your names" 26 | msgstr "Rafael Sant'Anna" 27 | 28 | #, kde-format 29 | msgctxt "EMAIL OF TRANSLATORS" 30 | msgid "Your emails" 31 | msgstr "rafaelstn@outlook.com" 32 | 33 | #. i18n: ectx: label, entry (ListenPort), group (General) 34 | #: krdpserversettings.kcfg:14 35 | #, kde-format 36 | msgid "The port the server listens on" 37 | msgstr "A porta na qual o servidor escuta" 38 | 39 | #. i18n: ectx: label, entry (AutogenerateCertificates), group (General) 40 | #: krdpserversettings.kcfg:18 41 | #, kde-format 42 | msgid "Are certificates autogenerated during server start" 43 | msgstr "" 44 | "Os certificados são gerados automaticamente durante a inicialização do " 45 | "servidor" 46 | 47 | #. i18n: ectx: label, entry (Certificate), group (General) 48 | #: krdpserversettings.kcfg:22 49 | #, kde-format 50 | msgid "The certificate to use for TLS connections" 51 | msgstr "O certificado a ser usado para conexões TLS" 52 | 53 | #. i18n: ectx: label, entry (CertificateKey), group (General) 54 | #: krdpserversettings.kcfg:25 55 | #, kde-format 56 | msgid "The key that matches the TLS certificate" 57 | msgstr "A chave correspondente ao certificado TLS" 58 | 59 | #. i18n: ectx: label, entry (Quality), group (General) 60 | #: krdpserversettings.kcfg:28 61 | #, kde-format 62 | msgid "The quality of the video stream" 63 | msgstr "A qualidade da transmissão de vídeo" 64 | 65 | #. i18n: ectx: label, entry (Users), group (General) 66 | #: krdpserversettings.kcfg:32 67 | #, kde-format 68 | msgid "Users allowed to login, passwords are stored in KWallet" 69 | msgstr "" 70 | "Os usuários têm permissão para fazer login, as senhas são armazenadas no " 71 | "KWallet" 72 | 73 | #. i18n: ectx: label, entry (SystemUserEnabled), group (General) 74 | #: krdpserversettings.kcfg:35 75 | #, kde-format 76 | msgid "Whether the current user can log in via PAM" 77 | msgstr "Se o usuário atual pode efetuar login via PAM" 78 | 79 | #. i18n: ectx: label, entry (Autostart), group (General) 80 | #: krdpserversettings.kcfg:39 81 | #, kde-format 82 | msgid "Autostart the server on login" 83 | msgstr "Inicialização automática do servidor no login" 84 | 85 | #: SessionController.cpp:102 86 | #, kde-format 87 | msgid "RDP Server" 88 | msgstr "Servidor RDP" 89 | 90 | #: SessionController.cpp:105 91 | #, kde-format 92 | msgid "Quit" 93 | msgstr "Sair" 94 | -------------------------------------------------------------------------------- /src/RdpConnection.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | 10 | #include 11 | 12 | #include 13 | 14 | #include "krdp_export.h" 15 | 16 | namespace KRdp 17 | { 18 | 19 | class InputHandler; 20 | class Server; 21 | class VideoStream; 22 | class Cursor; 23 | class NetworkDetection; 24 | class Clipboard; 25 | 26 | /** 27 | * An RDP session. 28 | * 29 | * This represents an RDP session, that is, a connection between an RDP client 30 | * and the server. It primarily takes care of the RDP communication side of 31 | * things. 32 | * 33 | * Note that this class starts its own thread for performing the actual 34 | * communication. 35 | */ 36 | class KRDP_EXPORT RdpConnection : public QObject 37 | { 38 | Q_OBJECT 39 | 40 | public: 41 | /** 42 | * Session state. 43 | */ 44 | enum class State { 45 | Initial, 46 | Starting, 47 | Running, 48 | Streaming, 49 | Closed, 50 | }; 51 | 52 | /** 53 | * Reasons for closing the stream. 54 | */ 55 | enum class CloseReason { 56 | None, ///< No particular reason, e.g. closing due to normal operation 57 | /// like client disconnect. 58 | VideoInitFailed, ///< VideoStream failed to initialize. 59 | }; 60 | 61 | /** 62 | * Constructor. 63 | * 64 | * \param server The KRdp::Server instance this session is part of. 65 | * \param socketHandle A file handle to the socket this session should use 66 | * for communication. 67 | */ 68 | explicit RdpConnection(Server *server, qintptr socketHandle); 69 | ~RdpConnection() override; 70 | 71 | /** 72 | * The current session state. 73 | */ 74 | State state() const; 75 | Q_SIGNAL void stateChanged(State newState); 76 | 77 | /** 78 | * Close the connection 79 | * 80 | * \param reason The reason to close the connection. May set error state if 81 | * it is something different than CloseReason::None. 82 | */ 83 | void close(CloseReason reason = CloseReason::None); 84 | 85 | /** 86 | * The InputHandler instance associated with this session. 87 | */ 88 | InputHandler *inputHandler() const; 89 | /** 90 | * The VideoStream instance associated with this session. 91 | */ 92 | VideoStream *videoStream() const; 93 | /** 94 | * The Cursor instance associated with this session. 95 | */ 96 | Cursor *cursor() const; 97 | 98 | Clipboard *clipboard() const; 99 | 100 | NetworkDetection *networkDetection() const; 101 | 102 | private: 103 | friend BOOL peerCapabilities(freerdp_peer *); 104 | friend BOOL peerActivate(freerdp_peer *); 105 | friend BOOL peerPostConnect(freerdp_peer *); 106 | friend BOOL suppressOutput(rdpContext *, uint8_t, const RECTANGLE_16 *); 107 | 108 | friend class Cursor; 109 | friend class VideoStream; 110 | friend class NetworkDetection; 111 | friend class Clipboard; 112 | 113 | void setState(State newState); 114 | void initialize(); 115 | void run(std::stop_token stopToken); 116 | 117 | freerdp_peer *rdpPeer() const; 118 | rdpContext *rdpPeerContext() const; 119 | 120 | bool onCapabilities(); 121 | bool onActivate(); 122 | bool onPostConnect(); 123 | bool onClose(); 124 | bool onSuppressOutput(uint8_t allow); 125 | 126 | class Private; 127 | const std::unique_ptr d; 128 | }; 129 | 130 | } 131 | -------------------------------------------------------------------------------- /src/VideoStream.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | #include 17 | 18 | #include "krdp_export.h" 19 | 20 | namespace KRdp 21 | { 22 | 23 | class RdpConnection; 24 | 25 | /** 26 | * A frame of compressed video data. 27 | */ 28 | struct VideoFrame { 29 | /** 30 | * The size of the frame, in pixels. 31 | */ 32 | QSize size; 33 | /** 34 | * h264 compressed data in YUV420 color space. 35 | */ 36 | QByteArray data; 37 | /** 38 | * Area of the frame that was actually damaged. 39 | * TODO: Actually use this information. 40 | */ 41 | QRegion damage; 42 | /** 43 | * Whether the packet contains all the information 44 | */ 45 | bool isKeyFrame; 46 | /** 47 | * When was this frame presented. 48 | */ 49 | std::chrono::system_clock::time_point presentationTimeStamp; 50 | }; 51 | 52 | /** 53 | * A class that encapsulates an RdpGfx video stream. 54 | * 55 | * Video streaming is done using the "RDP Graphics Pipeline" protocol 56 | * extension which allows using h264 as the codec for the video stream. 57 | * However, this protocol extension is fairly complex to setup and use. 58 | * 59 | * VideoStream makes sure to handle most of the complexity of the RdpGfx 60 | * protocol like ensuring the client knows the right resolution and a 61 | * surface at the right size. It also takes care of sending the frames, 62 | * using a separate thread for a submission queue. 63 | * 64 | * VideoStream is managed by Session. Each session will have one instance 65 | * of this class. 66 | */ 67 | class KRDP_EXPORT VideoStream : public QObject 68 | { 69 | Q_OBJECT 70 | 71 | public: 72 | explicit VideoStream(RdpConnection *session); 73 | ~VideoStream() override; 74 | 75 | bool initialize(); 76 | void close(); 77 | Q_SIGNAL void closed(); 78 | 79 | /** 80 | * Queue a frame to be sent to the client. 81 | * 82 | * This will add the provided frame to the queue of frames that should 83 | * be sent to the client. 84 | * 85 | * \param frame The frame to send. 86 | */ 87 | void queueFrame(const VideoFrame &frame); 88 | 89 | /** 90 | * Indicate that the video state should be reset. 91 | * 92 | * This means the screen resolution and other information of the client 93 | * will be updated based on the current state of the VideoStream. 94 | */ 95 | void reset(); 96 | 97 | /** 98 | */ 99 | bool enabled() const; 100 | void setEnabled(bool enabled); 101 | Q_SIGNAL void enabledChanged(); 102 | 103 | uint32_t requestedFrameRate() const; 104 | Q_SIGNAL void requestedFrameRateChanged(); 105 | 106 | private: 107 | friend BOOL gfxChannelIdAssigned(RdpgfxServerContext *, uint32_t); 108 | friend uint32_t gfxCapsAdvertise(RdpgfxServerContext *, const RDPGFX_CAPS_ADVERTISE_PDU *); 109 | friend uint32_t gfxFrameAcknowledge(RdpgfxServerContext *, const RDPGFX_FRAME_ACKNOWLEDGE_PDU *); 110 | 111 | bool onChannelIdAssigned(uint32_t channelId); 112 | uint32_t onCapsAdvertise(const RDPGFX_CAPS_ADVERTISE_PDU *capsAdvertise); 113 | uint32_t onFrameAcknowledge(const RDPGFX_FRAME_ACKNOWLEDGE_PDU *frameAcknowledge); 114 | 115 | void performReset(QSize size); 116 | void sendFrame(const VideoFrame &frame); 117 | 118 | void updateRequestedFrameRate(); 119 | 120 | class Private; 121 | const std::unique_ptr d; 122 | }; 123 | 124 | } 125 | -------------------------------------------------------------------------------- /src/kcm/ui/EditUserModal.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | import QtQuick 6 | import QtQuick.Controls as QQC2 7 | import QtQuick.Layouts 8 | import org.kde.kirigami as Kirigami 9 | import org.kde.kcmutils as KCM 10 | 11 | Kirigami.Dialog { 12 | id: editUserModal 13 | // if oldUsername is empty, we're adding a new user 14 | property string oldUsername 15 | property bool passwordChanged: false 16 | property bool usernameChanged: false 17 | property bool usernameAlreadyExistsError: false 18 | 19 | showCloseButton: false 20 | title: oldUsername === "" ? i18nc("@title:window", "Add new user") : i18nc("@title:window", "Modify user") 21 | 22 | Connections { 23 | target: kcm 24 | function onPasswordLoaded(user: string, password: string): void { 25 | if (user === editUserModal.oldUsername) { 26 | passwordField.text = password; 27 | } 28 | } 29 | } 30 | 31 | onAboutToShow: { 32 | passwordChanged = false; 33 | usernameChanged = false; 34 | usernameField.text = oldUsername; 35 | passwordField.text = ""; 36 | kcm.readPasswordFromWallet(oldUsername); 37 | } 38 | 39 | function saveUser(): void { 40 | // add new user 41 | if (oldUsername === "") { 42 | kcm.addUser(usernameField.text, passwordField.text); 43 | } else 44 | // modify user 45 | if (usernameChanged || passwordChanged) { 46 | // Keep old username 47 | if (oldUsername === usernameField.text) { 48 | kcm.modifyUser(oldUsername, "", passwordField.text); 49 | } else 50 | // Change username 51 | { 52 | kcm.modifyUser(oldUsername, usernameField.text, passwordField.text); 53 | } 54 | } 55 | editUserModal.close(); 56 | } 57 | 58 | footer: QQC2.DialogButtonBox { 59 | standardButtons: saveButton | QQC2.DialogButtonBox.Cancel 60 | onAccepted: { 61 | editUserModal.saveUser(); 62 | } 63 | QQC2.Button { 64 | id: saveButton 65 | icon.name: "document-save" 66 | enabled: (editUserModal.usernameChanged || editUserModal.passwordChanged) && (usernameField.text !== "" && passwordField.text !== "") && !editUserModal.usernameAlreadyExistsError 67 | text: i18nc("@label:button", "Save") 68 | QQC2.DialogButtonBox.buttonRole: QQC2.DialogButtonBox.AcceptRole 69 | } 70 | } 71 | 72 | Kirigami.FormLayout { 73 | id: form 74 | Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter 75 | 76 | QQC2.TextField { 77 | id: usernameField 78 | Kirigami.FormData.label: i18nc("@label:textbox", "Username:") 79 | Layout.fillWidth: true 80 | text: editUserModal.oldUsername 81 | KCM.SettingStateBinding { 82 | configObject: root.settings 83 | settingName: "users" 84 | } 85 | onTextEdited: { 86 | editUserModal.usernameChanged = usernameField.text !== editUserModal.oldUsername; 87 | editUserModal.usernameAlreadyExistsError = kcm.userExists(usernameField.text) && usernameField.text !== editUserModal.oldUsername; 88 | } 89 | } 90 | 91 | QQC2.Label { 92 | text: i18nc("@info", "Username already exists!") 93 | visible: editUserModal.usernameAlreadyExistsError 94 | } 95 | 96 | Kirigami.PasswordField { 97 | id: passwordField 98 | Kirigami.FormData.label: i18nc("@label:textbox", "Password:") 99 | Layout.fillWidth: true 100 | onTextEdited: { 101 | editUserModal.passwordChanged = true; 102 | } 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/kcm/kcmkrdpserver.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Akseli Lahtinen 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include "krdpserversettings.h" 8 | #include "usersmodel.h" 9 | #include 10 | #include 11 | #include 12 | 13 | class KRDPServerConfigImpl; 14 | class QAbstractItemModel; 15 | 16 | namespace SystemdService 17 | { 18 | Q_NAMESPACE 19 | enum Status { 20 | Unknown, 21 | Running, 22 | Stopped, 23 | Failed 24 | }; 25 | Q_ENUM_NS(Status); 26 | } 27 | 28 | class KRDPServerConfig : public KQuickManagedConfigModule 29 | { 30 | Q_OBJECT 31 | public: 32 | explicit KRDPServerConfig(QObject *parent, const KPluginMetaData &data); 33 | ~KRDPServerConfig() override; 34 | 35 | Q_PROPERTY(SystemdService::Status serverStatus READ serverStatus NOTIFY serverStatusChanged); 36 | Q_PROPERTY(QString errorMessage READ errorMessage NOTIFY errorMessageChanged); 37 | 38 | Q_PROPERTY(QString hostName READ hostName CONSTANT) 39 | Q_PROPERTY(bool managementAvailable READ managementAvailable CONSTANT) 40 | 41 | Q_PROPERTY(QAbstractItemModel *users READ usersModel CONSTANT) 42 | 43 | Q_INVOKABLE QString toLocalFile(const QUrl &url); 44 | 45 | Q_INVOKABLE void modifyUser(const QString &oldUsername, const QString &newUsername, const QString &newPassword); 46 | Q_INVOKABLE void addUser(const QString &username, const QString &password); 47 | Q_INVOKABLE void deleteUser(const QString &username); 48 | Q_INVOKABLE bool userExists(const QString &username); 49 | 50 | Q_INVOKABLE void readPasswordFromWallet(const QString &user); 51 | void writePasswordToWallet(const QString &user, const QString &password); 52 | void deletePasswordFromWallet(const QString &user); 53 | 54 | Q_INVOKABLE bool isH264Supported(); 55 | Q_INVOKABLE QStringList listenAddressList(); 56 | Q_INVOKABLE void toggleAutoconnect(const bool enabled); 57 | Q_INVOKABLE void toggleServer(const bool enabled); 58 | Q_INVOKABLE void restartServer(); 59 | 60 | Q_INVOKABLE void generateCertificate(); 61 | Q_INVOKABLE void copyAddressToClipboard(const QString &address); 62 | Q_INVOKABLE KRDPServerSettings *settings() const 63 | { 64 | return m_serverSettings; 65 | }; 66 | 67 | Q_INVOKABLE void updateServerStatus(); 68 | SystemdService::Status serverStatus() const; 69 | Q_INVOKABLE [[nodiscard]] bool isServerRunning() const; 70 | 71 | QString errorMessage() const; 72 | 73 | QString hostName() const; 74 | bool managementAvailable() const; 75 | QAbstractItemModel *usersModel() const 76 | { 77 | return m_usersModel; 78 | }; 79 | 80 | public Q_SLOTS: 81 | void save() override; 82 | void defaults() override; 83 | 84 | Q_SIGNALS: 85 | void krdpServerSettingsChanged(); 86 | void generateCertificateSucceeded(); 87 | void generateCertificateFailed(); 88 | void passwordLoaded(const QString &user, const QString &password); 89 | void keychainError(const QString &errorText); 90 | void serverStatusChanged(); 91 | void errorMessageChanged(); 92 | void isServerRunningChanged(); 93 | 94 | private: 95 | void setServerStatus(SystemdService::Status status); 96 | void setErrorMessage(const QString &errorMessage); 97 | void createRestoreToken(); 98 | QStringList getLastJournalEntries(const QString &unit, const QString &invocationId); 99 | QString journalValue(sd_journal *journal, const QString &field); 100 | 101 | KRDPServerSettings *m_serverSettings; 102 | UsersModel *m_usersModel; 103 | Q_SLOT void servicePropertiesChanged(); 104 | bool m_isH264Supported { false }; 105 | SystemdService::Status m_currentServerStatus; 106 | QString m_lastErrorMessage; 107 | 108 | template 109 | Output narrow(Input i) 110 | { 111 | Output o = i; 112 | if (i != Input(o)) { 113 | std::abort(); 114 | } 115 | return o; 116 | } 117 | }; 118 | -------------------------------------------------------------------------------- /src/Server.h: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #pragma once 6 | 7 | #include 8 | #include 9 | 10 | #include 11 | 12 | #include 13 | 14 | #include "krdp_export.h" 15 | 16 | namespace KRdp 17 | { 18 | 19 | class RdpConnection; 20 | 21 | /** 22 | * Data required per user that is allowed to connect to the server. 23 | */ 24 | struct User { 25 | QString name; ///< The user name used to connect. 26 | QString password; ///< The password for the user. 27 | bool readOnly = false; ///< Whether this user is allowed to control the session. 28 | }; 29 | 30 | /** 31 | * Core RDP server class. 32 | * 33 | * This class listens for TCP connections and creates a new @c Session for each 34 | * incoming connection. It takes care of basic system initialisation. It also 35 | * stores connection and security settings. 36 | */ 37 | class KRDP_EXPORT Server : public QTcpServer 38 | { 39 | Q_OBJECT 40 | 41 | public: 42 | explicit Server(QObject *parent = nullptr); 43 | ~Server() override; 44 | 45 | /** 46 | * Start listening for incoming connections. 47 | * 48 | * Note that `address` and `port` should be set before calling this, 49 | * changing them after the server has started listening has no effect. 50 | */ 51 | bool start(); 52 | /** 53 | * Stop listening for incoming connections. 54 | */ 55 | void stop(); 56 | 57 | /** 58 | * The host address to listen on. 59 | * 60 | * Set this to an appropriate address for the server to listen on. Common 61 | * options are `0.0.0.0` to listen on all interfaces and accept all incoming 62 | * connections or `127.0.0.1` to only listen on the loopback interface and 63 | * only allow local connections. 64 | * 65 | * By default the address is set to QHostAddress::LocalHost 66 | */ 67 | QHostAddress address() const; 68 | void setAddress(const QHostAddress &newAddress); 69 | 70 | /** 71 | * The port to listen on. 72 | * 73 | * By default this is set to 3389, which is the standard port used for RDP. 74 | */ 75 | quint16 port() const; 76 | void setPort(quint16 newPort); 77 | 78 | /** 79 | * The list of users allowed to log in to the server. 80 | * 81 | * At least one user is required for the server to work. 82 | */ 83 | QList users() const; 84 | void setUsers(const QList &users); 85 | void addUser(const User &user); 86 | 87 | 88 | /** Whether to authenticate against PAM for the user running the daemon 89 | */ 90 | bool usePAMAuthentication() const; 91 | void setUsePAMAuthentication(bool usePAM); 92 | 93 | /** 94 | * The path of a certificate file to use for encrypting communications. 95 | * 96 | * This is required to be set to a valid file, as the RDP login process only 97 | * works over an encrypted connection. 98 | */ 99 | std::filesystem::path tlsCertificate() const; 100 | void setTlsCertificate(const std::filesystem::path &newTlsCertificate); 101 | 102 | /** 103 | * The path of a certificate key to use for encrypting communications. 104 | * 105 | * This is required to be set to a valid file, as the RDP login process only 106 | * works over an encrypted connection. 107 | */ 108 | std::filesystem::path tlsCertificateKey() const; 109 | void setTlsCertificateKey(const std::filesystem::path &newTlsCertificateKey); 110 | 111 | /** 112 | * Emitted whenever a new connection is started. 113 | * 114 | * \param connection The new connection that was just started. 115 | */ 116 | Q_SIGNAL void newConnectionCreated(RdpConnection *connection); 117 | 118 | protected: 119 | /** 120 | * Overridden from QTcpServer 121 | */ 122 | void incomingConnection(qintptr handle) override; 123 | 124 | private: 125 | friend class RdpConnection; 126 | rdp_settings *rdpSettings() const; 127 | 128 | class Private; 129 | const std::unique_ptr d; 130 | }; 131 | 132 | } 133 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | # SPDX-License-Identifier: BSD-2-Clause 3 | 4 | set(PROJECT_VERSION "6.5.80") 5 | 6 | cmake_minimum_required(VERSION 3.16) 7 | 8 | set(QT_MIN_VERSION "6.9.0") 9 | set(KF6_MIN_VERSION "6.18.0") 10 | set(KDE_COMPILERSETTINGS_LEVEL "5.85") 11 | 12 | project(KRdp VERSION "${PROJECT_VERSION}") 13 | 14 | include(FeatureSummary) 15 | find_package(ECM ${KF6_MIN_VERSION} NO_MODULE) 16 | set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules") 17 | feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) 18 | 19 | set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake ) 20 | 21 | include(KDEInstallDirs) 22 | include(KDECompilerSettings NO_POLICY_SCOPE) 23 | include(KDECMakeSettings) 24 | include(KDEGitCommitHooks) 25 | 26 | include(KDEClangFormat) 27 | include(ECMGenerateExportHeader) 28 | include(ECMAddTests) 29 | include(ECMSetupVersion) 30 | include(ECMQtDeclareLoggingCategory) 31 | include(ECMEnableSanitizers) 32 | include(ECMDeprecationSettings) 33 | include(ECMQmlModule) 34 | 35 | option(BUILD_EXAMPLES "Build example applications" ON) 36 | option(BUILD_PLASMA_SESSION "Build support for Plasma Screencasting extensions" ON) 37 | 38 | find_package(Qt6 ${QT_MIN_VERSION} CONFIG REQUIRED Core Quick Gui Network DBus WaylandClient Qml) 39 | 40 | if (Qt6Gui_VERSION VERSION_GREATER_EQUAL "6.10.0") 41 | find_package(Qt6GuiPrivate ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE) 42 | endif() 43 | 44 | find_package(KF6 ${KF6_MIN_VERSION} REQUIRED COMPONENTS Config DBusAddons KCMUtils I18n CoreAddons StatusNotifierItem Crash GuiAddons) 45 | 46 | find_package(FreeRDP 3.1 REQUIRED) 47 | find_package(WinPR 3.1 REQUIRED) 48 | find_package(FreeRDP-Server 3.1 REQUIRED) 49 | find_package(KPipeWire 5.27.80 REQUIRED) 50 | find_package(XKB REQUIRED) 51 | 52 | find_package(Qt6Keychain CONFIG) 53 | set_package_properties(Qt6Keychain PROPERTIES 54 | DESCRIPTION "Provides support for secure credentials storage" 55 | URL "https://github.com/frankosterfeld/qtkeychain" 56 | TYPE REQUIRED) 57 | 58 | if(BUILD_PLASMA_SESSION) 59 | find_package(PlasmaWaylandProtocols REQUIRED) 60 | endif() 61 | 62 | find_package(Systemd 254) 63 | set_package_properties(Systemd PROPERTIES TYPE REQUIRED PURPOSE "Required by KCM to activate the KRDP Server units.") 64 | 65 | find_package(PAM REQUIRED) 66 | set_package_properties(PAM PROPERTIES DESCRIPTION "PAM Libraries" 67 | URL "https://www.kernel.org/pub/linux/libs/pam/" 68 | TYPE REQUIRED 69 | PURPOSE "Required for authentication" 70 | ) 71 | 72 | set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].") 73 | 74 | set(CMAKE_CXX_STANDARD 20) 75 | set(CMAKE_CXX_STANDARD_REQUIRED TRUE) 76 | 77 | 78 | ecm_set_disabled_deprecation_versions(QT 6.7.0 79 | KF 6.12.0 80 | ) 81 | 82 | add_subdirectory(src) 83 | add_subdirectory(server) 84 | 85 | if(BUILD_EXAMPLES) 86 | add_subdirectory(examples) 87 | endif() 88 | 89 | if(BUILD_TESTING) 90 | add_subdirectory(autotests) 91 | endif() 92 | 93 | ecm_setup_version( 94 | PROJECT 95 | VARIABLE_PREFIX KRdp 96 | VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/krdp_version.h" 97 | PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KRdpConfigVersion.cmake" 98 | SOVERSION 1 99 | ) 100 | 101 | configure_package_config_file( 102 | "KRdpConfig.cmake.in" 103 | "KRdpConfig.cmake" 104 | INSTALL_DESTINATION ${KDE_INSTALL_CMAKEPACKAGEDIR}/KRdp 105 | ) 106 | 107 | install(FILES 108 | "${CMAKE_CURRENT_BINARY_DIR}/KRdpConfig.cmake" 109 | "${CMAKE_CURRENT_BINARY_DIR}/KRdpConfigVersion.cmake" 110 | DESTINATION ${KDE_INSTALL_CMAKEPACKAGEDIR}/KRdp 111 | COMPONENT Devel 112 | ) 113 | 114 | feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) 115 | 116 | file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h) 117 | kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES}) 118 | 119 | kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT) 120 | 121 | ki18n_install(po) 122 | -------------------------------------------------------------------------------- /src/kcm/ui/UserListView.qml: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2025 Sebastian Kügler 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | import QtQuick 6 | import QtQuick.Controls as QQC2 7 | import QtQuick.Layouts 8 | import QtQuick.Dialogs as QtDialogs 9 | import QtQml.Models as QtModels 10 | import org.kde.kirigami as Kirigami 11 | import org.kde.kirigami.delegates as KD 12 | import org.kde.kirigamiaddons.formcard 1 as FormCard 13 | import org.kde.kcmutils as KCM 14 | 15 | ListView { 16 | id: userListView 17 | clip: true 18 | headerPositioning: ListView.OverlayHeader 19 | header: Kirigami.InlineViewHeader { 20 | width: userListView.width 21 | text: i18nc("@title", "Usernames") 22 | actions: [ 23 | Kirigami.Action { 24 | icon.name: "list-add-symbolic" 25 | text: i18nc("@action:button", "Add New…") 26 | Accessible.name: i18nc("@action:button", "Add New User Account…") 27 | onTriggered: source => { 28 | root.addUser(); 29 | } 30 | } 31 | ] 32 | } 33 | 34 | Kirigami.PlaceholderMessage { 35 | width: parent.width - (Kirigami.Units.largeSpacing * 4) 36 | anchors.centerIn: parent 37 | visible: userListView.count === 0 38 | icon.name: "list-add-user-symbolic" 39 | text: i18nc("@info:placeholder", "Add at least one user account to enable remote login") 40 | explanation: xi18nc("@info:placeholder", "Click Add New… to add one") 41 | } 42 | 43 | model: kcm.users 44 | 45 | section.property: "systemUser" 46 | section.delegate: Kirigami.ListSectionHeader { 47 | width: userListView.width 48 | // The attached section is cast to a string by Qt, so we have to compare our boolean as a string 49 | text: section == "true" ? i18nc("@title:group", "System Users") : i18nc("@title:group", "Other Users") 50 | } 51 | 52 | delegate: QtModels.DelegateChooser { 53 | 54 | role: "systemUser" 55 | 56 | // System user account 57 | QtModels.DelegateChoice { 58 | roleValue: "true" 59 | 60 | KD.CheckSubtitleDelegate { 61 | id: checkDelegate 62 | 63 | width: userListView.width 64 | icon.width: 0 65 | 66 | text: model.userName 67 | subtitle: i18nc("@info:usagetip used as a subtitle for a title+subtitle list item", "Login with your system password") 68 | 69 | // Help line up text and actions 70 | Kirigami.Theme.useAlternateBackgroundColor: true 71 | 72 | checked: model.systemUserEnabled 73 | onToggled: model.systemUserEnabled = checked 74 | } 75 | } 76 | 77 | // Manually-created user account 78 | QtModels.DelegateChoice { 79 | roleValue: "false" 80 | 81 | QQC2.ItemDelegate { 82 | id: itemDelegate 83 | 84 | width: userListView.width 85 | 86 | // Help line up text and actions 87 | Kirigami.Theme.useAlternateBackgroundColor: true 88 | 89 | onClicked: root.modifyUser(model.userName) 90 | 91 | contentItem: Kirigami.TitleSubtitleWithActions { 92 | title: model.userName 93 | elide: Text.ElideRight 94 | selected: itemDelegate.pressed || itemDelegate.highlighted 95 | displayHint: QQC2.Button.IconOnly 96 | actions: [ 97 | Kirigami.Action { 98 | icon.name: "edit-entry-symbolic" 99 | text: i18nc("@action:button", "Modify user…") 100 | onTriggered: { 101 | itemDelegate.click(); 102 | } 103 | tooltip: text 104 | }, 105 | Kirigami.Action { 106 | icon.name: "edit-delete-remove-symbolic" 107 | text: i18nc("@action:button", "Remove user…") 108 | onTriggered: { 109 | root.deleteUser(model.userName); 110 | } 111 | tooltip: text 112 | } 113 | ] 114 | } 115 | } 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /examples/streamer/org.kde.krdp.desktop.cmake: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: None 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | [Desktop Entry] 5 | Type=Application 6 | Exec=@CMAKE_INSTALL_PREFIX@/bin/krdpserver 7 | Icon=krfb 8 | Terminal=false 9 | Name=KRdp 10 | Name[ar]=كي أردبي 11 | Name[ast]=KRdp 12 | Name[az]=KRdp 13 | Name[bg]=KRdp 14 | Name[ca]=KRdp 15 | Name[ca@valencia]=KRdp 16 | Name[cs]=KRdp 17 | Name[de]=KRdp 18 | Name[en_GB]=KRdp 19 | Name[eo]=KRdp 20 | Name[es]=KRdp 21 | Name[eu]=KRdp 22 | Name[fi]=KRdp 23 | Name[fr]=KRdp 24 | Name[gl]=KRdp 25 | Name[he]=KRdp 26 | Name[hi]=केआरडीपी 27 | Name[hu]=KRdp 28 | Name[ia]=KRdp 29 | Name[is]=KRdp 30 | Name[it]=KRdp 31 | Name[ka]=KRdp 32 | Name[ko]=KRdp 33 | Name[lt]=KRdp 34 | Name[lv]=KRdp 35 | Name[nl]=KRdp 36 | Name[nn]=KRdp 37 | Name[pa]=KRdp 38 | Name[pl]=KRdp 39 | Name[pt_BR]=KRdp 40 | Name[ro]=KRdp 41 | Name[ru]=KRdp 42 | Name[sa]=KRdp 43 | Name[sk]=KRdp 44 | Name[sl]=KRdp 45 | Name[sv]=KRDP 46 | Name[tr]=KRdp 47 | Name[uk]=KRdp 48 | Name[zh_CN]=KRDP 49 | Name[zh_TW]=KRdp 50 | GenericName=Desktop Sharing (RDP) 51 | GenericName[ar]=مشاركة سطح المكتب (أردبي) 52 | GenericName[ast]=Compartición del escritoriu (RDP) 53 | GenericName[az]=İş masasını paylaşmaq (RDP) 54 | GenericName[bg]=Споделяне на работния плот 55 | GenericName[ca]=Compartició de l'escriptori (RDP) 56 | GenericName[ca@valencia]=Compartiu l'escriptori (RDP) 57 | GenericName[cs]=Sdílení pracovní plochy (RDP) 58 | GenericName[de]=Freigabe der Arbeitsfläche (RDP) 59 | GenericName[en_GB]=Desktop Sharing (RDP) 60 | GenericName[eo]=Kundivido de Labortablo (RDP) 61 | GenericName[es]=Compartir el escritorio (RDP) 62 | GenericName[eu]=Mahaigaina partekatzea (RDP) 63 | GenericName[fi]=Työpöydän jako (RDP) 64 | GenericName[fr]=Partage de bureaux (RDP) 65 | GenericName[gl]=Compartición do escritorio (RDP) 66 | GenericName[he]=שיתוף שולחנות עבודה (RDP) 67 | GenericName[hi]=डेस्कटॉप शेयरिंग (RDP) 68 | GenericName[hu]=Asztalmegosztás (RDP) 69 | GenericName[ia]=Compartir de scriptorio (RDP) 70 | GenericName[is]=Skjáborðsmiðlun (RDP) 71 | GenericName[it]=Condivisione del desktop (RDP) 72 | GenericName[ka]=სამუშაო მაგიდის გაზიარება (RDP) 73 | GenericName[ko]=데스크톱 공유(RDP) 74 | GenericName[lt]=Darbalaukio bendrinimas (RDP) 75 | GenericName[lv]=Darbvirsmas kopīgošana (RDP) 76 | GenericName[nl]=Bureaublad delen (RDP) 77 | GenericName[nn]=Skrivebordsdeling (RDP) 78 | GenericName[pa]=ਡੈਸਕਟਾਪ ਸ਼ੇਅਰਿੰਗ (RDP) 79 | GenericName[pl]=Współdzielenie pulpitu (RDP) 80 | GenericName[pt_BR]=Compartilhamento da área de trabalho (RDP) 81 | GenericName[ro]=Partajare birou (RDP) 82 | GenericName[ru]=Совместный доступ к рабочему столу (RDP) 83 | GenericName[sa]=कार्यमुखम् साझाकरणम् (RDP) 84 | GenericName[sk]=Zdieľanie plochy (RDP) 85 | GenericName[sl]=Deljenje namizja (RDP) 86 | GenericName[sv]=Skrivbordsdelning (RDP) 87 | GenericName[ta]=பணிமேடைப் பகிர்வு (RDP) 88 | GenericName[tr]=Masaüstü Paylaşımı (RDP) 89 | GenericName[uk]=Спільне користування стільницею (RDP) 90 | GenericName[zh_CN]=桌面共享 (RDP) 91 | GenericName[zh_TW]=桌面分享 (RDP) 92 | Comment=Desktop Sharing 93 | Comment[ar]=مشاركة سطح المكتب 94 | Comment[ast]=Compartición del escritoriu 95 | Comment[az]=İş masasını paylaşmaq 96 | Comment[bg]=Споделяне на работния плот 97 | Comment[ca]=Compartició de l'escriptori 98 | Comment[ca@valencia]=Compartiu l'escriptori 99 | Comment[cs]=Sdílení pracovní plochy 100 | Comment[de]=Arbeitsflächen-Freigabe 101 | Comment[en_GB]=Desktop Sharing 102 | Comment[eo]=Kundivido de Labortablo 103 | Comment[es]=Compartir el escritorio 104 | Comment[eu]=Mahaigaina partekatzea 105 | Comment[fi]=Työpöydän jako 106 | Comment[fr]=Partage de bureaux 107 | Comment[gl]=Compartición do escritorio. 108 | Comment[he]=שיתוף שולחנות עבודה 109 | Comment[hi]=डेस्कटॉप साझाकरण 110 | Comment[hu]=Asztalmegosztás 111 | Comment[ia]=Compartir de scriptorio 112 | Comment[is]=Skjáborðamiðlun 113 | Comment[it]=Condivisione del desktop 114 | Comment[ka]=სამუშაო მაგიდის გაზიარება 115 | Comment[ko]=데스크톱 공유 116 | Comment[lt]=Darbalaukio bendrinimas 117 | Comment[lv]=Darbvirsmas kopīgošana 118 | Comment[nl]=Bureaublad delen 119 | Comment[nn]=Skrivebordsdeling 120 | Comment[pa]=ਡੈਸਕਟਾਪ ਸ਼ੇਅਰਿੰਗ 121 | Comment[pl]=Współdzielenie pulpitu 122 | Comment[pt_BR]=Compartilhamento da área de trabalho 123 | Comment[ro]=Partajare birou 124 | Comment[ru]=Совместный доступ к рабочему столу 125 | Comment[sa]=कार्यमुखम् साझाकरणम् 126 | Comment[sk]=Zdieľanie pracovnej plochy 127 | Comment[sl]=Deljenje namizja 128 | Comment[sv]=Skrivbordsdelning 129 | Comment[ta]=பணிமேடைப் பகிர்வு 130 | Comment[tr]=Masaüstü Paylaşımı 131 | Comment[uk]=Спільні стільниці 132 | Comment[zh_CN]=桌面共享 133 | Comment[zh_TW]=桌面分享 134 | Categories=Qt;KDE;Network;RemoteAccess; 135 | X-KDE-Wayland-Interfaces=org_kde_kwin_fake_input,zkde_screencast_unstable_v1 136 | -------------------------------------------------------------------------------- /src/AbstractSession.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Aleix Pol Gonzalez 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #include "AbstractSession.h" 6 | #include 7 | #include 8 | #include 9 | 10 | namespace KRdp 11 | { 12 | 13 | class KRDP_NO_EXPORT AbstractSession::Private 14 | { 15 | public: 16 | std::unique_ptr encodedStream; 17 | 18 | std::optional activeStream; 19 | std::optional virtualMonitor; 20 | bool started = false; 21 | bool enabled = false; 22 | QSize size; 23 | QSize logicalSize; 24 | std::optional frameRate = 60; 25 | std::optional quality; 26 | QSet enableRequests; 27 | }; 28 | 29 | AbstractSession::AbstractSession() 30 | : QObject() 31 | , d(std::make_unique()) 32 | { 33 | } 34 | 35 | AbstractSession::~AbstractSession() 36 | { 37 | if (d->encodedStream) { 38 | d->encodedStream->stop(); 39 | } 40 | } 41 | 42 | QSize AbstractSession::logicalSize() const 43 | { 44 | return d->logicalSize; 45 | } 46 | 47 | int AbstractSession::activeStream() const 48 | { 49 | return d->activeStream.value_or(-1); 50 | } 51 | 52 | std::optional AbstractSession::virtualMonitor() const 53 | { 54 | return d->virtualMonitor; 55 | } 56 | 57 | void AbstractSession::setActiveStream(int stream) 58 | { 59 | Q_ASSERT(!d->virtualMonitor); 60 | d->activeStream = stream; 61 | } 62 | 63 | void AbstractSession::setVirtualMonitor(const VirtualMonitor &virtualMonitor) 64 | { 65 | Q_ASSERT(!d->activeStream.has_value()); 66 | d->virtualMonitor = virtualMonitor; 67 | } 68 | 69 | void AbstractSession::setVideoQuality(quint8 quality) 70 | { 71 | d->quality = quality; 72 | if (d->encodedStream) { 73 | d->encodedStream->setQuality(quality); 74 | } 75 | } 76 | 77 | bool AbstractSession::streamingEnabled() const 78 | { 79 | if (d->encodedStream) { 80 | return d->encodedStream->isActive(); 81 | } 82 | return false; 83 | } 84 | 85 | void AbstractSession::setStreamingEnabled(bool enable) 86 | { 87 | d->enabled = enable; 88 | 89 | if (enable && !d->started) { 90 | start(); 91 | return; 92 | } 93 | 94 | if (d->encodedStream) { 95 | if (enable && d->started) { 96 | d->encodedStream->start(); 97 | } else { 98 | d->encodedStream->stop(); 99 | } 100 | } 101 | } 102 | 103 | void AbstractSession::setVideoFrameRate(quint32 framerate) 104 | { 105 | d->frameRate = framerate; 106 | if (d->encodedStream) { 107 | d->encodedStream->setMaxFramerate({framerate, 1}); 108 | // this buffers 1 second of frames and drops after that 109 | d->encodedStream->setMaxPendingFrames(framerate); 110 | } 111 | } 112 | 113 | void AbstractSession::setSize(QSize size) 114 | { 115 | d->size = size; 116 | } 117 | 118 | void AbstractSession::setLogicalSize(QSize size) 119 | { 120 | d->logicalSize = size; 121 | } 122 | 123 | QSize AbstractSession::size() const 124 | { 125 | return d->size; 126 | } 127 | 128 | PipeWireEncodedStream *AbstractSession::stream() 129 | { 130 | if (!d->encodedStream) { 131 | d->encodedStream = std::make_unique(); 132 | if (d->frameRate) { 133 | d->encodedStream->setMaxFramerate({d->frameRate.value(), 1}); 134 | } 135 | if (d->quality) { 136 | d->encodedStream->setQuality(d->quality.value()); 137 | } 138 | } 139 | return d->encodedStream.get(); 140 | } 141 | 142 | void AbstractSession::setStarted(bool s) 143 | { 144 | d->started = s; 145 | if (s) { 146 | if (d->enabled) { 147 | d->encodedStream->start(); 148 | } 149 | Q_EMIT started(); 150 | } 151 | } 152 | 153 | void AbstractSession::requestStreamingEnable(QObject *requester) 154 | { 155 | d->enableRequests.insert(requester); 156 | connect(requester, &QObject::destroyed, this, &AbstractSession::requestStreamingDisable); 157 | setStreamingEnabled(true); 158 | } 159 | 160 | void AbstractSession::requestStreamingDisable(QObject *requester) 161 | { 162 | if (!d->enableRequests.contains(requester)) { 163 | return; 164 | } 165 | disconnect(requester, &QObject::destroyed, this, &AbstractSession::requestStreamingDisable); 166 | d->enableRequests.remove(requester); 167 | if (d->enableRequests.size() == 0) { 168 | setStreamingEnabled(false); 169 | } 170 | } 171 | 172 | } 173 | 174 | #include "AbstractSession.moc" 175 | -------------------------------------------------------------------------------- /server/org.kde.krdpserver.desktop.cmake: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: None 2 | # SPDX-License-Identifier: CC0-1.0 3 | 4 | [Desktop Entry] 5 | Type=Application 6 | Exec=@CMAKE_INSTALL_PREFIX@/bin/krdpserver 7 | Icon=krfb 8 | Terminal=false 9 | NoDisplay=true 10 | Name=KRdp 11 | Name[ar]=كي أردبي 12 | Name[ast]=KRdp 13 | Name[az]=KRdp 14 | Name[bg]=KRdp 15 | Name[ca]=KRdp 16 | Name[ca@valencia]=KRdp 17 | Name[cs]=KRdp 18 | Name[de]=KRdp 19 | Name[en_GB]=KRdp 20 | Name[eo]=KRdp 21 | Name[es]=KRdp 22 | Name[eu]=KRdp 23 | Name[fi]=KRdp 24 | Name[fr]=KRdp 25 | Name[gl]=KRdp 26 | Name[he]=KRdp 27 | Name[hi]=केआरडीपी 28 | Name[hu]=KRdp 29 | Name[ia]=KRdp 30 | Name[is]=KRdp 31 | Name[it]=KRdp 32 | Name[ka]=KRdp 33 | Name[ko]=KRdp 34 | Name[lt]=KRdp 35 | Name[lv]=KRdp 36 | Name[nl]=KRdp 37 | Name[nn]=KRdp 38 | Name[pa]=KRdp 39 | Name[pl]=KRdp 40 | Name[pt_BR]=KRdp 41 | Name[ro]=KRdp 42 | Name[ru]=KRdp 43 | Name[sa]=KRdp 44 | Name[sk]=KRdp 45 | Name[sl]=KRdp 46 | Name[sv]=KRDP 47 | Name[tr]=KRdp 48 | Name[uk]=KRdp 49 | Name[zh_CN]=KRDP 50 | Name[zh_TW]=KRdp 51 | GenericName=Desktop Sharing (RDP) 52 | GenericName[ar]=مشاركة سطح المكتب (أردبي) 53 | GenericName[ast]=Compartición del escritoriu (RDP) 54 | GenericName[az]=İş masasını paylaşmaq (RDP) 55 | GenericName[bg]=Споделяне на работния плот 56 | GenericName[ca]=Compartició de l'escriptori (RDP) 57 | GenericName[ca@valencia]=Compartiu l'escriptori (RDP) 58 | GenericName[cs]=Sdílení pracovní plochy (RDP) 59 | GenericName[de]=Freigabe der Arbeitsfläche (RDP) 60 | GenericName[en_GB]=Desktop Sharing (RDP) 61 | GenericName[eo]=Kundivido de Labortablo (RDP) 62 | GenericName[es]=Compartir el escritorio (RDP) 63 | GenericName[eu]=Mahaigaina partekatzea (RDP) 64 | GenericName[fi]=Työpöydän jako (RDP) 65 | GenericName[fr]=Partage de bureaux (RDP) 66 | GenericName[gl]=Compartición do escritorio (RDP) 67 | GenericName[he]=שיתוף שולחנות עבודה (RDP) 68 | GenericName[hi]=डेस्कटॉप शेयरिंग (RDP) 69 | GenericName[hu]=Asztalmegosztás (RDP) 70 | GenericName[ia]=Compartir de scriptorio (RDP) 71 | GenericName[is]=Skjáborðsmiðlun (RDP) 72 | GenericName[it]=Condivisione del desktop (RDP) 73 | GenericName[ka]=სამუშაო მაგიდის გაზიარება (RDP) 74 | GenericName[ko]=데스크톱 공유(RDP) 75 | GenericName[lt]=Darbalaukio bendrinimas (RDP) 76 | GenericName[lv]=Darbvirsmas kopīgošana (RDP) 77 | GenericName[nl]=Bureaublad delen (RDP) 78 | GenericName[nn]=Skrivebordsdeling (RDP) 79 | GenericName[pa]=ਡੈਸਕਟਾਪ ਸ਼ੇਅਰਿੰਗ (RDP) 80 | GenericName[pl]=Współdzielenie pulpitu (RDP) 81 | GenericName[pt_BR]=Compartilhamento da área de trabalho (RDP) 82 | GenericName[ro]=Partajare birou (RDP) 83 | GenericName[ru]=Совместный доступ к рабочему столу (RDP) 84 | GenericName[sa]=कार्यमुखम् साझाकरणम् (RDP) 85 | GenericName[sk]=Zdieľanie plochy (RDP) 86 | GenericName[sl]=Deljenje namizja (RDP) 87 | GenericName[sv]=Skrivbordsdelning (RDP) 88 | GenericName[ta]=பணிமேடைப் பகிர்வு (RDP) 89 | GenericName[tr]=Masaüstü Paylaşımı (RDP) 90 | GenericName[uk]=Спільне користування стільницею (RDP) 91 | GenericName[zh_CN]=桌面共享 (RDP) 92 | GenericName[zh_TW]=桌面分享 (RDP) 93 | Comment=Desktop Sharing 94 | Comment[ar]=مشاركة سطح المكتب 95 | Comment[ast]=Compartición del escritoriu 96 | Comment[az]=İş masasını paylaşmaq 97 | Comment[bg]=Споделяне на работния плот 98 | Comment[ca]=Compartició de l'escriptori 99 | Comment[ca@valencia]=Compartiu l'escriptori 100 | Comment[cs]=Sdílení pracovní plochy 101 | Comment[de]=Arbeitsflächen-Freigabe 102 | Comment[en_GB]=Desktop Sharing 103 | Comment[eo]=Kundivido de Labortablo 104 | Comment[es]=Compartir el escritorio 105 | Comment[eu]=Mahaigaina partekatzea 106 | Comment[fi]=Työpöydän jako 107 | Comment[fr]=Partage de bureaux 108 | Comment[gl]=Compartición do escritorio. 109 | Comment[he]=שיתוף שולחנות עבודה 110 | Comment[hi]=डेस्कटॉप साझाकरण 111 | Comment[hu]=Asztalmegosztás 112 | Comment[ia]=Compartir de scriptorio 113 | Comment[is]=Skjáborðamiðlun 114 | Comment[it]=Condivisione del desktop 115 | Comment[ka]=სამუშაო მაგიდის გაზიარება 116 | Comment[ko]=데스크톱 공유 117 | Comment[lt]=Darbalaukio bendrinimas 118 | Comment[lv]=Darbvirsmas kopīgošana 119 | Comment[nl]=Bureaublad delen 120 | Comment[nn]=Skrivebordsdeling 121 | Comment[pa]=ਡੈਸਕਟਾਪ ਸ਼ੇਅਰਿੰਗ 122 | Comment[pl]=Współdzielenie pulpitu 123 | Comment[pt_BR]=Compartilhamento da área de trabalho 124 | Comment[ro]=Partajare birou 125 | Comment[ru]=Совместный доступ к рабочему столу 126 | Comment[sa]=कार्यमुखम् साझाकरणम् 127 | Comment[sk]=Zdieľanie pracovnej plochy 128 | Comment[sl]=Deljenje namizja 129 | Comment[sv]=Skrivbordsdelning 130 | Comment[ta]=பணிமேடைப் பகிர்வு 131 | Comment[tr]=Masaüstü Paylaşımı 132 | Comment[uk]=Спільні стільниці 133 | Comment[zh_CN]=桌面共享 134 | Comment[zh_TW]=桌面分享 135 | Categories=Qt;KDE;Network;RemoteAccess; 136 | X-KDE-Wayland-Interfaces=org_kde_kwin_fake_input,zkde_screencast_unstable_v1 137 | -------------------------------------------------------------------------------- /src/screencasting.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | SPDX-FileCopyrightText: 2020 Aleix Pol Gonzalez 3 | 4 | SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 5 | */ 6 | 7 | #include "qwayland-zkde-screencast-unstable-v1.h" 8 | #include "screencasting_p.h" 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | class ScreencastingStreamPrivate : public QtWayland::zkde_screencast_stream_unstable_v1 18 | { 19 | public: 20 | ScreencastingStreamPrivate(ScreencastingStream *q) 21 | : q(q) 22 | { 23 | } 24 | ~ScreencastingStreamPrivate() 25 | { 26 | close(); 27 | q->deleteLater(); 28 | } 29 | 30 | void zkde_screencast_stream_unstable_v1_created(uint32_t node) override 31 | { 32 | m_nodeId = node; 33 | Q_EMIT q->created(node); 34 | } 35 | 36 | void zkde_screencast_stream_unstable_v1_closed() override 37 | { 38 | Q_EMIT q->closed(); 39 | } 40 | 41 | void zkde_screencast_stream_unstable_v1_failed(const QString &error) override 42 | { 43 | Q_EMIT q->failed(error); 44 | } 45 | 46 | uint m_nodeId = 0; 47 | QSize m_size; 48 | QPointer q; 49 | }; 50 | 51 | ScreencastingStream::ScreencastingStream(QObject *parent) 52 | : QObject(parent) 53 | , d(new ScreencastingStreamPrivate(this)) 54 | { 55 | } 56 | 57 | ScreencastingStream::~ScreencastingStream() = default; 58 | 59 | quint32 ScreencastingStream::nodeId() const 60 | { 61 | return d->m_nodeId; 62 | } 63 | 64 | QSize ScreencastingStream::size() const 65 | { 66 | return d->m_size; 67 | } 68 | 69 | class ScreencastingPrivate : public QWaylandClientExtensionTemplate, public QtWayland::zkde_screencast_unstable_v1 70 | { 71 | public: 72 | ScreencastingPrivate(Screencasting *q) 73 | : QWaylandClientExtensionTemplate(ZKDE_SCREENCAST_UNSTABLE_V1_STREAM_REGION_SINCE_VERSION) 74 | , q(q) 75 | { 76 | initialize(); 77 | 78 | if (!isInitialized()) { 79 | qWarning() << "Remember requesting the interface on your desktop file: X-KDE-Wayland-Interfaces=zkde_screencast_unstable_v1"; 80 | } 81 | Q_ASSERT(isInitialized()); 82 | } 83 | 84 | ~ScreencastingPrivate() 85 | { 86 | if (isActive()) { 87 | destroy(); 88 | } 89 | } 90 | 91 | Screencasting *const q; 92 | }; 93 | 94 | Screencasting::Screencasting(QObject *parent) 95 | : QObject(parent) 96 | , d(new ScreencastingPrivate(this)) 97 | { 98 | } 99 | 100 | Screencasting::~Screencasting() = default; 101 | 102 | ScreencastingStream *Screencasting::createOutputStream(QScreen *screen, Screencasting::CursorMode mode) 103 | { 104 | if (!d->isActive()) { 105 | return nullptr; 106 | } 107 | 108 | wl_output *output = (wl_output *)QGuiApplication::platformNativeInterface()->nativeResourceForScreen("output", screen); 109 | 110 | if (!output) { 111 | return nullptr; 112 | } 113 | 114 | auto stream = new ScreencastingStream(this); 115 | stream->setObjectName(screen->name()); 116 | stream->d->init(d->stream_output(output, mode)); 117 | stream->d->m_size = screen->virtualSize(); 118 | return stream; 119 | } 120 | 121 | ScreencastingStream *Screencasting::createWorkspaceStream(Screencasting::CursorMode mode) 122 | { 123 | const auto outputs = qGuiApp->screens(); 124 | if (outputs.isEmpty()) { 125 | return nullptr; 126 | } 127 | if (outputs.count() == 1) { 128 | return createOutputStream(outputs.first(), mode); 129 | } 130 | 131 | QRect workspace; 132 | const auto screens = qGuiApp->screens(); 133 | for (QScreen *screen : screens) { 134 | workspace |= screen->geometry(); 135 | } 136 | return createRegionStream(workspace, 1, mode); 137 | } 138 | 139 | ScreencastingStream *Screencasting::createRegionStream(QRect g, qreal scale, Screencasting::CursorMode mode) 140 | { 141 | auto stream = new ScreencastingStream(this); 142 | stream->d->init(d->stream_region(g.x(), g.y(), g.width(), g.height(), wl_fixed_from_double(scale), mode)); 143 | stream->d->m_size = g.size(); 144 | return stream; 145 | } 146 | 147 | ScreencastingStream *Screencasting::createVirtualMonitorStream(const QString &name, const QSize &resolution, qreal dpr, Screencasting::CursorMode mode) 148 | { 149 | auto stream = new ScreencastingStream(this); 150 | stream->d->init(d->stream_virtual_output(name, resolution.width(), resolution.height(), wl_fixed_from_double(dpr), mode)); 151 | return stream; 152 | } 153 | 154 | void Screencasting::destroy() 155 | { 156 | d.reset(nullptr); 157 | } 158 | -------------------------------------------------------------------------------- /src/Server.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #include "Server.h" 6 | 7 | #include 8 | 9 | #include 10 | 11 | #include 12 | #include 13 | #include 14 | 15 | #include "RdpConnection.h" 16 | 17 | #include "krdp_logging.h" 18 | 19 | using namespace KRdp; 20 | 21 | class KRDP_NO_EXPORT Server::Private 22 | { 23 | public: 24 | std::vector> sessions; 25 | rdp_settings *settings = nullptr; 26 | 27 | QHostAddress address = QHostAddress::LocalHost; 28 | quint16 port = 3389; 29 | 30 | QList users; 31 | bool usePamAuthentication = false; 32 | 33 | std::filesystem::path tlsCertificate; 34 | std::filesystem::path tlsCertificateKey; 35 | }; 36 | 37 | Server::Server(QObject *parent) 38 | : QTcpServer(parent) 39 | , d(std::make_unique()) 40 | { 41 | winpr_InitializeSSL(WINPR_SSL_INIT_DEFAULT); 42 | WTSRegisterWtsApiFunctionTable(FreeRDP_InitWtsApi()); 43 | } 44 | 45 | Server::~Server() 46 | { 47 | stop(); 48 | } 49 | 50 | bool Server::start() 51 | { 52 | if (!std::filesystem::exists(d->tlsCertificate) || !std::filesystem::exists(d->tlsCertificateKey)) { 53 | qCCritical(KRDP).nospace() << "A valid TLS certificate (" << QString::fromStdString(d->tlsCertificate.filename().string()) << ") and key (" 54 | << QString::fromStdString(d->tlsCertificateKey.filename().string()) << ") is required for the server to run!"; 55 | return false; 56 | } 57 | 58 | if (!listen(d->address, d->port)) { 59 | // NOTE: We cannot use QTcpServer methods to get the server address and port because it won't initialize them if listen fails. 60 | qCCritical(KRDP) << "Unable to listen for connections on" << d->address << d->port; 61 | return false; 62 | } 63 | 64 | // FreeRDP3 tries to use a global instance of the settings object when 65 | // initializing a new peer. However, it seems to fail at actually creating a 66 | // global default instance. So create one here and use that. 67 | d->settings = freerdp_settings_new(FREERDP_SETTINGS_SERVER_MODE); 68 | 69 | qCDebug(KRDP) << "Listening for connections on" << serverAddress() << serverPort(); 70 | return true; 71 | } 72 | 73 | void Server::stop() 74 | { 75 | close(); 76 | 77 | if (d->settings) { 78 | freerdp_settings_free(d->settings); 79 | d->settings = nullptr; 80 | } 81 | } 82 | 83 | QHostAddress Server::address() const 84 | { 85 | return d->address; 86 | } 87 | 88 | void Server::setAddress(const QHostAddress &newAddress) 89 | { 90 | if (newAddress == d->address) { 91 | return; 92 | } 93 | 94 | d->address = newAddress; 95 | } 96 | 97 | quint16 Server::port() const 98 | { 99 | return d->port; 100 | } 101 | 102 | void Server::setPort(quint16 newPort) 103 | { 104 | if (newPort == d->port) { 105 | return; 106 | } 107 | 108 | d->port = newPort; 109 | } 110 | 111 | QList KRdp::Server::users() const 112 | { 113 | return d->users; 114 | } 115 | 116 | void KRdp::Server::setUsers(const QList &users) 117 | { 118 | d->users = users; 119 | } 120 | 121 | void KRdp::Server::addUser(const User &user) 122 | { 123 | d->users.append(user); 124 | } 125 | 126 | bool Server::usePAMAuthentication() const 127 | { 128 | return d->usePamAuthentication; 129 | } 130 | 131 | void Server::setUsePAMAuthentication(bool usePAM) 132 | { 133 | d->usePamAuthentication = usePAM; 134 | } 135 | 136 | std::filesystem::path Server::tlsCertificate() const 137 | { 138 | return d->tlsCertificate; 139 | } 140 | 141 | void Server::setTlsCertificate(const std::filesystem::path &newTlsCertificate) 142 | { 143 | if (newTlsCertificate == d->tlsCertificate) { 144 | return; 145 | } 146 | 147 | d->tlsCertificate = newTlsCertificate; 148 | } 149 | 150 | std::filesystem::path Server::tlsCertificateKey() const 151 | { 152 | return d->tlsCertificateKey; 153 | } 154 | 155 | void Server::setTlsCertificateKey(const std::filesystem::path &newTlsCertificateKey) 156 | { 157 | if (newTlsCertificateKey == d->tlsCertificateKey) { 158 | return; 159 | } 160 | 161 | d->tlsCertificateKey = newTlsCertificateKey; 162 | } 163 | 164 | void Server::incomingConnection(qintptr handle) 165 | { 166 | auto session = std::make_unique(this, handle); 167 | auto sessionPtr = session.get(); 168 | connect(sessionPtr, &RdpConnection::stateChanged, this, [this, sessionPtr](RdpConnection::State state) { 169 | if (state == RdpConnection::State::Closed) { 170 | auto itr = std::find_if(d->sessions.begin(), d->sessions.end(), [sessionPtr](auto &session) { 171 | return session.get() == sessionPtr; 172 | }); 173 | (*itr)->close(); 174 | d->sessions.erase(itr); 175 | } 176 | }); 177 | d->sessions.push_back(std::move(session)); 178 | Q_EMIT newConnectionCreated(sessionPtr); 179 | } 180 | 181 | rdp_settings *Server::rdpSettings() const 182 | { 183 | return d->settings; 184 | } 185 | 186 | #include "moc_Server.cpp" 187 | -------------------------------------------------------------------------------- /server/main.cpp: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2023 Arjen Hiemstra 2 | // 3 | // SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 4 | 5 | #include 6 | #include 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | #include 17 | 18 | #include "Server.h" 19 | #include "SessionController.h" 20 | #include "krdp_version.h" 21 | #include "krdpserversettings.h" 22 | 23 | using namespace Qt::StringLiterals; 24 | 25 | int main(int argc, char **argv) 26 | { 27 | QApplication application{argc, argv}; 28 | application.setApplicationName(u"krdp-server"_s); 29 | application.setApplicationDisplayName(u"KRDP Server"_s); 30 | 31 | KAboutData about(u"krdp-server"_s, u"KRDP Server"_s, QStringLiteral(KRdp_VERSION_STRING)); 32 | KAboutData::setApplicationData(about); 33 | 34 | KCrash::initialize(); 35 | 36 | QCommandLineParser parser; 37 | parser.setApplicationDescription( 38 | u"An RDP server that exposes the current desktop session over the RDP protocol.\nNote that a valid TLS certificate and key is needed. If not provided, a temporary certificate will be generated."_s); 39 | parser.addOptions({ 40 | {{u"u"_s, u"username"_s}, u"The username to use for login"_s, u"username"_s}, 41 | {{u"p"_s, u"password"_s}, u"The password to use for login. Requires username to be passed as well."_s, u"password"_s}, 42 | {u"address"_s, u"The address to listen on for connections. Defaults to 0.0.0.0"_s, u"address"_s}, 43 | {u"port"_s, u"The port to use for connections. Defaults to 3389."_s, u"port"_s, u"3389"_s}, 44 | {u"certificate"_s, u"The TLS certificate file to use."_s, u"certificate"_s, u"server.crt"_s}, 45 | {u"certificate-key"_s, u"The TLS certificate key to use."_s, u"certificate-key"_s, u"server.key"_s}, 46 | {u"monitor"_s, u"The index of the monitor to use when streaming."_s, u"monitor"_s, u"-1"_s}, 47 | {u"virtual-monitor"_s, 48 | u"Creates a new virtual output to connect to (WIDTHxHEIGHT@SCALE, e.g. 1920x1080@1). Incompatible with --monitor."_s, 49 | u"data"_s, 50 | u"1920x1080@1"_s}, 51 | {u"quality"_s, u"Encoding quality of the stream, from 0 (lowest) to 100 (highest)"_s, u"quality"_s}, 52 | #ifdef WITH_PLASMA_SESSION 53 | {u"plasma"_s, u"Use Plasma protocols instead of XDP"_s}, 54 | #endif 55 | }); 56 | about.setupCommandLine(&parser); 57 | parser.process(application); 58 | about.processCommandLine(&parser); 59 | 60 | signal(SIGINT, [](int) { 61 | QCoreApplication::exit(0); 62 | }); 63 | 64 | signal(SIGTERM, [](int) { 65 | QCoreApplication::exit(0); 66 | }); 67 | 68 | auto config = ServerConfig::self(); 69 | 70 | auto parserValueWithDefault = [&parser](QAnyStringView option, auto defaultValue) { 71 | auto optionString = option.toString(); 72 | if (parser.isSet(optionString)) { 73 | return QVariant(parser.value(optionString)).value(); 74 | } else { 75 | return defaultValue; 76 | } 77 | }; 78 | 79 | QHostAddress address = QHostAddress::Any; 80 | if (parser.isSet(u"address"_s)) { 81 | address = QHostAddress(parser.value(u"address"_s)); 82 | } 83 | auto port = parserValueWithDefault(u"port", config->listenPort()); 84 | auto certificate = std::filesystem::path(parserValueWithDefault(u"certificate", config->certificate()).toStdString()); 85 | auto certificateKey = std::filesystem::path(parserValueWithDefault(u"certificate-key", config->certificateKey()).toStdString()); 86 | 87 | KRdp::Server server(nullptr); 88 | 89 | server.setAddress(address); 90 | server.setPort(port); 91 | 92 | server.setTlsCertificate(certificate); 93 | server.setTlsCertificateKey(certificateKey); 94 | 95 | // Use parsed username/pw if set 96 | if (parser.isSet(u"username"_s)) { 97 | KRdp::User user; 98 | user.name = parser.value(u"username"_s); 99 | user.password = parser.value(u"password"_s); 100 | server.addUser(user); 101 | } 102 | // Otherwise use KCM username list 103 | else { 104 | server.setUsePAMAuthentication(config->systemUserEnabled()); 105 | 106 | const auto users = config->users(); 107 | for (const auto &userName : users) { 108 | const auto readJob = new QKeychain::ReadPasswordJob(QLatin1StringView("KRDP")); 109 | readJob->setKey(QLatin1StringView(userName.toLatin1())); 110 | QObject::connect(readJob, &QKeychain::ReadPasswordJob::finished, &server, [userName, readJob, &server]() { 111 | KRdp::User user; 112 | if (readJob->error() != QKeychain::Error::NoError) { 113 | qWarning() << "requestPassword: Failed to read password of " << userName << " because of error: " << readJob->error(); 114 | return; 115 | } 116 | user.name = userName; 117 | user.password = readJob->textData(); 118 | server.addUser(user); 119 | }); 120 | readJob->start(); 121 | } 122 | if (users.isEmpty() && !server.usePAMAuthentication()) { 123 | qWarning() << "No users configured for login. Either pass a username/password or configure users using kcm_krdp."; 124 | return -1; 125 | } 126 | } 127 | 128 | SessionController controller(&server, parser.isSet(u"plasma"_s) ? SessionController::SessionType::Plasma : SessionController::SessionType::Portal); 129 | if (parser.isSet(u"virtual-monitor"_s)) { 130 | const QString vmData = parser.value(u"virtual-monitor"_s); 131 | const QRegularExpression rx(uR"((\d+)x(\d+)@([\d.]+))"_s); 132 | const auto match = rx.match(vmData); 133 | if (!match.hasMatch()) { 134 | qWarning() << "failed to parse" << vmData << ". Should be WIDTHxHEIGHT@SCALE"; 135 | return 1; 136 | } 137 | controller.setVirtualMonitor({vmData, {match.capturedView(1).toInt(), match.capturedView(2).toInt()}, match.capturedView(3).toDouble()}); 138 | } else { 139 | controller.setMonitorIndex(parser.isSet(u"monitor"_s) ? std::optional(parser.value(u"monitor"_s).toInt()) : std::nullopt); 140 | } 141 | controller.setQuality(parserValueWithDefault(u"quality", config->quality())); 142 | 143 | if (!server.start()) { 144 | return -1; 145 | } 146 | 147 | return application.exec(); 148 | } 149 | --------------------------------------------------------------------------------